home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ZSYS
/
SIMTEL20
/
SYSLIB
/
SLIB3.LBR
/
SMOVE.Z80
< prev
next >
Wrap
Text File
|
2000-06-30
|
2KB
|
135 lines
;
; SYSLIB Module Name: SMOVE
; Author: Richard Conn
; SYSLIB Version Number: 3.6
; Module Version Number: 1.1
public hmovb,hmovbc,moveb,movebc
;
; SMOVEB.MAC -- SYSLIB MODULE
;
; ENTRY POINTS --
; EXT MOVEB -- MOVE BYTES PTED TO BY HL TO
; LOCATION PTED TO BY DE FOR B BYTES
; EXT MOVEBC -- MOVE BYTES PTED TO BY HL TO
; LOCATION PTED TO BY DE FOR BC BYTES
;
; NO REGISTERS ARE TO BE AFFECTED
;
; EXT HMOVB -- LIKE MOVEB, BUT HL AND DE PT TO BYTE AFTER
; LAST BYTE MOVED WHEN DONE
; EXT HMOVBC -- LIKE MOVEBC, BUT HL AND DE PT TO BYTE AFTER
; LAST BYTE MOVED WHEN DONE
;
;
; SUPPORTING MACROS --
;
PUTRG MACRO ; SAVE ALL REGS
PUSH AF
PUSH BC
PUSH DE
PUSH HL
ENDM
GETRG MACRO ; RESTORE ALL REGS
POP HL
POP DE
POP BC
POP AF
ENDM
;
; HMOVB AND HMOVBC ROUTINES --
;
HMOVB:
CALL MOVEB ; DO THE MOVE
PUSH BC ; SAVE BC
LD C,B ; BC=B
LD B,0
ADD HL,BC ; HL PTS TO BYTE AFTER LAST BYTE MOVED
EX DE,HL
ADD HL,BC ; DE PTS TO BYTE AFTER LAST BYTE MOVED
EX DE,HL
POP BC ; GET BC
RET
HMOVBC:
CALL MOVEBC ; DO THE MOVE
PUSH BC ; SAVE BC
ADD HL,BC ; HL PTS TO BYTE AFTER LAST BYTE MOVED
EX DE,HL
ADD HL,BC ; DE PTS TO BYTE AFTER LAST BYTE MOVED
EX DE,HL
POP BC ; GET BC
RET
;
; MOVEB AND MOVEBC ROUTINES --
;
MOVEB:
PUSH BC ; SAVE BC
LD C,B ; C=B
LD B,0 ; B=0
CALL MOVEBC ; USE MOVEBC
POP BC ; RESTORE BC
RET
MOVEBC:
PUTRG ; SAVE ALL REGS
;
; DETERMINE IF HL < DE; IF SO, MOVE BACK TO FRONT; OTHERWISE, FRONT TO BACK
;
LD A,H ; HL<DE?
CP D
JP C,MOVER ; MOVE BACK-TO-FRONT
JP NZ,MOVEF ; MOVE FRONT-TO-BACK IF HL>DE
LD A,L ; HL<DE?
CP E
JP C,MOVER ; MOVE BACK-TO-FRONT
; MOVE FRONT-TO-BACK
MOVEF:
LD A,(HL) ; GET BYTE
LD (DE),A ; PUT BYTE
INC HL ; PT TO NEXT
INC DE
DEC BC ; COUNT DOWN
LD A,B ; DONE?
OR C
JP NZ,MOVEF
; DONE WITH PROGRAM
DONE:
GETRG ; RESTORE ALL REGS
RET
;
; MOVE BACK-TO-FRONT
;
MOVER:
;
; POINT TO END OF BUFFERS
;
DEC BC ; DECR COUNT BY 1
ADD HL,BC ; PT TO END OF BUFFERS
EX DE,HL
ADD HL,BC
EX DE,HL
INC BC ; CORRECT BYTE COUNT
;
; PERFORM MOVE
;
MOVERL:
LD A,(HL) ; GET BYTE
LD (DE),A ; PUT BYTE
DEC HL ; PT TO NEXT
DEC DE
DEC BC ; COUNT DOWN
LD A,B ; DONE?
OR C
JP NZ,MOVERL
JP DONE
END