home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol117 / tools.aqc / TOOLS.ARC
Encoding:
Text File  |  1985-02-10  |  54.4 KB  |  3,645 lines

  1. TOOLS.ARC    830214:1552 -- Greg Louis
  2. >>> SYSEQU.MAC    820827:0928
  3. >>> MATHEQU.MAC    820827:0928
  4. >>> LINKEQU.MAC    820827:0928
  5. >>> ACOMPR.MAC    820820:1707
  6. >>> ADDA.MAC    820820:1709
  7. >>> ADDAD.MAC    820820:1715
  8. >>> ARGBUF.MAC    820820:1715
  9. >>> BUFBLK.MAC    820820:1716
  10. >>> CLOSE.MAC    820825:1543
  11. >>> CONMSG.MAC    820825:1316
  12. >>> CONPUT.MAC    820825:1655
  13. >>> CRLF.MAC    820820:1716
  14. >>> CRLFF.MAC    820820:1717
  15. >>> CRLFMS.MAC    820820:1717
  16. >>> CTODI.MAC    820830:1219
  17. >>> CTOF.MAC    820820:1717
  18. >>> CTOI.MAC    820820:1717
  19. >>> DCMP.MAC    820820:1718
  20. >>> DPL.MAC    820820:1718
  21. >>> ERROR.MAC    820820:1718
  22. >>> ESC.MAC    830214:1552
  23. >>> EXIT.MAC    820820:1718
  24. >>> FILL.MAC    820820:1718
  25. >>> FILLBF.MAC    820820:1718
  26. >>> FNB.MAC    820820:1718
  27. >>> FNDBUF.MAC    820825:1521
  28. >>> FTOC.MAC    820830:1542
  29. >>> GETARG.MAC    820820:1719
  30. >>> GETC.MAC    820820:1720
  31. >>> GETCF.MAC    820820:1720
  32. >>> GETLIN.MAC    820820:1720
  33. >>> GETLNF.MAC    820902:1032
  34. >>> GETWD.MAC    820820:1720
  35. >>> HCTODI.MAC    820820:1723
  36. >>> HCTOI.MAC    820820:1723
  37. >>> HDCMP.MAC    820820:1723
  38. >>> HLDDE.MAC    820820:1724
  39. >>> HLMDE.MAC    820820:2333
  40. >>> HLXDE.MAC    820820:2333
  41. >>> INDEX.MAC    820821:0955
  42. >>> INIT.MAC    820820:2333
  43. >>> INPORT.MAC    820820:2333
  44. >>> IPTBUF.MAC    820820:2335
  45. >>> ISDIGD.MAC    820820:2335
  46. >>> ISDIGH.MAC    820820:2335
  47. >>> ITOC.MAC    820820:2335
  48. >>> LENGTH.MAC  820927:1317
  49. >>> LSTPUT.MAC    820825:1656
  50. >>> MAKFCB.MAC    820823:1358
  51. >>> MEMRY.MAC    820820:2336
  52. >>> MOVEL.MAC    820820:2336
  53. >>> MOVES.MAC    820820:2337
  54. >>> MOVEU.MAC    820820:2345
  55. >>> MPLD.MAC    820820:2346
  56. >>> MPLS.MAC    820820:2347
  57. >>> MPRD.MAC    820820:2352
  58. >>> MPRS.MAC    820820:2354
  59. >>> MPS0.MAC    820820:2354
  60. >>> MPWAIT.MAC    820820:2354
  61. >>> MTBUF.MAC    820820:2354
  62. >>> NEGH.MAC    820820:2354
  63. >>> OP32.MAC    820820:2354
  64. >>> OPEN.MAC    820820:2355
  65. >>> OUTPT.MAC    820820:2355
  66. >>> PCSTR.MAC    820825:1740
  67. >>> PCMSG.MAC    820825:1741
  68. >>> PLMSG.MAC    820825:1742
  69. >>> PLSTR.MAC    820825:1743
  70. >>> PROMPT.MAC    820901:0957
  71. >>> PUSHBF.MAC    820820:2355
  72. >>> PUSHBK.MAC    820820:2356
  73. >>> PUTC.MAC    820820:2356
  74. >>> PUTCF.MAC    820820:2356
  75. >>> PUTDCF.MAC    820825:1941
  76. >>> PUTDEC.MAC    820825:1942
  77. >>> PUTMSF.MAC    820825:1746
  78. >>> PUTMSG.MAC    820825:1748
  79. >>> PUTSTF.MAC    820825:1749
  80. >>> PUTSTR.MAC    820825:1751
  81. >>> RDCLK.MAC    820820:2356
  82. >>> REMARK.MAC    820820:2356
  83. >>> SELCMD.MAC    820820:2356
  84. >>> SETBF.MAC    820820:2356
  85. >>> SOUNDX.MAC    820820:2357
  86. >>> SPXCH.MAC    820820:2357
  87. >>> STDIO.MAC    820820:2357
  88. >>> TABBER.MAC    820820:2357
  89. >>> TABBRF.MAC    820820:2357
  90. >>> TYPAHD.MAC    820901:1338
  91. >>> UPCASE.MAC    820820:2357
  92. *********************************************************
  93. Insertion macro:
  94. 1QAI>>> IAI.*13I-1LBCXIA@LV0UAS*-1MBGA@0LL
  95. Deletion macro:
  96. 1QAUASALKUSALTLEUS>>>L#K
  97. Replacement macro:
  98. 1QAUASALKI*IUSALTLEUS>>>L#K
  99. I>>> IAI.*13I-1LBCXIA@LV0UAS*-1MBGKA@0LL
  100. Extraction macro:
  101. 1QAUAS*USALTEUS>>>L#XOA
  102. Printout macro:
  103. 1QAUAS*USALIL8;R72ITEUS>>>L12QTF#XTF#V0-1K
  104. *********************************************************
  105. >>> SYSEQU.MAC    820827:0928
  106. ; General system equates for assembler programs
  107. ; 820819:1335
  108. ;
  109.     .8080
  110. ; CP/M calls
  111. BOOT    EQU    0    ; warmboot vector
  112. BDOS    EQU    5    ; system call point
  113. WBOOT    EQU    0    ; system reset
  114. RDKBD    EQU    1    ; console input
  115. PRTCHR    EQU    2    ; console output
  116. LSTCHR    EQU    5    ; list dev output
  117. DIRIO    EQU    6    ; direct console i/o
  118. RDIOB    EQU    7    ; read the iobyte
  119. SETIOB    EQU    8    ; set the iobyte
  120. PRTSTR    EQU    9    ; string console out
  121. RDSTR    EQU    10    ; string console in
  122. RDCST    EQU    11    ; read console status
  123. RDVERS    EQU    12    ; get version number
  124. RSTDSK    EQU    13    ; reset disk system
  125. SELDSK    EQU    14    ; select disk
  126. OPENF    EQU    15    ; open file
  127. CLOSEF    EQU    16    ; close file
  128. FND1ST    EQU    17    ; find first entry
  129. FNDNXT    EQU    18    ; find next entry
  130. ERASEF    EQU    19    ; delete file
  131. RDSEQ    EQU    20    ; read file sequent.
  132. WRTSEQ    EQU    21    ; write file sequent.
  133. MAKEF    EQU    22    ; create file
  134. RENAME    EQU    23    ; rename file
  135. RDDSK    EQU    25    ; return current disk
  136. SETDMA    EQU    26    ; set DMA addr
  137. SETFIL    EQU    30    ; set file attributes
  138. USER    EQU    32    ; get/set user code
  139. RDRND    EQU    33    ; read random
  140. WRTRND    EQU    34    ; write random
  141. RDSIZE    EQU    35    ; compute file size
  142. SETRND    EQU    36    ; set random record
  143. RSTDRV    EQU    37    ; reset drive(s)
  144. WRTZER    EQU    40    ; write random 0 fill
  145. ;
  146. ; ASCII character set and video control
  147. ;
  148. ENDSTR    EQU    0    ; end-of-string
  149. BEL    EQU    7    ; bell
  150. BKS    EQU    8    ; backspace
  151. TAB    EQU    9    ; tab-by-8
  152. LF    EQU    10    ; linefeed
  153. NEWLIN    EQU    LF
  154. VT    EQU    11    ; vertical tab
  155. FF    EQU    12    ; formfeed
  156. CR    EQU    13    ; return
  157. CEOL    EQU    14    ; clear-line
  158. CEOS    EQU    15    ; clear-scr
  159. CAN    EQU    24    ; cancel line
  160. EOF    EQU    26    ; end-of-file
  161. ESCAPE    EQU    27
  162. BLANK    EQU    32    ; space
  163. SQUOTE    EQU    39    ; '
  164. PLUS    EQU    43    ; +
  165. MINUS    EQU    45    ; -
  166. PERIOD    EQU    46    ; .
  167. DEL    EQU    127
  168. ; other printing chars go in ''s
  169. ;
  170. ; System limitations
  171. ;
  172. MAXDRV    EQU    4    ; Number of drives
  173. MAXLIN    EQU    120    ; Biggest line allowed
  174. SECTRS    EQU    8    ; Sectors to buffer per file
  175. ;
  176. ; Non-CP/M peripherals
  177. ;
  178. ; 8251
  179. S0DAT    EQU    0    ; 8251 data port
  180. S0CMD    EQU    1    ; 8251 cmd/stat port
  181. S0BRG    EQU    4    ; baud rate gen
  182. S0XRDY    EQU    1    ; TxRDY
  183. S0RRDY    EQU    2    ; RxRDY
  184. S08NOP    EQU    4EH    ; 8 bits, no parity
  185. S07EVN    EQU    7AH    ; 7 bits, even par
  186. ;
  187. ; SS1
  188. SBAS    EQU    50H    ; SS1 BASE PORT ADDR
  189. IMAST0    EQU    SBAS    ; Interrupt master low
  190. IMAST1    EQU    SBAS+1    ; Interrupt master hi
  191. ISLV0    EQU    SBAS+2    ; Interrupt slave low
  192. ISLV1    EQU    SBAS+3    ; Interrupt slave hi
  193. TIMER0    EQU    SBAS+4    ; Timer/counter 0
  194. TIMER1    EQU    SBAS+5
  195. TIMER2    EQU    SBAS+6
  196. TIMCTL    EQU    SBAS+7    ; Timer/counter ctrl
  197. MDATA    EQU    SBAS+8    ; Math chip data
  198. MCMDS    EQU    SBAS+9    ; Math command/status
  199. CSTAT    EQU    SBAS+10    ; Clock status
  200. CDATA    EQU    SBAS+11    ; Clock data
  201. UDATA    EQU    SBAS+12    ; UART data
  202. USTAT    EQU    SBAS+13    ; UART status
  203. UMODE    EQU    SBAS+14    ; UART mode
  204. UCMD    EQU    SBAS+15    ; UART command
  205. MCDLY    EQU    4000H    ; Math chip timeout
  206. ;
  207. ; Message macro
  208. MSG    MACRO    TEXT
  209.     .XLIST
  210.     IRP    N,<TEXT>
  211.     DB    N
  212.     ENDM
  213.     DB    ENDSTR
  214.     .LIST
  215.     ENDM
  216. >>> MATHEQU.MAC    820827:0928
  217. ; Math-chip opcode equates and call structure
  218. ; 820818:1056
  219.     .8080
  220.  
  221.     EXT    MPWAIT,OP32
  222. MC    MACRO    OPCODE
  223.     .XLIST
  224.     MVI    A,OPCODE
  225.     CALL    MPWAIT
  226.     .LIST
  227.     ENDM
  228.  
  229. ;     HL op DE -> HL, Math-chip operations
  230. DMC    MACRO    OPCODE
  231.     .XLIST
  232.     MVI    A,D&OPCODE
  233.     CALL    OP32
  234.     .LIST
  235.     ENDM
  236.  
  237. ; OPCODES:        RESULTS (on stack A B C D)
  238. ACOS    EQU    6    ; (ACOS A) U U U
  239. ASIN    EQU    5    ; (ASIN A) U U U
  240. ATAN    EQU    7    ; (ATAN A) B U U
  241. CHSF    EQU    15H    ; -A B C D
  242. COS    EQU    3    ; (COS A) B U U
  243. EXP    EQU    0AH    ; (e^A) B U U
  244. FADD    EQU    10H    ; (A+B) C D U
  245. FDIV    EQU    13H    ; (B/A) C D U
  246. FLTD    EQU    1CH    ; A B C U
  247. FLTS    EQU    1DH    ; A B C U
  248. FMUL    EQU    12H    ; (A*B) C D U
  249. FSUB    EQU    11H    ; (B-A) C D U
  250. LOG    EQU    8    ; (LOG A) B U U
  251. LN    EQU    9    ; (LN A) B U U
  252. POPF    EQU    18H    ; B C D A
  253. PTOF    EQU    17H    ; A A B C
  254. PUPI    EQU    1AH    ; 3.14... A B C
  255. PWR    EQU    0BH    ; (B^A) C U U
  256. SIN    EQU    2    ; (SIN A) B U U
  257. SQRT    EQU    1    ; (SQRT A) B U U
  258. XCHF    EQU    19H    ; B A C D
  259. CHSD    EQU    34H    ; -A B C D
  260. DADD    EQU    2CH    ; (A+B) C D A
  261. DDIV    EQU    2FH    ; (B/A) C D U
  262. DMUL    EQU    2EH    ; (A*B) C D U
  263. DMUU    EQU    36H    ; (A*B) C D U (Up.32)
  264. DSUB    EQU    2DH    ; (B-A) C D A
  265. FIXD    EQU    1EH    ; A B C U
  266. POPD    EQU    38H    ; B C D A
  267. PTOD    EQU    37H    ; A A B C
  268. XCHD    EQU    39H    ; B A C D
  269. CHSS    EQU    74H    ; -AU AL BU BL CU CL DU DL
  270. FIXS    EQU    1FH    ; A BU BL CU CL U U U
  271. POPS    EQU    78H    ; AL BU BL CU CL DU DL AU
  272. PTOS    EQU    77H    ; AU AU AL BU BL CU CL DU
  273. SADD    EQU    6CH    ; (AU+AL) BU BL CU CL DU DL AU
  274. SDIV    EQU    6FH    ; (AL/AU) BU BL CU CL DU DL U
  275. SMUL    EQU    6EH    ; (AU*AL) BU BL CU CL DU DL U
  276. SMUU    EQU    76H    ; (AU*AL) etc as above - up.16
  277. SSUB    EQU    6DH    ; (AL-AU) BU BL CU CL DU DL AU
  278. XCHS    EQU    79H    ; AL AU BU BL CU CL DU DL
  279. MNOP    EQU    0    ; AU AL BU BL CU CL DU DL
  280. ;
  281. >>> LINKEQU.MAC    820827:0928
  282. ; FILE:    LINKEQU.MAC
  283. ; DATE:    820819:2255
  284. ; FOR:    Determining compilation of $MEMRY
  285. LYNX    EQU    0FFFFH    ; Lynx linker, use 108H
  286. >>> ACOMPR.MAC    820820:1707
  287. ; FILE:    ACOMPR.MAC
  288. ; DATE:    820819:2149
  289. ; FOR:    See comment
  290.     .8080
  291. ; Routine ACOMPR does lexical comparison
  292. ; between strings pointed to by HL & DE
  293. ; for length in register C, returning
  294. ; Z set if equal, C set if the DE string
  295. ; is less than the HL string, and both
  296. ; clear if the DE string is greater than
  297. ; the HL string.  Register A is preserved.
  298. ACOMPR:: PUSH    H
  299.     PUSH    D
  300.     PUSH    B
  301.     MOV    B,A
  302. COMPLP:    LDAX    D
  303.     CMP    M
  304.     JNZ    COMPEX
  305.     INX    H
  306.     INX    D
  307.     DCR    C
  308.     JNZ    COMPLP
  309. COMPEX:    MOV    A,B
  310.     POP    B
  311.     POP    D
  312.     POP    H
  313.     RET
  314.     END
  315. >>> ADDA.MAC    820820:1709
  316. ; FILE:    ADDA.MAC
  317. ; DATE: 820818:1310
  318. ; FOR:    A + HL -> HL
  319.  
  320.     TITLE    ADDA - A + HL -> HL
  321.     .8080
  322. ADDA::    ADD    L
  323.     MOV    L,A
  324.     RNC
  325.     INR    H
  326.     RET
  327.     END
  328. >>> ADDAD.MAC    820820:1715
  329. ; FILE:    ADDAD.MAC
  330. ; DATE: 820818:1312
  331. ; FOR:    Add A to 32-bit number on 9511 stack
  332.  
  333.     TITLE    ADDAD - Add A to 9511 D number
  334.     .8080
  335.     .XLIST
  336.     INCLUDE SYSEQU
  337.     INCLUDE MATHEQU
  338.     .LIST
  339.     EXT    MPLS,MPS0
  340. ADDAD::    PUSH    H
  341.     MOV    L,A
  342.     MVI    H,0
  343.     CALL    MPLS
  344.     CALL    MPS0
  345.     POP    H
  346.     MC    DADD
  347.     RET
  348.     END
  349. >>> ARGBUF.MAC    820820:1715
  350. ; FILE:    ARGBUF.MAC
  351. ; DATE:    820819:1532
  352. ; FOR:    Command-line buffer
  353.     .8080
  354.     CSEG
  355. ARGBUF:: DS    100
  356. NARGS::    DS    1
  357.     DB    0
  358.     END
  359. >>> BUFBLK.MAC    820820:1716
  360. ; FILE:    BUFBLK.MAC
  361. ; DATE:    820819:1211
  362. ; FOR:    Channel allocation and buffer defs.
  363.     .8080
  364.     CSEG
  365. CHANLS:: REPT    16
  366.     DW    0
  367.     ENDM
  368. BUFBLS::
  369.     REPT    15
  370.     DW    0    ;; End of buffer
  371.     DS    2    ;; Buffer pointer (-len to 0)
  372.     DS    2    ;; Buffer size (-len)
  373.     DS    2    ;; FCB address
  374.     DB    0FFH    ;; Buffer size in sectors
  375.     DS    1    ;; Read-write flag (w=0ffh)
  376.     ENDM
  377.     END
  378. >>> CLOSE.MAC    820825:1543
  379. ; FILE:    CLOSE.MAC
  380. ; DATE:    820825:1538
  381. ; FOR:    Close file and free channel C
  382.  
  383.     TITLE    CLOSE - close and free channel
  384.     .8080
  385.     .XLIST
  386.     INCLUDE SYSEQU
  387.     .LIST
  388.     EXT    FNDBUF,NEGH,SETBF,MTBUF
  389.     EXT    ADDA,CHANLS,ERROR
  390. CLOSE::    PUSH    H
  391.     PUSH    D
  392.     PUSH    B
  393.     MOV    A,C
  394.     ANI    15
  395.     JZ    CLOSED
  396.     CALL    FNDBUF
  397.     STA    RWFLG
  398.     MOV    A,H
  399.     ORA    L
  400.     JZ    CLOSED
  401.     LDA    RWFLG
  402.     INR    A
  403.     JNZ    RLEASE
  404.     PUSH    H
  405.     INX    H
  406.     INX    H    ; Bufptr
  407.     MOV    E,M
  408.     INX    H    ; +1
  409.     MOV    D,M
  410.     XCHG
  411.     CALL    NEGH    ; Space left
  412.     XCHG
  413.     MOV    A,E
  414.     ORA    A
  415.     RAL
  416.     MOV    A,D
  417.     RAL        ; Sectors left
  418.     INX    H    ; Buflen
  419.     PUSH    H    ; Save for SETBF
  420.     INX    H
  421.     INX    H
  422.     INX    H
  423.     INX    H
  424.     SUB    M    ; Sectors in buffer
  425.     POP    H    ; Buflen
  426.     CMA
  427.     INR    A    ; Sectors to write
  428.     JZ    READY
  429.     PUSH    PSW
  430.     CALL    SETBF
  431.     POP    PSW
  432.     MOV    C,A
  433.     CALL    MTBUF
  434. READY:    POP    H
  435.     PUSH    H
  436.     MVI    A,6
  437.     CALL    ADDA
  438.     MOV    E,M
  439.     INX    H
  440.     MOV    D,M    ; FCB
  441.     MVI    C,CLOSEF
  442.     CALL    BDOS
  443.     INR    A    ; 0 if failure to close
  444.     JNZ    RLEASE-1
  445.     CALL    ERROR
  446.     MSG    <'CLOSE: Directory entry gone!'>
  447.     POP    H
  448. RLEASE:    MVI    M,0
  449.     INX    H
  450.     MVI    M,0
  451.     POP    B
  452.     PUSH    B
  453.     MOV    A,C
  454.     ADD    A
  455.     LXI    H,CHANLS
  456.     CALL    ADDA
  457.     MVI    M,0
  458.     INX    H
  459.     MVI    M,0
  460. CLOSED:    POP    B
  461.     MOV    A,C
  462.     ORA    A
  463.     POP    D
  464.     POP    H
  465.     RET
  466. RWFLG:    DS    1
  467.     END
  468. >>> CONMSG.MAC    820825:1316
  469. ; FILE:    CONMSG.MAC
  470. ; DATE: 820825:1312
  471. ; FOR:    Print string in <HL> with ENDSTR delim
  472.  
  473.     TITLE    CONMSG - Put string on CON:
  474.     .8080
  475.     .XLIST
  476.     INCLUDE SYSEQU
  477.     .LIST
  478. CONMSG:: PUSH    D    ; Save all but HL
  479.     PUSH    B    ; ..which will point
  480.     PUSH    PSW    ; ..past the ENDSTR
  481. CM0:    MOV    A,M    ; ..on exit.
  482.     INX    H
  483.     CPI    ENDSTR
  484.     JZ    MSGEND
  485.     PUSH    H
  486.     MOV    E,A
  487.     MVI    C,PRTCHR
  488.     CALL    BDOS
  489.     POP    H
  490.     JMP    CM0
  491. MSGEND:    POP    PSW
  492.     POP    B
  493.     POP    D
  494.     RET
  495.     END
  496. >>> CONPUT.MAC    820825:1655
  497. ; FILE:    CONPUT.MAC
  498. ; DATE:    820825:1646
  499. ; FOR:    Put single char on CON: via PUTCF
  500.     .8080
  501.     TITLE    CONPUT - Put char on CON:
  502.     EXT    PUTCF
  503. CONPUT:: PUSH    B
  504.     MVI    C,0
  505.     CALL    PUTCF
  506.     POP    B
  507.     RET
  508.     END
  509. >>> CRLF.MAC    820820:1716
  510. ; FILE:    CRLF.MAC
  511. ; DATE: 820820:1352
  512. ; FOR:    Write CRLF to std output
  513.  
  514.     TITLE    CRLF - Write CRLF - std output
  515.     .8080
  516.     EXT    STDOUT,CRLFF
  517. CRLF::    PUSH    B
  518.     MOV    B,A
  519.     LDA    STDOUT
  520.     MOV    C,A
  521.     CALL    CRLFF
  522.     MOV    A,B
  523.     POP    B
  524.     RET
  525.     END
  526. >>> CRLFF.MAC    820820:1717
  527. ; FILE:    CRLFF.MAC
  528. ; DATE: 820820:1505
  529. ; FOR:    Write CR then LF to channel C
  530.  
  531.     TITLE    CRLFF - CRLF to channel C
  532.     .8080
  533.     .XLIST
  534.     INCLUDE SYSEQU
  535.     .LIST
  536.     EXT    PUTCF
  537. CRLFF::    PUSH    PSW
  538.     MVI    A,CR
  539.     CALL    PUTCF
  540.     MVI    A,LF
  541.     CALL    PUTCF
  542.     POP    PSW
  543.     RET
  544.     END
  545. >>> CRLFMS.MAC    820820:1717
  546. ; FILE:    CRLFMS.MAC
  547. ; DATE: 820818:1350
  548. ; FOR:    CRLF string
  549.  
  550.     .8080
  551.     .XLIST
  552.     INCLUDE SYSEQU
  553.     .LIST
  554.     CSEG
  555. CRLFMS::
  556.     MSG    <CR,LF>
  557.     END
  558. >>> CTODI.MAC    820830:1219
  559. ; FILE:    CTODI.MAC
  560. ; DATE: 820818:1213
  561. ; MOD:    820820:1612    ; Complete externals
  562. ; FOR:    Convert string at <HL> to 32bit in <DE>
  563.  
  564.     TITLE    CTODI - Convert chars to 32bit
  565.     .8080
  566.     .COMMENT "
  567. This routine returns a 32-bit integer in
  568. <DE> to <DE+3> and advances HL to point to
  569. the first non-digit character in the string,
  570. which serves as the terminator and is returned
  571. in A.
  572. "
  573.     .XLIST
  574.     INCLUDE SYSEQU
  575.     INCLUDE MATHEQU
  576.     .LIST
  577.     EXT    ADDA,NEGH,ISDIGD,FNB
  578.     EXT    MPLS,MPS0,MPRD,DPL
  579. CTODI::    PUSH    B
  580.     MOV    B,H
  581.     MOV    C,L
  582.     MVI    A,0FFH
  583.     STA    DPL
  584.     CALL    FNB
  585.     LXI    H,0
  586.     CPI    MINUS
  587.     JNZ    CT0
  588.     DCX    H
  589.     JMP    CT1
  590. CT0:    CPI    PLUS
  591.     JNZ    CT2
  592. CT1:    INX    B
  593.     LDAX    B
  594. CT2:    PUSH    H
  595.     CALL    MPS0
  596.     CALL    MPS0
  597. CT3:    CALL    ISDIGD
  598.     JC    CT4
  599.     PUSH    PSW
  600.     LXI    H,10
  601.     CALL    MPLS
  602.     CALL    MPS0
  603.     MC    DMUL
  604.     POP    PSW
  605.     MOV    L,A
  606.     MVI    H,0
  607.     CALL    MPLS
  608.     CALL    MPS0
  609.     MC    DADD
  610.     LDA    DPL
  611.     ORA    A
  612.     JM    CT3A
  613.     INR    A
  614.     STA    DPL
  615. CT3A:    INX    B
  616.     LDAX    B
  617.     JMP    CT3
  618. CT4:    CPI    PERIOD
  619.     JNZ    CT5
  620.     LDA    DPL
  621.     ORA    A
  622.     JP    CT5
  623.     INR    A
  624.     STA    DPL
  625.     JMP    CT3A
  626. CT5:    POP    H
  627.     MOV    A,H
  628.     ORA    L
  629.     JZ    CT6
  630.     MC    CHSD
  631. CT6:    XCHG
  632.     CALL    MPRD
  633.     XCHG
  634.     MOV    H,B
  635.     MOV    L,C
  636.     LDA    DPL
  637.     ORA    A
  638.     JP    CT7
  639.     INR    A
  640.     STA    DPL
  641. CT7:    MOV    A,M
  642.     POP    B
  643.     RET
  644.     END
  645. >>> CTOF.MAC    820820:1717
  646. ; FILE:    CTOF.MAC
  647. ; DATE: 820818:1353
  648. ; FOR:    Convert string at <HL> to floating
  649.  
  650.     TITLE    CTOF - Convert chars to float
  651.     .8080
  652.     .COMMENT "
  653. This routine returns a floating point number
  654. on the 9511 stack and advances HL to point to
  655. the first non-digit character in the string,
  656. which serves as the terminator and is returned
  657. in A.
  658. "
  659.     .XLIST
  660.     INCLUDE SYSEQU
  661.     INCLUDE MATHEQU
  662.     .LIST
  663.     EXT    CTODI,CTOI,ERROR
  664.     EXT    MPLS,MPS0,MPLD,DPL
  665. CTOF::    PUSH    D
  666.     LXI    D,MANTIS
  667.     CALL    CTODI
  668.     ORI    20H    ; force lower case
  669.     CPI    'e'
  670.     LDA    DPL
  671.     STA    EXPOFF
  672.     LXI    D,0
  673.     JNZ    NOEXP
  674.     INX    H
  675.     CALL    CTOI    ; exponent in DE
  676. NOEXP:    PUSH    H
  677.     LXI    H,10    ; Base
  678.     CALL    MPLS
  679.     MC    FLTS
  680.     LXI    H,EXPOFF
  681.     MOV    A,E    ; Subtract offset
  682.     SUB    M
  683.     MOV    E,A
  684.     JNC    $+4
  685.     DCR    D
  686.     XCHG
  687.     CALL    MPLS
  688.     MC    FLTS
  689.     MC    PWR    ; Base^exponent
  690.     ANI    1EH    ; All 4 error flags
  691.     JZ    CTF0    ; If no errors
  692.     CPI    8    ; Only over/under?
  693.     JC    CTF1    ; if over/under error
  694.     CALL    ERROR
  695.     MSG    <'CTOF: Exponent out of range'>
  696. CTF0:    LXI    H,MANTIS
  697.     CALL    MPLD
  698.     MC    FLTD
  699.     ANI    2
  700.     JNZ    CTF2    ; Overflow error
  701.     MC    FMUL
  702.     ANI    6
  703.     JZ    CTF3
  704. CTF1:    ANI    2
  705.     JNZ    CTF2    ; Overflow error
  706.     MC    POPF    ; Junk exp or result
  707.     CALL    MPS0
  708.     CALL    MPS0    ; Load 0
  709.     JMP    CTF3
  710. CTF2:    CALL    ERROR
  711.     MSG    <'CTOF: Floating-point overflow'>
  712. CTF3:    POP    H
  713.     POP    D
  714.     MOV    A,M
  715.     RET
  716. MANTIS:    DS    4
  717. EXPOFF:    DS    1
  718.     END
  719. >>> CTOI.MAC    820820:1717
  720. ; FILE:    CTOI.MAC
  721. ; DATE: 820818:1137
  722. ; MOD:    820820:1616    ; Complete externals
  723. ; FOR:    Convert string at <HL> to 16bit in DE
  724.  
  725.     TITLE    CTOI - Convert chars to 16bit
  726.     .8080
  727.     .COMMENT "
  728. This routine returns a sixteen-bit integer in
  729. DE and advances HL to point to the first
  730. non-digit character in the string, which
  731. serves as the terminator and is returned in A.
  732. "
  733.     .XLIST
  734.     INCLUDE SYSEQU
  735.     .LIST
  736.     EXT    ADDA,NEGH,ISDIGD,FNB
  737. CTOI::    PUSH    B
  738.     MOV    B,H
  739.     MOV    C,L
  740.     CALL    FNB
  741.     LXI    H,0
  742.     CPI    MINUS
  743.     JNZ    CT0
  744.     DCX    H
  745.     JMP    CT1
  746. CT0:    CPI    PLUS
  747.     JNZ    CT2
  748. CT1:    INX    B
  749.     LDAX    B
  750. CT2:    PUSH    H
  751.     LXI    H,0
  752. CT3:    CALL    ISDIGD
  753.     JC    CT4
  754.     MOV    E,L
  755.     MOV    D,H
  756.     DAD    H
  757.     DAD    H
  758.     DAD    D
  759.     DAD    H
  760.     CALL    ADDA
  761.     INX    B
  762.     LDAX    B
  763.     JMP    CT3
  764. CT4:    POP    D
  765.     MOV    A,D
  766.     ORA    E
  767.     CNZ    NEGH
  768.     XCHG
  769.     MOV    H,B
  770.     MOV    L,C
  771.     MOV    A,M
  772.     POP    B
  773.     RET
  774.     END
  775. >>> DCMP.MAC    820820:1718
  776. ; FILE:    DCMP.MAC
  777. ; DATE: 820818:1449
  778. ; FOR:    Compare two 32-bit nos in memory
  779.  
  780.     TITLE    DCMP - compare 32-bit integers
  781.     .8080
  782.     .XLIST
  783.     INCLUDE SYSEQU
  784.     INCLUDE MATHEQU
  785.     .LIST
  786.     EXT    MPLD
  787. DCMP::    CALL    MPLD
  788.     XCHG
  789.     CALL    MPLD
  790.     XCHG
  791.     MC    DSUB
  792.     RET
  793.     END
  794. >>> DPL.MAC    820820:1718
  795. ; FILE:    DPL.MAC
  796. ; DATE:    820818:1248
  797. ; FOR:    Decimal-place counter
  798.     .8080
  799.     CSEG
  800. DPL::    DS    1
  801.     END
  802. >>> ERROR.MAC    820820:1718
  803. ; FILE:    ERROR.MAC
  804. ; DATE: 820818:1347
  805. ; MOD:    820820:1618    ; Read definition file
  806. ; FOR:    Print inline string and quit
  807.  
  808.     TITLE    ERROR - Complain and quit
  809.     .8080
  810.     .XLIST
  811.     INCLUDE    SYSEQU
  812.     .LIST
  813.     EXT    CONMSG,CRLFMS
  814. ERROR::    LXI    H,CRLFMS
  815.     CALL    CONMSG
  816.     POP    H
  817.     CALL    CONMSG
  818.     JMP    BOOT
  819.     END
  820. >>> ESC.MAC    820820:1718
  821. ; FILE:    ESC.MAC
  822. ; DATE: 830214:1553
  823. ; FOR:    Interpret @ escape char
  824.  
  825.     TITLE    ESC - get char, interpret @
  826.     .8080
  827.     .XLIST
  828.     INCLUDE SYSEQU
  829.     .LIST
  830.     EXT    ISDIGD,HCTOI
  831. ESC::    LDA    ESCSW
  832.     CPI    CR
  833.     JNZ    ESC0
  834.     XRA    A
  835.     STA    ESCSW
  836.     MVI    A,LF
  837.     RET
  838. ESC0:    MOV    A,M
  839.     INX    H
  840.     CPI    '@'
  841.     RNZ
  842.     MOV    A,M
  843.     CPI    ENDSTR
  844.     JNZ    ESC00
  845.     MVI    A,'@'
  846.     RET
  847. ESC00:    CPI    'n'
  848.     JZ    ESC02
  849. ESC01:    CPI    'N'
  850.     JNZ    ESC1
  851. ESC02:    MVI    A,CR
  852.     STA    ESCSW
  853.     INX    H
  854.     RET
  855. ESC1:    PUSH    H
  856.     PUSH    B
  857.     LXI    H,ESCTBL
  858.     MVI    C,ESCLEN
  859. ESC11:    CMP    M
  860.     INX    H
  861.     JZ    ESC12
  862.     INX    H
  863.     DCR    C
  864.     JNZ    ESC11
  865.     POP    B
  866.     POP    H
  867.     JMP    ESC2
  868. ESC12:    MOV    A,M
  869.     POP    B
  870.     POP    H
  871.     INX    H
  872.     RET
  873. ESC2:    CALL    ISDIGD
  874.     JC    ESC3
  875.     PUSH    D
  876.     CALL    HCTOI
  877.     MOV    A,E
  878.     POP    D
  879.     RET
  880. ESC3:    MOV    A,M
  881.     INX    H
  882.     RET
  883. ESCSW:    DB    0
  884. ESCTBL:    DB    'T',9
  885.     DB    't',9
  886.     DB    'L',10
  887.     DB    'l',10
  888.     DB    'F',12
  889.     DB    'f',12
  890.     DB    'R',13
  891.     DB    'r',13
  892. ESCLEN    EQU    ($-ESCTBL) SHR 1
  893.     END
  894. >>> EXIT.MAC    820820:1718
  895. ; FILE:    EXIT.MAC
  896. ; DATE: 820819:1550
  897. ; FOR:    Close all channels & quit
  898.  
  899.     TITLE    EXIT - Close channels & stop
  900.     .8080
  901.     .XLIST
  902.     INCLUDE SYSEQU
  903.     .LIST
  904.     EXT    CLOSE
  905. EXIT::    MVI    C,15
  906.     CALL    CLOSE
  907.     DCR    C
  908.     JNZ    EXIT+2
  909.     JMP    BOOT
  910.     END
  911. >>> FILL.MAC    820820:1718
  912. ; FILE:    FILL.MAC
  913. ; DATE: 820818:1326
  914. ; FOR:    Fill BC bytes from <HL> with A
  915.  
  916.     TITLE    FILL - <HL> ff with BC of A
  917.     .8080
  918. FILL::    PUSH    D    ; E is preserved
  919.     MOV    E,A    ; Save A
  920. ML0:    MOV    A,B    ; While count <> 0
  921.     ORA    C
  922.     JZ    ML1    ; ..do begin
  923.     MOV    M,E    ; fill 1 byte
  924.     INX    H    ; next to fill
  925.     DCX    B    ; count down
  926.     JMP    ML0    ; end do
  927. ML1:    MOV    A,E
  928.     POP    D
  929.     RET
  930.     END
  931. >>> FILLBF.MAC    820820:1718
  932. ; FILE:    FILLBF.MAC
  933. ; DATE: 820818:2055
  934. ; FOR:    Read C secs into <HL>, fcb = <DE>
  935.  
  936.     TITLE    FILLBF - Fill disk buffer
  937.     .8080
  938.     .XLIST
  939.     INCLUDE SYSEQU
  940.     .LIST
  941.     EXT    ADDA,FILL
  942. FILLBF:: PUSH    B
  943.     PUSH    H
  944.     PUSH    D
  945.     XCHG
  946.     MVI    C,SETDMA
  947.     CALL    BDOS
  948.     POP    D
  949.     PUSH    D
  950.     MVI    C,RDSEQ
  951.     CALL    BDOS
  952.     ORA    A
  953.     POP    D
  954.     POP    H
  955.     POP    B
  956.     JNZ    EOFL
  957.     DCR    C
  958.     RZ
  959.     MVI    A,80H
  960.     CALL    ADDA
  961.     JMP    FILLBF
  962. EOFL:    MOV    A,C    ; Nsecs left
  963.     ORA    A    ; Clear C
  964.     RAR        ; Div 2
  965.     MOV    B,A    ; Mod 256
  966.     MVI    A,0    ; Get rem
  967.     RAR        ; Mul 256
  968.     MOV    C,A    ; =Bytes to fill
  969.     MVI    A,EOF
  970.     CALL    FILL
  971.     RET
  972.     END
  973. >>> FNB.MAC    820820:1718
  974. ; FILE:    FNB.MAC
  975. ; DATE: 820818:1115
  976. ; FOR:    Find next blank or tab in string <BC>
  977.  
  978.     TITLE    FNB - Find next blank or tab
  979.     .8080
  980.     .XLIST
  981.     INCLUDE SYSEQU
  982.     .LIST
  983. FNB::    LDAX    B
  984.     CPI    BLANK
  985.     JZ    FNB0
  986.     CPI    TAB
  987.     JZ    FNB0
  988.     CPI    ENDSTR
  989.     RNZ
  990. FNB0:    INX    B
  991.     JMP    FNB
  992.     END
  993. >>> FNDBUF.MAC    820825:1521
  994. ; FILE:    FNDBUF.MAC
  995. ; DATE: 820825:1514
  996. ; FOR:    Find buffer for channel C
  997.  
  998.     TITLE    FNDBUF - Find channel C buffer
  999.     .8080
  1000.     EXT    CHANLS,ADDA
  1001. FNDBUF:: LDA    LSTRD    ; Check if current
  1002.     CMP    C
  1003.     JNZ    FND0
  1004.     LHLD    IBUF    ; Buffer block addr
  1005.     XRA    A    ; Input file
  1006.     RET
  1007. FND0:    LDA    LSTWR
  1008.     CMP    C
  1009.     JNZ    FND1
  1010.     LHLD    OBUF
  1011.     XRA    A
  1012.     DCR    A    ; Output file
  1013.     RET
  1014. FND1:    LXI    H,CHANLS ; Find buffer block
  1015.     MOV    A,C    ;  ..in channel table
  1016.     ADD    A
  1017.     CALL    ADDA
  1018.     MOV    A,M
  1019.     INX    H
  1020.     MOV    H,M
  1021.     MOV    L,A
  1022.     ORA    H    ; Was channel free?
  1023.     RZ        ; ..if so, quit
  1024.     PUSH    H    ; Save block addr
  1025.     MVI    A,9
  1026.     CALL    ADDA    
  1027.     MOV    A,M    ; Read/write flag
  1028.     POP    H
  1029.     PUSH    PSW
  1030.     INR    A
  1031.     MOV    A,C    ; Channel no.
  1032.     JZ    FND2
  1033.     STA    LSTRD    ; Make it current
  1034.     SHLD    IBUF    ; Save block addr
  1035.     JMP    FND3
  1036. FND2:    STA    LSTWR    ; Current output
  1037.     SHLD    OBUF    ; Save block addr
  1038. FND3:    POP    PSW    ; R/W flag
  1039.     RET
  1040. LSTRD:    DB    0
  1041. IBUF:    DW    0
  1042. LSTWR:    DB    0
  1043. OBUF:    DW    0
  1044.     END
  1045. >>> FTOC.MAC    820830:1542
  1046. ; FILE:    FTOC.MAC
  1047. ; DATE: 820830:1342
  1048. ; FOR:    Convert floating to buffered string;
  1049. ;    return addr in HL, length in A
  1050.  
  1051.     TITLE    FTOC - Convert floating to string
  1052.     .8080
  1053.     .XLIST
  1054.     INCLUDE SYSEQU
  1055.     INCLUDE MATHEQU
  1056.     .LIST
  1057.     EXT    MPLS,MPRS,MPRD,DPL
  1058.     EXT    ITOC,DITOC,ADDA,MOVES
  1059.     EXT    ERROR,MSTAT,HLMDE
  1060. FTOC::    PUSH    D
  1061.     PUSH    B
  1062.     MC    XCHF
  1063.     MC    XCHF    ; Set flags
  1064.     ANI    22H
  1065.     JZ    FTC1
  1066.     PUSH    PSW
  1067. ; Top of stack is 0
  1068. ZERO:    POP    PSW
  1069.     MC    POPF    ; Discard
  1070.     LXI    H,BUFFER
  1071.     MVI    M,ENDSTR
  1072.     DCX    H
  1073.     LDA    FPL
  1074.     ADI    3
  1075. FTC0:    MVI    M,BLANK
  1076.     DCX    H
  1077.     DCR    A
  1078.     JNZ    FTC0
  1079.     MVI    M,'0'
  1080.     DCX    H
  1081.     MVI    M,PERIOD
  1082.     DCX    H
  1083.     MVI    M,'0'
  1084.     DCX    H
  1085.     MVI    M,BLANK
  1086.     JMP    FTC8
  1087. FTC1:    LDA    MSTAT
  1088.     ANI    40H
  1089.     PUSH    PSW
  1090.     JZ    FTC2
  1091.     MC    CHSF
  1092. FTC2:    MC    PTOF
  1093.     MC    LOG
  1094.     ANI    40H
  1095.     PUSH    PSW
  1096.     MC    FIXS
  1097.     CALL    MPRS
  1098.     POP    PSW
  1099.     JZ    FTC2A
  1100.     DCX    H
  1101.     MOV    A,L
  1102.     CPI    0F9H
  1103.     JC    ZERO
  1104. FTC2A:    PUSH    H    ; Exponent
  1105.     XCHG
  1106.     LXI    H,6
  1107.     CALL    HLMDE
  1108.     XCHG
  1109.     LXI    H,10
  1110.     CALL    MPLS
  1111.     MC    FLTS
  1112.     XCHG
  1113.     CALL    MPLS
  1114.     MC    FLTS
  1115.     MC    PWR
  1116.     MC    FMUL
  1117.     ANI    6
  1118.     JZ    FTC3
  1119.     CALL    ERROR
  1120.     MSG    <'FTOC: Unable to scale'>
  1121. FTC3:    MC    PTOF    ; Check current exp.
  1122.     MC    LOG
  1123.     MC    FIXS
  1124.     CALL    MPRS
  1125.     LXI    D,-6
  1126.     DAD    D
  1127.     POP    D
  1128.     DAD    D
  1129.     PUSH    H    ; Exponent
  1130.     MC    FIXD
  1131.     LXI    H,MANTIS
  1132.     CALL    MPRD
  1133.     XCHG
  1134.     MVI    A,0FFH
  1135.     STA    DPL
  1136.     CALL    DITOC
  1137.     DCX    H
  1138.     MVI    M,'0'
  1139.     INX    H
  1140.     XCHG
  1141.     LXI    H,FPL
  1142.     MOV    B,M
  1143.     INR    B
  1144.     INR    B
  1145.     CMP    B
  1146.     JC    NORND
  1147.     MOV    H,D
  1148.     MOV    L,E
  1149.     MOV    A,B
  1150.     DCR    A
  1151.     CALL    ADDA
  1152.     MOV    A,M
  1153.     CPI    '5'
  1154.     JC    RNDED
  1155. FTC4:    DCX    H
  1156.     INR    M
  1157.     DCR    B
  1158.     MOV    A,M
  1159.     CPI    '9'+1
  1160.     JC    FTC5
  1161.     MVI    M,'0'
  1162.     JMP    FTC4
  1163. FTC5:    MOV    A,B
  1164.     ORA    A
  1165. RNDED:    JNZ    FTC6
  1166.     POP    H
  1167.     INX    H
  1168.     PUSH    H
  1169.     DCX    D
  1170.     JMP    FTC6
  1171. NORND:    DCR    B
  1172.     SUB    B
  1173.     MOV    L,A
  1174.     MVI    H,0
  1175.     JZ    $+4
  1176.     DCR    H
  1177.     DAD    D
  1178.     XCHG
  1179.     PUSH    D
  1180.     MVI    C,ENDSTR
  1181.     MOV    B,A
  1182.     PUSH    B
  1183.     CALL    MOVES
  1184.     POP    B
  1185.     DCX    D
  1186.     XCHG
  1187.     MOV    A,B
  1188.     ORA    A
  1189.     JZ    FTC6-1
  1190. FL:    MVI    M,'0'
  1191.     INX    H
  1192.     DCR    A
  1193.     JNZ    FL
  1194.     POP    D
  1195. FTC6:    XCHG
  1196.     LDA    FPL
  1197.     CALL    ADDA
  1198.     LXI    D,BUFFER-5
  1199.     LDA    FPL
  1200.     MOV    C,A
  1201. FTC7:    MOV    A,M
  1202.     STAX    D
  1203.     DCX    H
  1204.     DCX    D
  1205.     DCR    C
  1206.     JNZ    FTC7
  1207.     MVI    A,PERIOD
  1208.     STAX    D
  1209.     DCX    D
  1210.     MOV    A,M
  1211.     STAX    D
  1212.     DCX    D
  1213.     XCHG
  1214.     POP    D
  1215.     PUSH    H
  1216.     CALL    ITOC
  1217.     MOV    B,A
  1218.     MOV    A,M
  1219.     CPI    '-'
  1220.     JZ    $+4
  1221.     DCX    H
  1222.     MOV    C,A
  1223.     MOV    A,B
  1224. EXP0:    CPI    3
  1225.     JNC    EXP1
  1226.     MVI    M,'0'
  1227.     DCX    H
  1228.     INR    A
  1229.     JMP    EXP0
  1230. EXP1:    MOV    A,C
  1231.     CPI    '-'
  1232.     JNZ    EXP2
  1233.     MOV    M,A
  1234.     DCX    H
  1235. EXP2:    MVI    M,'e'
  1236.     LXI    D,BUFFER-4
  1237.     MVI    C,ENDSTR
  1238.     CALL    MOVES
  1239.     POP    H
  1240.     MVI    M,BLANK
  1241.     POP    PSW
  1242.     JZ    FTC8
  1243.     MVI    M,MINUS
  1244. FTC8:    LDA    FPL
  1245.     ADI    7
  1246.     POP    B
  1247.     POP    D
  1248.     RET
  1249. FPL::    DB    3    ; Default=sn.nnnesnn
  1250. MANTIS:    DS    4    ; Conversion buffer
  1251.     DS    20
  1252. BUFFER    EQU    $-1
  1253.     END
  1254. >>> GETARG.MAC    820820:1719
  1255. ; FILE:    GETARG.MAC
  1256. ; DATE: 820819:1533
  1257. ; FOR:    Return argument # A
  1258.  
  1259.     TITLE    GETARG - Return argument #A
  1260.     .8080
  1261.     .XLIST
  1262.     INCLUDE SYSEQU
  1263.     .LIST
  1264.     EXT    NARGS, ARGBUF
  1265. GETARG:: ORA    A
  1266.     JZ    NULL
  1267.     LXI    H,NARGS
  1268.     CMP    M
  1269.     JZ    $+6
  1270.     JNC    NULL
  1271.     PUSH    B
  1272.     MOV    C,A
  1273.     LXI    H,ARGBUF
  1274.     XRA    A
  1275. GTARG0:    DCR    C
  1276.     JZ    GTARG2
  1277. GTARG1:    CMP    M
  1278.     INX    H
  1279.     JNZ    GTARG1
  1280.     JMP    GTARG0
  1281. NULL:    LXI    H,NULBUF
  1282. GTARG2:    POP    B
  1283.     RET
  1284. NULBUF:    DB    ENDSTR
  1285.     END
  1286. >>> GETC.MAC    820820:1720
  1287. ; FILE:    GETC.MAC
  1288. ; DATE: 820820:1352
  1289. ; FOR:    Get char from std input
  1290.  
  1291.     TITLE    GETC - get char from std input
  1292.     .8080
  1293.     EXT    STDIN,GETCF
  1294. GETC::    PUSH    B
  1295.     LDA    STDIN
  1296.     MOV    C,A
  1297.     CALL    GETCF
  1298.     POP    B
  1299.     RET
  1300.     END
  1301. >>> GETCF.MAC    820820:1720
  1302. ; FILE:    GETCF.MAC
  1303. ; DATE: 820819:1250
  1304. ; MOD:    820820:1629    ; Complete externals
  1305. ; FOR:    Read 1 char from channel C into A
  1306.  
  1307.     TITLE    GETCF - Get char from file
  1308.     .8080
  1309.     .XLIST
  1310.     INCLUDE SYSEQU
  1311.     .LIST
  1312.     EXT    FNDBUF,ERROR,SETBF,FILLBF
  1313.     EXT    ADDA
  1314. GETCF::    PUSH    H
  1315.     PUSH    D
  1316.     PUSH    B
  1317.     MOV    A,C
  1318.     ANI    15
  1319.     JZ    CONIN
  1320.     CALL    FNDBUF
  1321.     INR    A
  1322.     JNZ    GCF0
  1323.     CALL    ERROR
  1324.     MSG    <'GETCF: Reading from output file'>
  1325. GCF0:    MOV    E,M
  1326.     INX    H
  1327.     MOV    D,M
  1328.     CALL    PBCHEK
  1329.     INX    H
  1330.     MOV    C,M
  1331.     INX    H
  1332.     MOV    B,M
  1333.     XCHG
  1334.     DAD    B
  1335.     MOV    A,M
  1336.     PUSH    PSW
  1337.     XCHG
  1338.     INX    B
  1339.     MOV    A,B
  1340.     ORA    C
  1341.     JNZ    GCF1
  1342. ; If we fall through here, buffer is used up
  1343.     INX    H
  1344.     CALL    SETBF
  1345.     CALL    FILLBF
  1346.     JMP    GCF2
  1347. GCF1:    MOV    M,B
  1348.     DCX    H
  1349.     MOV    M,C
  1350. GCF2:    POP    PSW
  1351.     JMP    GCF3
  1352. CONIN:    LXI    D,CONBUF
  1353.     CALL    PBCHEK
  1354.     MVI    E,0FFH
  1355.     MVI    C,6
  1356.     CALL    5
  1357.     ORA    A
  1358.     JZ    CONIN+6
  1359. GCF3:    POP    B
  1360.     POP    D
  1361.     POP    H
  1362.     RET
  1363. PBCHEK:    LDAX    D    ; Buffer counter
  1364.     ORA    A    ; Empty?
  1365.     RZ        ; If so
  1366.     POP    H    ; Not going back, so
  1367.     XCHG        ; ..discard RET addr
  1368.     DCR    M    ; One fewer char left
  1369.     CALL    ADDA    ; Get the char
  1370.     MOV    A,M
  1371.     POP    B
  1372.     POP    D
  1373.     POP    H
  1374.     RET        ; To fn calling GETCF
  1375. CONBUF:: DB    0
  1376.     DS    91
  1377.     END
  1378. >>> GETLIN.MAC    820820:1720
  1379. ; FILE:    GETLIN.MAC
  1380. ; DATE: 820820:1458
  1381. ; FOR:    Get line from std input
  1382.  
  1383.     TITLE    GETLIN - get line - std input
  1384.     .8080
  1385.     EXT    STDIN,GETLNF
  1386. GETLIN:: PUSH    B
  1387.     LDA    STDIN
  1388.     MOV    C,A
  1389.     CALL    GETLNF
  1390.     POP    B
  1391.     RET
  1392.     END
  1393. >>> GETLNF.MAC    820902:1032
  1394. ; FILE:    GETLNF.MAC
  1395. ; DATE: 820901:2207
  1396. ; FOR:    Get line from channel C
  1397. ;    return addr in HL, length in A
  1398.  
  1399.     TITLE    GETLNF - Read in line
  1400.     .8080
  1401.     .XLIST
  1402.     INCLUDE SYSEQU
  1403.     .LIST
  1404.     EXT    GETCF,IPTBUF,PUSHBF
  1405. GETLNF:: PUSH    B
  1406.     MVI    B,MAXLIN
  1407.     LXI    H,IPTBUF
  1408.     XRA    A
  1409. GLF0:    CPI    EOF
  1410.     JZ    ENDIN
  1411.     CALL    GETCF
  1412.     CPI    NEWLIN
  1413.     JZ    ENDIN
  1414.     MOV    M,A
  1415.     INX    H
  1416.     DCR    B
  1417.     JNZ    GLF0
  1418. ENDIN:    DCX    H
  1419.     INR    B
  1420.     MOV    A,M
  1421.     CPI    CR
  1422.     JZ    $+5
  1423.     INX    H
  1424.     DCR    B
  1425.     MVI    M,ENDSTR
  1426.     LXI    H,IPTBUF
  1427.     MVI    A,MAXLIN
  1428.     SUB    B    ; Return str len in A
  1429.     POP    B
  1430.     RET
  1431.     END
  1432. >>> GETWD.MAC    820820:1720
  1433. ; FILE:    GETWD.MAC
  1434. ; DATE: 820819:1510
  1435. ; FOR:    Isolate word with delim table
  1436.  
  1437.     TITLE    GETWD - Isolate next word
  1438. ; Source at <HL>, dest at <DE>
  1439. ; <BC> is table of legal delims ending with @
  1440. ; @ provides for inclusion of delims in word
  1441. ; doublequotes allowed as well
  1442. ; ENDSTR overrides @ and "
  1443.     .8080
  1444.     .XLIST
  1445.     INCLUDE SYSEQU
  1446.     .LIST
  1447.     EXT    ERROR
  1448. GETWD::    LDAX    B
  1449.     CPI    '@'
  1450.     JNZ    SETFL
  1451.     CALL    ERROR
  1452.     MSG    <'GETWD: Delim table empty'>
  1453. SETFL:    XRA    A
  1454.     STA    ESCFL
  1455.     PUSH    D
  1456. FNOND:    PUSH    B
  1457.     LDAX    B
  1458.     CMP    M
  1459.     JZ    DONE
  1460. FNON1:    INX    B
  1461.     LDAX    B
  1462.     CPI    '@'
  1463.     JZ    NOND
  1464.     CMP    M
  1465.     JNZ    FNON1
  1466.     INX    H
  1467.     POP    B
  1468.     JMP    FNOND
  1469. NOND:    POP    B
  1470.     MOV    A,M
  1471.     CPI    '"'
  1472.     JNZ    GTW0
  1473.     INX    H
  1474. QUOTE:    LDAX    B
  1475.     CMP    M
  1476.     JZ    DONEQ
  1477.     MOV    A,M
  1478.     INX    H
  1479.     CPI    '"'
  1480.     JNZ    QUOT0
  1481.     MOV    A,M
  1482.     CPI    '"'
  1483.     JNZ    GTW0
  1484.     INX    H
  1485. QUOT0:    STAX    D
  1486.     INX    D
  1487.     JMP    QUOTE
  1488. DONEQ:    PUSH    B
  1489.     JMP    DONE
  1490. GTW0:    PUSH    B
  1491.     LDAX    B
  1492.     CMP    M
  1493.     JZ    DONE
  1494. GTW1:    INX    B
  1495.     LDAX    B
  1496.     CPI    '@'
  1497.     JZ    INCL
  1498.     CMP    M
  1499.     JNZ    GTW1
  1500.     LDA    ESCFL
  1501.     CPI    '@'
  1502.     JNZ    DONE
  1503. INCL:    MOV    A,M
  1504.     STAX    D
  1505.     STA    ESCFL
  1506.     INX    H
  1507.     INX    D
  1508.     POP    B
  1509.     JMP    GTW0
  1510. DONE:    MVI    A,ENDSTR
  1511.     STAX    D
  1512.     MOV    A,M
  1513.     INX    H
  1514.     POP    B
  1515.     POP    D
  1516.     RET
  1517. ESCFL:    DS    1
  1518.     END
  1519. >>> HCTODI.MAC    820820:1723
  1520. ; FILE:    HCTODI.MAC
  1521. ; DATE: 820818:1236
  1522. ; MOD:    820820:1631    ; Complete externals
  1523. ; FOR:    Convert string at <HL> to 32bit in <DE>
  1524.  
  1525.     TITLE    CTODI - Convert hex to 32bit
  1526.     .8080
  1527.     .COMMENT "
  1528. This routine returns a 32-bit integer in
  1529. <DE> to <DE+3> and advances HL to point to
  1530. the first non-digit character in the string,
  1531. which serves as the terminator and is returned
  1532. in A.
  1533. "
  1534.     .XLIST
  1535.     INCLUDE SYSEQU
  1536.     INCLUDE MATHEQU
  1537.     .LIST
  1538.     EXT    ADDA,NEGH,ISDIGH
  1539.     EXT    MPLS,MPS0,MPRD
  1540.     EXT    DPL,FNB
  1541. CTODI::    PUSH    B
  1542.     MOV    B,H
  1543.     MOV    C,L
  1544.     MVI    A,0FFH
  1545.     STA    DPL
  1546.     CALL    FNB
  1547.     LXI    H,0
  1548.     CPI    MINUS
  1549.     JNZ    CT0
  1550.     DCX    H
  1551.     JMP    CT1
  1552. CT0:    CPI    PLUS
  1553.     JNZ    CT2
  1554. CT1:    INX    B
  1555.     LDAX    B
  1556. CT2:    PUSH    H
  1557.     CALL    MPS0
  1558.     CALL    MPS0
  1559. CT3:    CALL    ISDIGH
  1560.     JC    CT4
  1561.     LXI    H,16
  1562.     CALL    MPLS
  1563.     CALL    MPS0
  1564.     PUSH    PSW
  1565.     MC    DMUL
  1566.     POP    PSW
  1567.     MOV    L,A
  1568.     MVI    H,0
  1569.     CALL    MPLS
  1570.     CALL    MPS0
  1571.     MC    DADD
  1572.     LDA    DPL
  1573.     ORA    A
  1574.     JM    CT3A
  1575.     INR    A
  1576.     STA    DPL
  1577. CT3A:    INX    B
  1578.     LDAX    B
  1579.     JMP    CT3
  1580. CT4:    CPI    PERIOD
  1581.     JNZ    CT5
  1582.     LDA    DPL
  1583.     ORA    A
  1584.     JP    CT5
  1585.     INR    A
  1586.     STA    DPL
  1587.     JMP    CT3
  1588. CT5:    POP    H
  1589.     MOV    A,H
  1590.     ORA    L
  1591.     JZ    CT6
  1592.     MC    CHSD
  1593. CT6:    XCHG
  1594.     CALL    MPRD
  1595.     XCHG
  1596.     MOV    H,B
  1597.     MOV    L,C
  1598.     LDA    DPL
  1599.     ORA    A
  1600.     JP    CT7
  1601.     INR    A
  1602.     STA    DPL
  1603. CT7:    MOV    A,M
  1604.     POP    B
  1605.     RET
  1606.     END
  1607. >>> HCTOI.MAC    820820:1723
  1608. ; FILE:    HCTOI.MAC
  1609. ; DATE: 820818:1146
  1610. ; MOD:    820820:1632    ; Complete externals
  1611. ; FOR:    Convert string at <HL> to 16bit in DE
  1612.  
  1613.     TITLE    HCTOI - Convert hex to 16bit
  1614.     .8080
  1615.     .COMMENT "
  1616. This routine returns a sixteen-bit integer in
  1617. DE and advances HL to point to the first
  1618. non-digit character in the string, which
  1619. serves as the terminator and is returned in A.
  1620. "
  1621.     .XLIST
  1622.     INCLUDE SYSEQU
  1623.     .LIST
  1624.     EXT    ADDA,NEGH,ISDIGH,FNB
  1625. HCTOI::    PUSH    B
  1626.     MOV    B,H
  1627.     MOV    C,L
  1628.     CALL    FNB
  1629.     LXI    H,0
  1630.     CPI    MINUS
  1631.     JNZ    CT0
  1632.     DCX    H
  1633.     JMP    CT1
  1634. CT0:    CPI    PLUS
  1635.     JNZ    CT2
  1636. CT1:    INX    B
  1637.     LDAX    B
  1638. CT2:    PUSH    H
  1639.     LXI    H,0
  1640. CT3:    CALL    ISDIGH
  1641.     JC    CT4
  1642.     DAD    H
  1643.     DAD    H
  1644.     DAD    H
  1645.     DAD    H
  1646.     CALL    ADDA
  1647.     INX    B
  1648.     LDAX    B
  1649.     JMP    CT3
  1650. CT4:    POP    D
  1651.     MOV    A,D
  1652.     ORA    E
  1653.     CNZ    NEGH
  1654.     XCHG
  1655.     MOV    H,B
  1656.     MOV    L,C
  1657.     MOV    A,M
  1658.     POP    B
  1659.     RET
  1660.     END
  1661. >>> HDCMP.MAC    820820:1723
  1662. ; FILE:    HDCMP.MAC
  1663. ; DATE:    820819:2146
  1664. ; FOR:    Compare HL-DE, set flags just like CMP
  1665.     .8080
  1666. HDCMP::    MOV    A,H
  1667.     CMP    D
  1668.     RNZ
  1669.     MOV    A,L
  1670.     SUB    E
  1671.     RZ
  1672.     RAR
  1673.     ORA    A
  1674.     RAL
  1675.     RM
  1676.     XRA    A
  1677.     INR    A
  1678.     RET
  1679.     END
  1680. >>> HLDDE.MAC    820820:1724
  1681. ; FILE:    HLDDE.MAC
  1682. ; DATE: 820818:1444
  1683. ; FOR:    HL / DE -> HL
  1684.  
  1685.     TITLE    HLDDE : HL / DE -> HL
  1686.     .8080
  1687.     .XLIST
  1688.     INCLUDE SYSEQU
  1689.     INCLUDE MATHEQU
  1690.     .LIST
  1691.     EXT    MPLS,MPRS
  1692. HLDDE::    CALL    MPLS
  1693.     XCHG
  1694.     CALL    MPLS
  1695.     XCHG
  1696.     MC    SDIV
  1697.     CALL    MPRS
  1698.     RET
  1699.     END
  1700. >>> HLMDE.MAC    820820:2333
  1701. ; FILE:    HLMDE.MAC
  1702. ; DATE: 820818:1442
  1703. ; FOR:    HL - DE -> HL
  1704.  
  1705.     TITLE    HLMDE : HL - DE -> HL
  1706.     .8080
  1707. HLMDE::    PUSH    B
  1708.     MOV    B,A
  1709.     MOV    A,L
  1710.     SUB    E
  1711.     MOV    L,A
  1712.     MOV    A,H
  1713.     SBB    D
  1714.     MOV    H,A
  1715.     MOV    A,B
  1716.     POP    B
  1717.     RET
  1718.     END
  1719. >>> HLXDE.MAC    820820:2333
  1720. ; FILE:    HLXDE.MAC
  1721. ; DATE: 820818:1444
  1722. ; FOR:    HL * DE -> HL
  1723.  
  1724.     TITLE    HLXDE : HL * DE -> HL
  1725.     .8080
  1726.     .XLIST
  1727.     INCLUDE SYSEQU
  1728.     INCLUDE MATHEQU
  1729.     .LIST
  1730.     EXT    MPLS,MPRS
  1731. HLXDE::    CALL    MPLS
  1732.     XCHG
  1733.     CALL    MPLS
  1734.     XCHG
  1735.     MC    SMUL
  1736.     CALL    MPRS
  1737.     RET
  1738.     END
  1739. >>> INDEX.MAC    820821:0955
  1740. ; FILE:    INDEX.MAC
  1741. ; DATE:    820821:0939
  1742. ; FOR:    Find position of string B in string A
  1743.     TITLE    INDEX
  1744.     SUBTTL    Index function like PL/I's INDEX
  1745.     .Z80    ; but rewritten to run on 8080
  1746.  
  1747. ;1    FUNCTION INDEX(KA,KB,LB,LA)
  1748. ;2    INTEGER*1 KA,KB
  1749. ;3    C Must pass string lengths explicitly in F66
  1750. ;4    DIMENSION KA(LA),KB(LB)
  1751.     ENTRY    INDEX
  1752. INDEX:    LD    (KA),HL    ; Addr of string searched
  1753.     LD    HL,KB
  1754.     LD    (HL),E
  1755.     INC    HL
  1756.     LD    (HL),D    ; Addr of string sought
  1757. ; these 4 lines are for the FORTRAN version
  1758. ;    EXT    $AT
  1759. ;    LD    A,02
  1760. ;    LD    HL,LB
  1761. ;    CALL    $AT
  1762. ; these 8 lines are for LA in B, LB in C
  1763.     LD    HL,LB
  1764.     LD    (HL),C
  1765.     INC    HL
  1766.     LD    (HL),0
  1767.     INC    HL
  1768.     LD    (HL),B
  1769.     INC    HL
  1770.     LD    (HL),0
  1771. ;7    NS=LA-LB+1
  1772. ;8    DO 100 INDEX=1,NS
  1773.     LD    HL,(LB)
  1774.     LD    E,(HL)
  1775.     INC    HL
  1776.     LD    D,(HL)
  1777.     DEC    DE
  1778. ;    LD    (LB1),DE
  1779.     PUSH    HL
  1780.     LD    HL,LB1
  1781.     LD    (HL),E
  1782.     INC    HL
  1783.     LD    (HL),D
  1784.     POP    HL
  1785.     LD    HL,(LA)
  1786.     LD    A,(HL)
  1787.     INC    HL
  1788.     LD    H,(HL)
  1789.     LD    L,A
  1790. ;    SBC    HL,DE
  1791.     SUB    E
  1792.     LD    L,A
  1793.     LD    A,H
  1794.     SBC    A,D
  1795.     LD    H,A
  1796.     PUSH    HL    ;Number of start positions
  1797. ;9    C Try each possible start position until KB found
  1798. ;10    DO 10 I=1,LB
  1799. ;11    IA=I+INDEX-1
  1800. ;12    10    IF(KA(IA).NE.KB(I))GO TO 100
  1801.     LD    HL,(KA)
  1802.     POP    BC
  1803. DO100:    ;LD    DE,(KB)
  1804.     PUSH    HL
  1805.     LD    HL,KB
  1806.     LD    E,(HL)
  1807.     INC    HL
  1808.     LD    D,(HL)
  1809.     POP    HL
  1810.     LD    A,(DE)
  1811. ;    CPIR    ;search for 1st character
  1812. FND001:    CP    (HL)
  1813.     JP    NZ,FND002
  1814.     INC    HL
  1815.     DEC    BC
  1816.     JP    FND004
  1817. FND002:    PUSH    AF
  1818.     INC    HL
  1819.     DEC    BC
  1820.     LD    A,B
  1821.     OR    C
  1822.     JP    Z,FND003
  1823.     POP    AF
  1824.     JP    FND001
  1825. FND003:    POP    AF
  1826.     JP    NFND
  1827. FND004:    PUSH    BC
  1828. ;    LD    BC,(LB1)    ;number chars yet to find
  1829.     PUSH    HL
  1830.     LD    HL,LB1
  1831.     LD    C,(HL)
  1832.     INC    HL
  1833.     LD    B,(HL)
  1834.     POP    HL
  1835.     LD    A,C
  1836.     OR    B
  1837.     JP    Z,FOUND
  1838.     PUSH    HL
  1839. DO10:    INC    DE
  1840.     LD    A,(DE)
  1841. ;    CPI    ;Compare rest of string
  1842.     CP    (HL)
  1843.     PUSH    AF
  1844.     INC    HL
  1845.     DEC    BC
  1846.     POP    AF
  1847.     JP    NZ,NXT
  1848. ;    JP    PE,DO10    ;if any left to find
  1849.     LD    A,B
  1850.     OR    C
  1851.     JP    NZ,DO10    
  1852. ;String found starting at INDEX
  1853.     POP    HL
  1854. FOUND:    POP    BC
  1855. ;    LD    DE,(KA)    ;Calculate INDEX
  1856.     PUSH    HL
  1857.     LD    HL,KA
  1858.     LD    E,(HL)
  1859.     INC    HL
  1860.     LD    D,(HL)
  1861.     POP    HL
  1862. ;    SBC    HL,DE
  1863.     LD    A,L
  1864.     SUB    E
  1865.     LD    L,A
  1866.     LD    A,H
  1867.     SBC    A,D
  1868.     LD    H,A
  1869.     RET
  1870. NXT:    POP    HL
  1871.     POP    BC
  1872.     LD    A,B    ;repeat if INDEX<NS
  1873.     OR    C
  1874.     JP    NZ,DO100
  1875. NFND:    LD    HL,0
  1876.     RET
  1877. KA:    DS    2
  1878. KB:    DS    2
  1879. LB:    DS    2
  1880. LA:    DS    2
  1881. LB1:    DS    2
  1882.     END
  1883. >>> INIT.MAC    820820:2333
  1884. ; FILE:    INIT.MAC
  1885. ; DATE: 820819:1541
  1886. ; FOR:    Pick up command line, redirect if < >
  1887.  
  1888.     TITLE    INIT - set up args & stdio
  1889.     .8080
  1890.     .XLIST
  1891.     INCLUDE SYSEQU
  1892.     .LIST
  1893.     EXT    NARGS,ARGBUF,ESC
  1894.     EXT    GETWD,OPEN,STDIN,STDOUT
  1895. INIT::    LXI    H,80H
  1896.     LXI    D,ARGBUF
  1897.     MVI    A,ENDSTR
  1898.     STAX    D
  1899.     XRA    A
  1900.     STA    NARGS
  1901.     CMP    M
  1902.     RZ
  1903.     INX    H
  1904.     INX    H
  1905. INIT0:    DCX    H
  1906.     MOV    A,M
  1907.     INX    H
  1908.     ORA    A
  1909.     RZ
  1910.     LXI    B,DELIMS
  1911.     CALL    GETWD
  1912.     XCHG
  1913.     MOV    A,M
  1914.     CPI    '<'
  1915.     JNZ    INIT1
  1916.     PUSH    H
  1917.     PUSH    D
  1918.     INX    H
  1919.     MVI    B,0
  1920.     MVI    C,SECTRS
  1921.     CALL    OPEN
  1922.     STA    STDIN
  1923.     POP    D
  1924.     POP    H
  1925.     XCHG
  1926.     JMP    INIT0
  1927. INIT1:    CPI    '>'
  1928.     JNZ    INIT2
  1929.     PUSH    H
  1930.     PUSH    D
  1931.     INX    H
  1932.     MVI    B,0FFH
  1933.     MVI    C,SECTRS
  1934.     CALL    OPEN
  1935.     STA    STDOUT
  1936.     POP    D
  1937.     POP    H
  1938.     XCHG
  1939.     JMP    INIT0
  1940. INIT2:    PUSH    D
  1941.     MOV    D,H
  1942.     MOV    E,L
  1943. INIT3:    CALL    ESC
  1944.     CPI    ENDSTR
  1945.     JZ    INIT4
  1946.     STAX    D
  1947.     INX    D
  1948.     JMP    INIT3
  1949. INIT4:    XRA    A
  1950.     STAX    D
  1951.     INX    D
  1952.     LXI    H,NARGS
  1953.     INR    M
  1954.     POP    H
  1955.     JMP    INIT0
  1956. DELIMS:    DB    0
  1957.     DB    ' '
  1958.     DB    '@'
  1959.     END
  1960. >>> INPORT.MAC    820820:2333
  1961. ; FILE:    INPORT.MAC
  1962. ; DATE: 820818:2049
  1963. ; FOR:    Read port in A
  1964.  
  1965.     TITLE    INPORT - read port in A
  1966.     .8080
  1967. INPORT:: PUSH    H
  1968.     MOV    L,A
  1969.     MVI    H,RET
  1970.     PUSH    H
  1971.     MVI    H,IN
  1972.     MVI    L,0
  1973.     PUSH    H
  1974.     LXI    H,GOTIN
  1975.     PUSH    H
  1976.     LXI    H,3
  1977.     DAD    SP
  1978.     PCHL
  1979. GOTIN:    POP    H
  1980.     POP    H
  1981.     POP    H
  1982.     RET
  1983.     END
  1984. >>> IPTBUF.MAC    820820:2335
  1985. ; FILE:    IPTBUF.MAC
  1986. ; DATE:    820820:1454
  1987. ; FOR:    Line buffer
  1988.     .8080
  1989.     CSEG
  1990.     .XLIST
  1991.     INCLUDE    SYSEQU
  1992.     .LIST
  1993. IPTBUF:: DS    MAXLIN+1
  1994.     END
  1995. >>> ISDIGD.MAC    820820:2335
  1996. ; FILE:    ISDIGD.MAC
  1997. ; DATE: 820818:1123
  1998. ; FOR:    Check whether A is in range '0' to '9'
  1999. ;    Strip ASCII bias if so
  2000.  
  2001.     TITLE    ISDIGD - Check decimal digit
  2002.     .8080
  2003. ISDIGD:: CPI    '0'
  2004.     RC
  2005.     CPI    '9'+1
  2006.     CMC
  2007.     RC
  2008.     SUI    '0'
  2009.     RET
  2010.     END
  2011. >>> ISDIGH.MAC    820820:2335
  2012. ; FILE:    ISDIGH.MAC
  2013. ; DATE: 820818:1125
  2014. ; FOR:    Check whether A is in range '0' to '9'
  2015. ;    or 'A' to 'F'; strip ASCII bias if so
  2016.  
  2017.     TITLE    ISDIGH - Check hexadecimal digit
  2018.     .8080
  2019. ISDIGH:: PUSH    PSW
  2020.     SUI    '0'
  2021.     JC    NODIG
  2022.     CPI    10
  2023.     JC    ISDIG
  2024.     ANI    0DFH    ; Make sure uppercase
  2025.     SUI    7
  2026.     CPI    10
  2027.     JC    NODIG
  2028.     CPI    16
  2029.     JNC    NODIG
  2030. ISDIG:    XTHL
  2031.     POP    H
  2032.     ORA    A    ; Clear C
  2033.     RET
  2034. NODIG:    POP    PSW
  2035.     STC
  2036.     RET
  2037.     END
  2038. >>> ITOC.MAC    820820:2335
  2039. ; FILE:    ITOC.MAC
  2040. ; DATE: 820818:1213
  2041. ; FOR:    Convert integers to buffered string;
  2042. ;    return addr in HL, length in A
  2043.  
  2044.     TITLE    ITOC - Convert integer to string
  2045.     .8080
  2046.     .XLIST
  2047.     INCLUDE SYSEQU
  2048.     INCLUDE MATHEQU
  2049.     .LIST
  2050.     EXT    MPLS,MPS0,MPLD,DPL
  2051. ; ITOC for 16bit in DE; DITOC for 32bit at <DE>
  2052. ITOC::    XCHG
  2053.     CALL    MPLS
  2054.     XCHG
  2055.     MOV    A,D
  2056.     ORA    A
  2057.     JP    ITOC0
  2058.     LXI    H,-1
  2059.     CALL    MPLS
  2060.     JMP    ITOC0+3
  2061. ITOC0:    CALL    MPS0
  2062.     MVI    A,0FFH
  2063.     STA    DPL
  2064.     MVI    A,10
  2065.     JMP    ITOCC
  2066. DITOC::    XCHG
  2067.     CALL    MPLD
  2068.     XCHG
  2069.     MVI    A,10
  2070.     JMP    ITOCC
  2071. ITOHC::    XCHG
  2072.     CALL    MPLS
  2073.     XCHG
  2074.     CALL    MPS0
  2075.     MVI    A,0FFH
  2076.     STA    DPL
  2077.     MVI    A,16
  2078.     JMP    ITOCC
  2079. DITOHC:: XCHG
  2080.     CALL    MPLD
  2081.     XCHG
  2082.     MVI    A,10
  2083. ;
  2084. ; Common conversion routine
  2085. ; num in or at DE, base in A
  2086. ITOCC:    PUSH    B
  2087.     LXI    B,NUMBUF
  2088.     MOV    L,A
  2089.     MVI    H,0
  2090.     MVI    A,ENDSTR
  2091.     STAX    B
  2092.     MC    XCHD    ; Set flags
  2093.     MC    XCHD
  2094.     ANI    40H
  2095.     PUSH    PSW    ; Save minus bit
  2096.     JZ    ITC0
  2097.     MC    CHSD
  2098. ITC0:    MC    PTOD    ; n n
  2099.     CALL    MPLS
  2100.     CALL    MPS0    ; n n base
  2101.     MC    DDIV    ; n n'
  2102.     MC    PTOD    ; n n' n'
  2103.     CALL    MPLS
  2104.     CALL    MPS0    ; n n' n' base
  2105.     MC    DMUL    ; n n' n'*base
  2106.     MC    XCHD    ; n n'b n'
  2107.     MC    POPD    ; n' u n n'b
  2108.     MC    DSUB    ; n'b n' u d
  2109.     IN    MDATA
  2110.     IN    MDATA
  2111.     IN    MDATA
  2112.     IN    MDATA    ; n'b n' u with d in A
  2113.     ADI    '0'
  2114.     CPI    '9'+1
  2115.     JC    $+5
  2116.     ADI    7
  2117.     DCX    B
  2118.     STAX    B
  2119.     LDA    DPL
  2120.     DCR    A
  2121.     STA    DPL
  2122.     JNZ    ITC1
  2123.     MVI    A,PERIOD
  2124.     DCX    B
  2125.     STAX    B
  2126. ITC1:    MC    POPD    ; n'b n'
  2127.     ANI    32    ; Check for n' = 0
  2128.     JZ    ITC0    ; mcZ flag clear means
  2129. ; ..more to do, set means string ready
  2130. ; Set up params and quit
  2131.     POP    PSW    ; Sign
  2132.     JZ    ITC2
  2133.     MVI    A,MINUS
  2134.     DCX    B
  2135.     STAX    B
  2136. ITC2:    LXI    H,NUMBUF
  2137.     MOV    A,L
  2138.     SUB    C
  2139.     MOV    H,B
  2140.     MOV    L,C
  2141.     POP    B
  2142.     RET
  2143.     DS    20
  2144. NUMBUF    EQU    $-1
  2145.     END
  2146. >>> LENGTH.MAC  820927:1304
  2147. ; FILE: LENGTH.MAC
  2148. ; DATE: 820927:1305
  2149. ; FOR:  Return length of string at <HL> in DE
  2150.     .8080
  2151.     TITLE    LENGTH - get length of string
  2152.     .XLIST
  2153.     INCLUDE    SYSEQU
  2154.     .LIST
  2155. LENGTH:: PUSH    H
  2156.     PUSH    PSW
  2157.     LXI    D,0
  2158. LEN0:    MOV    A,M
  2159.     INX    H
  2160.     CPI    ENDSTR
  2161.     JZ    LEN1
  2162.     INX    D
  2163.     JMP    LEN0
  2164. LEN1:    POP    PSW
  2165.     POP    H
  2166.     RET
  2167.     END
  2168. >>> LSTPUT.MAC    820825:1656
  2169. ; FILE:    LSTPUT.MAC
  2170. ; DATE:    820825:1646
  2171. ; FOR:    Put single char on LST: via PUTCF
  2172.     .8080
  2173.     TITLE    LSTPUT - Put char on LST:
  2174.     EXT    PUTCF
  2175. LSTPUT:: PUSH    B
  2176.     MVI    C,16
  2177.     CALL    PUTCF
  2178.     POP    B
  2179.     RET
  2180.     END
  2181. >>> MAKFCB.MAC    820823:1358
  2182. ; FILE:    MAKFCB.MAC
  2183. ; DATE: 820823:1350
  2184. ; FOR:    Create FCB at <DE> from file at <HL>
  2185.  
  2186.     TITLE    MAKFCB - Make FCB from name
  2187.     .8080
  2188.     .XLIST
  2189.     INCLUDE SYSEQU
  2190.     .LIST
  2191.     EXT    FNB,ERROR,UPCASE,FILL
  2192. MAKFCB:: PUSH    D
  2193.     PUSH    B
  2194.     PUSH    B
  2195.     XTHL
  2196.     POP    B
  2197.     CALL    FNB
  2198.     PUSH    B
  2199.     XTHL
  2200.     POP    B
  2201.     INX    H
  2202.     MOV    A,M
  2203.     DCX    H
  2204.     CPI    ':'
  2205.     JNZ    MKF1
  2206.     MOV    A,M
  2207.     INX    H
  2208.     INX    H
  2209.     CALL    UPCASE
  2210.     SUI    '@'
  2211.     JC    MKF0
  2212.     CPI    MAXDRV+1
  2213.     JC    MKF2
  2214. MKF0:    CALL    ERROR
  2215.     MSG    <'MAKFCB: Drive out of range'>
  2216. MKF1:    XRA    A
  2217. MKF2:    STAX    D
  2218.     INX    D
  2219.     MVI    B,2
  2220.     MVI    C,8
  2221. MKF3:    MOV    A,M
  2222.     CPI    ENDSTR
  2223.     JZ    MKF4
  2224.     CPI    BLANK
  2225.     JZ    MKF4
  2226.     INX    H
  2227.     CPI    PERIOD
  2228.     JZ    MKF4
  2229.     CALL    UPCASE
  2230.     STAX    D
  2231.     INX    D
  2232.     DCR    C
  2233.     JNZ    MKF3
  2234.     JMP    MKF6
  2235. MKF4:    MOV    A,C
  2236.     ORA    A
  2237. MKF5:    JZ    MKF7
  2238.     MVI    A,BLANK
  2239.     STAX    D
  2240.     INX    D
  2241.     DCR    C
  2242.     JMP    MKF5
  2243. MKF6:    MOV    A,M
  2244.     CPI    PERIOD
  2245.     JNZ    MKF7
  2246.     INX    H
  2247. MKF7:    MVI    C,3
  2248.     DCR    B
  2249.     JNZ    MKF3
  2250.     XCHG
  2251.     LXI    B,24
  2252.     XRA    A
  2253.     CALL    FILL
  2254.     POP    B
  2255.     POP    D
  2256.     RET        ; HL = buf start addr
  2257.     END
  2258. >>> MEMRY.MAC    820820:2336
  2259. ; FILE:    MEMRY.MAC
  2260. ; DATE:    820819:1404
  2261. ; FOR:    See comment
  2262.     .8080
  2263.     .COMMENT "
  2264. In files needing to know about $MEMRY,
  2265. the following locution should be used:
  2266.     IF    LYNX    ; ie linking with LYNX
  2267. $MEMRY    EQU    108H
  2268.     ELSE
  2269.     EXT    $MEMRY
  2270.     ENDIF
  2271. and of course the present file need not be
  2272. used in conjunction with LYNX.  If it is used,
  2273. MEMRY must be linked last of all and DSEG must
  2274. be the last segment of code.
  2275. "
  2276.     DSEG
  2277. $MEMRY:: DW    $+2
  2278.     END
  2279. >>> MOVEL.MAC    820820:2336
  2280. ; FILE:    MOVEL.MAC
  2281. ; DATE: 820818:1317
  2282. ; FOR:    Move BC bytes from <HL> to <DE>
  2283.  
  2284.     TITLE    MOVEL - <HL> to <DE>, len=BC
  2285.     .8080
  2286. MOVEL::    PUSH    PSW    ; A is preserved
  2287. ML0:    MOV    A,B    ; While count <> 0
  2288.     ORA    C
  2289.     JZ    ML1    ; ..do begin
  2290.     MOV    A,M    ; move 1 byte
  2291.     STAX    D
  2292.     INX    H    ; next byte
  2293.     INX    D    ; next space
  2294.     DCX    B    ; count down
  2295.     JMP    ML0    ; end do
  2296. ML1:    POP    PSW
  2297.     RET
  2298.     END
  2299. >>> MOVES.MAC    820820:2337
  2300. ; FILE:    MOVES.MAC
  2301. ; DATE: 820818:1323
  2302. ; FOR:    Move bytes from <HL> to <DE>, delim=C
  2303.  
  2304.     TITLE    MOVES - <HL> to <DE>, delim=C
  2305.     .8080
  2306. MOVES::    PUSH    PSW    ; A is preserved
  2307.     MOV    A,M    ; move 1 byte
  2308.     STAX    D
  2309.     INX    H    ; next to move
  2310.     INX    D    ; space to fill
  2311.     CMP    C    ; was delim?
  2312.     JNZ    MOVES+1    ; ..if no, continue
  2313.     POP    PSW    ; ..else quit
  2314.     RET
  2315.     END
  2316. >>> MOVEU.MAC    820820:2343
  2317. ; FILE:    MOVEU.MAC
  2318. ; DATE: 820818:1321
  2319. ; FOR:    Move BC bytes from <HL> to <DE>, down
  2320.  
  2321.     TITLE    MOVEU - <HL> to <DE>, len=BC
  2322.     .8080
  2323. MOVEU::    PUSH    PSW    ; A is preserved
  2324.     DAD    B    ; start at top
  2325.     XCHG
  2326.     DAD    B    ; ..of both areas
  2327.     XCHG
  2328. ML0:    MOV    A,B    ; While count <> 0
  2329.     ORA    C
  2330.     JZ    ML1    ; ..do begin
  2331.     DCX    H    ; byte to move
  2332.     DCX    D    ; space to fill
  2333.     MOV    A,M    ; move 1 byte
  2334.     STAX    D
  2335.     DCX    B    ; count down
  2336.     JMP    ML0    ; end do
  2337. ML1:    POP    PSW
  2338.     RET
  2339.     END
  2340. >>> MPLD.MAC    820820:2346
  2341. ; FILE:    MPLD.MAC
  2342. ; DATE: 820818:1102
  2343. ; FOR:    Load <HL> memory (32 bits) to 9511
  2344.  
  2345.     TITLE    MPLD - Load <HL> to math chip
  2346.     .8080
  2347.     .XLIST
  2348.     INCLUDE SYSEQU
  2349.     .LIST
  2350. MPLD::    PUSH    PSW
  2351.     MOV    A,M
  2352.     OUT    MDATA
  2353.     INX    H
  2354.     MOV    A,M
  2355.     OUT    MDATA
  2356.     INX    H
  2357.     MOV    A,M
  2358.     OUT    MDATA
  2359.     INX    H
  2360.     MOV    A,M
  2361.     OUT    MDATA
  2362.     DCX    H
  2363.     DCX    H
  2364.     DCX    H
  2365.     POP    PSW
  2366.     RET
  2367.     END
  2368. >>> MPLS.MAC    820820:2347
  2369. ; FILE:    MPLS.MAC
  2370. ; DATE: 820818:1102
  2371. ; FOR:    Load HL contents to math chip
  2372.  
  2373.     TITLE    MPLS - Load HL to math chip
  2374.     .8080
  2375.     .XLIST
  2376.     INCLUDE SYSEQU
  2377.     .LIST
  2378. MPLS::    PUSH    PSW
  2379.     MOV    A,L
  2380.     OUT    MDATA
  2381.     MOV    A,H
  2382.     OUT    MDATA
  2383.     POP    PSW
  2384.     RET
  2385.     END
  2386. >>> MPRD.MAC    820820:2352
  2387. ; FILE:    MPRD.MAC
  2388. ; DATE: 820818:1102
  2389. ; FOR:    Read math chip to <HL> (32 bits)
  2390.  
  2391.     TITLE    MPRD - Read <HL> from math chip
  2392.     .8080
  2393.     .XLIST
  2394.     INCLUDE SYSEQU
  2395.     .LIST
  2396. MPRD::    PUSH    PSW
  2397.     INX    H
  2398.     INX    H
  2399.     INX    H
  2400.     IN    MDATA
  2401.     MOV    M,A
  2402.     DCX    H
  2403.     IN    MDATA
  2404.     MOV    M,A
  2405.     DCX    H
  2406.     IN    MDATA
  2407.     MOV    M,A
  2408.     DCX    H
  2409.     IN    MDATA
  2410.     MOV    M,A
  2411.     POP    PSW
  2412.     RET
  2413.     END
  2414. >>> MPRS.MAC    820820:2354
  2415. ; FILE:    MPRS.MAC
  2416. ; DATE: 820818:1102
  2417. ; FOR:    Read math chip to HL (16 bits)
  2418.  
  2419.     TITLE    MPRS - Read HL from math chip
  2420.     .8080
  2421.     .XLIST
  2422.     INCLUDE SYSEQU
  2423.     .LIST
  2424. MPRS::    PUSH    PSW
  2425.     IN    MDATA
  2426.     MOV    H,A
  2427.     IN    MDATA
  2428.     MOV    L,A
  2429.     POP    PSW
  2430.     RET
  2431.     END
  2432. >>> MPS0.MAC    820820:2354
  2433. ; FILE:    MPS0.MAC
  2434. ; DATE: 820818:1058
  2435. ; FOR:    Load a 16-bit zero to the math chip
  2436.  
  2437.     TITLE    MPS0 - Load a 16-bit zero
  2438.     .8080
  2439.     .XLIST
  2440.     INCLUDE SYSEQU
  2441.     .LIST
  2442. MPS0::    PUSH    PSW
  2443.     XRA    A
  2444.     OUT    MDATA
  2445.     OUT    MDATA
  2446.     POP    PSW
  2447.     RET
  2448.     END
  2449. >>> MPWAIT.MAC    820820:2354
  2450. ; FILE:    MPWAIT.MAC
  2451. ; DATE: 820818:1224
  2452.     TITLE    MPWAIT - Issue math op command
  2453.     .8080
  2454.     .XLIST
  2455.     INCLUDE SYSEQU
  2456.     .LIST
  2457. MPWAIT::    ; Issue command and get status
  2458.     OUT    MCMDS
  2459.     PUSH    H
  2460.     LXI    H,MCDLY
  2461. MPW0:    IN    MCMDS
  2462.     ANI    80H
  2463.     JZ    MPW1
  2464.     DCX    H
  2465.     MOV    A,H
  2466.     ORA    L
  2467.     JNZ    MPW0
  2468. MPW1:    POP    H
  2469.     IN    MCMDS
  2470.     STA    MSTAT
  2471.     RET
  2472. MSTAT::        ; Status "register"
  2473.     DS    1
  2474.     END
  2475. >>> MTBUF.MAC    820820:2354
  2476. ; FILE:    MTBUF.MAC
  2477. ; DATE: 820819:1217
  2478. ; FOR:    Write C secs from <HL>, fcb = <DE>
  2479.  
  2480.     TITLE    MTBUF - Empty disk buffer
  2481.     .8080
  2482.     .XLIST
  2483.     INCLUDE SYSEQU
  2484.     .LIST
  2485.     EXT    ADDA,ERROR
  2486. 1656UF:: PUSH    B
  2487.     PUSH    H
  2488.     PUSH    D
  2489.     XCHG
  2490.     MVI    C,SETDMA
  2491.     CALL    BDOS
  2492.     POP    D
  2493.     PUSH    D
  2494.     MVI    C,WRTSEQ
  2495.     CALL    BDOS
  2496.     ORA    A
  2497.     JNZ    DSKFUL
  2498.     POP    D
  2499.     POP    H
  2500.     POP    B
  2501.     DCR    C
  2502.     RZ
  2503.     MVI    A,80H
  2504.     CALL    ADDA
  2505.     JMP    MTBUF
  2506. DSKFUL:    CALL    ERROR
  2507.     MSG    <'MTBUF: Disk full'>
  2508.     END
  2509. >>> NEGH.MAC    820820:2354
  2510. ; FILE:    NEGH.MAC
  2511. ; DATE: 820818:1310
  2512. ; FOR:    -HL -> HL
  2513.  
  2514.     TITLE    NEGH - -HL -> HL
  2515.     .8080
  2516. NEGH::    PUSH    PSW
  2517.     XRA    A
  2518.     SUB    L
  2519.     MOV    L,A
  2520.     SBB    H
  2521.     SUB    L
  2522.     MOV    H,A
  2523.     POP    PSW
  2524.     RET
  2525.     END
  2526. >>> OP32.MAC    820820:2354
  2527. ; FILE:    OP32.MAC
  2528. ; DATE:    820818:1226
  2529. ; FOR:    HL op DE -> HL - math-chip operations
  2530.  
  2531.     TITLE    OP32 - HL op DE -> HL
  2532.     .8080
  2533.     EXT    MPLD,MPRD,MPWAIT
  2534.  
  2535. OP32::    CALL    MPLD
  2536.     XCHG
  2537.     CALL    MPLD
  2538.     XCHG
  2539.     CALL    MPWAIT
  2540.     CALL    MPRD
  2541.     RET
  2542.     END
  2543. >>> OPEN.MAC    820820:2355
  2544. ; FILE:    OPEN.MAC
  2545. ; DATE: 820819:1416
  2546. ; FOR:    Open or create file named at <HL>
  2547.  
  2548.     TITLE    OPEN - Open or create file
  2549.     .8080
  2550.     .XLIST
  2551.     INCLUDE SYSEQU
  2552.     INCLUDE LINKEQU
  2553.     .LIST
  2554.     EXT    MAKFCB,FILLBF
  2555.     EXT    BUFBLS,CHANLS,ADDA,NEGH
  2556.     IF    LYNX
  2557. $MEMRY    EQU    108H
  2558.     ELSE
  2559.     EXT    $MEMRY
  2560.     ENDIF
  2561. OPEN::    CALL    GETCHN
  2562.     RZ
  2563.     CALL    MAKFCB
  2564.     PUSH    H
  2565.     PUSH    B
  2566.     PUSH    D
  2567.     MOV    A,B
  2568.     INR    A
  2569.     JNZ    OPENRD
  2570.     MVI    C,ERASEF
  2571.     CALL    BDOS
  2572.     POP    D
  2573.     PUSH    D
  2574.     MVI    C,MAKEF
  2575.     JMP    OPENRD+2
  2576. OPENRD:    MVI    C,OPENF
  2577.     CALL    BDOS
  2578.     POP    D
  2579.     POP    B
  2580.     POP    H
  2581.     INR    A
  2582.     RZ
  2583.     CALL    SETCHN
  2584.     MOV    A,B
  2585.     INR    A
  2586.     CNZ    FILLBF
  2587.     LDA    CHNLNO
  2588.     ORA    A
  2589.     RET
  2590. GETCHN:    PUSH    H
  2591.     PUSH    B
  2592.     LXI    H,CHANLS+2
  2593.     MVI    B,2
  2594.     CALL    GETBLK
  2595.     JZ    GTCHN4
  2596.     SHLD    CHANL
  2597.     STA    CHNLNO
  2598.     LXI    H,BUFBLS
  2599.     MVI    B,10
  2600.     CALL    GETBLK
  2601. GTCHN0:    SHLD    BUFBLK
  2602.     MVI    A,8
  2603.     CALL    ADDA
  2604.     MOV    A,C
  2605.     POP    B
  2606.     PUSH    B
  2607.     MOV    A,M    ; 0FF for unassigned
  2608.     CMP    C
  2609.     JNC    GTCHN1
  2610.     LHLD    BUFBLK
  2611.     MOV    C,B
  2612.     MVI    B,10
  2613.     CALL    GTNXT
  2614.     JZ    GTCHN4
  2615.     JMP    GTCHN0
  2616. GTCHN1:    INR    A
  2617.     JZ    GTCHN2
  2618.     DCX    H
  2619.     MOV    D,M
  2620.     DCX    H
  2621.     MOV    E,M
  2622.     JMP    GTCHN3
  2623. GTCHN2:    LHLD    $MEMRY
  2624.     XCHG
  2625. GTCHN3:    LDA    CHNLNO
  2626.     ORA    A
  2627. GTCHN4:    POP    B
  2628.     POP    H
  2629.     RET        ; DE -> FCB
  2630. GETBLK:    MVI    C,1
  2631. GTCN0:    INX    H
  2632.     MOV    A,M
  2633.     DCX    H
  2634.     ORA    M
  2635.     JZ    GOTONE
  2636. GTNXT:    MOV    A,B
  2637.     CALL    ADDA
  2638.     INR    C
  2639.     MOV    A,C
  2640.     CPI    16
  2641.     JC    GTCN0
  2642.     XRA    A
  2643.     MOV    C,A
  2644.     MOV    L,A
  2645.     MOV    H,A
  2646.     RET
  2647. GOTONE:    MOV    A,C
  2648.     ORA    A
  2649.     RET
  2650. SETCHN:    PUSH    D
  2651.     PUSH    H    ; Buffer start
  2652.     LHLD    BUFBLK
  2653.     MVI    A,9
  2654.     CALL    ADDA
  2655.     MOV    M,B    ; RWFLG
  2656.     DCX    H
  2657.     MOV    M,C    ; NSECS
  2658.     DCX    H
  2659.     MOV    M,D    ; FCB
  2660.     DCX    H
  2661.     MOV    M,E
  2662.     MOV    A,C
  2663.     ORA    A
  2664.     RAR
  2665.     MOV    D,A
  2666.     MVI    A,0
  2667.     RAR
  2668.     MOV    E,A
  2669.     XCHG
  2670.     PUSH    H    ; Buflen
  2671.     CALL    NEGH
  2672.     XCHG
  2673.     DCX    H
  2674.     MOV    M,D    ; -Buflen
  2675.     DCX    H
  2676.     MOV    M,E
  2677.     DCX    H
  2678.     MOV    M,D    ; Pointer
  2679.     DCX    H
  2680.     MOV    M,E
  2681.     POP    D    ; Buflen
  2682.     XTHL        ; Buffer start
  2683.     PUSH    H
  2684.     DAD    D    ; Bufend
  2685.     XCHG
  2686.     POP    H    ; Buffer start
  2687.     XTHL        ; Block pointer
  2688.     DCX    H
  2689.     MOV    M,D    ; Bufend
  2690.     DCX    H    ; Block start
  2691.     MOV    M,E
  2692. ; Now reset $MEMRY and set channel entry
  2693.     XCHG
  2694.     MVI    M,0
  2695.     MVI    A,92
  2696.     CALL    ADDA
  2697.     SHLD    $MEMRY    ; Bufend + pushback
  2698.     LHLD    CHANL
  2699.     MOV    M,E    ; Buffer block addr
  2700.     INX    H
  2701.     MOV    M,D
  2702.     POP    H
  2703.     POP    D
  2704.     RET
  2705. BUFBLK:    DS    2
  2706. CHANL:    DS    2
  2707. CHNLNO:    DS    1    
  2708.     END
  2709. >>> OUTPT.MAC    820820:2355
  2710. ; FILE:    OUTPT.MAC
  2711. ; DATE: 820818:2052
  2712. ; FOR:    Write A to port in C
  2713.  
  2714.     TITLE    OUTPT - Write A to port C
  2715.     .8080
  2716. OUTPT::    PUSH    H
  2717.     MOV    L,C
  2718.     MVI    H,RET
  2719.     PUSH    H
  2720.     MVI    H,OUT
  2721.     MVI    L,0
  2722.     PUSH    H
  2723.     LXI    H,GONOUT
  2724.     PUSH    H
  2725.     LXI    H,3
  2726.     DAD    SP
  2727.     PCHL
  2728. GONOUT:    POP    H
  2729.     POP    H
  2730.     POP    H
  2731.     RET
  2732.     END
  2733. >>> PCSTR.MAC    820825:1740
  2734. ; FILE:    PCSTR.MAC
  2735. ; DATE:    820825:1719
  2736. ; FOR:    Output msg from <HL> to CON:
  2737.     .8080
  2738.     TITLE    PCSTR - Send from <HL>
  2739.     EXT    PUTSTF
  2740.     .XLIST
  2741.     INCLUDE SYSEQU
  2742.     .LIST
  2743. PCSTR::    PUSH    B
  2744.     MVI    C,0
  2745.     CALL    PUTSTF
  2746.     POP    B
  2747.     RET
  2748.     END
  2749. >>> PCMSG.MAC    820825:1741
  2750. ; FILE:    PCMSG.MAC
  2751. ; DATE:    820825:1721
  2752. ; FOR:    Output inline msg to CON:
  2753.     .8080
  2754.     TITLE    PCMSG - Send from <PC>
  2755.     EXT    PUTSTF
  2756.     .XLIST
  2757.     INCLUDE SYSEQU
  2758.     .LIST
  2759. PCMSG::    XTHL
  2760.     PUSH    B
  2761.     MVI    C,0
  2762.     CALL    PUTSTF
  2763.     POP    B
  2764.     XTHL
  2765.     RET
  2766.     END
  2767. >>> PLMSG.MAC    820825:1742
  2768. ; FILE:    PLMSG.MAC
  2769. ; DATE:    820825:1721
  2770. ; FOR:    Output inline msg to LST:
  2771.     .8080
  2772.     TITLE    PLMSG - Send from <PC>
  2773.     EXT    PUTSTF
  2774.     .XLIST
  2775.     INCLUDE SYSEQU
  2776.     .LIST
  2777. PLMSG::    XTHL
  2778.     PUSH    B
  2779.     MVI    C,16
  2780.     CALL    PUTSTF
  2781.     POP    B
  2782.     XTHL
  2783.     RET
  2784.     END
  2785. >>> PLSTR.MAC    820825:1743
  2786. ; FILE:    PLSTR.MAC
  2787. ; DATE:    820825:1719
  2788. ; FOR:    Output msg from <HL> to LST:
  2789.     .8080
  2790.     TITLE    PLSTR - Send from <HL>
  2791.     EXT    PUTSTF
  2792.     .XLIST
  2793.     INCLUDE SYSEQU
  2794.     .LIST
  2795. PLSTR::    PUSH    B
  2796.     MVI    C,16
  2797.     CALL    PUTSTF
  2798.     POP    B
  2799.     RET
  2800.     END
  2801. >>> PROMPT.MAC    820901:0957
  2802. ; FILE:    PROMPT.MAC
  2803. ; DATE:    820901:0935
  2804. ; FOR:    See comment
  2805.     .8080
  2806.     TITLE    PROMPT - Read line from keyboard
  2807. ; Call with message inline, max reply length
  2808. ; in C and "must-reply" flag in A (0=cr ok);
  2809. ; returns buffer addr in HL and length in A
  2810.     .XLIST
  2811.     INCLUDE SYSEQU
  2812.     .LIST
  2813.     EXT    CONMSG,IPTBUF
  2814. PROMPT:: POP    H
  2815.     PUSH    D
  2816.     PUSH    B
  2817.     STA    CRFLG
  2818.     CALL    CONMSG
  2819.     POP    B
  2820.     POP    D
  2821.     PUSH    H
  2822.     PUSH    D
  2823.     PUSH    B
  2824.     MVI    A,'?'
  2825.     CALL    CHOUT
  2826. NMPRMP:    MVI    A,' '
  2827.     CALL    CHOUT
  2828.     LXI    D,IPTBUF
  2829.     MOV    B,C
  2830. P1:    MVI    A,'_'
  2831.     CALL    CHOUT
  2832.     DCR    C
  2833.     JNZ    P1
  2834.     MOV    C,B
  2835. P2:    MVI    A,BKS
  2836.     CALL    CHOUT
  2837.     DCR    C
  2838.     JNZ    P2
  2839. ; Max count now in B, C=0
  2840. CHR1:    CALL    KEY
  2841.     CPI    ' '    ; initial space ng
  2842.     JZ    PERROR
  2843. QCR:    CPI    CR
  2844.     JNZ    QESC
  2845.     MOV    A,C
  2846.     ORA    A
  2847.     JNZ    P3
  2848.     LDA    CRFLG    ; blank field, ok?
  2849.     ORA    A
  2850.     JNZ    PERROR
  2851. P3:    MOV    A,B
  2852.     ORA    A
  2853.     JZ    DONE
  2854. P3A:    MVI    A,' '
  2855.     STAX    D
  2856.     INX    D
  2857.     CALL    CHOUT
  2858.     DCR    B
  2859.     JNZ    P3A
  2860.     JMP    DONE
  2861. QESC:    CPI    ESCAPE
  2862.     JNZ    QBKS
  2863. P4:    MOV    A,C
  2864.     ORA    A
  2865.     JZ    ESCRET
  2866.     MVI    A,BKS
  2867.     CALL    CHOUT
  2868.     MVI    A,'_'
  2869.     CALL    CHOUT
  2870.     MVI    A,BKS
  2871.     CALL    CHOUT
  2872.     DCX    D
  2873.     MVI    A,' '
  2874.     STAX    D
  2875.     INR    B
  2876.     DCR    C
  2877.     JNZ    P4
  2878.     JMP    CHR1
  2879. ESCRET:    MVI    A,ESCAPE
  2880.     STAX    D
  2881.     INX    D
  2882.     INR    C
  2883.     DCR    B
  2884.     JMP    DONE
  2885. QBKS:    CPI    BKS
  2886.     JZ    BKSP
  2887.     CPI    DEL
  2888.     JNZ    QERR
  2889. BKSP:    MOV    A,C
  2890.     ORA    A
  2891.     JZ    PERROR
  2892.     MVI    A,BKS
  2893.     CALL    CHOUT
  2894.     MVI    A,'_'
  2895.     CALL    CHOUT
  2896.     MVI    A,BKS
  2897.     CALL    CHOUT
  2898.     DCX    D
  2899.     MVI    A,' '
  2900.     STAX    D
  2901.     INR    B
  2902.     DCR    C
  2903.     JZ    CHR1
  2904.     JMP    NCHR
  2905. QERR:    CPI    ' '
  2906.     JC    PERROR
  2907. QSIZ:    STAX    D
  2908.     MOV    A,B
  2909.     ORA    A
  2910.     JZ    PERROR
  2911.     LDAX    D
  2912.     INX    D
  2913.     INR    C
  2914.     DCR    B
  2915.     JMP    CHR2
  2916. PERROR:    MVI    A,BEL
  2917. CHR2:    CALL    CHOUT
  2918.     MOV    A,C
  2919.     ORA    A
  2920.     JZ    CHR1
  2921. NCHR:    CALL    KEY
  2922.     JMP    QCR
  2923. DONE:    MOV    A,C
  2924.     POP    B
  2925.     POP    D
  2926.     LXI    H,IPTBUF
  2927.     RET
  2928. CHOUT:    PUSH    H
  2929.     PUSH    D
  2930.     PUSH    B
  2931.     PUSH    PSW
  2932.     MOV    E,A
  2933.     MVI    C,PRTCHR
  2934.     CALL    BDOS
  2935.     POP    PSW
  2936.     POP    B
  2937.     POP    D
  2938.     POP    H
  2939.     RET
  2940. KEY:    PUSH    D
  2941.     PUSH    B
  2942.     MVI    E,0FFH
  2943.     MVI    C,DIRIO
  2944.     CALL    BDOS
  2945.     ANI    7FH
  2946.     JZ    KEY+2
  2947.     POP    B
  2948.     POP    D
  2949.     RET
  2950. CRFLG:    DS    1
  2951.     END
  2952. >>> PUSHBF.MAC    820820:2355
  2953. ; FILE:    PUSHBF.MAC
  2954. ; DATE: 820819:1221
  2955. ; MOD:    820820:1641    ; Complete externals
  2956. ; FOR:    Write A to pushback buf for channel C
  2957.  
  2958.     TITLE    PUSHBF - Push A back to file C
  2959.     .8080
  2960.     .XLIST
  2961.     INCLUDE SYSEQU
  2962.     .LIST
  2963.     EXT    CONBUF,FNDBUF,ERROR,MOVEU
  2964. PUSHBF:: PUSH    H
  2965.     PUSH    PSW
  2966.     MOV    A,C
  2967.     ANI    15
  2968.     JNZ    PBF0
  2969.     LXI    H,CONBUF
  2970.     JMP    PBF2
  2971. PBF0:    CALL    FNDBUF
  2972.     INR    A
  2973.     JNZ    PBF1
  2974.     CALL    ERROR
  2975.     MSG    <'PUSHBF: Pushback to output file'>
  2976. PBF1:    MOV    A,M
  2977.     INX    H
  2978.     MOV    H,M
  2979.     MOV    L,A
  2980. PBF2:    MOV    A,M
  2981.     INR    M
  2982.     CPI    90
  2983.     JNC    FULL
  2984.     PUSH    D
  2985.     PUSH    B
  2986.     MOV    C,A
  2987.     MVI    B,0
  2988.     INX    H
  2989.     MOV    D,H
  2990.     MOV    E,L
  2991.     INX    D
  2992.     CALL    MOVEU
  2993.     POP    B
  2994.     POP    D
  2995.     POP    PSW
  2996.     MOV    M,A
  2997.     POP    H
  2998.     RET
  2999. FULL:    CALL    ERROR
  3000.     MSG    <'PUSHBF: Pushback buffer full'>
  3001.     END
  3002. >>> PUSHBK.MAC    820820:2356
  3003. ; FILE:    PUSHBK.MAC
  3004. ; DATE: 820820:1352
  3005. ; FOR:    Push char back on std input
  3006.  
  3007.     TITLE    PUSHBK - Push char - std input
  3008.     .8080
  3009.     EXT    STDIN,PUSHBF
  3010. PUSHBK:: PUSH    B
  3011.     MOV    B,A
  3012.     LDA    STDIN
  3013.     MOV    C,A
  3014.     MOV    A,B
  3015.     CALL    PUSHBF
  3016.     POP    B
  3017.     RET
  3018.     END
  3019. >>> PUTC.MAC    820820:2356
  3020. ; FILE:    PUTC.MAC
  3021. ; DATE: 820820:1352
  3022. ; FOR:    Write char to std output
  3023.  
  3024.     TITLE    PUTC - Write char - std output
  3025.     .8080
  3026.     EXT    STDOUT,PUTCF
  3027. PUTC::    PUSH    B
  3028.     MOV    B,A
  3029.     LDA    STDOUT
  3030.     MOV    C,A
  3031.     MOV    A,B
  3032.     CALL    PUTCF
  3033.     POP    B
  3034.     RET
  3035.     END
  3036. >>> PUTCF.MAC    820820:2356
  3037. ; FILE:    PUTCF.MAC
  3038. ; DATE: 820819:1305
  3039. ; FOR:    Write 1 char from A into channel C
  3040.  
  3041.     TITLE    PUTCF - Write char to file
  3042.     .8080
  3043.     .XLIST
  3044.     INCLUDE SYSEQU
  3045.     .LIST
  3046.     EXT    FNDBUF,ERROR,SETBF,MTBUF
  3047.     EXT    ADDA
  3048. PUTCF::    PUSH    H
  3049.     PUSH    D
  3050.     PUSH    B
  3051.     PUSH    PSW
  3052.     MOV    A,C
  3053.     ANI    31
  3054.     JZ    CONOUT
  3055.     ANI    15
  3056.     JZ    LSTOUT
  3057.     CALL    FNDBUF
  3058.     INR    A
  3059.     JZ    PCF0
  3060.     CALL    ERROR
  3061.     MSG    <'PUTCF: Writing to input file'>
  3062. PCF0:    MOV    E,M
  3063.     INX    H
  3064.     MOV    D,M
  3065.     INX    H
  3066.     MOV    C,M
  3067.     INX    H
  3068.     MOV    B,M
  3069.     XCHG
  3070.     DAD    B
  3071.     POP    PSW
  3072.     PUSH    PSW
  3073.     MOV    M,A
  3074.     XCHG
  3075.     INX    B
  3076.     MOV    A,B
  3077.     ORA    C
  3078.     JNZ    PCF1
  3079. ; If we fall through here, buffer is full
  3080.     INX    H
  3081.     CALL    SETBF
  3082.     CALL    MTBUF
  3083.     JMP    PCF2
  3084. PCF1:    MOV    M,B
  3085.     DCX    H
  3086.     MOV    M,C
  3087.     JMP    PCF2
  3088. CONOUT:    MVI    C,PRTCHR
  3089.     JMP    OUTR
  3090. LSTOUT:    MVI    C,LSTCHR
  3091. OUTR:    POP    PSW
  3092.     PUSH    PSW
  3093.     MOV    E,A
  3094.     CALL    BDOS
  3095. PCF2:    POP    PSW
  3096.     POP    B
  3097.     PUSH    B
  3098.     PUSH    PSW
  3099.     SUI    9
  3100.     JZ    TABR
  3101.     DCR    A
  3102.     JZ    LINE
  3103.     DCR    A
  3104.     DCR    A
  3105.     JZ    PAGE
  3106.     DCR    A
  3107.     JZ    CARR
  3108.     MVI    A,2
  3109.     CALL    FNDCNT
  3110.     INR    M
  3111.     JMP    PCF3
  3112. TABR:    MVI    A,2
  3113.     CALL    FNDCNT
  3114.     MOV    A,M
  3115.     ANI    0F8H
  3116.     ADI    8
  3117.     MOV    M,A
  3118.     JMP    PCF3
  3119. LINE:    MVI    A,1
  3120.     CALL    FNDCNT
  3121.     INR    M
  3122.     JMP    PCF3
  3123. PAGE:    XRA    A
  3124.     CALL    FNDCNT
  3125.     INR    M
  3126.     INX    H
  3127.     MVI    M,0
  3128.     JMP    PCF3
  3129. CARR:    MVI    A,2
  3130.     CALL    FNDCNT
  3131.     MVI    M,0
  3132. PCF3:    POP    PSW
  3133.     POP    B
  3134.     POP    D
  3135.     POP    H
  3136.     RET
  3137. FNDCNT::    ; Find block of 3 bytes:
  3138. ; page, line and char counters for PUTCF
  3139. ; channel no in C, offset of 0, 1 or 2 in A
  3140.     LXI    H,CNTRS
  3141.     ADD    C
  3142.     ADD    C
  3143.     ADD    C
  3144.     CALL    ADDA    
  3145.     RET
  3146. CNTRS:    REPT    17
  3147.     DB    0    ;; Page
  3148.     DB    0    ;; Line
  3149.     DB    0    ;; Char
  3150.     ENDM
  3151.     END
  3152. >>> PUTDCF.MAC    820825:1941
  3153. ; FILE:    PUTDCF.MAC
  3154. ; DATE:    820825:1925
  3155. ; FOR:    Put DE out on chan. C as decimal ASCII
  3156.     .8080
  3157.     TITLE    PUTDCF - Write DE to channel C
  3158.     EXT    ITOC,PUTCF,PUTSTF
  3159. PUTDCF:: PUSH    H
  3160.     PUSH    B
  3161.     MOV    B,A
  3162.     CALL    ITOC
  3163. PDC0:    CMP    B
  3164.     JNC    PDC1    
  3165.     PUSH    PSW
  3166.     MVI    A,' '
  3167.     CALL    PUTCF
  3168.     POP    PSW
  3169.     INR    A
  3170.     JMP    PDC0
  3171. PDC1:    CALL    PUTSTF
  3172.     POP    B
  3173.     POP    H
  3174.     RET
  3175.     END
  3176. >>> PUTDEC.MAC    820825:1942
  3177. ; FILE:    PUTDEC.MAC
  3178. ; DATE:    820825:1925
  3179. ; FOR:    Put DE out on STDOUT as decimal ASCII
  3180.     .8080
  3181.     TITLE    PUTDEC - Write DE to STDOUT
  3182.     EXT    ITOC,PUTC,PUTSTR
  3183. PUTDEC:: PUSH    H
  3184.     PUSH    B
  3185.     MOV    B,A
  3186.     CALL    ITOC
  3187. PDC0:    CMP    B
  3188.     JNC    PDC1    
  3189.     PUSH    PSW
  3190.     MVI    A,' '
  3191.     CALL    PUTC
  3192.     POP    PSW
  3193.     INR    A
  3194.     JMP    PDC0
  3195. PDC1:    CALL    PUTSTR
  3196.     POP    B
  3197.     POP    H
  3198.     RET
  3199.     END
  3200. >>> PUTMSF.MAC    820825:1746
  3201. ; FILE:    PUTMSF.MAC
  3202. ; DATE:    820825:1701
  3203. ; FOR:    Output inline msg to channel C
  3204.     .8080
  3205.     TITLE    PUTMSF - Send from <PC> to C
  3206.     EXT    PUTSTF
  3207.     .XLIST
  3208.     INCLUDE SYSEQU
  3209.     .LIST
  3210. PUTMSF:: XTHL
  3211.     CALL    PUTSTF
  3212.     XTHL
  3213.     RET
  3214.     END
  3215. >>> PUTMSG.MAC    820825:1748
  3216. ; FILE:    PUTMSG.MAC
  3217. ; DATE:    820825:1701
  3218. ; FOR:    Output inline msg to STDOUT
  3219.     .8080
  3220.     TITLE    PUTMSG - Send from <PC>
  3221.     EXT    PUTSTF,STDOUT
  3222.     .XLIST
  3223.     INCLUDE SYSEQU
  3224.     .LIST
  3225. PUTMSG:: XTHL
  3226.     PUSH    PSW
  3227.     PUSH    B
  3228.     LDA    STDOUT
  3229.     MOV    C,A
  3230.     CALL    PUTSTF
  3231.     POP    B
  3232.     POP    PSW
  3233.     XTHL
  3234.     RET
  3235.     END
  3236. >>> PUTSTF.MAC    820825:1749
  3237. ; FILE:    PUTSTF.MAC
  3238. ; DATE:    820825:1701
  3239. ; FOR:    Output msg from <HL> to channel C
  3240.     .8080
  3241.     TITLE    PUTSTF - Send from <HL> to C
  3242.     EXT    PUTCF
  3243.     .XLIST
  3244.     INCLUDE SYSEQU
  3245.     .LIST
  3246. PUTSTF:: PUSH    PSW
  3247.     MOV    A,M
  3248.     INX    H    ; Will point past
  3249.     CPI    ENDSTR    ; ..ENDSTR when done
  3250.     JZ    DONE
  3251.     CALL    PUTCF
  3252.     JMP    PUTSTF+1
  3253. DONE:    POP    PSW
  3254.     RET
  3255.     END
  3256. >>> PUTSTR.MAC    820825:1751
  3257. ; FILE:    PUTSTR.MAC
  3258. ; DATE:    820825:1701
  3259. ; FOR:    Output msg from <HL> to STDOUT
  3260.     .8080
  3261.     TITLE    PUTSTR - Send from <HL>
  3262.     EXT    PUTSTF,STDOUT
  3263.     .XLIST
  3264.     INCLUDE SYSEQU
  3265.     .LIST
  3266. PUTSTR:: PUSH    PSW
  3267.     PUSH    B
  3268.     LDA    STDOUT
  3269.     MOV    C,A
  3270.     CALL    PUTSTF
  3271.     POP    B
  3272.     POP    PSW
  3273.     RET
  3274.     END
  3275. >>> RDCLK.MAC    820820:2356
  3276. ; FILE:    RDCLK.MAC
  3277. ; DATE: 820818:1452
  3278. ; FOR:    Read clock to buffer
  3279.  
  3280.     TITLE    RDCLK - Read clock to buffer
  3281.     .8080
  3282.     .XLIST
  3283.     INCLUDE SYSEQU
  3284.     .LIST
  3285. RDCLK::    PUSH    B
  3286.     LXI    H,BUFFER
  3287.     MVI    M,ENDSTR
  3288.     MVI    B,2
  3289.     MVI    C,4
  3290.     CALL    RDMUL
  3291.     DCX    H
  3292.     MVI    M,':'
  3293.     INR    B
  3294.     MVI    C,6
  3295.     CALL    RDMUL
  3296.     POP    B
  3297.     MVI    A,11
  3298.     RET
  3299. RDMUL:    MOV    A,B
  3300.     CALL    RDDGT
  3301.     ADI    30H
  3302.     DCX    H
  3303.     MOV    M,A
  3304.     INR    B
  3305.     DCR    C
  3306.     JNZ    RDMUL
  3307.     RET
  3308. RDDGT:    ORI    10H
  3309.     OUT    CSTAT
  3310.     CPI    15H
  3311.     JZ    RDD0
  3312.     CPI    18H
  3313. RDD0:    IN    CDATA
  3314.     RNZ
  3315.     ANI    3    ; Strip off flag bits
  3316.     RET
  3317.     DS    12
  3318. BUFFER    EQU    $-1
  3319.     END
  3320. >>> REMARK.MAC    820820:2356
  3321. ; FILE:    REMARK.MAC
  3322. ; DATE: 820818:1337
  3323. ; FOR:    Print inline string with ENDSTR delim
  3324.  
  3325.     TITLE    REMARK - Put string on CON:
  3326.     .8080
  3327.     EXT    CONMSG,CRLFMS
  3328. REMARK:: XTHL
  3329.     PUSH    PSW
  3330.     PUSH    B
  3331.     PUSH    D
  3332.     PUSH    H
  3333.     LXI    H,CRLFMS
  3334.     CALL    CONMSG
  3335.     POP    H
  3336.     CALL    CONMSG
  3337.     POP    D
  3338.     POP    B
  3339.     POP    PSW
  3340.     XTHL
  3341.     RET
  3342.     END
  3343. >>> SELCMD.MAC    820820:2356
  3344. ; FILE:    SELCMD.MAC
  3345. ; DATE:    820819:2239
  3346. ; FOR:    Select command from table
  3347.     TITLE    SELCMD - Check A against list
  3348.     .COMMENT "
  3349. Usage:    CALL    SELCMD
  3350.     DB    CMD1
  3351.     DW    PROC1
  3352.     ...
  3353.     DB    CMDN
  3354.     DW    PROCN
  3355.     DB    0    ; Table end
  3356.     MORE CODE    ; for 'none of the above'
  3357. "
  3358.     .8080
  3359. SELCMD:: POP    H    ; Table addr
  3360.     CMP    M
  3361.     JZ    FOUND
  3362.     MOV    E,A
  3363.     MOV    A,M
  3364.     INX    H
  3365.     ORA    A    ; Table end?
  3366.     JZ    GOTOIT
  3367.     INX    H
  3368.     INX    H    ; Next entry
  3369.     JMP    SELCMD+1
  3370. FOUND:    INX    H
  3371.     MOV    E,M
  3372.     INX    H
  3373.     MOV    D,M
  3374.     XCHG
  3375. GOTOIT:    PCHL
  3376.     END
  3377. >>> SETBF.MAC    820820:2356
  3378. ; FILE:    SETBF.MAC
  3379. ; DATE: 820819:1244
  3380. ; FOR:    Get FILLBF or MTBUF info from block
  3381.  
  3382.     TITLE    SETBF - Prepare to read or write buffer
  3383.     .8080
  3384.     EXT    ADDA
  3385. SETBF::    MOV    E,M    ; Buffer size
  3386.     INX    H
  3387.     MOV    D,M
  3388.     DCX    H
  3389.     DCX    H
  3390.     MOV    M,D    ; Pointer
  3391.     DCX    H
  3392.     MOV    M,E
  3393.     DCX    H
  3394.     MOV    B,M    ; Buffer end
  3395.     DCX    H
  3396.     MOV    C,M
  3397.     XCHG        ; Buffer size
  3398.     DAD    B    ; Gets buffer start
  3399.     PUSH    H
  3400.     XCHG
  3401.     MVI    A,6
  3402.     CALL    ADDA
  3403.     MOV    E,M    ; FCB addr
  3404.     INX    H
  3405.     MOV    D,M
  3406.     INX    H
  3407.     MOV    C,M    ; Sector size
  3408.     POP    H    ; Ready to go
  3409.     RET
  3410.     END
  3411. >>> SOUNDX.MAC    820820:2357
  3412. ; FILE:    SOUNDX.MAC
  3413. ; DATE:    820819:2119
  3414. ; FOR:    Generate Soundex code for <HL> -> <DE>
  3415.     TITLE    SOUNDX - Make Soundex code
  3416.     .8080
  3417. FLEN    EQU    20
  3418. BUFFER:    DS    FLEN
  3419.     DB    0FFH
  3420. TABLE:    DB    0,1,2,3,0,1,2
  3421.     DB    0,0,2,2,4,5,5
  3422.     DB    0,1,2,6,2,3,0
  3423.     DB    1,0,2,0,2
  3424. ; Call with name to encode at <HL>
  3425. ; Code is stored as 4 bytes at <DE>
  3426. SOUNDX:: PUSH    D
  3427.     PUSH    B
  3428.     PUSH    PSW
  3429.     PUSH    D
  3430.     PUSH    H
  3431.     LXI    H,BUFFER
  3432.     MVI    C,20
  3433. SX0:    MVI    M,0
  3434.     INX    H
  3435.     DCR    C
  3436.     JNZ    SX0
  3437.     POP    H
  3438.     LXI    B,BUFFER
  3439.     MOV    A,M
  3440.     INX    H
  3441.     STAX    B
  3442.     INX    B
  3443. SX1:    MOV    A,M
  3444.     INX    H
  3445.     SUI    'A'
  3446.     JC    SX3
  3447.     CPI    26
  3448.     JNC    SX3
  3449.     LXI    D,TABLE
  3450.     ADD    E
  3451.     MOV    E,A
  3452.     JNC    SX2
  3453.     INR    D
  3454. SX2:    LDAX    D
  3455.     STAX    B
  3456.     INX    B
  3457.     LDAX    B
  3458.     ORA    A
  3459.     JZ    SX1
  3460. SX3:    XTHL
  3461.     LXI    D,BUFFER
  3462.     MVI    C,FLEN-1
  3463.     MVI    B,3
  3464.     LDAX    D
  3465.     MOV    M,A
  3466.     INX    D
  3467. SX4:    LDAX    D
  3468.     INX    D
  3469.     ORA    A
  3470.     JZ    SX5
  3471.     CMP    M
  3472.     JZ    SX5
  3473.     INX    H
  3474.     MOV    M,A
  3475.     DCR    B
  3476.     JZ    SX7
  3477. SX5:    DCR    C
  3478.     JNZ    SX4
  3479.     XRA    A
  3480. SX6:    INX    H
  3481.     MOV    M,A
  3482.     DCR    B
  3483.     JNZ    SX6
  3484. SX7:    POP    H
  3485.     POP    PSW
  3486.     POP    B
  3487.     POP    D
  3488.     RET
  3489.     END
  3490. >>> SPXCH.MAC    820820:2357
  3491. ; FILE:    SPXCH.MAC
  3492. ; DATE:    820819:2235
  3493. ; FOR:    Exchange stack pointers
  3494.     .8080
  3495.     TITLE    SPXCH - exchange stack pointers
  3496. ; ..with new SP in HL
  3497. SPXCH::    XCHG
  3498.     LXI    H,2    ; skip this call
  3499.     DAD    SP    ; new AT DE, old IN HL
  3500.     XCHG
  3501.     MOV    A,M    ; new SP.0
  3502.     MOV    M,E    ; old SP.0
  3503.     MOV    E,A
  3504.     INX    H
  3505.     MOV    A,M    ; SP.1
  3506.     MOV    M,D
  3507.     MOV    D,A
  3508.     POP    H    ; ret addr
  3509.     XCHG
  3510.     SPHL
  3511.     XCHG
  3512.     PCHL
  3513.     END
  3514. >>> STDIO.MAC    820820:2357
  3515. ; FILE:    STDIO.MAC
  3516. ; DATE:    820819:1302
  3517. ; FOR:    Standard input and output channel nos.
  3518.     .8080
  3519.     CSEG
  3520. STDIN::    DB    0
  3521. STDOUT:: DB    0
  3522.     END
  3523. >>> TABBER.MAC    820820:2357
  3524. ; FILE:    TABBER.MAC
  3525. ; DATE: 820820:1520
  3526. ; FOR:    Write spaces to std output till col. A
  3527.  
  3528.     TITLE    TABBER - tab std output
  3529.     .8080
  3530.     EXT    STDOUT,TABBRF
  3531. TABBER:: PUSH    B
  3532.     MOV    B,A
  3533.     LDA    STDOUT
  3534.     MOV    C,A
  3535.     MOV    A,B
  3536.     CALL    TABBRF
  3537.     POP    B
  3538.     RET
  3539.     END
  3540. >>> TABBRF.MAC    820820:2357
  3541. ; FILE:    TABBRF.MAC
  3542. ; DATE: 820825:2325
  3543. ; FOR:    Write blanks to chan. C till col. A
  3544.  
  3545.     TITLE    TABBRF - tab to col. A
  3546.     .8080
  3547.     .XLIST
  3548.     INCLUDE SYSEQU
  3549.     .LIST
  3550.     EXT    PUTCF,FNDCNT,CRLFF
  3551. TABBRF:: PUSH    B
  3552.     PUSH    H
  3553.     MOV    B,A
  3554.     MVI    A,2
  3555.     CALL    FNDCNT
  3556. TB0:    MOV    A,B
  3557.     CMP    M
  3558.     CC    CRLFF
  3559.     JZ    DONE
  3560.     MVI    A,BLANK
  3561.     CALL    PUTCF
  3562.     JMP    TB0
  3563. DONE:    MOV    A,B
  3564.     POP    H
  3565.     POP    B
  3566.     RET
  3567.     END
  3568. >>> TYPAHD.MAC    820901:1338
  3569. ; FILE:    TYPAHD.MAC
  3570. ; DATE: 820901:1230
  3571. ; For:  Disable CONIN, set up typeahead buffer
  3572.     .8080
  3573.     TITLE    TYPAHD - typeahead buffer
  3574.     .XLIST
  3575.     INCLUDE LINKEQU
  3576.     .LIST
  3577.     IF    LYNX
  3578. $MEMRY    EQU    108H
  3579.     ELSE
  3580.     EXT    $MEMRY
  3581.     ENDIF
  3582. KEYBD    EQU    28H    ; Interrupt vector here
  3583. KBDPT    EQU    0F8H    ; Keyboard port
  3584. TYPAHD:: PUSH    H
  3585.     PUSH    D
  3586.     LHLD    $MEMRY
  3587.     INR    H
  3588.     MVI    L,0
  3589.     SHLD    INPNT
  3590.     SHLD    OUTPNT
  3591.     INR    H
  3592.     SHLD    $MEMRY
  3593.     LXI    D,KSR
  3594.     LXI    H,KEYBD
  3595.     DI
  3596.     MVI    M,JMP
  3597.     INX    H
  3598.     MOV    M,E
  3599.     INX    H
  3600.     MOV    M,D
  3601.     EI
  3602.     POP    D
  3603.     POP    H
  3604.     RET
  3605. KSR:    PUSH    H
  3606.     PUSH    PSW
  3607.     LHLD    INPNT
  3608.     IN    KBDPT
  3609.     ANI    7FH
  3610.     MOV    M,A
  3611.     INR    L
  3612.     SHLD    INPNT
  3613.     POP    PSW
  3614.     POP    H
  3615.     EI
  3616.     RET
  3617. KEY::    PUSH    H
  3618.     LHLD    INPNT
  3619.     MOV    A,L
  3620.     LHLD    OUTPNT
  3621.     SUB    L
  3622.     JZ    READ
  3623.     MOV    A,M
  3624.     INR    L
  3625.     SHLD    OUTPNT
  3626. READ:    POP    H
  3627.     RET
  3628. INPNT:    DS    2
  3629. OUTPNT:    DS    2
  3630.     END
  3631. >>> UPCASE.MAC    820820:2357
  3632. ; FILE:    UPCASE.MAC
  3633. ; DATE: 820819:1332
  3634. ; FOR:    Make A uppercase
  3635.  
  3636.     TITLE    UPCASE - Make A uppercase
  3637.     .8080
  3638. UPCASE:: CPI    'a'
  3639.     RC
  3640.     CPI    'z'+1
  3641.     RNC
  3642.     ANI    0DFH
  3643.     RET
  3644.     END
  3645.