home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug006.ark / CCOS1.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  33.7 KB  |  2,466 lines

  1.     ORG    04000H    ;ORG FOR CPM
  2. *---> DEFINE LOCATION OF READ/WRITE WORK AREA
  3. WORKA    EQU    05800H    ;FILE WORK AREA, SYMBOL TBL
  4. *--> FOLLOWING IS A JMP TABLE TO MAJOR
  5. *    CCOS INPUT/OUTPUT ROUTINES, ETC.
  6.     JMP    CCOS    ;CCOS STARTUP, NO FILE INIT
  7.     JMP    INIT    ;INIT FILE TABLE
  8.     JMP    KEYIN    ;PRIMARY KEYBOARD INPUT
  9.     JMP    TYPE    ;PRIMARY OUTPUT
  10.     JMP    ALTO1    ;ALT OUT 1
  11.     JMP    ALTO2    ;ALT OUT 2
  12.     JMP    TTYO    ;TTY OUTPUT
  13.     JMP    DSPLY    ;VDM OUT (ONLY)
  14.     JMP    QCHEK    ;HI SPEED (NO WAIT) CTL-Q CHK
  15.     JMP    XO    ;HEX OUTPUT FROM A
  16.     JMP    XOB    ;HEX OUT FROM A W/BLANK
  17.     JMP    TINTI    ;TAPE INIT FOR INPUT
  18.     JMP    TINTO    ;TAPE INIT FOR OUTPUT
  19.     JMP    TPIN    ;TAPE IN
  20.     JMP    TPOUT    ;TAPE OUT
  21.     JMP    TPINC    ;TAPE IN, CKSUM W/B
  22.     JMP    TPOTC    ;TAPE OUT, CKSUM W/B
  23. *---> TTY OUTPUT NULL COUNT
  24. NULLS    DB    1    ;1+# OF NULLS AFTER C/R
  25. * * * * * * * * N O T E * * * * * * * *
  26. * ALL THE INPUT/OUTPUT (I/O) ROUTINES *
  27. * IN CCOS ARE GROUPED TOGETHER JUST   *
  28. * BELOW THIS NOTE.  YOU NEED ONLY     *
  29. * CHANGE THESE ROUTINES TO MAKE CCOS  *
  30. * WORK FOR YOUR I/O.                  *
  31. *
  32. * CCOS - THE CACHE CASSETTE OPERATING SYSTEM
  33. * A MODIFICATION OF PROCESSOR TECHNOLOGY PKG 1
  34. *
  35. *---> DEFINE VDM INFORMATION
  36. VDMST    EQU    0E000H    ;<---VDM START ADDR
  37. CURS    EQU    0FA00H    ;<---VDM CURSOR POINTER
  38. IOBYT    EQU    CURS-1    ;I/O BYTE
  39. VDMEP    EQU    0E4H    ;PAGE AFTER VDM
  40. VDMP    EQU    0E0H    ;VDM PORT
  41. *---> MISCELLANEOUS EQUATES
  42. STOP    EQU    'X'-40H    ;KEYBOARD INPUT VALUE
  43. *          (CTL-X) TO STOP LISTING
  44. HOLD    EQU    1BH    ;HOLD SCROLL (ESCAPE) CHAR
  45. *---> KEYBOARD (PRIMARY INPUT) EQUATES
  46. KEYSP    EQU    0    ;KEYBOARD STATUS PORT
  47. KEYSB    EQU    1    ;KEYBOARD STATUS BIT
  48. KEYSV    EQU    0    ;VALUE WHEN READY
  49. KEYDP    EQU    1    ;KEYBOARD INPUT PORT
  50. *---> ALTERNATE INPUT (KEY, MODEM) EQUATES
  51. AISP    EQU    4    ;ALT INP STATUS PORT
  52. AISB    EQU    1    ;ALT INP STATUS BIT
  53. AISV    EQU    1    ;ALT INP STAT READY VALUE
  54. AIDP    EQU    5    ;ALT INPUT DATA PORT
  55. *---> TTY OUTPUT PORT DEFINITION
  56. TTOSP    EQU    0    ;TTY STATUS PORT
  57. TTOSB    EQU    80H    ;TTY STATUS BIT
  58. TTOSV    EQU    0    ;TTY OUT READY VALUE
  59. TTODP    EQU    1    ;TTY OUTPUT DATA PORT
  60. *---> ALT OUTPUT PORT EQU'S
  61. AO1SP    EQU    4    ;ALT OUT 1 STATUS PORT
  62. AO1SB    EQU    2    ;ALT OUT 1 STATUS BIT
  63. AO1SV    EQU    2    ;ALT OUT 1 STAT READY VALUE
  64. AO1DP    EQU    5    ;ALT OUT 1 DATA PORT
  65. *---> ALT OUTPUT PORT EQU'S
  66. AO2SP    EQU    4    ;ALT OUT 2 STATUS PORT
  67. AO2SB    EQU    2    ;ALT OUT 2 STATUS BIT
  68. AO2SV    EQU    2    ;ALT OUT 2 STAT READY VALUE
  69. AO2DP    EQU    5    ;ALT OUT 2 DATA PORT
  70. *---> KEYBOARD STATUS CHECK ROUTINE
  71. KEYST    IN    KEYSP    ;READ KB STATUS
  72.     ANI    KEYSB    ;AND WITH STATUS BIT
  73.     CPI    KEYSV    ;ZERO INDICATOR IF READY
  74.     RET         ;..THEN RETURN
  75. *---> ALTERNATE INPUT DEV INPUT RTN
  76. ALTIN    LDA    IOBYT    ;GET I/O BYTE
  77.     ANI    40H    ;ISOLATE ALT INP FLAG
  78.     JZ    KEYIN    ;GO TO PRIMARY IF NO ALT
  79.     IN    AISP    ;READ ALT INP STATUS BYTE
  80.     ANI    AISB    ;ISOLATE READY BIT
  81.     CPI    AISV    ;CHECK ALT IN STAT VALUE
  82.     JNZ    KEYIN    ;GO TO PRIMARY IF NO DATA
  83.     IN    AIDP    ;READ ALT INP DATA PORT
  84.     RET         ;..AND RETURN
  85. *---> KEYBOARD INPUT ROUTINE TO B REG
  86. IN8    CALL    KEYIN    ;INPUT TO A
  87.     MOV    B,A    ;MOVE TO B
  88.     RET
  89. *---> KEYBOARD INPUT ROUTINE TO A REG
  90. KEYIN    CALL    KEYST
  91.     JNZ    ALTIN    ;TRY ALTERNATE INPUT
  92. KBIN    IN    KEYDP    ;READ KBD DATA PORT
  93.     ANI    7FH    ;DEL PARITY
  94.     CPI    'Q'-40H    ;CONTROL Q?
  95.     JZ    QUIT    ;..YES - RET TO CCOS
  96.     RET
  97. *---> 'QUIT' CHECK ROUTINE
  98. * ABORTS IF CTL-Q HAS BEEN TYPED,
  99. * OTHERWISE JUST RETURNS
  100. * (LIKE HI-SPEED CTL-C CHK IN BASIC)
  101. QCHEK    CALL    KEYST    ;CHECK STATUS
  102.     CZ    KBIN    ;READ CHR IF READY
  103.     RET
  104. *---> OUTPUT ROUTINE FROM B
  105. OUT8    MOV    A,B
  106.     JMP    TYPE
  107. *---> TTY OUTPUT ROUTINE - SENDS
  108. *     L/F, NULLS AFTER C/R
  109. TTYO    PUSH    PSW
  110.     IN    TTOSP    ;GET STAT
  111.     ANI    TTOSB    ;GET BIT
  112.     CPI    TTOSV    ;READY?
  113.     JNZ    TTYO+1    ;NO
  114.     POP    PSW    ;GET CHAR
  115.     OUT    TTODP    ;OUTPUT
  116.     CPI    13    ;C/R?
  117.     RNZ         ;RET IF NOT
  118.     MVI    A,10    ;GET L/F
  119.     CALL    TTYO    ;OUTPUT L/F
  120.     LDA    NULLS    ;GET NULL COUNT
  121.     PUSH    B    ;SAVE BC
  122.     MOV    B,A    ; SAVE NULL COUNT
  123. NULLO    MVI    A,7FH
  124.     CALL    TTYO
  125.     DCR    B    ;MORE NULLS?
  126.     JNZ    NULLO
  127.     POP    B
  128.     RET         ;FROM TTYO
  129. *---> ALT OUTPUT 1 SENDS L/F AFTER C/R
  130. *     ONLY IF 10H BIT ON IN IOBYTE
  131. * I.W. 'IOBYTE 11' CAUSES OUTPUT W/ L/F
  132. ALTO1    PUSH    PSW
  133.     IN    AO1SP    ;READ STAT
  134.     ANI    AO1SB    ;GET READY BIT
  135.     CPI    AO1SV    ;READY?
  136.     JNZ    ALTO1+1    ;LOOP TILL READY
  137.     POP    PSW
  138.     OUT    AO1DP    ;OUTPUT DATA
  139.     CPI    13    ;C/R?
  140.     RNZ         ;RET IF NOT C/R
  141. * SEND L/F IF IOBYTE 10H BIT IS ON
  142.     LDA    IOBYT
  143.     ANI    10H
  144.     MVI    A,10    ;GET L/F
  145.     CNZ    ALTO1
  146.     MVI    A,13    ;RESTORE C/R
  147.     RET
  148. *---> ALT OUTPUT 2 SENDS L/F AFTER C/R
  149. ALTO2    PUSH    PSW
  150.     IN    AO2SP    ;READ STAT
  151.     ANI    AO2SB    ;GET READY BIT
  152.     CPI    AO2SV    ;READY?
  153.     JNZ    ALTO2+1    ;LOOP TILL READY
  154.     POP    PSW
  155.     OUT    AO2DP    ;OUTPUT DATA
  156.     CPI    13    ;C/R?
  157.     RNZ         ;RET IF NOT C/R
  158.     MVI    A,10    ;GET LINEFEED
  159.     JMP    ALTO2    ;OUTPUT LINEFEED
  160. *--TARBELL CASSETTE I/O ROUTINES---*
  161. TBSP    EQU    6EH    ;TARBELL STAT PORT
  162. TBISB    EQU    10H    ;TARBELL INPUT READY BIT
  163. TBISV    EQU    0    ;TARBELL IN READY VALUE
  164. TBOSB    EQU    20H    ;TARBELL OUTPUT READY BIT
  165. TBOSV    EQU    0    ;TARBELL OUT READY VALUE
  166. TBDP    EQU    6FH    ;TARBELL DATA PORT
  167. START    EQU    3CH    ;TARBELL START BYTE
  168. SYNC    EQU    0E6H    ;TARBELL SYNC BYTE
  169. *---> TARBELL OUTPUT W/CHECKSUM
  170. TPOTC    PUSH    6
  171.     XRA    B
  172.     MOV    B,A
  173.     POP    6
  174. *---> TARBELL OUTPUT
  175. TPOUT    PUSH    6
  176.     CALL    QCHEK    ;ALLOW CTL-Q EXIT
  177.     IN    TBSP    ;READ TARBELL STATUS PORT
  178.     ANI    TBOSB    ;ISOLATE READY BIT
  179.     CPI    TBOSV    ;READY?
  180.     JNZ    TPOUT+1    ;..NO
  181.     POP    6    ;GET BYTE
  182.     OUT    TBDP    ;OUTPUT TARBELL DATA PORT
  183.     RET
  184. *---> TARBELL INPUT W/CHECKSUM
  185. TPINC    CALL    TPIN
  186.     PUSH    6
  187.     XRA    B    ;CALC CKSUM
  188.     MOV    B,A    ;PUT BACK TO B
  189.     POP    6
  190.     RET
  191. *---> TARBELL INPUT
  192. TPIN    CALL    QCHEK    ;ALLOW CTL-Q EXIT
  193.     IN    TBSP    ;TARBELL STATUS PORT
  194.     ANI    TBISB    ;ISOLATE READY BIT
  195.     CPI    TBISV    ;READY?
  196.     JNZ    TPIN    ;..NO
  197.     IN    TBDP    ;READ TARBELL DATA
  198.     RET
  199. *---> TARBELL OUTPUT INITIALIZE
  200. * WRITES START, SYNC, FILE NAME
  201. TINTO    MVI    A,START
  202.     CALL    TPOUT
  203.     MVI    A,SYNC
  204.     CALL    TPOUT
  205.     MVI    B,5
  206.     LXI    H,FBUF    ;POINT TO FILE NAME
  207.     CALL    SET1    ;ENSURE VDM OK
  208. TIOL    MOV    A,M    ;GET FILE NAME BYTE
  209.     CALL    TPOUT    ;OUT TO TARBELL
  210.     CALL    DSPLY    ;..AND VDM
  211.     INX    H
  212.     DCR    B    ;DONE?
  213.     JNZ    TIOL    ;NO
  214.     RET
  215. *---> TARBELL INITIALIZE FOR INPUT
  216. * READS UNTIL FILE NAME MATCH FOUND
  217. TINTI    EQU    $
  218.     MVI    A,10H    ;TARBELL RESET
  219.     OUT    TBSP    ;OUT STAT PORT
  220.     LXI    B,5    ;FILENAME LENGTH
  221.     LXI    H,FBUF    ;FILENAME ADDR
  222.     CALL    SET1    ;VDM ADDR
  223. TINTL    CALL    TPIN
  224.     CMP    M
  225.     JZ    TINTM
  226.     INR    B    ;BUMP NOT = COUNT
  227. TINTM    CPI    ' '    ;' PRINTABLE?
  228.     JC    TINTI    ;-DON'T PRT IF BAD
  229.     ORA    A
  230.     JM    TINTI    ;HI BIT ON - BAD
  231.     CALL    DSPLY
  232.     INX    H
  233.     DCR    C
  234.     JNZ    TINTL
  235.     DCR    B
  236.     RM
  237.     JMP    TINTI
  238. *---> OUTPUT ROUTINE, TO VDM + ALTERNATES 1,
  239. *     AND/OR 2 AND/OR TTY ACCORDING TO IOBYTE
  240. TYPE    PUSH    B    ;SAVE BC
  241.     MOV    C,A    ;CHAR TO C
  242. * OUTPUT TO VDM
  243.     CALL    DSPLY
  244.     LDA    IOBYT    ;GET I/O BYTE
  245.     MOV    B,A    ;SAVE IN B
  246. * OUTPUT ALTERNATE 1?
  247.     ANI    1    ;ALT 1 OUTPUT?
  248.     MOV    A,C
  249.     CNZ    ALTO1    ;ALT OUTPUT 1
  250. * OUTPUT ALTERNATE 2?
  251.     MOV    A,B    ;GET IOBYTE
  252.     ANI    2    ;ALT 2 OUTPUT?
  253.     MOV    A,C    ;CHAR TO A
  254.     CNZ    ALTO2    ;ALT OUTPUT 2
  255. * OUTPUT TO TTY?
  256.     MOV    A,B    ;GET IOBYTE
  257.     ANI    4    ;TTY OUTPUT?
  258.     MOV    A,C    ;GET CHAR
  259.     CNZ    TTYO    ;TTY OUTPUT
  260.     MOV    A,C    ;GET CHAR
  261.     POP    B    ;RESTORE BC
  262.     RET
  263. DSPLY    PUSH    H    ;SAVE HL
  264.     LHLD    CURS    ;GET CURSOR
  265.     CPI    0DH    ;C/R?
  266.     JZ    ISCR    ;..YES
  267.     CPI    'H'-40H    ;BACKSPACE?
  268.     JNZ    NOTBS    ;..NO
  269.     MVI    M,' '    ;' BKSP: DELETE CURSOR
  270.     DCX    H    ;..BACK UP,
  271.     JMP    SVCUR    ;..THEN STORE CURSUR
  272. NOTBS    MOV    M,A    ;SAVE INCOMING CHAR
  273.     INX    H    ;BUMP POINTER
  274. CKEOS    MOV    A,H    ;CHECK END OF SCREEN
  275.     CPI    VDMEP    ;END OF SCRN?
  276.     JZ    SCRUP    ;SCROLL UP IF AT END
  277.     ANI    VDMEP-1    ;OTHERWISE JUST
  278.     ORI    VDMEP-4    ;..ENSURE ON VDM
  279.     MOV    H,A    ;MOVE BACK
  280. SVCUR    SHLD    CURS
  281. CURON    MVI    M,' '
  282.     POP    H
  283.     RET
  284. ISCR    CALL    BLANK
  285.     JMP    CKEOS
  286. SCRUP    PUSH    D
  287.     LXI    H,VDMST
  288.     LXI    D,VDMST+40H
  289. VDMUP    LDAX    D
  290.     MOV    M,A
  291.     INX    H
  292.     INX    D
  293.     MOV    A,D
  294.     CPI    VDMEP    ;PAST VDM?
  295.     JNZ    VDMUP
  296.     POP    D
  297.     LXI    H,VDMST+3C0H
  298.     SHLD    CURS
  299.     MVI    M,' '
  300.     INX    H
  301.     CALL    BLANK
  302.     POP    H
  303.     CALL    KBIN    ;READ KB, NO WAIT
  304.     CPI    HOLD    ;HOLD CHAR?
  305.     RNZ
  306.     CALL    KEYIN    ;READ CHAR
  307.     CPI    'B'    ;<--BASIC?
  308.     JZ    0    ;<-C-A-U-T-I-O-N JMP 0!!
  309.     RET
  310. BLANK    MVI    M,' '    ;'
  311.     INX    H
  312.     MOV    A,L
  313.     ANI    3FH
  314.     JNZ    BLANK
  315.     RET
  316. *---> ENTRY POINT, CLEAR FILE TABLE FIRST
  317. INIT    MVI    C,INSP-FILE0    ;FILE TABLE LENGTH
  318.     XRA    A    ;A=0
  319.     LXI    H,FILE0    ;POINT TO FILE TABLE
  320. INIT2    MOV    M,A
  321.     INX    H
  322.     DCR    C
  323.     JNZ    INIT2
  324. *---> INIT SERIAL I/O PORT
  325.     MVI    A,3    ;GET RESET CHAR
  326.     OUT    4
  327.     MVI    A,15H    ;GET CONTROL VALUE
  328.     OUT    4
  329. *---> REPL FOLLOWING JMP W/ CALL TO FURTHER
  330. *     INITIALIZATION CODE YOU MAY NEED
  331.     JMP    QUIT    ;DUMMY JMP TO ALLOW PATCH
  332. QUIT    XRA    A
  333.     OUT    VDMP    ;RESET VDM
  334.     STA    IOBYT    ;RESET I/O BYTE
  335.     LXI    SP,AREA+18    ;INIT STACK
  336.     LXI    H,VDMST
  337.     SHLD    CURS
  338.     LXI    H,QUITM
  339.     CALL    SCRN
  340.     CALL    CRLF
  341. *---> PRIMARY ENTRY POINT W/O CLEARING FILES
  342. CCOS    LXI    SP,AREA+18
  343.     CALL    READ    ;READ INPUT LIST
  344.     INX    H    ;SKIP LENGTH BYTE
  345.     MOV    A,M    ;LOAD 1ST CHAR OF COMMAND
  346.     CPI    '9'+1    ;LINE NUMBER?
  347.     JC    LINE    ;..YES
  348.     CALL    VALC    ;GET COMMAND VALUES
  349.     CALL    COMM    ;LOOKUP/EXECUTE COMMAND
  350. *---> RETURN FROM COMMAND EXECUTION
  351. EOR    CALL    CRLF
  352.     JMP    CCOS
  353. *---> 'QUIT' MESSAGE
  354. QUITM    DW    'QU'
  355.     DW    'IT'
  356.     DB    13
  357. *---> READ INPUT LINE INTO INBUF
  358. READ    LXI    H,IBUF
  359.     SHLD    ADDS
  360.     MVI    E,2
  361. NEXT    CALL    IN8
  362.     MOV    A,B
  363.     CPI    'X'-40H    ;CTL-X? (DELETES LINE)
  364.     JNZ    CR
  365.     CALL    CRLF
  366.     JMP    READ
  367. CR    CPI    13
  368.     JNZ    DEL
  369.     MOV    M,A    ;STORE C/R
  370.     MOV    A,E
  371.     CPI    2    ;NO DATA IN LINE?
  372.     JZ    READ    ;JMP IF C/R AND NO DATA READ
  373.     INX    H
  374.     MVI    M,1
  375.     INX    H
  376.     LXI    B,SYMT    ;END OF INBUF ADDR
  377.     MOV    A,C
  378.     CALL    CLER    ;CLEAR REMAINDER OF INPUT BUFF
  379.     LXI    H,IBUF-1
  380.     MOV    M,E
  381.     RET
  382. DEL    CPI    7FH    ;DELETE CHAR?
  383.     JNZ    CHAR
  384.     MOV    A,E    ;<<MOD>>
  385.     CPI    2    ;<<MOD>>
  386.     JZ    NEXT
  387.     DCX    H
  388.     DCR    E
  389. BSPA    MVI    B,08H    ;ECHO BACKSPACE CHAR
  390.     CALL    OUT8
  391.     JMP    NEXT
  392. CHAR    CPI    ' '    ;'
  393.     JC    NEXT
  394.     CPI    80H    ;<<MINOR MOD - ALLOW TO 7FH>>
  395.     JNC    NEXT
  396.     MOV    B,A
  397.     CALL    OUT8    ;ECHO
  398.     MOV    M,A
  399.     MOV    A,E    ;<<MOD>> TO ENSURE LINE
  400.     CPI    80    ;<<MOD>> ..IS < 80 LONG
  401.     JZ    BSPA
  402.     INX    H
  403.     INR    E
  404.     JMP    NEXT
  405. * BLANK AN AREA UNTIL L=A
  406. CLER    CMP    L
  407.     RZ
  408.     MVI    M,' '    ;'
  409.     INX    H
  410.     JMP    CLER
  411. CRLF    MVI    B,0DH
  412.     CALL    OUT8
  413.     RET         ;RET W/ NO LF OR DEL
  414. *---> EXEC COMMAND
  415. EXEC    CALL    VCHK    ;CHECK VALUE
  416.     CALL    CRLF    ;C/R
  417.     LHLD    BBUF    ;GET ADDR
  418.     PCHL         ;EXEC PROG
  419. *---> OUTPUT COMMAND: OUT PORT VAL
  420. OUTPU    CALL    VCHK    ;CHECK VALUE
  421.     CALL    CRLF    ;C/R
  422. * BBUF = PP 00 VV 00 (PP=PORT, VV=VALUE)
  423.     LXI    H,BBUF    ;POINT TO PP 
  424.     MOV    B,M    ;B=PORT
  425.     MVI    M,0D3H    ;STORE 'OUT' OP CODE
  426.     INX    H
  427.     MOV    M,B    ;STORE OUTPUT ADDR
  428.     INX    H    ;POINT TO DATA
  429.     MOV    A,M    ;GET DATA
  430.     MVI    M,0C9H    ;STORE 'RET' OP CODE
  431. * BBUF NOW = D3 PP C9
  432.     JMP    BBUF    ;GO 'OUT PP, RET'
  433. *---> ROUTINE TO SET I/O BYTE
  434. SETIO    CALL    CRLF
  435.     LXI    H,IOBYT    ;POINT TO IOBYTE
  436.     MOV    C,M    ;GET OLD IOBYTE
  437.     LXI    D,ISMSG    ;'IS '
  438.     LDA    ABUF    ;CHECK PARM
  439.     ORA    A    ;NONE?
  440.     JZ    IOBTY    ;TYPE 'IS XX'
  441.     LXI    D,IOMSG    ;GET 'WAS ' MSG
  442.     LDA    BBUF    ;GET NEW
  443.     MOV    M,A    ;STORE
  444. IOBTY    XCHG         ;MSG ADDR TO HL
  445.     CALL    SCRN    ;OUTPUT MSG
  446.     MOV    A,C    ;GET OLD IOBYTE
  447.     JMP    HOUT    ;OUTPUT IN HEX, RETURN
  448. IOMSG    DW    'WA'    ;'WAS ' MSG
  449.     DW    'S '    ;S'
  450.     DB    13    ;C/R END OF MSG
  451. ISMSG    DW    'IS'    ;'IS '
  452.     DB    ' '    ;'
  453.     DB    13    ;END OF MSG
  454. *---> COMMAND LOOKUP ROUTINE
  455. COMM    LXI    D,CTAB
  456.     MVI    B,NCOM    ;<--- MAX # OF COMMANDS
  457.     MVI    A,4
  458.     STA    NCHR
  459.     CALL    COMS
  460.     JNZ    WHAT
  461.     PCHL         ;EXECUTE COMMAND
  462. COMS    LHLD    HCON
  463.     LDA    NCHR
  464.     MOV    C,A
  465.     CALL    SEAR
  466.     LDAX    D
  467.     MOV    L,A
  468.     INX    D
  469.     LDAX    D
  470.     MOV    H,A
  471.     RZ
  472.     INX    D
  473.     DCR    B
  474.     JNZ    COMS
  475.     INR    B
  476.     RET
  477. *---> COMPARE RTN, DE TO HL, LENGTH IN C
  478. SEAR    LDAX    D
  479.     CMP    M
  480.     JNZ    INCA
  481.     INX    H
  482.     INX    D
  483.     DCR    C
  484.     JNZ    SEAR
  485.     RET
  486. *---> COMPARE DIDN'T MATCH - BUMP D TO END
  487. INCA    INX    D
  488.     DCR    C
  489.     JNZ    INCA
  490.     INR    C
  491.     RET
  492. *---> ROUTINE TO ZERO A BUFFER
  493. ZBUF    XRA    A
  494.     LXI    D,ABUF+12
  495.     MVI    B,12
  496. ZBU1    DCX    D
  497.     STAX    D
  498.     DCR    B
  499.     JNZ    ZBU1
  500.     RET
  501. *---> CHECK COMMAND VALUES
  502. VALC    CALL    ETRA
  503.     JC    WHAT
  504.     RET
  505. ETRA    LXI    H,0
  506.     SHLD    BBUF+2
  507.     SHLD    FBUF
  508.     CALL    ZBUF
  509.     LXI    H,IBUF-1
  510. VAL1    INX    H
  511.     MOV    A,M
  512.     CPI    ' '    ;'
  513.     CMC
  514.     RNC
  515.     JNZ    VAL1
  516.     SHLD    PNTR
  517.     CALL    SBLK
  518.     CMC
  519.     RNC
  520.     CPI    '/'    ;START OF FILE NAME?
  521.     JNZ    VAL5
  522.     LXI    D,FBUF
  523.     MVI    C,NL
  524. VAL2    INX    H
  525.     MOV    A,M
  526.     CPI    '/'
  527.     JZ    VAL3
  528. VAL2A    DCR    C
  529.     JM    WHAT
  530.     STAX    D
  531.     INX    D
  532.     JMP    VAL2
  533. VAL3    MVI    A,' '    ;'
  534. VAL4    DCR    C
  535.     JM    DONE
  536.     STAX    D
  537.     INX    D
  538.     JMP    VAL4
  539. DONE    CALL    SBL2
  540.     CMC
  541.     RNC
  542. VAL5    LXI    D,ABUF
  543.     CALL    ALPS
  544.     MOV    A,B
  545.     CPI    NL
  546.     CMC
  547.     RC
  548.     LXI    B,ABUF
  549.     CALL    AHEX
  550.     RC
  551.     SHLD    BBUF
  552.     LXI    H,ABUF
  553.     CALL    NORM
  554.     CALL    SBLK
  555.     CMC
  556.     RNC
  557.     LXI    D,ABUF+4
  558.     CALL    ALPS
  559.     MOV    A,B
  560.     CPI    5
  561.     CMC
  562.     RC
  563.     LXI    B,ABUF+4
  564.     CALL    AHEX
  565.     RC
  566.     SHLD    BBUF+2
  567.     LXI    H,ABUF+4
  568.     CALL    NORM
  569.     ORA    A
  570.     RET
  571. ADEC    LXI    H,0
  572. ADE1    LDAX    B
  573.     ORA    A
  574.     RZ
  575.     MOV    D,H
  576.     MOV    E,L
  577.     DAD    H
  578.     DAD    H
  579.     DAD    D
  580.     DAD    H
  581.     SUI    '0'
  582.     CPI    0AH
  583.     CMC
  584.     RC
  585.     MOV    E,A
  586.     MVI    D,0
  587.     DAD    D
  588.     INX    B
  589.     JMP    ADE1
  590. AHEX    LXI    H,0
  591. AHE1    LDAX    B
  592.     ORA    A
  593.     RZ
  594.     DAD    H
  595.     DAD    H
  596.     DAD    H
  597.     DAD    H
  598.     CALL    AHS1
  599.     CPI    10H
  600.     CMC
  601.     RC
  602.     ADD    L
  603.     MOV    L,A
  604.     INX    B
  605.     JMP    AHE1
  606. AHS1    SUI    '0'
  607.     CPI    0AH
  608.     RC
  609.     SUI    07H
  610.     RET
  611. HOUT    CALL    BINH
  612. HOUT1    LXI    H,HCON
  613.     MOV    B,M
  614.     CALL    OUT8
  615.     INX    H
  616.     MOV    B,M
  617.     CALL    OUT8
  618.     RET
  619. *---> HEX OUT W/BLANK.  BC, HL CLOBBERED
  620. HOTB    CALL    HOUT
  621.     CALL    BLK1
  622.     RET
  623.     CALL    BIND
  624.     CALL    HOUT1
  625.     INX    H
  626.     MOV    B,M
  627.     CALL    OUT8
  628.     RET
  629. BLK1    MVI    B,' '    ;'
  630.     CALL    OUT8
  631.     RET
  632. ACHK    LHLD    BBUF
  633.     LDA    BBUF+3
  634.     CMP    H
  635.     JNZ    ACH1
  636.     LDA    BBUF+2
  637.     CMP    L
  638.     JNZ    ACH1
  639.     STC
  640. ACH1    INX    H
  641.     SHLD    BBUF
  642.     RET
  643. SCRN    MOV    B,M
  644.     MVI    A,0DH
  645.     CMP    B
  646.     RZ
  647.     CALL    OUT8
  648.     INX    H
  649.     JMP    SCRN
  650. BINH    LXI    H,HCON
  651. BINH2    MOV    B,A
  652.     RAR
  653.     RAR
  654.     RAR
  655.     RAR
  656.     CALL    BIN1
  657.     MOV    M,A
  658.     INX    H
  659.     MOV    A,B
  660.     CALL    BIN1
  661.     MOV    M,A
  662.     RET
  663. BIN1    ANI    0FH
  664.     ADI    '0'
  665.     CPI    '9'+1
  666.     RC
  667.     ADI    07H
  668.     RET
  669. BIND    LXI    H,HCON
  670.     MVI    B,100
  671.     CALL    BID1
  672. BIND2    MVI    B,10
  673.     CALL    BID1
  674.     ADI    '0'
  675.     MOV    M,A
  676.     RET
  677. BID1    MVI    M,'0'-1
  678. BID12    INR    M
  679.     SUB    B
  680.     JNC    BID12
  681.     ADD    B
  682.     INX    H
  683.     RET
  684. VCHK    LDA    ABUF
  685.     ORA    A
  686.     JZ    WHAT
  687.     RET
  688. *---> DUMP
  689. DUMP    CALL    VCHK
  690.     MVI    A,10H
  691.     STA    SCNT
  692. DUMS    CALL    CRLF
  693.     LDA    BBUF+1
  694.     CALL    HOUT
  695.     LDA    BBUF
  696.     CALL    HOTB
  697.     LDA    SCNT
  698. DUM1    STA    DCNT
  699.     LHLD    BBUF
  700.     MOV    A,M
  701. DUM2    CALL    HOTB
  702.     CALL    QCHEK    ;ALLOW CTL-Q
  703.     CALL    ACHK
  704.     RC
  705.     LDA    DCNT
  706.     DCR    A
  707.     JNZ    DUM1
  708.     JMP    DUMS
  709. *---> PAGE COMMAND
  710. PAGE    CALL    VCHK
  711.     LDA    ABUF+4
  712.     ORA    A
  713.     JZ    WHAT
  714.     LHLD    BBUF
  715.     XCHG
  716.     LHLD    BBUF+2
  717.     MVI    B,0
  718. PAG1    MOV    A,E
  719.     MOV    A,D
  720.     CPI    -1
  721.     LDAX    D
  722.     JNZ    PAG2
  723. PAG2    MOV    M,A
  724.     INX    H
  725.     INX    D
  726.     DCR    B
  727.     JNZ    PAG1
  728.     RET
  729. *---> FILE COMMAND
  730. FILE    CALL    CRLF
  731.     LDA    FBUF
  732.     ORA    A
  733.     JZ    FOUT
  734.     CALL    FSEA
  735.     XCHG    
  736.     JNZ    TEST
  737.     LDA    ABUF
  738.     ORA    A
  739.     JZ    WHA1
  740.     LDA    FEF
  741.     ORA    A
  742.     JNZ    ROOM
  743.     LXI    H,EMES1
  744.     JMP    MESS
  745. TEST    LDA    ABUF
  746.     ORA    A
  747.     JZ    SWAPS
  748.     LHLD    BBUF
  749.     MOV    A,H
  750.     ORA    L
  751.     JZ    SWAPS
  752.     LXI    H,EMES2
  753.     JMP    MESS
  754. ROOM    LHLD    FREAD
  755.     XCHG    
  756.     LXI    H,FBUF
  757.     PUSH    D
  758.     MVI    C,NMLEN
  759. MOV23    MOV    A,M
  760.     STAX    D
  761.     INX    D
  762.     DCR    C
  763.     JMP    PATCH
  764. PRET    POP    D
  765. SWAPS    LXI    H,FILE0
  766.     MVI    C,NMLEN+8
  767. SWAP    LDAX    D
  768.     MOV    B,M
  769.     MOV    M,A
  770.     MOV    A,B
  771.     STAX    D
  772.     INX    D
  773.     INX    H
  774.     DCR    C
  775.     JNZ    SWAP
  776.     LDA    ABUF
  777.     ORA    A
  778.     JZ    FOOT
  779.     LHLD    BBUF
  780.     SHLD    BOFP
  781.     SHLD    EOFP
  782.     MOV    A,L
  783.     ORA    H
  784.     JZ    FIL35
  785.     MVI    M,1
  786. FIL35    XRA    A
  787.     STA    MAXL
  788.     JMP    FOOT
  789. FOUT    LDA    IBUF+4
  790.     CPI    'S'
  791.     MVI    C,MAXFL    ;MAX FILES
  792.     JZ    FOUL
  793. FOOT    MVI    C,1
  794. FOUL    LXI    H,FILE0
  795.     MOV    A,C
  796. FINE    STA    FOCNT
  797.     PUSH    H
  798.     LXI    D,NMLEN
  799.     DAD    D
  800.     MOV    A,M
  801.     ORA    A
  802.     JNZ    FOOD
  803.     INX    H
  804.     ADD    M
  805.     INX    H
  806.     JNZ    FOOD
  807.     INX    SP
  808.     INX    SP
  809.     INX    H
  810.     INX    H
  811.     JMP    FEET
  812. FOOD    POP    H
  813.     MVI    C,NMLEN
  814. FAST    MOV    B,M
  815.     CALL    OUT8
  816.     DCR    C
  817.     INX    H
  818.     JNZ    FAST
  819.     CALL    FOOL
  820.     CALL    FOOL
  821.     CALL    CRLF
  822. FEET    LXI    D,4
  823.     DAD    D
  824.     LDA    FOCNT
  825.     DCR    A
  826.     JNZ    FINE
  827.     RET    
  828. FOOL    CALL    BLK1
  829.     INX    H
  830.     MOV    A,M
  831.     DCX    H
  832.     PUSH    H
  833.     CALL    HOUT
  834.     POP    H
  835.     MOV    A,M
  836.     INX    H
  837.     INX    H
  838.     PUSH    H
  839.     CALL    HOTB
  840.     POP    H
  841.     RET    
  842. FSEA    XRA    A
  843.     STA    FEF
  844.     MVI    B,MAXFL
  845.     LXI    D,FILE0
  846. FSE10    LXI    H,FBUF
  847.     MVI    C,NMLEN
  848.     CALL    SEAR
  849.     PUSH    PSW
  850.     PUSH    D
  851.     LDAX    D
  852.     ORA    A
  853.     JNZ    FSE20
  854.     INX    D
  855.     LDAX    D
  856.     ORA    A
  857.     JNZ    FSE20
  858.     XCHG    
  859.     LXI    D,-6
  860.     DAD    D
  861.     SHLD    FREAD
  862.     MOV    A,D
  863.     STA    FEF
  864.     POP    H
  865.     POP    PSW
  866. FSE15    LXI    D,8
  867.     DAD    D
  868.     XCHG    
  869.     DCR    B
  870.     RZ        ;
  871.     JMP    FSE10
  872. FSE20    POP    H
  873.         POP     PSW
  874.         JNZ     FSE15
  875.         LXI      D,-5
  876.      DAD     D
  877.         MOV       A,D
  878.         ORA     A
  879.         RET
  880. *---> 'WHAT' ERROR MESSAGE PRINT
  881. WHAT    CALL    CRLF
  882. WHA1    LXI         H,EMES
  883. MESS    CALL    SCRN
  884.         JMP      EOR
  885. EMES    DB         'W'
  886.         DB      'H'
  887.         DB      'A'
  888.         DB      'T'
  889.         DB      '?'
  890.         DB      13
  891. EMES1    DB         'F'
  892.         DB      'U'
  893.         DB      'L'
  894.         DB      'L'
  895.         DB      13
  896. EMES2    DB         'N'
  897.         DB      'O'
  898.         DB      ' '
  899.         DB      'N'
  900.         DB      'O'
  901.         DB      13
  902. *---> ENTR COMMAND
  903. ENTR    CALL    VCHK
  904.         CALL     ENTS
  905.         JC     WHAT
  906.         CALL     CRLF
  907.         RET
  908. ENTS    CALL    CRLF
  909.         CALL     READ
  910.         LXI      H,IBUF
  911.         SHLD     PNTR
  912. ENT1    CALL    ZBUF
  913.         CALL     SBLK
  914.         JC     ENTS
  915.         CPI      '/'
  916.         RZ
  917.         CALL     ALPS
  918.         MOV       A,B
  919.         CPI      3
  920.         CMC
  921.         RC
  922.         LXI      B,ABUF
  923.         CALL     AHEX
  924.         RC
  925.         MOV       A,L
  926.         LHLD     BBUF
  927.         MOV       M,A
  928.         CALL     ACH1
  929.         JMP      ENT1
  930. *---> SOURCE FILE LINE INPUT ROUTINE
  931. LINE    MVI         C,4
  932.         LXI      H,IBUF-1
  933. LICK    INX         H
  934.         MOV       A,M
  935.         CPI      '0'
  936.         JC     WHAT
  937.         CPI      '9'+1
  938.         JNC     WHAT
  939.         DCR      C
  940.         JNZ     LICK
  941.         SHLD     ADDS
  942.         LXI      D,MAXL+3
  943.         CALL     COM0
  944.         JNC     INSR
  945.         INX      H
  946.         CALL     LODM
  947.         LXI      H,MAXL+3
  948.         CALL     STOM
  949.         LXI      D,IBUF-1
  950.         LHLD     EOFP
  951.         MVI      C,1
  952.         CALL     LMOV  
  953.         MOV       M,C
  954.         SHLD     EOFP
  955.         JMP      EOR
  956. INSR    CALL    FIN1
  957.         MVI      C,2
  958.         JZ     EQUL
  959.         DCR      C
  960. EQUL    MOV          B,M
  961.         DCX      H
  962.         MVI      M,2
  963.         SHLD     INSP
  964.         LDA     IBUF-1
  965.         DCR      C
  966.         JZ     LT
  967.         SUB      B
  968.         JZ     ZER0
  969.         JC     GT
  970. LT    LHLD    EOFP
  971.         MOV       D,H
  972.         MOV       E,L
  973.         CALL     ADR
  974.         SHLD     EOFP
  975.         MVI      C,2
  976.         CALL     RMOV  
  977.         JMP      ZER0
  978. GT    CMA
  979.         INR      A
  980.         MOV       D,H
  981.         MOV       E,L
  982.         CALL     ADR
  983.         XCHG
  984.         CALL     LMOV  
  985.         MVI      M,1
  986.         SHLD     EOFP
  987. ZER0    LHLD    INSP
  988.         MVI      M,13
  989.         INX      H
  990.         LXI      D,IBUF-1
  991.         MVI      C,1
  992.         CALL     LMOV  
  993.         JMP      EOR
  994. FIND    LXI    H,ABUF+3
  995. FIN0    SHLD    ADDS
  996. FIN1    LHLD    BOFP
  997. FI1    CALL    EO1
  998.     XCHG
  999.     LHLD    ADDS
  1000.     XCHG
  1001.     MVI    A,4
  1002.     CALL    ADR
  1003.     CALL    COM0
  1004.     RC
  1005.     RZ
  1006. FI2    MOV    A,M
  1007.     CALL    ADR
  1008.     JMP    FI1
  1009. EOF    INX    H
  1010. EO1    MVI    A,1
  1011.     CMP    M
  1012.     RNZ
  1013.     JMP    EOR
  1014. ADR    ADD    L
  1015.     MOV    L,A
  1016.     RNC
  1017.     INR    H
  1018.     RET
  1019. LMOV    LDAX    D
  1020.     INX    D
  1021.     CMP    C
  1022.     RZ
  1023.     MOV    M,A
  1024.     INX    H
  1025.     JMP    LMOV
  1026. RMOV    LDAX    D
  1027.     DCX    D
  1028.     CMP    C
  1029.     RZ
  1030.     MOV    M,A
  1031.     DCX    H
  1032.     JMP    RMOV
  1033. LODM    MOV    B,M
  1034.     INX    H
  1035.     MOV    C,M
  1036.     INX    H
  1037.     MOV    D,M
  1038.     INX    H
  1039.     MOV    E,M
  1040.     RET
  1041. STOM    MOV    M,E
  1042.     DCX    H
  1043.     MOV    M,D
  1044.     DCX    H
  1045.     MOV    M,C
  1046.     DCX    H
  1047.     MOV    M,B
  1048.     RET
  1049. COM0    MVI    B,1
  1050.     MVI    C,4
  1051.     ORA    A
  1052. CO1    LDAX    D
  1053.     SBB    M
  1054.     JZ    CO2
  1055.     INR    B
  1056. CO2    DCX    D
  1057.     DCX    H
  1058.     DCR    C
  1059.     JNZ    CO1
  1060.     DCR    B
  1061.     RET
  1062.     MVI    C,4
  1063.     LDAX    D
  1064.     SUI    1
  1065.     JMP    CO1+1
  1066. NORM    CALL    LODM
  1067.     XRA    A
  1068.     CMP    B
  1069.     RZ
  1070. NOR1    CMP    E
  1071.     CNZ    STOM
  1072.     RNZ
  1073.     MOV    E,D
  1074.     MOV    D,C
  1075.     MOV    C,B
  1076.     MVI    B,'0'
  1077.     JMP    NOR1
  1078. * ---> LIST COMMAND MODIFIED TO ACCEPT
  1079. * ENDING LINE NUMBER ALSO
  1080. LIST    CALL    CRLF
  1081.     LXI    H,-1    ;DFLT ENDING ADDR
  1082.     LDA    ABUF+4    ;GET 'TO' LINE NUMBER
  1083.     ORA    A    ;ANYTHING ENTERED?
  1084.     JZ    LNOTO    ;..NO 'TO' LINE
  1085.     LXI    H,ABUF+7
  1086.     CALL    FIN0    ;FIND LINE
  1087. LNOTO    PUSH    H    ;SAVE END ADDR
  1088.     CALL    FIND
  1089.     POP    D    ;RESTORE END ADDR
  1090. LIS1    INX    H
  1091.     CALL    SCRN
  1092.     CALL    CRLF
  1093.     CALL    EOF
  1094.     CALL    QCHEK    ;ALLOW CTL-Q EXIT
  1095.     MOV    A,D    ;END ADDR
  1096.     CMP    H    ;DONE?
  1097.     JNZ    LIS1    ;CONTINUE?
  1098.     MOV    A,E
  1099.     CMP    L
  1100.     JNZ    LIS1
  1101.     RET
  1102. * ---> DELT COMMAND
  1103. DELT    CALL    VCHK    ;*** DELT ***
  1104.     CALL    FIND
  1105.     SHLD    INSP
  1106.     LXI    H,ABUF+7
  1107.     MOV    A,M
  1108.     ORA    A
  1109.     JNZ    DEL1
  1110.     LXI    H,ABUF+3
  1111. DEL1    SHLD    ADDS
  1112.     XCHG
  1113.     LXI    H,MAXL+3
  1114.     CALL    COM0
  1115.     LHLD    DELP
  1116.     JC    NOVR
  1117.     SHLD    EOFP
  1118.     MVI    M,1
  1119.     XCHG
  1120.     LHLD    BOFP
  1121.     XCHG
  1122.     MVI    B,13
  1123.     DCX    H
  1124. DEL2    MOV    A,L
  1125.     SUB    E
  1126.     MOV    A,H
  1127.     SBB    D
  1128.     MVI    A,13
  1129.     JC    DEL4
  1130.     DCR    B
  1131.     DCX    H
  1132.     CMP    M
  1133.     JNZ    DEL2
  1134.     DCX    H
  1135.     MOV    A,L
  1136.     SUB    E
  1137.     MOV    A,H
  1138.     SBB    D
  1139.     JC    DEL5
  1140.     CMP    M
  1141.     INX    H
  1142.     INX    H
  1143.     JZ    DEL3
  1144. DEL2A    INX    H
  1145. DEL3    CALL    LODM
  1146.     LXI    H,MAXL+3
  1147.     CALL    STOM
  1148.     RET
  1149. DEL4    CMP    B
  1150. DEL5    XCHG    
  1151.     JNZ    DEL2A
  1152.     STA    MAXL
  1153.     RET    
  1154. NOVR    CALL    FI1
  1155.     CZ    FI2
  1156.     XCHG    
  1157.     LHLD    DELP
  1158.     MVI    C,1
  1159.     CALL    LMOV
  1160.     SHLD    EOFP
  1161.     MVI    M,1
  1162.     RET    
  1163. *---> ASSM COMMAND
  1164. ASSM    CALL    VCHK
  1165.     LDA    ABUF+4
  1166.     ORA    A
  1167.     JNZ    ASM4
  1168.     LHLD    BBUF
  1169.     SHLD    BBUF+2
  1170. ASM4    LDA    IBUF+4
  1171.     CPI    'E'
  1172.     JNZ    ASM5
  1173.     XRA    A
  1174. ASM5    STA    AERR
  1175.     XRA    A
  1176.     STA    NOLA
  1177. ASM3    STA    PASI
  1178.     LHLD    BBUF
  1179.     SHLD    ASPC
  1180.     LHLD    BOFP
  1181.     SHLD    APNT
  1182. ASM1    LHLD    APNT
  1183.     LXI    SP,AREA+18
  1184.     MOV    A,M
  1185.     CPI    1
  1186.     JZ    EASS
  1187.     XCHG    
  1188.     INX    D
  1189.     LXI    H,OBUF
  1190.     MVI    A,25    ;<<MOD>> LOAD OBUF LENGTH
  1191.     ADD    L    ;<<MOD>> A= '>IBUF-5'
  1192.     CALL    CLER
  1193.     MVI    C,13
  1194.     CALL    LMOV
  1195.     MOV    M,C
  1196.     XCHG    
  1197.     SHLD    APNT
  1198.     LDA    PASI
  1199.     ORA    A
  1200.     JNZ    ASM2
  1201.     CALL    PAS1
  1202.     JMP    ASM1
  1203. ASM2    CALL    PAS2
  1204.     LXI    H,OBUF
  1205.     CALL    AOUT
  1206.     JMP    ASM1
  1207. AOUT    LDA    AERR
  1208.     ORA    A
  1209.     JNZ    AOU1
  1210. AOU2    LDA    OBUF+18
  1211.     CPI    ' '    ;'
  1212.     RZ    
  1213. AOU1    LXI    H,OBUF
  1214.     CALL    CRLF
  1215.     CALL    SCRN
  1216.     RET    
  1217. PAS1    CALL    ZBUF
  1218.     STA    PASI
  1219.     LXI    H,IBUF
  1220.     SHLD    PNTR
  1221.     MOV    A,M
  1222.     CPI    ' '    ;'
  1223.     JZ    OPC
  1224.     CPI    '*'
  1225.     RZ    
  1226.     CALL    SLAB
  1227.     JC    OP5
  1228.     JZ    ERRD
  1229.     CALL    LCHK
  1230.     JNZ    OP5
  1231.     MVI    C,5
  1232.     LXI    H,ABUF
  1233. MLAB    MOV    A,M
  1234.     STAX    D
  1235.     INX    D
  1236.     INX    H
  1237.     DCR    C
  1238.     JNZ    MLAB
  1239.     XCHG    
  1240.     SHLD    TABA
  1241.     LDA    ASPC    ;<<MOD>> FOR COMS MOD
  1242.     MOV    M,A
  1243.     INX    H
  1244.     LDA    ASPC+1    ;<<MOD>> FOR COMS MOD
  1245.     MOV    M,A
  1246.     LXI    H,NOLA
  1247.     INR    M
  1248. OPC    CALL    ZBUF
  1249.     CALL    SBLK
  1250.     JC    OERR
  1251.     CALL    ALPS
  1252.     CPI    ' '    ;'
  1253.     JC    OPCD
  1254.     JNZ    OERR
  1255.     JMP    OPCD
  1256. LCHK    LHLD    PNTR
  1257.     MOV    A,M
  1258.     CPI    ' '    ;'
  1259.     RZ    
  1260.     CPI    ':'
  1261.     RNZ    
  1262.     INX    H
  1263.     SHLD    PNTR
  1264.     RET    
  1265. PSU1    CALL    SBLK
  1266.     LDAX    D
  1267.     ORA    A
  1268.     JZ    ORG1
  1269.     JM    DAT21
  1270.     JPO    EQU1
  1271.     CPI    5
  1272.     JC    RES1
  1273.     JNZ    EASS
  1274. ACO1    MVI    C,2
  1275.     XRA    A
  1276.     JMP    OCN1
  1277. ORG1    CALL    ASCN
  1278.     LDA    OBUF+18
  1279.     CPI    ' '    ;'
  1280.     RNZ
  1281.     SHLD    ASPC
  1282.     LDA    IBUF
  1283.     CPI    ' '    ;'
  1284.     RZ
  1285.     JMP    EQUS
  1286. EQU1    CALL    ASCN
  1287.     LDA    IBUF
  1288.     CPI    ' '    ;'
  1289.     JZ    ERRM
  1290. EQUS    XCHG
  1291.     LHLD    TABA
  1292.     MOV    M,E    ;<<MOD>> FOR COMS MOD
  1293.     INX    H
  1294.     MOV    M,D    ;<<MOD>> FOR COMS MOD
  1295.     JMP    AOU2
  1296. RES1    CALL    ASCN
  1297.     MOV    B,H
  1298.     MOV    C,L
  1299.     JMP    RES21
  1300.     JMP    OP2
  1301. PAS2    LXI    H,OBUF
  1302.     LDA    ASPC+1
  1303.     CALL    BINH+3
  1304.     INX    H
  1305.     LDA    ASPC
  1306.     CALL    BINH+3
  1307.     SHLD    OIND
  1308.     CALL    ZBUF
  1309.     LXI    H,IBUF
  1310.     SHLD    PNTR
  1311.     MOV    A,M
  1312.     CPI    ' '    ;'
  1313.     JZ    OPC
  1314.     CPI    '*'
  1315.     RZ
  1316.     CALL    SLAB
  1317.     JC    ERRL
  1318.     CALL    LCHK
  1319.     JNZ    ERRL
  1320.     JMP    OPC
  1321. PSU2    LDAX    D
  1322.     ORA    A
  1323.     JZ    ORG2
  1324.     JM    DAT2
  1325.     RPO
  1326.     CPI    5
  1327.     JC    RES2
  1328.     JNZ    EASS
  1329.     CALL    TYS6
  1330.     JMP    ACO1
  1331. RES2    CALL    ASBL
  1332.     MOV    B,H
  1333.     MOV    C,L
  1334.     LHLD    BBUF+2
  1335.     DAD    B
  1336.     SHLD    BBUF+2
  1337. RES21    XRA    A
  1338.     JMP    OCN2
  1339. DAT2    CALL    TYS5
  1340. DAT21    XRA    A
  1341.     MVI    C,1
  1342.     JMP    OCN1
  1343. ORG2    CALL    ASBL
  1344.     LDA    OBUF+18
  1345.     CPI    ' '    ;'
  1346.     RNZ
  1347.     XCHG
  1348.     LHLD    ASPC
  1349.     XCHG
  1350.     SHLD    ASPC
  1351.     MOV    A,L
  1352.     SUB    E
  1353.     MOV    E,A
  1354.     MOV    A,H
  1355.     SBB    D
  1356.     MOV    D,A
  1357.     LHLD    BBUF+2
  1358.     DAD    D
  1359.     SHLD    BBUF+2
  1360.     RET
  1361. TYP1    CALL    AST0
  1362.     RET
  1363. TYP2    CALL    ASBL
  1364.     CNZ    ERRR
  1365.     MOV    A,L
  1366.     ORA    A
  1367.     JZ    TY31
  1368.     CPI    2
  1369.     CNZ    ERRR
  1370.     JMP    TY31
  1371. TYP3    CALL    ASBL
  1372.     CNZ    ERRR
  1373.     MOV    A,L
  1374.     RRC
  1375.     CC    ERRR
  1376.     RAL
  1377.     CPI    8
  1378.     CNC    ERRR
  1379. TY31    RLC
  1380.     RAL
  1381.     RAL
  1382. TY32    MOV    B,A
  1383.     LDAX    D
  1384.     ADD    B
  1385.     CPI    76H
  1386.     CZ    ERRR
  1387.     JMP    TYP1
  1388. TYP4    CALL    ASBL
  1389. TYP4A    CNZ    ERRR
  1390.     MOV    A,L
  1391.     CPI    8
  1392.     CNC    ERRR
  1393.     LDAX    D
  1394.     CPI    40H
  1395.     JZ    TY41
  1396.     CPI    0C7H
  1397.     MOV    A,L
  1398.     JZ    TY31
  1399.     JM    TY32
  1400.     JMP    TY31
  1401. TY41    DAD    H
  1402.     DAD    H
  1403.     DAD    H
  1404.     ADD    L
  1405.     STAX    D
  1406.     CALL    MPNT
  1407.     CALL    ASCN
  1408.     CNZ    ERRR
  1409.     MOV    A,L
  1410.     CPI    8
  1411.     CNC    ERRR
  1412.     JMP    TY32
  1413. TYP5    CPI    6
  1414.     CZ    TY56
  1415.     CALL    AST0
  1416. TYS5    CALL    ASBL
  1417.     INR    A
  1418.     CPI    2
  1419.     CNC    ERRV
  1420.     MOV    A,L
  1421.     JMP    TYP1
  1422. TY56    CALL    ASBL
  1423.     CNZ    ERRR
  1424.     MOV    A,L
  1425.     CPI    8
  1426.     CNC    ERRR
  1427.     DAD    H
  1428.     DAD    H
  1429.     DAD    H
  1430.     LDAX    D
  1431.     ADD    L
  1432.     MOV    E,A
  1433. MPNT    LHLD    PNTR
  1434.     MOV    A,M
  1435.     CPI    ','
  1436.     INX    H
  1437.     SHLD    PNTR
  1438.     JNZ    ERRS
  1439.     MOV    A,E
  1440.     RET    
  1441. TYP6    CPI    1
  1442.     JNZ    TY6
  1443.     CALL    TY56
  1444.     ANI    8
  1445.     CNZ    ERRR
  1446.     MOV    A,E
  1447.     ANI    0F7H
  1448. TY6    CALL    AST0
  1449. TYS6    CALL    ASBL
  1450.     MOV    A,L
  1451.     MOV    D,H
  1452.     CALL    AST0
  1453.     MOV    A,D
  1454.     CALL    TYP1
  1455.     RET    
  1456. AST0    LHLD    BBUF+2
  1457.     MOV    M,A
  1458.     INX    H
  1459.     SHLD    BBUF+2
  1460.     LHLD    OIND
  1461.     INX    H
  1462.     INX    H
  1463.     CALL    BINH+3
  1464.     SHLD    OIND
  1465.     RET    
  1466. EASS    LDA    PASI
  1467.     ORA    A
  1468.     JNZ    EOR
  1469.     CALL    CRLF
  1470.     MVI    A,1
  1471.     JMP    ASM3
  1472. SBLK    LHLD    PNTR
  1473. SBL1    MOV    A,M
  1474.     CPI    ' '    ;'
  1475.     RNZ    
  1476. SBL2    INX    H
  1477.     SHLD    PNTR
  1478.     JMP    SBL1
  1479. COND    LXI    H,ABUF+1
  1480.     SHLD    HCON
  1481.     MVI    B,2
  1482.     CALL    COPC
  1483.     RET    
  1484. OTAB    DW    'OR'
  1485.     DB    'G'
  1486.     DW    0
  1487.     DW    'EQ'
  1488.     DW    'U'
  1489.     DB    1
  1490.     DW    'DB'
  1491.     DW    0
  1492.     DB    0FFH
  1493.     DW    'DS'
  1494.     DW    0
  1495.     DB    3
  1496.     DW    'DW'
  1497.     DW    0
  1498.     DB    5
  1499.     DW    'EN'
  1500.     DW    'D'
  1501.     DB    6
  1502.     DB    0
  1503.     DW    'HL'
  1504.     DB    'T'
  1505.     DB    76H
  1506.     DW    'RL'
  1507.     DB    'C'
  1508.     DB    7
  1509.     DW    'RR'
  1510.     DB    'C'
  1511.     DB    0FH
  1512.     DW    'RA'
  1513.     DB    'L'
  1514.     DB    17H
  1515.     DW    'RA'
  1516.     DB    'R'
  1517.     DB    1FH
  1518.     DW    'RE'
  1519.     DB    'T'
  1520.     DB    0C9H
  1521.     DW    'CM'
  1522.     DB    'A'
  1523.     DB    2FH
  1524.     DW    'ST'
  1525.     DB    'C'
  1526.     DB    37H
  1527.     DW    'DA'
  1528.     DB    'A'
  1529.     DB    27H
  1530.     DW    'CM'
  1531.     DB    'C'
  1532.     DB    3FH
  1533.     DW    'EI'
  1534.     DB    0
  1535.     DB    0FBH
  1536.     DW    'DI'
  1537.     DB    0
  1538.     DB    0F3H
  1539.     DW    'NO'
  1540.     DW    'P'
  1541.     DB    0
  1542.     DW    'XC'
  1543.     DW    'HG'
  1544.     DB    0EBH
  1545.     DW    'XT'
  1546.     DW    'HL'
  1547.     DB    0E3H
  1548.     DW    'SP'
  1549.     DW    'HL'
  1550.     DB    0F9H
  1551.     DW    'PC'
  1552.     DW    'HL'
  1553.     DB    0E9H
  1554.     DB    0
  1555.     DW    'ST'
  1556.     DW    'AX'
  1557.     DB    2
  1558.     DW    'LD'
  1559.     DW    'AX'
  1560.     DB    10
  1561.     DB    0
  1562.     DW    'PU'
  1563.     DW    'SH'
  1564.     DB    0C5H
  1565.     DW    'PO'
  1566.     DW    'P'
  1567.     DB    0C1H
  1568.     DW    'IN'
  1569.     DW    'X'
  1570.     DB    3
  1571.     DW    'DC'
  1572.     DW    'X'
  1573.     DB    0BH
  1574.     DW    'DA'
  1575.     DW    'D'
  1576.     DB    9
  1577.     DB    0
  1578.     DW    'IN'
  1579.     DB    'R'
  1580.     DB    4
  1581.     DW    'DC'
  1582.     DB    'R'
  1583.     DB    5
  1584.     DW    'MO'
  1585.     DB    'V'
  1586.     DB    40H
  1587.     DW    'AD'
  1588.     DB    'D'
  1589.     DB    80H
  1590.     DW    'AD'
  1591.     DB    'C'
  1592.     DB    88H
  1593.     DW    'SU'
  1594.     DB    'B'
  1595.     DB    90H
  1596.     DW    'SB'
  1597.     DB    'B'
  1598.     DB    98H
  1599.     DW    'AN'
  1600.     DB    'A'
  1601.     DB    0A0H
  1602.     DW    'XR'
  1603.     DB    'A'
  1604.     DB    0A8H
  1605.     DW    'OR'
  1606.     DB    'A'
  1607.     DB    0B0H
  1608.     DW    'CM'
  1609.     DB    'P'
  1610.     DB    0B8H
  1611.     DW    'RS'
  1612.     DB    'T'
  1613.     DB    0C7H
  1614.     DB    0
  1615.     DW    'AD'
  1616.     DB    'I'
  1617.     DB    0C6H
  1618.     DW    'AC'
  1619.     DB    'I'
  1620.     DB    0CEH
  1621.     DW    'SU'
  1622.     DB    'I'
  1623.     DB    0D6H
  1624.     DW    'SB'
  1625.     DB    'I'
  1626.     DB    0DEH
  1627.     DW    'AN'
  1628.     DB    'I'
  1629.     DB    0E6H
  1630.     DW    'XR'
  1631.     DB    'I'
  1632.     DB    0EEH
  1633.     DW    'OR'
  1634.     DB    'I'
  1635.     DB    0F6H
  1636.     DW    'CP'
  1637.     DB    'I'
  1638.     DB    0FEH
  1639.     DW    'IN'
  1640.     DB    0
  1641.     DB    0DBH
  1642.     DW    'OU'
  1643.     DB    'T'
  1644.     DB    0D3H
  1645.     DW    'MV'
  1646.     DB    'I'
  1647.     DW    6
  1648.     DW    'JM'
  1649.     DW    'P'
  1650.     DB    0C3H
  1651.     DW    'CA'
  1652.     DW    'LL'
  1653.     DB    0CDH
  1654.     DW    'LX'
  1655.     DW    'I'
  1656.     DB    1
  1657.     DW    'LD'
  1658.     DW    'A'
  1659.     DB    3AH
  1660.     DW    'ST'
  1661.     DW    'A'
  1662.     DB    32H
  1663.     DW    'SH'
  1664.     DW    'LD'
  1665.     DB    22H
  1666.     DW    'LH'
  1667.     DW    'LD'
  1668.     DB    2AH
  1669.     DB    0
  1670. *@320
  1671.     DW    'NZ'
  1672.     DB    0
  1673.     DW    'Z'
  1674.     DB    8
  1675.     DW    'NC'
  1676.     DB    10H
  1677.     DW    'C'
  1678.     DB    18H
  1679.     DW    'PO'
  1680.     DB    20H
  1681.     DW    'PE'
  1682.     DB    28H
  1683.     DB    'P'
  1684.     DB    0
  1685.     DB    30H
  1686.     DB    'M'
  1687.     DB    0
  1688.     DB    38H
  1689.     DB    0
  1690. COPC    LHLD    ADDS
  1691.     LDAX    D
  1692.     ORA    A
  1693.     JZ    COP1
  1694.     MOV    C,B
  1695.     CALL    SEAR
  1696.     LDAX    D
  1697.     RZ    
  1698.     INX    D
  1699.     JMP    COPC
  1700. COP1    INR    A
  1701.     INX    D
  1702.     RET    
  1703. OPCD    LXI    H,ABUF
  1704.     SHLD    ADDS
  1705.     LXI    D,OTAB
  1706.     MVI    B,4
  1707.     CALL    COPC
  1708.     JZ    PSEU
  1709.     DCR    B
  1710.     CALL    COPC
  1711.     JZ    OP1
  1712.     INR    B
  1713.     CALL    COPC
  1714. OP1    LXI    H,TYP1
  1715. OP2    MVI    C,1
  1716.     JZ    OCNT
  1717.     CALL    COPC
  1718.     LXI    H,TYP2
  1719.     JZ    OP2
  1720.     CALL    COPC
  1721.     LXI    H,TYP3
  1722.     JZ    OP2
  1723.     DCR    B
  1724.     CALL    COPC
  1725.     LXI    H,TYP4
  1726.     JZ    OP2
  1727.     CALL    COPC
  1728.     LXI    H,TYP5
  1729.     MVI    C,2
  1730.     JZ    OCNT
  1731.     INR    B
  1732.     CALL    COPC
  1733.     JZ    OP4
  1734.     CALL    COND
  1735.     JNZ    OERR
  1736.     ADI    0C0H
  1737.     MOV    D,A
  1738.     MVI    B,3
  1739.     LDA    ABUF
  1740.     MOV    C,A
  1741.     CPI    'R'
  1742.     MOV    A,D
  1743.     JZ    OP1
  1744.     MOV    A,C
  1745.     INR    D
  1746.     INR    D
  1747.     CPI    'J'
  1748.     JZ    OPAD
  1749.     CPI    'C'
  1750.     JNZ    OERR
  1751.     INR    D
  1752.     INR    D
  1753. OPAD    MOV    A,D
  1754. OP4    LXI    H,TYP6
  1755. OP5    MVI    C,3
  1756. OCNT    STA    TEMP
  1757. *** MODIFIED 'CHECK OPCODE LENGTH' ROUTINE
  1758. *** MOD'D BECAUSE NO '<' AND '>' FUNCTIONS
  1759. *** AVAILABLE IN THIS ASSEMBLER
  1760.     LXI    D,ABUF
  1761.     MOV    A,E
  1762.     ADD    B
  1763.     MOV    E,A
  1764.     MOV    A,D
  1765.     ACI    0
  1766.     MOV    D,A
  1767.     LDAX    D
  1768.     ORA    A
  1769.     JNZ    OERR
  1770. OCN0    LDA    PASI
  1771. OCN1    MVI    B,0
  1772.     XCHG    
  1773. OCN2    LHLD    ASPC
  1774.     DAD    B
  1775.     SHLD    ASPC
  1776.     ORA    A
  1777.     RZ    
  1778.     LDA    TEMP
  1779.     XCHG    
  1780.     PCHL    
  1781. OERR    LXI    H,ERRO
  1782.     MVI    C,3
  1783.     JMP    OCN0
  1784. PSEU    LXI    H,ABUF+4
  1785.     MOV    A,M
  1786.     ORA    A
  1787.     JNZ    OERR
  1788.     LDA    PASI
  1789.     ORA    A
  1790.     JZ    PSU1
  1791.     JMP    PSU2
  1792. SLAB    CPI    'A'
  1793.     RC    
  1794.     CPI    'Z'+1
  1795.     CMC    
  1796.     RC    
  1797.     CALL    ALPS
  1798.     LXI    H,ABUF
  1799.     SHLD    ADDS
  1800.     DCR    B
  1801.     JNZ    SLA1
  1802.     INR    B
  1803.     LXI    D,RTAB
  1804.     CALL    COPC
  1805.     JNZ    SLA1
  1806.     MOV    L,A
  1807.     MVI    H,0
  1808.     JMP    SLA2
  1809. SLA1    LDA    NOLA
  1810.     MOV    B,A
  1811.     LXI    D,SYMT    ;<----- ONLY REFERENCE
  1812.     ORA    A    ;..TO THE SYMBOL TABLE
  1813.     JZ    SLA3
  1814.     MVI    A,LLAB
  1815.     STA    NCHR
  1816.     CALL    COMS
  1817. SLA2    STC    
  1818.     CMC    
  1819.     RET    
  1820. SLA3    INR    A
  1821.     ORA    A
  1822.     RET    
  1823. RTAB    DB    'A'
  1824.     DB    7
  1825.     DB    'B'
  1826.     DB    0
  1827.     DB    'C'
  1828.     DB    1
  1829.     DB    'D'
  1830.     DB    2
  1831.     DB    'E'
  1832.     DB    3
  1833.     DB    'H'
  1834.     DB    4
  1835.     DB    'L'
  1836.     DB    5
  1837.     DB    'M'
  1838.     DB    6
  1839.     DB    0
  1840. ALPS    MVI    B,0
  1841. ALP1    STAX    D
  1842.     INR    B
  1843.     MOV    A,B
  1844.     CPI    0BH
  1845.     RNC
  1846.     INX    D
  1847.     INX    H
  1848.     SHLD    PNTR
  1849.     MOV    A,M
  1850.     CPI    '0'
  1851.     RC
  1852.     CPI    ':'
  1853.     JC    ALP1
  1854.     CPI    'A'
  1855.     RC
  1856.     CPI    'Z'+1
  1857.     JC    ALP1
  1858.     RET
  1859. ASBL    CALL    SBLK
  1860. ASCN    LXI    H,0
  1861.     SHLD    OPRD
  1862.     INR    H
  1863.     SHLD    OPRI-1
  1864. NXT1    LHLD    PNTR
  1865.     DCX    H
  1866.     CALL    ZBUF
  1867.     STA    SIGN
  1868. NXT2    INX    H
  1869.     MOV    A,M
  1870.     CPI    ' '+1
  1871.     JC    SEND
  1872.     CPI    ','
  1873.     JZ    SEND
  1874.     CPI    '+'
  1875.     JZ    ASC1
  1876.     CPI    '-'
  1877.     JNZ    ASC2
  1878.     STA    SIGN
  1879. ASC1    LDA    OPRI
  1880.     CPI    2
  1881.     JZ    ERRS
  1882.     MVI    A,2
  1883.     STA    OPRI
  1884.     JMP    NXT2
  1885. ASC2    MOV    C,A
  1886.     LDA    OPRI
  1887.     ORA    A
  1888.     JZ    ERRS
  1889.     MOV    A,C
  1890.     CPI    '$'
  1891.     JNZ    ASC3
  1892.     INX    H
  1893.     SHLD    PNTR
  1894.     LHLD    ASPC
  1895.     JMP    AVAL
  1896. ASC3    CPI    ''''
  1897.     JNZ    ASC5
  1898.     LXI    D,0
  1899.     MVI    C,3
  1900. ASC4    INX    H
  1901.     SHLD    PNTR
  1902.     MOV    A,M
  1903.     CPI    13
  1904.     JZ    ERRA
  1905.     CPI    ''''
  1906.     JNZ    SSTR
  1907.     INX    H
  1908.     SHLD    PNTR
  1909.     MOV    A,M
  1910.     CPI    ''''
  1911.     JNZ    AVAL1
  1912. SSTR    DCR    C
  1913.     JZ    ERRA
  1914.     MOV    D,E
  1915.     MOV    E,A
  1916.     JMP    ASC4
  1917. ASC5    CPI    '0'
  1918.     JC    ERRA
  1919.     CPI    '9'+1
  1920.     JNC    ALAB
  1921.     CALL    NUMS
  1922.     JC    ERRA
  1923. AVAL    XCHG
  1924. AVAL1    LHLD    OPRD
  1925.     XRA    A
  1926.     STA    OPRI
  1927.     LDA    SIGN
  1928.     ORA    A
  1929.     JNZ    ASUB
  1930.     DAD    D
  1931. ASC7    SHLD    OPRD
  1932.     JMP    NXT1
  1933. ASUB    MOV    A,L
  1934.     SUB    E
  1935.     MOV    L,A
  1936.     MOV    A,H
  1937.     SBB    D
  1938.     MOV    H,A
  1939.     JMP    ASC7
  1940. ALAB    CALL    SLAB
  1941.     JZ    AVAL
  1942.     JC    ERRA
  1943.     JMP    ERRU
  1944. SEND    LDA    OPRI
  1945.     ORA    A
  1946.     JNZ    ERRS
  1947.     LHLD    OPRD
  1948. SEN1    MOV    A,H
  1949.     LXI    D,TEMP
  1950.     ORA    A
  1951.     RET
  1952. NUMS    CALL    ALPS
  1953.     DCX    D
  1954.     LDAX    D
  1955.     LXI    B,ABUF
  1956.     CPI    'H'
  1957.     JZ    NUM2
  1958.     CPI    'D'
  1959.     JNZ    NUM1
  1960.     XRA    A
  1961.     STAX    D
  1962. NUM1    CALL    ADEC
  1963.     RET
  1964. NUM2    XRA    A
  1965.     STAX    D
  1966.     CALL    AHEX
  1967.     RET
  1968. ERRR    MVI    A,'R'
  1969. ERRR1    LXI    H,0
  1970.     STA    OBUF+18
  1971.     RET
  1972. ERRS    MVI    A,'S'
  1973. ERRS1    STA    OBUF+18
  1974.     LXI    H,0
  1975.     JMP    SEN1
  1976. ERRU    MVI    A,'U'
  1977.     JMP    ERRS1
  1978. ERRV    MVI    A,'V'
  1979.     JMP    ERRR1
  1980. ERRM    MVI    A,'M'
  1981.     STA    OBUF+18
  1982.     CALL    AOU1
  1983.     RET
  1984. ERRA    MVI    A,'A'
  1985.     JMP    ERRS1
  1986. ERRO    MVI    A,'O'
  1987. ERRO1    STA    OBUF+18
  1988.     LDA    PASI
  1989.     ORA    A
  1990.     RZ
  1991.     MVI    C,3
  1992. ERO1    XRA    A
  1993.     CALL    AST0
  1994.     DCR    C
  1995.     JNZ    ERO1
  1996.     RET
  1997. ERRL    MVI    A,'L'
  1998.     JMP    ERRO1
  1999. ERRD    MVI    A,'D'
  2000.     STA    OBUF+18
  2001.     CALL    AOU1
  2002.     JMP    OPC
  2003. PATCH    INX    H
  2004.     JNZ    MOV23
  2005.     JMP    PRET
  2006. * HEX SUBROUTINES
  2007. X1    RAR
  2008.     RAR
  2009.     RAR
  2010.     RAR
  2011. X2    ANI    0FH
  2012.     CPI    10
  2013.     JC    X2B
  2014.     ADI    7
  2015. X2B    ADI    30H
  2016.     JMP    TYPE
  2017. *---> HEX OUTPUT SUBROUTINE
  2018. XO    PUSH    6
  2019.     CALL    X1
  2020.     POP    6
  2021.     JMP    X2
  2022. *---> RENUM COMMAND
  2023. RENUM    CALL    CRLF
  2024.     LXI    H,0
  2025.     SHLD    BBUF
  2026.     SHLD    BBUF+2
  2027.     LHLD    FILE0+5
  2028. RELP    MOV    A,M
  2029.     DCR    A
  2030.     JZ    RPRT
  2031.     CALL    QCHEK    ;ALLOW CTL-Q EXIT
  2032. * BUMP LINE #
  2033.     LXI    D,BBUF+1    ;POINT TO 10'S DIGIT
  2034. REIN    LDAX    D
  2035.     INR    A
  2036.     STAX    D
  2037.     CPI    10
  2038.     JNZ    REEND
  2039.     XRA    A
  2040.     STAX    D
  2041.     INX    D
  2042.     JMP    REIN
  2043. REEND    LXI    D,BBUF+3
  2044.     MOV    C,M
  2045.     INX    H
  2046.     PUSH    B
  2047.     LXI    B,FILE0+9
  2048. REMVL    LDAX    D
  2049.     ORI    '0'
  2050.     MOV    M,A
  2051.     STAX    B
  2052.     INX    H
  2053.     DCX    D
  2054.     INX    B
  2055.     MOV    A,C
  2056.     CPI    0DH
  2057.     JNZ    REMVL
  2058.     POP    D
  2059.     MVI    D,0
  2060.     DAD    D
  2061.     LXI    D,-5
  2062.     DAD    D
  2063.     JMP    RELP
  2064. RPRT    LXI    B,0
  2065.     SHLD    FILE0+7
  2066.     LHLD    FILE0+5
  2067. RLOOP    MOV    A,M
  2068.     DCR    A
  2069.     JZ    RNDUN
  2070.     ORA    A
  2071.     MOV    A,C
  2072.     INR    A
  2073.     DAA
  2074.     MOV    C,A
  2075.     MOV    A,B
  2076.     ACI    0
  2077.     DAA
  2078.     MOV    B,A
  2079.     MOV    E,M
  2080.     MVI    D,0
  2081.     DAD    D
  2082.     JMP    RLOOP
  2083. RNDUN    MOV    A,B
  2084.     CALL    XO
  2085.     MOV    A,C
  2086.     CALL    XO
  2087.     LXI    H,RMSG
  2088.     JMP    LINER
  2089. RMSG    DW    ' L'    ;'
  2090.     DW    'IN'
  2091.     DW    'ES'
  2092.     DB    13
  2093. *---> VERIFY COMMAND
  2094. VERIF    CALL    CRLF
  2095.     LHLD    FILE0+5
  2096. V1    MVI    D,12
  2097. VLINE    MOV    A,M
  2098.     DCR    A
  2099.     JZ    VDONE
  2100.     INR    A
  2101.     MOV    B,A    ;B = LINE COUNT
  2102.     CALL    QCHEK    ;CHECK FOR CTL-Q
  2103.     INX    H
  2104.     DCR    B
  2105.     MVI    C,4    ;LINE # COUNT
  2106. VNUM    MOV    A,M
  2107.     CPI    '9'+1
  2108.     JNC    VBAD
  2109.     CPI    '0'
  2110.     JC    VBAD
  2111.     CALL    TYPE
  2112.     INX    H
  2113.     DCR    B
  2114.     DCR    C
  2115.     JNZ    VNUM
  2116.     MVI    A,' '    ;'
  2117.     CALL    TYPE
  2118. V0005    XRA    A
  2119.     ORA    B
  2120.     JP    V0010
  2121.     JMP    VBAD
  2122. V0010    MOV    A,M
  2123.     CPI    ' '    ;'
  2124.     JC    CHECK
  2125.     ANI    80H
  2126.     JNZ    VBAD
  2127.     INX    H
  2128.     DCR    B
  2129.     JZ    VBAD
  2130.     JMP    V0010
  2131. CHECK    CPI    13
  2132.     JNZ    VBAD
  2133.     INX    H
  2134.     DCR    B
  2135.     JNZ    VBAD
  2136.     DCR    D
  2137.     JNZ    VLINE
  2138.     CALL    RET1
  2139.     JMP    V1
  2140. VBAD    MOV    A,H
  2141.     CALL    XO
  2142.     MOV    A,L
  2143.     JMP    XO
  2144. VDONE    LXI    H,VMSG
  2145. *---> LINER - MESSAGE OUTPUT W/ C/R
  2146. LINER    CALL    SCRN    ;OUTPUT TO C/R
  2147.     JMP    TYPE    ;OUTPUT FINAL C/R
  2148. VMSG    DW    'A-'
  2149.     DW    'OK'
  2150.     DB    13
  2151. RET1    MVI    A,13
  2152.     JMP    TYPE
  2153. *---> PRINT COMMAND
  2154. PRINT    CALL    RET1
  2155.     LHLD    FILE0+5
  2156. PNLP    CALL    QCHEK    ;ALLOW CTL-Q EXIT
  2157.     MOV    A,M
  2158.     DCR    A    ;EOF?
  2159.     RZ         ;..YES
  2160.     LXI    D,5
  2161.     DAD    D
  2162. PLOOP    MOV    A,M
  2163.     CALL    TYPE
  2164.     MOV    A,M
  2165.     INX    H
  2166.     CPI    13
  2167.     JNZ    PLOOP
  2168.     JMP    PNLP
  2169. *---> HEX OUTPUT W/BLANK
  2170. XOB    CALL    XO
  2171.     MVI    A,' '    ;'
  2172.     JMP    TYPE
  2173. *---> OBJECT SAVE ROUTINE TO TARBELL
  2174. OSAVE    CALL    RET1
  2175.     CALL    TINTO
  2176.     LHLD    BBUF+2
  2177.     INX    H
  2178.     XCHG
  2179.     LHLD    BBUF
  2180.     MVI    B,0    ;CKSUM
  2181. * OUTPUT START, END ADDRESS
  2182.     MOV    A,H
  2183.     CALL    TPOTC
  2184.     MOV    A,L
  2185.     CALL    TPOTC
  2186.     MOV    A,D
  2187.     CALL    TPOTC
  2188.     MOV    A,E
  2189.     CALL    TPOTC
  2190. OSLP    MOV    A,M
  2191.     CALL    TPOTC
  2192.     INX    H
  2193.     CALL    QDEHL
  2194.     JNZ    OSLP
  2195.     MOV    A,B
  2196.     CALL    TPOUT    ;CKSUM
  2197.     RET
  2198. *---> TARBELL OBJECT LOAD
  2199. OLOAD    CALL    RET1
  2200.     CALL    TINTI
  2201.     MVI    B,0    ;CKSUM
  2202.     LDA    IBUF+5
  2203.     CPI    'N'
  2204.     JZ    OLNO
  2205.     CALL    TPINC
  2206.     MOV    H,A
  2207.     CALL    XO
  2208.     CALL    TPINC
  2209.     MOV    L,A
  2210.     CALL    XOB
  2211.     CALL    TPINC
  2212.     MOV    D,A
  2213.     CALL    XO
  2214.     CALL    TPINC
  2215.     MOV    E,A
  2216.     CALL    XO
  2217.     JMP    OLCON
  2218. OLNO    LHLD    BBUF
  2219.     LXI    D,-1
  2220. OLCON    PUSH    H    ;PGM START
  2221. OLRD    CALL    TPINC
  2222.     MOV    M,A
  2223.     INX    H
  2224.     CALL    QDEHL
  2225.     JNZ    OLRD
  2226.     CALL    TPIN    ;CKSUM
  2227.     XRA    B
  2228.     JNZ    BADCS
  2229.     LDA    IBUF+5
  2230.     CPI    'X'
  2231.     RZ
  2232.     POP    H
  2233.     RET
  2234. BADCS    LXI    H,CSMSG
  2235.     CALL    LINER
  2236.     POP    H
  2237.     RET
  2238. CSMSG    DW    'CK'
  2239.     DW    'SU'
  2240.     DB    'M'
  2241.     DB    13
  2242. QDEHL    MOV    A,H
  2243.     CMP    D
  2244.     RNZ
  2245.     MOV    A,L
  2246.     CMP    E
  2247.     RET
  2248. *---> TARBELL SOURCE SAVE ROUTINE
  2249. SSAVE    CALL    RET1
  2250.     CALL    TINTO
  2251.     LHLD    FILE0+5
  2252.     MVI    B,0    ;CKSUM
  2253. SSLIN    CALL    SET1    ;CURSOR
  2254.     MOV    A,M
  2255.     CALL    TPOTC
  2256.     INX    H
  2257.     DCR    A
  2258.     JNZ    SSLP
  2259.     MOV    A,B
  2260.     CALL    TPOUT
  2261.     RET
  2262. SSLP    MOV    A,M
  2263.     CALL    TPOTC
  2264.     CALL    DSPLY
  2265.     MOV    A,M
  2266.     INX    H
  2267.     CPI    13
  2268.     JZ    SSLIN
  2269.     JMP    SSLP
  2270. *---> TARBELL SOURCE LOAD ROUTINE
  2271. SLOAD    CALL    RET1
  2272.     CALL    TINTI
  2273.     LHLD    FILE0+5
  2274.     MVI    B,0
  2275. SLINE    CALL    SET1    ;CURSOR
  2276.     CALL    TPINC
  2277.     MOV    M,A
  2278.     DCR    A
  2279.     JNZ    SLP0
  2280.     SHLD    FILE0+7
  2281.     CALL    TPIN
  2282.     PUSH    H
  2283.     XRA    B
  2284.     JNZ    BADCS
  2285.     POP    H
  2286.     LHLD    BBUF    ;START OF LAST LINE
  2287.     LXI    D,FILE0+9    ;HI LINE # ADDR
  2288.     MVI    C,4
  2289. SMOVE    MOV    A,M
  2290.     STAX    D
  2291.     INX    H
  2292.     INX    D
  2293.     DCR    C
  2294.     JNZ    SMOVE
  2295.     RET
  2296. SLP0    INX    H
  2297.     SHLD    BBUF
  2298. SLLP    CALL    TPINC
  2299.     MOV    M,A
  2300.     CALL    DSPLY
  2301.     MOV    A,M
  2302.     INX    H
  2303.     CPI    13
  2304.     JZ    SLINE
  2305.     JMP    SLLP
  2306. *---> SET - SET CURSOR SO NO SCROLL
  2307. SET1    LDA    CURS+1    ;GET PAGE
  2308.     ANI    VDMEP-1    ;ENSURE
  2309.     ORI    VDMEP-4    ;..ON VDM
  2310.     STA    CURS+1    ;STORE BACK
  2311.     CPI    VDMEP-1    ;BOTTOM LINE?
  2312.     RC         ;NO
  2313.     MVI    A,VDMEP-4
  2314.     STA    CURS+1    ;BACK TO VDM TOP
  2315.     RET
  2316. * * * * * COMMAND TABLE * * * * *
  2317. CTAB    DB    'D'
  2318.     DB    'U'
  2319.     DB    'M'
  2320.     DB    'P'
  2321.     DW    DUMP
  2322.     DB    'E'
  2323.     DB    'N'
  2324.     DB    'T'
  2325.     DB    'R'
  2326.     DW    ENTR
  2327.     DB    'E'
  2328.     DB    'X'
  2329.     DB    'E'
  2330.     DB    'C'
  2331.     DW    EXEC
  2332.     DB    'F'
  2333.     DB    'I'
  2334.     DB    'L'
  2335.     DB    'E'
  2336.     DW    FILE
  2337.     DB    'L'
  2338.     DB    'I'
  2339.     DB    'S'
  2340.     DB    'T'
  2341.     DW    LIST
  2342.     DB    'D'
  2343.     DB    'E'
  2344.     DB    'L'
  2345.     DB    'T'
  2346.     DW    DELT
  2347.     DB    'A'
  2348.     DB    'S'
  2349.     DB    'S'
  2350.     DB    'M'
  2351.     DW    ASSM
  2352.     DB    'P'
  2353.     DB    'A'
  2354.     DB    'G'
  2355.     DB    'E'
  2356.     DW    PAGE
  2357.     DB    'R'
  2358.     DB    'E'
  2359.     DB    'N'
  2360.     DB    'U'
  2361.     DW    RENUM
  2362.     DB    'S'
  2363.     DB    'L'
  2364.     DB    'O'
  2365.     DB    'A'
  2366.     DW    SLOAD
  2367.     DB    'S'
  2368.     DB    'S'
  2369.     DB    'A'
  2370.     DB    'V'
  2371.     DW    SSAVE
  2372.     DB    'O'
  2373.     DB    'L'
  2374.     DB    'O'
  2375.     DB    'A'
  2376.     DW    OLOAD
  2377.     DB    'O'
  2378.     DB    'S'
  2379.     DB    'A'
  2380.     DB    'V'
  2381.     DW    OSAVE
  2382.     DB    'R'
  2383.     DB    'E'
  2384.     DB    'N'
  2385.     DB    'U'
  2386.     DW    RENUM
  2387.     DB    'V'
  2388.     DB    'E'
  2389.     DB    'R'
  2390.     DB    'I'
  2391.     DW    VERIF
  2392.     DB    'P'
  2393.     DB    'R'
  2394.     DB    'I'
  2395.     DB    'N'
  2396.     DW    PRINT
  2397.     DB    'I'
  2398.     DB    'O'
  2399.     DB    'B'
  2400.     DB    'Y'
  2401.     DW    SETIO    ;SET I/O BYTE
  2402.     DB    'O'
  2403.     DB    'U'
  2404.     DB    'T'
  2405.     DB    ' '    ;'
  2406.     DW    OUTPU
  2407. * * * * * * * * * * * * * * * *
  2408. * ADD YOUR OWN COMMANDS HERE  *
  2409. * * * * * * * * * * * * * * * *
  2410. * JUST PUT IN A 4 BYTE ASCII  *
  2411. * COMMAND, FOLLOWED BY IT'S 2 *
  2412. * BYTE ADDRESS, WITH THE LOW  *
  2413. * BYTE OF THE ADDRESS FIRST,  *
  2414. * THEN THE HIGH BYTE.  BE SURE*
  2415. * THE NUMBER OF COMMANDS IN   *
  2416. * THE 'COMM' ROUTINE STATEMENT*
  2417. * 'MVI A,NCOM' IS BIG ENOUGH  *
  2418. * FOR ALL THE COMMANDS YOU    *
  2419. * HAVE.                       *
  2420. * * * * * * * * * * * * * * * *
  2421. *@3C0
  2422. * PROCESSOR TECH WORK AREA
  2423.     ORG    WORKA    ;TO WORK AREA
  2424. LLAB    EQU    5    ;LABEL LENGTH
  2425. NL    EQU    5
  2426. NMLEN    EQU    5
  2427. MAXFL    EQU    6    ;MAX NUMBER OF FILES
  2428. FILE0    DS    NMLEN    ;FILE NAME
  2429. BOFP    DS    2    ;BEGIN. OF FILE POINTER
  2430. EOFP    DS    2    ;END OF FILE POINTER
  2431. MAXL    DS    4    ;MAX LINE NUMBER
  2432. FILTB    DS    40+NL+NL+NL+NL+NL    ;5 MORE FILES
  2433. INSP    DS    2    ;ISRT LINE POSITION
  2434. DELP    EQU    INSP    ;DELT LINE POSITION
  2435. APNT    EQU    INSP    ;ASSEMBLE LINE POINTER
  2436. ASCR    EQU    13    ;ASCII C/R
  2437. HCON    DS    2    ;HEX BYTE WORK AREA
  2438. ADDS    EQU    HCON    ;FIND ADDRESS
  2439. FBUF    DS    NMLEN    ;FILE NAME BUFFER
  2440. FREAD    DS    2    ;FREE ADDR IN DIRECTORY
  2441. FEF    DS    1    ;FREE ENTRY FOUND FLAG
  2442. FOCNT    EQU    FEF    ;OUTPUT COUNTER
  2443. ABUF    DS    12    ;ASCII BUFFER
  2444. BBUF    DS    4    ;BINARY BUFFER
  2445. SCNT    DS    1
  2446. AERR    EQU    SCNT    ;ASSM ERR PRT SWITCH
  2447. DCNT    DS    1    ;DUMP ROUTINE COUNTER
  2448. NCOM    EQU    20    ;NUMBER OF COMMANDS
  2449. TABA    DS    2    ;SYMBOL TABLE END ADDR
  2450. ASPC    DS    2    ;ASSEMBLER PROGRAM COUNTER
  2451. PASI    DS    1    ;ASSEMBLER PASS INDICATOR
  2452. NCHR    DS    1    ;LENGTH OF STR FOR COMPARE
  2453. PNTR    DS    2    ;LINE POINTER
  2454. NOLA    DS    1    ;NUMBER OF LABLES
  2455. SIGN    DS    1    ;SIGN STORAGE FOR SCAN
  2456. OPRD    DS    2    ;OPERAND STORAGE
  2457. OPRI    DS    1    ;OPERAND FOUND INDICATOR
  2458. TEMP    DS    1
  2459. OIND    DS    2    ;OUTPUT ADDRESS
  2460. AREA    DS    18    ;STACK POINTER AREA
  2461. OBUF    DS    25    ;HEX ASM OBJECT OUTPUT
  2462.     DS    5    ;LINE # GOES HERE
  2463. IBUF    DS    83    ;INPUT BUFFER
  2464. SYMT    EQU    $    ;START OF SYMBOL TABLE
  2465.     END
  2466.