;
; SYSLIB Module Name: SMADC
; Author: Richard Conn
; SYSLIB Version Number: 2.0
; Module Version Number: 1.0
; Module Entry Points:
; MA3DC MADC
; Module External References:
; None
;
;
; MA3DC --
; STORE REG A AS 3 DECIMAL CHARACTERS IN MEMORY
; ON INPUT, A=VALUE AND DE=PTR TO 3-BYTE BUFFER
; ON RETURN, DE PTS TO BYTE AFTER BUFFER
;
MA3DC::
XCHG ; PTR IN HL
PUSH PSW ; SAVE A
PUSH PSW
XRA A ; TURN OFF LEADING <SP> FLAG
STA LSFLG
JMP PADC1
;
; MADC --
; STORE REG A AS DECIMAL CHARACTERS W/LEADING <SP> IN 3-CHAR FIELD
; IN MEMORY; ON INPUT, A=VALUE AND HL=PTR TO 3-BYTE BUFFER
; ON RETURN, HL PTS TO BYTE AFTER BUFFER
;
MADC::
XCHG ; PTR IN HL
PUSH PSW ; SAVE A
PUSH PSW
MVI A,1 ; TURN ON LEADING <SP> FLAG
STA LSFLG
; PRINT ROUTINE
PADC1: POP PSW ; GET A
PUSH B ; SAVE BC
MVI B,100 ; PRINT HUNDREDS
CALL PAC ; PRINT A CHAR
MVI B,10 ; PRINT TENS
CALL PAC
ADI '0' ; CONVERT TO ASCII
CALL PUT ; PRINT
POP B ; RESTORE BC
POP PSW ; RESTORE A
XCHG ; PTR BACK IN DE
RET
; BUFFER
LSFLG: DS 1 ; LEADING <SP> FLAG
; PRINT RESULT OF DIVISION OF A BY B W/LEADING <SP> (INTEGER DIVISION)
PAC: MVI C,0 ; SET COUNT
PACL: SUB B ; COMPUTE COUNT
JC PACD
INR C ; INCR COUNT
JMP PACL
PACD: ADD B ; ADD B BACK IN
PUSH PSW ; SAVE A
MOV A,C ; GET COUNT
ORA A ; ZERO?
JNZ PACD1
LDA LSFLG ; CHECK FOR LEADING <SP>
ORA A ; 0 MEANS NO
JZ PACD1
MVI A,' ' ; PRINT <SP>
CALL PUT
POP PSW ; RESTORE A
RET
PACD1: XRA A ; A=0
STA LSFLG ; TURN OFF LEADING <SP> FLAG
MOV A,C ; GET COUNT
ADI '0' ; CONVERT TO DECIMAL
CALL PUT ; PRINT IT
POP PSW ; RESTORE A
RET
PUT:
MOV M,A ; PUT BYTE
INX H ; PT TO NEXT
RET