TITLE BMOVE ENTRY BMOVE ; ; Speicherbereich byteweise kopieren ; ; Aufruf: CALL BMOVE(source,destination,count) ; ; <source> = Startadresse Quellbereich (Variablenname) ; <destination> = Startadresse Zielbereich ; <count> = 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 = <count> LD (COUNT),HL ; <count> sichern LD BC,0 AND A ; Carry-Bit loeschen SBC HL,BC ; <count> = 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.<Z.A.: rueckwaerts abarbeiten LD BC,1 AND A SBC HL,BC ; <count> - 1 LD BC,(DADR) ADD HL,BC LD D,H LD E,L ; DE = Z.A. + <count> - 1 LD HL,(COUNT) LD BC,1 AND A SBC HL,BC LD BC,(SADR) ADD HL,BC ; HL = Q.A. + <count> - 1 LD BC,(COUNT) ; BC = <count> 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
Bild 3. Damit können Speicherbereiche kopiert werden
|