home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG031.ARK / TBASICA4.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  44KB  |  1,869 lines

  1. CON99    DB    43H
  2.     DB    1
  3.     DB    99H
  4.     DB    99H
  5.     DB    99H
  6.     DB    50H
  7. * RTN. D.15
  8. * INSERT CODED LINE INTO SOURCE CODE FILE
  9. * USES ESRC, INSR, AND SLIN
  10. ICLS    LHLD    ESRC    ;CHECK FOR INSERTION AT END
  11.     XCHG        ;TO DE
  12.     LHLD    FRAV    ;GET FFRAV
  13.     CALL    CMP16    ;SAME?
  14.     JNZ    ICLS2    ;NOPE
  15. ICLS3    LHLD    ESRC
  16.     XCHG        ;TO DE
  17.     LHLD    INSR
  18.     CALL    CMP16    ;COMPARE THE ADDRESSES
  19.     JZ    ICLS1    ;SAME, SO NO MOVES REQUIRED
  20.     LHLD    SLIN    ;COMPUTE "TO" ADDRESS
  21.     CALL    SUB16    ;HL=SLIN-ESRC
  22.     PUSH    H    ;SAVE IT
  23.     PUSH    H    ;AND AGAIN
  24.     LHLD    INSR    ;COMPUTE NUMBER OF BYTES TO MOVE
  25.     XCHG        ;TO DE
  26.     LHLD    SLIN
  27.     CALL    SUB16    ;HL=SLIN-INSR
  28.     MOV    C,L    ;BC=HL
  29.     MOV    B,H
  30.     POP    D    ;FINISH COMPUTING "TO" ADDRESS
  31.     LHLD    INSR
  32.     XCHG        ;DE<>HL
  33.     DAD    D    ;HL=INSR+SLIN-ESRC
  34.     XCHG        ;TO DE
  35.     CALL    MOVE    ;MOVE THAT STUFF UP
  36.     POP    B    ;GET SLIN-ESRC
  37.     PUSH    B    ;SAVE IT AGAIN
  38.     LHLD    INSR    ;GET "TO" ADDRESS
  39.     XCHG        ;TO DE
  40.     LHLD    SLIN    ;GET "FROM" ADDRESS
  41.     CALL    MOVE    ;MOVE IT
  42.     SHLD    ESRC    ;SET NEW END OF SOURCE
  43.     MVI    M,80H    ;STORE END CODE
  44.     SHLD    FRAV    ;UPDATE FRAV
  45.     LHLD    INSR    ;GET OLD INSERTION ADDRESS
  46.     POP    D    ;GET SLIN-ESRC
  47.     DAD    D    ;ADD THEM
  48.     SHLD    INSR    ;SAVE IT
  49.     RET        ;DONE....
  50. ICLS2    LHLD    FRAV    ;MOVE LINE DOWN
  51.     XCHG
  52.     LHLD    SLIN
  53.     CALL    SUB16
  54.     MOV    C,L
  55.     MOV    B,H
  56.     LHLD    ESRC
  57.     XCHG
  58.     CALL    MOVE
  59.     XCHG
  60.     DAD    B
  61.     SHLD    SLIN    ;UPDATE SLIN
  62.     JMP    ICLS3
  63. ICLS1    LHLD    SLIN    ;GET NEW INSERTION ADDRESS
  64.     SHLD    ESRC    ;SET ALL THESE CRAZY FLAGS
  65.     MVI    M,80H    ;STORE END CODE
  66.     SHLD    FRAV    ;UPDATE FRAV
  67.     SHLD    INSR
  68.     RET        ;DONE..
  69. * RTN. D.16
  70. * PROCESS CODED LINE
  71. CLPR    LDA    CMND    ;CHECK IT WE'RE IN COMMAND MODE
  72.     ANA    A    ;SET FLAGS
  73.     JNZ    CLPR1    ;SEEM TO BE
  74.     CALL    ICLS    ;INSERT THE LINE IF WE'RE NOT
  75.     LDA    EDITM    ;CHECK FOR EDIT MODE
  76.     ANA    A
  77.     JNZ    EDIT2    ;SURE WAS
  78.     JMP    RSTRR    ;LOOP FOR ANOTHER LINE
  79. CLPR1    CALL    SUBS    ;GET ADDRESS
  80.     PUSH    H
  81.     LHLD    PNTR
  82.     SHLD    PNTRA
  83.     LHLD    SLIN    ;SET UP NEW PNTR
  84.     SHLD    PNTR
  85.     SHLD    NPNTR
  86.     LHLD    SDIR    ;SET UP FARY IF RUN NOT READY
  87.     LDA    RURD
  88.     ANA    A
  89.     JNZ    CLPR9    ;IT'S OKAY ALREADY
  90.     SHLD    FARY    ;SET IT UP
  91. CLPR9    POP    H    ;FIRST ADDRESS TO EXECUTE
  92.     JMP    RUN    ;RUN IT
  93. * THE FOLLOWING IS A TABLE OF ALL INTRINSIC FUNCTIONS
  94. * RECOGNIZED BY TARBELL BASIC.  THEY ARE IN OPCODE ORDER
  95. FUNT    DB    'AB','S'+80H
  96.     DB    'AS','C'+80H
  97.     DB    'AT','N'+80H
  98.     DB    'CHR','$'+80H
  99.     DB    'CO','S'+80H
  100.     DB    'EX','P'+80H
  101.     DB    'FR','E'+80H
  102.     DB    'IN','P'+80H
  103.     DB    'IN','T'+80H
  104.     DB    'LEFT','$'+80H
  105.     DB    'LE','N'+80H
  106.     DB    'LO','G'+80H
  107.     DB    'MID','$'+80H
  108.     DB    'OCT','$'+80H
  109.     DB    'PEE','K'+80H
  110.     DB    'PO','S'+80H
  111.     DB    'RIGHT','$'+80H
  112.     DB    'RN','D'+80H
  113.     DB    'SG','N'+80H
  114.     DB    'SI','N'+80H
  115.     DB    'SPACE','$'+80H
  116.     DB    'SP','C'+80H
  117.     DB    'SQ','R'+80H
  118.     DB    'STR','$'+80H
  119.     DB    'TA','B'+80H
  120.     DB    'TA','N'+80H
  121.     DB    'US','R'+80H
  122.     DB    'VA','L'+80H
  123.     DB    'MATC','H'+80H
  124.     DB    'HEX','$'+80H
  125.     DB    'CAL','L'+80H
  126.     DB    'LO','C'+80H
  127.     DB    'HE','X'+80H
  128. * RTN. D.17
  129. * PROCESS INTRINSIC FUNCTIONS
  130. * CHECKS TO SEE IF TOKEN AT TSCN IS A VALID
  131. * INTRINSIC FUNCTION. IF IT IS, EXIT IS WITH ZERO AND
  132. * THE OPCODE IN A.  IF IT IS NOT, EXIT IS NOT ZERO.
  133. PFUN    LHLD    TSCN    ;GET TOKEN ADDRESS
  134.     LXI    D,FUNT    ;TABLE ADDRESS
  135.     LXI    B,33    ;NUMBER OF ITEMS ON TABLE
  136.     CALL    STSRH    ;SEARCH THE TABLE
  137.     RNZ        ;NO FIND
  138.     PUSH    B    ;SAVE OFFSET
  139.     CALL    USCN    ;SCAN OFF NEXT TOKEN
  140.     JC    SPRAT    ;SYNTAX ERROR IF NONE
  141.     LHLD    TSCN    ;GET THE ADDRESS
  142.     MOV    A,M    ;GET IT
  143.     CPI    '('+80H    ;SEE IF IT'S RIGHT
  144.     JNZ    SPRAT    ;NOPE!!
  145.     CALL    BSCN    ;SCAN BACK TO LAST TOKEN
  146.     POP    B    ;RESTORE OFFSET
  147.     MVI    A,3FH    ;OPCODE OFFSET
  148.     ADD    C    ;FORM THE CODE
  149.     MVI    C,1    ;SET THE ZERO FLAG
  150.     DCR    C
  151.     RET        ;DONE.
  152. * RTN. D.18
  153. * CHECK FOR SEMICOLON OR COMMA
  154. * IF IT IS, EXITS WITH ZERO SET AND OPCODE IN
  155. * A.  IF NOT, ZERO IS CLEARED.
  156. SCCC    LHLD    TSCN    ;GET TOKEN ADDRESS
  157.     MOV    A,M    ;GET THE CHARACTER
  158.     CPI    ';'+80H    ;CHECK FOR SEMICOLON
  159.     JZ    SCCC1    ;IT IS
  160.     CPI    ','+80H    ;CHECK FOR COMMA
  161.     RNZ        ;IT WASN'T
  162.     MVI    A,0DH    ;SET OPCODE
  163.     RET        ;DONE
  164. SCCC1    MVI    A,0EH    ;GET OPCODE
  165.     RET        ;DONE.
  166. * RTN. D.19
  167. * INSERT CODE BYTE
  168. * A = CODE BYTE
  169. ICBY    LHLD    SLIN    ;GET ADDRESS TO PUT THE THING
  170.     MOV    M,A    ;STUFF IT IN
  171.     INX    H    ;UPDATE INDEX
  172.     SHLD    SLIN    ;SAVE IT
  173.     RET        ;DONE
  174. * RTN. D.20
  175. * NORMAL STATEMENT PROCESSOR
  176. * A = NORMAL INDEX
  177. NSPR    ADI    09FH    ;ADD OFFSET TO FORM OPCODE
  178.     STA    OPFLG    ;SAVE IT
  179.     CALL    ICBY    ;INSERT IN STRING
  180.     CALL    USCN    ;CHECK FOR ANY EXPRESSION FOLLOWING
  181.     JC    ENPR    ;RETURN IF NOTHING FOLLOWS
  182.     CALL    BSCN    ;SCAN BACK TO WHENCE WE STARTED
  183. NSPR1    CALL    EVEX    ;PROCESS THIS EXPRESSION
  184.     JMP    ENPR    ;PROCESS END OF EXPRESSION
  185. INTBL    DB    ':'+80H
  186.     DB    'GOT','O'+80H
  187.     DB    'T','O'+80H
  188.     DB    'STE','P'+80H
  189.     DB    'THE','N'+80H
  190.     DB    0A7H
  191.     DB    0DCH    ;BACKSLASH
  192.     DB    'GOSU','B'+80H
  193.     DB    'ELS','E'+80H
  194.     DB    89H
  195. * RTN. D.22
  196. * PROCESS INTERMEDIARIES
  197. PINT    LHLD    TSCN    ;GET ADDRESS OF TOKEN
  198.     LXI    D,INTBL    ;GET ADDRESS OF TABLE OF INTERMEDIARYS
  199.     LXI    B,10    ;NUMBER OF ITEMS TO LOOK FOR
  200.     CALL    STSRH
  201.     MOV    A,C    ;FIND # TO C
  202.     RET        ;DONE.
  203. * RTN. D.21
  204. * END OF STATEMENT PROCESSOR
  205. * RETURNS IF END IS OK, GOES TO EXEC3 IF A COLON, 
  206. * SYNTAX ERROR (10) OTHERWISE
  207. ENPR    LDA    ESCN    ;END OF LINE?
  208.     CPI    2
  209.     RZ        ;YUP
  210. ENPR2    CALL    PINT    ;CHECK INTERMEDIATE CODE
  211.     JNZ    EXEC3    ;PROCESS AS STATEMENT
  212.     CPI    2    ;GOTO?
  213.     JZ    EXEC3    ;YUP
  214.     CPI    8    ;GOSUB?
  215.     JZ    EXEC3    ;YUP
  216.     CPI    1    ;COLON?
  217.     MVI    B,9EH    ;JUST IN CASE
  218.     JZ    ENPR1    ;YUP
  219.     CPI    6    ;REMARK
  220.     JZ    PREM    ;YUP
  221.     CPI    7    ;BACKSLASH?
  222.     MVI    B,9DH    ;JUST IN CASE
  223.     JZ    ENPR1    ;YUP
  224.     CPI    10    ;IS IT A TAB?
  225.     MVI    B,9CH    ;JUST IN CASE
  226.     JZ    ENPR1    ;YUP
  227.     CPI    9    ;ELSE?
  228.     MVI    B,9BH    ;JUST IN CASE
  229.     JZ    ENPR1    ;YUP
  230.     JMP    SPRAT    ;MUST BE ILLEGAL
  231. ENPR1    MOV    A,B
  232.     CALL    ICBY    ;INSERT IT
  233.     CALL    USCN    ;GET THE NEXT TOKEN
  234.     JC    SPRAT    ;OUT OF DATA
  235.     JMP    ENPR2    ;TRY AGAIN
  236. INTB    DW    INON
  237.     DW    INGO
  238.     DW    INFO
  239.     DW    INGT
  240.     DW    INGS
  241.     DW    INIF
  242.     DW    INRE
  243.     DW    INCH
  244.     DW    INON
  245.     DW    INRT
  246. * RTN. D.23
  247. INRT    LDA    ESCN    ;ARE WE NEAR THE END?
  248.     CPI    2
  249.     JZ    ENPR    ;YUP
  250.     CALL    INSN    ;PROCESS THE STATEMENT NAME
  251.     JMP    ENPR    ;DONE
  252. * PROCESS ODDBALL STATEMENTS
  253. * IN: A = STATEMENT CODE
  254. PROS    CPI    11    ;IS IT REMARK?
  255.     JNZ    PROS1    ;NOPE
  256.     MVI    A,7    ;CORRECT
  257. PROS1    PUSH    PSW    ;SAVE THE CODE
  258.     ADI    7FH    ;ADD OFFSET
  259.     STA    OPFLG
  260.     CALL    ICBY    ;INSERT IN CODE STRING
  261.     POP    PSW    ;RESTORE THE CODE
  262.     MOV    E,A    ;SET IN DE
  263.     MVI    D,0
  264.     LXI    H,INTB    ;SET UP TO LOOKUP ADDRESS OF PROCESSOR
  265.     CALL    TABLE    ;LOOK IT UP
  266.     MOV    L,C    ;MOVE THE RESULT TO HL
  267.     MOV    H,B
  268.     PCHL        ;JUMP TO THE PROCESSOR
  269. ODTBL    DB    'O','N'+80H
  270.     DB    'GOPRO','C'+80H
  271.     DB    'FO','R'+80H
  272.     DB    'GOT','O'+80H
  273.     DB    'GOSU','B'+80H
  274.     DB    'I','F'+80H
  275.     DB    'RE','M'+80H
  276.     DB    'CHANNE','L'+80H
  277.     DB    'O','N'+80H
  278.     DB    'RESTOR','E'+80H
  279.     DB    'REMAR','K'+80H
  280. NOTBL    DB    'CLOA','D'+80H
  281.     DB    'CSAV','E'+80H
  282.     DB    'ASSIG','N'+80H
  283.     DB    'DAT','A'+80H
  284.     DB    'DE','F'+80H
  285.     DB    'DI','M'+80H
  286.     DB    'DRO','P'+80H
  287.     DB    'INPU','T'+80H
  288.     DB    'LE','T'+80H
  289.     DB    'EN','D'+80H
  290.     DB    'NEX','T'+80H
  291.     DB    'OU','T'+80H
  292.     DB    'POK','E'+80H
  293.     DB    'PRIN','T'+80H
  294.     DB    'PROCEDUR','E'+80H
  295.     DB    'REA','D'+80H
  296.     DB    'RECEIV','E'+80H
  297.     DB    'BSAV','E'+80H
  298.     DB    'RETUR','N'+80H
  299.     DB    'STO','P'+80H
  300.     DB    'WAI','T'+80H
  301.     DB    'CLEA','R'+80H
  302.     DB    'BLOA','D'+80H
  303.     DB    'BPU','T'+80H
  304.     DB    'BGE','T'+80H
  305. CHCKA    CALL    CHCK    ;CHECK INTEGRITY
  306.     MOV    B,A    ;SAVE TO B
  307.     LDA    CHECK    ;GET THE CHECK BYTE
  308.     CMP    B    ;COMPARE IT
  309.     RZ        ;IT'S OKAY, BASIC LIVES!
  310. CHCKB    LXI    H,CKMSG    ;OOPS, A DESTROYED BIT OR TWO SOMEWHERE
  311.     CALL    MSGER    ;TELL THE OPERATOR
  312.     JMP    CHCKB    ;DO IT AGAIN
  313. SUBS    LDA    RURD    ;IS RUN READY?
  314.     ANA    A    ;SET FLAGS
  315.     LHLD    FRAV    ;JUST IN CASE
  316.     RZ        ;NOPE
  317.     LHLD    PNTR    ;YUP
  318.     RET        ;DONE.
  319. CKMSG    DB    'BASIC IS CRASHED',8DH
  320. * RTN. D.24
  321. * CHECK FOR STATEMENT
  322. * JUMPS TO PROCESSOR IF IT IS A STATEMENT
  323. CHST    LHLD    TSCN    ;SET UP CASER
  324.     SHLD    CASER
  325.     LHLD    TSCN    ;GET ADDRESS OF TOKEN
  326.     XRA    A    ;CLEAR A
  327.     STA    STFLG    ;CLEAR NOT STATEMENT FLAG
  328.     MOV    A,M    ;CHECK FOR ? FOR PRINT
  329.     CPI    '?'+80H
  330.     MVI    A,14    ;PRINT ITEM NUMBER
  331.     JZ    NSPR    ;SURE WAS
  332.     LXI    D,NOTBL    ;GET ADDRESS OF TABLE OF NORMAL STATEMENTS
  333.     LXI    B,19H    ;NUMBER OF NORMAL STATEMENTS
  334.     CALL    STSRH    ;SEARCH
  335.     MOV    A,C    ;CODE TO A
  336.     JZ    NSPR    ;FOUND
  337. CHST1    LHLD    TSCN    ;GET ADDRESS OF TOKEN
  338.     LXI    D,ODTBL    ;GET ADDRESS OF TABLE OF ODDBALL STATEMENTS
  339.     LXI    B,11    ;NUMBER OF ODDBALL STATEMENT TYPES
  340.     CALL    STSRH    ;SEARCH IT
  341.     MOV    A,C    ;GET CODE FOUND IF ANY
  342.     JZ    PROS    ;JUMP TO PROCESS ODDBALL STATEMENT
  343.     MVI    A,0FFH    ;SET NOT STATEMENT FLAG
  344.     STA    STFLG    ;SET IT
  345.     RET        ;NOT A STATEMENT
  346. COTBL    DB    'CAD','D'+80H
  347.     DB    'CLEA','R'+80H
  348.     DB    'CLOA','D'+80H
  349.     DB    'CON','T'+80H
  350.     DB    'CSAV','E'+80H
  351.     DB    'DELET','E'+80H
  352.     DB    'ENTE','R'+80H
  353.     DB    'LIS','T'+80H
  354.     DB    'NE','W'+80H
  355.     DB    'RU','N'+80H
  356.     DB    'EDI','T'+80H
  357.     DB    'SYMBO','L'+80H
  358.     DB    'BY','E'+80H
  359. * RTN. D.25
  360. * EXECUTIVE
  361. RSTRT    LDA    CSST    ;CHECK FOR CASSETTE MODE
  362.     ANA    A    ;SET FLAGS
  363.     JNZ    EXCE1    ;CASSETTE MODE
  364.     CALL    CRLF    ;PRINT HEAD TO THE LEFT
  365. RSTRR    LXI    SP,STACK+100     ;SET UP THE STACK POINTER
  366. EXEC2    LDA    CSST    ;CHECK FOR CASSETTE MODE
  367.     ANA    A
  368.     JNZ    EXCE1    ;CASSETTE MODE
  369.     LDA    CMND    ;CHECK FOR COMMAND MODE
  370.     ANA    A    ;SET FLAGS
  371.     JZ    EXECA    ;NOPE
  372.     MVI    A,'>'    ;COMMAND MODE PROMPT
  373.     JMP    EXECB    ;SKIP THE NEXT
  374. EXECA    MVI    A,':'    ;ENTER MODE PROMPT
  375. EXECB    CALL    TOUT    ;OUTPUT IT
  376. EXCE1    CALL    SUBS    ;GET END OF SOURCE
  377.     LXI    D,100    ;ADD 100 TO IT
  378.     DAD    D
  379.     MVI    M,80H    ;CLEAR OUT A BYTE
  380.     INX    H    ;GET NEXT ADDRESS
  381.     MVI    M,80H    ;AND ANOTHER ONE
  382.     INX    H    ;UPDATE
  383.     LDA    CSST    ;CHECK FOR CASSETTE MODE
  384.     STA    CATV    ;STORE AS CASSETTE/TV MODE
  385.     CALL    LIIN    ;INPUT A LINE FROM THE KEYBOARD
  386.     JNC    EXEC1    ;SOMETHING WAS INPUTTED
  387.     MVI    A,0FFH    ;SET COMMAND MODE
  388.     STA    CMND    ;DONE
  389.     LDA    CSST    ;CHECK FOR CASSETTE MODE
  390.     ANA    A
  391.     JZ    EXCYY    ;NOT CASSETTE MODE
  392.     STC        ;STOP MOTORS
  393.     CALL    CAIN
  394. EXCYY    XRA    A    ;CLEAR CSST MODE
  395.     STA    CSST
  396.     JMP    RSTRT    ;TRY AGAIN
  397. EXEC1    XRA    A    ;CLEAR A
  398.     STA    ESCN    ;CLEAR END OF SCAN FLAG
  399.     CALL    SUBS    ;SET UP NEXT SCAN AND SOURCE LINE FLAGS
  400.     LXI    D,101
  401.     SHLD    SLIN    ;SOURCE LINE FLAG
  402.     DAD    D
  403. EXE77    SHLD    NSCN    ;NEXT SCAN FLAG
  404.     CALL    USCN    ;UPSCAN TWICE TO GET FIRST TOKEN
  405.     CALL    USCN    ;AGAIN
  406.     LHLD    TSCN    ;GET ADDRESS OF THIS TOKEN
  407.     MOV    A,M    ;CHECK FOR COLON
  408.     CPI    ':'+80H
  409.     LXI    B,7    ;CHECK FIND NUMBER JUST IN CAST
  410.     JZ    EXE80    ;SURE WAS
  411.     LXI    D,COTBL    ;TABLE OF COMMANDS
  412.     LXI    B,13    ;NUMBER OF COMMANDS TO DECODE
  413.     CALL    STSRH    ;SEARCH THE COMMAND TABLE
  414.     JNZ    EXEC3    ;WASN'T A COMMAND
  415. EXE80    LXI    H,COJMP    ;TABLE OF COMMAND PROCESSING ENTRANCES
  416.     MOV    D,B    ;MOVE BC TO DE
  417.     MOV    E,C
  418.     LDA    CMND    ;CHECK FOR COMMAND MODE
  419.     ANA    A
  420.     JNZ    EXE88    ;SURE IS
  421.     MOV    A,C    ;GET COMMAND TYPE
  422.     CPI    10    ;CHECK FOR VALIDITY IN ENTER MODE
  423.     JNC    EXE88    ;OK
  424.     CPI    9
  425.     JZ    EXEC3    ;NOT OK
  426.     CPI    6
  427.     JC    EXEC3    ;NOT OK
  428. EXE88    CALL    TABLE    ;GET ADDRESS
  429.     MOV    H,B    ;MOVE BC TO HL
  430.     MOV    L,C
  431.     MVI    A,0FFH    ;SET COMMAND MODE
  432.     STA    CMND
  433.     PCHL        ;JUMP TO PROCESS COMMAND 
  434. EXEC3    CALL    CHST    ;CHECK TO SEE IF THIS TOKEN IS A STATEMENT
  435.     LDA    STFLG    ;GET STATEMENT FLAG
  436.     ANA    A    ;SET FLAGS
  437.     JNZ    EXEC4    ;WASN'T A STATEMENT
  438.     JMP    CLPR    ;PROCESS THE CODED LINE
  439. EXEC4    LHLD    TSCN    ;GET ADDRESS
  440.     MOV    A,M    ;GET CHARACTER
  441.     CPI    89H    ;IS IT A TAB?
  442.     JZ    EXECTAB    ;YUP
  443.     CALL    BSCN    ;SCAN BACK
  444.     LHLD    NSCN    ;CHECK FOR = SIGN
  445. EX000    MOV    A,M    ;GET A BYTE
  446.     ANA    A    ;CHECK FOR END REACHED
  447.     JZ    EXEC5    ;YUP
  448.     CPI    20H
  449.     JNZ    EXXZZ    ;NOT A SPACE
  450.     INX    H    ;CHECK FOR = NEXT
  451.     MOV    A,M    ;GET A BYTE
  452.     ANI    7FH    ;STRIP END BIT
  453.     CPI    '='
  454.     JNZ    EXEC5    ;NOT A "LET" STATEMENT
  455.     DCX    H
  456. EXXZZ    INX    H    ;NEXT BYTE
  457.     CPI    '='    ;CHECK FOR THE EQUALS SIGN
  458.     JNZ    EX000    ;TRY AGAIN
  459. INIF4    MVI    A,0A8H    ;CODE FOR "LET" STATEMENT
  460.     LXI    H,EXEC3+3     ;RETURN ADDRESS
  461.     PUSH    H    ;ONTO THE STACK
  462.     LXI    H,STFLG    ;CLEAR OUT THE STATEMENT FLAG
  463.     MVI    M,0
  464.     STA    OPFLG    ;STORE CODE
  465.     CALL    ICBY    ;INSERT IN LINE
  466.     JMP    NSPR1    ;PROCESS THE LET STATEMENT
  467. EXEC5    LDA    CMND    ;CHECK FOR MODE
  468.     ANA    A    ;SET FLAGS
  469.     MVI    B,8    ;POSSIBLE ERROR
  470.     JNZ    ERROR    ;NO LABELS IN COMMAND MODE!
  471.     CALL    USCN    ;GET EVERYTHING BACK TO NORMAL
  472.     CALL    LGLB    ;CHECK FOR LABEL LEGALITY
  473.     MVI    B,7    ;POSSIBLE ERROR
  474.     JC    ERROR    ;ILLEGAL LABEL
  475.     MVI    A,9FH    ;GET STATEMENT OPCODE
  476.     CALL    ICBY    ;INSERT IT
  477.     MVI    A,6    ;START OF STATEMENT NAME CODE
  478.     CALL    ICBY    ;INSERT IT
  479.     LHLD    TSCN    ;GET TOKEN ADDRESS
  480.     MVI    A,1    ;STATEMENT NAME CODE
  481.     CALL    GTNM    ;GET THE SYMBOL NUMBER
  482.     PUSH    B
  483.     MVI    B,7    ;POSSIBLE ERROR
  484.     JC    ERROR    ;STATEMENT NAME USED AS VARIABLE NAME
  485.     POP    B
  486.     MOV    A,C    ;MOVE SYMBOL NUMBER INTO CODE LINE
  487.     MOV    L,C
  488.     MOV    H,B
  489.     SHLD    EDITS
  490.     CALL    ICBY
  491.     MOV    A,B
  492.     CALL    ICBY
  493.     MVI    A,7
  494.     CALL    ICBY
  495.     CALL    USCN    ;GET NEXT TOKEN
  496.     JC    SPRAT    ;ERROR IF ONLY A LABEL
  497.     JMP    EXEC3    ;GET REST OF STATEMENT
  498. EXECTAB    MVI    A,9CH    ;STORE THE OPCODE
  499.     CALL    ICBY
  500.     CALL    USCN    ;GET NEXT TOKEN
  501.     JMP    EXEC3    ;DO IT
  502. PRSY    LXI    H,PRSYMSG1    ;DUMP THE TITLE OUT
  503.     CALL    MSGER
  504.     LDA    RURD    ;SEE IF WE ARE ALREADY SET UP
  505.     ANA    A
  506.     JNZ    PRSYSKIP    ;YUP
  507.     CALL    ASDA    ;SET IT ALL UP
  508.     CALL    AVAP
  509. PRSYSKIP    LHLD    SNUM    ;GET NUMBER OF SYMBOLS
  510.     MOV    B,H    ;TO BC
  511.     MOV    C,L
  512.     LHLD    SDIR    ;GET START OF DIRECTORY
  513.     PUSH    H    ;TO THE STACK
  514.     LHLD    STAB    ;GET START OF THE SYMBOL TABLE
  515. PRSY1    CALL    COUNT    ;ADVANCE ONE SYMBOL
  516.     DAD    D
  517.     MOV    A,M    ;GET A BYTE
  518.     ANA    A
  519.     JNZ    PRSY1A    ;NOT AN ARRAY NAME
  520.     INX    H
  521. PRSY1A    XTHL        ;ADVANCE THE DIRECTORY
  522.     INX    H
  523.     INX    H
  524.     INX    H
  525.     XTHL        ;DID THAT
  526.     DCX    B    ;UPDATE SYMBOL COUNT
  527.     MOV    A,B    ;CHECK FOR DONENESS
  528.     ORA    C
  529.     JZ    RSTRT    ;ALL DONE PEOPLE
  530.     PUSH    B    ;SAVE EM
  531.     PUSH    H
  532.     CALL    MSGER    ;DUMP THE LABEL NAME
  533. PRSY2    LDA    POSIT    ;SEE IF WE'RE AT THE COLUMN YET
  534.     CPI    32
  535.     JZ    PRSY3    ;YUP
  536.     MVI    A,20H
  537.     CALL    TOUT    ;NO, SO DUMP A SPACE
  538.     JMP    PRSY2    ;TRY AGAIN
  539. PRSY3    POP    H    ;RESTORE
  540.     POP    B
  541.     XTHL        ;GET DIRECTORY
  542.     INX    H
  543.     INX    H
  544.     PUSH    H    ;SAVE IT
  545.     PUSH    B
  546.     MOV    A,M    ;GET ID BYTE
  547.     ANI    1    ;IS IT LABEL?
  548.     JNZ    PRSY3A    ;YUP
  549.     MOV    A,M
  550.     ANI    2    ;IS IT A VARIABLE?
  551.     JNZ    PRSY3B    ;YUP
  552.     LXI    H,PRSYMSG2
  553.     JMP    PRSY3C
  554. PRSY3A    LXI    H,PRSYMSG3
  555.     JMP    PRSY3C
  556. PRSY3B    LXI    H,PRSYMSG4
  557. PRSY3C    CALL    MSGER
  558.     POP    B
  559.     POP    H    ;GET BACK LOCATION
  560.     DCX    H
  561.     MOV    D,M    ;FISH OUT THE POINTER
  562.     DCX    H
  563.     MOV    E,M
  564.     PUSH    H    ;SAVE IT
  565.     XCHG
  566.     PUSH    B
  567.     LXI    D,TMP1    ;CONVERSION PLACE
  568.     CALL    BBCD    ;CONVERT TO BINARY
  569.     LHLD    FRAV    ;GET PLACE TO CONVERT TO
  570.     XCHG
  571.     LXI    H,TMP1
  572.     CALL    NMST    ;CONVERT TO NUMBER
  573.     XCHG
  574.     DCX    H
  575.     MOV    A,M    ;SET LAST BIT
  576.     ORI    80H
  577.     MOV    M,A
  578.     LHLD    FRAV
  579.     CALL    MSGER    ;DUMP IT OUT
  580.     CALL    CRLF    ;SEND A CARRIAGE RETURN
  581.     POP    B
  582.     POP    H    ;RESTORE ADDRESS
  583.     XTHL        ;TRADE
  584.     JMP    PRSY1    ;DO IT AGAIN
  585. * RTN. D.26
  586. * ON STATEMENT PROCESSOR
  587. INON    LHLD    SLIN    ;SAVE ADDRESS OF OPCODE
  588.     PUSH    H
  589.     CALL    EVEX    ;PROCESS EXPRESSION
  590.     CALL    PINT    ;CHECK FOR "GOTO"
  591.     CPI    2
  592.     JZ    INON1    ;IT'S A GOTO
  593.     CPI    8    ;CHECK FOR A GOSUB
  594.     JNZ    SPRAT    ;NOPE, SO ERROR
  595.     POP    H    ;CHANGE OPCODE
  596.     DCX    H
  597.     MVI    M,88H    ;STORE THE NEW ONE
  598.     PUSH    H    ;SET STACK UP
  599. INON1    POP    H    ;CLEAN UP THE STACK
  600.     CALL    PLDL    ;PROCESS LINE DESCRIPTOR LIST
  601.     JMP    ENPR    ;END OF LINE PROCESSING
  602. * RTN. D.27 
  603. * GOPROC STATEMENT PROCESSOR
  604. INGO    CALL    INSN    ;PROCESS THE STATEMENT NAME
  605.     JC    ENPR    ;NO TRANSFER LIST
  606.     CALL    SCCC    ;CHECK FOR COMMA
  607.     CPI    0DH    ;COMPARE
  608.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  609.     JNZ    ERROR    ;SYNTAX ERROR
  610.     CALL    EVEX    ;PROCESS EXPRESSION
  611.     JMP    ENPR    ;END PROCESSOR
  612. * RTN. D.28
  613. * INSERT STATEMENT NAME
  614. INSN    JMP    PLDS    ;USE PROCESS LINE DESCRIPTOR ROUTINE
  615. * RTN. D.29
  616. * FOR STATEMENT PROCESSOR
  617. INFO    MVI    A,0A8H    ;GET CODE FOR "LET" STATEMENT
  618.     STA    OPFLG    ;SET ASSIGNMENT MODE FOR =
  619.     CALL    EVEX    ;EVALUATE THE EXPRESSION
  620.     CALL    PINT    ;CHECK FOR "TO"
  621.     CPI    3    ;CHECK IT
  622.     MVI    B,19H    ;ERROR CODE JUST IN CASE
  623.     JNZ    ERROR    ;NO "TO"
  624.     CALL    EVEX    ;GET THE NEXT PART
  625.     CALL    PINT    ;SEE IF THERE IS A "STEP"
  626.     CPI    4    ;COMPARE CODES
  627.     JNZ    ENPR    ;NOPE, WE MUST BE DONE
  628.     CALL    EVEX    ;GET THE STEP INTERVAL
  629.     JMP    ENPR    ;DONE
  630. * RTN. D.30
  631. * GOTO STATEMENT PROCESSOR
  632. INGT    CALL    INSN    ;GET STATEMENT NAME
  633.     JMP    ENPR    ;DONE
  634. * RTN. D.31
  635. * GOSUB STATEMENT PROCESSOR
  636. INGS    JMP    INGT    ;SAME AS GOTO
  637. * RTN. D.31
  638. * IF STATEMENT PROCESSOR
  639. INIF    CALL    EVEX    ;GET EXPRESSION
  640.     CALL    PINT    ;GET CODE FOR INTERMEDIARY
  641.     CPI    2    ;IS IT A "GOTO"?
  642.     JZ    EXEC3    ;SO GET THE NAME
  643.     CPI    5    ;IS IT A "THEN"?
  644.     JNZ    SPRAT    ;SYNTAX ERROR
  645.     CALL    USCN    ;SCAN OFF ANOTHER TOKEN
  646.     JC    SPRAT    ;NOTHING FOLLOWING, SYNTAX ERROR
  647.     CALL    CHST    ;CHECK TO SEE IF THE TOKEN IS A STATEMENT
  648.     LDA    STFLG    ;CHECK IT OUT
  649.     ANA    A
  650.     JZ    CLPR    ;IT WAS A STATEMENT, SO PROCESS IT
  651.     CALL    BSCN    ;CHECK FOR "=" SIGN
  652.     LHLD    NSCN
  653. INIF1    MOV    A,M    ;GET A BYTE
  654.     ANA    A    ;CHECK FOR END REACHED
  655.     JZ    INIF2    ;YUP
  656.     CPI    20H    ;CHECK FOR SPACE
  657.     JNZ    INIF3    ;NOPE
  658.     INX    H    ;CHECK FOR "=" NEXT
  659.     MOV    A,M    ;GET IT
  660.     ANI    7FH    ;STRIP END BIT
  661.     CPI    '='    ;CHECK IT OUT
  662.     JNZ    INIF2    ;NOT A LET STATEMENT
  663.     DCX    H    ;CORRECT INDEX
  664. INIF3    INX    H
  665.     CPI    '='    ;CHECK FOR = SIGN
  666.     JNZ    INIF1    ;TRY AGAIN
  667.     JMP    INIF4    ;PUT IN THE LET STATEMENT
  668. INIF2    CALL    USCN    ;CORRECT IT
  669.     MVI    A,83H    ;SET IN THE GOTO CODE
  670.     CALL    ICBY    ;INSERT THE CODE BYTE
  671.     CALL    BSCN    ;BACK OFF, JACK
  672.     XRA    A    ;CLEAR THE STATEMENT FLAG
  673.     STA    STFLG
  674.     JMP    INGT    ;PROCESS AS GOTO
  675. * RTN. D.33
  676. * REMARKS PROCESSOR
  677. INRE    JMP    PREM    ;DO IT THIS WAY
  678. * RTN. D.34
  679. * CHANNEL PROCESSOR
  680. INCH    CALL    EVEX    ;PROCESS EXPRESSION
  681.     JMP    ENPR    ;DONE
  682. * RTN. D.35
  683. * GET INCREMENT
  684. GTIN    LXI    D,1    ;PRESET INCREMENT TO MINIMUM
  685.     CPI    8    ;IS A>=8?
  686.     RNC        ;YUP
  687.     PUSH    H    ;SAVE ADDRESS
  688.     ANA    A    ;IS A=0?
  689.     JZ    GTIN2    ;YUP
  690.     DCR    A    ;IS A=1?
  691.     JZ    GTIN3    ;YUP
  692.     CPI    3    ;IS A=4?
  693.     JZ    GTIN4    ;YUP
  694.     CPI    4    ;IS A=4?
  695.     JZ    GTIN4    ;YUP
  696.     LXI    D,4    ;LABEL NUMBER
  697.     POP    H    ;RESTORE ADDRESS
  698.     RET        ;DONE
  699. GTIN4    LXI    D,8    ;NUMBER
  700.     POP    H    ;RESTORE ADDRESS
  701.     RET        ;DONE
  702. GTIN3    DCX    H    ;UPDATE INDEX
  703.     INX    D    ;UPDATE COUNTER
  704.     MOV    A,M    ;GET A BYTE
  705.     ANA    A    ;IS IT A ZERO?
  706.     JNZ    GTIN3    ;NOPE
  707.     POP    H    ;RESTORE ADDRESS
  708.     RET        ;DONE
  709. GTIN2    INX    H    ;UPDATE INDEX
  710.     INX    D    ;UPDATE COUNTER
  711.     MOV    A,M    ;GET A BYTE
  712.     CPI    1    ;IS IT A ONE?
  713.     JNZ    GTIN2    ;NOPE
  714.     POP    H    ;RESTORE ADDRESS
  715.     RET        ;DONE
  716. * RTN. D.36
  717. * MOVE FORWARD ONE STATEMENT IN SOURCE
  718. * TSCN CONTAINS ADDRESS OF CURRENT STATEMENT
  719. MFOS    LHLD    LINE    ;GET CURRENT STATEMENT
  720.     INX    H    ;GET NEXT BYTE
  721. MFOS2    XCHG        ;TO DE
  722.     LHLD    ESRC    ;CHECK FOR RUNOVER
  723.     CALL    CMP16    ;COMPARE
  724.     JZ    MFOS1    ;YUP
  725.     LHLD    SLIN    ;DIRECT MODE
  726.     CALL    CMP16
  727.     JZ    MFOS1    ;YUP
  728.     XCHG        ;BACK TO HL
  729.     MOV    A,M    ;CHECK FOR A STATEMENT HERE
  730.     ANA    A    ;IS IT ANOTHER STATEMENT
  731.     JM    MFOS1    ;YUP
  732. MFOS1A    CALL    GTIN    ;NOPE
  733.     DAD    D    ;ADD INCREMENT
  734.     JMP    MFOS2    ;LOOP TO TRY AGAIN
  735. MFOS1    SHLD    LINE    ;SAVE IT
  736.     XCHG        ;TO DE
  737.     LHLD    FSRC    ;SEE IF WE'RE WITHIN THE PROGRAM
  738.     DCX    H    ;CORRECT
  739.     CALL    CMP16    ;CHECK IT OUT
  740.     JNC    MFOS3    ;NO GOOD
  741.     LHLD    ESRC    ;CHECK FOR WITHIN STORED PROGRAM
  742.     CALL    CMP16    ;CHECK IT OUT
  743.     XCHG        ;GET LINE BACK TO HL
  744.     RNC        ;GOOD FOR SURE
  745.     XCHG        ;BACK TO DE
  746.     LHLD    FRAV    ;CHECK FOR DIRECT MODE LEAP
  747.     DCX    H    ;CORRECT
  748.     CALL    CMP16    ;CHECK IT OUT
  749.     JNC    MFOS3    ;NO GOOD
  750.     LHLD    SLIN    ;AGAIN
  751.     CALL    CMP16    ;CHECK IT OUT
  752.     XCHG        ;TO HL
  753.     RNC        ;IT'S GOOD FOR SURE
  754. MFOS3    MVI    B,7    ;ERROR TYPE
  755.     LHLD    ESRC    ;RESET LINE
  756.     SHLD    LINE
  757.     JMP    ERROR    ;GO DO IT
  758. * RTN. D.37
  759. * MOVE BACKWARDS ONE STATEMENT IN SOURCE
  760. MBOS    LHLD    LINE    ;GET CURRENT STATEMENT
  761.     DCX    H    ;GET LAST ONE
  762. MBOS1    MOV    A,M    ;GET A BYTE
  763.     ANA    A    ;SET FLAGS
  764.     JM    MFOS1    ;FOUND THE LAST STATEMENT
  765. MBOS1A    CALL    GTIN    ;GET THE INCREMENT
  766.     CALL    SUB16    ;HL=HL-DE
  767.     JMP    MBOS1    ;LOOP TO TRY AGAIN
  768. * RTN. D.38
  769. * ASSIGN STATEMENT AND DEF ADDRESSES
  770. ASDA    LHLD    ESRC    ;STORE THE FAKE END
  771.     MVI    M,0FFH    
  772.     LHLD    SNUM    ;NUMBER OF SYMBOLS
  773.     XCHG        ;TO DE
  774.     LHLD    SDIR    ;SYMBOL DIRECTORY
  775. ASD00    INX    H    ;GET ID BYTE
  776.     INX    H
  777.     MVI    A,5    ;CHECK FOR DEF OR STATEMENT
  778.     ANA    M
  779.     JZ    ASD01    ;NOPE
  780.     DCX    H    ;STORE A 0
  781.     MVI    M,0
  782.     DCX    H
  783.     MVI    M,0
  784.     INX    H
  785.     INX    H
  786. ASD01    INX    H    ;GET NEXT ONE
  787.     DCX    D    ;CHECK FOR DONENESS
  788.     MOV    A,D
  789.     ORA    E
  790.     JNZ    ASD00    ;NOT YET
  791.     LHLD    FSRC    ;SET UP LIN FLAG
  792.     SHLD    LINE
  793. ASDA1    MOV    A,M    ;GET STATEMENT BYTE
  794.     CPI    9FH    ;IS THIS A STATEMENT NAME?
  795.     JZ    ASDA3    ;YUP
  796.     CPI    0A4H    ;IS THIS A DEF FNXXX STATEMENT?
  797.     JZ    ASDA2    ;YUP
  798. ASDA4    XCHG        ;HL TO DE
  799.     LHLD    ESRC    ;GET END OF SOURCE ADDRESS
  800.     CALL    CMP16    ;SEE IF WE ARE DONE YET
  801.     RZ        ;YUP
  802. ASDAQ    CALL    MFOS    ;GET NEXT STATEMENT
  803.     JMP    ASDA1    ;LOOP TO PROCESS IT
  804. ASDA3    INX    H    ;GET ADDRESS OF STATEMENT NAME NUMBER
  805.     INX    H
  806.     MOV    C,M    ;GET NUMBER TO BC
  807.     INX    H
  808.     MOV    B,M
  809.     CALL    DFND    ;GET THE ADDRESS OF POINTER
  810.     MOV    A,H    ;CHECK FOR POINTER = 0
  811.     ORA    L
  812.     JNZ    ASD20    ;DUPLICATE NAME ERROR
  813. ASDAM    LXI    H,LINE    ;ADDRESS OF LINE POINTER
  814.     LXI    B,2    ;NUMBER OF BYTES
  815.     DCX    D
  816.     DCX    D
  817.     CALL    MOVE    ;MOVE THE NUMBER IN
  818.     JMP    ASDAQ    ;LOOP FOR NEXT STATEMENT
  819. ASDA2    INX    H    ;GET ADDRESS OF SYMBOL LABEL
  820.     INX    H
  821.     MOV    A,M    ;GET THE ID BYTE
  822.     CPI    2    ;CHECK IT
  823.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  824.     JNZ    ERROR    ;SYNTAX ERROR
  825.     INX    H    ;GET NUMBER ADDRESS
  826.     MOV    C,M    ;GET THE NUMBER
  827.     INX    H    
  828.     MOV    B,M
  829.     CALL    DFND    ;FIND THE POINTER ADDRESS
  830.     MOV    A,H    ;CHECK FOR POINTER = 0
  831.     ORA    L
  832.     JNZ    ASD10    ;DUPLICATE FNXX ERROR
  833.     JMP    ASDAM    ;CONTINUE PROCESSING
  834. * RTN. D.39
  835. * ASSIGN VARIABLE AND ARRAY POINTER SPACE
  836. AVAP    LXI    B,1    ;SET UP FOR FIRST SYMBOL
  837.     LHLD    SDIR    ;SET UP FARY
  838.     SHLD    FARY
  839.     LHLD    ESRC    ;GET FIRST ADDRESS FOR VARIABLES
  840. AVAP3    PUSH    H    ;SAVE IT
  841. AVAP1    CALL    DFND    ;FIND THE POINTER
  842.     CPI    2    ;IS IT A VARIABLE?
  843.     JZ    AVAP4    ;YUP
  844.     CPI    16    ;IS IT AN ARRAY?
  845.     JZ    AVAP2    ;YUP
  846. AVAPD    MOV    D,B    ;BC TO DE
  847.     MOV    E,C
  848.     LHLD    SNUM    ;SEE IF WE ARE DONE YET
  849.     INX    B    ;UPDATE SYMBOL NUMBER
  850.     CALL    CMP16    ;CHECK
  851.     JNZ    AVAP1    ;NOPE
  852.     POP    H    ;GET ADDRESS BACK
  853.     SHLD    FRAV    ;SAVE NEXT AVAILABLE
  854.     RET        ;DONE
  855. AVAP4    PUSH    D
  856.     PUSH    B
  857.     LHLD    STAB    ;GET START OF SYMBOL TABLE
  858. AVAP41    CALL    COUNT
  859.     DAD    D
  860.     DCX    B
  861.     MOV    A,B
  862.     ORA    C
  863.     JNZ    AVAP41    ;LOOP TILL WE FIND IT
  864.     DCX    H
  865.     MOV    A,M
  866.     CPI    '$'+80H    ;SEE IF IT'S A DOLLAR SIGN
  867.     POP    B
  868.     POP    D
  869.     JNZ    AVAP2    ;REGULAR VARIABLE
  870.     POP    H    ;RESTORE
  871.     PUSH    B    ;SAVE
  872.     PUSH    D    ;SAVE
  873.     PUSH    H    ;SAVE
  874.     XCHG        ;STORE THE POINTER
  875.     DCX    H
  876.     MOV    M,D
  877.     DCX    H
  878.     MOV    M,E
  879.     XCHG
  880.     MVI    A,81H    ;ID BYTE
  881.     INX    H
  882.     INX    H
  883.     INX    H    ;BACKPOINTER ADDRESS
  884.     XCHG
  885.     LXI    H,1
  886.     CALL    AMBL    ;ASSIGN MEMORY BLOCK FOR STRING
  887.     MVI    M,80H    ;STORE A NULL
  888.     XCHG        ;ADDRESS TO DE
  889.     POP    H    ;RESTORE BLOCK ADDRESS
  890.     MVI    M,8    ;STORE BLOCK ID
  891.     INX    H    ;UPDATE
  892.     INX    H
  893.     INX    H
  894.     MOV    M,E    ;STORE POINTER
  895.     INX    H
  896.     MOV    M,D
  897.     INX    H
  898.     INX    H    ;CORRECT NEXT ADDRESS
  899.     POP    D    ;RESTORE
  900.     POP    B
  901.     PUSH    H    ;SAVE
  902.     JMP    AVAPD
  903. AVAP2    POP    H    ;GET ADDRESS BACK
  904.     XCHG        ;FREE HL
  905.     DCX    H    ;GET POINTER ADDRESS
  906.     MOV    M,D    ;STORE THE ADDRESS
  907.     DCX    H
  908.     MOV    M,E
  909.     XCHG        ;GET HL BACK
  910.     MVI    A,6    ;ZERO OUT 6 BYTES
  911. AVAPA    MVI    M,0FFH    ;STORE A FILLER
  912.     INX    H    ;UPDATE
  913.     DCR    A
  914.     JNZ    AVAPA
  915.     PUSH    H    ;STUFF IT ON THE STACK
  916.     JMP    AVAPD    ;LOOP FOR THE NEXT ONE
  917. ASD20    CALL    ASD30    ;PRINT THE SYMBOL
  918.     MVI    B,20H    ;DUPLICATE STATEMENT ERROR
  919.     LXI    H,ASD40    ;PRINT DUP STATEMENT MESSAGE
  920.     CALL    MSGER
  921.     JMP    ASDAQ    ;GET NEXT SYMBOL
  922. ASD10    CALL    ASD30    ;PRINT THE SYMBOL
  923.     MVI    B,21H    ;DUPLICATE FNXX ERROR
  924.     LXI    H,ASD50    ;PRINT DUP DEF MESSAGE
  925.     CALL    MSGER
  926.     JMP    ASDAQ    ;GET NEXT SYMBOL
  927. ASD30    PUSH    B    ;SAVE SYMBOL NUMBER
  928.     MVI    A,0DH    ;SEND A CARRIAGE RETURN
  929.     CALL    TOUT
  930.     POP    B    ;RESTORE SYMBOL NUMBER
  931.     LXI    H,TMP9    ;STORE AS A TOKEN
  932.     MVI    M,2
  933.     INX    H
  934.     MOV    M,C
  935.     INX    H
  936.     MOV    M,B
  937.     LXI    H,TMP9    ;DUMP IT
  938.     CALL    PRIT
  939.     RET
  940. ASD40    DB    ' DUP STATE N','M'+80H
  941. ASD50    DB    ' DUP DE','F'+80H
  942. COLON    DB    ':'+80H
  943. * RTN. D.40
  944. * UNDO POLISH STRING AND PRINT IT
  945. * IN: HL=LAST ADDRESS OF POLISH STRING (09 CODE)
  946. UPOS    PUSH    H    ;SAVE ADDRESS
  947.     LHLD    FARY    ;SET UP UNPOLISH STRING ADDRESS
  948.     XCHG
  949.     LDA    RURD    ;IS RUN READY?
  950.     ANA    A
  951.     JZ    UPOO1    ;NOPE
  952.     LHLD    PNTR    ;YUP, SO USE SPACE AFTER STACK
  953.     JMP    UPOO2    ;SKIP
  954. UPOO1    LHLD    SLIN    ;SET UP STACK ADDRESS
  955. UPOO2    MVI    B,0    ;STACK COUNT TO 0
  956.     DCX    D    ;STORE END FLAG
  957.     MVI    A,9
  958.     STAX    D
  959. UPOS1    XTHL        ;GET POLISH STRING ADDRESS
  960. UPOS3    DCX    H    ;GET THE ONE BEFORE IT
  961.     MOV    A,M    ;AYE, AYE, SIR
  962.     PUSH    D    ;SAVE NEW STRING ADDRESS
  963.     CALL    GTIN    ;GET THE INCREMENT
  964.     CALL    SUB16    ;FIND THE BEGINNING OF THIS TOKEN
  965.     INX    H    
  966.     POP    D    ;RESTORE NEW STRING ADDRESS
  967.     MOV    A,M    ;GET FIRST CHARACTER
  968.     CPI    9    ;IS IT THE END YET?
  969.     JZ    UPOS2    ;YUP
  970.     CPI    6    ;IS IT A LABEL, LITERAL, OR CONSTANT?
  971.     JC    UPOS4    ;YUP
  972.     CPI    0EH    ;IS IT A SEMICOLON?
  973.     JZ    UPOSW    ;YUP
  974.     CPI    0DH    ;IS IT A COMMA?
  975.     JZ    UPOSW    ;YUP
  976.     XTHL        ;MUST BE AN OPERATOR OR FUNCTION
  977.     MOV    C,A    ;STICK THE CHARACTER IN C
  978.     CPI    40H    ;IS IT A FUNCTION?
  979.     JP    UPOSM    ;YUP
  980.     CPI    34H    ;IS IT ARRAY OR FN OPERATOR?
  981.     JP    UPOSN    ;YUP
  982.     CPI    20H    ;IS IT BIGGER THAN AN OPERATOR?
  983.     JP    DMS10    ;YUP, SO NO NEED TO CHECK PRECEDENCE
  984.     CPI    0FH    ;IS IT AN OPERATOR?
  985.     JM    DMS10    ;NOPE, SO NO NEED TO CHECK PRECEDENCE
  986.     LDAX    D    ;GET BYTE FROM UNPOLISH STRING
  987.     CPI    20H    ;CHECK FOR OTHER THAN OPERATOR
  988.     JNC    DMS48    ;NOT AN OPERATOR
  989.     DCR    A    ;CHECK PRECEDENC
  990.     CMP    C    ;COMPARE
  991.     JP    DMS11    ;OOPS, NEED A PAREN OR TWO
  992. DMS48    INR    B    ;CHECK FOR EMPTY STACK
  993.     DCR    B
  994.     JZ    UPOS5    ;SURE IS
  995. DMS10    DCX    H    ;GET TOP OF STACK
  996.     MOV    A,M
  997.     CPI    20H    ;CHECK FOR PAREN ON STACK
  998.     INX    H    ;SET STACK BACK
  999.     JZ    UPOS5    ;NO NEED TO CHECK FURTHER
  1000.     DCR    A    ;SET UP FOR COMPARE
  1001.     CMP    C    ;CHECK FOR STACK HAVING PRECEDENCE
  1002.     JM    UPOS5    ;STACK'S OK
  1003. DMS11    MVI    M,20H    ;STORE CODE FOR "(" ON STACK
  1004.     INX    H    ;UPDATE COUNTERS
  1005.     INR    B
  1006.     DCX    D    ;STICK A ")" ON OUTPUT
  1007.     MVI    A,21H
  1008.     STAX    D
  1009. UPOS5    MOV    M,C    ;STORE OPERATOR ON STACK
  1010.     INX    H
  1011.     INR    B    ;UPDATED THE COUNTERS
  1012.     JMP    UPOS1    ;LOOP FOR ANOTHER TOKEN
  1013. UPOSW    DCX    D    ;NEXT BYTE OF UNPOLISH STRING
  1014.     STAX    D    ;STORE THE COMMA OR SEMICOLON
  1015.     XTHL
  1016.     DCX    H
  1017.     MOV    A,M
  1018.     INX    H
  1019.     CPI    3BH
  1020.     JNZ    UP02
  1021.     DCX    H
  1022.     DCR    B
  1023. UP02    XTHL
  1024.     JMP    UPOS3    ;CONTINUE PROCESSING
  1025. UPOSM    MOV    M,A    ;STUFF IT ON THE STACK
  1026.     INX    H
  1027.     MVI    M,20H    ;STUFF A '(' ON
  1028.     INX    H
  1029.     INR    B
  1030.     INR    B
  1031.     CPI    49H    ;CHECK FOR MULTI-ARGUMENT FUNCTIONS
  1032.     JZ    UP00
  1033.     CPI    5EH    ;IS IT CALL(X,X)?
  1034.     JZ    UP00    ;SURE IS
  1035.     CPI    50H
  1036.     JZ    UP00
  1037.     CPI    4CH
  1038.     JZ    UP01
  1039.     CPI    5CH    ;CHECK FOR A MATCH
  1040.     JZ    UP01    ;SURE WAS
  1041. UPOSO    DCX    D    ;STICK A ')' ON
  1042.     MVI    A,21H
  1043.     STAX    D
  1044.     JMP    UPOS1    ;LOOP FOR ANOTHER ONE
  1045. UP10    XTHL
  1046.     DCX    H
  1047.     MOV    A,M
  1048.     INX    H
  1049.     XTHL
  1050.     CPI    0DH
  1051.     JZ    UPOS1
  1052.     DCX    H
  1053.     DCR    B
  1054.     JMP    UPOS6
  1055. UPOSN    MOV    M,A    ;ON THE STACK
  1056.     INX    H
  1057.     INR    B
  1058.     JMP    UPOSO
  1059. UP01    MVI    M,3BH
  1060.     INX    H
  1061.     INR    B
  1062. UP00    MVI    M,3BH
  1063.     INX    H
  1064.     INR    B
  1065.     JMP    UPOSO
  1066. UPOSP    XTHL
  1067.     DCX    H
  1068.     MOV    A,M    ;GET NEXT TOKEN
  1069.     INX    H
  1070.     XTHL
  1071.     INX    H    ;UNPOP ARRAY OPERATOR
  1072.     INR    B
  1073.     CPI    0DH    ;COMMA?
  1074.     JZ    UPOS1    ;YUP
  1075.     CPI    0EH    ;SEMICOLON?
  1076.     JZ    UPOS1    ;YUP
  1077.     DCX    H    ;POP ONE
  1078.     DCR    B
  1079.     DCX    D    ;MOVE ON A'('
  1080.     MVI    A,20H
  1081.     STAX    D
  1082.     JMP    UPOS1    ;AND ANOTHER ONE
  1083. UPOS4    PUSH    B    ;SAVE REGISTERS
  1084.     PUSH    D
  1085.     MOV    A,M    ;GET A BYTE
  1086.     CALL    GTIN    ;GET INCREMENT
  1087.     XTHL        ;GET STRING ADDRESS
  1088.     CALL    SUB16    ;COMPUTE THE NEW ONE
  1089.     XCHG        ;STICK IT IN YOUR DE
  1090.     MOV    C,L    ;BC = HL
  1091.     MOV    B,H
  1092.     POP    H    ;GET SOURCE ADDRESS BACK
  1093.     CALL    MOVE    ;MOVE IT IN
  1094.     POP    B    ;GET BACK THE COUNTER
  1095.     XTHL        ;GET THE STACK RIGHT
  1096. UPOS6    INR    B    ;CHECK FOR EMPTY STACK
  1097.     DCR    B    
  1098.     JZ    UPOS1    ;SURE IS, SO LOOP FOR ANOTHER TOKEN
  1099.     DCX    H    ;GET ONE OFF STACK
  1100.     DCR    B
  1101.     MOV    A,M
  1102.     INX    H
  1103.     INR    B
  1104.     CPI    3BH
  1105.     JZ    UP10
  1106.     DCX    H
  1107.     DCR    B
  1108.     CPI    34H    ;IS IT ARRAY?
  1109.     JZ    UPOSP    ;YUP
  1110.     CPI    36H    ;IS IT FN?
  1111.     JZ    UPOSP    ;YUP
  1112.     DCX    D    ;MAKE ROOM ON STRING
  1113.     STAX    D    ;STUFF IT IN
  1114.     CPI    40H    ;CHECK FOR FUNCTION
  1115.     JP    UPOS6    ;LOOP FOR ANOTHER ONE OFF STACK
  1116.     CPI    20H    ;IS IT "("?
  1117.     JZ    UPOS6    ;YUP
  1118.     CPI    1DH    ;CHECK FOR UNARYS
  1119.     JZ    UPOS6
  1120.     CPI    1EH
  1121.     JZ    UPOS6
  1122.     JMP    UPOS1    ;OK, WE GOT ONE
  1123. UPOS2    POP    H    ;GET BACK STACK TO NORMAL
  1124.     XCHG        ;TO HL
  1125. UPOS7    PUSH    H    ;SAVE STRING ADDRESS
  1126.     CALL    PRIT    ;PRINT THIS TOKEN
  1127.     POP    H
  1128.     MOV    A,M    ;GET INCREMENT FOR THIS TOKEN
  1129.     CALL    GTIN
  1130.     DAD    D    ;ADD IT
  1131.     MOV    A,M    ;GET NEXT BYTE
  1132.     CPI    9    ;IS IT THE END FLAG?
  1133.     JNZ    UPOS7    ;NOPE
  1134.     RET        ;DONE.
  1135. LOTB    DB    ','+80H
  1136.     DB    ';'+80H
  1137.     DB    '='+80H
  1138. * RTN. D.41
  1139. * PRINT INTERNAL FORM
  1140. * HL = ADDRESS OF TOKEN TO PRINT
  1141. PRIT    MOV    A,M    ;GET A BYTE
  1142.     CPI    34H    ;IS IT AN ARRAY OPERATOR?
  1143.     RZ        ;YUP
  1144.     CPI    36H    ;IS IT A FUNCTION OPERATOR?
  1145.     RZ        ;YUP
  1146.     CPI    0A0H    ;CHECK FOR NORMAL STATEMENT
  1147.     JC    PRIT8    ;NOPE
  1148.     LXI    H,NOTBL    ;ADDRESS OF NORMAL STATEMENT TABLE
  1149.     SUI    0A0H    ;SUBTRACT OFFSET
  1150.     JMP    PRITP    ;DUMP IT OUT
  1151. PRIT8    CPI    80H    ;CHECK FOR AN ODDBALL STATEMENT
  1152.     JC    PRIT7    ;NOPE
  1153.     LXI    H,ODTBL    ;ADDRESS OF ODDBALL STATEMENT TABLE
  1154.     SUI    80H    ;SUBTRACT OFFSET
  1155.     CPI    8    ;CHECK FOR ON..GOSUB
  1156.     JNZ    PRITP    ;NOPE
  1157.     XRA    A    ;YUP
  1158. PRITP    CALL    PRIT2    ;DUMP IT
  1159.     LXI    H,DRAT    ;SEND A SPACE OUT
  1160.     CALL    LNOT
  1161.     RET
  1162. PRIT7    CPI    40H    ;CHECK FOR AN INTRINSIC FUNCTION
  1163.     JC    PRIT1    ;NOPE
  1164.     LXI    H,FUNT    ;ADDRESS OF FUNCTION TABLE
  1165.     SUI    40H    ;DUMP IT OUT
  1166.     JMP    PRIT2
  1167. PRIT1    CPI    2FH    ;CHECK FOR AN INTERMEDIARY
  1168.     JC    PRIT3    ;NOPE
  1169.     LXI    H,INTBL    ;ADDRESS OF INTERMEDIARY TABLE
  1170.     SUI    2FH    ;SUBTRACT OFFSET
  1171.     JMP    PRIT2
  1172. PRIT3    CPI    10H    ;CHECK FOR NORMAL OPERATOR
  1173.     JC    PRIT4    ;NOPE
  1174.     CPI    10H    ;CHECK FOR WORD OPERATORS
  1175.     JZ    PRITW
  1176.     CPI    11H
  1177.     JZ    PRITW
  1178.     CPI    12H
  1179.     JZ    PRITW
  1180.     CPI    1EH
  1181.     JZ    PRITW
  1182.     LXI    H,OTBL    ;OPERATOR TABLE ADDRESS
  1183.     SUI    10H    ;SUBTRACT OFFSET
  1184.     JMP    PRIT2
  1185. PRIT4    CPI    0DH    ;CHECK FOR LOW OPERATORS
  1186.     JC    PRIT5    ;NOPE
  1187.     LXI    H,LOTB    ;LOW OPERATORS TABLE ADDRESS
  1188.     SUI    0DH    ;SUBTRACT OFFSET
  1189.     JMP    PRIT2    ;DO IT
  1190. PRIT5    ANA    A    ;IS IT A STRING START?
  1191.     JNZ    PRIT6    ;NOPE
  1192.     INX    H    ;GET FIRST CHARACTER
  1193.     PUSH    H    ;SAVE ADDRESS
  1194.     LXI    H,DRAT1    ;QUOTE MESSAGE
  1195.     CALL    LNOT    ;SEND IT OUT
  1196.     POP    H    ;GET BACK THE ADDRESS
  1197.     CALL    LNOT    ;SEND IT OUT
  1198.     LXI    H,DRAT1    ;ANOTHER QUOT
  1199.     JMP    PRITZ    ;DO IT
  1200. PRITW    PUSH    PSW
  1201.     LXI    H,DRAT
  1202.     CALL    LNOT    ;SEND A SPACE
  1203.     LXI    H,OTBL
  1204.     POP    PSW
  1205.     SUI    10H    ;SUBTRACT OFFSET
  1206.     CALL    PRIT2    ;SEND IT
  1207.     LXI    H,DRAT    ;SEND ANOTHER SPACE
  1208.     CALL    LNOT
  1209.     RET        ;DONE
  1210. PRIT6    CPI    4    ;IS IT A NUMBER?
  1211.     JNZ    PRIT9    ;NOPE
  1212.     XCHG        ;SET UP INDEXES
  1213.     LDA    RURD    ;SEE IF READY TO RUN
  1214.     ANA    A
  1215.     JZ    P0000    ;NOPE
  1216.     LHLD    PNTR    ;YUP
  1217.     JMP    P0001
  1218. P0000    LHLD    SLIN
  1219. P0001    XCHG
  1220.     PUSH    D    ;SAVE ADDRESS FOR NUMBER
  1221.     INX    H
  1222.     CALL    NMST    ;CONVERT INTO A STRING
  1223.     XCHG        ;LAST ADDRESS TO HL
  1224.     DCX    H    ;SET UPPER BIT
  1225.     MOV    A,M
  1226.     ORI    80H
  1227.     MOV    M,A
  1228.     POP    H    ;GET ADDRESS BACK
  1229.     JMP    PRITZ    ;DO IT
  1230. PRIT9    INX    H    ;GET NAME NUMBER
  1231.     MOV    C,M
  1232.     INX    H
  1233.     MOV    B,M
  1234.     PUSH    B    ;SAVE IT
  1235.     LHLD    STAB    ;START OF SYMBOL TABLE
  1236. PRITB    DCX    B    ;CHECK COUNT
  1237.     MOV    A,B
  1238.     ORA    C
  1239.     JZ    PRITA    ;FOUND IT
  1240.     CALL    COUNT    ;COUNT CHARACTERS
  1241.     DAD    D    ;ADD TO INDEX
  1242.     JMP    PRITB    ;LOOP TO TRY AGAIN
  1243. PRITA    MOV    A,M    ;GET FIRST CHARACTER
  1244.     ANA    A    ;SEE IF IT IS ZERO
  1245.     JNZ    PRITC    ;NOPE
  1246.     INX    H    ;CORRECT
  1247. PRITC    CALL    LNOT    ;DUMP IT
  1248.     POP    B    ;RESTORE SYMBOL NUMBER
  1249.     CALL    DFND    ;GET ID BYTE
  1250.     RET        ;DONE
  1251. DRAT    DB    0A0H
  1252. PRIT2    MOV    C,A    ;COUNT TO C
  1253. PRITE    DCR    C    ;CHECK FOR C=0
  1254.     JM    PRITZ    ;YUP
  1255.     CALL    COUNT    ;COUNT CHARACTERS
  1256.     DAD    D
  1257.     JMP    PRITE    ;LOOP AGAIN
  1258. PRITZ    CALL    LNOT    ;DUMP IT
  1259.     RET    
  1260. * RTN. D.42
  1261. * FIND END OF EXPRESSION AND DUMP IT
  1262. * IN: HL = ADDRESS OF FIRST BYTE OF SOURCE EXPRESSION
  1263. * OUT: HL = ADDRESS AFTER EXPRESSION
  1264. FEND    MOV    A,M    ;GET A BYTE
  1265.     CALL    GTIN    ;GET THE INCREMENT
  1266.     DAD    D    ;ADD TO HL
  1267.     MOV    A,M    ;GET NEXT BYTE
  1268.     CPI    9    ;IS IT END OF EXPRESSION??
  1269.     JNZ    FEND    ;NOPE
  1270.     PUSH    H    ;SAVE THE ADDRESS
  1271.     CALL    UPOS    ;DUMP THE EXPRESSION
  1272.     POP    H    ;RECOVER ADDRESS
  1273.     INX    H    ;GET NEXT BYTE
  1274.     RET        ;DONE..
  1275. * RTN. D.43
  1276. * DUMP NAME 
  1277. DMNM    PUSH    H    ;SAVE ADDRESS
  1278.     CALL    PRIT    ;DUMP IT
  1279.     POP    H    ;GET ADDRESS BACK
  1280.     MOV    A,M    ;GET THE BYTE
  1281.     CALL    GTIN    ;GET THE INCREMENT
  1282.     DAD    D    ;ADD IT
  1283.     XCHG        ;TO DE
  1284.     LHLD    ESRC    ;CHECK FOR OVERRUN
  1285.     CALL    CMP16
  1286.     XCHG        ;BACK TO HL
  1287.     RZ        ;SURE IS
  1288.     MOV    A,M    ;GET NEXT BYTE
  1289.     CPI    8    ;CHECK FOR OFFSET
  1290.     RNZ        ;NOPE
  1291.     INX    H    ;YUP
  1292.     PUSH    H    ;SAVE IT
  1293.     LXI    H,DMNMM    ;PLUS MESSAGE
  1294.     CALL    LNOT    ;SEND IT
  1295.     POP    H    ;RESTORE HL
  1296.     JMP    FEND    ;PROCESS IT
  1297. * RTN. D.44
  1298. * DUMP STATEMENT
  1299. * IN: HL = ADDRESS OF FIRST BYTE OF STATEMENT
  1300. LOOKAH    MOV    A,M    ;GET A BYTE
  1301.     CPI    9FH    ;IS IT A TAB,COLON, OR BACKSLASH?
  1302.     RNC        ;CAN'T BE
  1303.     CPI    9CH
  1304.     RC        ;NOPE
  1305.     INX    H    ;TRY AGAIN
  1306.     JMP    LOOKAH
  1307. DMST    MOV    A,M    ;GET A BYTE
  1308.     CPI    9FH    ;IS IT A STATEMENT NAME???
  1309.     JZ    DMST1    ;YUP
  1310.     CPI    9BH    ;IS IT AN ELSE?
  1311.     JZ    DMELS    ;YUP
  1312.     CPI    9CH    ;IS IT A TAB?
  1313.     JZ    DMSTAB    ;YUP
  1314.     PUSH    H    ;SAVE IT AGAIN
  1315.     CALL    PRIT    ;PRINT THE STATEMENT NAME
  1316.     POP    H    ;RECOVER ADDRESS
  1317.     MOV    A,M    ;GET A BYTE AGAIN
  1318.     CPI    0A0H    ;IS IT A NORMAL STATEMENT
  1319.     JP    DMST2    ;YUP
  1320.     SUI    80H    ;SUBTRACT OFFSET
  1321.     ADD    A    ;MULTIPLY BY TWO 
  1322.     XCHG        ;HL TO DE
  1323.     LXI    H,DUJM    ;JUMP TABLE
  1324.     CALL    ADHL    ;ADD A TO HL
  1325.     MOV    C,M    ;GET ADDRESS OUT
  1326.     INX    H
  1327.     MOV    B,M
  1328.     XCHG        ;DE BACK TO HL
  1329.     INX    H    ;NEXT TOKEN
  1330.     PUSH    B    ;ADDRESS TO THE STACK
  1331.     RET        ;JUMP TO PROCESSOR
  1332. DMELS    PUSH    H    ;SAVE IT
  1333.     LXI    H,DMELSE    ;DUMP THE MESSAGE
  1334.     CALL    LNOT
  1335.     POP    H    ;RESTORE
  1336.     INX    H
  1337.     JMP    DMST
  1338. DMST1    INX    H    ;GET NEXT BYTE
  1339.     CALL    DMNM    ;DUMP THE NAME
  1340.     PUSH    H    ;SAVE HL
  1341.     LXI    H,WWWWW    ;SPACE MESSAGE
  1342.     CALL    LNOT    ;SEND IT
  1343.     POP    H    ;RESTORE HL
  1344.     JMP    DMST    ;DUMP THE REST OF THE STATEMENT
  1345. DMSTAB    PUSH    H
  1346.     LXI    H,DMSTBMS    ;SEND THE TAB OUT
  1347.     CALL    LNOT
  1348.     POP    H
  1349.     INX    H
  1350.     JMP    DMST
  1351. DMSTBMS    DB    89H
  1352. WWWWW    DB    0A0H    ;SPACE MESSAGE
  1353. DMST2    INX    H    ;GET NEXT BYTE
  1354.     MOV    A,M    ;CHECK FOR EXPRESSION FOLLOWING
  1355.     CPI    9
  1356.     JNZ    DMST5    ;NOPE
  1357. DMST3    CALL    FEND    ;DUMP THE EXPRESSION
  1358. DMST5    XCHG        ;SWAP
  1359.     LHLD    ESRC
  1360.     CALL    CMP16    ;CHECK FOR OVERRUN
  1361.     XCHG
  1362.     JZ    DMST6
  1363.     MOV    A,M
  1364.     CPI    35H    ;IS IT A REMARKS INDICATOR?
  1365.     JNZ    DMST6    ;NOPE
  1366.     PUSH    H    ;SAVE ADDRESS
  1367.     LXI    H,DMSG1    ;SEND A QUOTE OUT
  1368.     CALL    LNOT    ;GONE
  1369.     POP    H    ;GET ADDRESS BACK
  1370. DMSTC    INX    H    ;GET FIRST BYTE OF REMARKS
  1371.     INX    H
  1372. DMSTD    CALL    LNOT    ;SEND THEM OUT
  1373.     INX    H    ;GET NEXT BYTE ADDRESS
  1374. DMST6    SHLD    FLST    ;SAVE THE NEXT ADDRESS OF STATEMENT
  1375.     MOV    A,M    ;CHECK FOR A COLON BYTE
  1376.     CPI    9EH
  1377.     JZ    DMS00    ;SURE WAS
  1378.     CPI    9DH    ;CHECK FOR BACKSLASH
  1379.     JZ    DMS65    ;SURE WAS
  1380.     CALL    LOOKAH    ;GET NEXT SIGNIFICANT STATEMENT
  1381.     MOV    A,M    ;IS IT AN "ELSE"?
  1382.     CPI    9BH
  1383.     LHLD    FLST    ;SET UP TO CONTINUE IF IT IS
  1384.     JZ    DMST    ;SURE IS
  1385.     LXI    H,DMSG2    ;SEND A CARRIAGE RETURN
  1386.     CALL    LNOT    ;SEND IT
  1387.     RET        ;DONE
  1388. DMS00    LXI    H,COLON    ;SEND A COLON OUT
  1389.     CALL    LNOT
  1390.     LHLD    FLST    ;GET ADDRESS BACK
  1391.     INX    H    ;GET ADDRESS OF FOLLOWING STATEMENT
  1392.     JMP    DMST    ;DUMP IT OUT, TOO.
  1393. DMSG9    DB    ','+80H
  1394. DMSG1    DB    20H    ;QUOTES MESSAGE
  1395.     DB    0A7H
  1396. DMSG2    DB    08DH    ;CARRIAGE RETURN MESSAGE
  1397. DUJM    DW    DMST4    ;TABLE OF JUMPS FOR SPECIAL STATEMENTS
  1398.     DW    DMST7
  1399.     DW    DMST9
  1400.     DW    DMST8
  1401.     DW    DMST8
  1402.     DW    DMSTA
  1403.     DW    DMSTC
  1404.     DW    DMST5
  1405.     DW    DMSTT
  1406.     DW    DMST8
  1407. DMST4    CALL    FEND    ;DUMP EXPRESSION
  1408.     PUSH    H    ;SAVE ADDRESS
  1409.     LXI    H,DMSG3    ;"GOTO" MESSAGE
  1410. DMSTU    CALL    LNOT    ;SEND IT
  1411.     POP    H    ;RECOVER ADDRESS
  1412.     CALL    DNLS    ;SEND THE LIST OF LINE DESCRIPTORS
  1413.     JMP    DMST5    ;CHECK FOR REMARKS FOLLOWING
  1414. DMST7    CALL    DMNM    ;PROCESS NAME
  1415.     MOV    A,M    ;CHECK FOR EXPRESSION FOLLOWING
  1416.     CPI    9
  1417.     JNZ    DMST5    ;NONE
  1418.     PUSH    H    ;SAVE ADDRESS
  1419.     LXI    H,DMSG9    ;COMMA
  1420.     CALL    LNOT    ;SEND IT
  1421.     POP    H    ;RECOVER ADDRESS
  1422.     JMP    DMST3    ;DUMP THE EXPRESSION
  1423.     JMP    DMST3    ;GET FOLLOWING EXPRESSION
  1424. DMST8    CALL    DMNM    ;PROCESS NAME
  1425.     JMP    DMST5    ;CHECK FOR REMARKS
  1426. DMST9    CALL    FEND    ;PROCESS EXPRESSION
  1427.     PUSH    H    ;SAVE ADDRESS
  1428.     LXI    H,DMSG4    ;DUMP A "TO"
  1429.     CALL    LNOT    ;THERE YOU GO
  1430.     POP    H    ;RECOVER ADDRESS
  1431.     CALL    FEND    ;GET NEXT EXPRESSION
  1432.     MOV    A,M    ;GET NEXT BYTE
  1433.     CPI    9    ;CHECK FOR ANOTHER EXPRESSION
  1434.     JNZ    DMST5    ;NOPE, SO LOOK FOR REMARKS
  1435.     PUSH    H    ;SAVE ADDRESS
  1436.     LXI    H,DMSG5    ;DUMP A "STEP"
  1437.     CALL    LNOT    ;DUMP IT DUMMY
  1438.     POP    H    ;RECOVER ADDRESS
  1439.     JMP    DMST3    ;DUMP THE LAST EXPRESSION AND QUIT
  1440. DMSTA    CALL    FEND    ;DUMP EXPRESSION
  1441. DMSTB    PUSH    H    ;SAVE ADDRESS
  1442.     LXI    H,DMSG6    ;DUMP A "THEN"
  1443.     CALL    LNOT    ;SEND IT
  1444.     POP    H    ;GET BACK THE ADDRESS
  1445.     CALL    DMST    ;PROCESS AS ANOTHER COMPLETE STATEMEN
  1446.     RET        ;DONE
  1447. DMELSE    DB    ' ELSE',' '+80H
  1448. DMSG3    DB    ' GOTO',0A0H
  1449. DMSG4    DB    ' TO',0A0H
  1450. DMSG5    DB    ' STEP',0A0H
  1451. DMSG6    DB    ' THEN',0A0H
  1452. * RTN. D.45
  1453. * DUMP NAME LIST
  1454. DNLS    CALL    DMNM    ;DUMP A NAME
  1455.     MOV    A,M    ;GET A BYTE
  1456.     CPI    6    ;IS IT A NAME?
  1457.     JZ    DNLS1    ;YUP
  1458.     RET        ;NOPE
  1459. DNLS1    PUSH    H    ;SAVE HL
  1460.     LXI    H,LOTB    ;COMMA MESSAGE
  1461.     CALL    LNOT    ;SEND IT
  1462.     POP    H    ;GET HL BACK
  1463.     JMP    DNLS    ;DUMP THE NEXT ONE
  1464. * RTN. D.46
  1465. * FIND LINE IN SOURCE, WITH OFFSET
  1466. * IN: BC = SYMBOL NUMBER
  1467. *  DE = OFFSET (+- 32K)
  1468. LILO    PUSH    D    ;SAVE OFFSET
  1469.     PUSH    B    ;SAVE 'EM
  1470.     LDA    RUNF    ;ARE WE RUNNING?
  1471.     ANA    A
  1472.     JNZ    LILO7    ;YUP
  1473.     CALL    ASDA    ;ASSIGN ALL STATEMENT NAMES
  1474. LILO7    POP    B    ;GET 'EM BACK
  1475.     CALL    DFND    ;GET THE POINTER
  1476.     XCHG
  1477.     LHLD    ESRC
  1478.     INX    H
  1479.     CALL    CMP16
  1480.     JC    LILOG    ;TOO BIG
  1481.     LHLD    FSRC
  1482.     DCX    H
  1483.     CALL    CMP16
  1484.     JNC    LILOG    ;TOO SMALL
  1485.     XCHG
  1486.     SHLD    LINE
  1487.     MOV    A,M    ;CHECK FOR A STATEMENT
  1488.     CPI    9FH
  1489.     MVI    B,7    ;ERROR CODE JUST IN CASE
  1490.     JNZ    ERROR
  1491.     POP    B    ;GET OFFSET TO BC
  1492.     INR    B    ;CHECK FOR NEGATIVE
  1493.     DCR    B
  1494.     JP    LILO1    ;NOPE
  1495.     INX    B    ;YUP, SO DECREASE BY ONE
  1496. LILO1    MOV    A,B    ;CHECK FOR BC=0
  1497.     ORA    C
  1498.     RZ        ;SURE WAS
  1499.     CALL    LILO3    ;MOVE UP OR BACK ONE STATEMENT
  1500.     PUSH    D    ;SAVE D
  1501.     XCHG
  1502.     LHLD    ESRC
  1503.     CALL    CMP16
  1504.     JZ    LIL82    ;ERROR
  1505.     LHLD    SLIN
  1506.     CALL    CMP16
  1507.     JZ    LIL82
  1508.     XCHG
  1509.     POP    D
  1510. LILO2    INR    B    ;SET FLAGS FOR B
  1511.     DCR    B
  1512.     JM    LILO4    ;WE'S GOIN' BACKWARDS
  1513.     DCX    B    ;ANOTHER ONE DOWN THE DRAIN
  1514.     JMP    LILO1    ;SEE IF WE'RE DONE YET
  1515. LILO4    INX    B    ;THE BACKWARDS MOVE
  1516.     JMP    LILO1    ;CHECK FOR DONENESS
  1517. LILO3    PUSH    B    ;SAVE THE OFFSET COUNT
  1518.     INR    B    ;SET FLAGS FOR B
  1519.     DCR    B
  1520.     JM    LILO5    ;TIME FOR A BACKSTROKE
  1521. LILOF    MOV    A,M    ;GET A BYTE
  1522.     PUSH    PSW    ;SAVE IT
  1523.     CALL    MFOS    ;MOVE FORWARD ONE STATEMENT
  1524.     POP    PSW    ;GET BYTE BACK
  1525.     CPI    9FH    ;IS IT A NAME?
  1526.     JZ    LILOF    ;YUP
  1527.     CPI    85H    ;IS IT AN IF?
  1528.     JZ    LILOF    ;YUP
  1529.     CPI    9CH    ;IS IT A TAB
  1530.     JZ    LILOF    ;YUP!
  1531.     MOV    A,M    ;CHECK FOR COLON BYTE
  1532.     CPI    9EH
  1533.     JZ    LIL00    ;SURE WAS
  1534.     CPI    9BH    ;IS IT AN ELSE?
  1535.     JZ    LIL00    ;YUP
  1536.     CPI    9DH
  1537.     JZ    LIL00
  1538. LILO6    POP    B    ;GET BACK THE OFFSET COUNT
  1539.     RET        ;DONE
  1540. LILO5    CALL    LILOBAK    ;MOVE BACK
  1541.     CALL    LILOBAK    ;MOVE BACK AGAIN
  1542.     MOV    A,M    ;GET A BYTE
  1543.     PUSH    PSW    ;SAVE IT
  1544.     CALL    MFOS    ;MOVE UP
  1545.     POP    PSW    ;GET BYTE BACK
  1546.     CPI    9FH    ;IS IT A STATEMENT NAME?
  1547.     JZ    LILO5    ;YUP
  1548.     CPI    85H    ;IS IT AN IF?
  1549.     JZ    LILO5
  1550.     CPI    9EH    ;CHECK FOR COLON BYTE
  1551.     JZ    LIL01    ;SURE WAS
  1552.     CPI    9BH    ;IS IT AN ELSE?
  1553.     JZ    LIL01    ;YUP
  1554.     CPI    9DH
  1555.     JZ    LIL01
  1556.     CPI    9CH    ;IS IT A TAB?
  1557.     JZ    LILO5    ;YUP
  1558.     JMP    LILO6    ;NOPE
  1559. LILOG    MVI    B,7    ;ILLEGAL STATEMENT
  1560.     JMP    ERROR
  1561. LIL00    INX    H    ;GET NEXT ADDRESS
  1562.     SHLD    LINE    ;MAKE IT NEXT
  1563.     JMP    LILOF    ;CONTINUE
  1564. LIL01    CALL    LILOBAK    ;BACK UP, JACK
  1565.     JMP    LILO5
  1566. LILOBAK    CALL    MBOS    ;BACK UP
  1567.     MOV    A,M    ;CHECK FOR TAB
  1568.     CPI    9CH
  1569.     JZ    LILOBAK    ;SURE IS, SO BACK UP AGAIN
  1570.     RET        ;DON
  1571. DMNMM    DB    ' &',0A0H
  1572. DMS65    LXI    H,DMS66    ;SEND BACKSLASH/CARRIAGE RETURN
  1573.     JMP    DMS00+3    ;SEND IT OUT
  1574. DMS66    DB    5CH    ;BACKSLASH
  1575.     DB    8DH    ;CARRIAGE RETURN
  1576. LIL82    MVI    B,7
  1577.     JMP    ERROR
  1578. DMSTT    CALL    FEND    ;DUMP EXPRESSION
  1579.     PUSH    H    ;SAVE ADDRESS
  1580.     LXI    H,DMGOS    ;GOSUB MESSAGE
  1581.     JMP    DMSTU    ;FINISH IT UP
  1582. DMGOS    DB    ' GOSUB',0A0H
  1583. * RTN. D.47
  1584. * GET LINE AND OFFSET FOR COMMANDS
  1585. GLFC    CALL    USCN    ;GET NEXT TOKEN
  1586.     RC        ;THERE AIN'T NONE, BOSS
  1587.     LHLD    TSCN    ;GET ADDRESS OF TOKEN
  1588.     CALL    SSRC    ;SEE IF IT'S IN THE TABLE
  1589.     PUSH    B    ;SAVE THE SYMBOL NUMBER
  1590.     MVI    B,7    ;ERROR CODE JUST IN CASE
  1591.     JNZ    ERROR    ;NOT EVEN LISTED!
  1592.     ANI    3FH    ;STRIP OFF UPPER TWO BITS
  1593.     CPI    1    ;MAKE SURE IT'S A STATEMENT
  1594.     JNZ    ERROR    ;NOT A STATEMENT!!!!!!!
  1595.     CALL    USCN    ;SCAN OFF THE NEXT TOKEN
  1596.     JNC    GLFC1    ;NOT THE END YET
  1597. GLFC4    LXI    D,0    ;CLEAR DE
  1598. GLFC2    XRA    A    ;CLEAR CARRY
  1599.     POP    B    ;GET BACK SYMBOL NUMBER
  1600.     RET        ;DONE.....
  1601. GLFC1    LHLD    TSCN    ;ADDRESS OF TOKEN
  1602.     MOV    A,M    ;GET THE TOKEN
  1603.     CPI    '+'+80H    ;IS IT A PLUS SIGN?
  1604.     JZ    GLFC5    ;YUP
  1605.     CPI    '-'+80H    ;IS IT A MINUS SIGN?
  1606.     JNZ    GLFC3    ;NOPE
  1607. GLFC5    PUSH    PSW    ;SAVE IT
  1608.     CALL    USCN    ;SCAN OFF YET ANOTHER TOKEN.
  1609.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  1610.     JC    ERROR    ;RAN INTO THE END, BUMP.
  1611.     CALL    LGNM    ;CONVERT TO A NUMBER
  1612.     MVI    B,10H    ;ERROR CODE IN CASE A STONE IS ENTERING
  1613.     JC    ERROR    ;HE WAS
  1614.     LXI    H,TMP10    ;ADDRESS OF NUMBER
  1615.     CALL    BCDB    ;CONVERT NUMBER TO BINARY
  1616.     POP    PSW    ;GET THE TOKEN BACK
  1617.     XCHG        ;HL TO DE
  1618.     CPI    '-'+80H    ;WAS IT A MINUS SIGN
  1619.     JNZ    GLFC2    ;NOPE
  1620.     MOV    A,D    ;YES, SO 1'S COMPLEMENT TIME
  1621.     CMA
  1622.     MOV    D,A
  1623.     MOV    A,E
  1624.     CMA
  1625.     MOV    E,A
  1626.     INX    D    ;CORRECT FOR 2'S COMPLEMENT
  1627.     JMP    GLFC2    ;CONTINUE TOWARDS LEAVING
  1628. GLFC3    CALL    BSCN    ;OOPS, BACK UP
  1629.     JMP    GLFC4    ;EXIT WITHOUT ANY OFFSET
  1630. * RTN. D.48
  1631. * LIST COMMAND INTERPRETER
  1632. LIST    LHLD    FSRC    ;GET FIRST ADDRESS OF SOURC
  1633.     SHLD    FLST    ;MAKE THIS THE FIRST ADDRESS TO LIST
  1634.     LHLD    ESRC    ;GET LAST ADDRESS OF SOURCE
  1635.     LDA    CSST    ;SET CATV APPROPRIATELY
  1636.     STA    CATV
  1637.     SHLD    LLST    ;MAKE THIS THE LAST ADDRESS TO LIST
  1638.     CALL    GLFC    ;GET LINE
  1639.     JC    LIST1    ;THIS PARAMETER NOT INPUTTED
  1640.     CALL    LILO    ;FIND THE ADDRESS
  1641.     SHLD    FLST    ;CHANGE THE FIRST ADDRESS TO LIST
  1642.     CALL    GLFC    ;GET LINE
  1643.     JC    LIST1    ;THIS PARAMETER NOT INPUTTED
  1644.     CALL    LILO    ;FIND THE ADDRESS
  1645.     SHLD    LINE    ;MOVE UP ONE MORE
  1646. LISTK    MOV    A,M    ;GET A BYTE
  1647.     PUSH    PSW    ;SAVE IT
  1648.     CALL    MFOS    ;MOVE UP ONE
  1649.     POP    PSW    ;CHECK FOR NAMES AND IFS
  1650.     CPI    85H
  1651.     JZ    LISTK
  1652.     CPI    9FH
  1653.     JZ    LISTK
  1654.     CPI    9EH
  1655.     JZ    LISTK
  1656.     CPI    9DH
  1657.     JZ    LISTK
  1658.     CPI    9CH
  1659.     JZ    LISTK
  1660.     CPI    9BH
  1661.     JZ    LISTK
  1662.     SHLD    LLST    ;CHANGE THE LAST ADDRESS TO LIST
  1663. LIST1    XRA    A    ;GET FIRST ADDRESS TO DE
  1664. LIS33    LHLD    FLST
  1665.     XCHG
  1666.     LHLD    LLST    ;GET LAST ADDRESS
  1667.     CALL    CMP16    ;CHECK RELATIVE SIZE
  1668.     JZ    LISTW    ;DONE
  1669.     JC    SPRAT    ;REVERSED PARAMETERS
  1670. LIST2    XCHG        ;PUT 'EM BACK
  1671.     CALL    DMST    ;DUMP THE STATEMENT OUT
  1672.     CALL    CONT    ;CHECK FOR CONTROL C
  1673.     JZ    RSTRT    ;IT WAS PUSHED
  1674.     JMP    LIS33    ;GET THE NEXT ONE
  1675. LISTW    LDA    CSST
  1676.     ANA    A
  1677.     JZ    RSTRT
  1678.     LXI    H,DMSG2
  1679.     CALL    LNOT
  1680.     XRA    A
  1681.     STA    CSST
  1682.     STA    CATV
  1683.     STC
  1684.     INR    A    ;CLEAR ZERO FLAG
  1685.     CALL    COUT
  1686.     JMP    RSTRT
  1687. * RTN. D.49
  1688. * ENTER COMMAND INTERPRETER
  1689. ENTR    LHLD    ESRC    ;GET END OF SOURCE
  1690.     XRA    A    ;CLEAR RUN READY FLAG
  1691.     STA    RURD
  1692.     SHLD    INSR    ;SET INSERTION POINT THERE
  1693.     CALL    GLFC    ;CHECK FOR A PARAMETER
  1694.     MVI    A,0    ;SET ENTER MODE
  1695.     STA    CMND
  1696.     JC    RSTRT    ;NONE
  1697.     CALL    LILO    ;GET THE ADDRESS
  1698.     SHLD    INSR    ;SET INSERTION POINT THERE
  1699.     JMP    RSTRT    ;BACK TO THE MAINSTREAM
  1700. * RTN. D.50
  1701. * DELETE COMMAND INTERPRETER
  1702. DLTE    CALL    GLFC    ;CHECK FOR A PARAMETER
  1703.     PUSH    B    ;SAVE BC
  1704.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  1705.     JC    ERROR    ;NO PARAMETERS ENTERED
  1706.     POP    B    ;RECOVER BC
  1707.     CALL    LILO    ;GET ADDRESS
  1708.     SHLD    FLST    ;SET UP FLAGS
  1709.     SHLD    LLST
  1710.     CALL    GLFC    ;CHECK FOR SECOND PARAMETER
  1711.     JC    DLTE1    ;NOPE
  1712.     CALL    LILO    ;GET ADDRESS
  1713.     SHLD    LLST    ;SAVE IT
  1714. DLTE1    MOV    A,M    ;GET A BYTE
  1715.     PUSH    PSW    ;SAVE IT
  1716.     CALL    MFOS    ;MOVE FORWARD ONE
  1717.     POP    PSW    ;RESTORE PSW
  1718.     CPI    9FH    ;CHECK FOR A STATEMENT NAME
  1719.     JZ    DLTE1    ;NOPW
  1720.     CPI    85H    ;CHECK FOR IF
  1721.     JZ    DLTE1    ;YUP
  1722.     CPI    9CH    ;IS IT A TAB?
  1723.     JZ    DLTE1    ;SURE IS
  1724.     MOV    A,M    ;CHECK FOR COLON OR BACKSLASH
  1725.     CPI    9EH
  1726.     JZ    DLTE4    ;SURE WAS
  1727.     CPI    9BH    ;IS IT AN ELSE?
  1728.     JZ    DLTE4    ;YUP
  1729.     CPI    9DH
  1730.     JNZ    DLTE2    ;NOPE
  1731. DLTE4    CALL    MFOS    ;MOVE UP TWO
  1732.     JMP    DLTE1    ;TRY AGAIN
  1733. DLTE2    XCHG        ;HL TO DE
  1734.     LHLD    ESRC    ;END OF SOURCE
  1735.     CALL    SUB16    ;GET THE DIFFERENCE
  1736.     MOV    A,H    ;CHECK FOR NONE TO MOVE
  1737.     ORA    L
  1738.     JZ    DLTE3    ;MUST BE LAST STATEMENT DELETED
  1739.     MOV    C,L
  1740.     MOV    B,H
  1741.     LHLD    FLST    ;GET FIRST ADDRESS TO KILL
  1742.     XCHG        ;SWAP
  1743.     CALL    MOVE    ;MOVE 'EM DOWN
  1744.     XCHG        ;FLST TO HL
  1745.     DAD    B    ;ADD N
  1746.     SHLD    ESRC    ;NEW END OF SOURCE
  1747. * RTN. D.51
  1748. * CLEAR COMMAND PROCESSOR
  1749. CLER    XRA    A    ;CLEAR RURD (RUN READY FLAG)
  1750.     STA    RURD
  1751.     LDA    EDITM
  1752.     ANA    A    ;ARE WE IN EDIT MODE?
  1753.     JZ    RSTRT    ;NOPE
  1754.     LXI    SP,STACK+100
  1755.     PUSH    H    ;SET UP FOR BACK TO EDIT
  1756.     JMP    PSSF    ;MOVE FORWARD ONE STATEMENT
  1757. DLTE3    LHLD    FLST    ;NEW END
  1758.     SHLD    ESRC
  1759.     JMP    CLER
  1760. * RTN. D.52
  1761. * RUN COMMAND PROCESSOR
  1762. PRUN    LHLD    ESRC    ;MAKE SURE THERE IS A PROGRAM
  1763.     XCHG
  1764.     LHLD    FSRC
  1765.     CALL    CMP16
  1766.     JZ    RSTRT    ;NONE LOADED
  1767.     CALL    CHCKA    ;CHECK BASIC'S INTEGRITY.
  1768.     CALL    GLFC    ;LOOK FOR A SPECIFIC LINE
  1769.     LHLD    FSRC    ;PRESET DATA FLAGS
  1770.     SHLD    DATAP
  1771.     LXI    H,0
  1772.     SHLD    DATAT
  1773.     SHLD    DATAW
  1774.     LHLD    SDIR    ;INITIALIZE ARRAY SPACE
  1775.     SHLD    FARY
  1776.     LHLD    FRAV    ;INITIALIZE PNTR
  1777.     SHLD    PNTR
  1778.     SHLD    NPNTR
  1779.     LHLD    FSRC    ;GET START OF SOURCE IN CASE THERE IS NO
  1780. * SPECIFIED LINE
  1781.     JC    PRUN2    ;TWERE'NT NONE
  1782.     CALL    LILO    ;FIND THE ADDRESS
  1783. PRUN2    LDA    RURD    ;GET RUN READY FLAG
  1784.     ANA    A    ;IS IT SET?
  1785.     JNZ    RUN    ;ALREADY SET
  1786.     PUSH    H    ;SAVE START ADDRESS
  1787.     CALL    ASDA    ;ASSIGN STATEMENT ADDRESSES
  1788.     CALL    AVAP    ;ASSIGN ARRAY POINTER AND VARIABLE SPACE
  1789.     MVI    A,0FFH    ;SET RUN READY
  1790.     STA    RURD
  1791.     LHLD    FRAV    ;INITIALIZE PNTR
  1792.     SHLD    PNTR
  1793.     POP    H    ;GET BACK ADDRESS
  1794.     JMP    RUN    ;SO GO RUN ALREADY
  1795. * RTN. D.53
  1796. * CONT COMMAND INTERPRETER
  1797. PCNT    LDA    RURD    ;RUN READY?
  1798.     ANA    A    ;FIND OUT
  1799.     JZ    PCNT1    ;NOPE
  1800.     LHLD    LINEA    ;GET CURRENT LINE ADDRESS
  1801.     XCHG        ;SEE IF WE ARE DONE
  1802.     LHLD    ESRC
  1803.     XCHG
  1804.     CALL    CMP16
  1805.     JZ    PCNT1    ;YUP
  1806.     JMP    RUN    ;GO RUN IT
  1807. PCNT1    MVI    B,22H    ;ERROR
  1808.     JMP    ERROR
  1809. * RTN. D.54
  1810. * NEW COMMAND PROCESSOR
  1811. PNEW    CALL    PNEW1    ;INITIALIZE ALL THIS CRAP
  1812.     JMP    RSTRT    ;DONE
  1813. PNEW1    LXI    H,1    ;GET A 16 BIT ONE
  1814.     SHLD    SNUM    ;NUMBER OF SYMBOLS IS ONE
  1815.     LHLD    MEND    ;END OF MEMORY
  1816.     SHLD    STAB    ;IS EQUAL TO THE START OF SYMBOLS
  1817.     MVI    M,80H    ;AND SET THE END IN
  1818.     DCX    H    ;GET MEND-3
  1819.     MVI    M,0
  1820.     DCX    H
  1821.     MVI    M,0
  1822.     DCX    H
  1823.     MVI    M,0
  1824.     SHLD    SDIR    ;START OF DIRECTORY
  1825.     XRA    A    ;CLEAR A
  1826.     STA    RURD    ;CLEAR THE RUN READY FLAG
  1827.     LHLD    EBSC    ;GET END BASIC FLAG
  1828.     SHLD    FSRC    ;STORE SOURCE FLAGS
  1829.     SHLD    ESRC
  1830.     SHLD    FRAV    ;INITIALIZE FRAV
  1831.     LXI    H,C2767    ;INITIALIZE SEED
  1832.     LXI    D,SEED
  1833.     LXI    B,6
  1834.     CALL    MOVE
  1835.     CALL    CHCKA    ;CHECK ON THE INTERPRETER'S INTEGRITY
  1836. INERT    RET        ;DONE....
  1837. * RTN. D.55
  1838. * CLOAD STATEMENT PROCESSOR
  1839. PCLD    CALL    PNEW1    ;MAKE ROOM FOR A NEW PROGRAM
  1840. PCLD1    LXI    H,PCLDM    ;CADD ENTRANCE
  1841.     CALL    MSGER    ;SEND NOTIFIER
  1842.     XRA    A    ;SEND START MOTORS
  1843.     CALL    CAIN
  1844.     CALL    USCN    ;SCAN OFF NEXT TOKEN
  1845.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  1846.     JC    ERROR    ;NO INPUT, DUMMY
  1847. PCLD2    LHLD    ESRC    ;GET ADDRESS TO INPUT TO
  1848.     CALL    LICA    ;INPUT A LINE FROM THE CASSETTE
  1849.     LHLD    ESRC    ;GET ADDRESS AGAIN
  1850.     MOV    A,M    ;GET THE BYTE
  1851.     CPI    1    ;WAS IT NAME INDICATOR?
  1852.     JNZ    PCLD2    ;NOPE
  1853.     INX    H    ;GET NEXT ADDRESS
  1854.     XCHG        ;HL TO DE
  1855.     LHLD    TSCN    ;GET CHARACTER
  1856.     MOV    A,M
  1857.     ORI    80H    ;INSERT STROBE
  1858.     XCHG        ;DE TO HL
  1859.     CMP    M    ;ARE THEY THE SAME    ?
  1860.     JNZ    PCLD2    ;NOPE
  1861.     MVI    A,0FFH    ;SET CSST AND ENTER MODE
  1862.     STA    CSST
  1863.     XRA    A
  1864.     STA    CMND
  1865.     LHLD    ESRC    ;SET UP INSERTION POINT
  1866.     SHLD    INSR
  1867.     JMP    RSTRT    ;INPUT 'EM
  1868. LINK4    LINK    B:TBASICA5
  1869.