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
/
SMHL5DC.Z80
< prev
next >
Wrap
Text File
|
2000-06-30
|
2KB
|
113 lines
;
; SYSLIB Module Name: SMHL5DC
; Author: Richard Conn
; SYSLIB Version Number: 3.6
; Module Version Number: 1.1
public mhl5dc,mhldc
PUTRG MACRO
PUSH BC ; SAVE BC, DE, HL
PUSH DE
PUSH HL
ENDM
GETRG MACRO
POP HL ; RESTORE HL, DE, BC
POP DE
POP BC
ENDM
;
; MHL5DC --
; STORE HL AS 5 DECIMAL CHARACTERS IN MEMORY
; ON INPUT, HL=VALUE AND DE=PTR TO 5-BYTE BUFFER
; ON OUTPUT, DE PTS TO NEXT BYTE AFTER BUFFER
;
MHL5DC:
PUSH AF ; SAVE ALL REGS
EX DE,HL ; HL PTS TO BUFFER
LD (MEMPTR),HL
EX DE,HL
PUTRG
XOR A ; A=0
LD (LSFLG0),A ; TURN OFF LEADING <SP>
JP PHDC
;
; MHLDC --
; STORE HL AS DECIMAL CHARACTERS W/LEADING SPACES IN 5-CHAR FIELD
; IN MEMORY; ON INPUT, HL=VALUE AND DE=PTR TO 5-BYTE BUFFER
; ON RETURN, DE PTS TO BYTE AFTER BUFFER
;
MHLDC:
PUSH AF ; SAVE ALL REGS
EX DE,HL ; HL PTS TO BUFFER
LD (MEMPTR),HL
EX DE,HL
PUTRG
LD A,1 ; A=1
LD (LSFLG0),A ; TURN ON LEADING <SP>
;
; PRINT HL USING LEADING <SP> FLAG LSFLG0
;
PHDC: LD DE,10000 ; PRINT 10000'S
CALL PHDC1
LD DE,1000 ; PRINT 1000'S
CALL PHDC1
LD DE,100 ; PRINT 100'S
CALL PHDC1
LD DE,10 ; PRINT 10'S
CALL PHDC1
LD A,L ; PRINT 1'S
ADD '0' ; CONVERT TO ASCII
CALL PUT
GETRG ; RESTORE ALL REGS
EX DE,HL ; DE=VALUE
LD HL,(MEMPTR) ; GET PTR TO NEXT BYTE
EX DE,HL ; ... IN DE
POP AF
RET
; BUFFERS
LSFLG0: DS 1 ; LEADING <SP> FLAG
MEMPTR: DS 2 ; PTR TO NEXT MEMORY ADDRESS
; DIVIDE HL BY DE AND PRINT QUOTIENT WITH LEADING <SP>S
PHDC1: LD C,0 ; SET COUNT
PHDC2: LD A,L ; SUB E FROM L
SUB E
LD L,A ; RESULT IN L
LD A,H ; SUB D FROM H W/BORROW
SBC A,D
LD H,A ; RESULT IN H
JP C,PHDC3 ; DONE IF CARRY SET (FURTHER BORROW)
INC C ; INCR COUNT
JP PHDC2
PHDC3: LD A,L ; ADD E TO L
ADD A,E
LD L,A ; RESULT IN L
LD A,H ; ADD D TO H W/CARRY
ADC A,D
LD H,A ; RESULT IN H
LD A,C ; GET RESULT
OR A ; CHECK FOR ZERO
JP NZ,PHDC4
LD A,(LSFLG0) ; CHECK FOR LEADING <SP>
OR A ; PRINT VALUE IF NOT (A=0)
JP Z,PHDC4
LD A,' ' ; PRINT <SP>
JP PUT
PHDC4: XOR A ; TURN OFF LEADING <SP>
LD (LSFLG0),A
LD A,C ; GET VALUE
ADD '0' ; CONVERT TO ASCII
PUT:
PUSH HL ; SAVE HL
LD HL,(MEMPTR) ; GET PTR
LD (HL),A ; PUT BYTE
INC HL ; PT TO NEXT
LD (MEMPTR),HL ; PUT PTR
POP HL ; RESTORE HL
RET
END