2026-08-03 03:28:56 +09:00
|
|
|
section CODE
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
;; string.h
|
|
|
|
|
;;
|
2026-08-04 20:27:51 +09:00
|
|
|
public _memcpy
|
|
|
|
|
public _memset
|
|
|
|
|
public _strcat
|
|
|
|
|
public _strcpy
|
|
|
|
|
public _strlen
|
|
|
|
|
|
|
|
|
|
; memcpy:
|
|
|
|
|
; 4(sp): dst
|
|
|
|
|
; 8(sp): src
|
|
|
|
|
; 12(sp): int
|
|
|
|
|
_memcpy:
|
|
|
|
|
move.l 4(sp),a0
|
|
|
|
|
move.l 8(sp),a1
|
|
|
|
|
move.l 12(sp),d0
|
|
|
|
|
.loop:
|
|
|
|
|
cmpi.l #0,d0
|
|
|
|
|
beq.s .done
|
|
|
|
|
move.b (a1)+,(a0)+
|
|
|
|
|
sub.l #1,d0
|
|
|
|
|
bra.s .loop
|
|
|
|
|
.done:
|
|
|
|
|
move.l 4(sp),d0
|
|
|
|
|
rts
|
2026-08-03 03:28:56 +09:00
|
|
|
|
|
|
|
|
; memset:
|
|
|
|
|
; 4(sp): dst
|
|
|
|
|
; 8(sp): value
|
|
|
|
|
; 12(sp): int
|
|
|
|
|
_memset:
|
|
|
|
|
move.l 4(sp),a0
|
|
|
|
|
move.l 8(sp),d0
|
2026-08-04 20:27:51 +09:00
|
|
|
move.l 12(sp),d0
|
2026-08-03 03:28:56 +09:00
|
|
|
.loop:
|
2026-08-04 20:27:51 +09:00
|
|
|
cmpi.l #0,d0
|
2026-08-03 03:28:56 +09:00
|
|
|
beq.s .done
|
|
|
|
|
move.b d0,(a0)+
|
2026-08-04 20:27:51 +09:00
|
|
|
sub.l #1,d0
|
2026-08-03 03:28:56 +09:00
|
|
|
bra.s .loop
|
|
|
|
|
.done:
|
2026-08-04 20:27:51 +09:00
|
|
|
move.l 4(sp),d0
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
; strcat:
|
|
|
|
|
; 4(sp): dst
|
|
|
|
|
; 8(sp): src
|
|
|
|
|
_strcat:
|
|
|
|
|
move.l 4(sp),a0
|
|
|
|
|
move.l 8(sp),a1
|
|
|
|
|
.loop_incr:
|
|
|
|
|
move.b (a0),d0
|
|
|
|
|
cmpi.b #0,d0
|
|
|
|
|
beq.s .loop_copy
|
|
|
|
|
add.l #1,a0
|
|
|
|
|
bra.s .loop_incr
|
|
|
|
|
.loop_copy:
|
|
|
|
|
move.b (a1),d0
|
|
|
|
|
cmpi.b #0,d0
|
|
|
|
|
beq.s .done
|
|
|
|
|
move.b (a1)+,(a0)+
|
|
|
|
|
bra.s .loop_copy
|
|
|
|
|
.done:
|
|
|
|
|
move.b #0,(a0)
|
|
|
|
|
move.l 4(sp),d0
|
2026-08-03 03:28:56 +09:00
|
|
|
rts
|
|
|
|
|
|
2026-08-04 20:27:51 +09:00
|
|
|
; strcpy:
|
|
|
|
|
; 4(sp): dst
|
|
|
|
|
; 8(sp): src
|
|
|
|
|
_strcpy:
|
2026-08-03 03:28:56 +09:00
|
|
|
move.l 4(sp),a0
|
|
|
|
|
move.l 8(sp),a1
|
|
|
|
|
.loop:
|
2026-08-04 20:27:51 +09:00
|
|
|
move.b (a1),d0
|
|
|
|
|
cmpi.b #0,d0
|
2026-08-03 03:28:56 +09:00
|
|
|
beq.s .done
|
|
|
|
|
move.b (a1)+,(a0)+
|
2026-08-04 20:27:51 +09:00
|
|
|
bra.s .loop
|
|
|
|
|
.done:
|
|
|
|
|
move.b #0,(a0)
|
|
|
|
|
move.l 4(sp),d0
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
; strlen:
|
|
|
|
|
; 4(sp): src
|
|
|
|
|
_strlen:
|
|
|
|
|
move.l 4(sp),a0
|
|
|
|
|
move.l #0,d0
|
|
|
|
|
.loop:
|
|
|
|
|
move.b (a0)+,d1
|
|
|
|
|
cmpi.b #0,d1
|
|
|
|
|
beq.s .done
|
|
|
|
|
add.l #1,d0
|
2026-08-03 03:28:56 +09:00
|
|
|
bra.s .loop
|
|
|
|
|
.done:
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
;; 32-bit div/mod: taken from vc.lib
|
|
|
|
|
;;
|
|
|
|
|
public __divu
|
|
|
|
|
public __divs
|
|
|
|
|
public __modu
|
|
|
|
|
public __mods
|
|
|
|
|
public __ldivs
|
|
|
|
|
public __ldivu
|
|
|
|
|
public __lmods
|
|
|
|
|
public __lmodu
|
|
|
|
|
|
|
|
|
|
__lmods:
|
|
|
|
|
movem.l 4(sp),d0/d1
|
|
|
|
|
__mods:
|
|
|
|
|
tst.l d1
|
|
|
|
|
bmi 1$
|
|
|
|
|
tst.l d0
|
|
|
|
|
bmi 2$
|
|
|
|
|
bsr __divu
|
|
|
|
|
move.l d1,d0
|
|
|
|
|
rts
|
|
|
|
|
1$:
|
|
|
|
|
neg.l d1
|
|
|
|
|
tst.l d0
|
|
|
|
|
bmi 3$
|
|
|
|
|
bsr __divu
|
|
|
|
|
move.l d1,d0
|
|
|
|
|
rts
|
|
|
|
|
2$:
|
|
|
|
|
neg.l d0
|
|
|
|
|
bsr __divu
|
|
|
|
|
neg.l d1
|
|
|
|
|
move.l d1,d0
|
|
|
|
|
rts
|
|
|
|
|
3$:
|
|
|
|
|
neg.l d0
|
|
|
|
|
bsr __divu
|
|
|
|
|
neg.l d1
|
|
|
|
|
move.l d1,d0
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__lmodu:
|
|
|
|
|
movem.l 4(sp),d0/d1
|
|
|
|
|
__modu:
|
|
|
|
|
bsr __divu
|
|
|
|
|
move.l d1,d0
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__ldivs:
|
|
|
|
|
movem.l 4(sp),d0/d1
|
|
|
|
|
__divs:
|
|
|
|
|
tst.l d0
|
|
|
|
|
bpl 2$
|
|
|
|
|
neg.l d0
|
|
|
|
|
tst.l d1
|
|
|
|
|
bpl 1$
|
|
|
|
|
neg.l d1
|
|
|
|
|
bsr __divu
|
|
|
|
|
neg.l d1
|
|
|
|
|
rts
|
|
|
|
|
1$:
|
|
|
|
|
bsr __divu
|
|
|
|
|
neg.l d0
|
|
|
|
|
neg.l d1
|
|
|
|
|
rts
|
|
|
|
|
2$:
|
|
|
|
|
tst.l d1
|
|
|
|
|
bpl __divu
|
|
|
|
|
neg.l d1
|
|
|
|
|
bsr __divu
|
|
|
|
|
neg.l d0
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__ldivu:
|
|
|
|
|
movem.l 4(sp),d0/d1
|
|
|
|
|
__divu:
|
|
|
|
|
move.l d2,-(sp)
|
|
|
|
|
swap d1
|
|
|
|
|
move.w d1,d2
|
|
|
|
|
bne 2$
|
|
|
|
|
swap d0
|
|
|
|
|
swap d1
|
|
|
|
|
swap d2
|
|
|
|
|
move.w d0,d2
|
|
|
|
|
beq 1$
|
|
|
|
|
divu d1,d2
|
|
|
|
|
move.w d2,d0
|
|
|
|
|
1$:
|
|
|
|
|
swap d0
|
|
|
|
|
move.w d0,d2
|
|
|
|
|
divu d1,d2
|
|
|
|
|
move.w d2,d0
|
|
|
|
|
swap d2
|
|
|
|
|
move.w d2,d1
|
|
|
|
|
move.l (sp)+,d2
|
|
|
|
|
rts
|
|
|
|
|
2$:
|
|
|
|
|
move.l d3,-(sp)
|
|
|
|
|
moveq #16,d3
|
|
|
|
|
cmp.w #$80,d1
|
|
|
|
|
bhs 3$
|
|
|
|
|
rol.l #8,d1
|
|
|
|
|
subq.w #8,d3
|
|
|
|
|
3$:
|
|
|
|
|
cmp.w #$800,d1
|
|
|
|
|
bhs 4$
|
|
|
|
|
rol.l #4,d1
|
|
|
|
|
subq.w #4,d3
|
|
|
|
|
4$:
|
|
|
|
|
cmp.w #$2000,d1
|
|
|
|
|
bhs 5$
|
|
|
|
|
rol.l #2,d1
|
|
|
|
|
subq.w #2,d3
|
|
|
|
|
5$:
|
|
|
|
|
tst.w d1
|
|
|
|
|
bmi 6$
|
|
|
|
|
rol.l #1,d1
|
|
|
|
|
subq.w #1,d3
|
|
|
|
|
6$:
|
|
|
|
|
move.w d0,d2
|
|
|
|
|
lsr.l d3,d0
|
|
|
|
|
swap d2
|
|
|
|
|
clr.w d2
|
|
|
|
|
lsr.l d3,d2
|
|
|
|
|
swap d3
|
|
|
|
|
divu d1,d0
|
|
|
|
|
move.w d0,d3
|
|
|
|
|
move.w d2,d0
|
|
|
|
|
move.w d3,d2
|
|
|
|
|
swap d1
|
|
|
|
|
mulu d1,d2
|
|
|
|
|
sub.l d2,d0
|
|
|
|
|
bhs 8$
|
|
|
|
|
subq.w #1,d3
|
|
|
|
|
add.l d1,d0
|
|
|
|
|
7$:
|
|
|
|
|
bhs.s 7$
|
|
|
|
|
8$:
|
|
|
|
|
moveq #0,d1
|
|
|
|
|
move.w d3,d1
|
|
|
|
|
swap d3
|
|
|
|
|
rol.l d3,d0
|
|
|
|
|
swap d0
|
|
|
|
|
exg d0,d1
|
|
|
|
|
move.l (sp)+,d3
|
|
|
|
|
move.l (sp)+,d2
|
|
|
|
|
rts
|