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 / TBASICA5.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  56KB  |  2,614 lines

  1. * RTN. D.56
  2. * CLOAD? PROCESSOR
  3. PCLO    LXI    H,PCLOM    ;SEND CHECKING MESSAGE
  4.     CALL    MSGER
  5.     XRA    A    ;SEND START MOTORS
  6.     CALL    CAIN
  7. PCLO1    LHLD    FRAV    ;ADDRESS FOR TRIAL INPUT
  8.     CALL    LICA    ;INPUT
  9.     JNC    PCLO1    ;NOPE
  10.     XRA    A    ;SEND STOP MOTORS
  11.     STC
  12.     INR    A
  13.     CALL    CAIN
  14.     LXI    H,OKOK    ;SEND "FILE OK" MESSAGE
  15.     CALL    MSGER
  16.     JMP    RSTRT    ;YUP, SO WE ARE DONE
  17. OKOK    DB    0DH,'FILE O','K'+80H
  18. PCLDM    DB    'READING...',8DH
  19. PCLOM    DB    'CHECKING...',8DH
  20. PCSVM    DB    'WRITING...',8DH
  21. PCSAM    DB    'WRITING BASIC',8DH
  22. * RTN. D.57
  23. * CSAVE PROCESSOR
  24. PCSV    LXI    H,PCSVM    ;SEND NOTIFIER
  25.     CALL    MSGER
  26.     XRA    A    ;START MOTORS
  27.     CALL    COUT
  28.     CALL    USCN    ;SCAN OFF STRING EXPRESSION
  29.     LHLD    TSCN    ;GET FIRST CHARACTER OF TOKEN
  30.     MOV    A,M
  31.     ANI    7FH    ;STRIP STROBE
  32.     STA    TMP10+1    ;SAVE IT
  33.     MVI    A,1    ;GET NAME BLOCK INDICATOR
  34.     STA    TMP10
  35.     MVI    A,8DH    ;STORE A CR
  36.     STA    TMP10+2
  37.     LXI    H,TMP10    ;ADDRESS
  38.     CALL    CLIN    ;TO DUMP ON TAPE
  39.     MVI    A,0FFH    ;SET CSST
  40.     STA    CSST
  41.     JMP    LIST    ;DUMP IT ALL ON TAPE
  42. * RTN. D.58
  43. * CSAVE! PROCESSOR
  44. PCSA    LXI    H,PCSAM    ;SEND NOTIFIER
  45.     CALL    MSGER
  46.     XRA    A    ;START MOTORS
  47.     CALL    BPORT
  48.     LHLD    EBSC    ;GET LAST ADDRESS
  49.     XCHG        ;PUT IT IN DE
  50.     LXI    H,START    ;GET FIRST ADDRESS
  51.     CALL    PCSA1    ;WRITE IT
  52.     LHLD    SMEN    ;SEE IF THERE IS A MONITOR TO WRITE
  53.     MOV    A,H
  54.     ORA    L
  55.     JZ    RSTRT    ;NOPE
  56.     XCHG        ;END TO DE
  57.     LHLD    SMST    ;GET START OF MONITOR
  58.     CALL    PCSA1    ;WRITE IT,TOO
  59.     JMP    RSTRT
  60. PCSA1    PUSH    H    ;SAVE ADDRESSES
  61.     PUSH    D
  62.     XCHG        ;SWAP 'EM
  63.     CALL    SUB16    ;COMPUTE NUMBER OF WORDS TO WRITE
  64.     SHLD    NN    ;SAVE IT
  65.     MOV    B,H    ;HL TO BC
  66.     MOV    C,L
  67.     LXI    H,0    ;CLEAR HL
  68. PCSA2    LDAX    D    ;GET A BYTE
  69.     CALL    ADHL    ;ADD TO HL
  70.     INX    D    ;UPDATE INDEXES
  71.     DCX    B
  72.     MOV    A,B    ;BC = 0?
  73.     ORA    C
  74.     JNZ    PCSA2    ;NOPE
  75.     XCHG        ;COMPUTE 0-HL
  76.     LXI    H,0    ;CLEAR HL
  77.     CALL    SUB16    ;SUBTRACT
  78.     SHLD    MM    ;SAVE THE CHECKSUM
  79.     XRA    A    ;CLEAR A
  80.     POP    D    ;GET BACK ADDRESSES
  81.     POP    H
  82. PCSA3    MOV    A,M    ;GET A BYTE
  83.     PUSH    H    ;SAVE ADDRESSES
  84.     PUSH    D
  85.     CALL    OBPORT    ;CASSETTE OUTPUT BYTE
  86.     POP    D    ;GET ADDRESSES BACK
  87.     POP    H
  88.     INX    H    ;UPDATE INDEX
  89.     CALL    CMP16    ;HL=DE?
  90.     STC        ;CLEAR THE CARRY
  91.     CMC
  92.     JNZ    PCSA3    ;NOPE
  93.     STC        ;SEND DUMMY OUTPUT
  94.     CALL    BPORT
  95.     RET        ;DONE.
  96. * RTN. D.59
  97. * OUTPUT LINE DESCRIPTOR
  98. LNDSC    LDA    RUNF    ;SEE IF WE ARE RUNNING
  99.     ANA    A
  100.     JZ    LND44    ;PRINT COMMAND
  101.     LHLD    LINE    ;GET ADDRESS OF CURRENT LINE
  102.     PUSH    H    ;SAVE LINE
  103.     LXI    D,0    ;CLEAR DE
  104. LNDS1    PUSH    D    ;SAVE COUNT
  105.     LHLD    LINE    ;CHECK FOR BEGINNING OF SOURCE
  106.     XCHG    
  107.     LHLD    FSRC    ;FIRST SOURCE ADDRESS
  108.     CALL    CMP16    ;CHECK 'EM OUT
  109.     JZ    LNDS2    ;SURE WAS
  110.     LHLD    FRAV    ;CHECK FOR DIRECT MODE START
  111.     CALL    CMP16
  112.     JZ    LNDS2
  113. LNDS8    CALL    MBOS    ;BACK UP ONE
  114.     POP    D    ;RECOVER COUNT
  115.     MOV    A,M    ;GET A BYTE
  116.     CPI    85H
  117.     JZ    LNDS1
  118.     CPI    9CH    ;CHECK FOR TAB
  119.     JZ    LNDS1
  120.     DCX    D    ;CHECK FOR COLON OR BACKSLASH
  121.     CPI    9EH
  122.     JZ    LNDS1    ;SURE WAS
  123.     CPI    9BH
  124.     JZ    LNDS1
  125.     CPI    9DH
  126.     JZ    LNDS1    ;YUP
  127.     INX    D    ;INDEX BACK TO NORMAL
  128.     INX    D    ;UPDATE COUNT
  129.     CPI    9FH    ;IS IT A STATEMENT NAME
  130.     JNZ    LNDS1    ;NO, SO LOOP AND TRY AGAIN
  131.     DCX    D    ;CORRECT COUNT
  132.     PUSH    D    ;SAVE IT
  133.     INX    H    ;CORRECT INDEX
  134.     PUSH    H    ;SAVE H
  135.     LXI    H,SPMGE
  136.     CALL    LNOT
  137.     POP    H
  138.     CALL    PRIT    ;PRINT THE NAME
  139. LNDS3    POP    H    ;GET BACK COUNT
  140.     MOV    A,H    ;SEE IF IT'S ZERO
  141.     ORA    L
  142.     JZ    LNDS4    ;YUP, SO RETURN
  143.     PUSH    H    ;SAVE IT AGAIN
  144.     LXI    H,PLUSM    ;PRINT A PLUS SIGN
  145.     CALL    MSGER
  146.     POP    H    ;GET BACK COUNT
  147.     LXI    D,TMP9    ;CONVERSION SPACE
  148.     CALL    BBCD    ;CONVERT BINARY TO BCD
  149.     MVI    A,4    ;STORE NUMBER START/STOP
  150.     STA    TMP9-1
  151.     INR    A
  152.     STA    TMP10
  153.     LXI    H,TMP9-1    ;ADDRESS
  154.     CALL    PRIT    ;PRINT THE NUMBER OUT
  155. LNDS4    POP    H    ;RESTORE LINE
  156.     SHLD    LINE
  157.     RET        ;DONE
  158. * RTN. D.60
  159. * CADD PROCESSOR
  160. PCAD    JMP    PCLD1    ;GO TO IT
  161. * RTN. D.61
  162. * CLOAD SEPARATOR
  163. PCLS    LHLD    NSCN    ;GET NEXT TOKEN
  164.     MOV    A,M
  165.     CPI    '?'+80H    ; IS IT A QUESTION MARK?
  166.     JNZ    PCLD    ;NOPE
  167.     CALL    USCN    ;SCAN IT OFF
  168.     JMP    PCLO    ;YUP
  169. * RTN. D.62
  170. * CSAVE SEPARATOR
  171. PCSS    LHLD    NSCN    ;GET NEXT TOKEN
  172.     MOV    A,M
  173.     CPI    '!'+80H    ;IS IT AN EXCLAMATION POINT?
  174.     JNZ    PCSV    ;NOPE
  175.     CALL    USCN    ;SCAN IT OFF
  176.     JMP    PCSA
  177. DRAT1    DB    '"'+80H    ;QUOTE MESSAGE
  178. LNDS2    LDAX    D    ;GET BYTE
  179.     CPI    9FH    ;CHECK FOR NAME TAG
  180.     JZ    LNDS8    ;SURE IS!
  181.     LXI    H,LNMSG    ;GET START MESSAGE
  182.     CALL    LNOT    ;DUMP IT
  183.     JMP    LNDS3
  184. LNMSG    DB    20H
  185.     DB    '*'
  186.     DB    '*'+80H
  187. SPMGE    DB    0A0H
  188. LND44    LXI    H,LND45    ;PRINT "COMMAND"
  189.     CALL    MSGER
  190.     RET        ;DONE0LT
  191. LND45    DB    'ENTR'
  192.     DB    'Y'+80H
  193. HNDRD    DB    2,0,0,0,1,0    ;ONE HUNDRED CONSTANT
  194. * INTERPRETER MODULE
  195. * RTN. E.1
  196. * PUSH ITEM ON CONTROL STACK
  197. * IN: HL = ADDRESS OF ITEM TO PUSH
  198. PUSZ    PUSH    H    ;SAVE THE REGISTERS
  199.     PUSH    D
  200.     PUSH    B
  201.     PUSH    PSW
  202.     MOV    A,M    ;GET FIRST BYTE OF ITEM
  203.     CALL    GTIN    ;HOW MANY BYTES IN ITEM?
  204.     MOV    B,D    ;DE TO BC
  205.     MOV    C,E
  206.     XCHG        ;HL TO DE
  207.     LHLD    PNTR    ;GET STACK ADDRESS
  208.     PUSH    H
  209.     PUSH    D
  210.     PUSH    B
  211.     DAD    B
  212.     XCHG
  213.     LHLD    FARY
  214.     CALL    CMP16
  215.     MVI    B,27H
  216.     JC    ERROR
  217.     POP    B
  218.     POP    D
  219.     POP    H
  220.     XCHG        ;BACK TO THE RIGHT PLACE
  221.     CALL    MVDN    ;MOVE IT IN QUICK LIKE
  222.     XCHG        ;DESTINATION TO HL
  223.     DAD    B    ;COMPUTE NEW STACK POINTER
  224.     SHLD    PNTR    ;SAVE IT
  225.     POP    PSW    ;GET ALL THE REGISTERS BACK
  226.     POP    B
  227.     POP    D
  228.     POP    H
  229.     RET        ;DONE.
  230. * RTN. E.2
  231. * POP ITEM FROM CONTROL STACK
  232. * OUT: HL = ADDRESS OF ITEM POPPED
  233. POPS    PUSH    D    ;SAVE REGISTERS
  234.     PUSH    B
  235.     PUSH    PSW
  236.     LHLD    PNTR    ;GET STACK ADDRESS
  237.     DCX    H    ;GET LAST BYTE OF TOP OF STACK
  238.     MOV    A,M
  239.     CALL    GTIN    ;COMPUTE NUMBER OF BYTES IN ITEM
  240.     CALL    SUB16    ;COMPUTE NEW ADDRESS
  241.     INX    H
  242.     SHLD    PNTR    ;UPDATE POINTER
  243.     POP    PSW    ;RESTORE REGISTERS
  244.     POP    B
  245.     POP    D
  246.     RET        ;DONE.
  247. * RTN. E.3
  248. * GET ITEM ADDRESS
  249. * IN: HL = ITEM LOCATION
  250. * OUT: BC = ADDRESS OF ITEM
  251. GEIM    MOV    A,M    ;GET FIRST BYTE
  252.     CPI    2    ;IS IT A LABEL?
  253.     JZ    GEIM1    ;YUP
  254.     MOV    C,L    ;MOVE HL TO BC
  255.     MOV    B,H
  256.     ANA    A    ;CHECK FOR LITERAL
  257.     RZ        ;IT WAS
  258.     INX    B    ;CORRECT
  259.     RET
  260. GEIM1    INX    H    ;GET LABEL NUMBER OUT
  261.     MOV    C,M
  262.     INX    H
  263.     MOV    B,M
  264.     PUSH    D    ;SAVE DE
  265.     CALL    DFND    ;GET THE POINTER
  266.     MOV    B,H    ;MOVE HL TO BC
  267.     MOV    C,L
  268.     POP    D    ;RESTORE DE
  269.     RET        ;DONE..
  270. * RTN. E.4
  271. * FIND OPERAND
  272. * OUT: HL = ADDRESS OF OPERAND
  273. * CARRY SET IF OPERAND IS A STRING
  274. FNOP    CALL    POPS    ;POP ONE OFF CONTROL STACK
  275. FNOPO    MOV    A,M    ;GET A BYTE
  276.     CPI    2    ;IS THIS A POINTER?
  277.     JZ    FNOP1    ;YUP
  278.     ANA    A    ;IS THIS A LITERAL?
  279.     JZ    FNOP2    ;YUP
  280.     CPI    4    ;IS THIS A CONSTANT?
  281.     JZ    FNOP3    ;YUP
  282.     CPI    9    ;IS IT END MARKER?
  283.     JZ    FNOP    ;YUP, SO DIG FOR ANOTHER
  284.     MVI    B,26H    ;ERROR
  285.     JMP    ERROR
  286. FNOP1    INX    H    ;GET THE POINTER OUT
  287.     MOV    E,M
  288.     INX    H
  289.     MOV    D,M
  290.     XCHG        ;PUT IT IN HL
  291.     MOV    A,M    ;GET A BYTE
  292.     ANA    A    ;IS IT A LITERAL?
  293.     JZ    FNOP2    ;YUP
  294.     ANI    3EH    ;STRIP OFF SUPERFLUOUS BITS
  295.     CPI    2    ;IS IT A NUMBER?
  296.     JZ    FNOP5    ;YUP
  297.     CPI    8    ;IS IT A STRING ARRAY/VARIABLE?
  298.     JZ    FNOP4    ;YUP
  299.     MVI    B,26H    ;ERROR
  300.     JMP    ERROR
  301. FNOP2    INX    H    ;GET NEXT ADDRESS
  302.     STC        ;INDICATE STRING
  303.     RET        ;DONE
  304. FNOP3    INX    H    ;GET NEXT ADDRESS
  305.     MOV    A,M    ;CHECK IF IT'S A NUMBER
  306.     ANI    0EH    ;STRIP OFF ID BITS
  307.     CPI    2    ;IS IT A NUMBER?
  308.     JNZ    FNOP6    ;NOPE
  309. FNOP5    XRA    A    ;CLEAR CARRY
  310.     RET        ;DONE
  311. FNOP4    INX    H    ;GET POINTER ADDRESS
  312.     INX    H
  313.     INX    H
  314.     MOV    E,M    ;GET A BYTE
  315.     INX    H
  316.     MOV    D,M    ;GET THE OTHER
  317.     XCHG        ;TO HL
  318.     STC        ;INDICATE STRING
  319.     RET        ;DONE
  320. FNOP6    SUI    6    ;SET CARRY IF IT'S A STRING
  321.     CMC
  322.     INX    H    ;GET POINTER OUT
  323.     MOV    E,M
  324.     INX    H
  325.     MOV    D,M
  326.     XCHG        ;TO HL
  327.     RNC        ;NOT A STRING
  328.     MOV    E,M    ;GET ANOTHER POINTER
  329.     INX    H
  330.     MOV    D,M
  331.     XCHG        ;TO HL
  332.     RET        ;DONE.
  333. * RTN. E.5
  334. * GET OPERANDS FOR OPERATORS
  335. * IN: CARRY SET IF NUMERICS ONLY OK.
  336. * OUT:
  337. * HL = OPERAND 1 ADDRESS
  338. * DE = OPERAND 2 ADDRESS (TOP OF STACK)
  339. * BC = DESTINATION ADDRESS
  340. * CARRY SET IF OPERANDS ARE STRINGS
  341. GOFO    MVI    A,0    ;CLEAR A
  342.     RAL        ;SHIFT THE CARRY INTO BIT 0
  343.     LXI    B,TMP10    ;SET INDEX
  344.     STAX    B    ;INITIALIZE THE COUNTER
  345.     CALL    FNOP    ;GET AN OPERAND
  346.     LDAX    B    ;GET COUNTER
  347.     INR    A    ;ADD 2 WITHOUT AFFECTING CARRY
  348.     INR    A
  349.     JNC    GOFOA
  350.     ADI    2
  351. GOFOA    STAX    B    ;SAVE COUNTER
  352.     PUSH    H    ;GET ANOTHER OPERAND
  353.     CALL    FNOP
  354.     LDAX    B
  355.     INR    A
  356.     INR    A
  357.     JNC    GOFOB
  358.     ADI    2
  359. GOFOB    PUSH    H    ;SAVE THE ADDRESS
  360.     CPI    8    ;IS IT STRINGS?
  361.     JZ    GOFO2    ;YUP
  362.     ORI    1    ;SET BIT 0
  363.     CPI    5    ;IS IT NUMERICS?
  364.     JZ    GOFO3    ;YUP
  365.     MVI    B,24H    ;MIXED OPERANDS, NO NO
  366.     JMP    ERROR
  367. GOFO2    STC        ;SET CARRY FOR INDICATION OF STRING
  368. GOFO3    LHLD    PNTR    ;GET NEXT AVAILABLE STACK ADDRESS
  369.     INX    H    ;AFTER ID
  370.     MOV    C,L    ;BC=HL
  371.     MOV    B,H
  372.     POP    H    ;GET BACK ADDRESSES
  373.     POP    D
  374.     RET        ;ALL DONE.
  375. * RTN. E.6
  376. * LOGICAL OPERATOR PREPARER
  377. OPR10    STC        ;NUMERIC ONLY
  378.     CALL    GOFO    ;GET OPERANDS
  379.     PUSH    B    ;SAVE DESTINATION
  380.     PUSH    D    ;SAVE O2
  381.     CALL    BCDB    ;CONVERT TO BINARY
  382.     XTHL        ;GET O2
  383.     CALL    BCDB    ;CONVERT TO BINARY
  384.     POP    D    ;GET BACK BINARY O1
  385.     MOV    C,L    ;BC = HL
  386.     MOV    B,H
  387.     POP    H    ;GET BACK DESTINATION
  388.     XTHL        ;PUT IT ON THE STACK
  389.     PCHL        ;RETURN
  390. * RTN. E.7
  391. * LOGICAL OPERATOR ENDER
  392. OPR20    XCHG        ;SWAP
  393.     POP    H    ;GET RETURN ADDRESS
  394.     XCHG        ;SWAP
  395.     CALL    BBCD    ;CONVERT TO FLOATING POINT
  396. * RTN. E.8
  397. * NUMERIC FINISHER
  398. OPR30    LHLD    PNTR    ;GET STACK ADDRESS
  399.     MVI    M,4    ;STUFF A NUMBER INDICATOR
  400.     LXI    D,7    ;ADD 7
  401.     DAD    D
  402.     MVI    M,5    ;STUFF AN END OF NUMBER INDICATOR
  403.     INX    H    ;NEXT AVAILABLE
  404.     SHLD    PNTR    ;RESET PNTR
  405.     RET        ;ALL DONE.
  406. * RTN. E.9 
  407. * RELATIONAL OPERATOR FINISHER
  408. OPR40    JC    OPR41    ;TRUE ANSWER
  409.     XCHG        ;HL TO DE
  410.     LXI    H,ZERO0    ;GET A ZERO
  411.     LXI    B,6    ;NUMBER OF BYTES
  412.     CALL    MVDN    ;MOVE IT IN
  413.     JMP    OPR30    ;FINISH UP
  414. OPR41    XCHG        ;HL TO DE
  415.     LXI    H,NEGA1    ;GET A ONE
  416.     LXI    B,6    ;NUMBER OF BYTES
  417.     CALL    MVDN    ;MOVE IT IN
  418.     JMP    OPR30    ;FINISH IT UP
  419. * RTN. E.10
  420. * RELATIONAL OPERATOR PREPARER
  421. OPR50    XRA    A    ;CLEAR CARRY
  422.     CALL    GOFO    ;GET OPERANDS
  423.     PUSH    B    ;SAVE DESTINATION
  424.     JC    OPR51    ;LOOKS LIKE STRINGS
  425.     CALL    CMPR    ;COMPARE NUMBERS
  426.     POP    H    ;GET BACK THE DESTINATION
  427.     RET        ;DONE
  428. OPR51    XCHG        ;SWAP HL,DE
  429.     CALL    STRNG    ;COMPARE STRINGS
  430.     POP    H    ;GET BACK DESTINATION
  431.     RET        ;DONE
  432. * RTN. E.11
  433. * OR PROCESSOR
  434. OPRA    CALL    OPR10    ;GET OPERANDS
  435.     MOV    A,E    ;BC OR DE TO HL
  436.     ORA    C
  437.     MOV    L,A
  438.     MOV    A,D
  439.     ORA    B
  440.     MOV    H,A
  441.     JMP    OPR20    ;STORE IT
  442. * RTN. E.12
  443. * AND PROCESSOR
  444. OPRB    CALL    OPR10    ;GET OPERANDS
  445.     MOV    A,E    ;BC AND DE TO HL
  446.     ANA    C
  447.     MOV    L,A
  448.     MOV    A,D
  449.     ANA    B
  450.     MOV    H,A
  451.     JMP    OPR20    ;STORE IT
  452. * RTN. E.13
  453. * NOT PROCESSOR
  454. OPRC    CALL    OPR10
  455.     MOV    A,C    ;BC NOT DE TO HL
  456.     CMA
  457.     ANA    E
  458.     MOV    L,A
  459.     MOV    A,B
  460.     CMA
  461.     ANA    D
  462.     MOV    H,A
  463.     JMP    OPR20    ;STORE IT
  464. * RTN. E.14
  465. * >= PROCESSOR
  466. OPRD    CALL    OPR50    ;COMPARE
  467.     CMC        ;SET CARRY FOR TRUE
  468.     JMP    OPR40    ;STORE
  469. * RTN. E.15
  470. * <= PROCESSOR
  471. OPRE    CALL    OPR50    ;COMPARE
  472.     JC    OPR40    ;TRUE
  473.     JNZ    OPR40    ;NOT TRUE
  474.     STC        ;ALSO TRUE
  475.     JMP    OPR40    ;STORE IT
  476. * RTN. E.16
  477. * > PROCESSOR
  478. OPRF    CALL    OPR50    ;COMPARE
  479.     CMC        ;SET CARRY IF TRUE
  480.     JNZ    OPR40    ;TRUE
  481.     XRA    A    ;CLEAR CARRY
  482.     JMP    OPR40    ;NOT TRUE
  483. * RTN. E.17
  484. * < PROCESSOR
  485. OPRG    CALL    OPR50    ;COMPARE
  486.     JMP    OPR40    ;STORE
  487. * RTN. E.18
  488. * <> PROCESSOR
  489. OPRH    CALL    OPR50    ;COMPARE
  490.     STC
  491.     JNZ    OPR40    ;STRORE
  492.     CMC
  493.     JMP    OPR40    ;STORE
  494. * RTN. E.19
  495. * = PROCESSOR
  496. OPRI    LDA    FNFLG    ;CHECK FOR FN MODE
  497.     ANA    A
  498.     RNZ
  499.     LDA    OPFLG    ;LOOK FOR A CHANNEL STATEMENT
  500.     CPI    87H    ;CHECK IT
  501.     RZ        ;IT WAS, SO IGNORE THIS EQUALS
  502.     CALL    OPR50    ;COMPARE
  503.     STC
  504.     JZ    OPR40    ;STORE
  505.     CMC
  506.     JMP    OPR40    ;STORE
  507. * RTN. E.20
  508. * - PROCESSOR
  509. OPRP    STC        ;NUMERIC ONLY
  510.     CALL    GOFO    ;GET OPERANDS
  511.     CALL    SUBER    ;SUBTRACT
  512.     JMP    OPR30    ;STORE
  513. * RTN. E.21
  514. * / PROCESSOR
  515. OPRJ    STC        ;NUMERIC ONLY
  516.     CALL    GOFO    ;GET OPERANDS
  517.     CALL    DIVER    ;DIVIDE
  518.     JMP    OPR30    ;STORE
  519. * RTN. E.22
  520. * * PROCESSOR
  521. OPRK    STC        ;NUMERIC ONLY
  522.     CALL    GOFO    ;GET OPERANDS
  523.     CALL    MULER    ;MULTIPLY
  524.     JMP    OPR30    ;STORE
  525. * RTN. E.23
  526. * POWERS PROCESSOR
  527. OPRL    STC        ;NUMERIC ONLY
  528.     CALL    GOFO    ;GET OPERANDS
  529.     CALL    PWRS    ;Y TO X
  530.     JMP    OPR30    ;STORE
  531. * RTN. E.24
  532. * + PROCESSOR
  533. OPRM    XRA    A    ;NUMERIC OR ALPHABETIC
  534.     CALL    GOFO    ;GET OPERANDS
  535.     JC    OPRM1    ;STRINGS
  536.     CALL    ADDER    ;ADD
  537.     JMP    OPR30    ;STORE
  538. OPRM1    PUSH    D    ;SAVE ADDRESSES
  539.     PUSH    H
  540.     LHLD    PNTR    ;GET STORAGE PLACE
  541.     MVI    M,0    ;STRING INDICATOR
  542.     XCHG        ;PNTR TO DE
  543.     INX    D    ;NEXT LOCATION
  544.     POP    H    ;FIRST STRING
  545.     PUSH    D    ;SAVE PNTR
  546.     CALL    COUNT    ;HOW MANY?
  547.     MOV    C,E    ;BC = DE
  548.     MOV    B,D
  549.     POP    D    ;RESTORE DE
  550.     CALL    MOVE    ;MOVE IN THE STRING
  551.     XCHG        ;PNTR TO HL
  552.     DAD    B    ;ADD B
  553.     XTHL        ;SWAP WITH NEXT STRING ADDX
  554.     CALL    COUNT    ;HOW MANY?
  555.     MOV    C,E    ;TO BC
  556.     MOV    B,D
  557.     POP    D    ;GET BACK PNTR
  558.     CALL    MOVE    ;MOVE IN THE STRING
  559.     XCHG        ;PNTR TO HL
  560.     DCX    H    ;GET LAST BYTE OF FIRST STRING
  561.     MOV    A,M    ;CLEAR UPPER BIT
  562.     ANI    7FH
  563.     MOV    M,A
  564.     DAD    B    ;FIND LAST ADDRESS
  565.     INX    H
  566.     MVI    M,1    ;STORE END OF STRING INDICATOR
  567.     INX    H
  568.     SHLD    PNTR    ;UPDATE POINTER
  569.     RET        ;DONE.
  570. * RTN. E.25
  571. * UNARY - OPERATOR PROCESSOR
  572. OPRN    CALL    FNOP    ;GET OPERAND
  573.     MVI    B,24H    ;ERROR CODE JUST IN CASE
  574.     JC    ERROR    ;NEGATE A STRING?
  575.     XCHG        ;ADDX TO DE
  576.     LHLD    PNTR    ;FIND WHERE TO STORE
  577.     INX    H
  578.     CALL    CMP16    ;SEE IF THEY ARE EQUAL
  579.     JZ    OPRN1    ;YUP
  580.     XCHG        ;NOPE
  581.     LXI    B,6    ;NUMBER OF BYTES
  582.     CALL    MOVE    ;MOVE IT IN
  583.     XCHG        ;NEW ADDRESS TO HL
  584. OPRN1    MVI    A,80H    ;SET UP TO CHANGE SIGN
  585.     XRA    M
  586.     MOV    M,A
  587.     JMP    OPR30    ;STORE
  588. * RTN. E.26
  589. * UNARY NOT PROCESSOR
  590. OPRO    CALL    FNOP    ;GET OPERAND
  591.     MVI    B,24H    ;ERROR CODE JUST IN CASE
  592.     JC    ERROR    ;CAN'T LOGICALLY OPERATE ON A STRING,DUMMY.
  593.     CALL    BCDB    ;CONVERT TO BINARY
  594.     MOV    A,H    ;INVERT IT
  595.     CMA
  596.     MOV    H,A
  597.     MOV    A,L
  598.     CMA
  599.     MOV    L,A
  600.     XCHG        ;TO DE
  601.     LHLD    PNTR    ;GET ADDRESS TO STORE TO
  602.     INX    H
  603.     XCHG        ;BACK TO HL
  604.     CALL    BBCD    ;CONVERT TO BCD
  605.     JMP    OPR30    ;STORE
  606. NEGA1    DB    82H,0,0,0,0,1    ;NEGATIVE ONE
  607. C2767    DB    2,0,3,27H,67H    ;32767
  608. * ASSIGN MEMORY BLOCK
  609. * SQUISHES MEMORY IF IT RUNS OUT
  610. * IN: HL = NUMBER OF BYTES NEEDED
  611. *  DE = BACKPOINTER ADDRESS
  612. *  A = ID BYTE
  613. * OUT: HL = FIRST ASSIGNED ADDRESS
  614. AMBL    PUSH    PSW    ;SAVE ID
  615.     PUSH    D    ;SAVE BACKPOINTER
  616.     PUSH    H    ;SAVE NUMBER OF BYTES
  617.     XRA    A    ;CLEAR OVERFLOW FLAG
  618.     STA    TMP10+1
  619. AMBL2    XCHG        ;NUMBER TO DE
  620.     LHLD    FARY    ;GET FIRST USED ADDRESS
  621.     CALL    SUB16    ;SUBTRACT
  622.     MVI    B,27H
  623.     JNC    ERROR
  624.     LXI    D,250    ;STACK MARGIN
  625.     CALL    SUB16    ;SUBTRACT AGAIN
  626.     JNC    ERROR
  627.     XCHG        ;TO DE
  628.     LHLD    PNTR    ;TOP OF STACK ADDRESS
  629.     CALL    CMP16    ;SEE IF WE ARE OUT OF MEMORY
  630.     JNC    AMBL1    ;YUP, SO SQUISH
  631.     POP    D    ;GET NUMBER OF BYTES
  632.     INX    D    ;ADD THREE
  633.     INX    D
  634.     INX    D
  635.     LHLD    FARY    ;GET FIRST USED BYTE
  636.     DCX    H    ;STORE THE NUMBER OF BYTES
  637.     MOV    M,D
  638.     DCX    H
  639.     MOV    M,E
  640.     CALL    SUB16    ;COMPUTE FIRST ADDRESS OF BLOCK
  641.     SHLD    FARY    ;UPDATE FARY
  642.     POP    D    ;GET BACKPOINTER
  643.     POP    PSW    ;GET ID BYTE
  644.     MOV    M,A    ;STORE THEM
  645.     INX    H
  646.     MOV    M,E
  647.     INX    H
  648.     MOV    M,D
  649.     INX    H    ;GET FIRST ASSIGNED ADDRESS
  650.     RET        ;DONE.
  651. AMBL1    LDA    TMP10+1    ;CHECK OVERFLOW FLAG
  652.     ANA    A
  653.     MVI    B,27H    ;ERROR CODE JUST IN CASE
  654.     JNZ    ERROR    ;OH,OH, OUT OF MEMORY
  655.     INR    A    ;SO SET IT
  656.     STA    TMP10+1
  657.     LHLD    SDIR    ;INITIALIZE SQUISH LOOP
  658.     SHLD    TMP9
  659.     SHLD    TMP8
  660. AMBL4    LHLD    TMP8    ;TMP8=FARY?
  661.     XCHG
  662.     LHLD    FARY
  663.     CALL    CMP16    ;COMPARE
  664.     JZ    AMBL6    ;YUP, SO THE LOOP'S DONE
  665.     XCHG        ;TMP8 TO HL
  666.     DCX    H    ;PULL OUT NUMBER OF BYTES
  667.     MOV    D,M
  668.     DCX    H
  669.     MOV    E,M
  670.     CALL    SUB16    ;FIND FIRST BYTE OF BLOCK
  671.     MOV    A,M    ;GET ID BYTE
  672.     ANA    A    ;IS IT ACTIVE?
  673.     JP    AMBL3    ;NOPE
  674.     PUSH    H    ;SAVE BLOCK ADDRESS
  675.     LHLD    TMP8    ;TMP8=TMP9?
  676.     XCHG
  677.     LHLD    TMP9
  678.     CALL    CMP16
  679.     POP    H    ;RESTORE BLOCK ADDRESS
  680.     JNZ    AMBL5    ;NOT EQUAL
  681.     SHLD    TMP9    ;RESET TO
  682. AMBL3    SHLD    TMP8    ;RESET FROM
  683.     JMP    AMBL4    ;LOOP FOR ANOTHER BLOCK
  684. AMBL5    XCHG        ;COMPUTE NUMBER OF BYTES
  685.     CALL    SUB16
  686.     XCHG        ;SWAP 'EM
  687.     SHLD    TMP8    ;NEW FROM
  688.     LHLD    TMP9    ;GET TO
  689.     CALL    SUB16    ;NEW TO
  690.     SHLD    TMP9
  691.     MOV    C,E    ;BC=DE
  692.     MOV    B,D
  693.     XCHG        ;DE = HL
  694.     LHLD    TMP8    ;GET FROM
  695.     CALL    MOVE    ;MOVE BLOCK
  696.     XCHG        ;TO TO HL
  697.     INX    H    ;GET BACKPOINTER OUT
  698.     MOV    E,M
  699.     INX    H
  700.     MOV    D,M
  701.     XCHG
  702.     INX    D    ;STORE NEW FRONTPOINTER
  703.     MOV    M,E
  704.     INX    H
  705.     MOV    M,D
  706.     JMP    AMBL4    ;LOOP FOR ANOTHER BLOCK
  707. AMBL6    LHLD    TMP9    ;SET NEW FARY
  708.     SHLD    FARY
  709.     POP    H    ;RESTORE HL
  710.     PUSH    H
  711.     JMP    AMBL2    ;TRY AGAIN
  712. * RTN. E.28
  713. * ARRAY OPERATOR PROCESSOR
  714. AOOP    LHLD    PNTR    ;GET TOP OF STACK
  715. AOOP1    DCX    H    ;GET LAST ITEM
  716.     MOV    A,M    ;GET BYTE
  717.     CALL    GTIN    ;HOW BIG IS IT?
  718.     CALL    SUB16    ;MOVE BACK TO IT
  719.     MOV    A,M    ;GET BYTE
  720.     CPI    0DH    ;IS IT A COMMA?
  721.     JZ    AOOP1    ;YUP, SO LOOP AGAIN
  722.     CALL    GTIN    ;HOW BIG IS THIS THING?
  723.     CALL    SUB16    ;GET THE BEGINNING OF IT
  724.     INX    H
  725.     MOV    A,M    ;GET THE ID BYTE
  726.     CPI    2    ;IS IT A LABEL?
  727.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  728.     JNZ    ERROR    ;NOPE
  729.     INX    H    ;GET THE POINTER OUT
  730.     MOV    E,M
  731.     INX    H
  732.     MOV    D,M
  733.     XCHG        ;TO HL
  734.     LDA    OPFLG    ;IS THIS A DIMENSION STATEMENT?
  735.     CPI    0A5H    ;CHECK
  736.     JZ    AOOP6    ;YUP
  737.     MOV    A,M    ;GET BYTE
  738.     CPI    0FFH    ;CHECK FOR UNFILLED
  739.     MVI    B,28H    ;ERROR CODE JUST IN CASE
  740.     JZ    ERROR    ;UNDIMENSIONED ARRAY ERROR
  741.     ANI    0CH    ;CHECK FOR ARRAY
  742.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  743.     JZ    ERROR    ;NOT AN ARRAY
  744.     INX    H    ;GET NUMBER OF DIMENSIONS OUT
  745.     MOV    E,M
  746.     INX    H
  747.     MOV    D,M
  748.     XCHG
  749.     SHLD    CNVR1    ;SAVE IT
  750.     XCHG
  751.     INX    H    ;GET POINTER OUT
  752.     MOV    E,M
  753.     INX    H
  754.     MOV    D,M
  755.     XCHG
  756.     SHLD    CNVR3    ;SAVE IT
  757.     LXI    H,0    ;GET A SIXTEEN BIT 0
  758.     PUSH    H    ;STUFF IT UP YOUR STACK
  759.     JMP    AOOP2    ;TO MIDDLE OF LOOP
  760. AOOP3    CALL    POPS    ;LOOK FOR A COMMA
  761.     MOV    A,M    ;GET IT
  762.     CPI    0DH    ;IS IT A COMMA?
  763.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  764.     JNZ    ERROR    ;IT WASN'T
  765.     LHLD    CNVR3    ;GET POINTER
  766.     MOV    E,M    ;PULL OUT NUMBER OF ELEMENTS
  767.     INX    H
  768.     MOV    D,M
  769.     LHLD    CNVR5    ;GET OFFSET
  770.     CALL    I6X16    ;MULTIPLY
  771.     PUSH    H    ;SAVE PRODUCT
  772. AOOP2    CALL    FNOP    ;LOOK FOR AN OPERAND
  773.     MVI    B,24H    ;ERROR CODE JUST IN CASE
  774.     JC    ERROR    ;THE TURKEY USED A STRING FOR A SUBSCRIPT
  775.     CALL    BCDB    ;CONVERT TO BINARY
  776.     PUSH    H    ;SAVE HL
  777.     LHLD    CNVR3    ;GET POINTER
  778.     MOV    E,M    ;PULL OUT NUMBER OF ELEMENTS
  779.     INX    H
  780.     MOV    D,M
  781.     INX    H
  782.     SHLD    CNVR3    ;UPDATED POINTER
  783.     POP    H    ;RESTORE HL
  784.     XCHG        ;SWAP 'EM
  785.     CALL    CMP16    ;CHECK FOR TOO BIG
  786.     MVI    B,29H    ;ERROR CODE JUST IN CASE
  787.     XCHG
  788.     JC    ERROR    ;TOO BIG A SUBSCRIPT
  789.     POP    D    ;GET TRIAL OFFSET BACK
  790.     DAD    D    ;ADD IT
  791.     SHLD    CNVR5    ;SAVE IT TO OFFSET
  792.     LHLD    CNVR1    ;GET DIMENSION COUNT
  793.     DCX    H    ;UPDATE COUNT
  794.     SHLD    CNVR1
  795.     MOV    A,H    ;IS IT ZERO?
  796.     ORA    L
  797.     JNZ    AOOP3    ;NO, SO LOOP FOR ANOTHER DIMENSION
  798.     CALL    POPS    ;POP OFF THE LABEL
  799.     INX    H    ;GET THE POINTER OUT
  800.     MOV    E,M
  801.     INX    H
  802.     MOV    D,M
  803.     XCHG        ;TO HL
  804.     DCX    D    ;GET ADDRESS TO SAVE IT TO
  805.     MOV    A,M    ;GET THE ID BYTE
  806.     STAX    D    ;STUFF IT IN
  807.     XCHG
  808.     INX    H    ;GET ADDRESS FOR POINTER 
  809.     INX    H
  810.     INX    H
  811.     MOV    M,E    ;STUFF IT IN
  812.     INX    H
  813.     MOV    M,D
  814.     XCHG
  815.     PUSH    D    ;SAVE ADDRESS
  816.     MOV    A,M    ;GET ID BYTE
  817.     ANI    4    ;CHECK FOR STRING/NUMERIC ARRAY
  818.     JNZ    AOOP4    ;WASN'T A STRING
  819.     LHLD    CNVR5    ;GET OFFSET
  820.     LXI    D,2    ;GET OFFSET *2
  821.     CALL    I6X16
  822.     JMP    AOOP5
  823. AOOP4    LHLD    CNVR5    ;GET OFFSET
  824.     CALL    FSTML    ;MULTIPLY BY SIX
  825. AOOP5    XCHG        ;OFFSET TO DE
  826.     LHLD    CNVR3    ;GET POINTER
  827.     DAD    D    ;ADD
  828. AOOPA    XCHG        ;TO DE
  829.     POP    H    ;GET ADDRESS ON STACK BACK
  830.     DCX    H
  831.     DCX    H    ;STORE ELEMENT POINTER
  832.     MOV    M,D
  833.     DCX    H    
  834.     MOV    M,E
  835.     JMP    OPR30    ;NUMERIC FINISHER
  836. AOOP6    PUSH    H    ;SAVE POINTER
  837.     MOV    A,M    ;GET ID BYTE
  838.     CPI    0FFH    ;IS IT AN UNDIMENSIONED ARRAY?
  839.     JZ    AOOP7    ;YUP
  840.     INX    H    ;GET POINTER
  841.     INX    H
  842.     INX    H
  843.     MOV    E,M
  844.     INX    H
  845.     MOV    D,M
  846.     XCHG
  847.     CALL    KILL    ;INACTIVATE THE BLOCK
  848. AOOP7    LHLD    PNTR    ;GET TOP OF STACK
  849.     SHLD    CNVR1    ;PRESET FLAGS
  850.     SHLD    LLST
  851.     LXI    H,1
  852.     SHLD    CNVR3
  853.     DCX    H
  854.     SHLD    CNVR5
  855. AOOP8    CALL    FNOP    ;GET AN OPERAND
  856.     MVI    B,24H    ;ERROR CODE JUST IN CASE
  857.     JC    ERROR    ;A STRING FOR A SUBSCRIPT?
  858.     CALL    BCDB    ;CONVERT TO BINARY
  859.     INX    H    ;CORRECTION
  860.     XCHG        ;TO DE
  861.     LHLD    LLST    ;GET PLACE TO PUT IT
  862.     MOV    M,E    ;STUFF IT IN
  863.     INX    H
  864.     MOV    M,D
  865.     INX    H
  866.     SHLD    LLST    ;STORE UPDATED INDEX
  867.     LHLD    CNVR3    ;GET ELEMENT COUNT
  868.     CALL    I6X16    ;MULTIPLY
  869.     SHLD    CNVR3    ;STORE NEW ELEMENT COUNT
  870.     LHLD    CNVR5    ;INCREMENT DIMENSION
  871.     INX    H
  872.     SHLD    CNVR5    ;RESTORE IT
  873.     CALL    POPS    ;LOOK FOR COMMA
  874.     MOV    A,M    ;GET A BYTE
  875.     CPI    0DH    ;IS IT A COMMA?
  876.     JZ    AOOP8    ;YES, SO CONTINUE THE LOOP
  877.     INX    H    ;GET THE POINTER OUT
  878.     MOV    E,M
  879.     INX    H
  880.     MOV    D,M
  881.     LHLD    STAB    ;GET START OF SYMBOL TABLE
  882.     PUSH    H
  883.     LHLD    SDIR    ;GET START OF SYMBOL DIRECTORY
  884.     XCHG        ;TO DE
  885.     SHLD    TMP10    ;SAVE THE POINTER TO FIND
  886.     XCHG        ;BACK TO HL
  887. AOOPB    MOV    E,M    ;GET OUT TRIAL POINTER
  888.     INX    H
  889.     MOV    D,M
  890.     INX    H
  891.     INX    H
  892.     XTHL        ;GET THE TABLE ADDRESS
  893.     PUSH    D    ;SAVE POINTER
  894.     CALL    COUNT    ;FIND THE END
  895.     DAD    D    ;ADD
  896.     POP    D    ;GET POINTER BACK
  897.     XTHL        ;GET SDIR BACK
  898.     PUSH    H    ;SAVE IT
  899.     LHLD    TMP10    ;SEE IF WE'VE FOUND IT YET
  900.     CALL    CMP16
  901.     POP    H    ;RESTORE SDIR
  902.     JNZ    AOOPB    ;NOPE, SO LOOP AGAIN
  903.     POP    H    ;GET STRING LOCATION
  904.     DCX    H    ;GET LAST CHARACTER
  905.     MOV    A,M
  906.     STA    TMP10    ;SAVE IT
  907.     LHLD    CNVR3    ;COMPUTE NUMBER OF BYTES TO ASSIGN
  908.     LXI    D,2
  909.     LDA    TMP10    ;SEE IF THIS IS A NUMERIC ARRAY
  910.     CPI    '$'+80H    
  911.     JZ    AOOPC    ;NOPE
  912.     LXI    D,6    ;YUP
  913. AOOPC    CALL    I6X16
  914.     PUSH    H    ;SAVE IT
  915.     LHLD    CNVR5
  916.     LXI    D,2
  917.     CALL    I6X16
  918.     POP    D
  919.     DAD    D    ;GOT IT
  920.     POP    D    ;GET ADDRESS
  921.     INX    D    ;GET POINTER ADDRESS
  922.     INX    D
  923.     INX    D
  924.     PUSH    D    ;SAVE IT
  925.     LDA    TMP10    ;CHECK FOR NUMERIC ARRAY
  926.     CPI    '$'+80H
  927.     JZ    AOOPE
  928.     MVI    A,84H    ;NUMERIC ARRAY ID BYTE
  929.     JMP    AOOPF
  930. AOOPE    MVI    A,82H    ;ID BYTE
  931. AOOPF    CALL    AMBL    ;ASSIGN A BLOCK
  932.     POP    D    ;GET POINTER ADDRESS BACK
  933.     XCHG
  934.     MOV    M,E
  935.     INX    H
  936.     MOV    M,D
  937.     PUSH    D    ;SAVE IT
  938.     DCX    H    ;GET NUMBER OF DIMENSIONS BYTES
  939.     DCX    H
  940.     XCHG        ;SWAP
  941.     LHLD    CNVR5    ;GET NUMBER OF DIMENSIONS
  942.     XCHG
  943.     MOV    M,D
  944.     DCX    H
  945.     MOV    M,E
  946.     DCX    H    ;GET ID BYTE ADDRESS
  947.     LDA    TMP10    ;CHECK FOR NUMERIC ARRAY
  948.     CPI    '$'+80H
  949.     JZ    AOOPG
  950.     MVI    M,4
  951.     JMP    AOOPH
  952. AOOPG    MVI    M,48H    ;STRING ARRAY ID BYTE
  953. AOOPH    LHLD    CNVR5    ;GET NUMBER OF DIMENSIONS
  954.     LXI    D,2
  955.     CALL    I6X16
  956.     MOV    B,H    ;NUMBER OF BYTES TO MOVE
  957.     MOV    C,L
  958.     LHLD    CNVR1    ;GET NUMBER OF ELEMENTS FLAGS
  959.     POP    D    ;TO ADDRESS
  960.     CALL    MOVE    ;MOVE 'EM IN, BOYS
  961.     XCHG
  962.     DAD    B    ;COMPUTE ADDX FOR STRING POINTER
  963.     PUSH    H    ;SAVE HL
  964.     LHLD    CNVR3    ;GET NUMBER OF ELEMENTS
  965.     MOV    B,H    ;TO BC
  966.     MOV    C,L
  967.     POP    H    ;GET HL BACK
  968.     LDA    TMP10    ;CHECK FOR NUMERIC ARRAY
  969.     CPI    '$'+80H
  970.     JNZ    AOOPD    ;SURE IS
  971.     LXI    D,DUMS    ;DUMMY STRING ADDRESS
  972. AOOP9    MOV    M,E    ;STUFF IN THE POINTERS
  973.     INX    H
  974.     MOV    M,D
  975.     INX    H
  976.     DCX    B    ;UPDATE COUNTE
  977.     MOV    A,B
  978.     ORA    C    ;IS BC = 0?
  979.     JNZ    AOOP9    ;NO, SO LOOP FOR MORE STORES
  980.     RET        ;DONE.
  981. AOOPD    PUSH    B    ;SAVE NUMBER OF
  982.     XCHG        ;HL TO DE
  983.     LXI    H,ZERO0    ;GET A ZERO
  984.     LXI    B,6    ;NUMBER OF BYTES
  985.     CALL    MOVE    ;MOVE IT IN
  986.     XCHG        ;DE BACK TO HL
  987.     DAD    B    ;UPDATE IT
  988.     POP    B    ;GET NUMBER BACK
  989.     DCX    B    ;SEE IF WE ARE DONE
  990.     MOV    A,B
  991.     ORA    C
  992.     JNZ    AOOPD    ;NOPE
  993.     RET        ;DONE.
  994.     DB    0,0,0
  995. DUMS    DB    080H    ;DUMMY STRING 
  996. * RTN. E.29
  997. * 16 BY 16 MULTIPLY
  998. * HL=HL*DE, OVERFLOW GENERATES ERROR 30
  999. I6X16    MOV    B,H    ;BC = HL
  1000.     MOV    C,L
  1001.     PUSH    D    ;SAVE DE
  1002.     MOV    D,C
  1003.     CALL    MULT    ;ONE OF THREE
  1004.     XCHG        ;DE TO HL
  1005.     POP    D
  1006.     PUSH    D
  1007.     MOV    D,B
  1008.     CALL    MULT    ;SECOND OF THREE
  1009.     MOV    A,E    ;ADD 'EM UP
  1010.     ADD    H
  1011.     MOV    H,A
  1012.     MVI    B,30H    ;ERROR CODE JUST IN CASE
  1013.     JC    ERROR    ;OVERFLOW
  1014.     POP    D    
  1015.     MOV    E,C
  1016.     CALL    MULT    ;THE LAST
  1017.     MOV    A,E
  1018.     ADD    H
  1019.     MOV    H,A
  1020.     JC    ERROR    ;OVERFLOW
  1021.     RET        ;DONE
  1022. * RTN. E.30
  1023. * KILL ASSIGNED BLOCK
  1024. * IN: HL POINTS TO DATA START
  1025. KILL    DCX    H    ;BACK UP THREE
  1026.     DCX    H
  1027.     DCX    H
  1028.     MOV    A,M    ;GET ID BYTE
  1029.     ANI    7FH    ;CLEAR ACTIVE BIT
  1030.     MOV    M,A    ;STUFF IT BACK
  1031.     RET        ;DONE.
  1032. * RTN. E.31
  1033. * INITIALIZER
  1034. INTR    LXI    SP,STACK+100     ;INITIALIZE STACK
  1035.     LXI    H,1    ;SET SNUM
  1036.     SHLD    SNUM
  1037.     LHLD    SSSS    ;CHECK END OF MEMORY FLAG
  1038.     MOV    A,H
  1039.     ORA    L    ;IS IT 0?
  1040.     JNZ    INTR1    ;NOPE
  1041.     LXI    H,PNTR+1     ;GET LAST USED ADDRESS
  1042. INTR2    INX    H
  1043.     MVI    M,0    ;CHECK THIS ADDRESS'S EXISTENCE
  1044.     MOV    A,M
  1045.     ANA    A    ;SET FLAGS
  1046.     JZ    INTR2    ;IT EXISTS
  1047.     DCX    H    ;GET LAST EXISTING ADDRESS
  1048. INTR1    SHLD    MEND    ;SET END OF MEMORY FLAG
  1049.     DCX    H
  1050.     MVI    M,80H    ;STORE DUMMY NAME
  1051.     SHLD    STAB    ;SET SYMBOL TABLE START
  1052.     DCX    H    ;STORE DUMMY ID BLOCK
  1053.     MVI    M,0
  1054.     DCX    H
  1055.     MVI    M,0
  1056.     DCX    H
  1057.     MVI    M,0
  1058.     SHLD    SDIR    ;SET DIRECTORY START
  1059.     XRA    A    ;CLEAR CSST,RURD, AND RUNF
  1060.     STA    BFLAG
  1061.     STA    CSST
  1062.     STA    RURD
  1063.     STA    RUNF
  1064.     STA    EDITM    ;CLEAR EDIT MODE
  1065.     INR    A    ;SET CMND
  1066.     STA    CMND
  1067.     LXI    H,0    ;CLEAR DUMP MEMORY MODE
  1068.     SHLD    DMPMM
  1069.     LXI    H,PNTR+2     ;GET FIRST ADDRESS FOR SOURCE CODE
  1070.     SHLD    ESRC    ;SET SOURCE FLAGS
  1071.     SHLD    FSRC
  1072.     SHLD    EBSC    ;SET END OF BASIC FLAG
  1073.     CALL    PNEW1    ;INITIALIZE SOURCE
  1074.     MVI    A,0C3H    ;STORE JUMP INSTRUCTION
  1075.     STA    START
  1076.     LXI    H,RSTRT
  1077.     SHLD    START+1
  1078.     JMP    RSTRT    ;AND WE'RE OFF AND RUNNING
  1079. * RTN. E.32
  1080. * EVALUATE POLISH EXPRESSION
  1081. * IN: HL = BEGINNING OF EXPRESSION
  1082. * OUT: HL = BEGINNING OF STACK
  1083. *  DE = END OF EXPRESSION 
  1084. EVPE    XCHG        ;HL TO DE
  1085.     XRA    A    ;CLEAR FNFLG
  1086.     STA    FNFLG
  1087.     LHLD    PNTR    ;SEE WHERE TO START THE STACK
  1088.     PUSH    H    ;SAVE IT
  1089.     XCHG        ;DE BACK TO HL
  1090.     INX    H    ;GET NEXT BYTE
  1091. EVPE7    MOV    A,M    ;GET THE BYTE OUT
  1092.     PUSH    H    ;SAVE ADDRESS
  1093.     CPI    9    ;IS IT END OF EXPRESSION?
  1094.     JZ    EVPE2    ;YUP
  1095.     CPI    6    ;IS IT AN OPERAND?
  1096.     JC    EVPE1    ;YUP
  1097.     CPI    0FH    ;IS IT A COMMA OR SEMICOLON?
  1098.     JC    EVPE4    ;YUP
  1099.     CPI    40H    ;IS IT A FUNCTION?
  1100.     JP    EVPE3    ;YUP
  1101.     CPI    34H    ;IS IT AN ARRAY OPERATOR?
  1102.     JZ    EVPE8    ;YUP
  1103.     CPI    36H    ;IS IT A FN OPERATOR?
  1104.     JZ    EVPE9    ;YUP
  1105.     SUI    0FH    ;MUST BE A REGULAR OLD OPERATOR
  1106.     ADD    A    ;DOUBLE IT
  1107.     LXI    H,OPRCS    ;OPERATOR PROCESSOR JUMP TABLE
  1108.     CALL    ADHL    ;ADD OFFSET
  1109.     MOV    E,M    ;GET THE ADDRESS OUT
  1110.     INX    H
  1111.     MOV    D,M
  1112.     LXI    H,EVPE6    ;PUSH RETURN ADDRESS
  1113.     PUSH    H
  1114.     XCHG        ;JUMP ADDRESS TO HL
  1115.     PCHL        ;GO GET IT
  1116. EVPE9    CALL    FNPR    ;PROCESS FN
  1117.     JMP    EVPE6
  1118. EVPE8    CALL    AOOP    ;PROCESS THE ARRAY OPERATOR
  1119. EVPE6    POP    H    ;GET ADDRESS OF ITEM PROCESSED
  1120.     MOV    A,M    ;GET FIRST BYTE
  1121.     CALL    GTIN    ;HOW BIG IS IT?
  1122.     DAD    D    ;ADD IT UP
  1123.     JMP    EVPE7    ;LOOP FOR THE NEXT ONE
  1124. EVPE3    SUI    40H    ;MAKE FIRST ONE ZERO
  1125.     ADD    A    ;DOUBLE IT
  1126.     LXI    H,FPRCS    ;FUNCTION PROCESSOR ADDRESS TABLE
  1127.     CALL    ADHL    ;ADD IT
  1128.     MOV    E,M    ;FISH OUT THE ADDRESS
  1129.     INX    H
  1130.     MOV    D,M
  1131.     LXI    H,EVPE6    ;PUSH RETURN ADDRESS
  1132.     PUSH    H
  1133.     XCHG        ;ADDRESS TO HL
  1134.     PCHL        ;GO GET IT
  1135. EVPE1    MOV    A,M    ;GET ID BYTE
  1136.     CPI    2    ;IS IT A LABEL?
  1137.     JNZ    EVPEP    ;NOPE
  1138.     LDA    FNFLG    ;CHECK FOR FN MODE
  1139.     ANA    A
  1140.     JNZ    EVPEJ    ;FN MODE
  1141. EVPEP    CALL    GEIM    ;GET OPERAND ADDRESS
  1142.     LHLD    PNTR    ;GET TOP OF STACK
  1143.     MVI    M,2    ;START OF LABEL INDICATOR
  1144.     INX    H
  1145.     MOV    M,C    ;STUFF IN THE ADDRESS
  1146.     INX    H
  1147.     MOV    M,B
  1148.     INX    H
  1149.     MVI    M,3    ;END OF LABEL INDICATOR
  1150.     INX    H
  1151.     SHLD    PNTR    ;UPDATED PNTR
  1152.     JMP    EVPE6    ;LOOP FOR ANOTHER ONE
  1153. EVPE4    CALL    PUSZ    ;STUFF IT ONTO THE STACK
  1154.     JMP    EVPE6    ;LOOP FOR ANOTHER ONE
  1155. EVPE2    CALL    PUSZ    ;PUSH THE 09 ONTO THE STACK
  1156.     POP    D    ;GET BACK PARAMETERS
  1157.     POP    H
  1158.     RET        ;DONE.......
  1159. OPRCS    DW    OPRQ
  1160.     DW    OPRA
  1161.     DW    OPRB
  1162.     DW    OPRC
  1163.     DW    OPRD
  1164.     DW    OPRE
  1165.     DW    OPRF
  1166.     DW    OPRG
  1167.     DW    OPRH
  1168.     DW    OPRI
  1169.     DW    OPRP
  1170.     DW    OPRM
  1171.     DW    OPRJ
  1172.     DW    OPRK
  1173.     DW    OPRN
  1174.     DW    OPRO
  1175.     DW    OPRL
  1176. * RTN. E.33
  1177. * RUN CONTROLLER
  1178. RUN8    LHLD    NPNTR
  1179.     SHLD    PNTR
  1180.     POP    H    ;GET NEXT ADDRESS
  1181.     XCHG
  1182.     LHLD    ESRC
  1183.     CALL    CMP16
  1184.     JZ    RUN4    ;DONE
  1185.     LHLD    SLIN
  1186.     CALL    CMP16
  1187.     JZ    RUN4A    ;DONE
  1188.     XCHG        ;ADDRESS BACK TO HL
  1189. RUN    SHLD    LINE    ;UPDATE LINE FLAG
  1190.     MVI    A,0FFH    ;SET RUN FLAG
  1191.     STA    RUNF
  1192. RUN1    CALL    CONT    ;CHECK FOR CONTROL C PUSHED
  1193.     JZ    RUN2    ;SURE WAS
  1194.     LHLD    PNTR    ;SET NPNTR
  1195.     SHLD    NPNTR
  1196.     LHLD    PNTR    ;CHECK FOR OUT OF MEMORY
  1197.     XCHG
  1198.     LHLD    FARY
  1199.     CALL    CMP16    ;PNTR SHOULD BE SMALLER
  1200.     MVI    B,27H    ;ERROR CODE JUST IN CASE
  1201.     JC    ERROR    ;OOPS, ALL OUT
  1202.     LHLD    LINE    ;GET CURRENT STATEMENT CODE
  1203. RUNA    MOV    A,M    ;GET OPCODE
  1204.     CPI    9BH    ;IS IT AN ELSE?
  1205.     JZ    RUNELS    ;YUP
  1206.     CPI    9FH    ;IS IT A STATEMENT NAME?
  1207.     JZ    RUNB    ;YUP
  1208.     CPI    9CH    ;IS IT A TAB?
  1209.     JZ    RU000    ;YUP
  1210.     CPI    35H    ;IS IT A REMARKS SECTION?
  1211.     JZ    RUNC    ;YUP
  1212.     CPI    86H    ;IS IT A REMARKS STATEMENT?
  1213.     JZ    RUNC    ;YUP
  1214.     CPI    0A4H    ;IS IT A DEF STATEMENT?
  1215.     JZ    RUNG    ;YUP
  1216.     CPI    9EH    ;IS IT A COLON OR BACKSLASH?
  1217.     JZ    RU000    ;YUP
  1218.     CPI    9DH
  1219.     JZ    RU000    ;YUP
  1220.     STA    OPFLG    ;SET OPCODE FLAG
  1221.     CPI    0A0H    ;IS IT A NORMAL STATEMENT?
  1222.     JM    RUN6    ;NOPE
  1223.     INX    H    ;CHECK FOR TRAILING EXPRESSION
  1224.     MOV    A,M
  1225.     CPI    9
  1226.     JNZ    RUN7    ;NO EXPRESSION FOLLOWING
  1227.     CALL    EVPE    ;EVALUATE IT
  1228.     INX    D    ;GET NEXT COMMAND ADDRESS
  1229.     PUSH    D    ;ONTO THE STACK
  1230.     STC        ;SET CARRY
  1231. RUN9    PUSH    PSW    ;SAVE FLAGS
  1232.     PUSH    H    ;SAVE FIRST STACK ADDRESS
  1233.     LHLD    LINE    ;GET OPCODE AGAIN
  1234.     MOV    A,M
  1235.     SUI    0A0H    ;SUBTRACT OFFSET
  1236.     ADD    A    ;DOUBLE IT
  1237.     LXI    H,NSPRC    ;NORMAL STATEMENT PROCESSOR ADDRESSES
  1238.     CALL    ADHL    ;ADD IT UP
  1239.     MOV    E,M    ;GET OUT ADDRESS
  1240.     INX    H
  1241.     MOV    D,M
  1242.     XCHG        ;TO HL
  1243.     POP    D    ;GET BACK STACK ADDRESS
  1244.     POP    PSW    ;GET BACK FLAGS
  1245.     LXI    B,RUN8    ;PUSH RETURN ADDRESS
  1246.     PUSH    B
  1247.     PCHL        ;JUMP TO PROCESSOR
  1248. RUNELS    LXI    B,1    ;MOVE UP ONE LOGICAL LINE
  1249.     INX    H    ;UPDATE LINE
  1250.     SHLD    LINE
  1251.     CALL    LILO1    ;DO IT
  1252.     LHLD    LINE    ;RUN
  1253.     JMP    RUN
  1254. RUN7    XRA    A    ;CLEAR CARRY
  1255.     PUSH    H    ;SAVE ADDRESS
  1256.     JMP    RUN9    ;PROCESS IT
  1257. RUN6    SUI    80H    ;SUBTRACT OFFSET
  1258.     ADD    A    ;DOUBLE IT
  1259.     LXI    H,OSPRC    ;ODDBALL STATEMENT PROCESSOR ADDRESSES
  1260.     CALL    ADHL    ;ADD IT
  1261.     MOV    E,M    ;GET THE ADDRESS OUT
  1262.     INX    H
  1263.     MOV    D,M
  1264.     LXI    H,RUN8    ;PUSH RETURN ADDRESS
  1265.     PUSH    H
  1266.     XCHG        ;ADDRESS TO HL
  1267.     PCHL        ;GO GET IT
  1268. RUN4    XRA    A    ;CLEAR RUNF
  1269.     LHLD    ESRC
  1270.     SHLD    LINEA
  1271. RUN4TES    STA    RUNF
  1272.     INR    A    ;SET COMMAND MODE
  1273.     STA    CMND
  1274.     JMP    RSTRT    ;BACK TO EXECUTIVE
  1275. RUNB    MVI    A,5    ;SET UP TO GET STATEMENT ADDRESS
  1276.     CALL    ADHL    ;ADD IT UP
  1277.     JMP    RUN    ;DO IT
  1278. RUN2    CALL    CRLF    ;CARRIAGE RETURN
  1279.     LHLD    LINE    ;SAVE LINE POINTER
  1280.     SHLD    LINEA
  1281.     LXI    H,RNMSG    ;PRINT BREAK MESSAGE
  1282.     CALL    MSGER    ;DUMP IT
  1283.     CALL    LNDSC    ;PRINT LINE DESCRIPTOR
  1284.     XRA    A
  1285.     JMP    RUN4TES    ;BACK TO EXECUTIVE
  1286. RUNC    INX    H    ;GET NEXT ADDRESS
  1287.     MOV    A,M    ;GET A BYTE
  1288.     DCR    A    ;CHECK FOR 01 CODE
  1289.     JNZ    RUNC    ;NOPE
  1290.     INX    H    ;FOUND IT
  1291.     PUSH    H    ;ONTO THE STACK
  1292.     JMP    RUN8    ;DO NEXT STATEMENT
  1293. PLUSM    DB    '+'+80H
  1294. RNMSG    DB    'BREAK IN',0A0H
  1295. SSSS    DW    0DBFFH
  1296. * RTN. E.34
  1297. * ASSIGNMENT OPERATOR PROCESSOR
  1298. OPRQ    CALL    FNOP    ;GET SOURCE
  1299.     PUSH    H    ;SAVE ADDRESS
  1300.     PUSH    PSW    ;SAVE FLAGS
  1301.     XRA    A    ;CLEAR CHANGE STRING FLAG
  1302.     STA    TMP7
  1303.     CALL    POPS    ;GET DESTINATION
  1304.     MOV    A,M    ;GET ID BYTE
  1305.     CPI    2    ;IS IT A LABEL?
  1306.     JZ    OPRQ1    ;YUP
  1307.     CPI    4    ;IS IT A NUMBER BLOCK?
  1308.     JZ    OPRQ6    ;YUP
  1309.     ANA    A    ;IS IT A LITERAL?
  1310.     MVI    B,31H
  1311.     JZ    ERROR    ;YUP
  1312.     MVI    B,10H
  1313.     JMP    ERROR    ;NOPE
  1314. OPRQ1    INX    H    ;GET POINTER OUT
  1315.     MOV    E,M
  1316.     INX    H
  1317.     MOV    D,M
  1318.     XCHG        ;TO HL
  1319.     MOV    A,M    ;GET ID BYTE
  1320.     ANI    0EH    ;STRIP OFF ID BITS
  1321.     CPI    2    ;IS IT A NUMBER?
  1322.     JNZ    OPRQ2    ;NOPE
  1323.     POP    PSW    ;GET FLAGS BACK
  1324.     JNC    OPRQ4    ;NOT STRING INTO NUMBER
  1325.     POP    D    ;GET SOURCE
  1326.     PUSH    D    ;SAVE IT AGAIN
  1327.     LDAX    D    ;GET A BYTE
  1328.     CPI    80H    ;NULL STRING?
  1329.     MVI    B,32H
  1330.     JNZ    INPTA    ;STRING INTO NUMBER
  1331.     LDA    OPFLG    ;ARE WE IN AN INPUT INSTRUCTION?
  1332.     CPI    0A7H
  1333.     MVI    B,32H    ;ERROR CODE JUST IN CASE
  1334.     JNZ    ERROR    ;NOPE
  1335.     XCHG
  1336.     POP    B
  1337.     LXI    H,ZERO0
  1338.     LXI    B,6
  1339.     CALL    MOVE
  1340.     XCHG
  1341.     SHLD    SCFLG
  1342.     RET        ;DONE
  1343. OPRQ4    XCHG        ;LOCATION TO DE
  1344.     POP    H    ;GET SOURCE ADDRESS
  1345.     LXI    B,6    ;NUMBER OF BYTES
  1346.     CALL    MOVE    ;MOVE IT IN
  1347.     XCHG        ;STORE ADDRESS FOR "FOR"
  1348.     SHLD    SCFLG
  1349.     RET        ;DONE.
  1350. OPRQ2    CPI    8    ;IS IT A STRING POINTER
  1351.     JNZ    OPRQ3    ;NOPE
  1352.     POP    PSW    ;GET FLAGS BACK
  1353.     MVI    B,33H    ;ERROR CODE
  1354.     CNC    OQ00    ;NUMBER INTO A STRING
  1355.     INX    H    ;GET POINTER LOCATION
  1356.     INX    H
  1357.     INX    H
  1358.     MOV    E,M    ;GET POINTER OUT
  1359.     INX    H
  1360.     MOV    D,M
  1361. OPRQ8    XCHG        ;SWAP
  1362.     PUSH    D    ;SAVE LOCATION OF POINTER
  1363.     CALL    KILL    ;ELIMINATE THE BLOCK
  1364.     POP    H    ;GET BACK POINTER LOCATION
  1365. OPRQ5    XTHL        ;SWAP IT WITH STRING LOCATION
  1366.     LDA    TMP7    ;CHECK FOR CHANGE STRING FLAG
  1367.     ANA    A
  1368.     JNZ    OQ01    ;YUP
  1369. OQ02    CALL    COUNT    ;HOW MANY LITTLE INDIANS?
  1370.     XTHL        ;POINTER LOCATION TO HL
  1371.     XCHG        ;SWAP
  1372.     DCX    D    ;GET IT RIGHT
  1373.     MVI    A,81H    ;ID BYTE
  1374.     PUSH    D    ;SAVE POINTER LOCATION
  1375.     PUSH    H    ;SAVE NUMBER OF BYTES
  1376.     CALL    AMBL    ;ASSIGN MEMORY SPACE
  1377.     POP    B    ;NUMBER TO TRANSFER
  1378.     XCHG        ;DESTINATION TO DE
  1379.     POP    H    ;POINTER LOCATION
  1380.     XTHL        ;SWAP IT WITH SOURCE
  1381.     CALL    MOVE    ;MOVE THE STRING IN
  1382.     POP    H    ;GET POINTER LOCATION
  1383.     MOV    M,E    ;STUFF IT IN
  1384.     INX    H
  1385.     MOV    M,D
  1386.     RET        ;DONE.
  1387. OPRQ3    MOV    A,M    ;GET BYTE AGAIN
  1388.     INR    A
  1389.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  1390.     JNZ    ERROR
  1391.     POP    PSW    ;GET FLAGS
  1392.     JNC    OPRQ4    ;NUMERIC TRANSFER
  1393.     MVI    M,8    ;STORE ID BYTE
  1394.     INX    H    ;GET POINTER LOCATION
  1395.     INX    H
  1396.     INX    H
  1397.     INX    H
  1398.     JMP    OPRQ5    ;PROCESS
  1399. OPRQ6    INX    H    ;GET NEXT BYTE
  1400.     MOV    A,M
  1401.     CPI    4    ;NUMERIC ARRAY?
  1402.     JNZ    OPRQ7    ;NOPE
  1403.     POP    PSW    ;GET BACK FLAGS
  1404.     MVI    B,32H
  1405.     JC    INPTA    ;STRING INTO NUMERIC
  1406.     INX    H    ;GET POINTER OUT
  1407.     MOV    E,M
  1408.     INX    H
  1409.     MOV    D,M
  1410.     JMP    OPRQ4+1    ;PROCESS
  1411. OPRQ7    POP    PSW    ;GET FLAGS
  1412.     MVI    B,33H
  1413.     CNC    OQ00    ;NUMBER INTO STRING
  1414.     INX    H    ;GET POINTER OUT
  1415.     MOV    E,M
  1416.     INX    H
  1417.     MOV    D,M
  1418.     XCHG        ;TO HL
  1419.     MOV    E,M    ;GET STRING POINTER OUT
  1420.     INX    H
  1421.     MOV    D,M
  1422.     JMP    OPRQ8
  1423. OQ00    LDA    OPFLG    ;CHECK FOR INPUT STATEMENT
  1424.     CPI    0A7H
  1425.     STA    TMP7
  1426.     RZ        ;IT WAS
  1427.     CPI    0A0H
  1428.     RZ        ;IF CLOAD, IT'S OK
  1429.     JMP    ERROR    ;IT WASN'T
  1430. OQ01    LHLD    LLST
  1431.     SHLD    PNTR
  1432.     LHLD    TMP11+2
  1433.     JMP    OQ02
  1434. * RTN. E.35
  1435. * PRINT PROCESSOR
  1436. SPRA    MVI    A,0    ;SET TERMINAL MODE
  1437.     STA    CSST
  1438.     STA    CATV
  1439. SPRAZ    XCHG        ;TO HL
  1440.     PUSH    H    ;SAVE ADDRESS
  1441.     JNC    SPRA8    ;SKIP IF NO EXPRESSION
  1442. SPRA1    MOV    A,M    ;GET STACK BYTE
  1443.     CPI    9    ;END?
  1444.     JZ    SPRA6    ;YUP
  1445.     CPI    0DH    ;COMMA?
  1446.     JZ    SPRA5    ;YUP
  1447.     CPI    0EH    ;SEMICOLON?
  1448.     JZ    SPRA2    ;YUP
  1449.     LDA    BFLAG    ;IS IT BINARY MODE
  1450.     ANA    A
  1451.     JNZ    SPRAB2    ;YUP
  1452.     MOV    A,M
  1453.     CPI    6    ;IS IT SPECIAL OPERAND?
  1454.     JZ    SP000    ;YUP
  1455. SPRAB2    PUSH    H    ;SAVE THE ADDRESS
  1456.     LDA    BFLAG    ;CHECK FOR BINARY OUTPUT
  1457.     ANA    A
  1458.     JNZ    SPRAB1    ;SURE IS
  1459.     CALL    FNOPO    ;GET OPERAND
  1460.     JC    SPRAA    ;STRING
  1461.     XCHG        ;TO DE
  1462.     LHLD    PNTR    ;PLACE TO PUT STRING
  1463.     LDA    CSST    ;CHECK FOR CASSETTE MODE
  1464.     ANA    A
  1465.     JNZ    SPRACAS    ;SURE IS
  1466.     MVI    M,20H    ;STORE A SPACE
  1467.     INX    H    ;NEXT ADDRESS
  1468.     XCHG        ;BACK TO NORMAL
  1469.     CALL    NMST    ;CONVERT NUMBER TO STRING
  1470.     XCHG        ;TO HL
  1471.     MVI    M,0A0H    ;STORE END SPACE
  1472. SPRA3    LHLD    PNTR    ;PLACE TO OUTPUT FROM
  1473. SPRAA    CALL    LNOT    ;SEND IT OUT
  1474. SPRA4    POP    H    ;GET ADDRESS BACK
  1475. SPRA2    MOV    A,M    ;GET BYTE BACK
  1476.     CALL    GTIN    ;HOW BIG IS IT?
  1477.     DAD    D    ;ADD IT UP
  1478.     JMP    SPRA1    ;LOOP FOR MORE ON THE STACK
  1479. SPRAB1    CALL    FNOPO    ;GET THE OPERAND
  1480.     JC    SPRAB3    ;IF STRING
  1481.     MVI    B,6    ;NUMBER OF BYTES
  1482. SPRAB11    MOV    A,M    ;GET A BYTE
  1483.     PUSH    H    ;SAVE
  1484.     PUSH    B
  1485.     CALL    OBPORT    ;SEND IT
  1486.     POP    B
  1487.     POP    H    ;RESTORE
  1488.     DCR    B    ;DONE?
  1489.     INX    H    ;UPDATE INDEX
  1490.     JNZ    SPRAB11    ;NOPE
  1491.     JMP    SPRA4    ;YUP
  1492. SPRAB3    PUSH    H    ;SAVE ADDRESS
  1493.     XRA    A    ;SEND A    0
  1494.     CALL    OBPORT    ;INDICATING A STRING
  1495.     POP    H    ;RESTORE ADDRESS
  1496. SPRAB31    MOV    A,M    ;GET A CHARACTER
  1497.     PUSH    H    ;SAVE ADDRESS
  1498.     CALL    OBPORT
  1499.     POP    H
  1500.     MOV    A,M
  1501.     INX    H    ;UPDATE INDEX
  1502.     ANA    A    ;DONE?
  1503.     JP    SPRAB31    ;NOPE
  1504.     JMP    SPRA4
  1505. SPRA5    PUSH    H    ;SAVE ADDRESS
  1506.     LDA    BFLAG    ;CHECK FOR BINARY OUTPUT
  1507.     ANA    A
  1508.     JNZ    SPRA4    ;YUP, SO IGNORE
  1509.     LDA    CSST    ;CHECK FOR CASSETTE MODE
  1510.     ANA    A
  1511.     JNZ    Q0000    ;SURE IS
  1512.     LDA    POSIT    ;PRINT HEAD POSITION
  1513.     MOV    L,A    ;TO HL
  1514.     MVI    H,0
  1515.     MVI    E,14    ;SET UP
  1516.     CALL    DIV    ;TO DIVIDE BY 14 FOR COLUMNS
  1517.     MVI    A,14
  1518.     SUB    H    ;SUBTRACT REMAINDER
  1519.     JZ    SPRA4    ;NO MOVE AT ALL
  1520.     LHLD    PNTR    ;PLACE FOR SPACE STRING
  1521. SPRAB    MVI    M,20H    ;STUFF A SPACE
  1522.     INX    H    ;UPDATE POSITION
  1523.     DCR    A    ;UPDATE COUNT
  1524.     JNZ    SPRAB    ;MORE TO DUMP
  1525.     DCX    H    ;SET UPPER BIT ON LAST ONE
  1526.     MVI    M,0A0H
  1527.     JMP    SPRA3    ;DUMP IT
  1528. SPRA6    DCX    H    ;LOOK AT LAST BYTE
  1529.     MOV    A,M
  1530.     CPI    0DH    ;COMMA?
  1531.     JZ    SPRA7    ;YUP
  1532.     CPI    0EH    ;SEMICOLON?
  1533.     JZ    SPRA7    ;YUP
  1534.     LDA    BFLAG    ;CHECK FORBINARY MODE
  1535.     ANA    A
  1536.     JNZ    SPRA7    ;YUP
  1537. SPRA8    LXI    H,SPRMS    ;SEND A CARRIAGE RETURN
  1538.     CALL    LNOT
  1539. SPRA7    POP    H    ;GET BACK FIRST ADDRESS
  1540.     SHLD    PNTR    ;CLEAR THE STACK
  1541.     LDA    BFLAG    ;BINARY MODE?
  1542.     ANA    A
  1543.     JNZ    SPRABF    ;YUP
  1544.     LDA    CSST    ;CASSETTE MODE?
  1545.     ANA    A
  1546.     RZ        ;NOPE
  1547.     XRA    A    ;CLEAR OUT ANY CASSETTE MODE
  1548.     STA    CSST
  1549.     INR    A    ;CLEAR 0 FLAG
  1550.     STC        ;MOTORS OFF
  1551.     CALL    COUT
  1552.     RET        ;DONE.
  1553. SPRABF    XRA    A    ;CLEAR AND STOP MOTORS
  1554.     STA    BFLAG
  1555.     INR    A
  1556.     STC
  1557.     CALL    BPORT
  1558.     RET        ;DONE
  1559. SPRACAS    XCHG        ;CONVERT TO STRING
  1560.     CALL    NMST
  1561.     XCHG
  1562.     DCX    H
  1563.     MOV    A,M    ;SET LAST BIT
  1564.     ORI    80H
  1565.     MOV    M,A
  1566.     JMP    SPRA3    ;DONE
  1567. SPRMS    DB    8DH    ;CARRIAGE RETURN MESSAGE
  1568. * RTN. E.36
  1569. * GET NUMERICAL OPERAND ADDRESS
  1570. FPR10    CALL    FNOP    ;GET ADDRESS
  1571.     MVI    B,26H    ;ERROR CODE
  1572.     JC    ERROR    ;CAN'T HAVE A STRING, TURKEY!
  1573. FPR11    XCHG        ;TO DE
  1574.     LHLD    PNTR    ;GET PNTR
  1575.     MVI    M,0    ;STORE BEGINNING OF POINTER NUMBER
  1576.     INX    H    ;INCREMENT
  1577.     XCHG        ;EVERYTHING BACK TO NORMAL
  1578.     RET        ;ALL DONE
  1579. * RTN. E.37
  1580. * GET STRING OPERAND ADDRESS
  1581. FPR20    CALL    FNOP    ;GET ADDRESS
  1582.     MVI    B,26H    ;ERROR CODE
  1583.     JNC    ERROR    ;CAN'T HAVE A NUMBER, ROCK.
  1584.     JMP    FPR11    ;FINISH UP
  1585. * RTN. E.38
  1586.     STA    CATV
  1587. * GET NUMERICAL OPERAND AND CHECK FOR COMMA
  1588. FPR30    CALL    FPR10    ;GET OPERAND ADDRESS
  1589.     PUSH    H    ;SAVE PARAMETERS
  1590.     PUSH    D
  1591.     CALL    POPS    ;POP ANOTHER ONE
  1592.     MOV    A,M    ;GET FIRST BYTE
  1593.     CPI    0DH    ;IS IT A COMMA?
  1594.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  1595.     JNZ    ERROR    ;IT WASN'T A COMMA
  1596.     POP    D    ;RESTORE PARAMETERS
  1597.     POP    H
  1598.     DCX    D    ;CORRECT FOR PNTR+1
  1599.     RET        ;DONE
  1600. * RTN. E.39
  1601. * GET NUMERICAL OPERAND TO BINARY
  1602. FPR40    CALL    FPR10    ;GET BCD OPERAND
  1603.     PUSH    D    ;SAVE PNTR+1
  1604.     CALL    BCDB    ;CONVERT TO BINARY
  1605.     POP    D    ;RESTORE PNTR+
  1606.     RET        ;DONE
  1607. * RTN. E.40
  1608. * STRING FINISHER
  1609. FPR50    INX    H    ;GET NEXT CHARACTER
  1610.     MVI    M,1    ;STORE END OF STRING CHARACTER
  1611.     INX    H    ;GET NEXT ADDRESS
  1612.     SHLD    PNTR    ;UPDATE PNTR
  1613.     RET        ;DONE
  1614. * RTN. E.41
  1615. * ABS PROCESSOR
  1616. FPRA    CALL    FPR10    ;GET OPERAND
  1617.     CALL    ABSLT    ;GET ABSOLUTE VALUE
  1618.     JMP    OPR30    ;FINISH
  1619. * RTN. E.42
  1620. * ASC PROCESSOR
  1621. FPRB    CALL    FPR20    ;GET OPERAND
  1622.     MOV    A,M    ;GET FIRST BYTE
  1623.     ANI    7FH    ;STRIP OFF UPPER BIT
  1624.     MOV    L,A    ;TO HL
  1625.     MVI    H,0    ;CLEAR H
  1626. * RTN. E.43
  1627. * BINARY FINISHER
  1628. FPR60    CALL    BBCD    ;CONVERT TO BCD
  1629.     JMP    OPR30    ;FINISH
  1630. * RTN. E.44
  1631. * ATN PROCESSOR
  1632. FPRC    CALL    FPR10    ;GET OPERAND
  1633.     CALL    ATAN    ;COMPUTE ARCTANGENT
  1634.     JMP    OPR30    ;FINISH
  1635. * RTN. E.45
  1636. * CHR$ PROCESSOR
  1637. FPRD    CALL    FPR40    ;GET OPERAND
  1638.     INR    H    ;CHECK FOR TOO BIG
  1639.     DCR    H
  1640.     MVI    B,26H    ;ERROR CODE JUST IN CASE
  1641.     JNZ    ERROR    ;SURE WAS
  1642.     MOV    A,L    ;CODE TO A
  1643.     STAX    D    ;STUFF IT IN
  1644.     JMP    FPRU2    ;FINISH
  1645. * RTN. E.46
  1646. * COS PROCESSOR
  1647. FPRE    CALL    FPR10    ;GET OPERAND
  1648.     CALL    COSN    ;COMPUTE COSINE
  1649.     JMP    OPR30    ;FINISH
  1650. * RTN. E.47
  1651. * EXP PROCESSOR
  1652. FPRF    CALL    FPR10    ;GET OPERAND
  1653.     CALL    ETOX    ;COMPUTE E TO THE XTH POWER
  1654.     JMP    OPR30
  1655. * RTN. E.48
  1656. * FRE PROCESSOR
  1657. FPRG    CALL    POPS    ;GET RID OF OPERAND
  1658.     LHLD    PNTR    ;COMPUTE FREE SPACE LEFT
  1659.     XCHG
  1660.     LHLD    FARY
  1661.     CALL    SUB16
  1662.     INX    D    ;UPDATE PNTR
  1663.     PUSH    D    ;SAVE IT
  1664.     LXI    D,250    ;SUBTRACT STACK ROOM
  1665.     CALL    SUB16    ;SUBTRACT IT
  1666.     JC    FPRG1    ;IT'S OKAY
  1667.     LXI    H,0    ;ALL OUT
  1668. FPRG1    POP    D    ;RESTORE POINTER
  1669.     JMP    FPR60    ;FINISH
  1670. Q0000    LXI    H,SPRMS    ;CARRIAGE RETURN MESSAGE
  1671.     JMP    SPRAA    ;DUMP IT OUT
  1672. RU000    INX    H
  1673.     JMP    RUN    ;TRY AGAIN ON NEXT STATEMENT
  1674. RUN4A    LHLD    PNTRA    ;RESTORE PNTR
  1675.     SHLD    PNTR
  1676.     XRA    A
  1677.     JMP    RUN4TES
  1678. * RTN. E.49
  1679. * INP PROCESSOR
  1680. FPRH    CALL    FPR40    ;GET OPERAND
  1681.     MOV    A,H    ;TOO BIG?
  1682.     ANA    A
  1683.     MVI    B,26H    ;ERROR CODE JUST IN CASE
  1684.     JNZ    ERROR    ;SURE WAS
  1685.     MOV    H,L    ;STORE PORT NUMBER AND INSTRUCTION
  1686.     MVI    L,0DBH    ;INPUT INSTRUCTION
  1687.     SHLD    IOST    ;STORE IT
  1688.     CALL    IOST    ;DO IT
  1689.     MOV    L,A    ;TO HL
  1690.     MVI    H,0
  1691.     JMP    FPR60    ;FINISH
  1692. * RTN. E.50
  1693. * INT PROCESSOR
  1694. FPRI    CALL    FPR10    ;GET OPERAND
  1695.     CALL    INTG    ;CONVERT TO INTEGER
  1696.     JMP    OPR30    ;FINISH
  1697. * RTN. E.51
  1698. * LEFT$ PROCESSOR
  1699. FPRJ    CALL    FPR40    ;GET OPERAND
  1700.     PUSH    H    ;SAVE IT
  1701.     CALL    POPS    ;POP OFF A COMMA
  1702.     MOV    A,M    ;CHECK IT
  1703.     CPI    0DH
  1704.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  1705.     JNZ    ERROR    ;WASN'T A COMMA
  1706.     CALL    FPR20    ;GET OPERAND TWO
  1707. FPRJ1    POP    B    ;GET COUNT BACK
  1708. FPRJ2    MOV    A,M    ;GET A CHARACTER
  1709.     STAX    D    ;STORE IT
  1710.     ANA    A    ;SEE IF IT WAS END OF STRING
  1711.     JM    FPRJ3    ;IT WAS
  1712.     DCX    B    ;IT WASN'T
  1713.     INX    H    ;UPDATE INDICES
  1714.     INX    D
  1715.     MOV    A,B    ;SEE IF COUNT IS EXHAUSTED
  1716.     ORA    C
  1717.     JNZ    FPRJ2    ;NOPE
  1718.     DCX    D    ;GET LAST CHARACTER ADDRESS
  1719. FPRJ3    LDAX    D    ;GET UPPER BIT SET
  1720.     ORI    80H
  1721.     STAX    D    ;STUFF IT BACK
  1722.     JMP    FPRU2    ;FINISH
  1723. * RTN. E.52
  1724. * LEN PROCESSOR
  1725. FPRK    CALL    FPR20    ;GET OPERAND
  1726.     PUSH    D    ;SAVE PNTR
  1727.     CALL    COUNT    ;COUNT CHARACTERS
  1728.     XCHG        ;COUNT TO HL
  1729.     POP    D    ;GET BACK PNTR
  1730.     JMP    FPR60    ;FINISH
  1731. * RTN. E.53
  1732. * LOG PROCESSOR
  1733. FPRL    CALL    FPR10    ;GET OPERAND
  1734.     CALL    LOGX    ;COMPUTE LOG BASE E
  1735.     JMP    OPR30    ;FINSIH
  1736. * RTN. E.54
  1737. * MID$ PROCESSOR
  1738. FPRM    CALL    FPR30    ;GET OPERAND
  1739.     CALL    BCDB    ;CONVERT TO BINARY
  1740.     PUSH    H    ;SAVE IT
  1741.     CALL    FNOP    ;GET ANOTHER OPERAND
  1742.     JC    FPRM1    ;STRING ALREADY
  1743.     CALL    BCDB    ;CONVERT TO BINARY
  1744.     PUSH    H    ;SAVE IT
  1745.     CALL    POPS    ;GET THE COMMA OFF
  1746.     MOV    A,M    ;CHECK IT OUT
  1747.     CPI    0DH
  1748.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  1749.     JNZ    ERROR    ;NO COMMA
  1750.     CALL    FPR20    ;GET THE STRING OFF
  1751. FPRM2    POP    B    ;GET FIRST COUNT BACK
  1752. FPRM4    DCX    B    ;CHECK FOR DONENESS
  1753.     MOV    A,B
  1754.     ORA    C
  1755.     JZ    FPRJ1    ;GOT IT
  1756.     MOV    A,M    ;CHECK FOR RUNNING INTO END
  1757.     ANA    A
  1758.     JM    FPRM3    ;WE DID
  1759.     INX    H    ;UPDATE INDEX
  1760.     JMP    FPRM4    ;LOOP FOR ANOTHER ONE
  1761.     DCR    B
  1762. FPRM1    LXI    D,0FFFFH     ;GET ALL ONES TO DE
  1763.     POP    B    ;COUNT BACK
  1764.     PUSH    D    ;PUSH 'EM BACK
  1765.     PUSH    B
  1766.     PUSH    H
  1767.     LHLD    PNTR    ;GET PNTR+1 BACK
  1768.     MVI    M,0    ;STORE STRING START
  1769.     INX    H
  1770.     XCHG        ;TO DE
  1771.     POP    H    ;RESTORE ADDRESS
  1772.     JMP    FPRM2    ;CONTINUE
  1773. FPRM3    POP    B    ;GET STACK RIGHT
  1774.     MVI    A,0A0H    ;GET BLANKS CODE
  1775.     STAX    D    ;STUFF IT IN
  1776.     JMP    FPRU2    ;FINISH
  1777. * RTN. E.55
  1778. * OCT$ PROCESSOR
  1779. FPRN    CALL    FPR40    ;GET OPERAND
  1780.     DCX    D
  1781.     MVI    C,1    ;SET UP FOR LOOP
  1782.     MVI    B,0
  1783.     JMP    FPRN1    ;TO MIDDLE OF LOOP
  1784. FPRN6    MVI    C,3    ;TRIPLE SHIFT
  1785. FPRN1    XRA    A    ;CLEAR A
  1786. FPRN2    DAD    H    ;LEFT SHIFT HL
  1787.     RAL        ;BIT TO A
  1788.     DCR    C    ;UPDATE SHIFT COUNT
  1789.     JNZ    FPRN2    ;MORE SHIFTS
  1790.     INR    B    ;UPDATE COUNT
  1791.     ANA    A    ;CHECK FOR A ZERO
  1792.     JNZ    FPRN3    ;NOT ZERO
  1793.     DCR    B    ;CHECK FOR B=MINUS
  1794.     INR    B    ;CHECK FOR B=MINUS
  1795.     JP    FPRN4    ;IT'S NOT
  1796. FPRN3    INX    D    ;STORE THE CHARACTER
  1797.     ORI    30H    ;MAKE IT ASCII
  1798.     STAX    D    ;STUFF IT
  1799.     MOV    A,B    ;MAKE B MINUS
  1800.     ORI    80H    ;INDICATING NO MORE ZERO SKIPPING
  1801.     MOV    B,A
  1802. FPRN4    MOV    A,B    ;CHECK FOR DONENESS
  1803.     ANI    7FH    ;STRIP OFF UPPER BIT
  1804.     CPI    6
  1805.     JNZ    FPRN6    ;NOT DONE YET
  1806.     XCHG        ;ADDRESS TO HL
  1807.     MOV    A,B    ;CHECK FOR NOTHING PRINTED
  1808.     CPI    6
  1809.     JNZ    FPRN7    ;ALL IS WELL
  1810.     INX    H    ;STORE A ZERO
  1811.     MVI    A,30H
  1812.     MOV    M,A
  1813. FPRN7    MOV    A,M    ;SET UPPER BIT
  1814.     ORI    80H
  1815.     MOV    M,A
  1816.     JMP    FPR50    ;DONE
  1817. * RTN. E.56
  1818. * PEEK PROCESSOR
  1819. FPRO    CALL    FPR40    ;GET OPERAND
  1820.     MOV    L,M    ;GET BYTE OUT
  1821.     MVI    H,0    ;CLEAR H
  1822.     JMP    FPR60    ;FINISH
  1823. * RTN. E.57
  1824. * POS PROCESSOR
  1825. FPRP    CALL    POPS    ;DUMP ONE OFF STACK
  1826.     LDA    POSIT    ;GET POSITION
  1827.     LHLD    PNTR    ;POINTER TO DE
  1828.     XCHG
  1829.     INX    D
  1830.     MOV    L,A    ;TO HL
  1831.     MVI    H,0
  1832.     JMP    FPR60    ;FINISH
  1833. * RTN. E.58
  1834. * RIGHT$ PROCESSOR
  1835. FPRQ    CALL    FPR40    ;GET OPERAND
  1836.     PUSH    H    ;SAVE IT
  1837.     CALL    POPS    ;GET THE COMMA OFF
  1838.     MOV    A,M    ;CHECK IT OUT
  1839.     MVI    B,10H    ;ERROR CODE JUST IN CASE
  1840.     CPI    0DH
  1841.     JNZ    ERROR    ;IT WASN'T
  1842.     CALL    FPR20    ;GET THE OTHER OPERAND
  1843.     PUSH    D    ;SAVE PNTR
  1844.     CALL    COUNT    ;FIND END OF STRING
  1845.     DAD    D
  1846.     DCX    H    ;CORRECTION
  1847.     POP    D    ;GET BACK PNTR
  1848.     POP    B    ;GET BACK COUNT
  1849. FPRQ2    MOV    A,M    ;GET A CHARACTER
  1850.     ANA    A    ;CHECK FOR START CODE
  1851.     JZ    FPRQ1    ;IT WAS
  1852.     DCX    B    ;CHECK COUNT
  1853.     MOV    A,C
  1854.     ORA    B
  1855.     DCX    H
  1856.     JNZ    FPRQ2    ;MORE TO GOT
  1857. FPRQ1    INX    H    ;FIRST CHARACTER TO USE
  1858.     LXI    B,0FFFFH     ;ALL ONES
  1859.     JMP    FPRJ2    ;FINISH IT
  1860. * RTN. E.59
  1861. * RND PROCESSOR
  1862. FPRR    CALL    FPR10    ;GET OPERAND
  1863.     PUSH    D    ;SAVE PNTR
  1864.     MOV    A,M    ;GET SIGN
  1865.     ANA    A    ;SEE IF IT'S MINUS
  1866.     JM    FPRR1    ;YUP, SO NEW SEED
  1867.     LXI    D,ZERO0    ;COMPARE WITH ZERO
  1868.     CALL    CMPR
  1869.     JZ    FPRR2    ;GET LAST NUMBER
  1870. FPRR3    LXI    D,SEED     ;GET OPERANDS FOR MODULO 10E 08 MULTIPLY
  1871.     LXI    H,A7579
  1872.     CALL    FMUL    ;DO IT
  1873.     LXI    H,WORK1+8     ;ANSWER
  1874.     LXI    D,SEED+2     ;DESTINATION
  1875.     LXI    B,4    ;NUMBER OF BYTES
  1876.     CALL    MOVE    ;MOVE IT IN
  1877. FPRR2    POP    B    ;GET PLACE FOR RANDOM NUMBER
  1878.     LXI    D,TENT8    ;CONSTANT
  1879.     LXI    H,SEED
  1880.     CALL    DIVER    ;COMPUTE NUMBER BETWEEN 0 AND 1
  1881.     JMP    OPR30    ;FINISH
  1882. FPRR1    LXI    D,SEED    ;GET ABSOLUTE VALUE OF NEW SEED
  1883.     CALL    ABSLT
  1884.     LXI    H,SEED    ;GET INTEGER OF SEED
  1885.     LXI    D,SEED
  1886.     CALL    INTG
  1887.     JMP    FPRR3    ;COMPUTE RANDOM NUMBER
  1888. * RTN. E.60
  1889. * SGN PROCESSOR
  1890. FPRS    CALL    FPR10    ;GET OPERAND
  1891.     CALL    SIGN    ;GET EQUIVALENT SIGN
  1892.     JMP    OPR30    ;FINISH
  1893. * RTN. E.61
  1894. * SIN PROCESSOR
  1895. FPRT    CALL    FPR10    ;GET OPERAND
  1896.     CALL    SINE    ;COMPUTE SINE
  1897.     JMP    OPR30
  1898. * RTN. E.62
  1899. * SPACE$ PROCESSOR
  1900. FPRU    CALL    FPR40    ;GET OPERAND
  1901.     DCX    D
  1902. FPRU1    MOV    A,H    ;HL=0?
  1903.     ORA    L
  1904.     JZ    FPRU2    ;FINISH UP
  1905.     INX    D    ;GET ADDRESS FOR SPACE
  1906.     MVI    A,20H    ;STORE IT
  1907.     STAX    D
  1908.     DCX    H    ;UPDATE COUNT
  1909.     JMP    FPRU1    ;LOOP FOR ANOTHER ONE
  1910. FPRU2    XCHG        ;ADDRESS TO HL
  1911.     MOV    A,M    ;SET UPPER BIT ON LAST ONE
  1912.     ORI    80H
  1913.     MOV    M,A
  1914.     JMP    FPR50    ;FINISH
  1915. * RTN. E.63
  1916. * SPC PROCESSOR
  1917. FPRV    CALL    FPR40    ;GET OPERAND
  1918.     XCHG        ;TO DE
  1919.     LHLD    PNTR    ;GET POINTER
  1920.     MVI    M,6    ;STORE SPECIAL OPERATOR CODE BLOCK
  1921.     INX    H
  1922.     MVI    M,1    ;SPC CODE
  1923. SPCO0    INX    H
  1924.     MOV    M,E    ;STORE NUMBER OF SPACES
  1925.     INX    H
  1926.     MVI    M,7    ;END OF BLOCK CODE
  1927.     INX    H
  1928.     SHLD    PNTR    ;UPDATE POINTER
  1929.     RET        ;DONE.......
  1930. A7579    DB    2,0,0,0,75H,79H    ;7579 CONSTANT
  1931. TENT8    DB    3,8,10H,0,0,0    ;TEN TO THE EIGHTH CONST
  1932. * RTN. E.64
  1933. * SQR PROCESSOR
  1934. FPRW    CALL    FPR10    ;GET OPERAND
  1935.     CALL    SQUR    ;COMPUTE SQUARE ROOT
  1936.     JMP    OPR30    ;FINISH
  1937. * RTN. E.65
  1938. * STR$ PROCESSOR
  1939. FPRX    CALL    FPR10    ;GET OPERAND
  1940.     CALL    NMST    ;DUMP STRING OUT
  1941.     DCX    D    ;SET BIT OF LAST CHARACTER
  1942.     XCHG
  1943.     MOV    A,M
  1944.     ORI    80H
  1945.     MOV    M,A
  1946.     JMP    FPR50    ;FINISH
  1947. * RTN. E.66
  1948. * TAB PROCESSOR
  1949. FPRY    CALL    FPR40    ;GET OPERAND
  1950.     MOV    A,H    ;TOO BIG?
  1951.     ANA    A
  1952.     MVI    B,26H    ;ERROR CODE JUST IN CASE
  1953.     JNZ    ERROR    ;SURE WAS
  1954.     XCHG        ;TO DE
  1955.     LHLD    PNTR    ;GET POINTER
  1956.     MVI    M,6    ;STORE SPECIAL OPERATOR CODE BLOCK
  1957.     INX    H
  1958.     MVI    M,0    ;TAB CODE
  1959.     JMP    SPCO0    ;CONTINUE
  1960. * RTN. E.67
  1961. * TAN PROCESSOR
  1962. FPRZ    CALL    FPR10    ;GET OPERAND
  1963.     CALL    TANG    ;COMPUTE TANGENT
  1964.     JMP    OPR30    ;FINISH
  1965. * RTN. E.68
  1966. * USR PROCESSOR
  1967. FPRAA    CALL    FPR40    ;GET OPERAND
  1968.     XCHG        ;TO DE
  1969.     PUSH    H    ;SAVE PNTR
  1970.     CALL    0    ;CALL TO USER'S ROUTINE
  1971.     XCHG        ;NUMBER TO HL
  1972.     POP    D    ;RESTORE PNTR
  1973.     JMP    FPR60    ;FINISH
  1974. * RTN. E.69
  1975. * VAL PROCESSOR
  1976. FPRAB    CALL    FPR20    ;GET OPERAND
  1977.     PUSH    D    ;SAVE PNTR
  1978.     CALL    STNM    ;CONVERT STRING TO NUBMER
  1979.     POP    D    ;RESTORE PNTR
  1980.     JNC    OPR30    ;GOOD CONVERSION
  1981.     LXI    H,ZERO0    ;MOVE A ZERO IN
  1982.     LXI    B,6    
  1983.     CALL    MOVE
  1984.     JMP    OPR30    ;FINISH
  1985. FPHEX    CALL    FPR40    ;GET OPERAND
  1986.     MVI    B,4    ;SET UP FOR 4 DIGITS
  1987. FPHEX1    XRA    A    ;CLEAR A
  1988.     MVI    C,4    ;SET UP FOR 4 BITS
  1989. FPHEX2    DAD    H    ;SHIFT
  1990.     RAL
  1991.     DCR    C    ;UPDATE BIT COUNT
  1992.     JNZ    FPHEX2    ;MORE TO SHIFT
  1993.     ADI    30H    ;ADD ASCII OFFSET
  1994.     CPI    3AH    ;SEE IF IT'S A HEX A THRU F
  1995.     JC    FPHEX3    ;NOPE
  1996.     ADI    7
  1997. FPHEX3    STAX    D    ;STUFF IT
  1998.     INX    D    ;UPDATE INDEX
  1999.     DCR    B    ;UPDATE DIGIT COUNT
  2000.     JNZ    FPHEX1    ;MORE TO GO
  2001.     XCHG        ;ADDRESS TO HL
  2002.     DCX    H    ;SET LAST BIT
  2003.     MOV    A,M
  2004.     ORI    80H
  2005.     MOV    M,A
  2006.     JMP    FPR50    ;DO IT
  2007. FPHXR    CALL    FNOP    ;GET STRING TO CONVERT
  2008.     JNC    SPRAT    ;NOT A STRING, STUPID!
  2009.     LXI    D,0    ;INITIALIZE CONVERSION LOOP
  2010.     PUSH    D    ;TO THE STACK
  2011. FPHXR1    MOV    A,M    ;GET A CHARACTER
  2012.     ANI    7FH    ;STRIP ANY STROBE OFF
  2013.     SUI    30H    ;CONVERT NUMERIC
  2014.     JC    SPRAT    ;OOPS, TOO SMALL
  2015.     CPI    0AH    ;MAYBE IT'S A LETTER
  2016.     JC    FPHXR2    ;NOPE, IT'S OK
  2017.     SUI    7    ;CONVERT THE LETTER
  2018.     CPI    10H    ;IS IT TOO BIG?
  2019.     JNC    SPRAT    ;YUP
  2020. FPHXR2    XTHL        ;GET THE NUMBER
  2021.     DAD    H    ;SHIFT LEFT 4 BITS
  2022.     DAD    H
  2023.     DAD    H
  2024.     DAD    H
  2025.     ORA    L    ;SET IN THE NEW LSN (LEAST SIGN. NIBBLE)
  2026.     MOV    L,A
  2027.     XTHL        ;BACK TO THE STACK
  2028.     MOV    A,M    ;ARE WE DONE?
  2029.     ANA    A
  2030.     INX    H
  2031.     JP    FPHXR1    ;NOPE
  2032.     POP    H    ;GET THE NUMBER
  2033.     XCHG        ;GET PLACE TO CONVERT TO
  2034.     LHLD    PNTR
  2035.     XCHG
  2036.     INX    D
  2037.     CALL    BBCD    ;CONVERT TO INTERNAL FORM
  2038.     JMP    OPR30    ;FINISH OFF THE NUMBER
  2039. FPRCS    DW    FPRA
  2040.     DW    FPRB
  2041.     DW    FPRC
  2042.     DW    FPRD
  2043.     DW    FPRE
  2044.     DW    FPRF
  2045.     DW    FPRG
  2046.     DW    FPRH
  2047.     DW    FPRI
  2048.     DW    FPRJ
  2049.     DW    FPRK
  2050.     DW    FPRL
  2051.     DW    FPRM
  2052.     DW    FPRN
  2053.     DW    FPRO
  2054.     DW    FPRP
  2055.     DW    FPRQ
  2056.     DW    FPRR
  2057.     DW    FPRS
  2058.     DW    FPRT
  2059.     DW    FPRU
  2060.     DW    FPRV
  2061.     DW    FPRW
  2062.     DW    FPRX
  2063.     DW    FPRY
  2064.     DW    FPRZ
  2065.     DW    FPRAA
  2066.     DW    FPRAB
  2067.     DW    FPMAT
  2068.     DW    FPHEX
  2069.     DW    FPRCAL
  2070.     DW    FPRLOC
  2071.     DW    FPHXR
  2072. FPRCAL    CALL    FPR40    ;GET FIRST OPERAND
  2073.     PUSH    H    ;SAVE IT
  2074.     CALL    POPS    ;LOOK FOR A COMMA
  2075.     MOV    A,M
  2076.     CPI    0DH    ;IS IT?
  2077.     JNZ    SPRAT    ;NOPE
  2078.     CALL    FPR40    ;GET SECOND OPERAND
  2079.     XCHG        ;TO DE
  2080.     XTHL        ;GET FIRST ONE BACK
  2081.     XCHG        ;FIX IT UP
  2082.     LXI    B,FPRCAL1    ;PUSH THE RETURN ADDRESS
  2083.     PUSH    B
  2084.     PCHL        ;DO IT TO IT
  2085. FPRCAL1    POP    H    ;RETURN THE PNTR LOCATION
  2086.     XCHG        ;TO DE
  2087.     CALL    BBCD    ;CONVERT TO NUMBER
  2088.     JMP    OPR30    ;EXIT
  2089. FPRLOC    CALL    FNOP    ;GET LOCATION OF OPERAND
  2090.     XCHG
  2091.     LHLD    PNTR    ;GET PLACE TO PUT IT
  2092.     XCHG
  2093.     INX    D
  2094.     CALL    BBCD    ;CONVERT TO NUMBER
  2095.     JMP    OPR30    ;DONE.......
  2096. FPMAT    CALL    FPR30    ;GET OPERAND
  2097.     CALL    BCDB    ;CONVERT TO BINARY
  2098.     PUSH    H    ;SAVE START NUMBER
  2099.     CALL    FNOP    ;GET SEARCH STRING
  2100.     JNC    SPRAT    ;SHOULD BE A STRING
  2101.     PUSH    H    ;SAVE LOCATION    
  2102.     CALL    POPS    ;GET THE COMMA OFF
  2103.     MOV    A,M
  2104.     CPI    0DH    ;IS IT A COMMA?
  2105.     JNZ    SPRAT    ;NOPE, SO ERROR
  2106.     CALL    FNOP    ;GET PATTERN STRING
  2107.     JNC    SPRAT    ;SHOULD BE A STRING, DUMMY!
  2108.     CALL    TRANS    ;TRANSFORM INTO PATTERN
  2109.     POP    D    ;GET SEARCH STRING
  2110.     XTHL        ;GET THE START
  2111.     MOV    A,H    ;CHECK FOR0
  2112.     ORA    L
  2113.     JZ    SPRAT    ;CAN'T BE
  2114.     PUSH    H    ;BACK TO THE STACK
  2115.     XCHG        ;SEARCH STRING TO HL
  2116.     CALL    COUNT    ;HOW MANY CHARACTERS?
  2117.     XTHL        ;START BACK TO HL
  2118.     INX    D    ;CHECK FOR IMPOSSIBLE SITUATION
  2119.     CALL    CMP16
  2120.     JNC    SPRAT    ;CAN'T START AFTER THE STRING!
  2121.     PUSH    H
  2122.     POP    B
  2123.     POP    H
  2124.     DCX    B
  2125.     DAD    B
  2126.     INX    B
  2127.     POP    D    ;GET THE PATTERN
  2128. FPMAT1    CALL    OMATCH    ;CHECK IT OUT
  2129.     JZ    FPMAT3    ;WE FOUND IT
  2130.     MOV    A,M    ;DID WE HIT THE END OF THE SEARCH STRING?
  2131.     ANA    A
  2132.     JM    FPMAT2    ;YUP
  2133.     INX    B    ;UPDATE AND TRY AGAIN
  2134.     INX    H
  2135.     JMP    FPMAT1
  2136. FPMAT2    LHLD    PNTR    ;PLACE TO STORE TO
  2137.     XCHG
  2138.     LXI    H,ZERO0    ;WHAT TO STORE
  2139.     INX    D
  2140.     LXI    B,6    ;HOW MANY TO STORE
  2141.     CALL    MOVE
  2142.     JMP    OPR30    ;FINISH IT OFF
  2143. FPMAT3    MOV    L,C    ;BC TO HL
  2144.     MOV    H,B
  2145.     XCHG        ;GET PLACE TO PUT IT
  2146.     LHLD    PNTR
  2147.     INX    H
  2148.     XCHG
  2149.     CALL    BBCD    ;CONVERT TO BCD
  2150.     JMP    OPR30    ;FINISH IT OFF
  2151. TRANS    XCHG        ;GET PLACE TO PUT IT
  2152.     LHLD    FARY
  2153.     DCR    H
  2154.     DCR    H
  2155.     MVI    C,0    ;CLEAR FLAG
  2156.     PUSH    H    ;SAVE ADDRESS
  2157. TRANS1    LDAX    D    ;GET A CHARACTER
  2158.     ANI    7FH    ;STRIP END BIT
  2159.     CPI    '\'    ;IS IT A BACKSLASH?
  2160.     JZ    TRANS4    ;YUP
  2161.     CPI    '?'    ;IS IT A QUESTION MARK?
  2162.     JZ    TRANS5    ;YUP
  2163.     CPI    '!'    ;IS IT AN EXCLAMATION POINT?
  2164.     JZ    TRANS5    ;YUP
  2165.     CPI    '#'    ;IS IT A POUND SIGN?
  2166.     JZ    TRANS5    ;YUP
  2167. TRANS2    MOV    M,A    ;STORE IT
  2168.     MVI    C,0    ;CLEAR SLASH SIGN
  2169.     LDAX    D    ;CHECK FOR ENCOUNTER OF THE END KIND
  2170.     ANA    A
  2171.     JM    TRANS3    ;DONE
  2172.     INX    H    ;UPDATE
  2173.     INX    D
  2174.     JMP    TRANS1    ;DO IT AGAIN
  2175. TRANS3    MOV    A,M    ;SET LAST INDICATOR
  2176.     ORI    80H
  2177.     MOV    M,A
  2178.     POP    H    ;RESTORE ADDRESS
  2179.     RET        ;DONE
  2180. TRANS4    INR    C    ;SET SLASH FLAG
  2181.     LDAX    D    ;CHECK FOR END
  2182.     ANA    A
  2183.     JM    TRANS3
  2184.     INX    D    ;GET NEXT CHARACTER
  2185.     JMP    TRANS1    ;TRY AGAIN
  2186. TRANS5    INR    C    ;CHECK FOR C=0
  2187.     DCR    C
  2188.     JNZ    TRANS2    ;NOPE, SO INSERT THE CHARACTER
  2189.     ANI    0FH    ;TURN INTO CONTROL TYPE
  2190.     JMP    TRANS2    ;STORE IT
  2191. OMATCH    PUSH    H    ;SAVE THE WORLD
  2192.     PUSH    D
  2193.     PUSH    B
  2194. MATCH1    MOV    A,M    ;GET A CHARACTER FROM SEARCH STRING
  2195.     ANI    7FH    ;STRIP IT
  2196.     MOV    B,A    ;TO B
  2197.     LDAX    D    ;GET A CHARACTER FROM PATTERN STRING
  2198.     ANI    7FH    ;STRIP IT
  2199.     CPI    10H    ;IS IT A SPECIAL CHARACTER?
  2200.     JC    MATCH4    ;YUP
  2201. MATCH2    CMP    B    ;A=B?
  2202.     JNZ    MATCH7    ;NOPE
  2203. MATCH3    LDAX    D    ;CHECK FOR END OF PATTERN
  2204.     ANA    A
  2205.     JM    MATCH8    ;FIND
  2206.     MOV    A,M    ;CHECK FOR END OF SEARCH STRING
  2207.     ANA    A
  2208.     JM    MATCH7    ;NO FIND
  2209.     INX    H    ;TRY AGAIN
  2210.     INX    D
  2211.     JMP    MATCH1
  2212. MATCH4    CPI    1    ;IS IT ALPHA FLAG?
  2213.     JZ    MATCH6    ;YUP
  2214.     CPI    3    ;IS IT NUMERIC FLAG?
  2215.     JZ    MATCH5    ;YUP
  2216.     CPI    0FH    ;IS IT ANY CHARACTER?
  2217.     JNZ    MATCH2    ;NO, SO TREAT AS NORMAL CHARACTER
  2218.     JMP    MATCH3    ;ASSUME A MATCH
  2219. MATCH5    MOV    A,B    ;CHECK FOR NUMBER
  2220.     CPI    3AH    ;IS IT TOO BIG?
  2221.     JNC    MATCH7    ;YUP
  2222.     CPI    30H    ;IS IT TOO SMALL?
  2223.     JC    MATCH7    ;YUP
  2224.     JMP    MATCH3    ;IT'S OKAY
  2225. MATCH6    MOV    A,B    ;CHECK FOR ALPHABETIC
  2226.     CPI    7BH    ;IS IT TOO BIG?
  2227.     JNC    MATCH7    ;YUP
  2228.     CPI    61H    ;IS IT LOWER CASE
  2229.     JNC    MATCH3    ;YUP, SO IT'S OKAY
  2230.     CPI    5BH    ;IS IT TOO BIG?
  2231.     JNC    MATCH7    ;YUP
  2232.     CPI    41H    ;IS IT UPPER CASE?
  2233.     JNC    MATCH3    ;YUP, SO IT'S OKAY
  2234. MATCH7    MVI    A,1    ;CLEAR THE ZERO FLAG
  2235.     ANA    A
  2236.     JMP    MATCH9    ;RETURN
  2237. MATCH8    XRA    A    ;SET THE ZERO FLAG
  2238. MATCH9    POP    B    ;RESTORE THE WORLD
  2239.     POP    D
  2240.     POP    H
  2241.     RET        ;DONE.......
  2242. EVPEJ    INX    H    ;GET SYMBOL NUMBER OUT
  2243.     MOV    C,M
  2244.     INX    H
  2245.     MOV    B,M
  2246.     PUSH    H    ;SAVE ADDRESS
  2247.     CALL    DFND    ;CHECK FOR FNXX LABEL
  2248.     CPI    4
  2249.     POP    H    ;RESTORE ADDRESS
  2250.     DCX    H
  2251.     DCX    H
  2252.     JZ    EVPEP    ;IT WAS, SO ONTO THE STACK WITH IT
  2253.     LHLD    FNONE    ;GET FIRST LIST
  2254.     LXI    D,0    ;CLEAR COUNTR
  2255. EVPEM    MOV    A,M    ;GET BYTE
  2256.     CPI    2    ;LABEL?
  2257.     JNZ    SPRAT    ;ERROR
  2258.     INX    H
  2259.     MOV    A,M    ;GET A BYTE
  2260.     INX    H    ;GET ADDRESS OF NEXT ONE
  2261.     CMP    C    ;GOOD SO FAR?
  2262.     JNZ    EVPEK    ;NOPE
  2263.     MOV    A,M    ;GET ANOTHER ONE
  2264.     CMP    B    ;GOOD?
  2265.     JZ    EVPEL    ;YUP
  2266. EVPEK    INX    H    ;GET COMMA
  2267.     INX    H
  2268.     MOV    A,M    ;CHECK IT
  2269.     CPI    0DH
  2270.     JNZ    SPRAT    ;ERROR
  2271.     INX    H
  2272.     INX    D    ;UPDATE COUNT
  2273.     JMP    EVPEM    ;LOOP FOR ANOTHER
  2274. EVPEL    LHLD    FNTWO    ;GET SECOND LIST
  2275. EVPEN    MOV    A,D    ;DE=0?
  2276.     ORA    E
  2277.     JZ    EVPEO    ;YUP, SO WE FOUND IT
  2278.     PUSH    D
  2279.     MOV    A,M    ;GET A BYTE
  2280.     CALL    GTIN    ;GET INCREMENT
  2281.     DAD    D    ;ADD IT
  2282.     MOV    A,M    ;CHECK FOR COMMA
  2283.     CPI    0DH
  2284.     JNZ    SPRAT    ;ERROR
  2285.     INX    H    ;GET NEXT ITEM
  2286.     POP    D    ;UPDATE COUNTER
  2287.     DCX    D
  2288.     JMP    EVPEN    ;LOOP FOR ANOTHER
  2289. EVPEO    CALL    PUSZ    ;PUSH THIS ITEM ON THE STACK
  2290.     JMP    EVPE6    ;PROCESS AS NORMAL
  2291. NSPRC    DW    SPRY
  2292.     DW    SPRX
  2293.     DW    SPRG
  2294.     DW    SPRB
  2295.     DW    SPRB
  2296.     DW    SPRB
  2297.     DW    SPRH
  2298.     DW    SPRF
  2299.     DW    SPRB
  2300.     DW    SPRC
  2301.     DW    SPRL
  2302.     DW    SPRO
  2303.     DW    SPRP
  2304.     DW    SPRA
  2305.     DW    SPRQ
  2306.     DW    SPRR
  2307.     DW    SPRT
  2308.     DW    SANA
  2309.     DW    SPRU
  2310.     DW    SPRV
  2311.     DW    SPRW
  2312.     DW    SPRZ
  2313.     DW    SANB
  2314.     DW    SANC
  2315.     DW    SAND
  2316. OSPRC    DW    SPRN
  2317.     DW    SPRI
  2318.     DW    SPRJ
  2319.     DW    SPRD
  2320.     DW    SPRM
  2321.     DW    SPRE
  2322.     DW    SPRB
  2323.     DW    SPR1
  2324.     DW    SPRN
  2325.     DW    SPRS
  2326. INPTA    LDA    OPFLG    ;SEE IF WE ARE IN AN INPUT INSTRUCTION
  2327.     CPI    0A7H
  2328.     JNZ    ERROR    ;NOPE
  2329.     LDA    CSST    ;CHECK FOR CASSETTE MODE
  2330.     ANA    A
  2331.     JNZ    ERROR    ;YUP
  2332.     POP    H    ;CLEAN UP THE STACK
  2333.     LXI    H,INPTM    ;ERROR MESSAGE
  2334.     CALL    MSGER
  2335.     JMP    SPRF1    ;RETRY INPUT
  2336. INPTM    DB    0DH,'INPUT ERROR',8DH
  2337. RUNG    CALL    MFOS    ;GET NEXT STATEMENT ADDRESS
  2338.     PUSH    H    ;ONTO THE STACK
  2339.     JMP    RUN8    ;CONTINUE
  2340. SP000    PUSH    H    ;SAVE ADDRESS
  2341.     INX    H    ;GET NEXT BYTE
  2342.     MOV    A,M
  2343.     ANA    A    ;SEE IF IT'S A TAB
  2344.     JNZ    SP001    ;NOPE, SO MUST BE A SPC
  2345.     INX    H    ;GET POSITION DESIRED
  2346.     MOV    B,M
  2347.     LDA    POSIT    ;SEE WHERE WE'RE AT NOW
  2348.     DCR    A    
  2349.     CMP    B    ;CHECK FOR SIZE
  2350.     JC    SP002    ;IT'S OKAY
  2351.     PUSH    B    ;SAVE POSIT
  2352.     CALL    CRLF    ;NEXT LINE
  2353.     POP    B    ;RESTORE COUNT
  2354. SP002    LDA    POSIT    ;COMPUTE NUMBER OF SPACES NEEDED
  2355.     SUB    B    ;SUBTRACT
  2356.     CMA
  2357.     INR    A
  2358. SP003    DCR    A    ;CHECK FOR DONENESS
  2359.     JM    SPRA4    ;ALL DONE
  2360.     LXI    H,BLANK    ;SEND OUT A SPACE
  2361.     PUSH    PSW    ;SAVE COUNT
  2362.     CALL    LNOT
  2363.     POP    PSW    ;RESTORE COUNT
  2364.     JMP    SP003    ;TRY FOR ANOTHER ONE
  2365. SP001    INX    H    ;GET NUMBER OF SPACES OUT
  2366.     MOV    A,M
  2367.     JMP    SP003    ;PUT 'EM OUT
  2368. BLANK    DB    0A0H
  2369. * RTN. E.70
  2370. * DIMENSION AND LET STATEMENT DUMMY
  2371. SPRB    RET        ;DONE
  2372. * RTN. E.71
  2373. * END PROCESSOR
  2374. SPRC    XRA    A    ;CLEAR RUN FLAG
  2375.     STA    RUNF
  2376.     LHLD    LINE
  2377.     SHLD    LINEA
  2378.     JMP    RSTRT    ;TO EXEC
  2379. * RTN. E.72
  2380. * GOTO PROCESSOR
  2381. SPRD    LHLD    LINE    ;GET CURRENT LOCATION
  2382.     INX    H    ;GET LABEL NUMBER OUT
  2383.     INX    H
  2384.     MOV    C,M
  2385.     INX    H
  2386.     MOV    B,M
  2387.     PUSH    B    ;ONTO THE STACK
  2388.     INX    H    ;CHECK FOR A OFFSET
  2389.     INX    H
  2390.     XCHG        ;TO DE
  2391.     LHLD    ESRC    ;CHECK FOR END OF SOURCE COLLISION
  2392.     XCHG
  2393.     CALL    CMP16
  2394.     LXI    D,0    ;SET OFFSET TO ZERO
  2395.     JZ    SPRD2    ;YUP, SO NO OFFSET
  2396.     MOV    A,M
  2397.     CPI    8    ;EIGHT IF IT IS
  2398.     JNZ    SPRD2    ;NO OFFSET
  2399.     INX    H    ;GET BEGINNING OF EXPRESSION
  2400.     CALL    EVPE    ;EVALUATE THE EXPRESSION
  2401.     CALL    SPRD1    ;GET BINARY OFFSET
  2402. SPRD2    POP    B    ;GET BACK SYMBOL NUMBER
  2403.     CALL    LILO    ;FIND ADDRESS
  2404.     XCHG        ;SWAP 'EM
  2405.     POP    H    ;RETURN ADDRESS TO HL
  2406.     PUSH    D    ;NEW PROGRAM ADDRESS TO THE STACK
  2407.     PCHL        ;RETURN
  2408. SPRD1    SHLD    PNTR    ;RESET PNTR
  2409.     CALL    FNOPO    ;GET OPERAND
  2410.     MVI    B,26H    ;ERROR CODE JUST IN CASE
  2411.     JC    ERROR    ;CAN'T HAVE A STRING FOR AN OFFSET
  2412.     MOV    A,M    ;GET SIGNS BYTE
  2413.     ANA    A
  2414.     PUSH    PSW    ;SAVE IT
  2415.     CALL    BCDB    ;CONVERT IT TO BINARY
  2416.     POP    PSW    ;GET SIGN BACK
  2417.     XCHG        ;TO DE
  2418.     RP        ;RETURN IF NO INVERSION REQUIRED
  2419.     DCX    D
  2420.     RET        ;DONE.......
  2421. * RTN. E.73
  2422. * IF PROCESSOR
  2423. SPRE    LHLD    LINE    ;GET CURRENT LINE
  2424.     INX    H    ;GET EXPRESSION ADDRESS
  2425.     CALL    EVPE    ;EVALUATE IT
  2426.     CALL    FNOPO    ;GET EVALUATED VALUE
  2427.     MVI    B,40H    ;ERROR CODE JUST IN CASE
  2428.     JC    ERROR    ;SOMETHING'S WRONG WITH A STRING RESULT!
  2429.     CALL    BCDB    ;CONVERT TO BINARY
  2430.     LXI    D,0FFFFH    ;SEE IF IT'S A -ONE
  2431.     CALL    CMP16
  2432.     JZ    SPRE1    ;SURE WAS
  2433.     MOV    A,H    ;SEE IF IT'S A ZERO
  2434.     ORA    L
  2435.     MVI    B,40H    ;ERROR CODE JUST IN CASE
  2436.     JNZ    ERROR    ;NOT A LOGICAL EXPRESSION
  2437. SPRE2    CALL    MFOS    ;MOVE UP ONE
  2438.     CALL    MFOS    ;AND AGAIN
  2439.     MOV    A,M    ;CHECK FOR COLON OR BACKSLASH
  2440.     CPI    9DH
  2441.     JZ    SPRE2    ;YUP
  2442.     CPI    9EH    
  2443.     JZ    SPRE2
  2444.     CPI    9CH    ;IS IT A TAB?
  2445.     JZ    SPRE2+3    ;YUP
  2446.     CPI    9BH    ;IS IT AN ELSE?
  2447.     JNZ    SPRE21    ;NOPE
  2448.     CALL    MFOS    ;MOVE UP ANOTHER ONE
  2449. SPRE21    XTHL        ;SET UP THE STACK
  2450.     PCHL        ;RETURN
  2451. SPRE1    CALL    MFOS    ;MOVE UP ONE
  2452.     XTHL        ;SET UP THE STACK
  2453.     PCHL
  2454. * RTN. E.74
  2455. * INPUT PROCESSOR
  2456. SPRF    MVI    A,0    ;SET KEYBOARD MODE
  2457.     STA    CATV
  2458.     STA    CSST
  2459. SPRFZ    MVI    B,10H    ;IN CASE OF ERROR
  2460.     JNC    ERROR    ;NO EXPRESSION FOLLOWING
  2461.     XCHG        ;SWAP
  2462.     SHLD    TMP1    ;SAVE EXPRESSION START
  2463.     LHLD    PNTR    ;PRESET NN
  2464.     SHLD    TMP2
  2465.     XRA    A    ;CLEAR PROMPT FLAG
  2466.     STA    STFLG
  2467. SPRF1    LHLD    TMP1    ;INITIALIZE
  2468.     SHLD    FLST
  2469.     LHLD    TMP2
  2470.     SHLD    PNTR
  2471.     SHLD    LLST
  2472. SPRF2    LHLD    FLST    ;GET CURRENT TOKEN
  2473.     MOV    A,M
  2474.     ANA    A    ;CHECK FOR LITERAL
  2475.     JZ    SPRF6    ;IT WAS
  2476.     CPI    0DH    ;CHECK FOR COMMA
  2477.     JZ    SPRF7    ;IT WAS
  2478.     CPI    0EH    ;IS IT A ";"?
  2479.     JZ    SPRF7    ;YUP
  2480.     CPI    09H    ;CHECK FOR END CODE
  2481.     JZ    SPRFF    ;IT WAS, AND WE'RE DONE
  2482.     CPI    2    ;CHECK FOR A LABEL
  2483.     JZ    SPRFP    ;YUP
  2484. SPRFL    LHLD    LLST    ;SEE IF ANY INPUT IS AVAILABLE
  2485.     XCHG
  2486.     LHLD    PNTR
  2487.     CALL    CMP16
  2488.     JNZ    SPRF5    ;SURE IS
  2489.     LDA    STFLG    ;GET PROMPT FLAG
  2490.     ANA    A    ;IS IT SET?
  2491.     JNZ    SPRF8    ;YUP
  2492.     LDA    BFLAG    ;BINARY MODE?
  2493.     ANA    A
  2494.     JNZ    SPRF8    ;YUP
  2495. SPRFQ    LXI    H,SPRFM    ;NO, SO SEND A ?
  2496.     LDA    CSST    ;CHECK FOR CASSETTE MODE
  2497.     ANA    A
  2498.     JNZ    SPRF8    ;SURE IS, SO NO PROMPT
  2499.     CALL    MSGER
  2500. SPRF8    LHLD    PNTR    ;INPUT A LINE
  2501.     LDA    BFLAG    ;CHECK FOR BINARY MODE
  2502.     ANA    A
  2503.     JNZ    SPRFBIN    ;SURE IS
  2504.     LXI    D,100
  2505.     DAD    D
  2506.     SHLD    TMP11+2
  2507.     PUSH    H    ;SAVE ADDRESS
  2508.     CALL    LIIN    ;INPUT FROM KEYBOARD
  2509.     POP    H
  2510.     JC    SPF10
  2511. SPF20    XRA    A    ;CLEAR STFLG
  2512.     STA    STFLG
  2513. SPRF3    PUSH    H    ;SAVE THE ADDRESS
  2514.     XCHG
  2515.     LHLD    PNTR
  2516.     INX    H
  2517.     XCHG
  2518.     CALL    STNM    ;TRY TO CONVERT IT
  2519.     JC    SPRF4    ;NO GOOD
  2520. SP99A    XTHL        ;NEW ADDRESS TO STACK
  2521.     CALL    OPR30    ;COMPLETE NUMBER BLOCK
  2522.     POP    H    ;GET ADDRESS BACK
  2523.     DCX    H    ;CHECK FOR END OF LINE
  2524.     MOV    A,M
  2525.     ANA    A
  2526.     JM    SPRF2    ;IT WAS
  2527.     INX    H    ;CHECK FOR COMMA SEPARATOR
  2528.     MOV    A,M
  2529.     CPI    ','
  2530.     INX    H    ;GET NEXT ADDRESS
  2531.     JZ    SPRF3    ;IT WAS
  2532.     JMP    SPRF2    ;IGNORE EXTRA INPUT
  2533. SPRF4    POP    H    ;GET BACK ADDRESS
  2534.     CALL    COUNT    ;HOW MANY CHARACTERS?
  2535.     MOV    C,E    ;TO BC
  2536.     MOV    B,D
  2537.     XCHG        ;TO DE
  2538.     LHLD    PNTR    ;STORE THE THING
  2539.     MVI    M,0    ;STRING INDICATOR
  2540.     INX    H
  2541.     XCHG        ;BACK TO HL
  2542.     CALL    MOVE    ;MOVE IT DOWN
  2543.     XCHG        ;BACK TO HL
  2544.     DAD    B
  2545.     MVI    M,1    ;END OF STRING CODE
  2546.     INX    H
  2547.     SHLD    PNTR    ;UPDATE PNTR
  2548.     JMP    SPRF2    ;BACK TO SCANNER
  2549. SPRFBIN    PUSH    H    ;SAVE ADDRESS
  2550.     CALL    OBINPOR    ;GET A BYTE
  2551.     ANA    A    ;IS IT A STRING?
  2552.     POP    H    ;RESTORE ADDRESS
  2553.     JZ    SPRFBA    ;YUP
  2554.     MVI    M,4    ;STORE NUMBER BLOCK
  2555.     INX    H    ;NEXT ADDRESS
  2556.     MOV    M,A    ;STORE THE FIRST BYTE OF NUMBER
  2557.     MVI    B,5    ;BYTES LEFT
  2558.     INX    H    ;FIRST ADDRESS FOR THAT
  2559. SPRFBB1    PUSH    H    ;SAVE
  2560.     PUSH    B
  2561.     CALL    OBINPOR    ;GET A BYTE
  2562.     POP    B
  2563.     POP    H
  2564.     MOV    M,A    ;STORE IT
  2565.     INX    H
  2566.     DCR    B    ;DONE?
  2567.     JNZ    SPRFBB1    ;NOPE
  2568.     MVI    M,05H    ;YUP{
  2569.     INX    H
  2570.     SHLD    PNTR    ;UPDATE STACK
  2571.     JMP    SPRF2    ;CONTINUE
  2572. SPRFBA    MOV    M,A    ;STORE THE BYTE
  2573.     INX    H    ;UPDATE THE INDEX
  2574. SPRFBA1    PUSH    H    ;SAVE ADDRESS
  2575.     CALL    OBINPOR    ;GET ANOTHER BYTE
  2576.     POP    H    ;RESTORE ADDRESS
  2577.     MOV    M,A    ;STORE IT
  2578.     INX    H    ;UPDATE
  2579.     ANA    A    ;END?
  2580.     JP    SPRFBA1    ;NOPE
  2581.     MVI    M,01    ;END
  2582.     INX    H
  2583.     SHLD    PNTR
  2584.     JMP    SPRF2    ;CONTINUE
  2585. SPRF5    LHLD    FLST    ;PUSH RECEIVING VARIABLE
  2586.     CALL    PUSZ
  2587.     MOV    A,M    ;GET INCREMENT
  2588.     CALL    GTIN
  2589.     DAD    D    ;ADD IT
  2590.     SHLD    FLST    ;UPDATE
  2591.     LHLD    LLST    ;PUSH CONSTANT
  2592.     CALL    PUSZ
  2593.     MOV    A,M    ;GET INCREMENT
  2594.     CALL    GTIN
  2595.     DAD    D
  2596.     SHLD    LLST    ;UPDATE
  2597.     CALL    OPRQ    ;ASSIGN
  2598.     JMP    SPRF2    ;TO SCANNER
  2599. SPRF6    INX    H    ;PRINT LITERAL
  2600.     LDA    CSST    ;CHECK FOR CASSETTE MODE
  2601.     ANA    A
  2602.     JNZ    SPRF7    ;YUP, SO SKIPTHE PROMPT
  2603.     CALL    MSGER
  2604.     MVI    A,0FFH    ;SET THE PROMPT FLAG
  2605.     STA    STFLG
  2606. SPRF7    LHLD    FLST    ;UPDATE FLST
  2607.     MOV    A,M
  2608.     CALL    GTIN
  2609.     DAD    D
  2610.     SHLD    FLST
  2611.     JMP    SPRF2    ;BACK TO THE SCANNER
  2612. SPRFM    DB    '?'+80H
  2613. LINK5    LINK    B:TBASICA6
  2614.