TITLE BMOVE ENTRY BMOVE ; ; Speicherbereich byteweise kopieren ; ; Aufruf: CALL BMOVE(source,destination,count) ; ; = Startadresse Quellbereich (Variablenname) ; = Startadresse Zielbereich ; = Anzahl Bytes (2-Byte-Integer !) ; BMOVE: LD (SADR),HL ; Quelladresse (Q.A.) sichern LD (DADR),DE ; Zieladresse (Z.A.) sichern LD (CADR),BC ; Count-Adresse sichern ; LD A,(BC) LD L,A INC BC LD A,(BC) LD H,A ; HL = LD (COUNT),HL ; sichern LD BC,0 AND A ; Carry-Bit loeschen SBC HL,BC ; = 0 ? JR Z,ENDE ; Ja: fertig ! ; LD HL,(SADR) ; Nein: weiter AND A ; Carry-Bit loeschen SBC HL,DE ; Startadressen subtrahieren JR Z,ENDE ; Falls gleich: fertig ! JP P,LDIR ; Q.A.>Z.A.: vorwaerts abarbeiten ; LD HL,(COUNT) ; Q.A. - 1 LD BC,(DADR) ADD HL,BC LD D,H LD E,L ; DE = Z.A. + - 1 LD HL,(COUNT) LD BC,1 AND A SBC HL,BC LD BC,(SADR) ADD HL,BC ; HL = Q.A. + - 1 LD BC,(COUNT) ; BC = LDDR ; Blockverschiebung (hinten beginnen) JR ENDE ; LDIR: LD HL,(SADR) LD DE,(DADR) LD BC,(COUNT) LDIR ; Blockverschiebung (vorn beginnen) ; ENDE: LD HL,1 ; RETURN-STATUS RET ; ; Arbeitsspeicher: ; SADR: DS 2 ; Quelladresse (Q.A.) DADR: DS 2 ; Zieladresse (Z.A.) CADR: DS 2 ; Count-Adresse COUNT: DS 2 ; Count ; END