;
; 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
;
PUTRG MACRO
PUSH B ; SAVE BC, DE, HL
PUSH D
PUSH H
ENDM
GETRG MACRO
POP H ; RESTORE HL, DE, BC
POP D
POP B
ENDM
MHL5DC::
PUSH PSW ; SAVE ALL REGS
XCHG ; HL PTS TO BUFFER
SHLD MEMPTR
XCHG
PUTRG
XRA A ; A=0
STA LSFLG0 ; TURN OFF LEADING <SP>
JMP 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 PSW ; SAVE ALL REGS
XCHG ; HL PTS TO BUFFER
SHLD MEMPTR
XCHG
PUTRG
MVI A,1 ; A=1
STA LSFLG0 ; TURN ON LEADING <SP>
; PRINT HL USING LEADING <SP> FLAG LSFLG0
PHDC: LXI D,10000 ; PRINT 10000'S
CALL PHDC1
LXI D,1000 ; PRINT 1000'S
CALL PHDC1
LXI D,100 ; PRINT 100'S
CALL PHDC1
LXI D,10 ; PRINT 10'S
CALL PHDC1
MOV A,L ; PRINT 1'S
ADI '0' ; CONVERT TO ASCII
CALL PUT
GETRG ; RESTORE ALL REGS
XCHG ; DE=VALUE
LHLD MEMPTR ; GET PTR TO NEXT BYTE
XCHG ; ... IN DE
POP PSW
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: MVI C,0 ; SET COUNT
PHDC2: MOV A,L ; SUB E FROM L
SUB E
MOV L,A ; RESULT IN L
MOV A,H ; SUB D FROM H W/BORROW
SBB D
MOV H,A ; RESULT IN H
JC PHDC3 ; DONE IF CARRY SET (FURTHER BORROW)
INR C ; INCR COUNT
JMP PHDC2
PHDC3: MOV A,L ; ADD E TO L
ADD E
MOV L,A ; RESULT IN L
MOV A,H ; ADD D TO H W/CARRY
ADC D
MOV H,A ; RESULT IN H
MOV A,C ; GET RESULT
ORA A ; CHECK FOR ZERO
JNZ PHDC4
LDA LSFLG0 ; CHECK FOR LEADING <SP>
ORA A ; PRINT VALUE IF NOT (A=0)
JZ PHDC4
MVI A,' ' ; PRINT <SP>
JMP PUT
PHDC4: XRA A ; TURN OFF LEADING <SP>
STA LSFLG0
MOV A,C ; GET VALUE
ADI '0' ; CONVERT TO ASCII
PUT:
PUSH H ; SAVE HL
LHLD MEMPTR ; GET PTR
MOV M,A ; PUT BYTE
INX H ; PT TO NEXT
SHLD MEMPTR ; PUT PTR
POP H ; RESTORE HL
RET