home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol090 / smhl5dc.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  2.2 KB  |  116 lines

  1. ;
  2. ; SYSLIB Module Name:  SMHL5D
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  2.0
  5. ; Module Version Number:  1.0
  6. ; Module Entry Points:
  7. ;    MHL5DC        MHLDC
  8. ; Module External References:
  9. ;    None
  10. ;
  11.  
  12. ;
  13. ;  MHL5DC --
  14. ;    STORE HL AS 5 DECIMAL CHARACTERS IN MEMORY
  15. ; ON INPUT, HL=VALUE AND DE=PTR TO 5-BYTE BUFFER
  16. ; ON OUTPUT, DE PTS TO NEXT BYTE AFTER BUFFER
  17. ;
  18.  
  19. PUTRG    MACRO
  20.     PUSH    B    ; SAVE BC, DE, HL
  21.     PUSH    D
  22.     PUSH    H
  23.     ENDM
  24. GETRG    MACRO
  25.     POP    H    ; RESTORE HL, DE, BC
  26.     POP    D
  27.     POP    B
  28.     ENDM
  29.  
  30.  
  31. MHL5DC::
  32.     PUSH    PSW    ; SAVE ALL REGS
  33.     XCHG        ; HL PTS TO BUFFER
  34.     SHLD    MEMPTR
  35.     XCHG
  36.     PUTRG
  37.     XRA    A    ; A=0
  38.     STA    LSFLG0    ; TURN OFF LEADING <SP>
  39.     JMP    PHDC
  40. ;
  41. ;  MHLDC --
  42. ;    STORE HL AS DECIMAL CHARACTERS W/LEADING SPACES IN 5-CHAR FIELD
  43. ; IN MEMORY; ON INPUT, HL=VALUE AND DE=PTR TO 5-BYTE BUFFER
  44. ; ON RETURN, DE PTS TO BYTE AFTER BUFFER
  45. ;
  46. MHLDC::
  47.     PUSH    PSW    ; SAVE ALL REGS
  48.     XCHG        ; HL PTS TO BUFFER
  49.     SHLD    MEMPTR
  50.     XCHG
  51.     PUTRG
  52.     MVI    A,1    ; A=1
  53.     STA    LSFLG0    ; TURN ON LEADING <SP>
  54. ;  PRINT HL USING LEADING <SP> FLAG LSFLG0
  55. PHDC:    LXI    D,10000    ; PRINT 10000'S
  56.     CALL    PHDC1
  57.     LXI    D,1000    ; PRINT 1000'S
  58.     CALL    PHDC1
  59.     LXI    D,100    ; PRINT 100'S
  60.     CALL    PHDC1
  61.     LXI    D,10    ; PRINT 10'S
  62.     CALL    PHDC1
  63.     MOV    A,L    ; PRINT 1'S
  64.     ADI    '0'    ; CONVERT TO ASCII
  65.     CALL    PUT
  66.     GETRG        ; RESTORE ALL REGS
  67.     XCHG        ; DE=VALUE
  68.     LHLD    MEMPTR    ; GET PTR TO NEXT BYTE
  69.     XCHG        ; ... IN DE
  70.     POP    PSW
  71.     RET
  72.  
  73. ;  BUFFERS
  74. LSFLG0:    DS    1    ; LEADING <SP> FLAG
  75. MEMPTR:    DS    2    ; PTR TO NEXT MEMORY ADDRESS
  76.     
  77. ;  DIVIDE HL BY DE AND PRINT QUOTIENT WITH LEADING <SP>S
  78. PHDC1:    MVI    C,0    ; SET COUNT
  79. PHDC2:    MOV    A,L    ; SUB E FROM L
  80.     SUB    E
  81.     MOV    L,A    ; RESULT IN L
  82.     MOV    A,H    ; SUB D FROM H W/BORROW
  83.     SBB    D
  84.     MOV    H,A    ; RESULT IN H
  85.     JC    PHDC3    ; DONE IF CARRY SET (FURTHER BORROW)
  86.     INR    C    ; INCR COUNT
  87.     JMP    PHDC2
  88. PHDC3:    MOV    A,L    ; ADD E TO L
  89.     ADD    E
  90.     MOV    L,A    ; RESULT IN L
  91.     MOV    A,H    ; ADD D TO H W/CARRY
  92.     ADC    D
  93.     MOV    H,A    ; RESULT IN H
  94.     MOV    A,C    ; GET RESULT
  95.     ORA    A    ; CHECK FOR ZERO
  96.     JNZ    PHDC4
  97.     LDA    LSFLG0    ; CHECK FOR LEADING <SP>
  98.     ORA    A    ; PRINT VALUE IF NOT (A=0)
  99.     JZ    PHDC4
  100.     MVI    A,' '    ; PRINT <SP>
  101.     JMP    PUT
  102. PHDC4:    XRA    A    ; TURN OFF LEADING <SP>
  103.     STA    LSFLG0
  104.     MOV    A,C    ; GET VALUE
  105.     ADI    '0'    ; CONVERT TO ASCII
  106. PUT:
  107.     PUSH    H    ; SAVE HL
  108.     LHLD    MEMPTR    ; GET PTR
  109.     MOV    M,A    ; PUT BYTE
  110.     INX    H    ; PT TO NEXT
  111.     SHLD    MEMPTR    ; PUT PTR
  112.     POP    H    ; RESTORE HL
  113.     RET
  114.  
  115.     END
  116.