home *** CD-ROM | disk | FTP | other *** search
-
- * Maxon C++:
- * Library-Modul "mem_move"
- * Jens Gelhar 19.03.93
-
-
- xdef _memcpy,memcpy__PvPCvUi
- xdef _memmove,memmove__PvPCvUi
-
- _memcpy:
- memcpy__PvPCvUi:
- _memmove:
- memmove__PvPCvUi:
- movem.l 4(a7),a0/a1
- move.l 12(a7),d0
- beq.b ret
- bmi.b ret
- cmp.l a0,a1
- bhs.b forward
- ; Rückwärts kopieren:
- add.l d0,a0
- add.l d0,a1
- cmp.l #8,d0 ; bei weniger als 8 Bytes keinen Kult machen!
- blo.b .loop
- move.l a0,d1
- lsr.l #1,d1 ; a0 ungerade?
- bcc.b .a0even
- move.b -(a1),-(a0) ; dann gerade machen!
- subq.l #1,d0
- .a0even move.l a1,d1
- lsr.l #1,d1 ; a1 ungerade?
- bcs.b .loop ; dann hilft nix mehr
- ; Langwortweise kopieren:
- subq.l #4,d0
- blo.b .nolw
- .lw move.l -(a1),-(a0)
- subq.l #4,d0
- bhi.b .lw
- .nolw addq.l #4,d0
- beq.b ret
- .loop move.b -(a1),-(a0)
- subq.l #1,d0
- bne.b .loop
- bra.b ret
-
- forward: ; Vorwärts verschieben
- cmp.l #8,d0 ; bei weniger als 8 Bytes keinen Kult machen!
- blo.b .loop
- move.l a0,d1
- lsr.l #1,d1 ; a0 ungerade?
- bcc.b .a0even
- move.b (a1)+,(a0)+ ; dann gerade machen!
- subq.l #1,d0
- .a0even move.l a1,d1
- lsr.l #1,d1 ; a1 ungerade?
- bcs.b .loop ; dann hilft nix mehr
- ; Langwortweise kopieren:
- subq.l #4,d0
- blo.b .nolw
- .lw move.l (a1)+,(a0)+
- subq.l #4,d0
- bhi.b .lw
- .nolw addq.l #4,d0
- beq.b ret
- .loop ; Byteweise kopieren:
- move.b (a1)+,(a0)+
- subq.l #1,d0
- bne.b .loop
-
- ret: move.l 4(a7),d0
- rts
-
- end
-