section CODE ;; ;; string.h ;; 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 ; memset: ; 4(sp): dst ; 8(sp): value ; 12(sp): int _memset: move.l 4(sp),a0 move.l 8(sp),d0 move.l 12(sp),d0 .loop: cmpi.l #0,d0 beq.s .done move.b d0,(a0)+ sub.l #1,d0 bra.s .loop .done: 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 rts ; strcpy: ; 4(sp): dst ; 8(sp): src _strcpy: move.l 4(sp),a0 move.l 8(sp),a1 .loop: move.b (a1),d0 cmpi.b #0,d0 beq.s .done move.b (a1)+,(a0)+ 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 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