micro68/runtime/libc.s

252 lines
2.8 KiB
ArmAsm
Raw Permalink Normal View History

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