home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug113.arc / INOUT.Z80 < prev    next >
Text File  |  1979-12-31  |  6KB  |  253 lines

  1.     ENTRY ODEC, IDEC, IKL, OTL, CRLF, MCHINW, VDU
  2. ;
  3. ; DECIMAL PRINT ROUTINE
  4. ; NUMBER TO PRINT IN HL REGISTER
  5. ;
  6. ODEC:    PUSH AF        ; SAVE
  7.     PUSH BC        ;
  8.     PUSH DE        ;
  9.     LD   A,H    ; TEST SIGN
  10.     LD   B,' '    ; IF + PRINT SPACE
  11.     OR   A        ; SET FLAGS
  12.     JP   P,PLUS    ; OK
  13.     PUSH HL        ; MOVE TO
  14.     POP  DE        ; DE
  15.     LD   HL,0    ; 0 - X = -X
  16.     AND  A        ; RESET CARRY
  17.     SBC  HL,DE    ; SUBTRACT TO CHANGE SIGN
  18.     LD   B,'-'    ; IF - print -
  19. PLUS:    CALL VDU    ; PRINT SIGN
  20.     LD   IX,TENS    ; POINTER TO POWERS OF TEN
  21.     LD   B,5    ; FIVE DIGITS
  22.     LD   C,'0'    ; use C as leading zero flag
  23. ;
  24. LOOP:    LD   A,2FH    ; ASCII ZERO - 1
  25.     LD   E,(IX+0)    ; GET LOW BYTE
  26.     LD   D,(IX+1)    ; GET HIGH BYTE
  27. LOOP1:  AND  A        ; CHEAR CARRY
  28.     SBC  HL,DE    ; SUBTRACT DECADE
  29.     INC  A        ; INCREASE DIGIT
  30.     JR   NC,LOOP1    ; NOT NEGATIVE YET
  31.     ADD  HL,DE    ;  OK, RESTORE NO
  32.     CP   '0'    ; IS IT A ZERO ?
  33.     JR   Z,ZERO    ; YES DO LEADING ZERO TEST
  34.     LD   C,A    ; NO REMOVE SUPRESSION
  35. ODEC1:    PUSH BC        ; SAVE COUNT
  36.     LD   B,A    ; print needs it in B
  37.         CALL  VDU       ; PRINT
  38.     POP   BC    ; RESTORE COUNT
  39.     INC   IX    ; POINT TO NEXT
  40.     INC   IX    ; DECADE VALUE
  41.     DJNZ  LOOP    ; DO IT 5 TIMES
  42.     POP DE        ; RESTORE REGISTERS
  43.     POP BC        ;
  44.     POP AF        ;
  45.         RET        ; FINISHED
  46. ;
  47. ZERO:    CP   C        ; If A = '0' AND C = '0'
  48.     JR   NZ,ODEC1    ; IF NOT PRINT ZERO
  49.     LD   A,B    ; TEST COUNTER
  50.     CP   1        ; TO SEE IF LAST DIGIT
  51.     LD   A,'0'    ; RESTORE A
  52.     JR   Z,ODEC1    ; LAST DIGIT,PRINT '0'
  53.     LD   A,' '    ; IF TRUE PRINT SPACE
  54.     JR   ODEC1
  55. ;
  56. ; Table for conversion to decimal
  57. ;
  58. TENS:   DEFW  10000
  59.     DEFW  1000
  60.     DEFW  100
  61.     DEFW  10
  62.     DEFW  1
  63. ;
  64. ; Decimal input routine
  65. ;
  66. ; Number is returned in HL registers
  67. ; when a non digit character is typed.
  68. ; The non digit char is returned in A.
  69. ; + or - sign is permitted, NO '.' INTEGERS ONLY.
  70. ;
  71. ; IF ERROR IS FOUND '?' TYPED, START AGAIN.
  72. ;
  73. IDEC:     PUSH AF        ; save registers
  74.     PUSH BC        ; to  be used in this routine
  75.     PUSH DE        ;
  76. IDEC0:    LD   A,'+'    ; set sign to +
  77.     LD   (SIGN),A    ;
  78.     LD   DE,LINE    ; max of 7 characters
  79. ;
  80. ; Fetch characters and examine for special types
  81. ;
  82. IDEC1:    PUSH HL
  83.     PUSH BC
  84.     LD   C,10      ; BDOS code.
  85.     CALL 5           ; Call BDOS
  86.     POP  BC
  87.     POP  HL
  88. ;
  89.     JP  IDEC2    ; Go to next Bit
  90. ;
  91. ; Errors here
  92. ;
  93. ERROR1:    LD    B,'?'    ; type ?
  94.     CALL  VDU    ; on screen
  95.     JR    IDEC0    ; Start over
  96. ;
  97. ; Adjust sign
  98. ;
  99. SIGNS:    LD   (SIGN),A    ; set indicator
  100.     JR   IDEC1    ; continue
  101. ;
  102. ; Assemble number
  103. ;
  104. IDEC2:  LD   IY,CNT     ; Number of characters Typed.
  105.     LD   IX,LINES    ; pointer to start
  106.     LD   HL,0    ; number = zero
  107.     LD   BC,0    ;
  108. ;
  109. IDEC3:    LD   A,(IX+0)    ; get digit
  110. ;
  111.     CP   '-'        ; Negative Number ?
  112.         JR   NZ,IDEC4   ; No
  113.     LD   (SIGN),A   ; Yes change Sign.
  114.     JR   IDEC5    ;
  115. ;
  116. IDEC4:    CP   '0'    ; < '0' ?
  117.     JR   C,DONE    ; yes
  118.     CP   '9'+1      ; > '9' ?
  119.     JR   NC,DONE    ; yes
  120. ;
  121.     SUB  '0'    ; Convert to Binary.
  122.     LD   C,A    ; In BC.
  123. ;
  124.     SLA  L        ; Multiply Number by 10.
  125.     RL   H        ; * 2
  126.     JR   C,ERROR1    ; too  big
  127.     PUSH HL        ; SAVE
  128.     POP  DE        ;in de
  129.     SLA  L        ;
  130.     RL   H        ; X * 2 * 2 = 4*X
  131.     JR   C,ERROR1    ; too big
  132.     SLA  L        ;
  133.     RL   H        ; 4 * X * 2 = 8*X
  134.     JR   C,ERROR1    ;  too big
  135.     ADC  HL,DE    ; 8*X + 2*X = 10*X
  136.     JP   M,ERROR1    ; CHECK FOR > 32767
  137.     ADC  HL,BC    ; add digit in C
  138.     JP   M,ERROR1    ; AGAIN JUST IN CASE
  139. ;
  140. IDEC5:    INC  IX        ; move pointer
  141.     DEC  (IY+0)     ; Decrement Counter
  142.     JR   NZ,IDEC3    ; next digit
  143. ;
  144. ; correct sign
  145. ;
  146. DONE:    LD   A,(SIGN)    ; fetch sign
  147.     CP   '-'    ; is it minus
  148.     JR   NZ,DONEIT    ; no leave it plus
  149.     PUSH HL        ; put number into 
  150.     POP  DE        ;  DE
  151.     LD   HL,0    ; Set HL to zero
  152.     AND  A        ; CLEAR CARRY
  153.     SBC  HL,DE    ; 0 - X =  -X
  154. DONEIT:    POP  DE        ; RESTORE
  155.     POP  BC        ;
  156.     POP  AF        ;
  157.     LD   A,(FINAL)    ; Return first non digit in A
  158.     RET        ; ALL DONE
  159. ;
  160. LINE:    DEFB LINEE-LINES; input buffer maximum count.
  161. CNT:    DEFB 0          ; Actual character Count.
  162. LINES:  DEFS 8          ; Characters
  163. LINEE:            ; End of line.
  164. ;
  165. SIGN:    DEFB 0        ; sign for number
  166. FINAL:    DEFB 0        ; First non digit char
  167. ;
  168. VDU:    PUSH HL
  169.     PUSH DE
  170.     PUSH BC
  171.     PUSH AF
  172.     LD   E,B       ; Character to Print.
  173.     LD   C,2       ; BDOS code.
  174.     CALL 5           ; Call BDOS
  175.     POP  AF
  176.     POP  BC
  177.     POP  DE
  178.     POP HL
  179.     RET
  180. ;
  181. MCHINW:    PUSH HL
  182.     PUSH DE
  183.     PUSH BC
  184.     LD   C,1       ; BDOS code.
  185.     CALL 5           ; Call BDOS
  186.     POP  BC
  187.     POP  DE
  188.     POP  HL
  189.     RET
  190. ;
  191.  
  192. ;
  193. ; Text Input Routine IKL
  194. ; reads a string of chars from keyboard
  195. ; prints on screen,  stopps when char read
  196. ; is equal to char in A register,  HL register
  197. ; is used as a POINTER to store data, terminal
  198. ; char is LAST char stored.
  199. ;
  200. IKL:    PUSH AF        ; save flags
  201.     PUSH BC        ;
  202. IKL1:    PUSH AF        ; save term char in A
  203.     CALL MCHINW    ; read keyboard
  204.     CP   7FH    ; DELETE ?
  205.     JP   Z,IKL3    ; YES
  206.     LD   (HL),A    ; NO STORE
  207.     INC  HL        ;
  208. IKL2:    POP  AF        ; restore A
  209.     CP   B        ; IS IT THE ONE ?
  210.     JR   NZ,IKL1    ; NO
  211.     POP  BC        ;
  212.     POP  AF        ; RESTORE
  213.     RET        ; YES
  214. ;
  215. IKL3:    DEC  HL        ; BACK POINTER
  216.     JR   IKL2    ;
  217. ;
  218. ;
  219. ; Text output routine OTL
  220. ; HL is pointer and A contains final Char.
  221. ; Final char is NOT printed.
  222. ;
  223. OTL:    PUSH AF        ; save flags
  224.     PUSH BC        ;
  225. OTL1:    PUSH AF        ; save term
  226.     LD   A,(HL)    ; GET char
  227.     LD   B,A    ;
  228.     POP  AF        ; restore
  229.     CP   B        ; is this the END ?
  230.     JR   Z,OTL2    ; yes
  231.     CALL VDU    ; no print it
  232.     INC  HL        ;
  233.     JR   OTL1    ; get next
  234. ;
  235. OTL2:    POP  BC        ;
  236.     POP  AF        ; restore
  237.     RET        ;
  238. ;
  239. ; Carriage Return  Line Feed Routine
  240. ; called CRLF.
  241. ; no registers are changed.
  242. ;
  243. CRLF:    PUSH BC        ; Save BC.
  244.     LD   B,0DH    ; CR
  245.     CALL VDU    ; do it
  246.     LD   B,0AH    ; LF
  247.     CALL VDU    ; do it
  248.     POP  BC        ; Restore BC
  249.     RET        ; Thats All !!
  250. ;
  251.     END
  252.  
  253.