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
[Hier als Z80-Quelldatei]