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 / CPMUG032.ARK / TBASICA3.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  53KB  |  2,274 lines

  1. * RTN. C.3
  2. * KEYBOARD INPUT
  3. * OUT: A = ASCII CODE FOR CHARACTER INPUTTED
  4. * USERS ROUTINE HAS RESPONSIBILITY FOR PROVIDING LOWER
  5. * TO UPPER CASE CONVERSION, AND MAKING RUBOUT A
  6. * 7F, HEXADECIMAL.  THE PARITY BIT WILL BE RESET (ZERO)
  7. KYIN    ORI    1    ;CLEAR THE ZERO FLAG
  8.     JMP    CONT1    ;USE CONTROL C ROUTINE
  9. * RTN. C.4
  10. * OUTPUT TO TERMINAL(S)
  11. * IN: A = ASCII CODE FOR CHARACTER TO BE SENT
  12. * THIS ROUTINE FINDS EACH CHANNEL THAT IS IN TERMINAL MODE,
  13. * SENDS THE CHARACTER, AND UPDATES THE POSITION FLAGS.
  14. * IF A LINE WILL BE OVERRUN, A CARRIAGE RETURN
  15. * WILL BE INSERTED.  IF A RUBOUT CHARACTER IS DETECTED,
  16. * TWO ACTIONS ARE POSSIBLE.  ONE, IF THE RUBOUT FLAG
  17. * IS ZERO, A '@' WILL BE SENT. TWO, IF THE RUBOUT
  18. * FLAG IS NONZERO, THE RUBOUT WILL BE SENT AND
  19. * IT IS ASSUMED THAT THE TERMINAL WILL BACKSPACE
  20. * AND ERASE THE LAST CHARACTER
  21. TOUT    LXI    B,1    ;GET CHANNEL ONE FOR STARTERS
  22.     CALL    EDIT1    ;CHECK FOR MEMORY STORE TIME
  23. TOUTTAB1    PUSH    PSW    ;SAVE CHARACTER
  24.     CPI    0DH    ;CARRIAGE RETURN?
  25.     JZ    TOUTZ    ;YUP
  26.     CPI    7FH    ;RUBOUT?
  27.     JZ    TOUTY    ;YUP
  28.     CPI    09H    ;IS IT A TAB?
  29.     JZ    TOUTTAB    ;YUP
  30.     LDA    POSIT    ;GET HEAD POSITION
  31.     INR    A    ;UPDATE
  32.     STA    POSIT
  33. TOUTX    POP    PSW    ;RESTORE CHARACTER
  34. TOUT1    PUSH    PSW    ;SAVE THE CHARACTER
  35.     MVI    A,2    ;GET TERMINAL MODE CODE
  36.     CALL    MFND    ;FIND A TERMINAL CHANNEL
  37.     JNZ    TOUT2    ;OH, OH, NO MORE TERMINALS
  38.     POP    PSW    ;GET THE CHARACTER BACK
  39.     PUSH    B    ;SAVE THE NEXT CHANNEL
  40.     PUSH    PSW    ;SAVE THE CHARACTER
  41.     XCHG        ;PUT PARAMETERS ADDRESS IN HL
  42.     CPI    7FH    ;IS IT A RUBOUT?
  43.     JZ    TOUT3    ;SURE IS
  44.     CPI    0DH    ;IS IT A CARRIAGE RETURN?
  45.     JZ    TOUT4    ;YUP
  46.     INX    H    ;GET ADDRESS OF POSITION FLAG
  47. TOUT9    INR    M    ;UPDATE POSITION FLAG
  48.     DCX    H    ;GET ADDRESS OF WIDTH FLAG
  49.     MOV    A,M    ;GET IT
  50.     INX    H    ;GET ADDRESS OF POSITION FLAG AGAIN
  51.     CMP    M    ;COMPARE
  52.     JNC    TOUTB    ;AH, NO OVERRUN
  53.     MVI    M,0
  54.     MVI    A,0DH    ;GET A CARRIAGE RETURN CODE
  55.     LXI    B,TOUTRET    ;SET UP RETURN ADDRESS
  56.     PUSH    B
  57.     XCHG        ;PUT CHANNEL ADDRESS BACK IN HL
  58.     ANA    A
  59.     PCHL        ;SEND THE CR
  60. TOUTRET    MVI    A,0AH    ;SEND THE LF
  61.     ANA    A
  62.     LXI    B,TOUT6    ;PUSH THE RETURN ADDRESS
  63.     PUSH    B
  64.     PCHL        ;DO IT TO IT
  65. TOUTTAB    POP    PSW
  66. TOUTTAB2    MVI    A,20H    ;SEND A SPACE
  67.     LXI    B,1
  68.     CALL    TOUTTAB1
  69.     LDA    POSIT    ;CHECK IT
  70.     ANI    7
  71.     RZ        ;DONE
  72.     JMP    TOUTTAB2
  73. TOUT6    XCHG        ;PUT CHANNEL ADDRESS IN DE
  74.     MVI    M,1    ;SET POSITION TO 1
  75. TOUTB    POP    PSW    ;GET CHARACTER BACK
  76.     PUSH    PSW    ;SAVE THE THING AGAIN
  77. TOUT5    LXI    B,TOUT7    ;SET UP RETURN ADDRESS
  78.     PUSH    B
  79.     XCHG        ;PUT CHANNEL ADDRESS BACK IN HL
  80.     ANA    A
  81.     PCHL        ;SEND THE CHARACTER
  82. TOUT7    POP    PSW    ;GET THE CHARACTER BACK
  83.     POP    B    ;GET THE NEXT CHANNEL ADDRESS
  84.     JMP    TOUT1    ;LOOP FOR ANOTHER TERMINAL
  85. TOUT2    POP    PSW    ;CLEAN UP THE STACK
  86.     CPI    0DH    ;WAS THIS A CR?
  87.     RNZ        ;NOPE
  88.     MVI    A,0AH    ;SEND A LF TOO
  89.     LXI    B,1
  90.     JMP    TOUTTAB1    ;DO IT
  91. TOUT3    INX    H    ;GET RUBOUT FLAG
  92.     INX    H
  93.     MOV    A,M
  94.     DCX    H    ;GET ADDRESS OF POSITION FLAG
  95.     ANA    A    ;SET FLAGS
  96.     JNZ    TOUT8    ;A REAL RUBOUT!!
  97.     POP    PSW    ;GET A BACK
  98.     MVI    A,'@'    ;SEND A FAKE RUBOUT
  99.     PUSH    PSW    ;SAVE IT AGAIN
  100.     JMP    TOUT9
  101. TOUT8    DCR    M    ;UPDATE THE POSITION
  102.     MVI    A,7FH    ;GET A RUBOUT CODE
  103.     JP    TOUT5    ;SEND IT
  104.     DCX    H    ;GET THE WIDTH FLAG ADDRESS
  105.     MOV    A,M    ;GET IT
  106.     INX    H    ;GET THE POSITION FLAG ADDRESS
  107.     MOV    M,A    ;STORE IT
  108.     MVI    A,7FH    ;GET A RUBOUT CODE
  109.     JMP    TOUT5    ;SEND IT
  110. TOUT4    INX    H    ;GET POSITION ADDRESS
  111.     MVI    M,0    ;CLEAR IT
  112.     JMP    TOUT5    ;SEND THE CARRIAGE RETURN
  113. * RTN. C.6
  114. * CASSETTE OUTPUT BYTE
  115. * CARRY AND ZERO FLAGS SET UP AS IN CAIN
  116. * IN: A = BYTE TO WRITE
  117. COUT    PUSH    PSW
  118.     CPI    0DH    ;IS IT A CR?
  119.     JZ    COUTCR    ;YUP
  120. COUTA    MVI    A,8
  121.     LXI    B,1    ;START WITH CHANNEL 1
  122.     CALL    MFND    ;FIND THE CASSETTE CHANNEL
  123.     JNZ    COUTBA    ;NONE FOUND
  124.     POP    PSW    ;GET FLAGS BACK
  125.     PCHL        ;GO GET IT
  126. COUTCR    POP    PSW
  127.     LXI    B,COUTCR1
  128.     PUSH    B
  129.     PUSH    PSW
  130.     JMP    COUTA
  131. COUTCR1    MVI    A,0AH
  132.     JMP    COUT
  133. COUTBA    POP    PSW
  134.     RET        ;DONE
  135. * BINARY PORT ROUTINES
  136. * BINARY PORT OUTPUT
  137. BPORT    PUSH    PSW    ;SAVE BYTE AND FLAGS
  138.     LXI    B,1    ;START WITH CHANNEL ONE
  139. BPORT1    MVI    A,20H    ;BIT FOR BINARY OUTPUT PORT
  140.     CALL    MFND    ;LOOK FOR IT
  141.     JNZ    BPORT2    ;NOT FOUND
  142.     POP    PSW    ;GET BYTE AND SET FLAGS
  143.     PUSH    PSW    ;SAVE 'EM AGAIN
  144.     PUSH    B    ;SAVE CHANNEL COUNT
  145.     LXI    B,BPORT3    ;STUFF THE RETURN ADDRESS
  146.     PUSH    B
  147.     PCHL        ;GO TO THE PORT ROUTINE
  148. BPORT3    POP    B    ;RESTORE
  149.     JMP    BPORT1    ;TRY FOR ANOTHER ONE
  150. BPORT2    POP    PSW    ;RESTORE STACK
  151.     RET        ;DONE
  152. * BINARY INPUT PORT
  153. BINPOR    LXI    B,1    ;START WITH CHANNEL ONE
  154.     PUSH    PSW    ;SAVE 'EM
  155.     MVI    A,10H    ;INPUT PORT BIT
  156.     CALL    MFND    ;LOOK FOR IT
  157.     JNZ    SPRAT    ;NONE FOUND
  158.     POP    PSW    ;GOT IT
  159.     LXI    B,BINPOR1    ;STUFF A RETURN ADDRESS
  160.     PUSH    B
  161.     PCHL        ;DO IT
  162. BINPOR1    MVI    B,23H    ;TAPE READ ERROR?
  163.     JC    ERROR    ;YUP
  164.     RET        ;NOPE, ALL'S OK
  165. OBPORT    PUSH    B    ;SAVE IT
  166.     MOV    B,A
  167.     MVI    A,1
  168.     ANA    A
  169.     MOV    A,B    ;BACK
  170.     POP    B
  171.     JMP    BPORT
  172. OBINPOR    MVI    A,1
  173.     ANA    A
  174.     JMP    BINPOR
  175. * IN: CATV = 0 FOR TV, <> 0 FOR CASSETTE
  176. *  HL = ADDRESS OF FIRST CHARACTER IN LINE
  177. *  LAST CHARACTER IN LINE HAS BIT 7 SET
  178. LNOT    LDA    CATV    ;GET TV/CASSETTE FLAG
  179.     MOV    B,A    ;STICK IT IN B
  180.     MOV    A,M    ;GET THE CHARACTER TO A
  181.     ANA    A    ;SET FLAGS
  182.     PUSH    PSW    ;SAVE FLAGS
  183.     ANI    7FH    ;STRIP UPPER BIT
  184.     MOV    D,A    ;SAVE THE CHARACTER
  185.     POP    PSW    ;RESTORE FLAGS
  186.     MOV    A,D    ;PUT THE CHARACTER BACK
  187.     PUSH    H    ;SAVE ADDRESS
  188.     PUSH    PSW    ;SAVE CHARACTER AND THE FLAGS
  189.     INR    B    ;CHECK FOR B=0
  190.     DCR    B
  191.     JNZ    LNOT2    ;CASSETTE MODE
  192.     POP    PSW    ;GET CHARACTER BACK
  193.     PUSH    PSW    ;SAVE IT AGAIN
  194.     CALL    TOUT    ;OUTPUT TO TERMINAL(S)
  195. LNOT3    POP    PSW    ;GET FLAGS BACK
  196.     POP    H    ;GET ADDRESS BACK
  197.     INX    H    ;UPDATE INDEX
  198.     RM        ;ALL DONE.....
  199.     ORI    1    ;CLEAR THE ZERO FLAG
  200.     JMP    LNOT    ;LOOP FOR ANOTHER CHARACTER
  201. LNOT2    POP    PSW    ;GET THE CHARACTER BACK
  202.     PUSH    PSW    ;SAVE IT AGAIN
  203.     CALL    COUT    ;SEND IT TO THE CASSETTE(S)
  204.     JMP    LNOT3    ;RESUME NORMAL SEQUENCE
  205. * RTN. C.8
  206. * LINE OUTPUT FOR TERMINALS
  207. * IN: HL = FIRST ADDRESS OF STRING
  208. * LAST CHARACTER IN STRING HAS BIT 7 SET
  209. MSGER    XRA    A    ;CLEAR CATV
  210.     STA    CATV
  211.     JMP    LNOT    ;OUTPUT LINE
  212. * RTN. C.9
  213. * LINE OUTPUT FOR CASSETTE
  214. * IN: HL = FIRST ADDRESS OF STRING
  215. * LAST CHARACTER IN STRING HS BIT 7 SET
  216. * OUT: CARRY SET IF NO CHARACTERS WERE INPUT
  217. CLIN    MVI    A,0FFH    ;SET CATV NONZERO
  218.     STA    CATV
  219.     JMP    LNOT    ;OUTPUT LINE
  220. * RTN. C.9
  221. * LINE INPUT FOR CASSETTE AND KEYBOARD
  222. * IN: HL = FIRST ADDRESS TO STORE STRING
  223. LIIN    LXI    D,0    ;NUMBER OF CHARACTERS TO 0
  224.     MVI    A,1
  225.     ANA    A
  226. LIIN1    PUSH    D    ;SAVE IT
  227.     PUSH    H    ;SAVE ADDRESS
  228.     PUSH    PSW    ;SAVE FLAGS
  229.     MOV    C,A    ;SAVE IN C
  230.     LDA    CATV    ;SEE IF THIS IS FOR CASSETTE
  231.     ANA    A    ;SET FLAGS
  232.     JNZ    LIIN2    ;SURE IS
  233.     POP    PSW    ;RESTORE FLAGS
  234.     CALL    KYIN    ;GET A CHARACTER FROM KEYBOARD
  235. LIIN3    CPI    7FH    ;CHECK FOR A RUBOUT
  236.     POP    H    ;RESTORE ADDRESS
  237.     POP    D    ;RESTORE NUMBER OF CHARACTERS
  238.     JZ    LIIN4    ;IT WAS
  239.     CPI    1    ;CHECK FOR FLAG CODE
  240.     JZ    LIZZZ    ;SURE WAS
  241.     CPI    3    ;CHECK FOR CONTROL C PUSHED
  242.     JZ    RUN2    ;YUP, SO TERMINATE ANY RUN MODE
  243.     CPI    0DH    ;CHECK FOR A CARRIAGE RETURN
  244.     JZ    LIIN5    ;IT WAS
  245.     CPI    15H    ;CHECK FOR CONTROL U
  246.     JZ    LII00    ;SURE WAS
  247.     CPI    9    ;CHECK FOR TAB
  248.     JZ    LIZZZ    ;SURE IS
  249.     CPI    20H    ;CHECK FOR OTHER CONTROL CHARACTERS
  250.     JC    LII20    ;SURE IS
  251. LIZZZ    MOV    M,A    ;STORE THE CHARACTER
  252.     INX    H    ;UPDATE THE INDEX
  253.     INX    D    ;UPDATE NUMBER OF CHARACTERS
  254.     LDA    CATV    ;CHECK FOR CASSETTE MODE
  255.     ANA    A    ;SET FLAGS
  256.     JNZ    LIIN6    ;IT IS 
  257.     DCX    H    ;GET CHARACTER ADDRESS
  258.     MOV    A,M    ;GET CHARACTER
  259.     INX    H    ;BUMP INDEX UP
  260.     PUSH    D
  261.     PUSH    H    ;SAVE ADDRESS
  262. LIIN7    CALL    TOUT    ;ECHO IT
  263.     POP    H    ;RESTORE ADDRESS
  264.     POP    D
  265. LIIN6    ORI    1    ;CLEAR CARRY AND ZERO FLAGS
  266.     JMP    LIIN1    ;LOOP FOR MORE CHARACTERS
  267. LIIN2    POP    PSW    ;RESTORE FLAGS
  268.     CALL    CAIN    ;GET A CHARACTER FROM THE CASSETTE
  269.     JMP    LIIN3    ;CONTINUE PROCESSING
  270. LIIN4    DCX    H    ;BACK UP ONE
  271.     DCX    D    ;DECREMENT NUMBER OF CHARACTERS
  272.     JMP    LIIN7-2    ;SENT THE RUBOUT CODE
  273. LIIN5    DCX    H    ;BACK UP TO MARK THE LAST CHARACTER
  274.     MOV    A,D    ;CHECK FOR NO INPUT
  275.     ORA    E
  276.     JNZ    LIINW    ;THERE IS SOME INPUT
  277.     STC
  278.     RC        ;RETURN IF NO CHARACTERS WERE INPUT
  279. LIINW    MOV    A,M    ;GET THE LAST CHARACTER
  280.     CPI    5CH    ;CHECK FOR A BACKSLASH
  281.     JZ    LII68    ;SURE WAS
  282.     ORI    80H    ;SET THE UPPER BIT
  283.     MOV    M,A    ;STUFF IT BACK
  284.     INX    H    ;GET NEXT POSITION
  285.     MVI    M,0    ;CLEAR IT
  286.     LDA    CATV    ;CHECK FOR CASSETTE MODE
  287.     ANA    A    ;SET FLAGS
  288.     RNZ    
  289.     CALL    CRLF    ;SEND A CARRIAGE RETURN
  290.     XRA    A    ;CLEAR CARRY
  291.     RET        ;DONE...
  292. LII00    MOV    A,D    ;CHECK FOR BEING AT FIRST CHARACTER
  293.     ORA    E
  294.     JZ    LIIN6    ;SURE WAS
  295.     MVI    A,7FH    ;SEND THE RUBOUT
  296.     PUSH    H    ;SAVE IT ALL
  297.     PUSH    D
  298.     CALL    TOUT
  299.     POP    D    ;RESTORE
  300.     POP    H
  301.     DCX    D    ;UPDATE COUNT
  302.     DCX    H
  303.     JMP    LII00    ;DO IT AGAIN
  304. * RTN. C.11
  305. * SEND CARRIAGE RETURN 
  306. CRLF    MVI    A,0DH    ;GET CARRIAGE RETURN CODE
  307.     CALL    TOUT    ;SEND IT
  308.     RET        ;DONE....
  309. * RTN. C.12
  310. * INITIALIZE I/O SECTION
  311. INIO    CALL    CRLF    ;INITIALIZE ALL POSITIONS
  312.     XRA    A    ;SET CARRY, CLEAR ZERO
  313.     SUI    1
  314.     CALL    CAIN    ;SHUT OFF ANY CASSETTE INPUT
  315.     XRA    A    ;SET CARRY, CLEAR ZER
  316.     SUI    1
  317.     CALL    COUT    ;SHUT OFF ANY CASSETTE OUTPUT
  318.     XRA    A    ;INITIALIZE THE BINARY PORTS
  319.     SUI    1
  320.     CALL    BPORT
  321.     XRA    A
  322.     SUI    1
  323.     CALL    BINPOR
  324.     RET        ;DONE.
  325. * RTN. C.13
  326. * LINE INPUT FROM KEYBOARD
  327. * IN: HL=FIRST ADDRESS TO STORE CODE
  328. * OUT: CARRY SET IF NO CHARACTERS INPUTTED
  329. LIKY    XRA    A    ;CLEAR CATV
  330.     STA    CATV
  331.     JMP    LIIN    ;DO IT
  332. * RTN. C.14
  333. * LINE INPUT FROM CASSETTE
  334. * IN: HL= FIRST ADDRESS TO STORE CODE
  335. * OUT: CARRY SET IF NO CHARACTERS INPUTTED
  336. LICA    MVI    A,0FFH    ;SET CATV
  337.     STA    CATV
  338.     JMP    LIIN    ;DO IT
  339. SMST    DW    0
  340. SMEN    DW    0
  341. * RTN. C.5
  342. * CASSETTE INPUT BYTE
  343. * CARRY AND ZERO FLAGS MUST BE PROPERLY SET UP
  344. * CARRY FOR LAST BYTE
  345. * ZERO FOR FIRST BYTE
  346. CAIN    PUSH    PSW    ;SAVE FLAGS
  347.     MVI    A,4    ;CODE FOR CASSETTE INPUT
  348.     LXI    B,1    ;CHANNEL TO START SEARCHING AT
  349.     CALL    MFND    ;FIND THE CASSETTE CHANNEL
  350.     POP    PSW    ;FLAGS BACK
  351.     CALL    CAIN2    ;GET A BYTE
  352.     MVI    B,23H    ;ERROR CODE JUST IN CASE
  353.     JC    ERROR    ;TAPE ERROR
  354.     RET        ;DONE...
  355. CAIN2    PCHL
  356. TOUTZ    XRA    A    ;CLEAR POSIT
  357.     STA    POSIT
  358.     JMP    TOUTX
  359. TOUTY    LDA    POSIT    ;DECREMENT POSIT
  360.     DCR    A
  361.     STA    POSIT
  362.     JMP    TOUTX
  363. LII20    MVI    A,1    ;CLEAR FLAGS
  364.     ANA    A
  365.     JMP    LIIN1    ;GET ANOTHER INPUT
  366. LII68    MVI    A,0DH    ;GET CR CODE BACK
  367.     INX    H    ;UPDATE THE INDEX
  368.     JMP    LIIN7-2    ;ECHO IT AND GET ANOTHER
  369. * MODS MODULE
  370. * RTN. M.1
  371. * EDIT COMMAND EXECUTIVE
  372. EDIT    LHLD    FSRC    ;INITILIZE EDITED LINE POINTER
  373.     SHLD    EDLNP
  374.     XRA    A    ;SET ENTER MODE
  375.     STA    CMND
  376.     CALL    GLFC    ;LOOK FOR PARAMETER
  377.     JC    SPRAT    ;NO PARAMETER
  378.     XCHG        ;OFFSET TO HL
  379.     SHLD    EDITO    ;SAVE IT
  380.     MOV    H,B    ;BC TO HL
  381.     MOV    L,C
  382.     SHLD    EDITS    ;SAVE THE SYMBOL NUMBER
  383. EDITJ    LHLD    EDITS    ;GET THE SYMBOL NUMBER
  384.     MOV    C,L    ;TO BC
  385.     MOV    B,H
  386.     LHLD    EDITO    ;GET THE OFFSET
  387.     XCHG        ;TO DE
  388.     CALL    LILO    ;FIND THE LINE
  389.     SHLD    EDLNP    ;GET THE POINTER
  390. EDITA    LHLD    ESRC
  391.     LXI    D,300
  392.     DAD    D
  393.     MVI    M,80H    ;STORE FAKEOUT FLAGS
  394.     INX    H
  395.     MVI    M,80H
  396.     INX    H
  397.     SHLD    DMPMM    ;STORE DUMP TO MEMORY FLAG
  398.     LHLD    EDLNP    ;EDITED LINE POINTER
  399.     CALL    DMST    ;DUMP THE STATEMENT OUT
  400.     LHLD    DMPMM    ;SET THE LAST BIT
  401.     DCX    H
  402.     MOV    A,M
  403.     ORI    80H
  404.     MOV    M,A
  405.     LXI    H,0    ;CLEAR THE DUMP MEMORY FLAG
  406.     SHLD    DMPMM
  407. EDITH    LHLD    ESRC    ;SET EDITING FLAGS
  408.     LXI    D,302
  409.     DAD    D
  410.     SHLD    LLST
  411.     SHLD    FLST
  412.     SHLD    TMP9
  413. EDITD    LXI    H,0    ;INPUT A COMMAND
  414.     SHLD    TMP1    ;N=0
  415. EDITB    CALL    KYIN    ;GET A CHARACTER
  416.     CPI    7FH    ;IS IT A RUBOUT??
  417.     JZ    EDITD    ;YUP, SO START OVER ON THE COMMAND
  418.     CPI    3AH    ;IS IT A DIGIT
  419.     JNC    EDITC    ;NOPE
  420.     CPI    30H    ;CHECK AGAIN
  421.     JC    EDITC    ;FOR SURE
  422.     ANI    0FH    ;STRIP OF ASCII BITS
  423.     MVI    B,10    ;MULTIPLY TMP1 BY TEN
  424.     LHLD    TMP1    ;GET OLD N
  425.     XCHG        ;TO DE
  426.     LXI    H,0    ;CLEAR HL
  427. EDITZ    DAD    D    ;ADD
  428.     DCR    B    ;CHECK FOR DONENESS
  429.     JNZ    EDITZ
  430.     CALL    ADHL    ;ADD THE NEW DIGIT
  431.     SHLD    TMP1    ;STORE IT
  432.     JMP    EDITB    ;GET ANOTHER ONE
  433. EDITC    LXI    B,17    ;NUMBER OF COMMAND TYPES
  434.     LXI    H,EDITY    ;COMMAND TABLE
  435.     CALL    SRC8    ;SEARCH FOR THE COMMAND
  436.     JNZ    EDITE    ;NOT A COMMAND, ROCK!
  437.     PUSH    B    ;SAVE COMMAND NUMBER
  438.     LHLD    TMP1    ;CHECK FOR N=0
  439.     MOV    A,H
  440.     ORA    L
  441.     JNZ    EDITX    ;NOPE
  442.     INX    H
  443. EDITX    SHLD    TMP1    ;OK
  444.     LHLD    ESRC    ;GET PLACE TO STORE PARAMETER STRING
  445.     MVI    M,80H    ;STORE THE FAKEOUT FLAGS
  446.     INX    H
  447.     MVI    M,80H
  448.     MOV    A,C    ;CHECK COMMAND NUMBER OUT
  449.     CPI    3
  450.     JZ    EDITG
  451.     CPI    4
  452.     JZ    EDITG
  453.     CPI    5
  454.     JZ    EDITG
  455.     CPI    12
  456.     JNZ    EDI45
  457. EDITG    PUSH    H    ;SAVE ADDRESS
  458.     CALL    KYIN    ;GET A CHARACTER
  459.     POP    H    ;GET ADDRESS BACK
  460.     CPI    7FH    ;IS IT A RUBOUT?
  461.     POP    B    ;RESTORE STACK
  462.     JZ    EDITD    ;YUP, SO START OVER AGAIN
  463.     PUSH    B    ;BACK DOWN, BOY!
  464.     CPI    0DH    ;IS IT A CARRIAGE RETURN?
  465.     JZ    EDITF    ;YUP, SO COMMAND IS FINISHED
  466.     MOV    M,A    ;NO, SO STORE THE CHARACTER
  467.     INX    H    ;UPDATE THE INDEX
  468.     JMP    EDITG    ;GO GET ANOTHER ONE
  469. EDITF    DCX    H    ;SET UPPER BIT ON LAST CHARACTER
  470.     MOV    A,M
  471.     ORI    80H
  472.     MOV    M,A
  473. EDI45    POP    B    ;GET BACK COMMAND NUMBER
  474.     LXI    H,EDITW-2    ;COMMAND ADDRESS TABLE
  475.     DAD    B    ;ADD OFFSET
  476.     DAD    B
  477.     MOV    E,M    ;GET THE ADDRESS OUT
  478.     INX    H    
  479.     MOV    D,M
  480.     XCHG        ;TO HL
  481.     LXI    D,EDITD    ;SET UP RETURN ADDRESS
  482.     PUSH    D
  483.     PCHL        ;GOTO PROCESSOR
  484. EDITE    MVI    A,'?'    ;PRINT A QUESTION MARK
  485.     CALL    TOUT    ;TO INDICATE AN ILLEGAL COMMAND
  486.     CALL    PSSU    ;PRINT LINE UNTIL POINTER
  487.     JMP    EDITD    ;GET ANOTHER COMMAND
  488. EDITY    DB    'U'
  489.     DB    'D'
  490.     DB    'I'
  491.     DB    'C'
  492.     DB    'S'
  493.     DB    'Q'
  494.     DB    'R'
  495.     DB    'K'
  496.     DB    'F'
  497.     DB    'B'
  498.     DB    'A'
  499.     DB    'M'
  500.     DB    'L'
  501.     DB    'T'
  502.     DB    20H
  503.     DB    'X'
  504.     DB    'P'
  505. EDITW    DW    PSSU
  506.     DW    PSSD
  507.     DW    PSSI
  508.     DW    PSSC
  509.     DW    PSSS
  510.     DW    PSSQ
  511.     DW    PSSR
  512.     DW    PSSK
  513.     DW    PSSF
  514.     DW    PSSB
  515.     DW    PSSA
  516.     DW    PSSM
  517.     DW    PSSL
  518.     DW    PSST
  519.     DW    PSSZ
  520.     DW    PSSX
  521.     DW    PSSP
  522. EDIT1    PUSH    PSW    ;SAVE REGISTERS
  523.     PUSH    H
  524.     LHLD    DMPMM    ;GET INDEX
  525.     PUSH    PSW
  526.     MOV    A,H    ;SEE IF IT'S ZERO
  527.     ORA    L
  528.     JZ    EDXT11    ;SURE IS
  529.     POP    PSW
  530.     CPI    0DH    ;CHECK FOR CARRIAGE RETURN
  531.     JZ    EDOT12    ;SURE WAS, SO IGNORE IT
  532.     MOV    M,A    ;STORE THE CHARACTER
  533.     INX    H    ;UPDATE THE INDEX
  534.     SHLD    DMPMM    ;SAVE IT
  535. EDOT12    POP    H    ;RESTORE REGISTERS
  536.     POP    PSW
  537.     RET        ;DONE
  538. EDXT11    POP    PSW
  539.     JMP    EDOT12
  540. EDIT4    MOV    A,D    ;DE = 0
  541.     ORA    E
  542.     RZ        ;YUP, SO WE ARE DONE
  543.     PUSH    H    ;SAVE INDEXES
  544.     PUSH    D
  545.     MOV    A,M    ;GET A CHARACTER
  546.     ANI    7FH    ;STRIP ANY STROBE
  547.     CALL    TOUT    ;PRINT IT
  548.     POP    D    ;RESTORE INDEXES
  549.     POP    H
  550.     INX    H    ;UPDATE
  551.     DCX    D
  552.     JMP    EDIT4    ;TRY AGAIN
  553. EDIT5    LHLD    TMP1
  554.     DCX    H
  555.     SHLD    TMP1
  556.     MOV    A,H
  557.     ORA    L
  558.     RET
  559. EDIT6    LHLD    FLST
  560.     CALL    COUNT    ;CHECK FOR POINTER OVERFLOW
  561.     DAD    D
  562.     XCHG
  563.     LHLD    LLST
  564.     CALL    CMP16    ;CHECK IT OUT
  565.     RC        ;IT'S OKAY
  566.     XCHG        ;FIX IT
  567.     DCX    H
  568.     SHLD    LLST
  569.     RET        ;DONE.
  570. PSSK    LHLD    FLST    ;GET FIRST CHARACTER POSITION
  571.     MVI    M,0A0H    ;STORE A SPACE, END
  572.     SHLD    LLST    ;POINTER SET
  573.     JMP    PSSI1    ;INSERT MODE
  574. PSSU    MVI    A,0DH    ;PRINT A CARRIAGE RETURN
  575.     CALL    TOUT    ;SEND IT
  576.     LHLD    FLST    ;COMPUTE NUMBER OF CHARACTERS TO SEND
  577.     XCHG
  578.     LHLD    LLST
  579.     CALL    SUB16
  580.     XCHG        ;RESULT TO DE
  581.     LHLD    FLST    ;GET FIRST CHARACTER TO DUMP
  582.     CALL    EDIT4    ;DUMP 'EM
  583.     RET        ;DONE
  584. PSSD    MVI    A,5CH    ;DUMP A BACKSLASH
  585.     CALL    TOUT
  586. PSSD4    LHLD    LLST    ;COUNT REMAINING CHARACTERS
  587.     CALL    EDIT6    ;CHECK FOR OVERRUN OF POINTER
  588.     CALL    COUNT
  589.     LXI    H,1    ;IS IT ONE?
  590.     CALL    CMP16
  591.     JZ    PSSD1    ;YUP
  592.     LHLD    LLST    ;GET CHARACTER TO DELETE
  593.     PUSH    D    ;SAVE COUNT
  594.     PUSH    H    ;SAVE ADDRESS
  595.     MOV    A,M    ;GET THE CHARACTER
  596.     CALL    TOUT    ;DUMP IT
  597.     POP    D    ;GET BACK THE ADDRESS
  598.     POP    B    ;GET BACK THE COUNT
  599.     DCX    B    ;CORRECT
  600.     MOV    L,E    ;ADDRESS TO HL
  601.     MOV    H,D
  602.     INX    H    ;GET ADDRESS PLUS ONE
  603.     MOV    A,C    ;CHECK FOR COUNT OF 0
  604.     ORA    B
  605.     JZ    PSSD8    ;SURE IS
  606.     CALL    MOVE    ;MOVE 'EM DOWN
  607. PSSD2    CALL    EDIT5    ;DECREMENT N
  608.     JNZ    PSSD4    ;DO IT AGAIN
  609.     MVI    A,5CH    ;DUMP ANOTHER BACKSLASH
  610.     CALL    TOUT
  611.     RET        ;ALL DONE
  612. PSSD1    LHLD    LLST    ;POINTER = FIRST CHARACTER?
  613.     XCHG        ;TO DE
  614.     LHLD    FLST
  615.     CALL    CMP16    ;CHECK THEM
  616.     JZ    PSSD3    ;SURE WERE THE SAME
  617.     XCHG        ;LLST TO HL
  618.     MOV    C,M    ;CHARACTER TO C
  619.     DCX    H    ;SET NEW LAST CHARACTER
  620.     MOV    A,M
  621.     ORI    80H
  622.     MOV    M,A
  623.     INX    H
  624.     SHLD    LLST    ;NEW POINTER
  625.     MOV    A,C    ;GET THE CHARACTER
  626.     ANI    7FH    ;STRIP THE STROBE
  627.     CALL    TOUT    ;PRINT IT
  628.     JMP    PSSD2    ;CONTINUE
  629. PSSD3    XCHG        ;LLST TO HL
  630.     MOV    A,M    ;CHECK THE CHARACTER THERE
  631.     CPI    80H
  632.     JZ    PSSD2    ;NONE LEFT!
  633.     MVI    M,80H    ;SET AN 80 IN
  634.     ANI    7FH    ;STRIP ANY STROBE
  635.     CALL    TOUT    ;PRINT IT
  636.     JMP    PSSD2    ;CONTINUE
  637. PSSS    LHLD    LLST    ;SET SEARCH FLAG UP
  638.     SHLD    TMP2
  639.     CALL    EDIT6    ;CHECK FOR POINTER OVERRUN
  640.     LHLD    ESRC    ;CHECK FOR ANY INPUT
  641.     INX    H
  642.     MOV    A,M
  643.     CPI    80H
  644.     RZ        ;NO INPUT, SO NO SEARCH
  645. PSSS4    LHLD    ESRC    ;INITIALIZE INDEXES
  646.     XCHG        ;TO DE
  647.     INX    D    ;CORRECT TO GET PAST FAKEOUT
  648.     LHLD    TMP2
  649. PSSS3    MOV    A,M    ;GET A CHARACTER
  650.     ANI    7FH    ;STRIP STROBE OFF
  651.     MOV    B,A    ;TO B
  652.     LDAX    D    ;GET A CHARACTER
  653.     ANI    7FH    ;STRIP THE STROBE
  654.     CMP    B    ;THE SAME?
  655.     JNZ    PSSS1    ;NOPE
  656.     LDAX    D    ;CHECK FOR END OF SEARCH STRING
  657.     ANA    A
  658.     JM    PSSS2    ;SURE IS, SO WE'VE GOT A FIND
  659.     MOV    A,M    ;CHECK FOR END STRUCK
  660.     ANA    A
  661.     JM    PSSS1    ;SURE DID
  662.     INX    D    ;UPDATE INDEXES
  663.     INX    H
  664.     JMP    PSSS3    ;TRY ANOTHER CHARACTER
  665. PSSS1    LHLD    TMP2    ;UPDATE INPUT STRING TRY POSITION
  666.     PUSH    H    ;SAVE ADDRESS
  667.     MOV    A,M    ;GET A BYTE
  668.     CALL    TOUT    ;PRINT IT
  669.     POP    H    ;RESTORE ADDRESS
  670.     MOV    A,M    ;CHECK FOR END
  671.     ANA    A
  672.     JM    PSSS5    ;SURE IS
  673.     INX    H
  674.     SHLD    TMP2
  675.     JMP    PSSS4    ;TRY AGAIN!
  676. PSSS2    CALL    EDIT5    ;DECREMENT N
  677.     JNZ    PSSS1    ;MORE TO GO
  678.     LHLD    TMP2    ;SET POINTER
  679.     SHLD    LLST
  680.     RET        ;DONE.
  681. PSSI    CALL    PSSS    ;PERFORM SEARCH FIRST
  682. PSSI1    CALL    KYIN    ;GET A CHARACTER
  683.     CPI    0DH    ;IS IT A CARRIAGE RETURN
  684.     JZ    PSSID    ;DONE
  685.     CPI    7FH    ;IS IT A RUBOUT
  686.     JZ    PSSI2    ;SURE WAS
  687.     PUSH    PSW    ;SAVE THE CHARACTER
  688.     CALL    EDIT6    ;CHECK FOR POINTER OVERRUN
  689.     JC    PSSI9    ;NOPE
  690.     MOV    A,M    ;GET LAST CHARACTER
  691.     ANI    7FH    ;STRIP THE STROBE
  692.     MOV    M,A
  693.     INX    H    ;SET IN THE FAKEOUT
  694.     MVI    M,80H
  695.     SHLD    LLST
  696. PSSI9    LHLD    LLST    ;COUNT CHARACTERS REMAINING
  697.     CALL    COUNT
  698.     MOV    C,E
  699.     MOV    B,D
  700.     MOV    E,L
  701.     MOV    D,H
  702.     INX    D
  703.     CALL    MOVE
  704.     XCHG        ;FIND THE LAST CHARACTER
  705.     DAD    B
  706.     DCX    H
  707.     MOV    A,M    ;GET IT
  708.     CPI    80H    ;IS IT A FAKEOUT?
  709.     JNZ    PSSI7    ;NOPE
  710.     DCX    H    ;SURE WAS
  711.     MOV    A,M    ;SET UPPER BIT
  712.     ORI    80H
  713.     MOV    M,A
  714. PSSI7    XCHG        ;HL BACK TO NORMAL
  715.     POP    PSW    ;RESTORE CHARACTER
  716.     MOV    M,A    ;STUFF IT IN
  717.     CALL    TOUT    ;ECHO IT
  718.     LHLD    LLST    ;UPDATE THE POINTER
  719.     INX    H
  720.     SHLD    LLST
  721.     JMP    PSSI1
  722. PSSI2    LXI    H,1    ;SET UP N
  723.     SHLD    TMP1
  724.     LHLD    LLST    ;FIX THE POINTER
  725.     DCX    H    ;BACK UP
  726.     SHLD    LLST
  727.     MOV    A,M    ;CHECK FOR A FAKEOUT
  728.     CPI    80H
  729.     JNZ    PSSI8    ;NOPE
  730.     DCX    H
  731.     SHLD    LLST
  732.     MOV    A,M
  733.     ORI    80H    ;SET END UP
  734.     MOV    M,A
  735. PSSI8    CALL    PSSD    ;KILL ONE
  736.     JMP    PSSI1    ;CONTINUE
  737. PSSD8    XCHG        ;TO HL
  738.     DCX    H    ;GET LAST CHARACTER
  739.     MOV    A,M    ;SET UPPER BIT
  740.     ORI    80H
  741.     MOV    M,A
  742.     JMP    PSSD2    ;CONTINUE
  743. PSSC    CALL    PSSS    ;FIND THE STRING
  744.     LHLD    ESRC    ;FIND OUT HOW MANY CHARACTERS
  745.     INX    H
  746.     CALL    COUNT    ;COUNT 'EM
  747.     XCHG
  748.     SHLD    TMP1    ;SAVE AS N
  749.     CALL    PSSD    ;DELETE THAT MANY
  750.     JMP    PSSI1    ;GO TO INSERT MODE
  751. PSSQ    MVI    A,0FFH    ;SET COMMAND MODE
  752.     STA    CMND
  753.     JMP    RSTRT    ;BACK TO COMMAND LEVEL
  754. EDIT2    LHLD    INSR    ;SET UP FOR DELETION
  755.     SHLD    FLST
  756.     SHLD    LINE    ;SET UP LINE FLAG
  757.     SHLD    LLST
  758.     JMP    DLTE1    ;DELETE IT
  759. PSSR    CALL    PSSP    ;PRINT THE PRESENT LINE
  760.     LHLD    FLST    ;STORE A BLANK AT THE END
  761.     CALL    COUNT
  762.     DAD    D
  763.     MVI    M,0
  764.     LHLD    FRAV    ;SET UP CODED LINE START
  765.     MVI    A,0FFH    ;SET UP EDIT MODE
  766.     STA    EDITM
  767.     SHLD    SLIN
  768.     LHLD    EDLNP    ;SET UP INSERTION POINT
  769.     SHLD    INSR
  770.     XRA    A    ;CLEAR ESCN
  771.     STA    ESCN
  772.     LHLD    TMP9    ;SET UP FOR LINE DECODING
  773.     DCX    H
  774.     JMP    EXE77    ;DECODE AND ENTER THE LINE
  775. PSSP    MVI    A,0DH    ;PRINT A CR
  776.     CALL    TOUT
  777.     LHLD    FLST    ;START OF LINE
  778.     CALL    MSGER    ;PRINT IT
  779.     MVI    A,0DH    ;PRINT A CR
  780.     CALL    TOUT
  781.     LHLD    FLST    ;RESET POINTER
  782.     SHLD    LLST
  783.     RET        ;DONE.
  784. PSSF    LHLD    TMP1    ;GET N
  785.     XCHG        ;TO DE
  786.     LHLD    EDITO    ;GET OFFSET
  787.     DAD    D    ;ADD IT UP
  788.     SHLD    EDITO    ;SAVE NEW OFFSET
  789.     POP    H    ;CLEAN UP THE STACK
  790.     XRA    A    ;CLEAR EDIT MODE
  791.     STA    EDITM
  792.     JMP    EDITJ    ;NEW LINE
  793. PSSB    LHLD    TMP1    ;GET N
  794.     XCHG        ;TO DE
  795.     LHLD    EDITO    ;GET OFFSET
  796.     CALL    SUB16    ;BACK UP
  797.     SHLD    EDITO    ;SAVE NEW OFFSET
  798.     POP    H    ;CLEAN UP THE STACK
  799.     JMP    EDITJ    ;NEW LINE
  800. PSSA    CALL    EDIT6    ;GET POINTER
  801.     CALL    MSGER    ;SEND IT OUT
  802.     LHLD    FLST    ;FIND END OF LINE
  803.     CALL    COUNT
  804.     DAD    D
  805.     INX    H    ;CORRECT
  806.     SHLD    LLST    ;SET POINTER
  807.     CALL    PSSI1    ;INSERT AT END
  808.     RET        ;DONE
  809. PSSM    LHLD    ESRC    ;SET UP SCAN FLAGS
  810.     SHLD    NSCN
  811.     XRA    A
  812.     STA    ESCN
  813.     CALL    USCN    ;SCAN OFF FAKEOUT
  814.     POP    H    ;CLEAN UP THE STACK
  815.     JMP    EDIT    ;MOVE TO THE NEW LINE
  816. PSSL    MVI    A,0DH    ;DUMP A CR
  817.     CALL    TOUT
  818. PSSL1    CALL    EDIT5    ;DECREMENT N
  819.     JZ    PSSL2    ;ALL DONE
  820.     LHLD    EDLNP    ;DUMP STATEMENT AT POINTER
  821.     CALL    DMST
  822.     LHLD    EDITO    ;GET OFFSET
  823.     INX    H    ;INCREMENT IT
  824.     SHLD    EDITO
  825.     XCHG        ;TO DE
  826.     LHLD    EDITS    ;GET SYMBOL NUMBER
  827.     MOV    C,L    ;TO BC
  828.     MOV    B,H
  829.     CALL    LILO    ;FIND THE LINE
  830.     SHLD    EDLNP
  831.     XCHG
  832.     LHLD    ESRC    ;SEE IF WE ARE DONE
  833.     XCHG
  834.     CALL    CMP16
  835.     JNC    PSSL2    ;DONE (END OF SOURCE)
  836.     JMP    PSSL1    ;GET ANOTHER LINE
  837. PSSL2    POP    H    ;CLEAN UP THE STACK
  838.     JMP    EDITA    ;INTO EDIT MODE
  839. PSST    CALL    EDIT6    ;CHECK FOR OVERRUN
  840.     CALL    MSGER    ;PRINT IT
  841.     JMP    PSSU    ;PRINT UP TO POINTER
  842. PSSZ    CALL    EDIT6    ;GET POINTER
  843.     MOV    A,M    ;GET THE CHARACTER
  844.     INX    H    ;INCREMENT POINTER
  845.     SHLD    LLST
  846.     CALL    TOUT    ;DUMP THE CHARACTER
  847.     CALL    EDIT5    ;CHECK FOR DONENESS
  848.     JNZ    PSSZ    ;NOPE
  849.     RET        ;DONE
  850. PSSX    CALL    EDIT6    ;CHECK FOR OVERRUN
  851.     XCHG        ;TO DE
  852.     LHLD    FLST    ;CHECK FOR NO BACKUP
  853.     CALL    CMP16
  854.     RZ        ;DAT'S RIGHT FOLKS
  855.     DCX    D
  856.     XCHG        ;GET LAST CHARACTER
  857.     MOV    A,M
  858.     SHLD    LLST    ;NEW POINTER
  859.     CALL    TOUT    ;PRINT IT
  860.     CALL    EDIT5    ;CHECK FOR DONENESS
  861.     JNZ    PSSX
  862.     RET        ;ALL DONE
  863. PSSS5    MVI    A,'?'    ;PRINT A QUESTION MARK
  864.     CALL    TOUT
  865.     CALL    PSSP    ;PRINT THE LINE
  866.     POP    H    ;CLEAN UP THE STACK
  867.     JMP    EDITH    ;TRY AGAIN
  868. PSSID    LHLD    LLST    ;CHECK FOR 80 AT END
  869.     MOV    A,M
  870.     CPI    80H
  871.     RNZ        ;NOPE, SO ALL'S WELL
  872.     DCX    H    ;STRIP IT
  873.     MOV    A,M
  874.     ORI    80H
  875.     MOV    M,A
  876.     RET        ;DONE.
  877. EDI96    JMP    RSTRT    ;DONE
  878. * INPUT TRANSLATOR MODULE
  879. * RTN. D.1
  880. * FIND SYMBOL IN SYMBOL TABLE AND DIRECTORY
  881. * IN: HL POINTS TO NAME TO FIND
  882. * OUT: ZERO CLEARED, SYMBOL IS NOT IN SYMBOL TABLE
  883. *  ZERO SET, SYMBOL IS IN THE SYMBOL TABLE, AND
  884. * HL = SYMBOL POINTER
  885. * DE = POINTS TO SYMBOL ID BYTE
  886. * BC = SYMBOL NUMBER
  887. * A = SYMBOL ID BYTE
  888. SSRC    XCHG        ;FREE HL
  889.     LHLD    SNUM    ;GET NUMBER OF SYMBOLS IN TABLE
  890.     MOV    B,H    ;PUT IT IN BC
  891.     MOV    C,L
  892.     LHLD    STAB    ;GET START OF SYMBOL TABLE
  893.     XCHG        ;PUT 'EM IN THE RIGHT REGISTERS
  894.     CALL    STSRH    ;SEARCH THE SYMBOL TABLE
  895.     RNZ        ;NO FIND EXIT
  896. * RTN. D.2
  897. * FIND SYMBOL DIRECTORY ENTRY
  898. * IN: BC = SYBMOL NUMBER
  899. * OUT: HL = SYMBOL POINTER
  900. *  DE = POINTS TO SYMBOL ID BYTE
  901. *  BC = SYMBOL NUMBER
  902. *  A = SYMBOL ID BYTE
  903. DFND    LHLD    SDIR    ;GET START OF SYMBOL DIRECTORY
  904.     LDA    RURD
  905.     ANA    A    ;READY TO RUN?
  906.     JNZ    DFND2    ;YUP
  907.     LDA    RUNF    ;ARE WE RUNNING
  908.     ANA    A
  909.     JZ    DFND2    ;NOPE
  910.     MVI    B,26H
  911.     JMP    ERROR
  912. DFND2    DAD    B    ;HL=HL+BC*3
  913.     DAD    B
  914.     DAD    B
  915.     DCX    H    ;GET ADDRESS OF ID BYTE
  916.     PUSH    H    ;SAVE IT
  917.     DCX    H    ;GET ADDRESS OF POINTER MSD
  918.     MOV    D,M    ;PUT IT IN D
  919.     DCX    H    ;GET ADDRESS OF POINTER LSD
  920.     MOV    E,M    ;PUT IT IN E
  921.     POP    H    ;GET BACK ID BYTE ADDRESS
  922.     MOV    A,M    ;PUT IT IN A
  923.     XCHG        ;POINTER TO HL
  924.     PUSH    D    ;SAVE ADDRESS
  925.     MOV    D,A    ;SAVE A
  926.     XRA    A    ;SET ZERO FLAG
  927.     MOV    A,D    ;RESTORE A
  928.     POP    D    ;RESTORE ADDRESS
  929.     RET        ;DONE....
  930. * RTN. D.3
  931. * INSERT SYMBOL IN SYMBOL TABLE AND DIRECTORY
  932. * IN: HL = POINTER TO SYMBOL NAME
  933. * OUT: BC = SYMBOL NUMBER
  934. *  HL = POINTER TO SYMBOL ID BYTE
  935. ITAB    CALL    COUNT    ;COUNT CHARACTERS IN NAME
  936.     LDA    CMND    ;CHECK FOR COMMAND MODE
  937.     ANA    A    ;SET FLAGS
  938.     MVI    B,18H    ;SET ERROR TYPE JUST IN CASE
  939.     JNZ    ERROR    ;WHOSE THE STONE THAT TRIED THIS??
  940.     PUSH    H    ;SAVE ADDRESS AND NUMBER OF CHARACTERS
  941.     PUSH    D
  942.     INX    D    ;DE=DE+3
  943.     INX    D
  944.     INX    D
  945.     LHLD    SDIR    ;GET START OF DIRECTORY
  946.     PUSH    H    ;SAVE IT
  947.     CALL    SUB16    ;COMPUTE NEW START
  948.     PUSH    H    ;SAVE IT
  949.     LHLD    SDIR    ;HL=(STAB)-(SDIR)
  950.     XCHG
  951.     LHLD    STAB
  952.     CALL    SUB16
  953.     MOV    B,H    ;NUMBER OF BYTES IN DIRECTORY TO BC
  954.     MOV    C,L
  955.     POP    D    ;GET BACK DESTINATION
  956.     POP    H    ;GET BACK START OF DIRECTORY
  957.     CALL    MOVE    ;MOVE IT BACK
  958.     XCHG        ;NEW SDIR TO HL
  959.     SHLD    SDIR    ;STUFF IT IN
  960.     LHLD    STAB    ;GET START OF SYMBOL TABLE
  961.     POP    D    ;GET NUMBER OF CHARACTERS IN SYMBOL
  962.     PUSH    D    ;SAVE IT
  963.     CALL    SUB16    ;COMPUTE NEW SYMBOL TABLE START
  964.     PUSH    H    ;SAVE IT
  965.     DAD    D    ;GET STAB BACK
  966.     XCHG        ;TO DE
  967.     LHLD    MEND    ;GET END OF USEABLE MEMORY
  968.     CALL    SUB16    ;COMPUTE NUMBER OF BYTES IN SYMBOL TABLE
  969.     INX    H    ;CORRECT
  970.     MOV    B,H    ;STICK IT IN BC
  971.     MOV    C,L
  972.     POP    D    ;GET BACK NEW START OF SYMBOL TABLE
  973.     LHLD    STAB    ;GET OLD START
  974.     CALL    MOVE    ;MOVE IT DOWN
  975.     XCHG        ;NEW START TO HL
  976.     SHLD    STAB    ;STUFF IT IN
  977.     POP    D    ;GET BACK NUMBER OF CHARACTERS
  978.     LHLD    MEND    ;END OF USEABLE MEMORY
  979.     CALL    SUB16    ;COMPUTE LOCATION OF NEW SYMBOL
  980.     INX    H    ;CORRECT
  981.     XCHG        ;TO DE
  982.     MOV    B,H    ;BC=HL
  983.     MOV    C,L
  984.     POP    H    ;GET BACK SYMBOL LOCATION
  985.     CALL    MOVE    ;PUT IT IN THE SYMBOL TABLE
  986.     LHLD    SNUM    ;GET NUMBER OF SYMBOLS
  987.     INX    H    ;UPDATE IT
  988.     SHLD    SNUM    ;STICK IT BACK
  989.     MOV    B,H    ;BC=HL
  990.     MOV    C,L
  991.     LHLD    STAB    ;GET FIRST ADDRESS OF SYMBOL TABLE
  992.     DCX    H    ;GET NEW SYMBOL ID BYTE
  993.     MVI    M,0    ;CLEAR IT OUT
  994.     XRA    A    ;CLEAR RURD
  995.     STA    RURD
  996.     RET        ;DONE.
  997. * RTN. D.4
  998. * UPSCAN IN INPUT LINE
  999. * UPDATES TSCN AND NSCN
  1000. * IF CARRY SET ON EXIT, THERE IS NO MORE DATA IN
  1001. * THIS INPUT LINE.
  1002. USCN    LDA    ESCN    ;CHECK FOR NO MORE DATA
  1003.     CPI    2    ;CHECK FOR DONENESS
  1004.     STC        ;SET CARRY JUST IN CASE
  1005.     RZ        ;RETURN IF END OF LINE AND NO MORE DATA
  1006.     LHLD    NSCN    ;GET NEXT SCANOFF START
  1007.     SHLD    TSCN    ;STUFF IT INTO THIS SCANOFF START
  1008.     CPI    1    ;COMPARE
  1009.     JNZ    USCNA    ;IT'S NOT
  1010.     INX    H    ;UPDATE NSCN
  1011.     SHLD    NSCN
  1012.     INR    A    ;IT IS
  1013.     STA    ESCN    ;SET ESCN TO 2 TO INDICATE THE FACT
  1014.     RET        ;DONE
  1015. USCNA    MOV    A,M    ;GET A CHARACTER
  1016.     INX    H    ;UPDATE INDEX
  1017.     ANA    A    ;SET FLAGS
  1018.     JP    USCNA    ;LOOP TO TRY AGAIN
  1019.     MVI    C,0    ;CLEAR THE CHARACTER COUNTER
  1020. USCN2    MOV    A,M    ;GET A CHARACTER
  1021.     ANA    A    ;SET FLAGS
  1022.     SHLD    NSCN    ;KEEP NSCN UP TO DATE
  1023.     JM    USCN3    ;OH, OH, THIS IS THE END OF THE LINE
  1024.     CPI    20H    ;IS THIS A SPACE?
  1025.     JNZ    USCN4    ;NOPE
  1026.     INX    H    ;GET NEXT CHARACTER AND IGNORE SPACE
  1027.     JMP    USCN2    ;TRY AGAIN
  1028. USCN4    SHLD    NSCN    ;SAVE THE NEXT SCANOFF START
  1029. USCN1    MOV    A,M    ;GET A CHARACTER
  1030.     ANI    7FH    ;STRIP OFF UPPER BIT
  1031.     CPI    '$'    ;IS IT A DOLLAR SIGN?
  1032.     JZ    USCN7    ;YUP
  1033.     CPI    30H    ;CHECK FOR NUMERIC
  1034.     JM    USCN5    ;NOPE
  1035.     CPI    7BH    ;CHECK FOR LOWER CASE
  1036.     JP    USCN5    ;NOPE
  1037.     CPI    61H    ;CHECK AGAIN
  1038.     JP    USCN7    ;YUP
  1039.     CPI    'Z'+1    ;CHECK FOR ALPHABETIC
  1040.     JP    USCN5    ;NOPE
  1041.     CPI    'A'    ;CHECK AGAIN FOR ALPHABETIC
  1042.     JP    USCN7    ;SURE IS
  1043.     CPI    '9'+1    ;CHECK AGAIN FOR NUMERIC
  1044.     JP    USCN5    ;MISSED OUT
  1045. USCN7    MOV    A,M    ;GET THE BYTE BACK
  1046.     ANA    A    ;SET FLAGS
  1047.     JM    USCN3    ;END OF THE LINE, BUDDY
  1048.     INX    H
  1049.     INR    C    ;UPDATE CHARACTER COUNTER
  1050.     JMP    USCN1    ;LOOP FOR MORE OF THEM
  1051. USCN5    DCR    C    ;C=0?
  1052.     DCX    H    ;JUST IN CASE
  1053.     JP    USCN6    ;NOPE
  1054.     INX    H    ;BACK TO NORMAL
  1055.     MOV    A,M    ;GET THE BYTE BACK
  1056.     ANA    A    ;SET FLAGS
  1057.     JM    USCN3    ;END OF THE LINE, FOLKS
  1058.     CALL    USCNO    ;CHECK FOR POSSIBLE DOUBLE
  1059.     JNZ    USCN6    ;NOT POSSIBLE
  1060.     INX    H    ;CHECK FURTHER
  1061.     MOV    A,M    ;GET IT
  1062.     CALL    USCNO    ;CHECK IT
  1063.     JZ    USCN6    ;DOUBLE
  1064.     DCX    H    ;BACK TO NORMAL
  1065. USCN6    MOV    A,M    ;GET THE CHARACTER
  1066.     ORI    80H    ;SET THE UPPER BIT
  1067.     MOV    M,A    ;STICK IT BACK
  1068.     XRA    A    ;CLEAR CARRY
  1069.     RET
  1070. USCN3    MVI    A,1    ;SET ESCN
  1071.     STA    ESCN
  1072.     MOV    A,M    ;GET LAST BYTE
  1073.     CPI    0A0H    ;CHECK FOR A SPACE
  1074.     JZ    USCNJ    ;YUP
  1075.     XRA    A    ;CLEAR CARRY
  1076.     RET
  1077. USCNJ    MVI    A,2    ;SET ESCN TO INDICATE NO MORE
  1078.     STA    ESCN
  1079.     RET
  1080. * RTN. D.5
  1081. * BACKSCAN INPUT LINE
  1082. * SETS TSCN AND NSCN
  1083. BSCN    LDA    ESCN    ;CHECK END SCAN FLAG
  1084.     ANA    A    ;SET FLAGS
  1085.     JNZ    BSCN1    ;DON'T CLEAR THE UPPER BIT
  1086.     LHLD    NSCN    ;GET NEXT SCAN FLAG
  1087. BSCN3    MOV    A,M    ;GET A CHARACTER
  1088.     ANA    A    ;SET FLAGS
  1089.     JM    BSCN2    ;FOUND IT
  1090.     INX    H    ;GET NEXT CHARACTER LOCATION
  1091.     JMP    BSCN3    ;TRY AGAIN
  1092. BSCN2    ANI    7FH    ;CLEAR THE UPPER BIT
  1093.     MOV    M,A    ;STUFF IT BACK
  1094. BSCN1    LHLD    TSCN    ;NSCN=TSCN
  1095.     SHLD    NSCN
  1096.     MVI    C,2    ;SET UP COUNTER
  1097. BSCN4    DCX    H    ;GET LAST CHARACTER
  1098.     MOV    A,M    ;GET A CHARACTER, STUPID.
  1099.     ANA    A    ;SET FLAGS
  1100.     JP    BSCN4    ;TRY AGAIN
  1101.     DCR    C    ;FIND TWO YET?
  1102.     JNZ    BSCN4    ;NOPE
  1103. BSCN5    INX    H    ;GET NEXT CHARACTER
  1104.     MOV    A,M    ;GET THE CHARACTER
  1105.     CPI    20H    ;IS IT A SPACE?????
  1106.     JZ    BSCN5    ;YUP, SO TRY AGAIN
  1107.     SHLD    TSCN    ;STORE NEW TSCN
  1108.     LDA    ESCN    ;CHECK END FLAG OUT
  1109.     RRC
  1110.     ANI    1
  1111.     STA    ESCN
  1112.     RET        ;DONE..
  1113. * RTN. D.6
  1114. * GET SYMBOL NUMBER
  1115. * IN: HL = LABEL START
  1116. *  A = ID BYTE FOR TYPE DESIRED
  1117. * OUT: BC = SYMBOL NUMBER
  1118. *  CARRY SET IF ID BYTE WAS WRONG
  1119. *  A = ID BYTE
  1120. GTNM    PUSH    PSW    ;SAVE PARAMETERS
  1121.     PUSH    H
  1122.     CALL    SSRC    ;SEARCH THE SYMBOL TABLE
  1123.     JNZ    GTNM1    ;OH, OH, WE'LL HAVE TO INSERT IT
  1124.     POP    H    ;GET BACK PARAMETERS
  1125.     POP    D
  1126.     CMP    D    ;SEE IF ID BYTES ARE THE SAME
  1127.     RZ        ;SURE WERE
  1128.     STC        ;FLAG THE FACT
  1129.     RET
  1130. GTNM1    POP    H    ;GET BACK SYMBOL ADDRESS
  1131.     CALL    ITAB    ;INSERT IN SYMBOL TABLE
  1132.     POP    PSW    ;GET BACK ID BYTE
  1133.     MOV    M,A    ;STORE IT
  1134.     DCX    H    ;CLEAR THE POINTER OUT
  1135.     MVI    M,0
  1136.     DCX    H
  1137.     MVI    M,0
  1138.     ANA    A    ;CLEAR CARRY
  1139.     RET        ;DONE...
  1140. * RTN. D.7
  1141. * LEGAL LABEL CHECK
  1142. * CHECKS THIS SCAN OFF AS A LABEL
  1143. * IF ILLEGAL, EXITS WITH CARRY SET
  1144. * OTHERWISE, CARRY IS CLEARED
  1145. LGLB    LHLD    TSCN    ;GET THIS SCAN ADDRESS
  1146.     MOV    A,M    ;GET A CHARACTER
  1147.     ANI    7FH    ;STRIP OFF UPPER BIT
  1148.     CPI    7BH    ;IS IT BIGGER THAN LOWER CASE?
  1149.     JNC    LGLB1    ;YUP
  1150.     CPI    61H    ;IS IT LOWER CASE?
  1151.     JNC    LGLB2    ;YUP
  1152.     CPI    'Z'+1    ;IS IT BIGGER THAN ALPHABETIC?
  1153.     JP    LGLB1    ;YUP
  1154.     CPI    'A'    ;IS IT ALPHABETIC?
  1155.     JP    LGLB2    ;YUP
  1156.     CPI    '9'+1    ;IS IT BIGGER THAN NUMERIC?
  1157.     JP    LGLB1    ;YUP
  1158.     CPI    '0'    ;IS IT NUMERIC
  1159.     JP    LGLB2    ;YUP
  1160. LGLB1    STC        ;ILLEGAL EXIT
  1161. LGLB2    RET        ;DONE.
  1162. * RTN. D.8
  1163. * LEGAL NUMBER CHECK
  1164. * IN: TSCN HAS LOCATION OF TRIAL NUMBER
  1165. * OUT: CARRY SET IF THIS IS NOT A NUMBER
  1166. *  TMP10 HAS THE NUMBER TRANSLATED
  1167. * NSCN IS SET TO NEXT CHARACTER AFTER NUMBER
  1168. LGNM    LHLD    TSCN    ;GET START OF TRIAL NUMBER
  1169.     MOV    A,M    ;GET FIRST CHARACTER
  1170.     ANI    7FH    ;STRIP OFF UPPER BIT
  1171.     CPI    '.'    ;IS IT A PERIOD?
  1172.     JZ    LGNM5    ;YUP
  1173.     CPI    '9'+1    ;IS IT BIGGER THAN A NUMBER
  1174.     STC        ;SET CARRY JUST IN CASE
  1175.     RP        ;RETURN IF IT'S NOT A DIGIT
  1176.     CPI    '0'    ;SEE IF IT'S LESS THAN A DIGIT
  1177.     RC        ;RETURN IF IT'S NOT A DIGIT
  1178. LGNM5    LXI    D,TMP10    ;GET PLACE TO PUT THE NUMBER
  1179.     CALL    STNM    ;CONVERT TO NUMBER (OR AT LEAST TRY)
  1180.     RC        ;RETURN IF CONVERSION ERROR OCCURED
  1181.     DCX    H    ;CORRECT ADDRESS TO GET LAST CHARACTER IN NUMBER
  1182.     PUSH    H    ;SAVE ADDRESS
  1183.     CALL    BSCN    ;GET RID OF END FLAG
  1184.     CALL    BSCN
  1185.     POP    H    ;RESTORE ADDRESS
  1186.     MOV    A,M    ;UPDATE END FLAG
  1187.     ANA    A    ;SET FLAGS
  1188.     JM    LGNM3    ;JUMP IF END IS ALREADY REACHED
  1189.     ORI    80H
  1190.     MOV    M,A
  1191.     SHLD    NSCN    ;UPDATE NEXT SCAN OFF ADDRESS
  1192.     CALL    USCN    ;GET ALL THE FLAGS RIGHT
  1193.     XRA    A    ;CLEAR CARRY
  1194.     RET        ;DONE, LET'S GET OUT OF HERE
  1195. LGNM3    CALL    USCN    ;SCAN OFF TILL END
  1196.     JNC    LGNM3    ;LOOP FOR ANOTHER SCAN-OFF
  1197.     XRA    A    ;CLEAR CARRY
  1198.     RET        ;DONE.
  1199. * RTN. D.9
  1200. * PROCESS OPERATOR
  1201. *  ZERO SET IF IT WAS VALID OPERATOR
  1202. * A = CODE FOR OPERATOR
  1203. POPR    LHLD    TSCN    ;GET SCAN START ADDRESS
  1204.     LXI    D,OTBL    ;OPERATOR TABLE ADDRESS
  1205.     LXI    B,22    ;NUMBER OF OPERATOR TYPES
  1206.     CALL    STSRH    ;SEARCH TABLE
  1207.     JZ    POPR1    ;OK, WE FOUND IT
  1208.     RNZ
  1209. POPR1    MOV    A,C    ;GET THE ITEM NUMBER
  1210.     CPI    22    ;CHECK FOR "&"
  1211.     JZ    POPRA    ;SURE WAS
  1212.     CPI    19    ;CHECK FOR DUPLICATE RANGE
  1213.     JM    POPR2    ;IT'S NOT
  1214.     SUI    15    ;MAKE IT RIGHT (MAYBE)
  1215.     CPI    6    ;SEE IF IT'S ><
  1216.     JNZ    POPR2    ;NOPE
  1217.     INR    A    ;YUP
  1218.     INR    A
  1219. POPR2    ADI    0FH    ;ADD OPCODE OFFSET
  1220.     CPI    18H    ;CHECK FOR EQUAL SIGN
  1221.     JZ    POPR5    ;YUP
  1222. POPR6    MOV    B,A    ;SAVE THE CODE
  1223.     XRA    A    ;CLEAR CARRY, SET ZERO
  1224.     MOV    A,B    ;GET THE CODE BACK
  1225.     RET        ;DONE!!!!!!
  1226. POPR5    LDA    OPFLG    ;CHECK FOR A "LET" STATEMENT
  1227.     CPI    0A8H    ;CHECK IT
  1228.     MVI    A,18H    ;GET REGULAR EQUALS SIGN BACK
  1229.     JNZ    POPR6    ;FALSE ALARM
  1230.     MVI    A,0FH    ;CODE FOR ASSIGNMENT OPERATOR
  1231.     JMP    POPR6    ;SEND IT
  1232. POPRA    MVI    A,1AH    ;GET + CODE
  1233.     RET        ;DONE.
  1234. USCNO    CPI    '>'    ;CHECK THESE THINGS OUT
  1235.     RZ
  1236.     CPI    '<'
  1237.     RZ
  1238.     CPI    '='
  1239.     RET        ;DONE
  1240. OTBL    DB    'O'
  1241.     DB    'R'+80H
  1242.     DB    'A'
  1243.     DB    'N'
  1244.     DB    'D'+80H
  1245.     DB    'N'
  1246.     DB    'O'
  1247.     DB    'T'+80H
  1248.     DB    '>'
  1249.     DB    '='+80H
  1250.     DB    '<'
  1251.     DB    '='+80H
  1252.     DB    '>'+80H
  1253.     DB    '<'+80H
  1254.     DB    '<'
  1255.     DB    '>'+80H
  1256.     DB    '='+80H
  1257.     DB    '-'+80H
  1258.     DB    '+'+80H
  1259.     DB    '/'+80H
  1260.     DB    '*'+80H
  1261.     DB    '-'+80H
  1262.     DB    'N'
  1263.     DB    'O'
  1264.     DB    'T'+80H
  1265.     DB    0DEH
  1266.     DB    '('+80H
  1267.     DB    ')'+80H
  1268.     DB    '='
  1269.     DB    '>'+80H
  1270.     DB    '='
  1271.     DB    '<'+80H
  1272.     DB    '>'
  1273.     DB    '<'+80H
  1274.     DB    '&'+80H
  1275. * RTN. D.10
  1276. * LINE DESCRIPTOR PROCESSOR
  1277. * PRODUCES STATEMENT NAME ON TRIAL DECODED STATEMENT, AND
  1278. * OPTIONALLY, THE +- OFFSET EXPRESSION
  1279. * ON RETURN, CARRY SET IF END OF LINE ENCOUNTERED
  1280. PLDS    CALL    USCN    ;SCAN OFF THE LABEL
  1281.     RC
  1282.     CALL    LGLB    ;CHECK LEGALITY OF LABEL
  1283.     MVI    B,7    ;SET UP FOR ERROR 7
  1284.     JC    ERROR    ;OH, OH, ILLEGAL LABEL
  1285.     MVI    A,1    ;SET UP STATEMENT NAME ID
  1286.     LHLD    TSCN    ;GET LABEL ADDRESS
  1287.     CALL    GTNM    ;GET THE SYMBOL NUMBER
  1288.     PUSH    B    ;SAVE 'EM
  1289.     MVI    B,9    ;SET UP FOR ERROR 9
  1290.     JC    ERROR    ;OH, OH, TRYING TO USE A VARIABLE FOR A STATEMENT!
  1291.     POP    B    ;GET 'EM BACK
  1292.     LHLD    SLIN    ;GET ADDRESS TO STORE CONVERTED CODE
  1293.     MVI    M,6    ;STORE IT ALL
  1294.     INX    H
  1295.     MOV    M,C
  1296.     INX    H
  1297.     MOV    M,B
  1298.     INX    H
  1299.     MVI    M,7
  1300.     INX    H
  1301.     SHLD    SLIN    ;SAVE THE NEW ADDRESS
  1302.     CALL    USCN    ;SCAN OFF A TOKEN
  1303.     RC        ;END OF THE LINE, INSTEAD
  1304.     CALL    POPR    ;CHECK FOR AN OPERATOR FOLLOWING
  1305.     JZ    PLDS1    ;AH, HA, AN OPERATOR
  1306. PLDS2    ANA    A    ;CLEAR CARRY
  1307.     RET        ;DONE.
  1308. PLDS1    CPI    19H    ;CHECK FOR A -
  1309.     JZ    PLDS3    ;YUP
  1310.     CPI    1AH    ;CHECK FOR A +
  1311.     JNZ    PLDS2    ;NOPE
  1312. PLDS3    CALL    BSCN    ;PUT IT ALL BACK
  1313.     LHLD    SLIN    ;STORE THE EXPRESSION OPCODE
  1314.     MVI    M,8    ;DONE
  1315.     INX    H    ;UPDATE INDEX
  1316.     SHLD    SLIN    ;SAVE IT
  1317.     JMP    EVEX    ;PROCESS THE EXPRESSION FOLLOWING
  1318. SPRAT    MVI    B,10H    ;SYNTAX ERROR CODE
  1319.     JMP    ERROR
  1320. * RTN. D.11
  1321. * COMMA, COLON, REMARK, AND END OF LINE CHECKER FOR 
  1322. * STATEMENTS USING LISTS
  1323. * OUT: CARRY SET IF END OF LINE
  1324. *  ZERO SET IF COMMA
  1325. *  JUMPS TO EXEC3 IF COLON
  1326. *  JUMPS TO PREM IF REMARK
  1327. *  JUMPS TO ERROR 10 (SYNTAX) IF ANYTHING ELSE
  1328. CCRC    CALL    USCN    ;SCAN OFF A TOKEN
  1329.     RC        ;END OF LINE
  1330.     LHLD    TSCN    ;GET THE CHARACTER
  1331.     MOV    A,M    ;GOT IT
  1332.     CPI    ','+80H    ;SEE IF IT'S A COMMA
  1333.     RZ        ;SURE WAS
  1334.     CPI    ':'+80H    ;SEE IF IT'S A COLON
  1335.     JZ    CCRC1    ;YUP
  1336.     CPI    0ACH    ;SEE IF IT'S A SINGLE QUOTE
  1337.     JZ    PREM    ;YES, SO PROCESS REMARK
  1338.     MVI    B,10H    ;GET A 10 FOR ERROR TYPE
  1339.     JMP    ERROR    ;GO GET IT
  1340. CCRC1    CALL    USCN    ;SCAN OFF THE FIRST TOKEN OF NEXT STATEMENT
  1341.     JMP    ENPR1    ;GO PROCESS IT
  1342. * RTN. D.12
  1343. * PROCESS LINE DESCRIPTOR LIST
  1344. * RETURNS WHEN END OF LINE IS REACHED
  1345. * IF COLON ENCOUNTERED, RETURNS TO EXEC3
  1346. PLDL    CALL    PLDS    ;SCAN OFF A LINE DESCRIPTOR
  1347.     RC        ;END OF LINE
  1348.     CALL    BSCN    ;GET BACK THE COMMA
  1349.     CALL    CCRC    ;CHECK THE SEPARATOR
  1350.     RC        ;END OF LINE
  1351.     JMP    PLDL    ;LOOP FOR ANOTHER LINE DESCRIPTOR
  1352. * RTN. D.13
  1353. * REMARKS PROCESSOR
  1354. * PROCESSES TEXT FOLLOWING EITHER "'" OR "REM"
  1355. PREM    LHLD    NSCN    ;GET FIRST SIGNIFICANT TEXT ADDRESS
  1356.     PUSH    H    ;SAVE IT
  1357.     LDA    ESCN    ;CHECK FOR REM ALONE
  1358.     PUSH    PSW
  1359.     CALL    BSCN    ;BACK OFF, JACK
  1360.     MVI    A,35H    ;"'" OPCODE
  1361.     CALL    ICBY    ;INSERT IT
  1362.     POP    PSW    ;GET BACK FORMER ESCN
  1363.     CPI    2    ;IS IT REM ALONE?
  1364.     JNZ    PREM2    ;NOPE
  1365.     POP    D    ;STORE FAKEOUT SPACE
  1366.     PUSH    D
  1367.     MVI    A,0A0H
  1368.     STAX    D
  1369. PREM2    POP    D    ;FIRST CHARACTER INDEX TO DE
  1370.     DCX    D    ;GET ONE LESS
  1371.     LHLD    SLIN    ;GET CONVERTED CODE ADDRESS
  1372.     MVI    M,0    ;STORE ID BYTE FOR STRING
  1373. PREM1    INX    H    ;UPDATE INDEXES
  1374.     INX    D    
  1375.     LDAX    D    ;GET CHARACTER
  1376.     MOV    M,A    ;STUFF IT IN MEMORY
  1377.     ANA    A    ;SET FLAGS
  1378.     JP    PREM1    ;LOOP FOR MORE CHARACTERS
  1379.     INX    H    ;GET NEXT CODE LOCATION
  1380.     MVI    M,1    ;MARK END OF STRING
  1381.     INX    H    ;GET NEXT ONE
  1382.     SHLD    SLIN    ;STUFF IT BACK
  1383.     RET        ;DONE.
  1384. * RTN. D.14
  1385. * EVALUATE INFIX EXPRESSION INTO REVERSE POLISH EXPRESSION
  1386. * OUT: RETURNS WHEN END OF EXPRESSION DETECTED
  1387. * ERROR EXIT (SYNTAX) OCCURS IF:
  1388. * 1. AN ILLEGAL SYMBOL OR LABEL IS ENCOUNTERED
  1389. * 2. A RIGHT PAREN WITHOUT A LEFT PAREN OCCURS
  1390. * 3. TWO BINARY OPERATORS IN A ROW OCCUR
  1391. * 4. THERE ARE MORE LEFT PARENS THAN RIGHT
  1392. * 5. TWO LABELS, LITERALS, OR CONSTANTS OCCUR IN A ROW
  1393. EVEX    LHLD    SLIN    ;COMPUTE PLACE TO PUT STACK
  1394.     LDA    RURD    ;CHECK IF RUN READY
  1395.     ANA    A
  1396.     JNZ    EVE00    ;YUP
  1397.     XCHG
  1398.     LHLD    SDIR
  1399.     CALL    SUB16
  1400.     MOV    A,H    ;RIGHT SHIFT HL INTO DE
  1401.     ANA    A    ;CLEAR CARRY
  1402.     RAR        ;RIGHT SHIFT
  1403.     MOV    D,A
  1404.     MOV    A,L
  1405.     RAR
  1406.     MOV    E,A
  1407.     LHLD    SLIN
  1408.     DAD    D    ;GOT IT
  1409.     SHLD    FARY    ;SAVE IT
  1410. EVE01    XCHG        ;PUT IT IN DE
  1411.     LHLD    SLIN    ;GET PLACE TO PUT POLISH STRING
  1412.     LXI    B,1    ;INITIALIZE THE COUNTERS
  1413.     MVI    M,9    ;STORE THE EXPRESSION OPCODE
  1414.     INX    H    ;UPDATE SLIN
  1415. EVEX1    PUSH    B    ;SAVE ALL THIS JUNK
  1416.     PUSH    D
  1417.     PUSH    H
  1418.     CALL    USCN    ;SCAN OFF A TOKEN
  1419.     JC    EVEX2    ;RAN INTO END OF LINE
  1420.     CALL    POPR    ;CHECK FOR NORMAL OPERATOR
  1421.     JZ    EVEX3    ;SURE IS
  1422.     CALL    PFUN    ;CHECK FOR INTRINSIC FUNCTION
  1423.     JZ    EVEX3    ;YUP
  1424.     CALL    SCCC    ;CHECK FOR SEMICOLON OR COMMA
  1425.     JZ    COMM    ;IT WAS
  1426.     CALL    PINT    ;CHECK FOR AN INTERMEDIARY
  1427.     JZ    EVEX2    ;YUP, SO END OF EXPRESSION
  1428.     LHLD    TSCN    ;GET THIS ADDRESS THEY'RE TALKIN' ABOUT
  1429.     MOV    A,M    ;GET THE CHARACTER
  1430.     CPI    '"'+80H    ;SEE IF IT'S A STRING LITERAL
  1431.     JZ    EVEX4    ;SURE IS
  1432.     CALL    LGNM    ;IS IT A NUMBER?
  1433.     JNC    EVEX5    ;YUP
  1434.     CALL    LGLB    ;IS IT A LABEL?
  1435.     JNC    EVEX6    ;'PEARS TO BE..
  1436.     MVI    B,11H    ;SET UP ERROR 11
  1437.     JMP    ERROR    ;ILLEGAL VARIABLE NAME
  1438. COMM    CPI    0DH    ;COMMA?
  1439.     JNZ    COMM1    ;NOPE
  1440.     LDA    OPFLG    ;GET OPCODE
  1441.     CPI    80H    ;ON....GOTO?
  1442.     MVI    A,0DH    ;GET COMMA BACK
  1443.     JNZ    COMM1    ;NOPE
  1444.     CALL    BSCN    ;SCAN BACK ONE
  1445.     JMP    EVEX2    ;DONE
  1446. COMM1    POP    H    ;POP 'EM ALL
  1447.     POP    D
  1448.     POP    B
  1449.     PUSH    PSW    ;SAVE THE CODE
  1450. COMM3    INR    B    ;STACK EMPTY?
  1451.     DCR    B
  1452.     JZ    COMM2    ;YUP
  1453.     LDAX    D    ;GET TOP OF STACK
  1454.     CPI    20H    ;IS IT "("?
  1455.     JZ    COMM2    ;YUP
  1456.     MOV    M,A    ;STORE IT
  1457.     INX    D    ;BUMP UP INDEXES
  1458.     INX    H
  1459.     DCR    B
  1460.     JMP    COMM3    ;TRY FOR ANOTHER ONE
  1461. EVE00    LHLD    FARY
  1462.     JMP    EVE01
  1463. COMM2    POP    PSW    ;GET CODE BACK
  1464.     MOV    M,A    ;STUFF IT IN
  1465.     INX    H    ;BUMP UP INDEX
  1466.     MVI    C,1    ;SET OPERATOR LAST
  1467.     JMP    EVEX1
  1468. EVEXQ    POP    H    ;GET REGISTERS BACK
  1469.     POP    D
  1470.     POP    B
  1471.     MVI    A,36H    ;FUNCTION OPERATOR OPCODE
  1472.     DCX    D    ;PUSH ONTO STACK
  1473.     INR    B
  1474.     STAX    D
  1475.     PUSH    B    ;SAVE 'EM
  1476.     PUSH    D
  1477.     PUSH    H
  1478.     LHLD    TSCN    ;RESTORE INDEX
  1479.     MVI    A,4    ;FUNCTION ID BYTE
  1480.     JMP    EVEXY    ;CONTINUE PROCESSING
  1481. EVEX6    POP    H    ;GET 'EM BACK
  1482.     POP    D
  1483.     POP    B
  1484.     CALL    EVEXG    ;CHECK FOR TWO LABELS IN A ROW
  1485.     PUSH    B    ;SAVE 'EM ALL AGAIN
  1486.     PUSH    D
  1487.     PUSH    H
  1488.     LHLD    TSCN    ;GET ADDRESS OF THIS LABEL
  1489.     MOV    A,M    ;GET A CHARACTER
  1490.     CPI    'F'    ;CHECK FOR AN F
  1491.     JNZ    EVEXX    ;NOPE
  1492.     INX    H    ;GET NEXT CHARACTER
  1493.     MOV    A,M    ;GET IT
  1494.     CPI    'N'    ;CHECK FOR AN N
  1495.     DCX    H    ;RESTORE INDEX
  1496.     JZ    EVEXQ    ;YUP, WE'VE GOT AN FN(XXX)
  1497. EVEXX    CALL    USCN    ;CHECK FOR "(" ON NEXT TOKEN
  1498.     JC    EVEXZ    ;OOPS, RAN INTO THE END
  1499.     CALL    BSCN    ;SCAN BACK
  1500.     LHLD    NSCN    ;GET ADDRESS OF NEXT TOKEN
  1501.     MOV    A,M    ;GET IT
  1502.     CPI    '('+80H    ;CHECK IT
  1503.     JNZ    EVEXZ    ;NOPE
  1504.     LHLD    TSCN    ;TIME TO CHANGE THE FIRST CHARACTER
  1505.     DCX    H    ;GET ONE BACK
  1506.     MVI    M,0    ;CLEAR IT
  1507.     SHLD    TSCN    ;SAVE THE ADDRESS
  1508.     MVI    A,16    ;ARRAY CODE
  1509.     JMP    EVEXY    ;SKIP
  1510. EVEXZ    LHLD    TSCN    ;GET IT AGAIN
  1511.     MVI    A,2    ;VARIABLE ID BYTE
  1512. EVEXY    CALL    GTNM    ;GET SYMBOL NUMBER
  1513.     PUSH    B    ;SAVE BC
  1514.     MVI    B,17H    ;ERROR TYPE
  1515.     JC    ERROR    ;CAN'T USE A STATEMENT FOR A VARIABLE, DUMMY.
  1516.     POP    B    ;RESTORE BC
  1517.     POP    H    ;GET SLIN BACK
  1518.     MVI    M,2    ;STORE OPCODES AND SYMBOL NUMBER
  1519.     INX    H
  1520.     MOV    M,C
  1521.     INX    H
  1522.     MOV    M,B
  1523.     INX    H
  1524.     MVI    M,3
  1525.     INX    H
  1526.     POP    D    ;GET EVERY THING ELSE BACK
  1527.     POP    B
  1528. EVEX7    MVI    C,2    ;SET C TO "LABEL LAST"
  1529.     JMP    EVEX1    ;LOOP FOR ANOTHER TOKEN
  1530. EVEX5    POP    H    ;GET IT ALL BACK
  1531.     POP    D
  1532.     POP    B
  1533.     CALL    EVEXG    ;CHECK FOR TWO LABELS IN A ROW
  1534.     PUSH    B    ;STUFF IT ALL BACK
  1535.     PUSH    D
  1536.     MVI    M,4    ;STORE OPCODES AND NUMBER
  1537.     LXI    D,TMP10    ;LOCATION OF TRANSLATED NUMBER
  1538.     XCHG        ;GET IT TO THE RIGHT PLACE
  1539.     INX    D    ;UPDATE SLIN
  1540.     LXI    B,6    ;NUMBER OF BYTES
  1541.     CALL    MOVE    ;MOVE IT IN
  1542.     XCHG        ;GET SLIN BACK TO HL
  1543.     DAD    B    ;ADD 6
  1544.     MVI    M,5    ;OPCODE
  1545.     INX    H    ;UPDATE SLIN
  1546.     JMP    EVEX7-2    ;POP THE REST AND LOOP
  1547. EVEXG    MOV    A,B    ;SAVE STACK COUNT
  1548.     MVI    B,15H    ;ERROR
  1549.     DCR    C    ;CHECK FOR C=2
  1550.     DCR    C
  1551.     JZ    ERROR    ;TWO IN A ROW, STUPID
  1552.     MOV    B,A    ;PUT STACK BACK
  1553.     RET        ;DONE
  1554. EVEX4    POP    H    ;GET 'EM ALL BACK
  1555.     POP    D
  1556.     POP    B
  1557.     CALL    EVEXG    ;CHECK FOR C=2
  1558.     PUSH    B    ;SAVE SOME
  1559.     PUSH    D
  1560.     PUSH    H
  1561.     CALL    BSCN    ;SCAN BACK, JACK
  1562.     LHLD    NSCN    ;GET QUOTE ADDRESS
  1563.     PUSH    H    ;SAVE ADDRESS
  1564.     CALL    BSCN
  1565.     POP    H    ;RESTORE ADDRESS
  1566.     POP    D    ;GET SLIN BACK
  1567.     XCHG        ;PUT IN THE RIGHT PLACE
  1568.     MVI    M,0    ;STORE START STRING CODE
  1569. EVEXH    INX    H    ;UPDATE
  1570.     INX    D
  1571.     LDAX    D    ;GET A CHARACTER
  1572.     ANI    7FH    ;STRIP OFF UPPER BIT
  1573.     CPI    '"'    ;IS IT A QUOTE?
  1574.     JZ    EVEXI    ;YUP
  1575.     LDAX    D    ;IS IT THE LAST ONE?
  1576.     ANA    A    ;SET FLAGS
  1577.     MOV    M,A    ;STUFF IT IN MEMORY
  1578.     JP    EVEXH    ;IT'S OKAY, GET ANOTHER ONE
  1579.     INX    H    ;CORRECTION FACTOR
  1580. EVEXI    DCX    H    ;GET LAST CHARACTER
  1581.     MOV    A,M    ;GOT IT
  1582.     ANA    A
  1583.     JNZ    EV00
  1584.     INX    H
  1585.     MVI    A,0H
  1586. EV00    ORI    80H    ;SET UPPER BIT
  1587.     MOV    M,A    ;SET IT BACK
  1588.     INX    H    ;GET NEXT ADDRESS
  1589.     MVI    M,1    ;END OF STRING MARKER
  1590.     INX    H    ;NEXT SLIN
  1591.     XCHG        ;GET QUOTE ADDRESS TO HL
  1592.     SHLD    NSCN    ;SET NSCN
  1593.     MOV    A,M    ;GET A BYTE
  1594.     ANA    A    ;SET FLAGS
  1595.     JP    EVEXN    ;WASN'T THE END
  1596.     MVI    A,1    ;SET ESCN IF THE END HAS STRUCK
  1597.     STA    ESCN
  1598. EVEXN    MVI    M,'"'+80H    ;SET UPPER BIT
  1599.     PUSH    D    ;SAVE IT
  1600.     CALL    USCN    ;SCAN UP ONE TO PUT THINGS RIGHT
  1601.     POP    D
  1602.     XCHG        ;PUT THINGS RIGHT
  1603.     JMP    EVEX7-2    ;LOOP FOR MORE CHARACTERS
  1604. EVEX3    POP    H    ;GET 'EM ALL BACK
  1605.     POP    D
  1606.     POP    B
  1607.     CPI    20H    ;CHECK FOR "("
  1608.     JZ    EVEX8    ;IT WAS, INDEED
  1609.     CPI    21H    ;CHECK FOR ")"
  1610.     JZ    EVEX9    ;THERE YOU GO
  1611.     DCR    C    ;CHECK FOR C=1
  1612.     JNZ    EVEXW    ;IT WASN'T
  1613.     CPI    12H    ;IS IT "NOT"?
  1614.     JNZ    EVEXJ    ;NOPE
  1615.     INR    C    ;INDICATE IT
  1616.     MVI    A,1EH    ;UNARY NOT
  1617. EVEXJ    CPI    19H    ;IS IT "-"?
  1618.     JNZ    EVEXK    ;NOPE
  1619.     INR    C    ;INDICATE IT
  1620.     MVI    A,1DH    ;CONVERT TO UNARY MINUS
  1621. EVEXK    CPI    40H    ;SEE IF IT IS A FUNCTION
  1622.     JM    EVEXM    ;NOPE
  1623.     INR    C    ;INDICATE IT
  1624. EVEXM    DCR    C    ;SEE IF C=0
  1625.     JM    EVEXB    ;SURE WAS
  1626. EVEXW    MOV    C,A    ;SAVE THE CHARACTER
  1627. EVEXA    DCR    B    ;CHECK FOR STACK EMPTY
  1628.     INR    B
  1629.     JZ    EVEXC    ;SURE WAS
  1630.     LDAX    D    ;GET TOP OF STACK
  1631.     CPI    20H    ;SEE IF IT'S A "("
  1632.     JZ    EVEXC    ;YUP
  1633.     CPI    19H    ;CHECK FOR A MINUS SIGN
  1634.     JNZ    QQQQ    ;NOPE
  1635.     INR    A    ;YES, SO CHANGE PRECEDENCE CODE
  1636.     INR    A
  1637. QQQQ    DCR    A
  1638.     CMP    C    ;CHECK PRECEDENCE
  1639.     JC    EVEXC    ;NEW ONE IS HIGHER
  1640.     LDAX    D    ;GET TOP OF STACK
  1641.     MOV    M,A    ;STORE THE CHARACTER
  1642.     DCR    B    ;UPDATE STACK POINTERS
  1643.     INX    D
  1644.     INX    H    ;UPDATE SLIN
  1645.     JMP    EVEXA    ;LOOP TO TRY AGAIN
  1646. EVEXB    CPI    1AH    ;IS IT A '+'?
  1647.     JZ    EVEXE    ;YUP, SO IGNORE IT
  1648.     MVI    B,14H    ;UH, OH, ERROR
  1649.     JMP    ERROR
  1650. EVEXC    MOV    A,C    ;CHARACTER TO A
  1651.     DCX    D    ;UPDATE STACK POINTERS
  1652.     INR    B
  1653.     STAX    D    ;PUSH ONTO STACK
  1654. EVEXE    MVI    C,1    ;SET OPERATOR LAST
  1655.     JMP    EVEX1    ;LOOP FOR ANOTHER TOKEN
  1656. EVEX8    DCR    C    ;CHECK FOR C=2
  1657.     DCR    C
  1658.     JNZ    EVEXD    ;NOPE
  1659.     LDAX    D    ;GET TOP OF STACK
  1660.     CPI    36H    ;IS IT FUNCTION OPERATOR?
  1661.     JZ    EVEXD    ;YUP
  1662.     MVI    A,34H    ;ARRAY OPERATOR
  1663.     DCX    D    ;UPDATE STACK POINTERS
  1664.     INR    B    ;ONE MORE ON STACK
  1665.     STAX    D    ;STUFF IT ON
  1666. EVEXD    MVI    A,20H    ;GET CODE FOR "("
  1667.     DCX    D    ;UPDATE STACK POINTERS
  1668.     INR    B
  1669.     STAX    D    ;STUFF IT ON THE STACK
  1670.     JMP    EVEXE    ;LOOP FOR ANOTHER TOKEN
  1671. EVEX9    INR    B    ;CHECK FOR EMPTY STACK
  1672.     DCR    B
  1673.     PUSH    B    ;SAVE 'EM
  1674.     MVI    B,12H    ;ERROR TYPE
  1675.     JZ    ERROR    ;WE SEEM TO HAVE NOT ENOUGH LEFT PARENS
  1676.     POP    B    ;GET 'EM BACK
  1677.     LDAX    D    ;GET OPERATOR ON TOP OF STACK
  1678.     INX    D    ;UPDATE STACK POINTERS
  1679.     DCR    B
  1680.     CPI    20H    ;IS IT A "("
  1681.     JZ    EVEX7    ;YUP, SO LOOP FOR ANOTHER TOKEN
  1682.     MOV    M,A    ;NOPE, SO STICK IT ON THE POLISH STRING
  1683.     INX    H    ;UPDATE SLIN
  1684.     JMP    EVEX9    ;LOOP TO CHECK NEXT TOP OF STACK
  1685. EVEX2    POP    H    ;RESTORE ALL
  1686.     POP    D
  1687.     POP    B
  1688. EVEXU    INR    B    ;CHECK FOR EMPTY STACK
  1689.     DCR    B    
  1690.     JZ    EVEXF    ;ALL DONE!!
  1691.     LDAX    D    ;GET TOP OF STACK
  1692.     INX    D    ;UPDATE POINTERS
  1693.     DCR    B
  1694.     CPI    20H    ;IS IT "("?
  1695.     PUSH    B    ;SAVE 'EM
  1696.     MVI    B,13H    ;ERROR TYPE
  1697.     JZ    ERROR    ;TOO MANY LEFT PARENS
  1698.     POP    B    ;GET 'EM BACK
  1699.     MOV    M,A    ;STICK IT ON THE POLISH STRING
  1700.     INX    H    ;UPDATE SLIN
  1701.     JMP    EVEXU    ;TRY NEXT CHARACTER
  1702. EVEXF    MVI    M,9    ;STORE END OF EXPRESSION CHARACTER
  1703.     DCX    H    ;CHECK FOR NO EXPRESSION
  1704.     MOV    A,M    ;GET A BYTE
  1705.     CPI    9    ;CHECK FOR BEGINNING OF EXPRESSION
  1706.     SHLD    SLIN    ;SAVE SLIN
  1707.     RZ        ;DONE
  1708.     INX    H
  1709.     INX    H    ;UPDATE SLIN
  1710.     SHLD    SLIN    ;SAVE IT
  1711.     RET        ;DONE..
  1712. COJMP    DW    PCAD
  1713.     DW    CLER
  1714.     DW    PCLS
  1715.     DW    PCNT
  1716.     DW    PCSS
  1717.     DW    DLTE
  1718.     DW    ENTR
  1719.     DW    LIST
  1720.     DW    PNEW
  1721.     DW    PRUN
  1722.     DW    EDIT
  1723.     DW    PRSY
  1724.     DW    0
  1725. CONS3    DB    2    ;ID BYTE FOR 65536
  1726.     DB    0
  1727.     DB    0
  1728.     DB    06H
  1729.     DB    55H
  1730.     DB    36H
  1731. ETBLE    DB    03    ;POWERS OF E (1)
  1732.     DB    0
  1733.     DB    27H
  1734.     DB    18H
  1735.     DB    28H
  1736.     DB    18H
  1737.     DB    3    ; (2)
  1738.     DB    0
  1739.     DB    73H
  1740.     DB    89H
  1741.     DB    05H
  1742.     DB    61H
  1743.     DB    3    ; (4)
  1744.     DB    01H
  1745.     DB    54H
  1746.     DB    59H
  1747.     DB    81H
  1748.     DB    50H
  1749.     DB    3    ; (8)
  1750.     DB    03H
  1751.     DB    29H
  1752.     DB    80H
  1753.     DB    95H
  1754.     DB    80H
  1755.     DB    3    ; (16)
  1756.     DB    06H
  1757.     DB    88H
  1758.     DB    86H
  1759.     DB    11H
  1760.     DB    05H
  1761.     DB    3    ; (32)
  1762.     DB    13H
  1763.     DB    78H
  1764.     DB    96H
  1765.     DB    29H
  1766.     DB    60H
  1767.     DB    3    ; (64)
  1768.     DB    27H
  1769.     DB    62H
  1770.     DB    35H
  1771.     DB    14H
  1772.     DB    91H
  1773.     DB    3    ; (128)
  1774.     DB    55H
  1775.     DB    38H
  1776.     DB    87H
  1777.     DB    70H
  1778.     DB    84H
  1779. * RTN. B.49
  1780. * E RAISED TO THE X'TH POWER
  1781. * (HL) = X, (DE) IS WHERE ANSWER GOES
  1782. * ANY X SUCH THAT -K<X<K, WHERE
  1783. * K IS LN(9.9999999E 99)
  1784. ETOX    PUSH    D    ;SAVE DESTINATION ADDRESS
  1785.     LXI    D,TMP1    ;SET UP TO MOVE INTO TMP1
  1786.     PUSH    D    ;SAVE LOCATIONS
  1787.     PUSH    H    
  1788.     CALL    ABSLT    ;ABSOLUTE VALUE TO TMP1
  1789.     POP    H    ;RESTORE LOCATIONS
  1790.     POP    D
  1791.     MOV    A,M    ;GET STARTING ID BYTE
  1792.     ANI    80H    ;STRIP OFF MANTISSA SIGN BIT
  1793.     STA    SIGNF    ;SAVE IT
  1794.     XCHG        ;GET TMP1 ADDRESS TO HL
  1795.     CALL    BCDB    ;CONVERT TO BINARY
  1796.     LXI    D,231    ;CHECK SIZE OF EXPONENT
  1797.     CALL    CMP16    ;COMPARE
  1798.     JNC    ETOX1    ;OVERFLOW ERROR
  1799.     PUSH    H    ;SAVE THE NUMBER
  1800.     LXI    H,ONE11    ;INITIALIZE TMP8 TO A 1
  1801.     LXI    D,TMP8
  1802.     LXI    B,6
  1803.     CALL    MVDN
  1804.     POP    B    ;GET THE NUMBER BACK IN BC
  1805.     MVI    B,1    ;SET MASK
  1806.     LXI    H,ETBLE    ;SET HL TO BEGINNING OF POWERS OF E
  1807. ETOX3    MOV    A,B    ;A=B AND C
  1808.     ANA    C
  1809.     JZ    ETOX2    ;SKIP IF BIT WAS A ZERO
  1810.     PUSH    B    ;SAVE MASK AND NUMBER
  1811.     PUSH    H    ;SAVE INDEX
  1812.     LXI    D,TMP8    ;TMP8=TMP8*E TO THE 2 TO THE N'TH
  1813.     MOV    B,D
  1814.     MOV    C,E
  1815.     CALL    MULER    ;MULTIPLY
  1816.     POP    H    ;RESTORE INDEX
  1817.     POP    B    ;AND MASK, AND NUMBER
  1818. ETOX2    MVI    A,6    ;HL=HL+6
  1819.     CALL    ADHL
  1820.     MOV    A,B    ;LEFT SHIFT THE MASK
  1821.     RLC
  1822.     MOV    B,A
  1823.     JNC    ETOX3    ;LOOP FOR MORE INTEGER PORTION
  1824.     LXI    H,TMP1    ;TMP1=TMP1-TMP9
  1825.     LXI    D,TMP9
  1826.     MOV    B,H
  1827.     MOV    C,L
  1828.     PUSH    H    ;SAVE ADDRESSES
  1829.     PUSH    D
  1830.     CALL    SUBER    ;SUBTRACT
  1831.     POP    D    ;RESTORE ADDRESSES
  1832.     POP    H
  1833.     LXI    B,6    ;NUMBER OF BYTES
  1834.     CALL    MVDN    ;TMP9=TMP1
  1835.     LXI    H,ONE11    ;TMP2=TMP3=TMP5=1
  1836.     LXI    D,TMP2
  1837.     CALL    MVDN
  1838.     LXI    D,TMP5
  1839.     CALL    MVDN
  1840.     LXI    D,TMP3
  1841.     LXI    H,CON99
  1842.     CALL    MVDN
  1843. ETOX4    LXI    H,TMP1    ;TMP6=TMP1/TMP3
  1844.     LXI    D,TMP3
  1845.     LXI    B,TMP6
  1846.     CALL    DIVER    ;DIVIDE
  1847.     CALL    TRMN1    ;CHECK FOR DONENESS
  1848.     JC    ETOX5    ;OK, WE'RE DONE
  1849.     CALL    FCTRL    ;COMPUTE NEXT FACTORIAL TERM
  1850.     LXI    H,TMP9    ;TMP1=TMP1*TMP9
  1851.     LXI    D,TMP1
  1852.     MOV    B,D
  1853.     MOV    C,E
  1854.     CALL    MULER    ;MULTIPLY
  1855.     LXI    H,TMP6    ;TMP5=TMP5+TMP6
  1856.     LXI    D,TMP5
  1857.     MOV    B,D
  1858.     MOV    C,E
  1859.     CALL    ADDER    ;ADD
  1860.     JMP    ETOX4    ;LOOP FOR ANOTHER TERM
  1861. ETOX5    LXI    H,TMP5    ;TMP5=TMP5*TMP8
  1862.     LXI    D,TMP8
  1863.     MOV    B,H
  1864.     MOV    C,L
  1865.     CALL    MULER    ;MULTIPLY
  1866.     LDA    SIGNF    ;CHECK FOR MINUS
  1867.     ANA    A    ;SET FLAGS
  1868.     POP    B    ;RESTORE DESTINATION
  1869.     LXI    H,ONE11    ;(BC)=1/TMP8 OR TMP8/1
  1870.     LXI    D,TMP5
  1871.     JNZ    ETOX6    ;SKIP IF IT WAS NEGATIVE
  1872.     XCHG        ;SWAP ADDRESSES
  1873. ETOX6    CALL    DIVER    ;DIVIDE
  1874.     RET        ;DONE..
  1875. ETOX1    MVI    B,4    ;EXPONENT TOO LARGE ((((ERROR))))
  1876.     JMP    ERROR
  1877. * RTN. B.50
  1878. * LN(HL) TO (DE)
  1879. * NEGATIVE (HL) WILL PRODUCE AN ERROR
  1880. LOGX    PUSH    D    ;SAVE DESTINATION
  1881.     PUSH    H    ;SAVE SOURCE
  1882.     LXI    D,ZERO0    ;COMPARE WITH ZERO
  1883.     CALL    CMPR
  1884.     POP    H    ;RESTORE SOURCE
  1885.     MVI    B,2    ;ERROR TYPE JUST IN CASE
  1886.     JZ    ERROR    ;SURE WAS!!
  1887.     LXI    D,TMP1    ;TMP1=(HL)
  1888.     LXI    B,6
  1889.     CALL    MVDN
  1890.     LDAX    D    ;GET ID BYTES
  1891.     ANI    80H    ;STRIP OFF MANTISSA SIGN BIT
  1892.     JNZ    LOGX3    ;OH, OH, WE'VE GOT AN ERROR
  1893.     MVI    B,80H    ;SET UP MASK
  1894.     MVI    C,0    ;CLEAR INTEGER PORTION OF LOG
  1895.     LXI    D,ETBLE+42    ;SET UP INDEX
  1896. LOGX1    LXI    H,TMP1    ;SET UP FOR COMPARE
  1897.     PUSH    H    ;SAVE ALL THESE SILLY REGISTERS
  1898.     PUSH    B
  1899.     PUSH    D
  1900.     CALL    CMPR    ;COMPARE
  1901.     POP    D    ;RESTORE ALL VALUES
  1902.     POP    B
  1903.     POP    H
  1904.     JC    LOGX2    ;SKIP IF IT DON'T FIT
  1905.     PUSH    D    ;SAVE 'EM AGAIN
  1906.     PUSH    B
  1907.     MOV    B,H
  1908.     MOV    C,L
  1909.     CALL    DIVER    ;DIVIDE
  1910.     POP    B    ;RESTORE THE REGISTERS, PLEASE
  1911.     POP    D
  1912.     MOV    A,C    ;C=B OR C
  1913.     ORA    B
  1914.     MOV    C,A
  1915. LOGX2    XCHG        ;HL=DE
  1916.     LXI    D,6    ;SET UP FOR
  1917.     CALL    SUB16    ;SUBTRACT
  1918.     XCHG        ;DE=HL
  1919.     MOV    A,B    ;GET THE MASK
  1920.     RRC        ;RIGHT SHIFT IT
  1921.     MOV    B,A
  1922.     JNC    LOGX1    ;LOOP IF THERE ARE MORE BITS TO DO
  1923.     MOV    L,C    ;CONVERT C TO A NUMBER
  1924.     MVI    H,0
  1925.     LXI    D,TMP7
  1926.     CALL    BBCD    ;CONVERT
  1927.     LXI    H,ZERO0    ;TMP5=0
  1928.     LXI    D,TMP5
  1929.     LXI    B,6
  1930.     CALL    MVDN
  1931.     LXI    H,TMP1    ;TMP9=TMP1-1
  1932.     LXI    D,ONE11    
  1933.     LXI    B,TMP9
  1934.     PUSH    H    ;SAVE SOME
  1935.     PUSH    D
  1936.     CALL    SUBER    ;SUBTRACT
  1937.     POP    D    ;GET 'EM BACK
  1938.     POP    H
  1939.     MOV    B,H    ;TMP1=TMP1+1
  1940.     MOV    C,L
  1941.     PUSH    H    ;SAVE AGAIN
  1942.     CALL    ADDER    ;ADD
  1943.     POP    H    ;GET TMP1 ADDRESS
  1944.     MOV    B,H
  1945.     MOV    C,L
  1946.     LXI    D,TMP9    ;TMP1=TMP9/TMP1
  1947.     XCHG        ;GET ADDRESSES RIGHT PLACE
  1948.     PUSH    B    ;SAVE TMP1 ADDRESS
  1949.     CALL    DIVER    ;DIVIDE
  1950.     POP    H    ;GET TMP1 ADDRESS
  1951.     MOV    D,H
  1952.     MOV    E,L
  1953.     LXI    B,TMP4    ;TMP4=TMP1*TMP1
  1954.     CALL    MULER    ;MULTIPLY
  1955.     LXI    H,ONE11    ;TMP2=1
  1956.     LXI    D,TMP2
  1957.     LXI    B,6
  1958.     CALL    MVDN
  1959. LOGX4    LXI    H,TMP1    ;TMP6=TMP1/TMP2
  1960.     LXI    D,TMP2
  1961.     LXI    B,TMP6
  1962.     CALL    DIVER    ;DIVIDE
  1963.     CALL    TRMN1    ;CHECK FOR DONENESS
  1964.     JC    LOGX5    ;OK, WE'RE DONE
  1965.     LXI    H,TWO22    ;TMP2=TMP2+2
  1966.     LXI    D,TMP2
  1967.     MOV    B,D
  1968.     MOV    C,E
  1969.     CALL    ADDER    ;ADD
  1970.     LXI    H,TMP1    ;TMP1=TMP1*TMP4
  1971.     LXI    D,TMP4
  1972.     MOV    B,H
  1973.     MOV    C,L
  1974.     CALL    MULER    ;MULTIPLY
  1975.     LXI    H,TMP5    ;TMP5=TMP5+TMP6
  1976.     LXI    D,TMP6
  1977.     MOV    B,H
  1978.     MOV    C,L
  1979.     CALL    ADDER    ;ADD
  1980.     JMP    LOGX4    ;LOOP FOR ANOTHER TERM
  1981. LOGX5    LXI    H,TWO22    ;TMP5=TMP5*2
  1982.     LXI    D,TMP5
  1983.     MOV    B,D
  1984.     MOV    C,E
  1985.     CALL    MULER    ;MULTIPLY
  1986.     LXI    H,TMP7    ;(BC)=TMP7+TMP5
  1987.     LXI    D,TMP5
  1988.     POP    B
  1989.     CALL    ADDER    ;ADD
  1990.     RET        ;DONE,DONE,DONE
  1991. LOGX3    MVI    B,6    ;ERROR TYPE 6
  1992.     JMP    ERROR    ;GO GET IT
  1993. * RTN. B.51
  1994. * SQUARE ROOT FUNCTION
  1995. * (DE)=SQR(HL)
  1996. * RTN. B.52
  1997. * POWERS
  1998. * (BC) = (HL) TO THE (DE) POWER
  1999. * (HL) CANNOT BE NEGATIVE
  2000. PWRS    PUSH    B    ;SAVE DESTINATION
  2001.     PUSH    D    ;SAVE EXPONENT
  2002.     PUSH    H    ;SAVE SOURCE
  2003.     LXI    D,ZERO0    ;CHECK FOR ZERO
  2004.     CALL    CMPR
  2005.     POP    H    ;RESTORE SOURCE
  2006.     JZ    PWRSM    ;IT'S A ZERO
  2007.     XTHL        ;GET EXPONENT TO HL
  2008.     PUSH    H    ;SAVE SOURCE AGAIN
  2009.     LXI    D,HNDRD    ;CHECK FOR LESS THAN A HUNDRED
  2010.     CALL    CMPR    ;COMPARE
  2011.     POP    H    ;RESTORE THE SOURCE
  2012.     XTHL        ;GET SOURCE BACK TO HL
  2013.     JC    PWRS1    ;LESS THAN ONE HUNDRED
  2014. PWRS2    LXI    D,TMP10    ;TMP10=LN(HL)
  2015.     CALL    LOGX
  2016.     POP    D    ;GET BACK EXPONENT
  2017.     LXI    H,TMP10    ;TMP10=TMP10*(DE)
  2018.     MOV    B,H
  2019.     MOV    C,L
  2020.     CALL    MULER    ;MULTIPLY
  2021.     POP    D    ;GET DESTINATION BACK
  2022.     LXI    H,TMP10    ;(DE)=ETOX(TMP10)
  2023.     CALL    ETOX
  2024.     RET        ;DONE....
  2025. * RTN. B.30
  2026. * MATCHER - CONVERTS (HL) AND (DE) TO THE SAME
  2027. * FORM, FLOATING POINT OR INTEGER, FOR LATER MATH
  2028. * FUNCTIONS. IF THEY ARE BOTH FLOATING POINT, 
  2029. * CARRY IS SET ON EXIT.
  2030. MATCH    LDAX    D    ;GET ONE ID BYTE
  2031.     XRA    M    ;GET BITS DIFFERENT IN THE TWO
  2032.     ANI    1    ;STRIP ALL BUT FLOATING/INTEGER BIT
  2033.     MOV    A,M    ;GET AN ID BYTE
  2034.     JNZ    MTCH1    ;SKIP IF THEY ARE DIFFERENT
  2035.     RRC        ;SET CARRY ACCORDING TO FORM
  2036.     RET        ;NON-CONVERSION EXIT
  2037. MTCH1    ANI    1    ;WHAT IS (HL)'S FORM?
  2038.     STC        ;SET CARRY FOR LATER
  2039.     PUSH    PSW    ;SAVE STATUS ON STACK
  2040.     JZ    MTCH2    ;SKIP IF (HL) IS ALREADY THE INTEGER
  2041.     XCHG        ;MAKE (HL) THE INTEGER
  2042. MTCH2    PUSH    D    ;SAVE REGISTERS
  2043.     PUSH    B
  2044.     LXI    D,TMP11    ;GET WORKING REGISTER ADDRESS
  2045.     CALL    INFL    ;CONVERT INTEGER TO FLOATING POINT
  2046.     POP    B    ;RESTORE REGISTERS
  2047.     POP    D
  2048.     LXI    H,TMP11
  2049.     POP    PSW    ;GET STATUS BACK
  2050.     RZ        ;RETURN IF NO SWAP WAS MADE
  2051.     XCHG        ;PUT EVERYTHING BACK TO NORMAL
  2052.     RET        ;DONE
  2053. * RTN. B.31
  2054. * MATH ERROR PROCESSOR
  2055. * CHECK TO SEE IF MERR IS SET, IF NOT, RETURNS
  2056. * IF IT IS, JUMPS TO ERROR WITH THE APPROPRIATE
  2057. * ERROR NUMBER IN B
  2058. MCHK    LDA    MERR    ;GET MERR TO A
  2059.     ANI    07H    ;CHECK FOR A BIT SET
  2060.     RZ        ;RETURN IF NONE
  2061.     MVI    B,1    ;PRESET COUNTER
  2062. MCHK1    RRC        ;LSB TO CARRY
  2063.     JC    ERROR    ;FOUND THE BIT
  2064.     INR    B    ;UPDATE COUNTER
  2065.     JMP    MCHK1    ;LOOP FOR NEXT BIT
  2066. * RTN. B.32
  2067. * ERROR PROCESSOR
  2068. * ASSUMES ERROR TYPE NUMBER TO BE IN "B"
  2069. ERROR    LXI    H,EMSG    ;GET ADDRESS OF ERROR MESSAGE
  2070.     MOV    A,B    ;CHECK FOR CASSETTE LOAD ERROR
  2071.     CPI    23H
  2072.     JZ    ERROR1    ;NOPE
  2073.     LDA    CSST    ;CASSETTE MODE?
  2074.     ANA    A
  2075.     JZ    ERROR1    ;NOPE
  2076.     LDA    CMND    ;ENTER MODE?
  2077.     ANA    A
  2078.     JNZ    ERROR1    ;NOPE
  2079.     LHLD    FRAV    ;SET UP TO TURN IT INTO A REMARK
  2080.     SHLD    SLIN    ;RESET CODED LINE
  2081.     MVI    A,86H    ;STORE AS REMARK OPCODE
  2082.     CALL    ICBY
  2083.     MVI    A,35H    ;SEND SINGLE QUOTE CODE
  2084.     CALL    ICBY    ;SEND IT
  2085. ERROR2    LHLD    NSCN    ;BACK UP TO START
  2086.     XCHG
  2087.     LHLD    CASER
  2088.     CALL    CMP16
  2089.     JZ    ERROR3
  2090.     CALL    BSCN
  2091.     JMP    ERROR2
  2092. ERROR3    CALL    BSCN
  2093.     LXI    SP,STACK+100    ;RESET THE STACK
  2094.     LXI    H,EXEC3+3    ;SET RETURN ADDRES
  2095.     PUSH    H
  2096.     XRA    A    ;CLEAR STFLAG
  2097.     STA    STFLG
  2098.     LHLD    CASER    ;SET UP TO DECODE THIS MESS
  2099.     XCHG
  2100.     JMP    PREM2+1    ;DO IT TO IT!!
  2101. ERROR1    XRA    A    ;CLEAR ANY CASSETTE MODE
  2102.     STA    BFLAG
  2103.     STA    CSST
  2104.     STA    CATV
  2105.     STA    EDITM    ;CLEAR ANY EDIT MODE
  2106.     LXI    H,0    ;CLEAR ANY DUMP MEMORY MODE
  2107.     SHLD    DMPMM
  2108.     MOV    A,B    ;CONVERT TO BINARY
  2109.     CALL    BCDBN
  2110.     LXI    H,ERMST    ;START OF MESSAGE TABLE
  2111.     DCR    A    ;CORRECT THE COUNT
  2112. ERROA    ANA    A    ;CHECK FOR DONENESS
  2113.     JZ    ERROB    ;SURE IS
  2114.     CALL    COUNT    ;GET NEXT MESSAGE
  2115.     DAD    D
  2116.     DCR    A    ;UPDATE COUNT
  2117.     JMP    ERROA
  2118. ERROB    PUSH    H
  2119.     CALL    CRLF
  2120.     POP    H
  2121.     CALL    MSGER    ;SEND IT OUT
  2122.     LXI    H,EMSG    ;SEND REST OF IT
  2123.     CALL    MSGER
  2124.     CALL    LNDSC    ;SEND THE LINE DESCRIPTOR
  2125.     XRA    A    ;CLEAR RUN MODE
  2126.     STA    RUNF
  2127.     JMP    EDI96    ;CHECK FOR POSSIBLE EDIT RE-ENTRY.
  2128. * RTN. B.33
  2129. * ADDER 
  2130. * (BC) = (HL) + (DE)
  2131. ADDER    CALL    MATCH    ;CHECK FORM
  2132.     PUSH    PSW    ;SAVE CARRY
  2133.     CC    FPADD    ;FLOATING POINT ADDITION
  2134.     POP    PSW    ;RESTORE CARRY
  2135.     CNC    IADD    ;INTEGER ADDITION
  2136.     JMP    MCHK    ;LOOK FOR ERRORS
  2137. * RTN. B.34
  2138. * SUBTRACTER
  2139. * (BC) = (HL) - (DE)
  2140. SUBER    CALL    MATCH    ;CHECK FORM
  2141.     PUSH    PSW    ;SAVE CARRY
  2142.     CC    FPSUB    ;FLOATING POINT SUBTRACTION
  2143.     POP    PSW    ;RESTORE CARRY
  2144.     CNC    ISUB    ;INTEGER SUBTRACTION
  2145.     JMP    MCHK    ;LOOK FOR ERRORS
  2146. * RTN. B.35
  2147. * MULTIPLIER
  2148. * (BC) = (HL) TIMES (DE)
  2149. MULER    CALL    MATCH    ;CHECK FORM
  2150.     PUSH    PSW    ;SAVE CARRY
  2151.     CC    FLML    ;FLOATING POINT MULTIPLICATION
  2152.     POP    PSW    ;RESTORE CARRY
  2153.     CNC    IMUL    ;INTEGER MULTIPLICATION
  2154.     JMP    MCHK    ;LOOK FOR ERRORS
  2155. * RTN. B.36
  2156. * DIVIDER
  2157. * (BC) = (HL) DIVIDED BY (DE)
  2158. DIVER    CALL    MATCH    ;CHECK FORM
  2159.     PUSH    PSW    ;SAVE CARRY
  2160.     CC    DIV2A    ;FLOATING POINT DIVISION
  2161.     POP    PSW    ;RESTORE CARRY
  2162.     CNC    IDIV    ;INTEGER DIVISION
  2163.     JMP    MCHK    ;LOOK FOR ERRORS
  2164. EMSG    DB    ' ERROR IN',' '+80H
  2165. ERMST    DB    'OVRFL','W'+80H
  2166.     DB    'UNDRFL','W'+80H
  2167.     DB    '/','0'+80H
  2168.     DB    'EX >','>'+80H
  2169.     DB    'BIN CON >','>'+80H
  2170.     DB    '-LO','G'+80H
  2171.     DB    'STATE N','M'+80H
  2172.     DB    'COM','M'+80H
  2173.     DB    'VRBL AS STAT','E'+80H
  2174.     DB    'SYNTA','X'+80H
  2175.     DB    'VRBL N','M'+80H
  2176.     DB    '>> ',')'+80H
  2177.     DB    '>> ','('+80H
  2178.     DB    '2 OPER','S'+80H
  2179.     DB    '2 OPAND','S'+80H
  2180.     DB    'ILGL FUN','C'+80H
  2181.     DB    'STATE AS VRB','L'+80H
  2182.     DB    'NEW SYM','B'+80H
  2183.     DB    'NO T','O'+80H
  2184.     DB    'DUPL STAT','E'+80H
  2185.     DB    'DUPL DE','F'+80H
  2186.     DB    'CAN',27H,'T CON','T'+80H
  2187.     DB    'TAP','E'+80H
  2188.     DB    'STRIN','G'+80H
  2189.     DB    'COMM','A'+80H
  2190.     DB    'OPRN','D'+80H
  2191.     DB    '<*MEM*','>'+80H
  2192.     DB    'UNDI','M'+80H
  2193.     DB    'SUBSCPT >','>'+80H
  2194.     DB    'SUBSCPT OVFL','W'+80H
  2195.     DB    'ASSIG','N'+80H
  2196.     DB    'STR AS NU','M'+80H
  2197.     DB    'NUM AS ST','R'+80H
  2198.     DB    'CNTRL STC','K'+80H
  2199.     DB    'ON GOT','O'+80H
  2200.     DB    '<< DAT','A'+80H
  2201.     DB    'RCV DAT','A'+80H
  2202.     DB    8DH
  2203.     DB    '- SQ','R'+80H
  2204.     DB    'LOGICA','L'+80H
  2205. PWRSM    POP    D    ;GET RID OF EXPONENT
  2206.     POP    D    ;GET THE DESTINATION
  2207.     LXI    B,6    ;SET UP TO MOVE IN THE ZERO
  2208.     CALL    MOVE    ;DO IT TO IT
  2209.     RET        ;ALL DONE
  2210. PWRS1    POP    B    ;GET EXPONENT
  2211.     POP    D    ;GET DESTINATION
  2212.     PUSH    H    ;SWAP BC AND HL
  2213.     PUSH    B
  2214.     POP    H
  2215.     POP    B
  2216.     PUSH    B
  2217.     PUSH    D
  2218.     PUSH    H
  2219.     LXI    D,TMP11    ;PLACE TO PUT IT
  2220.     CALL    INTG    ;GET THE INTEGER OF BASE
  2221.     POP    H    ;GET THE NUMBERS AGAIN
  2222.     LXI    D,TMP11    ;WHERE IT'S AT
  2223.     PUSH    H
  2224.     CALL    CMPR    ;SEE IF THEY ARE THE SAME
  2225.     POP    D
  2226.     POP    H
  2227.     XTHL
  2228.     PUSH    D
  2229.     JNZ    PWRS2    ;NOT AN INTEGER, PROCESS WITH LOGS
  2230.     PUSH    H    ;SAVE BASE
  2231.     LXI    H,ONEEE    ;PRESET TMP1
  2232.     LXI    D,TMP1
  2233.     LXI    B,6
  2234.     CALL    MOVE    ;MOVE IN A ONE (INTEGER FORM)
  2235.     POP    H    ;PRESET TMP2 TO COUNT
  2236.     XTHL
  2237.     LXI    D,TMP2
  2238.     CALL    MOVE
  2239. PWRS3    LXI    H,TMP2    ;CHECK FOR DONENESS
  2240.     LXI    D,ZERO0
  2241.     CALL    CMPR
  2242.     JZ    PWRS5    ;SURE IS
  2243.     POP    D    ;GET BASE
  2244.     PUSH    D    ;SAVE IT
  2245.     LXI    H,TMP1    ;GET CURRENT RESULT
  2246.     MOV    B,H
  2247.     MOV    C,L
  2248.     CALL    MULER    ;ANOTHER ITERATION
  2249.     LXI    H,TMP2    ;UPDATE THE COUNT
  2250.     LXI    D,ONEEE
  2251.     MOV    C,L
  2252.     MOV    B,H
  2253.     CALL    SUBER
  2254.     JMP    PWRS3    ;CHECK AGAIN FOR DONENESS
  2255. PWRS5    POP    D    ;CLEAN UP THE STACK
  2256.     POP    D    ;GET THE DESTINATION
  2257.     LXI    H,TMP1    ;GET THE SOURCE
  2258.     LXI    B,6    ;THE NUMBER OF BYTES
  2259.     JMP    MOVE    ;MOVE IT IN AND RETURN
  2260. SPRGSH    PUSH    D    ;SAVE IT
  2261.     LXI    D,1    ;PRESET
  2262. SPRGSH1    MOV    A,H    ;CHECK FOR DONE
  2263.     ORA    L
  2264.     JZ    SPRGSH2    ;YUP
  2265.     XCHG        ;SWAP
  2266.     DAD    H
  2267.     XCHG
  2268.     DCX    H
  2269.     JMP    SPRGSH1
  2270. SPRGSH2    XCHG
  2271.     POP    D
  2272.     RET        ;DONE
  2273. LINK3    LINK    B:TBASICA4
  2274.