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 / TBASICA6.ASM < prev   
Assembly Source File  |  1984-04-29  |  26KB  |  1,332 lines

  1. SANA    JNC    SPRAT    ;ERROR IF NO EXPRESSION
  2.     CALL    FNOP    ;GET AN OPERAND
  3.     JNC    SPRAT    ;ERROR IF NOT A STRING
  4.     PUSH    H    ;SAVE ADDRESS
  5.     CALL    CRLF    ;SEND A CR TO THE CONSOLE
  6.     LXI    H,PCSVM    ;SEND WRITING CASSETTE MESSAGE
  7.     CALL    MSGER
  8.     XRA    A    ;SEND START MOTORS
  9.     CALL    BPORT
  10.     POP    H
  11. SANA1    MOV    A,M    ;SEND OUT THE NAME
  12.     PUSH    H
  13.     CALL    OBPORT
  14.     POP    H    ;SEE IF WE'RE DONE
  15.     MOV    A,M
  16.     INX    H    ;UPDATE INDEX
  17.     ANA    A
  18.     JP    SANA1    ;NOPE
  19.     LHLD    FSRC    ;COMPUTE NUMBERS OF BYTES
  20.     XCHG
  21.     LHLD    ESRC
  22.     CALL    SUB16
  23.     SHLD    TMP1
  24.     LHLD    SNUM
  25.     SHLD    TMP1+2
  26.     LHLD    SDIR
  27.     XCHG
  28.     LHLD    SSSS
  29.     CALL    SUB16
  30.     SHLD    TMP1+4
  31.     XCHG
  32.     LHLD    TMP1
  33.     LXI    B,7
  34.     DAD    B
  35.     DAD    D
  36.     SHLD    TMP1+6
  37.     MOV    A,L    ;SEND TOTAL NUMBER OF BYTES
  38.     CALL    OBPORT
  39.     LDA    TMP1+7    ;SEND MSB
  40.     CALL    OBPORT
  41.     LXI    H,TMP1    ;SEND PARAMETERS
  42.     MVI    B,6
  43. SANA2    MOV    A,M
  44.     PUSH    B
  45.     PUSH    H
  46.     CALL    OBPORT
  47.     POP    H    ;RESTORE
  48.     POP    B
  49.     DCR    B    ;UPDATE
  50.     INX    H
  51.     JNZ    SANA2    ;MORE TO DO
  52.     LHLD    TMP1    ;GET NUMBER OF SOURCE BYTES
  53.     XCHG        ;TO DE
  54.     LHLD    FSRC    ;FIRST BYTE LOCATION
  55.     CALL    SANAA    ;DO IT
  56.     LHLD    TMP1+4    ;GET NUMBER OF DIRECTORY BYTES
  57.     XCHG
  58.     INX    D
  59.     LHLD    SDIR    ;FIRST BYTES LOCATION
  60.     CALL    SANAA    ;DO IT
  61.     STC        ;SEND STOP MOTORS
  62.     MVI    A,0
  63.     INR    A
  64.     CALL    BPORT
  65.     RET        ;DONE
  66. SANAA    MOV    A,M    ;GET A BYTE
  67.     PUSH    H
  68.     PUSH    D    ;SAVE 'EM
  69.     CALL    OBPORT
  70.     POP    D
  71.     POP    H
  72.     DCX    D
  73.     INX    H    ;UPDATE
  74.     MOV    A,D
  75.     ORA    E    ;CHECK FOR DONENESS
  76.     JNZ    SANAA
  77.     RET        ;DONE
  78. SANC    MVI    A,0FFH    ;SET BFLAG
  79.     STA    BFLAG
  80.     PUSH    PSW    ;SAVE
  81.     PUSH    D
  82.     XRA    A    ;SEND START MOTORS
  83.     CALL    BPORT
  84.     POP    D
  85.     POP    PSW
  86.     JMP    SPRAZ    ;DO IT
  87. SAND    MVI    A,0FFH
  88.     STA    BFLAG
  89.     PUSH    D
  90.     PUSH    PSW
  91.     XRA    A
  92.     CALL    BINPOR
  93.     POP    PSW
  94.     POP    D
  95.     JMP    SPRFZ    ;DO IT
  96. SANB    JNC    SPRAT    ;ERROR IF NO EXPRESSION
  97.     CALL    FNOP    ;GET AN OPERAND
  98.     JNC    SPRAT    ;ERROR IF NOT A STRING
  99.     PUSH    H    ;SAVE IT
  100.     CALL    CRLF    ;SEND A CR TO THE CONSOLE
  101.     LXI    H,PCLDM    ;SEND READING CASSETTE MESSAGE
  102.     CALL    MSGER
  103.     CALL    PNEW1    ;CLEAR ANY EXISTING PROGRAMS
  104.     XRA    A    ;SEND START MOTORS
  105.     CALL    BINPOR
  106. SANB3B    LHLD    FARY    ;GET A PLACE TO READ IN STRING
  107.     DCR    H
  108. SANB1    PUSH    H    ;SAVE ADDRESS
  109.     CALL    OBINPOR    ;GET A BYTE
  110.     POP    H
  111.     MOV    M,A    ;STUFF IT
  112.     INX    H
  113.     ANA    A    ;DONE?
  114.     JP    SANB1    ;NOPE
  115.     LHLD    FARY
  116.     DCR    H
  117.     POP    D
  118.     CALL    STRNG    ;COMPARE THEM
  119.     JNZ    SANB2    ;NOT THE SAME
  120.     CALL    OBINPOR    ;IGNORE TWO
  121.     CALL    OBINPOR
  122.     LXI    H,TMP1    ;READ PARAMETERS
  123.     MVI    B,6
  124. SANB3    PUSH    H
  125.     PUSH    B
  126.     CALL    OBINPOR
  127.     POP    B
  128.     POP    H
  129.     MOV    M,A
  130.     DCR    B    ;DONE?
  131.     INX    H
  132.     JNZ    SANB3    ;NOPE
  133.     LHLD    TMP1    ;GET NUMBER OF SOURCE BYTES
  134.     XCHG        ;TO DE
  135.     LHLD    FSRC    ;START OF SOURCE
  136.     DAD    D
  137.     SHLD    ESRC    ;END OF SOURCE
  138.     SHLD    FRAV
  139.     LHLD    TMP1+2    ;NUMBER OF SYMBOLS
  140.     SHLD    SNUM
  141.     LHLD    TMP1+4    ;NUMBER OF BYTES OF DIRECTORY
  142.     XCHG        ;TO DE
  143.     LHLD    SSSS    ;END OF MEMORY
  144.     CALL    SUB16    ;COMPUTE SDIR
  145.     SHLD    FARY
  146.     SHLD    SDIR
  147.     LHLD    TMP1    ;NUMBER OF BYTES OF SOURCE
  148.     XCHG
  149.     LHLD    FSRC    ;FIRST SPOT TO PUT 'EM
  150.     CALL    SANBA    ;DO IT
  151.     LHLD    TMP1+4    ;NUMBER OF BYTES OF DIRECTORY
  152.     XCHG
  153.     INX    D
  154.     LHLD    SDIR    ;FIRST PLACE TO PUT 'EM
  155.     CALL    SANBA    ;DO IT
  156.     LHLD    SNUM    ;COMPUTE STAB
  157.     MOV    E,L
  158.     MOV    D,H
  159.     DAD    D
  160.     DAD    D
  161.     XCHG
  162.     LHLD    SDIR
  163.     DAD    D
  164.     SHLD    STAB    ;SAVE IT
  165.     MVI    A,1
  166.     ANA    A    ;SEND STOP MOTORS
  167.     STC
  168.     CALL    BINPOR
  169.     JMP    RSTRT    ;START OVER
  170. SANB2    CALL    OBINPOR    ;READ A BYTE
  171.     PUSH    PSW
  172.     CALL    OBINPOR    ;READ ANOTHER ONE
  173.     POP    B
  174.     MOV    C,B
  175.     MOV    B,A    ;GET NUMBER OF BYTES TO IGNORE
  176. SANB3A    PUSH    B
  177.     CALL    OBINPOR
  178.     POP    B
  179.     DCX    B
  180.     MOV    A,B
  181.     ORA    C
  182.     JNZ    SANB3A
  183.     JMP    SANB3B    ;LOOK AGAIN
  184. SANBA    PUSH    H
  185.     PUSH    D
  186.     CALL    OBINPOR
  187.     POP    D
  188.     POP    H
  189.     MOV    M,A
  190.     INX    H
  191.     DCX    D
  192.     MOV    A,D
  193.     ORA    E
  194.     JNZ    SANBA
  195.     XRA    A    ;CLEAR SOME FLAGS
  196.     STA    RURD    ;CLEAR RUN READY FLAG
  197.     STA    RUNF    ;CLEAR RUN FLAG
  198.     RET        ;DONE.......
  199. * RTN. E.75
  200. * ASSIGN PROCESSOR
  201. SPRG    JNC    SPRAT    ;ERROR
  202.     CALL    FNOP    ;GET AN OPERAND
  203.     JC    SPRAT    ;STRING FOR DEVICE TYPE?
  204.     CALL    BCDB    ;CONVERT TO BINARY
  205.     PUSH    H    ;SAVE PHYSICAL DEVICE NUMBER
  206.     CALL    POPS    ;LOOK FOR COMMA
  207.     MOV    A,M
  208.     CPI    0DH
  209.     JNZ    SPRAT    ;ERROR
  210.     CALL    FNOP    ;GET THE OTHER OPERAND
  211.     JC    SPRAT    ;STRING?
  212.     CALL    BCDB    ;CONVERT TO BINARY
  213.     LXI    D,8    ;CHECK FOR TOO BIG
  214.     CALL    CMP16
  215.     JNC    SPRAT    ;TOO BIG
  216.     CALL    SPRGSH    ;SHIFT BY HL
  217.     XTHL        ;GET PHYSICAL DEVICE
  218.     LXI    D,10    ;CHECK FOR OVERFLOW
  219.     CALL    CMP16
  220.     JNC    SPRAT    ;TOO BIG
  221.     LXI    D,MODES    ;GET MODES TABLE ADDRESS
  222.     DAD    D
  223.     POP    D    ;GET LOGICAL DEVICE TYPE
  224.     MOV    A,M    ;SET INTO TABLE
  225.     ORA    E
  226.     MOV    M,A
  227.     RET        ;DONE
  228. * RTN. E.76
  229. * DROP PROCESSOR
  230. * RTN. E.77
  231. SPRH    JNC    SPRAT    ;NO EXPRESSION
  232.     CALL    FNOP    ;GET PHYSICAL DEVICE TYPE
  233.     JC    SPRAT    ;STRING?
  234.     CALL    BCDB    ;CONVERT TO BINARY
  235.     PUSH    H    ;SAVE IT
  236.     CALL    POPS    ;LOOK FOR COMMA
  237.     MOV    A,M
  238.     CPI    0DH
  239.     JNZ    SPRAT    ;ERROR
  240.     CALL    FNOP    ;GET LOGICAL DEVICE TYPE
  241.     JC    SPRAT
  242.     CALL    BCDB    ;CONVERT TO BINARY
  243.     LXI    D,8    ;CHECK FOR TOO BIG
  244.     CALL    CMP16
  245.     JNC    SPRAT    ;TOO BIG
  246.     CALL    SPRGSH    ;SHIFT IT
  247.     XTHL        ;GET PHYSICAL DEVICE
  248.     LXI    D,10    ;CHECK FOR TOO BIG
  249.     CALL    CMP16
  250.     JNC    SPRAT    ;TOO BIG
  251.     LXI    D,MODES
  252.     DAD    D    ;DEVICE ADDRESS
  253.     POP    D    ;GET BIT
  254.     MOV    A,M
  255.     ORA    E
  256.     XRA    E
  257.     MOV    M,A    ;BIT CLEARED
  258.     RET        ;DONE
  259. * GOPROC PROCESSOR
  260. SPRI    LHLD    LINE    ;GET LINE ADDRESS TO STACK
  261.     PUSH    H
  262.     CALL    MFOS    ;GET NEXT STATEMENT ADDRESS
  263.     XCHG        ;TO DE
  264.     CALL    SPRI3    ;RETURN ADDRESS TO STACK
  265.     CALL    MBOS    ;BACK UP
  266.     CALL    SPRD    ;GET STATEMENT TO JUMP TO
  267.     POP    B    ;GET THE STACK RIGHT
  268.     POP    H
  269.     POP    D
  270.     PUSH    B
  271.     PUSH    D
  272.     INX    H    ;GET PAST LABEL
  273.     INX    H
  274.     INX    H
  275.     INX    H
  276.     INX    H
  277.     MOV    A,M    ;SEE IF THERE IS AN OFFSET
  278.     CPI    8
  279.     JNZ    SPRI1    ;NOPE
  280.     INX    H    ;MOVE PAST START OF EXPRESSION
  281.     INX    H
  282. SPRI4    MOV    A,M    ;LOOP FOR END OF EXPRESSION
  283.     CPI    9    ;END?
  284.     JZ    SPRI5    ;YUP
  285.     CALL    GTIN
  286.     DAD    D
  287.     JMP    SPRI4    ;LOOP FOR ANOTHER
  288. SPRI5    INX    H    ;GET NEXT ONE
  289. SPRI1    MOV    A,M    ;SEE IF THERE IS A PASS LIST
  290.     CPI    9
  291.     JNZ    SPRI2    ;NOPE
  292.     XCHG        ;TO DE
  293.     LHLD    PNTR    ;PUSH A PASSED DATA BLOCK INDICATION
  294.     MVI    M,3AH
  295.     INX    H
  296.     SHLD    PNTR
  297.     XCHG        ;BACK TO HL
  298.     CALL    EVPE    ;EVALUATE THE EXPRESSION
  299.     LHLD    PNTR    ;PUSH THE END OF BLOCK
  300.     DCX    H
  301.     MVI    M,3AH
  302.     INX    H
  303.     SHLD    PNTR
  304. SPRI2    LHLD    PNTR
  305.     SHLD    NPNTR    ;SET UPDATE CORRECTLY
  306.     XRA    A    ;CLEAR RETURN LAST FLAG
  307.     STA    RTFLG
  308.     RET        ;DONE.......
  309. SPRI3    LHLD    PNTR    ;STUFF IN A RETURN ADDRESS
  310.     MVI    M,39H
  311.     INX    H
  312.     MVI    M,2
  313.     INX    H
  314.     MOV    M,E
  315.     INX    H
  316.     MOV    M,D
  317.     INX    H
  318.     MVI    M,3
  319.     INX    H
  320.     MVI    M,39H
  321.     INX    H    ;UPDATE POINTERS
  322.     SHLD    PNTR
  323.     SHLD    NPNTR
  324.     RET        ;DONE.......
  325. * RTN. D.78
  326. * FOR PROCESSOR
  327. SPRJ    LHLD    PNTR    ;PUSH A 37H ON THE STACK
  328.     MVI    M,37H
  329.     INX    H
  330.     SHLD    PNTR
  331.     CALL    MFOS    ;MOVE UP TO NEXT STATEMENT
  332.     XCHG        ;TO DE
  333.     LHLD    PNTR    ;PUSH THE ADDRESS ON THE STACK
  334.     MVI    M,2
  335.     INX    H
  336.     MOV    M,E
  337.     INX    H
  338.     MOV    M,D
  339.     INX    H
  340.     MVI    M,3
  341.     INX    H
  342.     SHLD    PNTR
  343.     XCHG        ;BACK TO HL
  344.     XTHL        ;GET STACK RIGHT
  345.     PUSH    H    ;RETURN ADDRESS BACK DOWN
  346.     CALL    MBOS    ;MOVE BACK
  347.     INX    H    ;GET EXPRESSION ADDRESS
  348.     CALL    EVPE    ;EVALUATE IT
  349.     PUSH    D    ;SAVE END OF EXPRESSION ADDRESS
  350.     LHLD    SCFLG    ;GET ADDRESS
  351.     XCHG
  352.     CALL    POPS    
  353.     MVI    M,2    ;STUFF IN THE ADDRESS
  354.     INX    H
  355.     MOV    M,E
  356.     INX    H
  357.     MOV    M,D
  358.     INX    H
  359.     MVI    M,3
  360.     INX    H
  361.     SHLD    PNTR    ;UPDATE POINTER
  362.     POP    H    ;GET BACK END ADDRESS
  363.     INX    H    ;GET NEXT EXPRESSION
  364.     CALL    SPRJ2    ;DO IT TO IT
  365.     MOV    A,M    ;CHECK FOR ANOTHER EXPRESSION (STEP)
  366.     CPI    9
  367.     JNZ    SPRJ1    ;NOPE
  368.     CALL    SPRJ2    ;DO IT TO IT TOO
  369. SPRJ3    LHLD    PNTR    ;PUSH A 37 END CODE ON STACK
  370.     MVI    M,37H
  371.     INX    H
  372.     SHLD    NPNTR    ;GET UPDATE RIGHT
  373.     RET        ;DONE.......
  374. SPRJ1    LHLD    PNTR    ;MOVE IN A 1
  375.     XCHG
  376.     INX    D
  377.     LXI    H,ONEEE
  378.     LXI    B,6
  379.     CALL    MOVE
  380.     CALL    OPR30    ;FINISH IT ALL OFF
  381.     JMP    SPRJ3
  382. SPRJ2    PUSH    H    ;GET PNTR TO STACK
  383.     LHLD    PNTR
  384.     XTHL        ;I THINK THAT DID IT
  385.     CALL    EVPE    ;EVALUATE THE EXPRESSION
  386.     XCHG        ;SAVE THE END
  387.     INX    H
  388.     SHLD    NN
  389.     CALL    FNOP    ;GET THE OPERAND
  390.     MVI    B,10H    ;ERROR CODE IN CASE OF STRING
  391.     JC    ERROR
  392.     XTHL        ;GET ORIGINAL POINTER BACK
  393.     XCHG        ;TO DE
  394.     LHLD    PNTR    ;SEE IF IT'S THE SAME
  395.     CALL    CMP16
  396.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  397.     JNZ    ERROR    ;THEY WERE'NT
  398.     POP    H    ;GET BACK ADDRESS OF VARIABLE
  399.     XCHG        ;TO DE
  400.     LHLD    PNTR
  401.     MVI    M,4    ;STORE NUMBER BLOCK START
  402.     INX    H
  403.     XCHG
  404.     LXI    B,6    ;NUMBER OF WORDS
  405.     CALL    MOVE
  406.     XCHG
  407.     DAD    B
  408.     MVI    M,5    ;END OF NUMBER BLOCK
  409.     INX    H    ;UPDATE POINTER
  410.     SHLD    PNTR
  411.     LHLD    NN    ;GET BACK THE END OF THE ROAD
  412.     RET
  413. * RTN. E.79
  414. * POP A CONTROL BLOCK INDICATOR
  415. SPRK    LHLD    PNTR    ;SEE IF WE'VE REACHED THE BITTER END YET
  416.     XCHG
  417.     LHLD    FRAV
  418.     CALL    CMP16
  419.     MVI    B,34H    ;ERROR CODE JUST IN CASE
  420.     JNC    ERROR
  421.     CALL    POPS    ;POP OFF A TOKEN
  422.     MOV    A,M    ;CHECK IT OUT
  423.     CPI    3BH
  424.     JNC    SPRK    ;NOT THERE YET
  425.     CPI    37H
  426.     JC    SPRK    ;NOR YET
  427.     RET        ;AHH, GOT IT
  428. SPF10    MVI    M,80H     ;STORE AN ASCII 0
  429.     INX    H
  430.     MVI    M,0
  431.     DCX    H    ;INDEX BACK TO NORMAL
  432.     JMP    SPF20
  433. ONEEE    DB    2,0,0,0,0,1
  434. * RTN. E.80
  435. * NEXT PROCESSOR
  436. SPRL    XCHG        ;TO HL
  437.     JNC    SPRLA    ;NO NAMES FOLLOWING
  438.     SHLD    NN    ;INITIALIZE THIS THING
  439.     SHLD    PNTR
  440. SPRL1    CALL    SPRK    ;POP OFF A CONTROL BLOCK
  441.     CPI    3AH    ;IS IT A PASSED DATA BLOCK?
  442.     JZ    SPRL1    ;YUP, SO IGNORE IT
  443.     CPI    37H    ;IS IT A FOR/NEXT CONTROL BLOCK?
  444.     MVI    B,34H    ;ERROR CODE JUST IN CASE
  445.     JNZ    ERROR    ;NOPE, SO SOMEONE BLEW IT
  446.     LHLD    NN    ;GET VARIABLE STRING
  447.     MOV    A,M
  448.     CPI    9    ;ANY VARIABLES
  449.     JZ    SPRL2    ;NOPE
  450.     CPI    2    ;MAKE SURE IT'S A VARIABLE
  451.     MVI    B,10H    ;ERROR CODE IN CASE IT'S NOT
  452.     JNZ    ERROR
  453.     INX    H    ;FISH OUT THE LOCATION
  454.     MOV    E,M
  455.     INX    H
  456.     MOV    D,M
  457.     PUSH    D    ;SAVE IT
  458.     LHLD    PNTR    ;FISH OUT THE OTHER LOCATION
  459.     LXI    D,19
  460.     CALL    SUB16
  461.     MOV    E,M
  462.     INX    H
  463.     MOV    D,M
  464.     POP    H    ;SEE IF THEY ARE THE SAME
  465.     CALL    CMP16
  466.     JNZ    SPRL5    ;NOPE
  467. SPRL2    LHLD    PNTR
  468.     INX    H    ;UPDATE POINTER
  469.     SHLD    PNTR
  470.     LXI    D,20    ;FISH OUT THE LOCATION
  471.     CALL    SUB16
  472.     MOV    E,M
  473.     INX    H
  474.     MOV    D,M
  475.     INX    H    ;GET LOCATION OF END VALUE
  476.     INX    H
  477.     INX    H
  478.     PUSH    D    ;SAVE VARIABLE LOCATION
  479.     PUSH    H    ;SAVE ADDRESS
  480.     CALL    CMPR    ;COMPARE THEM
  481.     POP    H    ;RESTORE ADDRESS
  482.     PUSH    PSW    ;SAVE RESULTS
  483.     LXI    D,8
  484.     DAD    D    ;COMPUTE LOCATION OF STEP VALUE
  485.     MOV    A,M    ;GET THE SIGNS BYTE
  486.     ANA    A    ;CHECK FOR SIGN
  487.     JP    SPRL3    ;POSITIVE
  488.     POP    PSW    ;CHANGE THE CARRY
  489.     CMC
  490.     PUSH    PSW
  491. SPRL3    POP    PSW
  492.     POP    D    ;RESTORE VARIABLE LOCATION
  493.     JZ    SPRL4    ;DONE WITH LOOP
  494.     JC    SPRL4
  495.     MOV    C,E    ;DE TO BC
  496.     MOV    B,D
  497.     CALL    ADDER    ;STEP AGAIN
  498.     LHLD    PNTR    ;UPDATE NPNTR
  499.     SHLD    NPNTR
  500.     LXI    D,24
  501.     CALL    SUB16    ;GET LOCATION OF ADDRESS
  502.     MOV    E,M
  503.     INX    H
  504.     MOV    D,M
  505.     POP    H    ;CHANGE RETURN ADDRESS
  506.     POP    B    ;GET RID OF THE OLD ONE
  507.     PUSH    D
  508.     PCHL        ;RETURN.....>>
  509. SPRL4    CALL    SPRK    ;POP A WHOLE BLOCK OFF
  510.     CALL    SPRK
  511.     SHLD    NPNTR    ;UPDATE NPNTR
  512.     LHLD    NN    ;GET VARIABLE STRING
  513.     MOV    A,M
  514.     CPI    9    ;THE END?
  515.     RZ        ;YUP
  516.     INX    H    ;ADD 4
  517.     INX    H
  518.     INX    H
  519.     INX    H
  520.     MOV    A,M    ;GET THIS BYTE
  521.     CPI    09    ;THE END?
  522.     RZ        ;YUP
  523.     CPI    0DH    ;COMMA?
  524.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  525.     JNZ    ERROR    ;NOPE
  526.     INX    H
  527.     SHLD    NN    ;UPDATE NN
  528.     JMP    SPRL1    ;DO IT AGAIN
  529. SPRL5    CALL    SPRK    ;POP OFF THE BOTTOM
  530.     JMP    SPRL1    ;LOOK AGAIN
  531. * RTN. E.81
  532. * GOSUB PROCESSOR
  533. SPRM    LHLD    LINE    ;SAVE CURRENT LINE VALUE
  534.     PUSH    H
  535.     CALL    MFOS    ;GET RETURN ADDRESS ONTO STACK
  536.     XCHG
  537.     CALL    SPRI3
  538.     POP    H    ;RESTORE LINE VALUE
  539.     SHLD    LINE
  540.     CALL    SPRD    ;GET ADDRESS TO JUMP TO
  541.     POP    H    ;FIX STACK AND RETURN
  542.     XTHL
  543.     PCHL
  544. * RTN. E.82
  545. * ON..GOTO PROCESSOR
  546. SPRN    LHLD    PNTR    ;SAVE PNTR ON THE STACK
  547.     PUSH    H
  548.     LHLD    LINE    ;EVALUATE EXPRESSION
  549.     INX    H
  550.     CALL    EVPE    ;DO IT TO IT
  551.     POP    H    ;PUSH END ON STACK BEFORE PNTR
  552.     PUSH    D
  553.     PUSH    H
  554.     CALL    FNOP    ;GET OPERATOR
  555.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  556.     JC    ERROR    ;STRING INSTEAD OF NUMBER
  557.     MOV    A,M    ;CHECK FOR NEGATIVE
  558.     ANA    A
  559.     MVI    B,35H    ;ERROR CODE JUST IN CASE
  560.     JM    ERROR
  561.     XTHL        ;GET ORIGINAL PNTR
  562.     XCHG        ;TO DE
  563.     LHLD    PNTR    ;CHECK AGAINST PRESENT PNTR
  564.     CALL    CMP16
  565.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  566.     JNZ    ERROR    ;WHAT A ROCK
  567.     POP    H    ;GET LOCATION BACK
  568.     CALL    BCDB    ;CONVERT TO BINARY
  569.     XCHG        ;TO DE
  570.     POP    H    ;GET END OF EXPRESSION
  571.     INX    H    ;GET FIRST LINE DESCRIPTOR
  572. SPRN1    DCX    D    ;DECREMENT COUNT
  573.     MOV    A,D    ;IS IT ZERO?
  574.     ORA    E
  575.     JZ    SPRN2    ;YUP, WE FOUND IT
  576.     PUSH    D    ;SAVE 'EM
  577. SPRN3    MOV    A,M    ;GET A BYTE
  578.     CALL    GTIN    ;GET INCREMENT
  579.     DAD    D    ;ADD IT
  580.     MOV    A,M
  581.     ANA    A    ;NEXT STATEMENT?
  582.     JM    SPRN6    ;CONTINUE TIME
  583.     CPI    6    ;STATEMENT NAME?
  584.     JNZ    SPRN3    ;NO, SO TRY AGAIN
  585.     POP    D    ;GET COUNT BACK
  586.     JMP    SPRN1    ;LOOP FOR THIS DESCRIPTOR
  587. SPRN2    DCX    H    ;FAKE IT FOR GOTO PROCESSOR
  588.     SHLD    LINE
  589.     LDA    OPFLG    ;CHECK FOR ON....GOSUB
  590.     CPI    88H
  591.     JNZ    SPRD    ;NOPE, SO TO GOTO
  592.     JMP    SPRM    ;GOSUB
  593. * RTN. E.83
  594. * OUT PROCESSOR
  595. SPRO    MVI    B,10H    ;ERROR IF NO EXPRESSION
  596.     JNC    ERROR
  597.     CALL    SPRO1    ;GET OPERAND 1
  598.     PUSH    H
  599.     CALL    POPS    ;LOOK FOR COMMA
  600.     MOV    A,M
  601.     CPI    0DH    ;IS IT?
  602.     MVI    B,10H    ;ERROR IF NOT
  603.     JNZ    ERROR
  604.     CALL    SPRO1    ;GET OPERAND 2
  605.     XTHL        ;SWAP 'EM
  606.     MOV    A,L    ;OPERAND TO THE ACCUMALATOR
  607.     POP    H    ;GET BACK THE PORT NUMBER
  608.     MOV    H,L    ;TO H
  609.     MVI    L,0D3H
  610.     SHLD    IOST
  611.     JMP    IOST    ;GO DO IT
  612. SPRO1    CALL    FNOP    ;GET OPERAND
  613.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  614.     JC    ERROR    ;CAN'T HAVE A STRING JUST NOW
  615.     CALL    BCDB    ;CONVERT TO BINARY
  616.     INR    H    ;CHECK FOR H=0
  617.     DCR    H
  618.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  619.     JNZ    ERROR    ;TOO BIG
  620.     RET        ;DONE.......
  621. * RTN. E.84
  622. * POKE PROCESSOR
  623. SPRP    MVI    B,10H    ;ERROR CODE JUST IN CASE
  624.     JNC    ERROR    ;NO EXPRESSION FOLLOWING
  625.     CALL    SPRO1    ;GET BYTE TO POKE
  626.     PUSH    H    ;SAVE IT
  627.     CALL    POPS    ;CHECK FOR A COMMA
  628.     MOV    A,M
  629.     CPI    0DH
  630.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  631.     JNZ    ERROR    ;NO COMMA
  632.     CALL    FNOP    ;GET ANOTHER OPERAND
  633.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  634.     JC    ERROR    ;CAN'T HAVE A STRING HERE
  635.     CALL    BCDB    ;CONVERT TO BINARY
  636.     POP    D    ;GET BACK DATA
  637.     MOV    M,E    ;INTO MEMORY
  638.     RET        ;DONE.......
  639. * RTN. E.85
  640. * PROCEDURE PROCESSOR
  641. SPRQ    RNC        ;NO EXPRESSION, SO NO LOCALS
  642.     LHLD    NPNTR    ;SET BEGINNING OF BLOCK
  643.     MVI    M,38H
  644.     INX    H
  645.     SHLD    PNTR
  646.     LHLD    LINE    ;GET START OF UNPROCESSED EXPRESSION
  647.     INX    H
  648.     INX    H
  649. SPRQ1    MOV    A,M    ;GET A BYTE
  650.     CPI    9    ;END?
  651.     JZ    SPRQ2    ;YUP
  652.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  653.     CPI    2    ;VARIABLE NAME?
  654.     JNZ    ERROR    ;NOPE
  655.     CALL    PUSZ    ;PUSH THE SYMBOL NUMBER ON THE STACK
  656.     INX    H    ;FIND THE POINTER
  657.     MOV    C,M
  658.     INX    H
  659.     MOV    B,M
  660.     INX    H    ;GET NEXT ITEM
  661.     INX    H
  662.     SHLD    LINE    ;SAVE ADDRESS
  663.     LHLD    PNTR    ;GET STACK ADDRESS
  664.     PUSH    H    ;SAVE IT
  665.     CALL    DFND    ;GET IT
  666.     XCHG        ;TO DE
  667.     XTHL        ;GET STACK LOCATION
  668.     MVI    M,2    ;STORE THE OLD POINTER
  669.     INX    H
  670.     MOV    M,E
  671.     INX    H
  672.     MOV    M,D
  673.     INX    H
  674.     MVI    M,3
  675.     INX    H    ;LOCATION FOR NEW POINTER
  676.     MVI    M,4
  677.     INX    H
  678.     XCHG        ;TO DE
  679.     POP    H    ;STORE NEW POINTER
  680.     DCX    H
  681.     MOV    M,D
  682.     DCX    H
  683.     MOV    M,E
  684.     XCHG        ;TO HL
  685.     MVI    B,6    ;STORE UNFILLED
  686. SPRQ3    MVI    M,0FFH
  687.     INX    H
  688.     DCR    B
  689.     JNZ    SPRQ3
  690.     MVI    M,5    ;END OF NUMBER BLOCK
  691.     INX    H    ;NEXT ADDRESS
  692.     SHLD    PNTR    ;UPDATE PNTR
  693.     LHLD    LINE    ;GET ITEM ADDRESS
  694.     MOV    A,M    ;CHECK FOR COMMA
  695.     CPI    0DH
  696.     INX    H    ;NEXT ONE
  697.     JZ    SPRQ1    ;IT IS, SO LOOP FOR ANOTHER ONE
  698.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  699.     CPI    9    ;END?
  700.     JNZ    ERROR    ;NO, SO SYNTAX ERROR
  701. SPRQ2    LHLD    PNTR    ;STUFF END OF BLOCK INDICATION
  702.     MVI    M,38H
  703.     INX    H
  704.     SHLD    PNTR
  705.     SHLD    NPNTR
  706.     RET        ;DONE.......
  707. * RTN. E.86
  708. * READ PROCESSOR
  709. SPRR    MVI    B,10H    ;ERROR CODE FOR NO FOLLOWING EXPRESSION
  710.     JNC    ERROR
  711.     XCHG        ;START OF STACK TO HL
  712.     SHLD    NN    ;SAVE IT
  713.     LHLD    LINE    ;SAVE LINE POSITION
  714.     SHLD    MM
  715. SPRR6    LHLD    NN    ;GET READ ELEMENT
  716.     MOV    A,M    ;GET BYTE
  717.     CPI    9    ;END?
  718.     RZ        ;YUP, SO WE ARE DONE
  719.     CPI    0DH    ;COMMA?
  720.     JNZ    SPRR5    ;NOPE
  721.     INX    H
  722.     MOV    A,M    ;GET A BYTE
  723. SPRR5    CALL    PUSZ    ;PUSH THE ITEM ON THE STACK
  724.     CALL    GTIN    ;GET NEXT ITEM
  725.     DAD    D
  726.     SHLD    NN    ;SAVE ADDRESS
  727.     CALL    SPRR1    ;GET NEXT DATA ELEMENT TO STACK
  728.     CALL    OPRQ    ;ASSIGN VALUE
  729.     JMP    SPRR6    ;LOOP FOR ANOTHER ONE
  730. SPRR1    LHLD    DATAT    ;GET ELEMENT POINTER
  731.     MOV    A,L    ;CHECK FOR 0
  732.     ORA    H
  733.     JZ    SPRR3    ;IT WAS
  734.     MOV    A,M    ;GET A BYT
  735.     CPI    0DH    ;COMMA?
  736.     JNZ    SPRR2    ;NOPE
  737.     INX    H
  738.     MOV    A,M    ;GET NEXT ITEM
  739. SPRR2    CPI    09    ;IS IT END?
  740.     JZ    SPRR3    ;YUP
  741.     CALL    PUSZ    ;ONTO THE STACK
  742.     CALL    GTIN    ;GET NEXT ITEM
  743.     DAD    D
  744.     SHLD    DATAT    ;STORE IT'S ADDRESS
  745.     RET        ;DONE.......
  746. SPRR3    LHLD    DATAW    ;GET BLOCK POINTER
  747.     MOV    A,L    ;CHECK FOR 0
  748.     ORA    H
  749.     JZ    SPRR7    ;YUP, SO SKIP KILL BLOCK
  750.     CALL    KILL    ;KILL THE EXISTING BLOCK
  751. SPRR7    LHLD    DATAP    ;SET LINE FOR NEXT "DATA" SEARCH
  752.     SHLD    LINE
  753. SPRR4    CALL    MFOS    ;MOVE FORWARD ONE
  754.     XCHG        ;TO DE
  755.     LHLD    ESRC    ;CHECK FOR OVER END OF SOURCE
  756.     XCHG        ;BACK TO HL
  757.     CALL    CMP16
  758.     JZ    SPRR8    ;OH, OH, OUT OF DATA
  759.     MOV    A,M    ;CHECK FOR DATA STATEMENT
  760.     CPI    0A3H    ;IS IT?
  761.     JNZ    SPRR4    ;NOPE, SO TRY AGAIN
  762.     INX    H    ;GET START OF EXPRESSION
  763.     CALL    EVPE    ;PROCESS IT
  764.     XCHG        ;BEGINNING OF STACK TO DE
  765.     LHLD    PNTR    ;GET END OF STACK
  766.     CALL    SUB16    ;COMPUTE SIZE OF BLOCK
  767.     PUSH    D    ;SAVE PARAMETERS
  768.     PUSH    H
  769.     MVI    A,88H    ;ID BYTE
  770.     LXI    D,DATAW    ;BACKPOINTER LOCATION
  771.     CALL    AMBL    ;ASSIGN A MEMORY BLOCK
  772.     XCHG        ;BLOCK START TO DE
  773.     POP    B    ;NUMBER OF BYTES
  774.     POP    H    ;WHERE THEY START
  775.     CALL    MOVE    ;MOVE THE BYTES IN
  776.     SHLD    PNTR    ;UPDATE PNTR
  777.     XCHG        ;DATA BLOCK ADDRESS TO HL
  778.     SHLD    DATAW    ;UPDATE DATA POINTERS
  779.     SHLD    DATAT
  780.     LHLD    LINE
  781.     SHLD    DATAP
  782.     JMP    SPRR1    ;TRY AGAIN
  783. SPRR8    LHLD    MM    ;SET LINE TO INDICATE CORRECT ERROR POSITION
  784.     SHLD    LINE
  785.     MVI    B,36H
  786.     JMP    ERROR    ;OUT OF DATA ERROR
  787. * RTN. E.87
  788. * RESTORE PROCESSOR
  789. SPRS    LHLD    FSRC    ;RESET DATAP TO FIRST STATEMENT IN PROGRAM
  790.     SHLD    DATAP
  791.     LHLD    DATAW    ;KILL ANY EXISTING BLOCK
  792.     MOV    A,L
  793.     ORA    H
  794.     JZ    SPRS1    ;NO BLOCK ANYHOW
  795.     CALL    KILL
  796. SPRS1    LXI    H,0    ;INDICATE NO BLOCK
  797.     SHLD    DATAW
  798.     SHLD    DATAT    ;INDICATE NO CURRENT ELEMENT
  799.     CALL    MFOS    ;SET UP RETURN ADDRESS
  800.     POP    D
  801.     PUSH    H
  802.     PUSH    D
  803.     CALL    MBOS
  804.     LHLD    LINE    ;CHECK FOR PARAMETERS
  805.     INX    H
  806.     MOV    A,M
  807.     ANA    A
  808.     RM        ;NONE
  809.     CALL    SPRD    ;THERE IS
  810.     POP    H    ;GET THE ADDRESS
  811.     SHLD    DATAP    ;SET THE POINTER
  812.     MOV    A,M    ;CHECK FOR STATEMENT NAME
  813.     CPI    9FH
  814.     RZ        ;YUP
  815.     DCX    H    ;FAKE IT OUT
  816.     MOV    A,M
  817.     CALL    GTIN    ;HOW BIG IS IT?
  818.     CALL    SUB16
  819.     SHLD    DATAP    ;NEW POINTER
  820.     RET        ;DONE.......
  821. * RTN. E.88
  822. * RECEIVE PROCESSOR
  823. SPRT    MVI    B,10H    ;ERROR CODE JUST IN CASE
  824.     JNC    ERROR    ;NO FOLLOWING EXPRESSION
  825.     PUSH    D    ;SAVE START OF EXPRESSION
  826.     LHLD    PNTR    ;SAVE PNTR
  827.     PUSH    H
  828.     XCHG        ;SEND DE TO PNTR
  829.     SHLD    PNTR
  830. SPRT1    CALL    SPRK    ;LOOK FOR PASSED DATA BLOCK
  831.     CPI    3AH    ;IS IT?
  832.     JNZ    SPRT1    ;NOPE
  833.     CALL    SPRK    ;FIND THE BEGINNING OF IT
  834.     INX    H    ;GET THE FIRST ITEM
  835.     XTHL        ;SWAP WITH PNTR
  836.     SHLD    PNTR    ;RESET PNTR CORRECTLY
  837.     POP    H    ;GET BACK PASSED DATA START
  838. SPRT4    XTHL        ;SWAP TO GET START OF EXPRESSION
  839.     CALL    SPRT2    ;PUSH AN ITEM
  840.     JNC    SPRT3    ;IF THE END IS ENCOUNTERED
  841.     XTHL        ;SWAP TO GET PASSED DATA LOCATION
  842.     CALL    SPRT2    ;PUSH AN ITEM
  843.     JC    SPRTQ    ;NOT THE END
  844.     PUSH    H    ;SAVE ADDRESS, SO WE CAN STUFF A ZERO
  845.     LXI    H,TMP2-1    ;SET UP A ZERO BLOCK
  846.     MVI    M,4    ;START OF NUMBER
  847.     XCHG        ;TO DE
  848.     INX    D
  849.     LXI    H,ZERO0    ;SET UP TO MOVE A ZERO IN
  850.     LXI    B,6
  851.     CALL    MOVE
  852.     XCHG        ;TO HL
  853.     DAD    B    ;FIND NEXT BYTE
  854.     MVI    M,5    ;END OF NUMBER ID
  855.     LXI    H,TMP2-1    ;PUSH ONTO STACK
  856.     CALL    SPRT2    ;DO IT TO IT!
  857.     POP    H    ;RESTORE ADDRESS
  858. SPRTQ    PUSH    H    ;SAVE ADDRESS
  859.     CALL    OPRQ    ;ASSIGN THE VALUE
  860.     POP    H    ;RESTORE IT
  861.     JMP    SPRT4    ;LOOP FOR ANOTHER ONE
  862. SPRT2    MOV    A,M    ;GET A BYTE
  863.     CPI    0DH    ;COMMA?
  864.     JNZ    SPRT5    ;NOPE
  865.     INX    H
  866.     MOV    A,M    ;GET THE NEXT ONE
  867. SPRT5    CPI    9    ;END?
  868.     RZ        ;YUP
  869.     CPI    3AH    ;IS IT END?
  870.     RZ        ;YUP
  871.     CALL    PUSZ    ;ONTO THE STACK
  872.     CALL    GTIN    ;GET NEXT ITEM ADDRESS
  873.     DAD    D
  874.     STC        ;INDICATE NOT END
  875.     RET        ;DONE
  876. SPRT3    POP    H    ;CHECK FOR END ON OTHER STRING
  877.     LDA    RTFLG    ;CHECK FOR A RETURN PASSING
  878.     ANA    A
  879.     RZ        ;IT WASN'T
  880. SPRT7    CALL    SPRK    ;POP OFF A WHOLE BLOCK
  881.     CALL    SPRK
  882.     CPI    39H    ;SEE IF IT'S A RETURN BLOCK
  883.     JNZ    SPRT7
  884.     SHLD    NPNTR    ;UPDATE THE STACK POINTER
  885.     RET        ;DONE.......
  886.     JMP    ERROR    ;NOT OK
  887. * RTN. E.89
  888. * RETURN PROCESSOR
  889. SPRU    PUSH    PSW    ;SAVE FLAGS
  890.     XCHG
  891.     JNC    SPRU1    ;DON'T MESS WITH IT IF NO EXPRESSION
  892.     SHLD    LLST    ;SAVE ADDRESS
  893.     XCHG
  894.     LHLD    PNTR
  895.     SHLD    FLST
  896.     XCHG
  897.     SHLD    PNTR    ;RESET PNTR
  898. SPRU1    CALL    SPRK    ;POP A CONTROL BLOCK
  899.     CPI    37H    ;FOR/NEXT?
  900.     JZ    SPRU1    ;YUP
  901.     CPI    3AH    ;PASSED DATA?
  902.     JZ    SPRU1    ;YUP
  903.     CPI    38H    ;STUFFED DATA?
  904.     JZ    SPRU2    ;YUP
  905.     CALL    SPRK    ;GET START OF RETURN ADDRESS BLOCK
  906.     SHLD    NPNTR    ;UPDATE IT
  907.     INX    H
  908.     INX    H    ;GET ADDRESS OUT
  909.     MOV    E,M
  910.     INX    H
  911.     MOV    D,M
  912.     POP    PSW    ;GET FLAGS BACK
  913.     POP    H    ;GET RETURN ADDRESS BACK
  914.     POP    B    ;GET OUT WRONG ADDRESS
  915.     PUSH    D    ;THE RIGHT ONE
  916.     PUSH    H    ;RETURN ADDRESS
  917.     RNC        ;NO PASSED DATA
  918.     LHLD    LLST    ;MOVE THE EXPRESSION UP ONE
  919.     XCHG
  920.     LHLD    FLST
  921.     CALL    SUB16
  922.     MOV    B,H
  923.     MOV    C,L
  924.     MOV    H,D
  925.     MOV    L,E
  926.     INX    D
  927.     CALL    MOVE
  928.     MVI    M,3AH
  929.     DAD    B
  930.     MVI    M,3AH
  931.     INX    H
  932.     SHLD    NPNTR
  933.     MVI    A,0FFH    ;SET RETURN LAST FLAG
  934.     STA    RTFLG
  935.     RET        ;DONE.......
  936. SPRU2    CALL    SPRU3    ;UNSTUFF STUFFED DATA BLOCK
  937.     JMP    SPRU1    ;KEEP LOOKIN' FOR A RETURN ADDRESS
  938. SPRU3    CALL    POPS    ;POP OFF AN ITEM
  939.     MOV    A,M    ;GET ID BYTE
  940.     CPI    38H    ;START OF BLOCK?
  941.     RZ        ;YUP, SO WE ARE DONE
  942.     CALL    POPS    ;POP OFF THE OLD POINTER
  943.     INX    H
  944.     MOV    E,M    ;GET IT OUT
  945.     INX    H
  946.     MOV    D,M
  947.     PUSH    D    ;SAVE IT
  948.     CALL    POPS    ;POP OFF THE SYMBOL NUMBER
  949.     INX    H    ;GET IT OUT
  950.     MOV    C,M
  951.     INX    H
  952.     MOV    B,M
  953.     CALL    DFND    ;GET POINTER LOCATION
  954.     XCHG        ;TO HL
  955.     DCX    H
  956.     POP    D    ;GET OLD POINTER BACK
  957.     MOV    M,D    ;STUFF IT IN
  958.     DCX    H
  959.     MOV    M,E
  960.     JMP    SPRU3    ;DO ANOTHER ONE
  961. SPRFP    INX    H    ;GET THE POINTER OUT
  962.     MOV    E,M
  963.     INX    H
  964.     MOV    D,M
  965.     XCHG        ;TO HL
  966.     MOV    A,M    ;GET A BYTE
  967.     ANA    A    ;IS IT A STRING?
  968.     JNZ    SPRFL    ;NOPE
  969.     JMP    SPRF6    ;YUP
  970. SPRFF    LDA    CSST    ;CASSETTE MODE?
  971.     ANA    A    ;SET FLAGS
  972.     JZ    SFFFF    ;NOPE
  973.     STC        ;MOTORS OFFF
  974.     CALL    CAIN
  975. SFFFF    XRA    A    ;CLEAR CASSETTE MODE
  976.     STA    CATV
  977.     STA    CSST
  978.     LDA    BFLAG    ;BINARY MODE?
  979.     ANA    A
  980.     RZ        ;NOPE
  981.     XRA    A    ;CLEAR IT AND STOP MOTORS
  982.     STA    BFLAG
  983.     INR    A
  984.     STC
  985.     CALL    BINPOR
  986.     RET
  987. SPRLA    LHLD    PNTR    ;FAKE IT
  988.     MVI    M,9
  989.     STC
  990.     XCHG
  991.     JMP    SPRL
  992. SPRN6    POP    H
  993.     CALL    MFOS    ;GET NEXT STATEMENT
  994.     XTHL        ;ONTO THE STACK
  995.     PCHL        ;RETURN, DONE.......
  996. * RTN. E.90
  997. * STOP PROCESSOR
  998. SPRV    LXI    H,STMSG    ;PRINT "STOP"
  999.     CALL    MSGER
  1000.     LHLD    LINE
  1001.     SHLD    LINEA
  1002.     CALL    LNDSC    ;PRINT LINE DESCRIPTOR
  1003.     XRA    A    ;CLEAR RUN FLAGS
  1004.     STA    RUNF
  1005.     CALL    MFOS
  1006.     JMP    RSTRT    ;BACK TO COMMAND MODE
  1007. * RTN. E.91
  1008. * WAIT PROCESSOR
  1009. SPRW    MVI    B,10H    ;ERROR CODE JUST IN CASE
  1010.     JNC    ERROR    ;NO EXPRESSION FOLLOWING
  1011.     XCHG        ;DE TO HL
  1012.     SHLD    NN    ;SAVE IT
  1013.     CALL    SPRO1    ;GET AN OPERAND
  1014.     PUSH    H    ;TO THE STACK
  1015.     CALL    POPS    ;LOOK FOR COMMA
  1016.     MOV    A,M
  1017.     CPI    0DH
  1018.     JNZ    SPRAT    ;ERROR
  1019.     CALL    SPRO1    ;GET ANOTHER OPERAND
  1020.     PUSH    H
  1021.     LHLD    PNTR    ;CHECK FOR DONENESS
  1022.     XCHG
  1023.     LHLD    NN
  1024.     CALL    CMP16    ;SAME?
  1025.     JZ    SPRW2    ;YUP
  1026.     CALL    POPS
  1027.     MOV    A,M    ;LOOKIN' FOR THAT OLE COMMA AGAIN
  1028.     CPI    0DH
  1029.     JNZ    SPRAT    ;ERROR
  1030.     CALL    SPRO1    ;GET THE LAST OPERAND
  1031.     PUSH    H    ;TO THE STACK
  1032.     LHLD    PNTR    ;LOOK FOR END AGAIN
  1033.     XCHG
  1034.     LHLD    NN
  1035.     CALL    CMP16    ;SAME?
  1036.     JNZ    SPRAT    ;NOPE
  1037.     POP    B    ;GET BACK OPERANDS
  1038.     POP    D
  1039.     POP    H
  1040. SPRW3    MOV    A,C    ;GET PORT NUMBER
  1041.     STA    SPRW1+1    ;STORE IT
  1042. SPRW1    IN    0    ;GET A BYTE
  1043.     XRA    L    ;INVERT SOME BITS
  1044.     ANA    E    ;SEPARATE
  1045.     JZ    SPRW1    ;DO IT AGAIN IF REQUIRED
  1046.     RET        ;DONE.......
  1047. SPRW2    POP    B    ;GET BACK OPERANDS
  1048.     POP    D
  1049.     LXI    H,0    ;CLEAR HL
  1050.     JMP    SPRW3    ;CONTINUE
  1051. * RTN. E.92
  1052. * CSAVE PROCESSOR
  1053. SPRX    MVI    A,0FFH    ;SET CASSETTE MODE FLAGS
  1054.     STA    CSST
  1055.     STA    CATV
  1056.     PUSH    PSW
  1057.     PUSH    D
  1058.     XRA    A
  1059.     CALL    COUT
  1060.     POP    D
  1061.     POP    PSW
  1062.     JMP    SPRAZ    ;TO PRINT PROCESSOR
  1063. * RTN. E.93 
  1064. * CLOAD PROCESSOR
  1065. SPRY    MVI    A,0FFH    ;SET CASSETTE MODE FLAGS
  1066.     STA    CSST
  1067.     STA    CATV
  1068.     PUSH    PSW
  1069.     PUSH    D
  1070.     XRA    A
  1071.     CALL    CAIN
  1072.     POP    D
  1073.     POP    PSW
  1074.     JMP    SPRFZ    ;TO INPUT PROCESSOR
  1075. * RTN. E.94
  1076. * CLEAR PROCESSOR
  1077. SPRZ    LHLD    FRAV    ;GET LAST ADDRESS
  1078.     XCHG        ;TO DE
  1079.     LHLD    ESRC    ;GET FIRST ADDRESS
  1080. SPRZ1    CALL    CMP16    ;CHECK FOR DONENESS
  1081.     JZ    SPRZ2    ;YUP
  1082.     MOV    A,M    ;GET A BYTE
  1083.     ANI    3EH    ;STRIP OFF STRING BITS
  1084.     CPI    2
  1085.     JNZ    SPRZ3    ;NOT A NUMBER
  1086.     PUSH    D    ;SAVE ADDRESS
  1087.     XCHG
  1088.     LXI    H,ZERO0
  1089.     LXI    B,6
  1090.     CALL    MOVE
  1091.     XCHG
  1092.     POP    D
  1093.     JMP    SPRZ4
  1094. SPRZ3    MVI    M,0FFH    ;CLEAR IT OUT
  1095. SPRZ4    LXI    B,6    ;GET NEXT VARIABLE
  1096.     DAD    B
  1097.     JMP    SPRZ1    ;LOOP FOR MORE
  1098. SPRZ2    LHLD    SDIR    ;RESET FARY
  1099.     SHLD    FARY
  1100.     RET        ;DONE.......
  1101. * RTN. E.95
  1102. * CHANNEL PROCESSOR
  1103. SPR1    LXI    H,SPR1MSG1    ;DUMP THE HEADING
  1104.     CALL    MSGER
  1105.     LXI    H,MODES
  1106.     MVI    B,0    ;INITIALIZE
  1107. SPR11    MVI    C,0
  1108.     PUSH    B    ;SAVE
  1109.     PUSH    H
  1110.     MOV    A,B    ;SEND THE CHANNEL NUMBER
  1111.     ORI    30H
  1112.     CALL    TOUT
  1113.     MVI    A,9    ;SEND A TAB
  1114.     CALL    TOUT
  1115.     MVI    A,9
  1116.     CALL    TOUT
  1117.     POP    H    ;RESTORE
  1118.     POP    B
  1119. SPR12    PUSH    B    ;SAVE
  1120.     PUSH    H
  1121.     MOV    A,M    ;GET MODES BYTE
  1122. SPR13    RAR        ;ROTATE THROUGH THE CARRY
  1123.     DCR    C    ;CHECK THE COUNT
  1124.     JP    SPR13    ;SHIFT SOME MORE
  1125.     JNC    SPR14    ;NOT SET
  1126.     MVI    A,'X'    ;SEND AN X
  1127.     CALL    TOUT
  1128.     JMP    SPR1A
  1129. SPR14    MVI    A,20H
  1130.     CALL    TOUT    ;SEND A TAB
  1131. SPR1A    MVI    A,20H
  1132.     CALL    TOUT    ;SEND A SPACE
  1133.     POP    H    ;RESTORE
  1134.     POP    B
  1135.     INR    C    ;ARE WE DONE
  1136.     MOV    A,C
  1137.     CPI    8
  1138.     JNZ    SPR12    ;NOPE
  1139.     INX    H
  1140.     INR    B
  1141.     PUSH    B    ;SAVE 'EM
  1142.     PUSH    H
  1143.     CALL    CRLF    ;SEND A CARRIAGE RETURN
  1144.     POP    H    ;RESTORE
  1145.     POP    B
  1146.     MOV    A,B    ;SEE IF WE IS DONE
  1147.     CPI    10
  1148.     JNZ    SPR11    ;NOPE
  1149.     CALL    MFOS
  1150.     XTHL
  1151.     PCHL
  1152. SPR1MSG1    DB    0DH,'CHANNELS       LOGICAL DEVICES'
  1153.     DB    0DH,'(PHYS.)        0 1 2 3 4 5 6 7',8DH
  1154. PRSYMSG1    DB    0DH,'SYMBOL                         TYPE     LOCATION',8DH
  1155. PRSYMSG2    DB    'ARRAY   ',0A0H
  1156. PRSYMSG3    DB    'LABEL   ',0A0H
  1157. PRSYMSG4    DB    'VARIABLE',0A0H
  1158. * RTN. E.96
  1159. * FNXX PROCESSOR
  1160. FNPR    LDA    FNFLG    ;INC FNFLG
  1161.     INR    A
  1162.     STA    FNFLG
  1163.     LHLD    PNTR    ;GET POINTER ADDRESS
  1164.     PUSH    H    ;SAVE IT
  1165.     XCHG        ;TO DE
  1166.     LHLD    FNONE    ;PUSH FNONE AND FNTWO ON STACK
  1167.     XCHG
  1168.     MOV    M,E
  1169.     INX    H
  1170.     MOV    M,D
  1171.     INX    H
  1172.     XCHG
  1173.     LHLD    FNTWO
  1174.     XCHG
  1175.     MOV    M,E
  1176.     INX    H
  1177.     MOV    M,D
  1178.     INX    H
  1179.     SHLD    PNTR
  1180.     POP    H    ;GET BACK PNTR
  1181. FNPR1    DCX    H    ;GET LAST ITEM
  1182.     MOV    A,M    ;GET A BYTE
  1183.     CALL    GTIN    ;GET THE INCREMENT
  1184.     CALL    SUB16    ;SUBTRACT IT
  1185.     MOV    A,M    ;CHECK FOR COMMA
  1186.     CPI    0DH
  1187.     JZ    FNPR1    ;YUP, SO LOOP BACK SOME MORE
  1188.     INX    H    ;FIRST ADDRESS OF PASSED VARIABLES
  1189.     SHLD    FNTWO    ;SO SAVE IT
  1190.     DCX    H    ;GET ADDRESS OF DEF STATEMENT OUT
  1191.     DCX    H
  1192.     MOV    D,M
  1193.     DCX    H
  1194.     MOV    E,M
  1195.     LXI    H,6    ;ADD 5 TO ADDRESS
  1196.     DAD    D
  1197.     SHLD    FNONE    ;SAVE IT
  1198. FNPR2    MOV    A,M    ;GET A BYTE
  1199.     CALL    GTIN    ;GET NEXT ITEM
  1200.     DAD    D
  1201.     PUSH    H    ;SAVE 'EM
  1202.     PUSH    D
  1203.     LXI    H,0    ;CHECK FOR STACK OVERFLOW
  1204.     DAD    SP
  1205.     XCHG
  1206.     LXI    H,STACK+40
  1207.     CALL    CMP16    ;COMPARE
  1208.     MVI    B,16H    ;ERROR CODE JUST IN CASE
  1209.     JNC    ERROR    ;NO ROOM LEFT ON STACK
  1210.     POP    D    ;RESTORE 'EM
  1211.     POP    H
  1212.     MOV    A,M    ;CHECK FOR FN
  1213.     CPI    36H    
  1214.     JNZ    FNPR2    ;NOPE
  1215.     XCHG
  1216.     CALL    EVPE+5    ;PROCESS IT
  1217.     CALL    POPS    ;POP OFF THE RESULT
  1218.     CALL    POPS
  1219.     PUSH    H    ;SAVE THE ADDRESS
  1220.     LHLD    PNTR    ;GET OUT FNONE,FNTWO
  1221.     DCX    H
  1222.     MOV    D,M
  1223.     DCX    H
  1224.     MOV    E,M
  1225.     PUSH    D    ;SAVE FNTWO
  1226.     DCX    H
  1227.     MOV    D,M
  1228.     DCX    H
  1229.     MOV    E,M
  1230.     PUSH    D    ;SAVE FNONE
  1231.     LHLD    FNTWO    ;RESET POINTER
  1232.     DCX    H
  1233.     DCX    H
  1234.     DCX    H
  1235.     DCX    H
  1236.     SHLD    PNTR    ;NEW VALUE
  1237.     POP    H    ;FNONE
  1238.     SHLD    FNONE
  1239.     POP    H    ;FNTWO
  1240.     SHLD    FNTWO
  1241.     POP    H    ;ADDRESS OF RESULT
  1242.     CALL    PUSZ    ;ONTO THE STACK
  1243.     LXI    H,FNFLG    ;UPDATE FNFLG
  1244.     DCR    M
  1245.     RET        ;DONE.......
  1246. STMSG    DB    'STOP IN',0A0H
  1247. SRFLG    DB    0
  1248. BFLAG    DS    1
  1249. MERR    DS    1
  1250. ASFLG    DS    1
  1251. QFLAG    DS    1
  1252. ZFRST    DS    1
  1253. TEMP1    DS    6
  1254. TEMP2    DS    6
  1255. WORK1    DS    12
  1256. WORK2    DS    12
  1257. WORK3    DS    18
  1258. WORK4    DS    50
  1259. WORK5    DS    10
  1260. CNVR1    DS    1
  1261. CNVR2    DS    1
  1262. CNVR3    DS    1
  1263. CNVR4    DS    1
  1264. CNVR5    DS    1
  1265. CNVR6    DS    1
  1266. CNVRA    DS    1
  1267. SIGNF    DS    1
  1268. TMP1    DS    6
  1269. TMP2    DS    6
  1270. TMP3    DS    6
  1271. TMP4    DS    6
  1272. TMP5    DS    6
  1273. TMP6    DS    6
  1274. TMP7    DS    6
  1275. TMP8    DS    6
  1276. TMP9    DS    6
  1277. TMP10    DS    6
  1278. TMP11    DS    6
  1279. CHANL    DS    20
  1280. MODES    DS    10
  1281. TRMNL    DS    30
  1282. CATV    DS    1
  1283. SNUM    DS    2
  1284. STAB    DS    2
  1285. SDIR    DS    2
  1286. MEND    DS    2
  1287. ESCN    DS    1
  1288. NSCN    DS    2
  1289. TSCN    DS    2
  1290. RURD    DS    1
  1291. CMND    DS    1
  1292. ESRC    DS    2
  1293. SLIN    DS    2
  1294. FARY    DS    2
  1295. INSR    DS    2
  1296. STACK    DS    100
  1297. STFLG    DS    1
  1298. OPFLG    DS    1
  1299. FSRC    DS    2
  1300. LINE    DS    2
  1301. FRAV    DS    2
  1302. FLST    DS    2
  1303. LLST    DS    2
  1304. EBSC    DS    2
  1305. CSST    DS    1
  1306. RUNF    DS    1
  1307. IOST    DS    2
  1308.     DS    1
  1309. SEED    DS    6
  1310. NPNTR    DS    2
  1311. DATAP    DS    2
  1312. DATAT    DS    2
  1313. DATAW    DS    2
  1314. FNFLG    DS    1
  1315. FNONE    DS    2
  1316. FNTWO    DS    2
  1317. SCFLG    DS    2
  1318. RTFLG    DS    1
  1319. EDLNP    DS    2
  1320. DMPMM    DS    2
  1321. EDITM    DS    1
  1322. EDITO    DS    2
  1323. EDITS    DS    2
  1324. POSIT    DS    1
  1325. NN    DS    2
  1326. MM    DS    2
  1327. CHECK    DS    1
  1328. CASER    DS    2
  1329. PNTRA    DS    2
  1330. LINEA    DS    2
  1331. PNTR    DS    2
  1332.