home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol095 / crowe.z80 < prev    next >
Text File  |  1984-04-29  |  140KB  |  5,086 lines

  1. ;COPYRIGHT 1978 BY PAT CROWE
  2. ;**********************************************************************
  3. ;                   Z80 ASSEMBLER VERSION 1.1
  4. ;            WRITTEN BY PAT CROWE
  5. ;                       22 RINGSBURY CLOSE
  6. ;                       PURTON
  7. ;                       SWINDON
  8. ;                       SN5 9DE
  9. ;                       ENGLAND
  10. ;*************************************************************************
  11. ;CONSTANTS
  12. ;*************************************************************************
  13. CR    EQU    0DH            ; ASCII CARRIAGE RETURN
  14. LF    EQU    0AH            ; ASCII LINE FEED
  15. HT    EQU    09H            ; ASCII HORIZ. TAB
  16. FORMFD    EQU    0CH            ; ASCII FORM FEED
  17. NUL    EQU    0            ; ASCII NULL
  18. SPACE    EQU    20H            ; ASCII SPACE
  19. DEL    EQU    0FFH            ; ASCII DELETE
  20. CTOK    EQU    71H            ; TOKEN FOR UNCONDIT. OPND KW 'C'
  21. CCOND    EQU    8BH            ; TOKEN FOR CONDITIONAL OPND KW 'C'
  22. XYMASK    EQU    0FBH            ; MASK TO RECOGNISE IX/IY TOKENS
  23. IXORIY    EQU    1AH            ; COMMON VALUE OF IX/IY TOKENS
  24. INTTOK    EQU    90H            ; OPERAND TOKEN FOR 'INTEGER'
  25. ORGTOK    EQU    1            ; TOKEN FOR 'ORG' PSEUDO-OP
  26. EQUTOK    EQU    2            ; TOKEN FOR 'EQU' PSEUDO-OP
  27. DEFLTK    EQU    3            ; TOKEN FOR 'DEFL' PSEUDO-OP
  28. DEFSTK    EQU    7            ; TOKEN FOR 'DEFS' PSEUDO-OP
  29. TITTOK    EQU    09H            ; TOKEN FOR 'TITLE' PSEUDO-OP
  30. DEFMTK    EQU    08H            ; TOKEN FOR 'DEFM' PSUEDO-OP
  31. PLUTOK    EQU    07H            ; TOKEN FOR MONADIC PLUS
  32. MINTOK    EQU    0FH            ; TOKEN FOR MONADIC MINUS
  33. LBTOK    EQU    0B0H            ; TOKEN FOR '('
  34. EXPTOK    EQU    35H            ; TOKEN FOR EXPONENTIATION
  35. ASKTOK    EQU    3DH            ; TOKEN FOR MULTIPLY 
  36. MAXFSK    EQU    10D            ; MAX SIZE OF ARITHMETIC
  37.                     ; FUNCTION STACK
  38. MAXASK    EQU    20D            ; MAX SIZE OF ARITH STACK
  39. PLINES    EQU    66            ; NO OF LINES ON LIST DEVICE PAGE
  40. LBFSZ    EQU    64            ; LINE BUFFER CAPACITY
  41. ACBSIZ    EQU    32            ; SIZE OF ASSD CODE BUFFER
  42. TITSIZ    EQU    32            ; SIZE OF TITLE BUFFER
  43. RECSIZ    EQU    16            ; MAX NO OF DATA BYTES PER OBJ RECORD
  44. SPERL    EQU    5            ; NO OF SYMBOLS PER LINE
  45.                     ; IN SYMBOL TABLE LISTING
  46. STKSIZ    EQU    68            ; SIZE OF STACK
  47.  
  48. ;    CP/M LINKS
  49.  
  50. CPM    EQU    5        ;FDOS ENTRY
  51. BOOT    EQU    0        ;WARM START
  52. SETDMA    EQU    26        ;CP/M FUNCTION
  53. OPNFIL    EQU    15        ;OPEN FILE
  54. CLSFIL    EQU    16        ;CLOSE FILE
  55. DELFIL    EQU    19        ;DELETE FILE
  56. MAKFIL    EQU    22        ;CREATE FILE
  57. RDNR    EQU    20        ;READ NEXT RECORD
  58. WRNR    EQU    21        ;WRITE NEXT RECORD
  59. PRBUF    EQU    9        ;PRINT STRING ON CONSOLE
  60. DFCB    EQU    5CH        ;DEFAULT FCB
  61. DEFBUF    EQU    80H        ;DEFAULT BUFFER
  62. GETCON    EQU    0F009H        ;PFM-80 CONSOLE INPUT
  63. PUTCON    EQU    0F00CH        ;PFM-80 CONSOLE OUTPUT
  64. CTLZ    EQU    1AH        ;EOF CHARACTER
  65.  
  66. ;****************************************************************************
  67. ;START OF PROGRAM.
  68. ;I/O ROUTINE JUMP TABLE.
  69. ;THE USER SHOULD PLACE THE ADDRESSES OF HIS
  70. ;OWN I/O SUBROUTINES IN THE LOCATIONS IN
  71. ;THIS TABLE CONTAINING THE DESTINATIONS OF
  72. ;JP INSTRUCTIONS. ALL I/O IS PERFORMED VIA
  73. ;THIS TABLE.
  74. ;****************************************************************************
  75.     ORG    100H
  76. START:    JR MAIN                ; JUMP PAST JUMP TABLE
  77. CI:    JP CONIN             ; JUMP TO USER CONSOLE IN SUBR
  78. CO:    JP CONOUT            ; JUMP TO USER CONSOLE OUT SUBR
  79. LO:    JP LSTO              ; JUMP TO USER LIST OUT SUBR
  80. RI:    JP RDRIN             ; JUMP TO USER READER IN SUBR
  81. PCHO:    JP PCHOUT            ; JUMP TO USER PUNCH OUT SUBR
  82. MEMCHK:    JP MEMCK             ; JUMP TO USER MEM CHECK SUBR
  83. EXEC:    JP BOOT              ; JUMP TO USER MONITOR ENTRY POINT
  84. ;MAIN PROGRAM LOOP.
  85. ;****************************************************************************
  86. MAIN:   LD SP,0F900H            ; SET STACK POINTER
  87.     CALL INITA            ; INITIALIZE ASSEMBLER
  88.     CALL PHRLD            ; PRINT HERALD
  89. MAIN1:    CALL GTPNO            ; GET PASS NO.
  90.     JP Z,EXEC            ; RETURN TO SYSTEM MONITOR
  91.     LD A,(PASSNO)            ; IS IT PASS 1?
  92.     CP 1
  93.     CALL Z,INITA            ; IF SO, INITIALIZE
  94.     CALL PASS            ; PERFORM 1 PASS
  95.     LD HL,AFLAGS            ; TEST SYMB TAB OVERFLOW FLAG
  96.        BIT 2,(HL)            ; 
  97.     JR Z,MAIN1            ; JUMP IF NOT SET
  98.     LD HL,WARNNG            ; ELSE PRINT WARNING ON CONSOLE
  99.     CALL CONST
  100.     JR MAIN1            ; GO DO ANOTHER PASS 
  101. ;................................................
  102. WARNNG:    DEFB CR                ; SYMTAB OVERFLOW WARNING MESSAGE
  103.     DEFB LF
  104.     DEFM 'SYMBOL TABLE OVERFLOW'
  105.     DEFB CR
  106.     DEFB LF
  107.     DEFB 0
  108. ;****************************************************************************
  109. ;PRINT HERALD ON CONSOLE DEVICE.
  110. ;****************************************************************************
  111. PHRLD:    PUSH HL                ; SAVE REG
  112.     LD HL,HERALD            ; SET POINTER TO HERALD MESSAGE
  113.     CALL CONST
  114.     POP HL                ; REPLACE REG
  115.     RET
  116. HERALD:    DEFB CR
  117.     DEFB LF
  118.     DEFM 'CROWE Z80 ASSEMBLER V1.1'
  119.         DEFB CR
  120.     DEFB LF
  121.     DEFM 'COPYRIGHT PAT CROWE 1978'
  122.     DEFB CR
  123.     DEFB LF
  124.     DEFB 0
  125. ;..............................................
  126. ;PRINT STRING ON CONSOLE DEVICE
  127. ;ON ENTRY HL POINTS AT STRING
  128. ;END OF STRING MARKER IS 0
  129. ;..............................................
  130. CONST:    PUSH BC                ; SAVE REG
  131. CONST1:    LD A,(HL)
  132.     AND A
  133.     JR Z,CONST2
  134.     LD C,A
  135.     CALL CO
  136.     INC HL
  137.     JR CONST1
  138. CONST2:    POP BC                ; REPLACE REG
  139.     RET
  140. ;**********************************************************************
  141. ;GET PASS NUMBER
  142. ;ZERO FLAG SET IF 'Q' TYPED
  143. ;**********************************************************************
  144. GTPNO:    PUSH HL                ; SAVE REGISTERS
  145.     PUSH BC
  146. GTPNO1:    LD HL,CRLF            ; POINT TO CR LF STRING
  147.     CALL CONST            ; OUTPUT STRING TO CONSOLE DEVICE
  148.     LD HL,PASNO?            ; POINT TO 'PASS NO.?' STRING
  149.     CALL CONST            ; OUTPUT STRING TO CONSOLE
  150.     CALL CI                ; GET CHAR FROM CONSOLE KEYBOARD
  151.     LD C,A                ; SAVE IN B AND C REGISTERS
  152.     LD B,A
  153.     CALL CO                ; ECHO CHAR TO CONSOLE
  154.     LD A,B
  155.     CP 'Q'                ; QUIT?
  156.     JR Z,GTPNO2            ; JUMP IF SO
  157.     CP '1'                ; INPUT IN RANGE 1-4 ?
  158.     JR C,GTPNO1            ; NO, GO ASK FOR ANOTHER
  159.     CP '5'
  160.     JR NC,GTPNO1            ; DITTO 
  161.     AND 7                ; MASK TO GET BINARY PASS NO.
  162.     LD (PASSNO),A            ; SAVE IN PASS NO. STORE
  163.     LD HL,CRLF            ; OUTPUT ANOTHER CR LF TO CONSOLE
  164.     XOR A                  ; CLEAR ZERO FLAG
  165.     INC A
  166. GTPNO2:    POP BC                ; REPLACE REGISTERS
  167.     POP HL
  168.     RET                ; AND RETURN
  169. CRLF:    DEFB CR
  170.     DEFB LF
  171.     DEFB 0
  172. PASNO?:    DEFM 'PASS NO. = '
  173.     DEFB 0
  174. ;****************************************************************************
  175. ;PERFORM A PASS
  176. ;****************************************************************************
  177. PASS:    CALL INITP            ; INITIALIZE FOR PASS
  178. PASS1:    CALL INITL                 ; INITIALIZE FOR LINE
  179.     CALL GLIN            ; GET A LINE
  180.     CALL GLAB               ; GET LABEL
  181.         JR Z,PASS4               ; JMP IF NO MORE PROC. REQD.
  182.     CALL GETOR            ; GET OPERATOR TOKEN
  183.     JR Z,PASS4            ; JUMP IF NO MORE PROC. REQD.
  184.     LD A,(ORTKBF)              ; IS OPERATOR 'TITLE'?
  185.     CP TITTOK             ; TOKEN FOR TITLE?
  186.     JR NZ,PASS2            ; NO, IS OPERATOR 'DEFM'?
  187.     CALL TITL             ; YES, PROCESS ITS OPERAND 
  188.     JR PASS5
  189. PASS2:    CP DEFMTK            ; TOKEN FOR 'DEFM'?
  190.     JR NZ,PASS3
  191.     CALL DM                ; YES, PROCESS ITS OPERAND
  192.     JR PASS5
  193. PASS3:    CALL GTOD            ; NEITHER, PROCESS NORMAL OPERANDS
  194.     JR Z,PASS4            ; JMP IF NO MORE PROC. REQD.
  195. PASS5:    CALL PTOK             ; PROCESS TOKENS
  196. PASS4:    CALL PFRLO            ; PERFORM RELEVANT OUTPUT
  197.     LD A,(AFLAGS)            ; TEST FOR END STATEMENT
  198.     BIT 1,A
  199.     JR Z,PASS1              ; GO PROCESS ANOTHER LINE IF NOT
  200.     RET
  201. ;**************************************************************************
  202. ;INITIALIZE ASSEMBLER
  203. ;**************************************************************************
  204. INITA:    PUSH HL                ; SAVE REGS
  205.     PUSH    BC            ; 
  206.     XOR    A            ; CLEAR ACC
  207.      LD    (TITBUF),A        ; EMPTY TITLE BUFFER
  208.     LD    (SYMTAB),A        ; CLEAR SYMBOL TABLE
  209.     LD    HL,SYMTAB        ; PUT SYMBOL TABLE START ADDR
  210.     LD    (SYMEND),HL        ; INTO 'END OF SYMBOL TABLE' STORE
  211.     LD    HL,AFLAGS        ; CLEAR SYMTAB OVERFLOW FLAG
  212.     RES    2,(HL)
  213.     CALL    MEMCHK            ; GET HIGHEST AVAIL MEM IN B-A
  214.     LD    HL,MEMTOP        ; SAVE IN MEMTOP
  215.     LD    (HL),A
  216.     INC    HL
  217.     LD    (HL),B
  218.     POP    BC            ; REPLACE REGS
  219.     POP    HL
  220.     RET
  221. ;****************************************************************************
  222. ;INITIALIZE PASS
  223. ;****************************************************************************
  224. INITP:    PUSH    BC            ; SAVE REG
  225.     XOR    A            ; CLEAR ACC.
  226.     LD    (OBJCNT),A        ; CLEAR OBJECT BUFFER COUNT
  227.     LD    (ADREFC),A        ; SET ADDR REF CNTR = 0
  228.     LD    (ADREFC+1),A
  229.     LD    (PAGE+1),A        ; SET PAGE NO. = 1
  230.     INC    A
  231.     LD    (PAGE),A
  232.     LD    A,PLINES-9        ; SET LINE NO. = MAX SIZE
  233.     LD    (LINE),A
  234.     LD    A,(PASSNO)        ; GET PASS NO.
  235.     CP    3
  236.     JR    NZ,INITP1        ; JUMP IF NOT
  237.     CALL    RUNOUT            ; PUNCH 30 CM RUNOUT
  238.     LD    C,CR            ; PUNCH CR
  239.     CALL    PCHO
  240.     LD    C,LF            ; PUNCH LF
  241.     CALL    PCHO
  242.     JR    INITP3
  243. INITP1:    CP    2            ; PASS 2?
  244.     JR    Z,INITP2        ; JUMP IF SO
  245.     CP    4            ; PASS 4?
  246.     JR    NZ,INITP3        ; JUMP IF NOT
  247. INITP2:    LD    C,FORMFD        ; LIST FORM FEED
  248.     CALL    LO
  249.     LD    C,CR            ; LIST CR
  250.     CALL    LO
  251.     LD    C,LF            ; LIST 3 LF'S
  252.     LD    B,3
  253.     CALL    OUTC
  254.     CALL    LFEED            ; LIST PAGE HEADER
  255. INITP3:    POP    BC            ; REPLACE REG
  256.     RET
  257. ;**************************************************************************
  258. ;INITIALIZE LINE
  259. ;***************************************************************************
  260. INITL:    PUSH    BC            ; SAVE REGS
  261.     PUSH    HL
  262.     XOR    A            ; CLEAR ACC
  263.     LD    HL,ASSCOD        ; SET PNTR TO ASSD CODE BUFFER
  264.     LD    B,ACBSIZ        ; LOAD CNTR WITH SIZE OF BUFFER
  265. INITL1:    LD    (HL),A            ; CLEAR A LOCATION
  266.     INC    HL            ; INCR PNTR
  267.     DJNZ    INITL1            ; LOOP UNTIL DONE
  268.     LD    (ASCDNO),A        ; SET 'BYTES ASSD CODE' = 0
  269.     LD    (ODBT1),A        ; CLEAR OPERAND TOKEN BUFFERS
  270.     LD    (ODBT2),A
  271.     LD    HL,0            ; CLEAR OPERAND INTEGER BUFFERS
  272.     LD    (ODINT1),HL
  273.     LD    (ODINT2),HL
  274.     LD    (ORTKBF),HL        ; CLEAR OPERATOR TOKEN BUFFER
  275.     LD    HL,(ADREFC)        ; COPY ADDR REF CNTR
  276.     LD    (ADDISR),HL        ; INTO ADDR DIS REG
  277.     LD    HL,AFLAGS        ; SET PNTR TO ASSEMBLER FLAGS
  278.     RES    0,(HL)            ; CLEAR ADDR DISCONTINUITY FLAG
  279.     RES    1,(HL)            ; CLEAR 'END' FLAG
  280.     POP    HL
  281.     POP    BC
  282.     RET
  283. ;************************************************************************
  284. ;GET LINE FROM READER
  285. ;COPIES LINE OF SOURCE TEXT INTO LINBUF
  286. ;ECHOES TO PRINTER IF PASS2
  287. ;*************************************************************************
  288. GLIN:    PUSH    HL            ; SAVE REGS
  289.     PUSH    DE
  290.     PUSH    BC
  291.     LD B,LBFSZ-1            ; SET LINE BUFFER SIZE
  292.     LD    HL,LINBUF        ; SET POINTER TO LINE BUFFER
  293.     LD    DE,0            ; CLEAR TAB COUNTER (E) & STATUS REG
  294.     LD    A,SPACE            ; PUT SPACE CHAR IN ERROR BUFFER
  295.     LD    (ERRBUF),A
  296.     LD    A,(PASSNO)        ; SET 'PASS2' FLAG IF PASS 2
  297.     CP    2
  298.     JR    NZ,GLIN1
  299.     SET    0,D
  300. GLIN1:    CALL    RI            ; GET CHAR FROM READER
  301.     LD    C,A            ; SAVE IT IN C
  302.     CP    CR            ; IS IT CR?
  303.     JR    Z,GLIN2
  304.     CP    HT            ; IS IT TAB?
  305.     JR    Z,GLIN3
  306.     CP    LF            ; IS IT LINE FEED?
  307.     JR    Z,GLIN1            ; IGNORE
  308.     CP    NUL            ; IS IT A NULL CHAR?
  309.     JR    Z,GLIN1            ; IGNORE
  310.     CP    DEL            ; IS IT A DELETE CHAR?
  311.     JR    Z,GLIN1            ; IGNORE
  312.     AND    60H            ; IS IT ANY OTHER CONTROL CHAR?
  313.     JR    NZ,GLIN5
  314.     LD    C,'I'            ; PUT 'ILLEGAL CHAR'IN ERROR DISP 
  315.     CALL    ERROR
  316.     JR    GLIN1
  317. GLIN5:    LD    A,C            ; GET CHAR BACK
  318.     CP    ';'            ; SET COMMENT FLAG IF ';'
  319.     JR    NZ,GLIN7
  320.     SET    1,D
  321. GLIN7:    LD    (HL),A            ; PUT IN BUFFER
  322.     INC    HL            ; INCREMENT BUFFER POINTER
  323.     BIT    0,D            ; IF PASS 2 FLAG SET,
  324.     CALL    NZ,LO            ; OUTPUT CHAR TO LIST DEVICE
  325.     INC    E            ; INCREMENT TAB COUNTER
  326. GLIN11:    DEC    B            ; BUFFER FULL?
  327.     JR    NZ,GLIN1
  328. GLIN9:    CALL    RI            ; SCAN TO NEXT CR FROM READER
  329.     CP    CR
  330.     JR    NZ,GLIN9
  331.     LD    (HL),A            ; PUT CR IN BUFFER
  332.     LD    C,A            ; IF PASS 2 FLAG SET
  333.     BIT    0,D
  334.     CALL    NZ,LO            ; OUTUT CR TO LIST DEVICE
  335.     BIT    1,D            ; REACHED COMMENT BEFORE BUFFER FULL?
  336.     JR    NZ,GLIN4
  337.     LD    C,'L'            ; PUT 'LINE TOO LONG' IN ERROR DISP
  338.     CALL    ERROR
  339.     JR    GLIN4
  340. GLIN2:    LD    (HL),A            ; PUT CR IN BUFFER
  341.     BIT    0,D            ; IF PASS 2 FLAG SET
  342.     CALL    NZ,LO            ; OUTPUT TO LIST DEVICE
  343.     JR    GLIN4
  344. GLIN3:    LD    C,SPACE            ; TAB. PUT SPACE IN BUFFER
  345.     LD    (HL),C
  346.     INC    HL
  347.     BIT    0,D            ; IF PASS 2 FLAG SET,
  348.     CALL    NZ,LO            ; OUTPUT TO LIST DEVICE
  349.     INC    E            ; REACHED NEXT TAB POSITION?
  350.     LD    A,7
  351.     AND    E
  352.     JR    Z,GLIN11
  353.     DEC    B            ; BUFFER FULL?
  354.     JR    Z,GLIN9
  355.     JR    GLIN3
  356. GLIN4:    POP    BC            ; REPLACE REGS
  357.     POP    DE
  358.     POP    HL
  359.     RET
  360. ;**********************************************************************
  361. ;GET LABEL
  362. ;LOCATES LABEL (IF ANY) IN LINBUF AND PUTS IT IN LABBUF.
  363. ;LEAVES POINTER TO CHARACTER AFTER LABEL IN LINPNT.
  364. ;ZERO SET IF NOTHING ELSE TO PROCESS
  365. ;**********************************************************************
  366. GLAB:    PUSH    HL            ; SAVE REGS
  367.     PUSH    DE
  368.     PUSH    BC
  369.     LD    HL,LINBUF        ; SET POINTER TO LINE BUFFER
  370.     LD    DE,LABBUF        ; SET POINTER TO LABEL BUFFER
  371.     LD    B,0            ; CLEAR STATUS REG
  372. GLAB1:    LD    A,(HL)            ; SCAN TO FIRST NON SPACE CHAR
  373.     CP    SPACE
  374.     JR    NZ,GLAB2
  375.     SET    2,B            ; SET 'NOT FIRST COL' FLAG
  376.     INC    HL            ; POINT TO NEXT CHAR
  377.     JR    GLAB1
  378. GLAB2:    CP    CR            ; NULL LINE?
  379.     JR    Z,GLAB8
  380.     CP    ';'            ; COMMENT?
  381.     JR    Z,GLAB8
  382.     CP    'A'            ; IT IS A-Z?
  383.     JR    C,GLAB5
  384.     CP    'Z'+1
  385.     JR    NC,GLAB5
  386.     CALL    GSYM            ; PUT SYMBOL IN BUFFER
  387.     LD    A,(HL)            ; FOLLOWED BY ':'?
  388.     CP    ':'
  389.     JR    Z,GLAB3            ; JUMP IF FOLLOWED BY ':'
  390.                     ; I.E. IT'S A LABEL
  391.     BIT    2,B            ; STARTED IN FIRST COLUMN?
  392.     JR    NZ,GLAB6        ; JUMP IF NOT LABEL
  393.     JR    GLAB7
  394. GLAB3:    INC    HL
  395.     LD    A,(HL)
  396. GLAB7:    CP    SPACE            ; FOLLOWED BY SP/CR/;?
  397.     JR    Z,GLAB4
  398.     CP    CR
  399.     JR    Z,GLAB4
  400.     CP    ';'
  401.     JR    Z,GLAB4
  402. GLAB5:    CALL    DNOPS            ; RESERVE 4 DEFAULT NOP'S
  403.     CALL    ADJARC            ; ADJUST ADDRESS REF COUNTER
  404.     XOR    A            ; SET ZERO FLAG
  405.     JR    GLAB8
  406. GLAB6:    LD    HL,LINBUF        ; SET POINTER TO START OF LINBUF
  407.     XOR    A            ; SET 'NO LABEL IN BUFFER'
  408.     LD    (LABBUF),A
  409. GLAB4:    LD    (LINPNT),HL        ; DEPOSIT LINE POINTER
  410.     XOR    A            ; CLEAR ZERO FLAG
  411.     INC    A
  412. GLAB8:    POP    BC            ; REPLACE REGS
  413.     POP    DE
  414.     POP    HL
  415.     RET
  416. ;*********************************************************************
  417. ;GET OPERATOR TOKEN, 
  418. ;LOCATES OPERATOR (IF ANY) AND PUTS TOKEN AND VALUE FOR IT IN ORTKBF.
  419. ;LEAVES POINTER TO CHARACTER AFTER OPERATOR IN LINPNT
  420. ;ZERO FLAG SET IF NOTHING ELSE TO PROCESS.
  421. ;**********************************************************************
  422. GETOR:    PUSH    HL            ; SAVE REGISTERS
  423.     PUSH    DE
  424.     PUSH    BC
  425.     EXX
  426.     PUSH    HL
  427.     PUSH    DE
  428.     PUSH    BC
  429.     LD    HL,(LINPNT)        ; FETCH PONTER TO LINE BUFFER
  430. GETOR1:    CALL    SCNSP            ; SCAN TO FIRST NON SPACE CHAR
  431. GETOR5:    CP    CR            ; IS IT CR?
  432.     JR    Z,GETOR2
  433.     CP    ';'            ; IS IT ';'?
  434.     JP    Z,GETOR2
  435.     CALL    ALPHA            ; IS IT A LETTER?
  436.     JR    NC,GETOR3        ; NO, SYNTAX ERROR
  437.     LD    DE,SYMBUF+1        ; SET POINTER TO SYMBOL BUFFER
  438.     LD    B,0            ; SET COUNT = 0
  439. GETOR4:    LD    (DE),A            ; PUT CHAR IN OPERATOR BUFFER
  440.     INC    HL            ; INCR LINBUF POINTER
  441.     INC    DE            ; INCREMENT SYMBUF POINTER
  442.     INC    B            ; INCR CHAR COUNT
  443.     LD    A,5            ; GREATER THAN 5?
  444.     CP    B
  445.     JR    C,GETOR3        ; YES, SYNTAX ERROR
  446.     LD    A,(HL)            ; GET NEXT CHAR
  447.     CALL    ALPHA            ; IS IT A LETTER
  448.     JR    C,GETOR4        ; YES, LOOP
  449.     LD    A,B            ; SAVE # OF OPR CHARS IN SYMBUF
  450.     LD    (SYMBUF),A
  451.     LD    A,(HL)            ; FETCH NEXT CHAR AGAIN
  452.     CP    SPACE
  453.     JP    Z,GETOR6
  454.     CP    CR
  455.     JR    Z,GETOR6
  456.     CP    ';'
  457.     JR    NZ,GETOR3        ; INVALID SYNTAX
  458. GETOR6:    EXX                ; SET UP PARAMETERS FOR OPTOK
  459.     LD    HL,ORLSTP
  460.     LD    DE,ORTKBF
  461.     LD    C,2
  462.     CALL    OPTOK            ; GET TOKENS FROM LIST
  463.     EXX
  464.     JR    Z,GETOR3        ; INVALID SYNTAX, NOT IN LIST
  465. GETOR2:    LD    (LINPNT),HL        ; DEPOSIT LINE BUFFER POINTER
  466.     XOR    A            ; CLEAR ZERO FLAG
  467.     INC    A
  468. GETOR7:    POP    BC            ; RECOVER REGISTERS
  469.     POP    DE
  470.     POP    HL
  471.     EXX
  472.     POP    BC
  473.     POP    DE
  474.     POP    HL
  475.     RET
  476. GETOR3:    CALL    DNOPS            ; RESERVE 4 DEFAULT NOP'S
  477.     CALL    ADJARC            ; ADJUST ADDRESS REF COUNTER
  478.     XOR    A            ; SET ZERO FLAG
  479.     JR    GETOR7
  480. ;**********************************************************************
  481. ;GET OPERAND TOKENS AND VALUES
  482. ;LOCATES OPERANDS (IF ANY) AND SETS TOKENS FOR THEM IN ODBT1/ODBT2
  483. ;AND CORRESPONDING INTEGER VALUES (IF ANY) IN ODINT1/ODINT2.
  484. ;ZERO FLAG SET IF NOTHING ELSE TO PROCESS
  485. ;**********************************************************************
  486. GTOD:    PUSH    IX            ; SAVE REGISTERS
  487.     PUSH    IY
  488.     PUSH    HL
  489.     PUSH    DE
  490.     PUSH    BC
  491.     EXX
  492.     PUSH    HL
  493.     PUSH    DE
  494.     PUSH    BC
  495.     LD    HL,(LINPNT)        ; GET LINE BUFFER POINTER
  496.     LD    B,0            ; CLEAR B (OPERAND COUNTER,
  497.                     ; 'BRACKETS' FLAG & 'QUOTE' FLAG)
  498. GTOD1:    CALL    SCNSP            ; SCAN TO FIRST NON SPACE CHAR
  499.     CP    ','            ; IS IT A COMMA?
  500.     JR    NZ,GTOD2
  501.     BIT    0,B            ; YES, FOUND 1 OPERAND?
  502.     JP    Z,GTOD25        ; NO, SYNTAX ERROR
  503.     INC    HL            ; YES, SCAN TO NEXT NON SP CHAR
  504.     CALL    SCNSP
  505.     JR    GTOD3
  506. GTOD2:    CP    ';'            ; IS IT A ';'?
  507.     JP    Z,GTOD24
  508.     CP    CR            ; OR A CR?
  509.     JP    Z,GTOD24
  510. GTOD3:    PUSH    HL            ; NO, SET POINTER TO START
  511.     POP    IX            ; OF OPERAND IN IX
  512.                     ; SCAN TO NEXT DELIMITER
  513.     RES    6,B            ; CLEAR QUOTE FLAG
  514. GTOD4:    LD    A,(HL)            ; GET CHAR IN A
  515.     CP    ''''            ; IS IT A '?
  516.     JR    NZ,GTOD18        ; JUMP IF NOT
  517.     LD    A,B            ; COMPLEMENT QUOTE FLAG
  518.     XOR    01000000B
  519.     LD    B,A
  520.     JR    GTOD28            ; AND CONTINUE TO SCAN
  521. GTOD18:    CP    CR            ; IS IT CR?
  522.     JR    Z,GTOD5            ; FOUND DELIMITER, JUMP
  523.     CP    SPACE            ; IS IT SPACE
  524.     JR    Z,GTOD27        ; JUMP IF SO
  525.     CP    ','            ; IS IT A COMMA?
  526.     JR    Z,GTOD27        ; JUMP IF SO
  527.     CP    ';'            ; IS IT ; ?
  528.     JR    NZ,GTOD28        ; CONTINUE SCAN OF NONE OF THESE
  529. GTOD27:    BIT    6,B            ; IS QUOTE FLAG SET?
  530.     JR    Z,GTOD5            ; JUMP IF NOT, FOUND DELIMITER
  531. GTOD28:    INC    HL            ; POINT TO NEXT CHAR
  532.     JR    GTOD4            ; AND LOOP
  533.                     ; FOUND DELIMITER
  534. GTOD5:    PUSH    HL            ; SET POINTER (IY) TO CHAR
  535.     POP    IY            ; AFTER END OF OPERAND
  536.     INC    B            ; INCR # OF OPERANDS FOUND
  537.     LD    A,B            ; IS IT > 2 ?
  538.     AND    3
  539.     CP    3
  540.     JP    Z,GTOD25        ; YES, SYNTAK ERROR
  541.     RES    7,B            ; CLEAR BRACKETS FLAG
  542.     LD    A,(IX)            ; DOES IT START WITH ( ?
  543.     CP    '('
  544.     JR    NZ,GTOD6
  545.     LD    A,(IY-1)        ; DOES IT END WITH ) ?
  546.     CP    ')'
  547.     JR    NZ,GTOD6
  548.     SET    7,B            ; SET BRACKETS FLAG IN B
  549.     INC    IX            ; AND CLOSE IN POINTERS
  550.     DEC    IY
  551. GTOD6:    PUSH    IX            ; GET POINTER TO START OF OPERAND
  552.     POP    HL
  553.     LD    DE,SYMBUF+1        ; SET POINTER TO SYMBUF
  554.     LD    C,0            ; ZERO CHAR COUNT
  555. GTOD10:    LD    A,(HL)            ; FETCH A CHAR
  556.     CALL    ALPHA            ; IS IT A LETTER?
  557.     JR    NC,GTOD7
  558.     LD    (DE),A
  559.     INC    C            ; INCR COUNT
  560.      INC    HL            ; AND POINTERS
  561.     INC    DE
  562.     LD    A,C
  563.     CP    3
  564.       JR    NZ,GTOD10
  565.     JR    GTOD9            ; MORE THAN 2 LETTERS, GO
  566.                     ; EVALUATE EXPRESSION
  567. GTOD7:    CP    ''''            ; NOT LETTER, IS IT '?
  568.     JR    NZ,GTOD8          
  569.     LD    (DE),A            ; SAVE IT IN BUFFER
  570.     INC    HL            ; POINT TO CHAR FOLLOWING
  571.     INC    C            ; INCREMENT COUNT
  572. GTOD8:    LD    A,C            ; PUT COUNT IN SYMBUF
  573.     LD    (SYMBUF),A
  574.     AND    A            ; IF COUNT=0 THEN
  575.     JR    Z,GTOD9            ; GO TO EVAL EXPRESSION
  576.     EXX                ; GET OPERAND KEYWORK TOKEN
  577.     LD    HL,OPKLST
  578.     LD    DE,TEMP
  579.      LD    C,1            ; 1 BYTE PER TOKEN
  580.     CALL    OPTOK
  581.     EXX
  582.     JR    Z,GTOD9            ; JUMP IF NO KEYWORD FOUND
  583.     LD    C,A            ; SAVE TOKEN IN C
  584.     CP    CTOK            ; TOKEN FOR C?
  585.     JR    NZ,GTOD12
  586.     LD    A,(ORTKBF)
  587.     BIT    7,A            ; IS OPERATOR CONDITIONAL?
  588.     JR    Z,GTOD12
  589.     LD    C,CCOND            ; TOKEN FOR CONDITIONAL 'C'
  590. GTOD12:    LD    A,C            ; GET TOKEN
  591.     AND    XYMASK            ; IS IT IX/IY ?
  592.     CP    IXORIY
  593.     JR    NZ,GTOD14
  594.     LD    A,(HL)            ; GET FOLLOWING CHAR
  595.     CP    '+'
  596.     JR    Z,GTOD13
  597.     CP    '-'
  598.     JR    NZ,GTOD14
  599. GTOD13:    LD    A,C            ; CONVERT TOKEN TO DUMMY VALUE
  600.     AND    0FH              
  601.     OR    0C0H
  602.     LD    C,A
  603.     PUSH    HL            ; CLOSE POINTER IN TO START OF EXPRESS
  604.     POP    IX
  605.     CALL    EVAL            ; GET VALUE OF EXPRESSION IN HL
  606.     JR    Z,GTOD25        ; SYNTAX ERROR
  607.     BIT    0,B            ; FOUND 1 OPERAND?
  608.     JR    Z,GTOD15
  609.     LD    (ODINT1),HL        ; SAVE VALUE IN 1ST OPERAND BUFFER
  610.     JR    GTOD11
  611. GTOD15:    LD    (ODINT2),HL        ; SAVE VALUE IN 2ND OPND BUFF
  612.     JR    GTOD11
  613. GTOD14:    PUSH    IY            ; END OF OPERAND?
  614.     POP    DE
  615.     AND    A            ; CLEAR CARRY FLAG
  616.     SBC    HL,DE
  617.     JR    NZ,GTOD25        ; SYNTAX ERROR
  618.     JR    GTOD11
  619. GTOD9:    CALL    EVAL            ; EVALUATE EXPRESSION
  620.                     ; RESULT IN HL
  621.     JR    Z,GTOD25        ; SYNTAX ERROR
  622.     BIT    0,B            ; FOUND 1 OPERAND?
  623.     JR    Z,GTOD17
  624.     LD    (ODINT1),HL        ; SAVE VALUE IN FIRST OPERAND BUFFER
  625.     JR    GTOD16
  626. GTOD17:    LD    (ODINT2),HL        ; SAVE VALUE IN 2ND OPND BUFF
  627. GTOD16:    LD    C,INTTOK        ; SET TOKEN FOR 'INTEGER'
  628. GTOD11:    BIT    7,B            ; WAS IT IN BRACKETS?
  629.     JR    Z,GTOD21        ; NO
  630.     LD    HL,BKLST        ; YES, CHECK IF VALID, POINT TO LIST
  631. GTOD20:    LD    A,(HL)            ; GET A TOKEN
  632.     INC    HL            ; POINT TO REPLACEMENT TOKEN
  633.     AND    A            ; IS TOKEN 0 ?
  634.     JR    Z,GTOD25        ; YES, NOT IN LIST, SYN. ERR.
  635.     CP    C            ; IS IT EQUAL TO ACTUAL TOKEN?
  636.     JR    Z,GTOD19        ; YES, GO REPLACE IT
  637.     INC    HL            ; POINT TO NEXT TOKEN
  638.     JR    GTOD20
  639. GTOD19:    LD    C,(HL)            ; REPLACE TOKEN WITH
  640.                     ; BRACKETTED VERSION.
  641.     INC    IY            ; OPEN OUR FINAL POINTER AGAIN
  642. GTOD21:    LD    A,C            ; SAVE TOKEN IN RELEVANT BUFFER
  643.     BIT    0,B            ; FOUND 1 OPERAND?
  644.     JR    Z,GTOD22
  645.     LD    (ODBT1),A        ; SAVE TOKEN IN 1ST OPND BUFF
  646.     JR    GTOD23
  647. GTOD22:    LD    (ODBT2),A        ; SAVE TOKEN IN 2ND OPND BUFF
  648. GTOD23:    PUSH    IY            ; POINT AT NEXT THING
  649.     POP    HL
  650.     JP    GTOD1            ; GO PROCESS NEXT TOKEN
  651. GTOD24:    XOR    A            ; CLEAR ZERO FLAG
  652.     INC    A
  653. GTOD26:    POP    BC            ; REPLACE SAVED REGISTERS
  654.     POP    DE
  655.     POP    HL
  656.     EXX    
  657.     POP    BC
  658.     POP    DE
  659.     POP    HL
  660.     POP    IY
  661.     POP    IX
  662.     RET
  663. GTOD25:    CALL    DNOPS            ; APPEND DEFAULT NOP'S
  664.     CALL    ADJARC            ; ADJUST ADDRESS REF COUNTER
  665.     XOR    A
  666.     JR    GTOD26
  667. ;************************************************************************
  668. ;EVALUATE AN EXPRESSION
  669. ;ON ENTRY AND EXIT:
  670. ;    IX POINTS AT FIRST CHAR OF EXPRESSION
  671. ;    IY POINTS AT CHAR AFTER END OF EXPRESSION
  672. ;ON EXIT:
  673. ;    HL CONTAINS VALUE OF EXPRESSION
  674. ;    AND ZERO FLAG IS SET IF SYNTAX ERROR
  675. ;************************************************************************
  676. EVAL:    PUSH    DE            ; SAVE REGISTERS
  677.     PUSH    BC
  678.     EXX
  679.     PUSH    BC
  680.     XOR    A            ; CLEAR ROUTINE FLAG REGISTER
  681.     LD    B,A
  682.     EXX
  683.     LD    (ARCNT),A        ; CLEAR STACKS
  684.     LD    (FCNT),A
  685.     PUSH    IX            ; POINT TO START OF EXPR.
  686.     POP    HL
  687. EVAL1:    PUSH    IY            ; END OF EXPRESSION?
  688.     POP    DE            ; I.E. HL=IY ?
  689.      EX    DE,HL
  690.     AND    A            ; CLEAR CARRY
  691.      SBC    HL,DE
  692.     EX    DE,HL
  693.     JP    Z,EOEX            ; END OF EXPRESSION
  694.     JP    C,EVAL6            ; END OF EXPRESSION ERROR
  695.     LD    A,(HL)            ; GET A CHAR
  696.     CALL    DIGIT            ; IS IT A DIGIT?
  697.     JR    C,LIT            ; YES, GO PROCESS LITERAL
  698.     CALL    ALPHA            ; IS IT A LETTER?
  699.     JR    C,SYMB            ; YES, GO PROCESS SYMBOL
  700.     CP    '.'            ; IS IT A '.'?
  701.     JR    Z,MCF            ; YES, GO PROCESS M/CHAR FUNCTION
  702.     CP    ''''            ; IS IT A '?
  703.     JR    Z,ASC            ; YES, GO PROC. ASCII CHAR
  704.     CP    '('            ; IS IT A '('?
  705.     JP    Z,LBKT            ; YES, GO PROC. LEFT BRKT
  706.     CP    ')'            ; IS IT ')'?
  707.     JP    Z,RBKT            ; YES, GO PROC. R.H. BRKT
  708.     CP    '$'            ; IS IT '$'?
  709.     JR    Z,CURLC            ; YES, GO PROC. CURR. LOC.
  710. SCHF:    CALL    PSCF            ; PROCESS AS SINGLE CHAR. FUNCTION
  711.     JP    Z,EVAL3            ; INVALID CHAR ERROR
  712.     JR    FUN
  713. LIT:    CALL    PLIT            ; PROCESS AS LITERAL
  714.     JR    OPND
  715. SYMB:    CALL    PSYMB
  716.     JR    OPND
  717. ASC:    CALL    PASC            ; PROCESS OS ASCII STRING
  718.     JR    OPND
  719. CURLC:    LD    DE,(ADREFC)        ; CURRENT VALUE OF ADDR REF
  720.                     ; COUNTER REQUIRED
  721.     INC    HL            ; POINT TO NEXT EXPR CHAR
  722.     JR    OPND1
  723. OPND:    JP    C,EVAL4            ; 'VALUE' ERROR
  724. OPND1:    CALL    PUDE            ; PUSH VALUE (IN DE) ONTO
  725.                     ; ARITHMETIC STACK
  726.     JP    Z,EVAL5            ; STACK OVERFLOW ERROR
  727.     EXX                ; SET 'LAST UNIT' FLAG
  728.     SET    0,B
  729.     EXX
  730.     JR    EVAL1
  731. MCF:    CALL    PMCF
  732.     JP    Z,EVAL6            ; SYNTAX ERROR
  733. FUN:    LD    A,(FTOKR)        ; GET FUNCTION TOKEN
  734.     CP    PLUTOK            ; IS IT TOKEN FOR +?
  735.     JR    Z,FUN1
  736.     CP    MINTOK            ; IS IT TOKEN FOR -?
  737.     JR    NZ,FUN2
  738.                     ; +/-
  739. FUN1:    EXX                ; WAS LAST UNIT START/(/FUNCTION ?
  740.      BIT    0,B
  741.     EXX
  742.     JR    Z,FUN3
  743.     ADD    A,5DH            ; CHANGE TOKEN TO DIADIC
  744.     LD    (FTOKR),A
  745.     JP    FUN3
  746. FUN2:    CP    3DH            ; DIADIC FUNCTION
  747.     JR    C,FUN3
  748.     EXX                ; WAS LAST UNIT START/(/FUNCTION?
  749.     BIT    0,B
  750.     EXX
  751.     JP    Z,EVAL6            ; SYNTAX ERROR
  752. FUN3:    CALL    POFU            ; GET PREVIOUS FUNCTION
  753.     JR    Z,FUN4            ; NO PREVIOUS FUN, PUSH NEW ONE
  754.     LD    E,A            ; SAVE TOP OF STACK IN E
  755.     LD    A,(FTOKR)        ; GET NEW FUNCTION TOKEN
  756.     AND    7            ; MASK OFF PRIORITY BITS IN NEW OPR
  757.     LD    B,A            ; SAVE IN B
  758.     LD    A,E
  759.     AND    7            ; MASK OFF PRIORITY BITS OF TOS
  760.     CP    B            ; COMPARE PRIORITIES
  761.     JR    NC,FUN5            ; GO DO A FUNCTION
  762.                     ; NEW FUNCTION HAS HIGHER
  763.                     ; PRIORITY SO PUSH IT ON
  764.                     ; STACK.
  765.     LD    A,E            ; FIRST PUSH BACK TOP OF STACK
  766.     CALL    PUFU
  767. FUN4:    LD    A,(FTOKR)        ; THEN PUSH NEW FUNCTION
  768.     CALL    PUFU
  769.     JR    Z,EVAL5            ; STACK OVERFLOW ERROR
  770.     EXX                  ; CLEAR 'LAST UNIT' FLAG
  771.     RES    0,B
  772.     EXX
  773.     JP    EVAL1
  774. FUN5:    LD    A,E            ; PUT T O S IN ACC
  775.     CALL    FUNC            ; PERFORM A FUNCTION
  776.     JR    Z,EVAL6            ; SYNTAX ERROR
  777.     JR    FUN3            ; GO TRY NEXT FUNCTION ON STACK
  778. ;..................................................
  779. LBKT:    INC    HL            ; POINT TO NEXT EXPR CHAR
  780.     LD    A,LBTOK            ; SET TOKEN FOR '('
  781.     CALL    PUFU            ; PUSH ON FUNCTION STACK
  782.     JR    Z,EVAL5            ; STACK OVERFLOW ERROR
  783.     EXX                ; CLEAR 'LAST UNIT' FLAG
  784.     RES    0,B
  785.     EXX    
  786.     JP    EVAL1
  787. ;..................................................
  788. RBKT:    INC    HL
  789. RBKT2:    CALL    POFU            ; POP FUNCTION STACK
  790.     JR    Z,EVAL7            ; EMPTY, BALANCE ERROR
  791.     CP    LBTOK            ; IS IT A (?
  792.     JR    Z,RBKT1
  793.     CALL    FUNC            ; PERFORM THE FUNCTION
  794.     JR    Z,EVAL6            ; SYNTAX ERROR
  795.     JR    RBKT2            ; MORE OPS TO DO ?
  796. RBKT1:    EXX                ; SET 'LAST UNIT' FLAG
  797.     SET    0,B
  798.     EXX
  799.     JP    EVAL1
  800. ;.................................................
  801.                     ; END OF EXPRESSION
  802. EOEX:    CALL    POFU            ; POP FUNCTION STACK
  803.     JR    Z,EOEX1            ; NO MORE FUNCTIONS
  804.     CP    LBTOK
  805.     JR    Z,EVAL7            ; BALANCE ERROR
  806.     CALL    FUNC            ; PERFORM THE FUNCTION
  807.     JR    Z,EVAL6            ; SYNTAX ERROR
  808.     JR    EOEX
  809. EOEX1:    CALL    PODE            ; GET EXPR VALUE IN DE
  810.     JR    Z,EVAL6            ; SYNTAX ERROR (STACK EMPTY)
  811.     LD    A,(ARCNT)        ; CHECK IF STACK NOW EMPTY
  812.     AND    A
  813.     JR    NZ,EVAL6        ; SYNTAX ERROR
  814.     EX    DE,HL
  815.     EXX
  816.     BIT    1,B            ; TEST FOR ARITH OVERFLOW
  817.     EXX
  818.     JR    Z,EOEX2
  819.     LD    C,'A'
  820. EOEX4:    CALL    ERROR            ; INDICATE ARITH OVERFLOW
  821. EOEX2:    XOR    A            ; CLEAR ZERO FLAG
  822.     INC    A
  823. EOEX3:    EXX
  824.     POP    BC
  825.     EXX
  826.     POP    BC
  827.     POP    DE
  828.     RET
  829. EVAL3:    LD    C,'I'
  830.     JR    EVAL8
  831. EVAL4:    LD    C,'V'            ; VALUE ERROR
  832.     LD    HL,0            ; SET RESULT=0
  833.     JR    EOEX4            ; NOT FATAL
  834. EVAL5:    LD    C,'O'            ; STACK OVERFLOW ERROR
  835.     JR    EVAL8
  836. EVAL6:    LD    C,'S'            ; SYNTAX ERROR
  837.     JR    EVAL8
  838. EVAL7:    LD    C,'B'            ; BALANCE ERROR
  839. EVAL8:    CALL    ERROR            ; SET ERROR INDICATOR
  840.     XOR    A            ; SET ZERO (ERROR) FLAG
  841.     JR    EOEX3            ; AND PREPARE TO EXIT
  842. ;**********************************************************************
  843. ;PROCESS LITERAL.
  844. ;THIS SUBROUTINE INCLUDES PBIN, PDEC,
  845. ;PHEX, POCT.
  846. ;ON ENTRY:
  847. ;    HL POINTS TO FIRST CHAR OF LITERAL
  848. ;ON EXIT:
  849. ;    HL POINTS TO CHAR AFTER LITERAL
  850. ;    DE CONTAINS VALUE OF LITERAL
  851. ;    CARRY FLAG IS SET FOR VALUE ERROR
  852. ;**********************************************************************
  853. PLIT:    PUSH    HL            ; SAVE POINTER TO START OF LIT.
  854. PLIT1:    LD    A,(HL)            ; GET CHAR
  855.     CALL    HEXDG            ; IS IT VALID DIG FOR LIT.?
  856.     JR    NC,PLIT2
  857.     INC    HL            ; YES, POINT TO NEXT CHAR
  858.     JR    PLIT1
  859. PLIT2:    DEC    HL            ; NO, GO BACK TO LAST CHAR
  860.     LD    A,(HL)            ; FETCH IT TO ACC.
  861.     POP    HL            ; REPLACE POINTER TO START OF LIT.
  862.     CP    'B'            ; WAS FINAL CHAR 'B'
  863.     JP    Z,PBIN            ; BINARY LITERAL
  864.     CP    'D'            ; 'D'?
  865.     JP    Z,PDEC            ; DECIMAL LITERAL
  866.     CP    'H'            ; 'H'?
  867.     JP    Z,PHEX            ; HEX LITERAL
  868.     CP    'O'            ; 'O'?
  869.     JP    Z,POCT            ; OCTAL LITERAL
  870.     CP    'Q'            ; 'Q'?
  871.     JP    Z,POCT            ; OCTAL LITERAL
  872.     JP    PDEC            ; DECIMAL LITERAL
  873. ;**********************************************************************
  874. ;PROCESS BINARY LITERAL.
  875. ;**********************************************************************
  876. PBIN:    PUSH    BC            ; SAVE REGISTERS
  877.     LD    DE,0            ; CLEAR 16 BIT ACC.
  878. PBIN1:    LD    A,(HL)            ; GET CHAR
  879.     CALL    HEXDG            ; VALID IN A LITERAL?
  880.     JR    NC,PBIN2
  881.     CP    '1'+1            ; VALID IN BINARY LIT.?
  882.     JR    NC,PBIN2          
  883.     SUB    '0'            ; CONVERT ASCII TO BINARY
  884.     LD    C,A
  885.     CALL    SHLDE            ; SHIFT DE LEFT
  886.     CALL    ADCDE            ; & ADD NEW DIG. TO DE
  887.     INC    HL            ; INCREMENT POINTER TO NEXT CHAR.
  888.     JR    PBIN1
  889. PBIN2:    CP    'B'            ; CHAR NOT BIN. DIG.. IS IT 'B'?
  890.     JR    NZ,PBIN4
  891.     INC    HL            ; YES, POINT TO NEXT CHAR
  892.     LD    A,(HL)            ; GET IT IN ACC
  893.     CALL    HEXDG            ; VALID CHAR FOR A LIT.?
  894. PBIN3:    POP    BC
  895.     RET
  896. PBIN4:    SCF                ; SET CARRY FOR ERROR
  897.     JR    PBIN3
  898. ;**********************************************************************
  899. ;PROCESS OCTAL LITERAL
  900. ;**********************************************************************
  901. POCT:    PUSH    BC
  902.     LD    DE,0            ; CLEAR 16 BIT ACC.
  903. POCT1:    LD    A,(HL)            ; GET CHAR
  904.     CALL    HEXDG            ; VALID IN LITERAL?
  905.     JR    NC,POCT3
  906.     CP    '7'+1            ; VALID IN OCTAL LIT.?
  907.     JR    NC,POCT3
  908.     SUB    '0'            ; CONVERT ASCII TO BINARY
  909.     LD    C,A
  910.     LD    B,3            ; SHIFT DE LEFT 3 TIMES
  911. POCT2:    CALL    SHLDE
  912.     DEC    B            ; DONE 3 SHIFTS YET?
  913.     JR    NZ,POCT2
  914.     CALL    ADCDE            ; ADD NEW DIGIT TO DE
  915.     INC    HL            ; INCR POINTER TO NEXT CHAR
  916.     JR    POCT1
  917. POCT3:    CP    'O'            ; CHAR NOT OCT DIG. IS IT 'O'?
  918.     JR    Z,POCT4
  919.     CP    'Q'            ; IS IT 'Q'?
  920.     JR    NZ,POCT6
  921. POCT4:    INC    HL            ; YES, POINT TO NEXT CHAR
  922.      LD    A,(HL)            ; GET IT IN ACC
  923.     CALL    HEXDG            ; VALID CHAR IN A LIT.?
  924. POCT5:    POP    BC
  925.     RET
  926. POCT6:    SCF                ; SET CARRY FOR ERROR
  927.     JR    POCT5
  928. ;*********************************************************************
  929. ;PROCESS DECIMAL LITERAL.
  930. ;*********************************************************************
  931. PDEC:    PUSH    BC
  932.     LD    DE,0            ; CLEAR 16 BIT ACC.
  933. PDEC1:    LD    A,(HL)            ; GET CHAR
  934.     CALL    HEXDG            ; VALID IN A LIT.?
  935.     JR    NC,PDEC2
  936.     CP    '9'+1            ; VALID IN A DEC. LIT.?
  937.     JR    NC,PDEC2
  938.     SUB    '0'            ; CONVERT ASCII TO BINARY
  939.     LD    C,A
  940.     LD    B,0
  941.     PUSH    BC
  942.     LD    B,D
  943.     LD    C,E
  944.     CALL    SHLDE            ; DE X 2
  945.     CALL    SHLDE            ; DE X 4
  946.     CALL    ADCDE            ; DE X 5
  947.     CALL    SHLDE            ; DE X 10
  948.     POP    BC            ; RECOVER NEW DIGIT
  949.     CALL    ABCDE            ; ADD IN NEW DIGIT
  950.     INC    HL            ; POINT TO NEXT CHAR
  951.     JR    PDEC1
  952. PDEC2:    CP    'D'
  953.     JR    NZ,PDEC3
  954.     INC    HL
  955.     LD    A,(HL)            ; GET IT IN ACC
  956. PDEC3:    CALL    HEXDG
  957.     POP    BC
  958.     RET
  959. ;*******************************************************************
  960. ;PROCESS HEXADECIMAL LITERAL.
  961. ;*******************************************************************
  962. PHEX:    PUSH    BC
  963.     LD    DE,0            ; CLEAR 16 BIT ACC.
  964. PHEX1:    LD    A,(HL)            ; GET CHAR
  965.     CALL    HEXDG            ; VALID IN A LITERAL?
  966.     JR    NC,PHEX4
  967.     CP    'F'+1            ; VALID IN A HEX LIT.?
  968.     JR    NC,PHEX4
  969.     SUB    '0'            ; CONVERT ASCII TO BINARY
  970.     CP    10D
  971.     JR    C,PHEX2
  972.     SUB    'A'-'0'-10D
  973. PHEX2:    LD    C,A
  974.     LD    B,4            ; SHIFT DE LEFT 4 TIMES
  975. PHEX3:    CALL    SHLDE
  976.     DEC    B            ; DONE4 SHIFTS YET?
  977.     JR    NZ,PHEX3
  978.     CALL    ADCDE            ; ADD NEW DIGIT TO DE
  979.     INC    HL            ; INCREMENT POINTER TO NEXT CHAR
  980.     JR    PHEX1
  981. PHEX4:    CP    'H'            ; CHAR NOT HEX. IS IT 'H'?
  982.     JR    NZ,PHEX6        ; NO
  983.     INC    HL            ; YES, POINT TO NEXT CAR
  984.     LD    A,(HL)            ; GET IT IN ACC
  985.     CALL    HEXDG            ; VALID CHAR FOR A LIT.?
  986. PHEX5:    POP    BC
  987.     RET
  988. PHEX6:    SCF                ; SET CARRY FOR ERROR
  989.     JR    PHEX5
  990. ;*******************************************************************
  991. ;HEXDG. IS CHAR IN ACC VALID IN A LITERAL.
  992. ;CARRY SET IF HEX DIGIT OR H/O/Q.
  993. ;*******************************************************************
  994. HEXDG:    CALL    DIGIT            ; CARRY SET IF 0-9
  995.     RET    C
  996.     CP    'A'
  997.     JR    C,HEXDG1
  998.     CP    'F'+1
  999.     RET    C
  1000.     CP    'H'
  1001.     JR    Z,HEXDG2
  1002.     CP    'O'
  1003.     JR    Z,HEXDG2
  1004.     CP    'Q'
  1005.     JR    Z,HEXDG2
  1006. HEXDG1:    AND    A            ; NOT HEX DIG., CLEAR CARRY
  1007.     RET
  1008. HEXDG2:    SCF                ; HEX DIGIT, SET CARRY
  1009.     RET
  1010. ;*********************************************************************
  1011. ;SHIFT DE LEFT 1 BIT - ENTER 0 FROM RIGHT.
  1012. ;SET 'VALUE' ERROR IF OVERFLOW.
  1013. ;*********************************************************************
  1014. SHLDE:    EX    DE,HL            ; DO SHIFT BY ADDITION IN HL
  1015.     ADD    HL,HL
  1016.     EX    DE,HL
  1017.     RET    NC            ; NO CARRY, SO RETURN 
  1018.     PUSH    BC            ; CARRY, SO INDICATE 'V' ERROR
  1019.     LD    C,'V'
  1020.     CALL    ERROR
  1021.     POP    BC
  1022.     RET
  1023. ;*********************************************************************
  1024. ;ADD BC TO DE - SET 'VALUE' ERROR IF OVERFLOW.
  1025. ;*********************************************************************
  1026. ABCDE:    PUSH    BC
  1027.     EX    DE,HL            ; DO ADDITION IN HL
  1028.     ADD    HL,BC            ; DO ADDITION
  1029.     EX    DE,HL            ; GET RESULT BACK TO DE
  1030.     JR    NC,ABCDE1
  1031.     LD    C,'V'            ; CARRYOUT SO INDICATE 'V' ERROR
  1032.     CALL    ERROR
  1033. ABCDE1:    POP    BC
  1034.     RET
  1035. ;*********************************************************************
  1036. ;ADD C TO DE - NO OVERFLOW INDICATION
  1037. ;*********************************************************************
  1038. ADCDE:    PUSH    BC
  1039.     EX    DE,HL
  1040.     LD    B,0
  1041.     ADD    HL,BC
  1042.     EX    DE,HL
  1043.     POP    BC
  1044.     RET
  1045. ;*********************************************************************
  1046. ;PROCESS SYMBOL. 
  1047. ;GET SYMBOL AND FETCH ITS VALUE FROM THE SYMBOL TABLE. RETURN VALUE
  1048. ;IN DE.
  1049. ;********************************************************************
  1050. PSYMB:    PUSH    BC            ; SAVE REGISTERS
  1051.     LD    DE,SYMBUF        ; SET PNTR TO SYMBOL BUFFER
  1052.     CALL    GSYM            ; GET SYMB FROM LINE TO SYMBUF
  1053.     PUSH    HL            ; SAVE PNTR TO CHAR AFTER SYMB
  1054.     CALL    LOCATE            ; FIND SYMB IN SYMTAB
  1055.     JR    NZ,PSYMB1        ; NOT IN TABLE?
  1056.     LD    E,(HL)            ; MOVE VALUE TO DE
  1057.     INC    HL
  1058.     LD    D,(HL)
  1059.     JR    PSYMB2
  1060. PSYMB1:    LD    C,'U'            ; INDICATE 'UNDEFINED' ERROR
  1061.     CALL    ERROR
  1062.     LD    DE,0            ; SET DE=0 DEFAULT VALUE
  1063. PSYMB2:    POP    HL            ; REPLACE REGISTERS
  1064.     POP    BC
  1065.     AND    A            ; CLEAR CARRY FLAG SO
  1066.     RET                ; AS NOT TO INDICATE 'VALUE' ERROR
  1067. ;*********************************************************************
  1068. ;PROCESS ASCII LITERAL.
  1069. ;RETURN VALUE OF 1 OR 2 ASCII CHARACTERS.
  1070. ;ON ENTRY:
  1071. ;          HL POINTS TO START QUOTE
  1072. ;ON EXIT:
  1073. ;          HL POINTS TO CHAR AFTER CLOSE QUOTE
  1074. ;          DE CONTAINS VALUE
  1075. ;          CARRY FLAG SET IF ERROR
  1076. ;***********************************************************************
  1077. PASC:    LD    DE,0            ; CLEAR 16 BIT ACC. DE
  1078.     INC    HL            ; POINT TO CHAR AFTER QUOTE
  1079.     CALL    DOUBQ            ; IS NEXT CHAR CLOSING QUOTE?
  1080.     JR    NZ,PASC2        ; JUMP IF SO
  1081.     LD    E,(HL)            ; OTHERWISE SAVE CHAR IN E
  1082.     INC    HL            ; POINT TO NEXT CHAR
  1083.     CALL    DOUBQ            ; NEXT CHAR CLOSE QUOTE?
  1084.     JR    NZ,PASC2        ; JUMP IF SO
  1085.     LD    D,(HL)            ; OTHERWISE SAVE IN D
  1086.     INC    HL            ; POINT TO NEXT CHAR
  1087.     CALL    DOUBQ            ; NEXT CHAR CLOSE QUOTE?
  1088.     JR    NZ,PASC2        ; JUMP IF SO
  1089. PASC1:    SCF                ; ERROR, SET CARRY
  1090.     RET
  1091. PASC2:    AND    A            ; NO ERROR, CLEAR CARRY
  1092.     RET
  1093. ;......................................................
  1094. ;DOUBLE QUOTE.
  1095. ;IS NEXT ITEM IN STRING A CHARACTER OF THE END OF THE ASCII
  1096. ;LITERAL? ON ENTRY: HL POINTS AT THE NEXT ITEM, ON EXIT: HL
  1097. ;HAS BEEN INCREMENTED IF DOUBLE QUOTE. ZERO SET IF CHAR.
  1098. ;......................................................
  1099. DOUBQ:    LD    A,(HL)            ; GET CHAR
  1100.     CP    ''''            ; IS IT A QUOTE?
  1101.     JR    NZ,DOUBQ1        ; JUMP IF NOT
  1102.     INC    HL            ; POINT TO NEXT CHAR
  1103.      LD    A,(HL)            ; GET IT
  1104.     CP    ''''            ; IS IT A QUOTE?
  1105.     RET                ; ZERO SET FOR CHAR
  1106.                     ; CLEARED IF LAST QUOTE WAS
  1107.                     ; CLOSE QUOTE.
  1108. DOUBQ1:    XOR    A            ; LIT CHAR. SET ZERO.
  1109.     RET
  1110. ;********************************************************************
  1111. ;PROCESS MULTI-CHAR FUNCTION.
  1112. ;ON ENTRY:
  1113. ;    HL POINTS TO FIRST CHAR OF FUNCTION STRING
  1114. ;ON EXIT:
  1115. ;    HL POINTS TO CHAR AFTER FUNCTION STRING
  1116. ;    FTOKR CONTAINS TOKEN FOR FUNCTION
  1117. ;    ZERO FLAG SET FOR ERROR
  1118. ;********************************************************************
  1119. PMCF:    PUSH    BC            ; SAVE REGISTERS
  1120.     PUSH    DE
  1121.     INC    HL            ; POINT TO CHAR AFTER '.'
  1122.     LD    A,(HL)            ; GET IT
  1123.     CALL    ALPHA            ; IS IT A LETTER?
  1124.     JR    NC,PMCF1        ; NO, SYNTAX ERROR
  1125.     LD    DE,SYMBUF        ; SET POINTER TO SYMBUF
  1126.     CALL    GSYM            ; GET FUNCTION IN SYMBUF
  1127.     INC    HL            ; INCR PNTR
  1128.     PUSH    HL            ; AND SAVE IT ON STACK
  1129.     CP    '.'            ; WAS CHAR AFT. FUN. '.'?
  1130.     JR    NZ,PMCF2        ; JUMP IF NOT
  1131.     LD    A,(SYMBUF)        ; GET NO OF CHARS
  1132.     CP    5            ; MORE THAN 4?
  1133.     JR    NC,PMCF2        ; JUMP IF SO
  1134.     LD    DE,FTOKR        ; PNTR TO TOKEN REG.
  1135.     LD    HL,MFLSTP        ; PNTR TO OPR LIST
  1136.     LD    C,1            ; 1 TOKEN/ENTRY IN LIST
  1137.     CALL    OPTOK            ; GET TOKEN
  1138.     JR    PMCF3
  1139. PMCF1:    XOR    A            ; SET ZERO TO INDICATE ERR.
  1140.     JR    PMCF4
  1141. PMCF2:    XOR    A            ; SET ZERO TO INDICATE ERROR
  1142. PMCF3:    POP    HL
  1143. PMCF4:    POP    DE
  1144.     POP    BC
  1145.     RET
  1146. ;***********************************************************************
  1147. ;PROCESS SINGLE CHAR FUNCTION.
  1148. ;ON ENTRY:
  1149. ;    HL POINTS AT FUNCTION CHAR
  1150. ;ON EXIT:
  1151. ;    HL POINTS TO CHAR AFTER FUNCTION CHAR(S)
  1152. ;    FTOKR CONTAINS TOKEN FOR FUNCTION
  1153. ;    ZERO FLAG SET IF ERROR
  1154. ;***********************************************************************
  1155. PSCF:    PUSH    BC            ; SAVE REGISTERS
  1156.     PUSH    DE
  1157.     LD    B,(HL)            ; GET POTENTIAL FUNCTION
  1158.     INC    HL            ; & INCR PNTR
  1159.     LD    DE,SCF1            ; SET UP POINTER TO LIST
  1160. PSCF1:    LD    A,(DE)            ; GET LIST ENTRY
  1161.     AND    A            ; IS IT ZERO?
  1162.     JR    Z,PSCF3            ; END OF LIST, INVAL. CHAR
  1163.     CP    B            ; MATCH?
  1164.     INC    DE            ; INCR. PNTR. TO TOKEN
  1165.     JR    Z,PSCF2            ; JUMP IF MATCH
  1166.     INC    DE            ; OTHERWISE POINT TO NEXT ENTRY
  1167.      JR    PSCF1            ; LOOP
  1168. PSCF2:    LD    A,(DE)            ; GET THE TOKEN
  1169.     LD    (FTOKR),A        ; & PUT IN TOKEN REG.
  1170.     CP    ASKTOK            ; IS IT * ?(MAYBE **) 
  1171.     JR    NZ,PSCF4        ; JUMP IF NOT
  1172.     LD    A,(HL)            ; GET NEXT CHAR
  1173.     CP    '*'            ; IS IT '*'?
  1174.     JR    NZ,PSCF4        ; JUMP IF NOT
  1175.     LD    A,EXPTOK        ; PUT TOKEN FOR ** IN REG
  1176.     LD    (FTOKR),A
  1177.     INC    HL            ; AND INCR PNTR
  1178.     AND    A            ; CLEAR ZERO FLAG
  1179.     JR    PSCF4
  1180. PSCF3:    XOR    A            ; SET ZERO TO INDICATE ERROR
  1181. PSCF4:    POP    DE            ; REPLACE REGS
  1182.     POP    BC
  1183.     RET
  1184. ;***********************************************************************
  1185. ;PUSH ACC TO FUNCTION STACK.
  1186. ;BYTE IN A IS PUSHED ONTO THE FUNCTION
  1187. ;STACK (FSTK). IF NOT POSSIBLE OWING TO 
  1188. ;THE STACK BEING FULL, THEN THE ZERO FLAG
  1189. ;IS SET ON EXIT.
  1190. ;***********************************************************************   
  1191. PUFU:    PUSH    HL            ; SAVE REGISTERS
  1192.     PUSH    BC
  1193.     EX  AF,AF'            ; SAVE FUNCTION
  1194.     LD    HL,FSTK            ; LOAD START OF STACK ADDR
  1195.     LD    A,(FCNT)        ; GET STACK COUNTER
  1196.     CP    MAXFSK            ; IS STACK FULL?
  1197.     JR    NC,PUFU2
  1198.     LD    C,A            ; COMPUTE TOP OF STACK
  1199.     LD    B,0
  1200.     ADD    HL,BC            ; TOP OF STACK IN HL
  1201.     INC    A            ; INCREMENT STACK COUNTER
  1202.     LD    (FCNT),A        ; AND STORE NEW VALUE
  1203.     EX  AF,AF'            ; GET FUNCTION BACK
  1204.     LD    (HL),A            ; PUSH ONTO FUNCTION STACK
  1205.     XOR    A            ; CLEAR ZERO FLAG
  1206.     INC    A
  1207. PUFU1:    POP    BC            ; REPLACE REGISTERS
  1208.     POP    HL
  1209.     RET
  1210. PUFU2:    XOR    A            ; SET ZERO FLAG (STACK FULL)
  1211.     JR    PUFU1
  1212. ;***********************************************************************
  1213. ;POP FROM FUNCTION STACK TO ACC
  1214. ;THE TOP BYTE ON THE FUNCTION STACK IS
  1215. ;POPPED INTO THE A REG. IF THE STACK WAS
  1216. ;ALREADY EMPTY, THE ZERO FLAG IS SET ON
  1217. ;EXIT
  1218. ;***********************************************************************
  1219. POFU:    PUSH    HL            ; SAVE REGS.
  1220.     PUSH    BC
  1221.     LD    HL,FSTK            ; LOAD START OF STACK ADDR
  1222.     LD    A,(FCNT)        ; GET STACK COUNTER
  1223.     AND    A            ; TEST FOR EMPTY STACK
  1224.     JR    Z,POFU1
  1225.     DEC    A
  1226.     LD    (FCNT),A
  1227.     LD    C,A
  1228.     LD    B,0
  1229.     ADD    HL,BC
  1230.     XOR    A            ; CLEAR ZERO FLAG
  1231.     INC    A
  1232.     LD    A,(HL)            ; GET STACK TOP TO ACC
  1233. POFU1:    POP    BC            ; REPLACE REGS.
  1234.     POP    HL
  1235.     RET
  1236. ;***********************************************************************
  1237. ;PUSH FROM DE TO ARITHMETIC STACK
  1238. ;THE WORD IN DE IS PUSHED ONTO THE
  1239. ;ARITHMETIC STACK. IF NOT POSSIBLE
  1240. ;OWING TO THE STACK BEING FULL, THEN
  1241. ;THE ZERO FLAG IS SET ON EXIT.
  1242. ;***********************************************************************
  1243. PUDE:    PUSH    HL            ; SAVE REGS.
  1244.     PUSH    BC
  1245.     LD    HL,ARSTK        ; LOAD START OF STACK ADDR
  1246.     LD    A,(ARCNT)        ; GET STACK COUNTER
  1247.         CP    MAXASK            ; IS STACK FULL?
  1248.     JR    NC,PUDE2
  1249.     LD    C,A            ; COMPUTE TOP OF STACK
  1250.     LD    B,0
  1251.     ADD    HL,BC            ; TOP OF STACK IN HL
  1252.     ADD    A,2            ; INCREMENT COUNTER BY 1 WORD
  1253.     LD    (ARCNT),A        ; STORE NEW VALUE OF COUNTER
  1254.     LD    (HL),E            ; PUSH DE ONTO STACK
  1255.     INC    HL
  1256.     LD    (HL),D
  1257.     XOR    A            ; CLEAR ZERO FLAG
  1258.     INC    A
  1259. PUDE1:    POP    BC
  1260.     POP    HL
  1261.     RET
  1262. PUDE2:    XOR    A            ; SET ZERO FLAG (ERROR)
  1263.     JR    PUDE1
  1264. ;**********************************************************************
  1265. ;POP FROM ARITHMETIC STACK TO DE
  1266. ;THE TOP WORD ON THE ARITHMETIC STACK
  1267. ;IS POPPED INTO THE DE REG PAIR. IF
  1268. ;THE STACK WAS EMPTY, THEN THE ZERO
  1269. ;FLAG IS SET ON EXIT
  1270. ;**********************************************************************
  1271. PODE:    PUSH    HL            ; SAVE REGS
  1272.     PUSH    BC
  1273.     LD    HL,ARSTK        ; LOAD START OF STACK ADDR
  1274.     LD    A,(ARCNT)        ; GET STACK COUNTER
  1275.     AND    A            ; IS STACK EMPTY?
  1276.     JR    Z,PODE1
  1277.     SUB    2            ; DECR STACK COUNTER
  1278.     LD    (ARCNT),A        ; AND SAVE NEW VALUE
  1279.     LD    C,A            ; COMPUTE TOP OF STACK
  1280.     LD    B,0
  1281.     ADD    HL,BC
  1282.     LD    E,(HL)            ; POP STACK TO DE
  1283.     INC    HL
  1284.     LD    D,(HL)
  1285.     XOR    A            ; CLEAR ZERO FLAG
  1286.     INC    A
  1287. PODE1:    POP    BC            ; REPLACE REGS
  1288.      POP    HL
  1289.     RET
  1290. ;*********************************************************************
  1291. ;PERFORM A FUNCTION
  1292. ;ON ENTRY:
  1293. ;    A CONTAINS THE COMBINED FUNCTION
  1294. ;    TOKEN/PRIORITY VALUE.
  1295. ;ON EXIT:
  1296. ;    THE REQUIRED ASSEMBLY TIME FUNCTION
  1297. ;    HAS BEEN PERFORMED USING VALUE(S)
  1298. ;    ON THE ARITHMETIC STACK AND LEAVING
  1299. ;    THE RESULT THERE.
  1300. ;    IF THE STACK DID NOT CONTAIN ENOUGH
  1301. ;       VALUES THEN THE ZERO FLAG IS SET.
  1302. ;
  1303. ;THE FOLLOWING SUBROUTINES STARTING WITH
  1304. ;THE LETTER F ARE ALL ASSEMBLY TIME
  1305. ;ARITHMETIC/LOGIC FUNCTIONS, OPERATING ON
  1306. ;THE ARITHMETIC STACK, AND BEING CALLED
  1307. ;INDIRECTLY BY FUNC
  1308. ;********************************************************************
  1309. FUNC:    PUSH    HL            ; SAVE REGS.
  1310.     PUSH    DE
  1311.     PUSH    BC
  1312.     SRL    A            ; GET (FUNC TOKEN)*2
  1313.     SRL    A
  1314.     AND    0FEH
  1315.     LD    C,A            ; COMPUTE POINTER TO SUBROUTINE
  1316.     LD    B,0            ; START ADDR POINTER
  1317.     LD    HL,FUNLST
  1318.     ADD    HL,BC
  1319.     LD    E,(HL)            ; PUT SUBR START ADDR IN HL
  1320.     INC    HL
  1321.     LD    D,(HL)
  1322.     EX    DE,HL
  1323.     LD    DE,FUNC1        ; CALL RELEVANT FUNCTION INDIRECTLY
  1324.     PUSH    DE
  1325.     JP    (HL)
  1326. FUNC1:    POP    BC
  1327.     POP    DE
  1328.     POP    HL
  1329.     RET
  1330. ;.............................................................
  1331. ;FUNCTION LIST.
  1332. ;CONTAINS POINTERS TO THE FUNCTION
  1333. ;SUBROUTINES, USED BY SUBR 'FUNC'
  1334. ;FOR AN INDIRECT SUBR CALL BASED ON
  1335. ;THE VALUE OF THE ARITHMETIC
  1336. ;FUNCTION TOKEN.
  1337. ;.............................................................
  1338. FUNLST:    DEFW    FMNPL
  1339.     DEFW    FMNMN
  1340.      DEFW    FNOT
  1341.     DEFW    FHIGH
  1342.     DEFW    FLOW
  1343.     DEFW    FRES
  1344.     DEFW    FEXP
  1345.     DEFW    FMULT
  1346.     DEFW    FDIV
  1347.     DEFW    FMOD
  1348.     DEFW    FSHR
  1349.     DEFW    FSHL
  1350.     DEFW    FDIPL
  1351.     DEFW    FDIMN
  1352.     DEFW    FAND
  1353.     DEFW    FOR
  1354.     DEFW    FXOR
  1355.     DEFW    FEQ
  1356.     DEFW    FGT
  1357.     DEFW    FLT
  1358.     DEFW    FUGT
  1359.     DEFW    FULT
  1360. ;**************************************************************
  1361. ;FUNCTION MONADIC PLUS.
  1362. ;**************************************************************
  1363. FMNPL:    PUSH    DE            ; SAVE REG
  1364.     CALL    PODE            ; SEE IF VALUE AVAILABLE ON STACK
  1365.     JR    Z,FMNPL1        ; JUMP IF NOT (ZERO SET)
  1366.     CALL    PUDE            ; PUSH BACK ON STACK
  1367. FMNPL1:    POP    DE            ; REPLACE REG
  1368.     RET
  1369. ;**************************************************************
  1370. ;FUNCTION MONADIC MINUS.
  1371. ;**************************************************************
  1372. FMNMN:    PUSH    DE            ; SAVE REGS.
  1373.     PUSH    HL
  1374.     CALL    PODE            ; GET VALUE OFF ARITH STACK
  1375.     JR    Z,FMNMN1        ; JUMP IF EMPTY
  1376.     LD    HL,0            ; PUT 0 INTO HL
  1377.     AND    A            ; CLEAR CARRY
  1378.     SBC    HL,DE            ; SUBTRACT VALUE FROM 0
  1379.     EX    DE,HL            ; GET RESULT IN DE
  1380.     CALL    PUDE            ; PUSH BACK ON STACK
  1381. FMNMN1:    POP    HL            ; REPLACE REGS.
  1382.     POP    DE
  1383.     RET
  1384. ;**************************************************************
  1385. ;FUNCTION NOT
  1386. ;**************************************************************
  1387. FNOT:    PUSH    DE            ; SAVE REG.
  1388.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1389.     JR    Z,FNOT1            ; JUMP IF EMPTY
  1390.     LD    A,D            ; COMPLEMENT DE
  1391.     CPL
  1392.     LD    D,A
  1393.     LD    A,E
  1394.     CPL
  1395.     LD    E,A
  1396.     CALL    PUDE            ; PUSH BACK ON ARITH STACK
  1397. FNOT1:    POP    DE            ; REPLACE REG.
  1398.     RET
  1399. ;**************************************************************
  1400. ;FUNCTION HIGH.
  1401. ;RETURNS HIGH BYTE OF ARGUMENT AS RESULT.
  1402. ;**************************************************************
  1403. FHIGH:    PUSH    DE            ; SAVE REGISTERS
  1404.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1405.     JR    Z,FHIGH1        ; ERROR IF EMPTY
  1406.     LD    E,D            ; PUT HIGH BYTE IN DE
  1407.     LD    D,0
  1408.     CALL    PUDE            ; PUSH RESULT ON ARITH STACK
  1409. FHIGH1: POP    DE
  1410.     RET
  1411. ;**************************************************************
  1412. ;FUNCTION LOW.
  1413. ;RETURNS LOW BYTE OF ARGUMENT AS RESULT.
  1414. ;**************************************************************
  1415. FLOW:    PUSH    DE            ; SAVE REGISTERS
  1416.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1417.     JR    Z,FLOW1            ; ERROR IF EMPTY
  1418.     LD    D,0            ; LOW BYTE ONLY REQD
  1419.     CALL    PUDE            ; PUSH BACK RESULT
  1420. FLOW1:    POP    DE            ; REPLACE REGS
  1421.     RET
  1422. ;***************************************************************
  1423. ;FNCTION RESULT
  1424. ;CLEARS ARITHMETIC OVERFLOW FLAG
  1425. ;***************************************************************
  1426. FRES:    EXX                ; CLEAR OVERFLOW FLAG
  1427.     RES    1,B            ; BIT 1 IN REG B
  1428.     EXX
  1429.     RET
  1430. ;***************************************************************
  1431. ;FUNCTION EXPONENTIATE
  1432. ;***************************************************************
  1433. FEXP:    PUSH    HL            ; SAVE REGS
  1434.     PUSH    DE
  1435.     CALL    PODE            ; GET EXPONENT FROM STACK
  1436.     JR    Z,FEXP5            ; JMP IF ARITH STACK EMPTY
  1437.     EX    DE,HL            ; PUT EXPONENT IN HL
  1438.     CALL    PODE            ; GET OTHER NUMBER IN DE
  1439.     JR    Z,FEXP5            ; JUMP IF STACK EMPTY
  1440.     LD    A,H            ; EXPONENT ZERO?
  1441.     OR    L
  1442.     JR    NZ,FEXP1        ; JUMP IF NOT
  1443.     LD    DE,1            ; RESULT = 1
  1444.     CALL    PUDE            ; PUSH IT ON STACK
  1445.     JR    FEXP5
  1446. FEXP1:    BIT    7,H            ; EXPONENT NEGATIVE?
  1447.     JR    Z,FEXP2            ; JUMP IF NOT
  1448.     LD    DE,0            ; RESULT = 0
  1449.     CALL    PUDE            ; PUSH IT ON STACK
  1450.     JR    FEXP5
  1451. FEXP2:    CALL    PUDE            ; PUSH THE NUMBER
  1452. FEXP3:    DEC    HL            ; DECR EXPONENT
  1453.     LD    A,H            ; IS IT ZERO NOW?
  1454.     OR    L
  1455.     JR    Z,FEXP4            ; JUMP IF SO
  1456.     CALL    PUDE            ; PUSH THE NUMBER
  1457.     CALL    FMULT            ; & MULTIPLY
  1458.     JR    FEXP3            ; LOOP
  1459. FEXP4:    XOR    A            ; CLEAR ZERO FLAG
  1460.     INC    A
  1461. FEXP5:    POP    DE            ; REPLACE REGISTERS
  1462.     POP    HL
  1463.     RET
  1464.  
  1465. ; *******************************************************************
  1466. ; FUNCTION MULTIPLY
  1467. ; *******************************************************************
  1468. FMULT:    PUSH    HL            ; SAVE REGISTERS
  1469.     PUSH    DE            
  1470.     PUSH    BC
  1471.     EXX
  1472.     PUSH    DE
  1473.     LD    E,0            ; CLEAR E' (SIGN FLAG)
  1474.     EXX
  1475.     CALL    PODE            ; GET A VALUE FROM ARITH STACK
  1476.     JR    Z,FMULT6        ; JUMP IF EMPTY
  1477.     BIT    7,D            ; IS IT NEGATIVE?
  1478.     CALL    NZ,NEGDE        ; IF SO, NEGATE, AND COMPLEMENT
  1479.                     ; SIGN FLAG
  1480.     EX    DE,HL
  1481.     CALL    PODE            ; GET ANOTHER VALUE FROM STACK
  1482.     JR    Z,FMULT6        ; JUMP IF EMPTY
  1483.     BIT    7,D            ; IS IT -VE
  1484.     CALL    NZ,NEGDE        ; IF SO, NEGATE, AND COMPL.
  1485.                     ; SIGN FLAG
  1486.     AND    A            ; CLEAR CARRY
  1487.     SBC    HL,DE            ; TEST FOR LARGER NO.
  1488.     ADD    HL,DE            ; MULTIPLIER SHOULD BE SMALLER
  1489.     JR    NC,FMULT1        ; JUMP IF CORRECT
  1490.     EX    DE,HL            ; OTHERWISE SWAP NOS.
  1491. FMULT1:    LD    B,H            ; PUT MULTIPLICAND IN BC
  1492.     LD    C,L
  1493.     LD    HL,0            ; CLEAR HL FOR ACCUMALATOR
  1494. FMULT2:    LD    A,D            ; IS MULTIPLIER 0?
  1495.     OR    E
  1496.     JR    Z,FMULT5        ; JUMP IF FINISHED
  1497.     SRL    D            ; SHIFT DE RIGHT INTO CARRY
  1498.     RR    E
  1499.     JR    NC,FMULT4        ; JUMP IF ZERO CARRY
  1500.     AND    A            ; CLEAR CARRY
  1501.     ADC    HL,BC            ; ADD MULTIPLICAND TO RUNNING TOTAL
  1502.     JP    M,FMULT3        ; JUMP IF OVERFLOW TO BIT 15
  1503.     JR    NC,FMULT4        ; JUMP IF NO O/F TO BIT 16
  1504. FMULT3:    EXX                ; SET OVERFLOW FLAG
  1505.     SET    1,B
  1506.     EXX
  1507. FMULT4:    SLA    C            ; SHIFT MULTIPLICAND LEFT
  1508.     RL    B
  1509.     JR    FMULT2            ; LOOP
  1510. FMULT5:    EX    DE,HL            ; GET RESULT BACK IN DE
  1511.     EXX                ; SHOULD RESULT BE -VE?
  1512.     BIT    0,E            ; (PRODUCT SIGN IN E')
  1513.     EXX
  1514.     CALL    NZ,NEGDE
  1515.     CALL    PUDE            ; PUSH PRODUCT ONTO ARITH STACK
  1516. FMULT6:    EXX                ; REPLACE REGS.
  1517.     POP    DE
  1518.     EXX
  1519.     POP    BC
  1520.     POP    DE
  1521.     POP    HL
  1522.     RET
  1523. ;***********************************************************************
  1524. ;FUNCTION DIVIDE
  1525. ;***********************************************************************
  1526. FDIV:    PUSH    HL            ; SAVE REGISTERS
  1527.     PUSH    DE
  1528.     CALL    PODE            ; GET DIVISOR FROM ARITH STACK
  1529.     JR    Z,FDIV1            ; JUMP IF EMPTY
  1530.     EX    DE,HL            ; PUT IN HL
  1531.     CALL    PODE            ; GET DIVIDEND FROM ARITH STACK
  1532.     JR    Z,FDIV1            ; JUMP IF EMPTY
  1533.     CALL    DIV            ; DO THE DIVISION
  1534.         CALL    PUDE            ; PUSH QUOTIENT (IN DE) ONTO STACK
  1535. FDIV1:    POP    DE            ; REPLACE REGISTERS
  1536.     POP    HL
  1537.     RET
  1538. ;**********************************************************************
  1539. ;FUNCTION MODULO
  1540. ;**********************************************************************
  1541. FMOD:    PUSH    HL            ; SAVE REGISTERS
  1542.     PUSH    DE
  1543.     CALL    PODE            ; GET DIVISOR FROM ARITH STACK
  1544.     JR    Z,FMOD1            ; JUMP IF EMPTY
  1545.     EX    DE,HL            ; PUT IN HL
  1546.     CALL    PODE            ; GET DIVIDEND FOM ARITH STACK
  1547.     JR    Z,FMOD1            ; JUMP IF EMPTY
  1548.     CALL    DIV            ; DO THE DIVISION
  1549.     EX    DE,HL            ; GET REMAINDER IN DE
  1550.     CALL    PUDE            ; PUSH ONTO ARITH STACK
  1551. FMOD1:    POP    DE            ; REPLACE REGISTERS
  1552.     POP    HL
  1553.     RET
  1554. ;**********************************************************************
  1555. ;DIVIDE
  1556. ;THIS SUBROUTINE IS USED BY FDIV AND FMOD
  1557. ;IT DIVIDES DE BY HL, LEAVING THE QUOTIENT
  1558. ;IN DE AND THE REMAINDER IN HL.
  1559. ;SIGNED 16 BIT ARITHMETIC IS USED.
  1560. ;**********************************************************************
  1561. DIV:    PUSH    BC            ; SAVE REGISTERS
  1562.     EXX
  1563.     PUSH    DE
  1564.     LD    DE,0            ; CLEAR DE' (D'=PLACE COUNT)
  1565.                     ; (E'=SIGN COUNT)
  1566.     EXX
  1567.     BIT    7,D            ; IS DIVIDEND -VE?
  1568.     JR    Z,DIV1            ; JUMP IF NOT
  1569.     EXX                ; OTHERWISE FLAG IN E', BIT 7
  1570.     SET    7,E            ; TO GIVE SIGN OF REMAINDER
  1571.     EXX
  1572. DIV1:    BIT    7,D            ; IS DIVIDEND -VE?
  1573.     CALL    NZ,NEGDE        ; IF SO NEGATE, AND INCR
  1574.                     ; QUOTIENT SIGN BIT (E' BIT 0)
  1575.     EX    DE,HL            ; SWAP NOS.
  1576.     BIT    7,D            ; IS DIVISOR -VE?
  1577.     CALL    NZ,NEGDE        ; IF SO NEGATE AND
  1578.                     ; INCR QUOTIENT SIGN FLAG
  1579.     LD    A,D            ; IS DIVISOR ZERO?
  1580.     OR    E
  1581.     JR    NZ,DIV2            ; JUMP IF NOT
  1582.     LD    C,'Z'            ; FLAG 'DIV BY ZERO' ERROR
  1583.     CALL    ERROR
  1584.     LD    HL,0            ; RETURN ZERO RESULTS
  1585.     LD     DE,0               
  1586.     JR    DIV6            ; GO TO END
  1587. DIV2:    EXX                ; INCR PLACE COUNT
  1588.     INC    D
  1589.     EXX
  1590.     SLA    E            ; SHIFT DIVISOR LEFT UNTIL SIGN
  1591.     RL    D            ; SET, COUNTING NO. OF PLACES
  1592.     JP    P,DIV2
  1593.     LD    BC,0            ; CLEAR QUOTIENT REG BC
  1594. DIV3:    SLA    C            ; SHIFT QUOTIENT LEFT
  1595.     RL    B
  1596.     SRL    D
  1597.     RR    E
  1598.     AND    A            ; CLEAR CARRY
  1599.     SBC    HL,DE            ; SUBTRACT DIVISOR FROM DIVIDEND
  1600.     JR    C,DIV4            ; JUMP IF TOO MUCH SUBTRACTION
  1601.     INC    BC            ; OTHERWISE INCR QUOTIENT
  1602.     JR    DIV5
  1603. DIV4:    ADD    HL,DE            ; REPLACE EXCESSIVE SUBTRACTION
  1604. DIV5:    EXX                ; DECR PLACE COUNT
  1605.     DEC    D
  1606.     EXX
  1607.     JR    NZ,DIV3            ; LOOP IF NOT FINISHED
  1608.     LD    D,B            ; TRANSFER QUOTIENT TO DE
  1609.     LD     E,C
  1610.     EX    DE,HL            ; SWAP WITH REMAINDER
  1611.     EXX                ; GET SIGN FLAGS INTO C
  1612.     LD    A,E              
  1613.     EXX
  1614.     LD    C,A
  1615.     BIT    7,C            ; WAS DIVIDEND -VE?
  1616.     CALL    NZ,NEGDE        ; NEGATE REMAINDER IF SO
  1617.     EX    DE,HL            ; SWAP BACK NOS.
  1618.     BIT    0,C            ; IS QUOTIENT -VE?
  1619.     CALL    NZ,NEGDE        ; NEGATE IF SO
  1620. DIV6:    EXX                ; REPLACE REGISTERS
  1621.     POP    DE
  1622.     EXX
  1623.     POP    BC
  1624.     RET
  1625. ;*************************************************************************
  1626. ;NEGATE DE
  1627. ;USED BE FMULT AND DIV TO NEGATE CONTENTS OF DE
  1628. ;AND COMPLEMENT A SIGN FLAG HELD IN E' BIT 0
  1629. ;*************************************************************************
  1630. NEGDE:    PUSH    HL            ; SAVE HL
  1631.     LD    HL,0            ; NEGATE SIGNED NO. IN DE
  1632.     AND    A            ; CLEAR CARRY
  1633.     SBC    HL,DE            ; SUBTRACT DE FROM 0
  1634.     EX    DE,HL            ; GET RESULT INTO DE
  1635.     EXX                ; COMPLEMENT PRODUCT SIGN
  1636.                     ; BIT IN E'
  1637.     RR    E
  1638.     CCF
  1639.     RL    E
  1640.     EXX
  1641.     POP    HL
  1642.     RET
  1643. ;************************************************************************
  1644. ;FUNCTION SHIFT RIGHT.
  1645. ;************************************************************************
  1646. FSHR:    PUSH    DE            ; SAVE REGS.
  1647.     PUSH    HL
  1648.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1649.     JR    Z,FSHR3            ; ERROR IF EMPTY
  1650.     EX    DE,HL            ; OTHERWISE PUT IN HL
  1651.     CALL    PODE            ; GET VALUE TO BE SHIFTED
  1652.     JR    Z,FSHR3            ; JUMP IF EMPTY, ERROR
  1653. FSHR1:    LD    A,H            ; TEST HL FOR ZERO
  1654.     OR    L            ; AND CLEAR CARRY
  1655.     JR    Z,FSHR2            ; JUMP IF NO MORE SHIFTING
  1656.     SRL    D            ; SHIFT DE RIGHT ONE BIT
  1657.     RR    E
  1658.     DEC    HL            ; DECR NO. OF SHIFTS REQD
  1659.     JR    FSHR1            ; LOOP
  1660. FSHR2:    CALL    PUDE            ; PUSH RESULT BACK ON STACK
  1661. FSHR3:    POP    HL            ; REPLACE REGS
  1662.     POP    DE
  1663.     RET
  1664. ;***********************************************************************
  1665. ;FUNCTION SHIFT LEFT
  1666. ;***********************************************************************
  1667. FSHL:    PUSH    DE            ; SAVE REGS.
  1668.     PUSH    HL
  1669.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1670.     JR    Z,FSHL3            ; JUMP IF EMPTY, ERROR
  1671.     EX    DE,HL            ; GET VALUE IN HL
  1672.     CALL    PODE            ; GET VALUE TO BE SHIFTED
  1673.     JR    Z,FSHL3            ; ERROR IF EMPTY
  1674. FSHL1:    LD    A,H            ; TEST HL FOR ZERO
  1675.     OR    L            ; AND CLEAR CARRY
  1676.     JR    Z,FSHL2              
  1677.     SLA    E            ; SHIFT DE LEFT 1 BIT
  1678.     RL    D
  1679.     DEC    HL            ; DECR NO. OF SHIFTS REGD.
  1680.     JR    FSHL1            ; LOOP
  1681. FSHL2:    CALL    PUDE            ; PUSH RESULT ON ARITH STACK
  1682. FSHL3:    POP    HL            ; REPLACE REGS.
  1683.     POP    DE
  1684.     RET
  1685. ;*********************************************************************
  1686. ;FUNCTION DIADIC ADDITION
  1687. ;*********************************************************************
  1688. FDIPL:    PUSH    HL            ; SAVE REGISTERS
  1689.     PUSH    DE
  1690.     CALL    PODE            ; GET 1ST VALUE TO BE ADDED
  1691.     JR    Z,FDIPL6        ; STACK EMPTY- ERROR
  1692.     EX    DE,HL            ; PUT 1ST VALUE IN HL
  1693.     CALL    PODE            ; GET 2ND VALUE
  1694.     JR    Z,FDIPL6        ; STACK EMPTY ERROR
  1695.     EXX                ; CLEAR +VE/-VE FLAGS IN B'
  1696.     RES    6,B            ; (-VE)
  1697.     RES    7,B            ; (+VE)
  1698.     EXX
  1699.     LD    A,H            ; BOTH VALUES -VE?
  1700.     AND    D
  1701.     JP    P,FDIPL1
  1702.     EXX                ; YES, SET 'BOTH -VE' FLAG
  1703.     SET    6,B
  1704.     EXX
  1705.     JR    FDIPL2
  1706. FDIPL1:    LD    A,H            ; BOTH VALUES +VE?
  1707.     OR    D
  1708.     JP    M,FDIPL2
  1709.     EXX                ; YES, SET BOTH +VE FLAG
  1710.     SET    7,B
  1711.     EXX
  1712. FDIPL2:    AND    A            ; CLEAR CARRY FLAG
  1713.     ADC    HL,DE            ; ADD THE 2 VALUES
  1714.     EXX
  1715.     JP    M,FDIPL3
  1716.     BIT    6,B            ; RESULT +VE
  1717.     JR    Z,FDIPL5
  1718.     JR    FDIPL4            ; SET OVERFLOW FLAG
  1719. FDIPL3:    BIT    7,B
  1720.     JR    Z,FDIPL5
  1721. FDIPL4:    SET    1,B            ; SET OVERFLOW FLAG
  1722. FDIPL5:    EXX
  1723.     EX    DE,HL            ; GET RESULT IN DE
  1724.     CALL    PUDE            ; PUSH RESULT ON STACK
  1725. FDIPL6:    POP    DE
  1726.     POP    HL
  1727.     RET
  1728. ;********************************************************************
  1729. ;FUNCTION DIADIC MINUS.
  1730. ;********************************************************************
  1731. FDIMN:    PUSH    HL            ; SAVE REGS.
  1732.     PUSH    DE
  1733.     CALL    PODE            ; GET MINUEND FROM STACK
  1734.     JR    Z,FDIMN6        ; JUMP IF EMPTY, ERROR
  1735.     EX    DE,HL            ; PUT IN HL
  1736.     CALL    PODE            ; GET SUBTRAHEND
  1737.     JR    Z,FDIMN6        ; JUMP IF EMPTY
  1738.     EXX                ; CLEAR +VE/-VE FLAGS IN B'
  1739.     RES    6,B            ; (-VE EXPECTED FLAG)
  1740.     RES    7,B            ; (+VE EXPECTED FLAG)
  1741.     EXX
  1742.     LD    A,D
  1743.     AND    A            ; TEST SIGN OF SUBTRAHEND
  1744.     JP    M,FDIMN1        ; JUMP IF -VE
  1745.     LD    A,H
  1746.     AND    A            ; TEST SIGN OF MINUEND
  1747.     JP    P,FDIMN2        ; JUMP IF OF OPPOSITE SIGN
  1748.                     ; NO OVERFLOW POSSIBLE
  1749.     EXX                     ; OTHERWISE SET          
  1750.     SET    7,B            ; +VE EXPECTED FLAG
  1751.     EXX
  1752.     JR    FDIMN2
  1753. FDIMN1:    LD    A,H            ; TEST SIGN OF MINUEND
  1754.     AND    A
  1755.     JP    M,FDIMN2        ; JUMP IF OF OPPOSITE SIGN 
  1756.                     ; NO OVERFLOW POSSIBLE
  1757.     EXX                ; SET '-VE EXPECTED' FLAG
  1758.     SET    6,B
  1759.     EXX
  1760. FDIMN2:    EX    DE,HL            ; GET SUBTRAHEND IN HL
  1761.     AND    A            ; CLEAR CARRY
  1762.     SBC    HL,DE            ; DO THE SUBTRACTION
  1763.     EX    DE,HL            ; GET THE RESULT IN DE
  1764.     EXX                ; PREPARE TO EXAMINE B'
  1765.     JP    M,FDIMN3        ; JUMP IF -VE RESULT
  1766.     BIT    6,B            ; RESULT +VE, WAS -VE EXPECTED?
  1767.     JR    NZ,FDIMN4        ; JUMP IF SO
  1768.     JR    FDIMN5            ; OTHERWISE NO OVERFLOW
  1769. FDIMN3:    BIT    7,B            ; RESULT -VE, WAS +VE EXPECTED?
  1770.     JR    Z,FDIMN5        ; JUMP IF NOT
  1771. FDIMN4:    SET    1,B            ; SET OVERFLOW FLAG (1,B')
  1772. FDIMN5:    EXX                ; SWITCH REGS BACK
  1773.     CALL    PUDE            ; PUSH RESULT ON ARITH STACK
  1774. FDIMN6:    POP    DE            ; REPLACE REGS
  1775.     POP    HL
  1776.     RET
  1777. ;**********************************************************************
  1778. ;FUNCTION AND
  1779. ;**********************************************************************
  1780. FAND:    PUSH    DE            ; SAVE REGISTERS 
  1781.     PUSH    HL
  1782.     CALL    PODE            ; GET VALUE FROM STACK
  1783.     JR    Z,FAND1            ; JUMP IF EMPTY
  1784.     EX    DE,HL
  1785.     CALL    PODE            ; GET THE OTHER VALUE
  1786.     JR    Z,FAND1            ; JUMP IF STACK EMPTY
  1787.     LD     A,D            ; DO 16 BIT LOGICAL AND
  1788.     AND    H
  1789.     LD    D,A            ; WITH RESULT IN DE
  1790.     LD    A,E
  1791.     AND    L
  1792.     LD    E,A
  1793.     CALL    PUDE            ; PUSH RESULT ON STACK
  1794. FAND1:    POP    HL            ; REPLACE REGS
  1795.     POP    DE              
  1796.     RET
  1797. ;*********************************************************************
  1798. ;FUNCTION OR
  1799. ;*********************************************************************
  1800. FOR:    PUSH    DE            ; SAVE REGS.
  1801.     PUSH    HL
  1802.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1803.     JR    Z,FOR1            ; JUMP IF STACK EMPTY
  1804.     EX    DE,HL            ; PUT IN HL
  1805.     CALL    PODE            ; GET THE OTHER VALUE
  1806.     JR    Z,FOR1            ; JUMP IF STACK EMPTY
  1807.     LD    A,D            ; DO 16 BIT LOGICAL OR
  1808.     OR    H            ; ON HL AND DE
  1809.     LD    D,A            ; RESULT IN DE
  1810.     LD    A,E
  1811.     OR    L
  1812.     LD    E,A
  1813.     CALL    PUDE            ; PUSH RESULT ON STACK
  1814. FOR1:    POP    HL            ; REPLACE REGS
  1815.     POP    DE
  1816.     RET
  1817. ;********************************************************************
  1818. ;FUNCTION EXCLUSIVE OR
  1819. ;********************************************************************
  1820. FXOR:    PUSH    DE            ; SAVE REGS
  1821.     PUSH    HL
  1822.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1823.     JR    Z,FXOR1            ; JUMP IF STACK EMPTY
  1824.     EX    DE,HL            ; PUT IT IN HL
  1825.     CALL    PODE            ; GET THE OTHER VALUE
  1826.     JR    Z,FXOR1            ; JUMP IF STACK EMPTY
  1827.     LD    A,D            ; DO 16 BIT XOR ON HL AND DE
  1828.     XOR    H
  1829.     LD    D,A            ; RESULT IN DE
  1830.     LD    A,E
  1831.     XOR    L
  1832.     LD    E,A
  1833.     CALL    PUDE            ; PUSH RESULT ON ARITH STACK
  1834. FXOR1:    POP    HL            ; REPLACE REGS
  1835.     POP    DE
  1836.     RET
  1837. ;*******************************************************************
  1838. ;FUNCTION EQUALS
  1839. ;*******************************************************************
  1840. FEQ:    PUSH    DE            ; SAVE REGS
  1841.     PUSH    HL
  1842.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1843.     JR    Z,FEQ2            ; JUMP IF STACK EMPTY
  1844.     EX    DE,HL            ; PUT IT IN HL
  1845.     CALL    PODE            ; GET ANOTHER VALUE IN DE
  1846.     JR    Z,FEQ2            ; JUMP IF STACK EMPTY
  1847.     AND    A            ; CLEAR CARRY
  1848.     SBC    HL,DE            ; COMPARE VALUES
  1849.     LD    DE,0            ; RESULT IN DE (0 OR 1)
  1850.     JR    NZ,FEQ1            ; JUMP IF VALUES NOT EQUAL
  1851.     DEC    DE            ; OTHERWISE LET RESULT= -1
  1852. FEQ1:    CALL    PUDE            ; PUSH RESULT ON STACK
  1853. FEQ2:    POP    HL            ; REPLACE REGS 
  1854.     POP    DE
  1855.     RET
  1856. ;*********************************************************************
  1857. ;FUNCTION GREATER THAN
  1858. ;*********************************************************************
  1859. FGT:    PUSH    DE            ; SAVE REGS.
  1860.     PUSH    HL
  1861.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1862.     JR    Z,FGT2            ; JUMP IF STACK EMPTY
  1863.     EX    DE,HL
  1864.     CALL    PODE            ; GET THE OTHER VALUE IN DE
  1865.     JR    Z,FGT2            ; JUMP IF STACK EMPTY
  1866.     LD    A,D            ; ADD 8000H TO EACH NO.
  1867.     ADD    A,80H
  1868.     LD    D,A
  1869.     LD    A,H
  1870.     ADD    A,80H
  1871.     LD    H,A
  1872.     AND    A            ; CLEAR CARRY
  1873.     SBC    HL,DE            ; COMPARE VALUES
  1874.     LD    DE,0            ; RESULT IN DE (0 OR 1)
  1875.       JR    NC,FGT1            ; JUMP IF NOT GREATER THAN 
  1876.     DEC    DE            ; OTHERWISE RESULT= -1
  1877. FGT1:    CALL    PUDE            ; PUSH RESULT ON STACK
  1878. FGT2:    POP    HL            ; REPLACE REGS
  1879.     POP    DE
  1880.     RET
  1881. ;*********************************************************************
  1882. ;FUNCTION LESS THAN
  1883. ;*********************************************************************
  1884. FLT:    PUSH    DE            ; SAVE REGS
  1885.     PUSH    HL
  1886.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1887.     JR    Z,FLT2            ; JUMP IF STACK EMPTY
  1888.     EX    DE,HL            ; PUT VALUE IN HL
  1889.     CALL    PODE            ; GET THE OTHER VALUE IN DE
  1890.     JR    Z,FLT2            ; JUMP IF STACK EMPTY
  1891.     LD    A,D            ; ADD 8000H TO EACH NO.
  1892.     ADD    A,80H
  1893.     LD    D,A
  1894.     LD    A,H
  1895.     ADD    A,80H
  1896.     LD    H,A
  1897.     EX    DE,HL            ; SWAP NOS.
  1898.     AND    A            ; CLEAR CARRY
  1899.     SBC    HL,DE            ; COMPARE VALUES
  1900.     LD    DE,0            ; RESULT IN DE (0 OR 1)
  1901.     JR    NC,FLT1            ; JUMP IF NOT LESS THAN
  1902.     DEC    DE            ; OTHERWISE RESULT= -1
  1903. FLT1:    CALL    PUDE            ; PUSH RESULT ON STACK
  1904. FLT2:    POP    HL            ; REPLACE REGS
  1905.     POP    DE
  1906.     RET
  1907. ;********************************************************************
  1908. ;FUNCTION UNSIGNED GREATER THAN
  1909. ;********************************************************************
  1910. FUGT:    PUSH    DE            ; SAVE REGS
  1911.     PUSH    HL
  1912.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1913.     JR    Z,FUGT2            ; JUMP IF STACK EMPTY
  1914.     EX    DE,HL
  1915.     CALL    PODE            ; GET THE OTHER VALUE IN DE
  1916.     JR    Z,FUGT2            ; JUMP IF STACK EMPTY
  1917.     AND    A            ; CLEAR CARRY
  1918.     SBC    HL,DE            ; COMPARE VALUES
  1919.     LD    DE,0            ; RESULT IN DE (0 OR 1)
  1920.     JR    NC,FUGT1        ; JUMP IF NOT GREATER THAN
  1921.     DEC    DE            ; OTHERWISE RESULT= -1
  1922. FUGT1:    CALL    PUDE            ; PUSH RESULT ON STACK
  1923. FUGT2:    POP    HL            ; REPLACE REGS
  1924.     POP    DE
  1925.     RET
  1926. ;********************************************************************
  1927. ;FUNCTION UNSIGNED LESS THAN
  1928. ;********************************************************************
  1929. FULT:    PUSH    DE            ; SAVE REGS.
  1930.     PUSH    HL
  1931.     CALL    PODE            ; GET VALUE FROM ARITH STACK
  1932.     JR    Z,FULT2            ; JUMP IF STACK EMPTY
  1933.     EX    DE,HL            ; PUT VALUE IN HL
  1934.     CALL    PODE            ; GET THE OTHER VALUE IN DE
  1935.     JR    Z,FULT2            ; JUMP IF STACK EMPTY
  1936.     EX    DE,HL            ; SWAP NOS.
  1937.     AND    A            ; CLEAR CARRY
  1938.     SBC    HL,DE            ; COMPARE VALUES
  1939.        LD    DE,0            ; RESULT IN DE (0 OR 1)
  1940.     JR    NC,FULT1        ; JUMP IF NO LESS THAN
  1941.     DEC    DE            ; OTHERWISE RESULT= -1
  1942. FULT1:     CALL    PUDE            ; PUSH RESULT ON STACK
  1943. FULT2:    POP    HL            ; REPLACE REGS
  1944.     POP    DE
  1945.     RET
  1946. ;*******************************************************************
  1947. ;GET TITLE TO TITLE BUFFER.
  1948. ;ON ENTRY:
  1949. ;    (LINPNT) POINTS AT CHAR AFTER THE                
  1950. ;       'TITLE' PSEUDO-OPERATOR.
  1951. ;ON EXIT:
  1952. ;       THE OPERAND (A STRING BETWEEN SINGLE
  1953. ;       QUOTES) HAS BEEN TRANSFERED TO THE TITLE BUFFER.
  1954. ;*******************************************************************   
  1955. TITL:    PUSH    HL            ; SAVE REGISTERS
  1956.     PUSH    DE
  1957.     PUSH    BC
  1958.     LD    HL,TITBUF        ; CLEAR TITLE BUFFER
  1959.     LD    C,TITSIZ+1
  1960.     XOR    A
  1961. TITL1:    LD    (HL),A
  1962.     INC    HL
  1963.     DEC    C
  1964.     JR    NZ,TITL1
  1965.      LD    HL,(LINPNT)        ; GET LINE POINTER
  1966.     CALL    STR            ; FIND STRING
  1967.     JR    Z,TITL5            ; NOT FOUND
  1968.     LD    A,C            ; GET COUNT OF STRING
  1969.     CP    TITSIZ+1        ; MORE CHARS THAN SIZE OF TITBUF?
  1970.     JR    C,TITL2
  1971.     LD    C,TITSIZ        ; YES, FORCE TO TITBUF SIZE
  1972.     JR    TITL3
  1973. TITL2:    AND    A            ; IS IT 0 CHARS?
  1974.     JR    Z,TITL5
  1975. TITL3:    EX    DE,HL            ; DO TRANSFER
  1976.     LD    DE,TITBUF
  1977. TITL4:    CALL    DOUBQ            ; SKIP CHAR IF COUBLE QUOTE
  1978.     LDI                ; TRANSFER A CHAR
  1979.     JP    PE,TITL4        ; JUMP IF TRANSFER NOT COMPLETE  
  1980. TITL5:    POP    BC            ; REPLACE REGISTERS
  1981.     POP     DE
  1982.     POP    HL
  1983.     RET
  1984. ;************************************************************************
  1985. ;GET DEFM OPERAND.
  1986. ;ON ENTRY:
  1987. ;    (LINPNT) POINTS AT CHAR AFTER
  1988. ;    DEFM PSEUDO-OPERATOR.
  1989. ;ON EXIT:
  1990. ;       THE OPERAND (A STRING BETWEEN QUOTES)
  1991. ;       HAS BEEN TRANSFERED INTO THE
  1992. ;       ASSEMBLED CODE BUFFER.
  1993. ;************************************************************************
  1994. DM:    PUSH    HL            ; SAVE REGISTERS
  1995.     PUSH    DE
  1996.     PUSH    BC
  1997.     LD    HL,(LINPNT)        ; GET LINE POINTER
  1998.     CALL    STR            ; FIND STRING
  1999.     JR    Z,DM4            ; NOT FOUND
  2000.     LD    A,C            ; GET COUNT OF STRING
  2001.     CP    ACBSIZ+1        ; MORE CHARS THAN SIZE OF A.C. BUFF?
  2002.     JR    C,DM1            ; NO
  2003.     LD    C,ACBSIZ        ; YES, FORCE TO SIZE OF BUFFER
  2004.     JR    DM2
  2005. DM1:    AND    A
  2006.     JR    Z,DM4
  2007. DM2:    LD    A,C            ; SET NO. OF ASSD BYTES
  2008.     LD    (ASCDNO),A
  2009.     NOP                ; ROOM FOR SPARE INSTRUCTION
  2010.     NOP
  2011.     NOP
  2012.     EX    DE,HL            ; DO TRANSFER
  2013.     LD    DE,ASSCOD
  2014. DM3:    CALL    DOUBQ            ; SKIP CHAR IF DOUBLE QUOTE
  2015.     LDI                ; TRANSFER A CHAR
  2016.     JP    PE,DM3            ; JUMP IF TRANSFER NOT COMPLETE
  2017. DM4:    POP    BC            ; REPLACE REGISTERS
  2018.     POP    DE
  2019.     POP    HL
  2020.     RET
  2021. ;**************************************************************************
  2022. ;LOCATE STRING
  2023. ;ON ENTRY:
  2024. ;       HL POINTS TO CHAR AFTER OPERAND
  2025. ;ON EXIT:
  2026. ;       HL POINTS TO FIRST CHAR OF ACTUAL STRING.
  2027. ;       BC CONTAINS NO OF CHARS IN THAT STRING
  2028. ;          (COUNTING 2 QUOTES AS 1 CHAR)
  2029. ;       ZERO FLAG IS SET FOR SYNTAX ERROR
  2030. ;************************************************************************** 
  2031. STR:    CALL    SCNSP            ; SCAN TO NEXT NON SP CHAR
  2032.     CP    ''''            ; IS IT A ' ?
  2033.     JR    NZ,STR4            ; SYNTAX ERROR, STRING NOT FOUND
  2034.     INC    HL            ; POINT TO NEXT CHAR
  2035.     LD    D,H            ; SAVE POINTER IN DE
  2036.     LD    E,L
  2037.     LD    BC,0            ; CLEAR BC
  2038. STR1:                    ; COUNT CHARS TO NEXT 7
  2039.     CALL    DOUBQ            ; END OF STRING QUOTE?
  2040.     JR    NZ,STR2            ; JUMP IF SO
  2041.     LD    A,(HL)            ; GET CHAR
  2042.     CP    CR            ; IS IT CR?
  2043.     JR    Z,STR4            ; JUMP IF SO, ERROR
  2044.     INC    HL            ; INCR PNTR
  2045.     INC    C            ; AND CNTR
  2046.     JR    STR1            ; LOOP
  2047. STR2:    CALL    SCNSP            ; FIND NEXT NON SP CHAR
  2048.     CP    CR            ; MUST BE CR/;
  2049.     JR    Z,STR3
  2050.     CP    ';'
  2051.     JR    Z,STR3
  2052.     PUSH    BC            ; SYNTAX ERROR, BUT STRING FOUND
  2053.     LD    C,'S'
  2054.     CALL    ERROR            ; INDICATE SYNTAX ERROR
  2055.     POP    BC
  2056. STR3:    XOR    A
  2057.     INC    A
  2058.     RET
  2059. STR4:    LD    C,'S'            ; SYNTAX ERROR, STRING NOT FOUND 
  2060.     CALL    ERROR            ; INDICATE ERROR
  2061.     XOR    A            ; SET ZERO FLAG (FOR ERROR)
  2062.     RET                ; AND RETURN
  2063. ;***********************************************************************
  2064. ;PROCESS TOKENS
  2065. ;PRODUCE ASSEMBLED CODE IN BUFFER BASED ON OPERATOR
  2066. ;AND OPERAND TOKENS.
  2067. ;***********************************************************************
  2068. PTOK:    PUSH    IX            ; SAVE REGS
  2069.     PUSH    HL
  2070.     PUSH    DE
  2071.     PUSH    BC
  2072.     LD    A,(ODBT1)        ; PUT OPD BYTE 1 IN B
  2073.     LD    B,A
  2074.     LD    A,(ODBT2)        ; PUT OPD BYTE 2 IN C
  2075.     LD    C,A
  2076.     LD    HL,(ODINT1)        ; PUT OPD INTEGER IN HL
  2077.      LD    DE,(ODINT2)        ; PUT OPD INTEGER IN DE
  2078.     LD    A,(ORTKBF)        ; GET OPERATOR TOKEN
  2079.     CP    ORGTOK            ; TOKEN FOR ORG?
  2080.     JR    Z,PTOK4            ; JUMP IF SO
  2081.     CALL    PLAB            ; PROCESS LABEL
  2082.     EXX
  2083.     PUSH    HL            ; SAVE REGS
  2084.     PUSH    DE
  2085.     PUSH    BC
  2086.     LD    A,(ORTKBF)        ; GET TOKEN AGAIN
  2087.     AND    7FH            ; MASK OFF CONDITIONAL FLAG BIT
  2088.     ADD    A,A            ; DOUBLE IT
  2089.     LD    E,A            ; PUT INTO DE
  2090.     LD    D,0
  2091.     LD    HL,PORL            ; PUT 'PROCESS OPR' LIST PNTR IN HL
  2092.         ADD    HL,DE            ; ADD DE TO GET PNTR TO PNTR TO ROUTIN
  2093.      LD    E,(HL)            ; GET POINTER IN DE
  2094.     INC    HL
  2095.     LD    D,(HL)
  2096.     EX    DE,HL            ; PUT IN HL
  2097.     CALL    ODPBT            ; GET OPD PAIR BYTE
  2098.     LD    B,A            ; SAVE IN B
  2099. PTOK1:    LD    A,(HL)            ; GET VALID TOKEN FROM LIST
  2100.     INC    HL            ; INCR LIST POINTER
  2101.     CP    0FFH            ; COMPARE WITH END OF LIST FLAG
  2102.     JR    Z,PTOK3            ; END OF LIST, NOT VALID COMBINATION
  2103.     CP    0FEH            ; E.O.L. - NO NOP'S, NO ERROR IND
  2104.     JR    Z,PTOK8
  2105.     CP    0FDH            ; END OF LIST - ERROR IND ONLY
  2106.     JR    NZ,PTOK9
  2107.     LD    C,'S'            ; INDICATE SYNTAX ERROR
  2108.     CALL    ERROR
  2109.     JR    PTOK8
  2110. PTOK9:    CP    B            ; COMPARE TOKEN
  2111.     JR    Z,PTOK2            ; JUMP IF MATCH
  2112.     INC    HL            ; POINT TO NEXT TOKEN
  2113.     INC    HL
  2114.     JR    PTOK1            ; AND LOOP
  2115. PTOK2:    LD    C,(HL)            ; GET ADDR OF SUBROUTINE FROM LIST
  2116.     INC    HL                
  2117.     LD    H,(HL)
  2118.     LD    L,C
  2119.     PUSH    HL            ; GET ADDR IN IX
  2120.     POP    IX
  2121.     LD    HL,PTOK8        ; PUSH RETURN ADDR
  2122.     PUSH    HL
  2123.     EXX                ; SWAP REGISTER BANKS
  2124.     JP    (IX)            ; AND CALL INDIRECT
  2125. PTOK3:    CALL    DNOPS            ; SYNTAX ERROR, APPEND NOP'S
  2126.     JR    PTOK8
  2127. PTOK4:    CALL    PORG            ; PROCESS ORG
  2128.     JR    PTOK7
  2129. PTOK8:    CALL    ADJARC            ; ADJUST ADDR REF CNTR
  2130.     EXX                ; REPLACE REGS
  2131.     POP    BC
  2132.     POP    DE
  2133.     POP    HL
  2134.     EXX
  2135. PTOK7:    POP    BC
  2136.     POP    DE
  2137.     POP    HL
  2138.     POP    IX
  2139.     RET
  2140. ;*********************************************************************
  2141. ;SYNTAX ERROR
  2142. ;ALL THE FOLLOWING PROCESS SUBROUTINES
  2143. ;RETURN VIA THIS SUBROUTINE IF THEY
  2144. ;NEED TO APPEND NOP'S IF THE CASE OF
  2145. ;A SYNTAX ERROR.
  2146. ;*********************************************************************
  2147. SYNERR:    CALL    DNOPS            ; ERROR, APPEND DEFAULT NOP'S
  2148.     RET
  2149. ;...................................................
  2150. ;PROCESS OPERATOR LIST
  2151. ;CONTAINS ADDRESSES OF SUBROUTINES
  2152. ;TO PROCESS VARIOUS OPERATOR GROUPS.
  2153. ;...................................................
  2154. PORL:    DEFW    LSTNUL            ; NULL ROUTINE FOR NO OPERATOR
  2155.     DEFW    LSTNUL            ; NULL ROUTINE FOR ORG
  2156.     DEFW    LSTNUL            ; NULL ROUTINE FOR EQU
  2157.     DEFW    LSTNUL            ; NULL FOUTINE FOR DEFL
  2158.     DEFW    LST04            ; END
  2159.     DEFW    LST05            ; DEFB
  2160.     DEFW    LST06            ; DEFW
  2161.     DEFW    LST07            ; DEFS
  2162.     DEFW    LSTNUL            ; NULL ROUTINE FOR DEFM
  2163.     DEFW    LSTNUL            ; NULL ROUTINE FOR TITLE
  2164.     DEFW    LST0B            ; SINGLE BYTE, NO OPERAND
  2165.     DEFW    LST0B            ; DOUBLE BYTE, NO OPERAND
  2166.     DEFW    LST0C            ; AND OR XOR CP SUB
  2167.     DEFW    LST0D            ; INC DEC
  2168.     DEFW    LST0E            ; IM
  2169.     DEFW    LST0F            ; RLC RL SLA RRC RR SRA SRL
  2170.     DEFW    LST10            ; BIT SET RES
  2171.     DEFW    LST11            ; JP
  2172.     DEFW    LST12            ; JR
  2173.     DEFW    LST13            ; DJNZ
  2174.     DEFW    LST14            ; CALL
  2175.     DEFW    LST15            ; RET
  2176.     DEFW    LST16            ; RST
  2177.     DEFW    LST17            ; IN
  2178.     DEFW    LST18            ; OUT
  2179.     DEFW    LST19            ; PUSH POP
  2180.     DEFW    LST1A            ; EX
  2181.     DEFW    LST1B            ; ADC SBC
  2182.     DEFW    LST1C            ; ADD
  2183.     DEFW    LST1D            ; LD
  2184. ;.........................................................
  2185. LSTNUL:    DEFB    0FEH
  2186. ;.........................................................
  2187. LST04:    DEFB    0            ; NO OPD
  2188.     DEFW    GP04
  2189.     DEFB    90H            ; SINGLE INTEGER
  2190.     DEFW    GP04
  2191.     DEFB    0FDH
  2192. ;.........................................................
  2193. LST05:    DEFB    90H            ; DEFB N
  2194.     DEFW    GP05
  2195.         DEFB    0FFH
  2196. ;.........................................................            
  2197. LST06:    DEFB    90H            ; DEFW NN
  2198.     DEFW    GP06
  2199.     DEFB    0FFH
  2200. ;.........................................................
  2201. LST07:    DEFB    90H            ; DEFS N
  2202.     DEFW    GP07
  2203.     DEFB    0FDH
  2204. ;.........................................................
  2205. LST0B:    DEFB    0            ; NO OPERAND
  2206.     DEFW    GP0B
  2207.     DEFB    0FFH
  2208. ;.........................................................
  2209. LST0C:    DEFB    70H            ; OPR R
  2210.     DEFW    GP0C1
  2211.         DEFB    90H            ; OPR N
  2212.     DEFW    GP0C2
  2213.     DEFB    40H            ; OPR (HL)/(IX)/(IY)
  2214.     DEFW    GP0C3
  2215.     DEFB    0B0H            ; OPR (IX+D)/(IY+D)
  2216.     DEFW    GP0C3
  2217.     DEFB    0FFH
  2218. ;.........................................................
  2219. LST0D:    DEFB    70H            ; OPR R
  2220.     DEFW    GP0D1
  2221.     DEFB    40H            ; OPR (HL)/(IX)/(IY)
  2222.     DEFW    GP0D2
  2223.     DEFB    0B0H            ; OPR (IX+D)/(IY+D)
  2224.     DEFW    GP0D2
  2225.     DEFB    10H            ; OPR RP
  2226.     DEFW    GP0D3
  2227.     DEFB    0FFH
  2228. ;..........................................................
  2229. LST0E:    DEFB    90H            ; IM N
  2230.     DEFW    GP0E
  2231.     DEFB    0FFH
  2232. ;..........................................................
  2233. LST0F:    DEFB    70H            ; OPR R
  2234.     DEFW    GP0F1
  2235.     DEFB    40H            ; OPR (HL)/(IX)/(IY)
  2236.     DEFW    GP0F2              
  2237.     DEFB    0B0H            ; OPR (IX+D)/(IY+D)
  2238.     DEFW    GP0F2
  2239.     DEFB    0FFH
  2240. ;..........................................................
  2241. LST10:    DEFB    97H            ; OPR B,R
  2242.     DEFW    GP101
  2243.     DEFB    94H            ; OPR B,(HL)/(IX)/(IY)
  2244.     DEFW    GP102
  2245.     DEFB    9BH            ; OPR B,(IX+D)/(IY+)
  2246.     DEFW    GP102
  2247.     DEFB    0FFH
  2248. ;...........................................................
  2249. LST11:    DEFB    40H            ; JP (HL)/(IX)/(IY)
  2250.     DEFW    GP111
  2251.     DEFB    89H            ; JP CC,NN
  2252.     DEFW    GP112
  2253.     DEFB    90H            ; JP NN
  2254.     DEFW    GP113
  2255.     DEFB    0FFH
  2256. ;............................................................
  2257. LST12:    DEFB    89H            ; JR CC,E
  2258.     DEFW    GP121
  2259.     DEFB    90H            ; JR E
  2260.     DEFW    GP122
  2261.     DEFB    0FFH
  2262. ;............................................................
  2263. LST13:    DEFB    90H            ; DJNZ NN
  2264.     DEFW    GP13
  2265.     DEFB    0FFH
  2266. ;...........................................................
  2267. LST14:    DEFB    89H             ; CALL CC,NN    
  2268.     DEFW    GP141
  2269.     DEFB    90H            ; CALL NN
  2270.     DEFW    GP142
  2271.     DEFB    0FFH
  2272. ;............................................................
  2273. LST15:    DEFB    00H            ; RET
  2274.     DEFW    GP151
  2275.     DEFB    80H            ; RET CC
  2276.     DEFW    GP152
  2277.     DEFB    0FFH
  2278. ;............................................................
  2279. LST16:    DEFB    90H            ; RST N
  2280.     DEFW    GP16
  2281.     DEFB    0FFH
  2282. ;............................................................
  2283. LST17:    DEFB    7DH            ; IN A,(N)
  2284.     DEFW    GP171
  2285.     DEFB    7AH            ; IN R,(C)
  2286.     DEFW    GP172
  2287.     DEFB    0FFH
  2288. ;............................................................
  2289. LST18:    DEFB    0A7H            ; OUT (C),R
  2290.     DEFW    GP181
  2291.     DEFB    0D7H            ; OUT (N),A
  2292.     DEFW    GP182
  2293.     DEFB    0FFH
  2294. ;.............................................................
  2295. LST19:    DEFB    10H            ; OPR RP
  2296.     DEFW    GP19
  2297.     DEFB    0FFH
  2298. ;.............................................................
  2299. LST1A:    DEFB    51H            ; EX (SP),HL/IX/IY
  2300.     DEFW    GP1A1
  2301.     DEFB    1EH            ; EX AF,AF'
  2302.     DEFW    GP1A2
  2303.     DEFB    11H            ; EX DE,HL
  2304.     DEFW    GP1A3
  2305.     DEFB    0FFH
  2306. ;.............................................................
  2307. LST1B:    DEFB    77H            ; OPR A,R
  2308.     DEFW    GP1B1
  2309.     DEFB    79H            ; OPR A,N
  2310.     DEFW    GP1B2
  2311.     DEFB    74H            ; OPR A,(HL)/(IX)/(IY)
  2312.     DEFW    GP1B3
  2313.     DEFB    7BH            ; OPR A,(IX+D)/(IY+D)
  2314.     DEFW    GP1B3
  2315.     DEFB    11H            ; OPR HL,SS
  2316.     DEFW    GP1B4
  2317.     DEFB    0FFH
  2318. ;...............................................................
  2319. LST1C:    DEFB    77H            ; ADD A,R
  2320.     DEFW    GP1C1
  2321.     DEFB    79H            ; ADD A,N
  2322.     DEFW    GP1C2
  2323.     DEFB    74H            ; ADD A,(HL)/(IX)/(IY)
  2324.     DEFW    GP1C3
  2325.     DEFB    7BH            ; ADD A,(IX+D)/(IY+D)
  2326.     DEFW    GP1C3
  2327.     DEFB    11H            ; ADD HL/IX/IY,RP
  2328.         DEFW    GP1C4
  2329.     DEFB    0FFH
  2330. ;...............................................................           
  2331. LST1D:    DEFB    76H            ; LD A,(BC)/(DE)
  2332.     DEFW    GP1D1
  2333.     DEFB    72H            ; LD A,I/R
  2334.     DEFW    GP1D2
  2335.     DEFB    7DH            ; LD A,(NN)
  2336.     DEFW    GP1D3
  2337.     DEFB    67H            ; LD (BC)/(DE),A
  2338.     DEFW    GP1D4
  2339.     DEFB    49H            ; LD (HL)/(IX)/(IY),N
  2340.     DEFW    GP1D5
  2341.     DEFB    19H            ; LD RP,NN
  2342.     DEFW    GP1D6
  2343.     DEFB    1DH            ; LD RP,(NN)
  2344.     DEFW    GP1D7
  2345.     DEFB    47H            ; LD (HL)/(IX)/(IY),R
  2346.     DEFW    GP1D8
  2347.     DEFB    27H            ; LD I/R,A
  2348.     DEFW    GP1D9
  2349.     DEFB    0B9H            ; LD (IX+D)/(IY+D),N
  2350.     DEFW    GP1D5
  2351.     DEFB    0B7H            ; LD (IX+D)/(IY+D),R
  2352.     DEFW    GP1D8
  2353.     DEFB    0D7H            ; LD (NN),A
  2354.     DEFW    GP1DA
  2355.         DEFB    0D1H            ; LD (NN),RP
  2356.     DEFW    GP1DB
  2357.     DEFB    74H            ; LD (HL)/(IX)/(IY)
  2358.     DEFW    GP1DC
  2359.     DEFB    7BH            ; LD R,(IX+D)/(IY+D)
  2360.     DEFW    GP1DC
  2361.     DEFB    79H            ; LD R,N
  2362.     DEFW    GP1DD
  2363.     DEFB    77H            ; LD R,R
  2364.     DEFW    GP1DE
  2365.     DEFB    11H            ; LD SP,HL/IX/IY
  2366.     DEFW    GP1DF
  2367.     DEFB    0FFH
  2368. ;**********************************************************************
  2369. ;ENTRY AND EXIT CONDITIONS FOR PORG, PLAB AND
  2370. ;ALL GP... SUBROUTINES.
  2371. ;
  2372. ;ON ENTRY:
  2373. ;       B CONTAINS OPERAND-1 TOKEN BYTE
  2374. ;    C CONTAINS OPERAND-2 TOKEN BYTE
  2375. ;       HL CONTAINS OPERAND-1 INTEGER    
  2376. ;       DE CONTAINS OPERAND-2 INTEGER
  2377. ;ON EXIT:
  2378. ;    ASSEMBLED CODE HAS BEEN PLACED IN ASSEMBLED
  2379. ;         CODE BUFFER (ASSCOD).
  2380. ;       ADDRESS REFERENCE COUNTER HAS BEEN ADJUSTED. 
  2381. ;**********************************************************************
  2382. ;
  2383. ;**********************************************************************
  2384. ;PROCESS ORG
  2385. ;**********************************************************************
  2386. PORG:    PUSH    HL            ; SAVE REGS
  2387.     PUSH    BC
  2388.     CALL    ODPBT            ; GET OPERAND PAIR BYTE IN A
  2389.     CP    90H            ; SINGLE INTEGER?
  2390.     JR    NZ,PORG1        ; JUMP OTHERWISE
  2391.     LD    HL,(ODINT1)        ; GET OPERAND-1 INTEGER
  2392.     LD    (ADREFC),HL        ; PUT IN ADDR REG CNTR
  2393.     LD    (ADDISR),HL        ; AND ADDR DISP REG              
  2394.        LD    HL,AFLAGS        ; SET ADDR DISCONTINUITY FLAG
  2395.     SET    0,(HL)
  2396.     JR    PORG2
  2397. PORG1:    LD    C,'S'            ; INDICATE SYNTAX ERROR
  2398.     CALL    ERROR
  2399. PORG2:    POP    BC            ; REPLACE REGS
  2400.     POP    HL
  2401.     RET
  2402. ;**********************************************************************
  2403. ;PROCESS LABEL (INCLUDES EQU AND DEFL)
  2404. ;**********************************************************************
  2405. PLAB:    PUSH    HL            ; SAVE REGS
  2406.     PUSH    DE
  2407.     PUSH    BC
  2408.     LD    A,(ORTKBF)        ; GET OPR TOKEN
  2409.     PUSH    AF            ; SAVE ON STACK
  2410.     CP    DEFLTK            ; IS IT DEFL?
  2411.     JR    Z,PLAB1
  2412.     CP    EQUTOK            ; OR EQU?
  2413.     JR    NZ,PLAB2
  2414. PLAB1:    LD    (ADDISR),HL        ; DISPLAY VALUE IF SO
  2415.     CALL    ODPBT            ; GET OPD PAIR BYTE
  2416.     CP    90H            ; SINGLE INTEGER?
  2417.     JR    Z,PLAB3            ; JUMP IF SO, OK
  2418.     LD    C,'S'            ; ELSE INDICATE SYNTAX ERROR
  2419.     CALL    ERROR
  2420.     JR    PLAB3              
  2421. PLAB2:    LD    HL,(ADREFC)        ; GET CURRENT ADDR (LABEL VALUE)
  2422. PLAB3:    LD    B,H            ; COPY LABEL VALUE INTO BC
  2423.     LD    C,L
  2424.     CALL    LBSYM            ; PUT LABEL AND VALUE IN SYMBUF
  2425.     JR    Z,PLAB13        ; JUMP IF NO LABEL PRESENT
  2426.     CALL    SYMCH            ; CHECK IF SYMBOL IS RESERVED WORD
  2427.     JR    NC,PLAB5        ; JUMP IF NOT
  2428. PLAB13:    POP    AF            ; GET OPR TOKEN
  2429.     PUSH    AF
  2430.     CP    DEFLTK            ; IS IT DEFL?
  2431.     JR    Z,PLAB4
  2432.     CP    EQUTOK            ; OR EQU?
  2433.     JR    NZ,PLAB12
  2434. PLAB4:    LD    C,'S'            ; INDICATE SYNTAX ERROR IF SO
  2435.     CALL    ERROR
  2436.     JR    PLAB12
  2437. PLAB5:    POP    AF            ; GET OPR TOKEN
  2438.     PUSH    AF
  2439.     CP    DEFLTK            ; IS IT DEFL?
  2440.     JR    NZ,PLAB6        ; JUMP IF NOT
  2441.     SET    0,(HL)            ; SET DEFL FLAG IN ATTRIB
  2442. PLAB6:    CALL    LOCATE            ; LOCATE IN SYMBOL TABLE
  2443.     JR    Z,PLAB8            ; JUMP IF ALREADY IN TABLE
  2444.     LD    A,(PASSNO)        ; IS THIS PASS 1?
  2445.     CP    1
  2446.     JR    Z,PLAB7            ; JUMP IF SO
  2447.     LD    C,'P'            ; OTHERWISE INDICATE PHASE ERROR
  2448.     CALL    ERROR
  2449.     JR    PLAB12
  2450. PLAB7:    CALL    INSERT            ; INSERT IN SYMBOL TABLE
  2451.     JR    PLAB12
  2452.                     ; ALREADY IN TABLE
  2453. PLAB8:    LD    A,(PASSNO)        ; IS THIS PASS 1?
  2454.     CP    1
  2455.     JR    Z,PLAB11        ; JUMP IF SO
  2456.     INC    HL            ; MULT DEFN FLAG SET? 
  2457.     INC    HL
  2458.     BIT    1,(HL)
  2459.     JR    Z,PLAB9            ; JUMP IF NOT
  2460.     LD    C,'M'            ; INDICATE MULT DEFN ERROR
  2461.     CALL    ERROR
  2462.     JR    PLAB12
  2463. PLAB9:    POP    AF            ; GET OPR TOKEN
  2464.     PUSH    AF
  2465.     CP    DEFLTK            ; IS IT DEFL?
  2466.     JR    NZ,PLAB10        ; JUMP IF NOT
  2467.     DEC    HL            ; INSERT NEW VALUE
  2468.     LD    (HL),B
  2469.     DEC    HL
  2470.     LD    (HL),C
  2471.     JR    PLAB12
  2472. PLAB10:                    ; HAS VALUE CHANGED?
  2473.     DEC    HL            ; GET OLD VALUE IN DE
  2474.     LD    D,(HL)            
  2475.     DEC    HL
  2476.     LD    E,(HL)
  2477.     EX    DE,HL            ; GET IT INTO HL
  2478.     AND    A            ; CLEAR CARRY
  2479.     SBC    HL,BC            ; AND COMPARE OLD AND NEW VALUES
  2480.     JR    Z,PLAB12        ; JUMP IF EQUAL
  2481.     EX    DE,HL            ; ELSE INSERT NEW VALUE
  2482.     LD    (HL),C
  2483.     INC    HL
  2484.     LD    (HL),B
  2485.     LD    C,'P'            ; AND INDICATE PHASE ERROR
  2486.     CALL    ERROR
  2487.     JR    PLAB12
  2488. PLAB11:    INC    HL            ; POINT TO ATTRIBUTE BYTE
  2489.     INC    HL
  2490.     POP    AF            ; GET OPR TOKEN
  2491.     PUSH    AF
  2492.     CP    DEFLTK            ; IS IT DEFL?
  2493.     JR    NZ,PLAB14        ; JUMP IF NOT
  2494.     BIT    0,(HL)            ; TEST DEFL FLAG
  2495.     JR    NZ,PLAB12        ; JUMP IF SET
  2496. PLAB14:    SET    1,(HL)            ; SET MULT DEFN FLAG
  2497. PLAB12:    POP    AF            ; REPLACE REGS
  2498.     POP    BC
  2499.     POP    DE
  2500.     POP    HL
  2501.     RET
  2502. ;*******************************************************************
  2503. ;PROCESS END (GROUP 04)
  2504. ;*******************************************************************
  2505. GP04:    LD    (STADDR),HL        ; LOAD START ADDR WITH INTEGER
  2506.     LD    (ADDISR),HL        ; LOAD ADDR DIS REG WITH INTEGER
  2507.     LD    HL,AFLAGS        ; SET 'END' FLAG
  2508.     SET    1,(HL)
  2509.     RET
  2510. ;********************************************************************
  2511. ;PROCESS DEFB
  2512. ;********************************************************************
  2513. GP05:    CALL    CHKOF            ; CHECK FOR OVERFLOW BEYOND
  2514.                     ; 8 BIT VALUE (AND FLAG IF SO)
  2515.     LD    A,L            ; APPEND 1 BYTE TO ASSD CODE BUFF
  2516.     CALL    APPBT            ; APPEND BYTE TO ASSD CODE BUFF
  2517.     RET
  2518. ;********************************************************************
  2519. ;PROCESS DEFW
  2520. ;********************************************************************
  2521. GP06:    CALL    APPWD            ; APPEND TO ASSD CODE BUFF
  2522.     RET
  2523. ;********************************************************************
  2524. ;PROCESS DEFS (GROUP 07)
  2525. ;********************************************************************
  2526. GP07:    LD    DE,(ADREFC)        ; ADD INTEGER TO ADDR REF CNTR
  2527.     ADD    HL,DE
  2528.     LD    (ADREFC),HL
  2529.     LD    HL,AFLAGS        ; SET ADDR DISCONT. FLAG
  2530.     SET    0,(HL)
  2531.     RET
  2532. ;********************************************************************
  2533. ;PROCESS NO OPERAND.
  2534. ;********************************************************************
  2535. GP0B:    LD    A,(ORTKBF)        ; GET OPR GROUP 
  2536.     CP    0AH            ; IS IT GROUP 0A?
  2537.     JR    Z,GP0B1            ; SKIP PREFIX BYTE IF SO
  2538.     LD    A,0EDH            ; LOAD PREFIX BYTE TO ASSD CODE BUFF
  2539.     CALL    APPBT            ; APPEND TO ASSD CODE BUFFER
  2540. GP0B1:    LD    A,(ORTKBF+1)        ; GET OPCODE IN A
  2541.     CALL    APPBT            ; AND APPEND TO ASSD CODE BUFF
  2542.     RET
  2543. ;********************************************************************
  2544. ;PROCESS AND/OR/XOR/CP/SUB (GROUP 0C)
  2545. ;********************************************************************
  2546. ;GROUP 0C - R
  2547. ;********************************************************************
  2548. GP0C1:    LD    A,(ORTKBF+1)        ; GET OPR DISTING BITS
  2549.     LD    C,B            ; COMBINE REG BITS
  2550.     CALL    ISREG
  2551.     OR    10000000B        ; BUILD OP-CODE
  2552.     CALL    APPBT            ; APPEND RESULT TO ASSD CODE BUFFER
  2553.     RET
  2554. ;********************************************************************
  2555. ;GROUP 0C - N
  2556. ;********************************************************************
  2557. GP0C2:    LD    A,(ORTKBF+1)        ; GET OPR DISTING BITS
  2558.     OR    11000110B        ; BUILD OP-CODE
  2559.     CALL    APPBT            ; APPEND IT TO ASSD CODE BUFF
  2560.     CALL    CHKOF            ; INDICATE OVERFLOW ERROR IF ANY
  2561.     LD    A,L            ; PUT INTEGER IN ASSD CODE BUFFER
  2562.     CALL    APPBT
  2563.     RET
  2564. ;*******************************************************************
  2565. ;GROUP 0C - (HL)/(IX+D)/(IY+D)
  2566. ;*******************************************************************
  2567. GP0C3:    CALL    INDPF            ; GENERATE INDEX PREFIX, IF REQD
  2568.     LD    A,(ORTKBF+1)        ; GET OPR DISTING BITS
  2569.     OR    10000110B        ; BUILD OP-CODE
  2570.         CALL     APPBT             ; APPEND TO ASSD CODE BUFF
  2571.     CALL    DISBT            ; APPEND DISP. IF REQD
  2572.     RET
  2573. ;*******************************************************************
  2574. ;PROCESS INC/DEC (GROUP 0D)
  2575. ;*******************************************************************
  2576. ;GROUP 0D - R
  2577. ;*******************************************************************
  2578. GP0D1:    LD    C,B
  2579.     LD    A,(ORTKBF+1)        ; GET OPR DISTING. BIT
  2580.     AND    00000001B
  2581.       OR    00000100B        ; BUILD OP-CODE
  2582.     CALL    IDREG            ; INSERT REGISTER BITS
  2583.     CALL    APPBT            ; APPEND OPCODE TO BUFFER
  2584.     RET
  2585. ;******************************************************************
  2586. ;GROUP 0D - (HL)/(IX+D)/(IY+D)
  2587. ;******************************************************************
  2588. GP0D2:    CALL    INDPF            ; GENERATE INDEX PREFIX IF REGD
  2589.     LD    A,(ORTKBF+1)        ; GET OPERATOR DISTING. BIT
  2590.     AND    00000001B
  2591.     OR    00110100B        ; GENERATE OP-CODE
  2592.     CALL    APPBT            ; APPEND TO BUFFER
  2593.     CALL    DISBT            ; APPEND DISP. IF REQD
  2594.     RET
  2595. ;******************************************************************
  2596. ;GROUP 0D - IX/IY/BC/DE/HL/SP
  2597. ;******************************************************************
  2598. GP0D3:    LD    A,B            ; GET OPERAND BYTE-1
  2599.     CP    17H            ; CHECK IF AF REFERENCE
  2600.     JP    Z,SYNERR        ; JUMP IF IT IS, ERROR
  2601.     CALL    INDPF            ; GENERATE INDEX PREFIX IF REQD
  2602.     LD    C,B            ; PUT OPERAND BYTE IN C
  2603.     LD    A,(ORTKBF+1)        ; GET OPR DISTING. BIT
  2604.     AND    00001000B
  2605.     OR    00000011B        ; BUILD OP-CODE
  2606.     CALL    IREGP            ; INSERT REGISTER PAIR BITS
  2607.     CALL    APPBT            ; APPEND THIS OPCODE TO BUFFER
  2608.     RET
  2609. ;******************************************************************
  2610. ;PROCESS IM (GROUP 0E)
  2611. ;******************************************************************
  2612. GP0E:    LD    A,H            ; GET HIGH BYTE
  2613.     AND    A            ; CHECK IT IS 0
  2614.     JP    NZ,SYNERR        ; ERROR IF NOT, SO JUMP
  2615.     LD    A,L            ; GET LOW BYTE
  2616.     CP    3            ; IS IT 0,1 OR 2?
  2617.     JP    NC,SYNERR        ; JUMP IF NOT, ERROR
  2618.     AND    A            ; IS IT ZERO?
  2619.     JR    Z,GP0E1            ; JUMP IF SO
  2620.     INC    A            ; OTHERWISE INCREMENT
  2621. GP0E1:    LD    C,A            ; PUT IT IN C
  2622.     LD    A,0EDH            ; APPEND PREFIX BYTE
  2623.     CALL    APPBT            ; TO ASSD CODE BUFFER
  2624.     LD    A,01000110B        ; GENERATE OP-CODE
  2625.     CALL    IDREG            ; INSERT PARAMETER BITS
  2626.     CALL    APPBT            ; APPEND TO ASSD CODE BUFF
  2627.     RET
  2628. ;******************************************************************
  2629. ;PROCESS RLC/RL/SLA/RRC/RR/SRA/SRL (GROUP 0F)
  2630. ;******************************************************************
  2631. ;GROUP 0F - R
  2632. ;****************************************************************
  2633. GP0F1:    LD    A,0CBH            ; APPEND PREFIX BYTE
  2634.     CALL    APPBT            ; TO ASSD CODE BUFF
  2635.     LD    C,B            ; PUT OPD BYTE 1 IN C
  2636.     LD    A,(ORTKBF+1)        ; GET OPD DISTING. BITS
  2637.     CALL    ISREG            ; INSERT REGISTER BITS
  2638.     CALL    APPBT
  2639.     RET
  2640. ;******************************************************************
  2641. ;GROUP OF - (HL)/(IX+D)/(IY+D)
  2642. ;******************************************************************
  2643. GP0F2:    CALL    INDPF            ; APPEND INDEX PREFIX BYTE IF REQD
  2644.     LD    A,0CBH
  2645.     CALL    APPBT            ; APPEND PREFIX BYTE
  2646.     CALL    DISBT            ; APPEND DISPLACEMENT BYTE IF REQD
  2647.     LD    A,(ORTKBF+1)        ; GET OPR DISTING. BITS
  2648.     OR    00000110B        ; BUILD OP-CODE
  2649.     CALL    APPBT            ; APPEND TO ASSD CODE BUFF
  2650.     RET
  2651. ;*************************************************************************
  2652. ;PROCESS BIT/SET/RES (GROUP 10)
  2653. ;*************************************************************************
  2654. ;GROUP 10 - B,R
  2655. ;*************************************************************************
  2656. GP101:                    ; OPD INTEGER
  2657.                     ; MUST BE IN RANGE 0-7
  2658.     LD    A,L            ; SEE IF ANY BITS OTHER THAN 
  2659.     AND    11111000B        ; 3 L.S. BITS ARE 1
  2660.     OR    H
  2661.     JP    NZ,SYNERR        ; JUMP IF SO, ERROR
  2662.     LD    A,0CBH            ; APPEND PREFIX BYTE TO BUFFER
  2663.     CALL    APPBT
  2664.     LD    A,(ORTKBF+1)        ; GET OPD DISTING. BITS
  2665.     CALL    ISREG            ; COMBINE REGISTER BITS
  2666.     LD    C,L            ; GET INTEGER IN C
  2667.     CALL    IDREG            ; COMBINE INTEGER BITS
  2668.     CALL    APPBT            ; APPEND OP-CODE TO BUFFER
  2669.     RET
  2670. ;************************************************************************
  2671. ;GROUP 10 - B,(HL)/(IX+D)/(IY+D)
  2672. ;************************************************************************
  2673. GP102:                    ; OPD INTEGER
  2674.                     ; MUST BE IN RANGE 0-7
  2675.     LD    A,L            ; SEE IF ANY BITS OTHER THAN
  2676.     AND    11111000B        ; 3 L.S. BITS ARE 1
  2677.     OR    H              
  2678.     JP    NZ,SYNERR        ; JUMP IF SO, ERROR
  2679.     LD    B,C
  2680.     CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  2681.     LD    A,0CBH            ; APPEND OP-CODE PREFIX
  2682.     CALL    APPBT
  2683.     LD    C,L            ; GET INTEGER IN C
  2684.     EX    DE,HL            ; GET DISPLACEMENT INTEGER
  2685.     CALL    DISBT            ; APPEND IF REQD
  2686.     LD    A,(ORTKBF+1)        ; GET OPD DISTING. BITS
  2687.     OR    00000110B        ; BUILD OP-CODE
  2688.     CALL    IDREG            ; COMBINE INTEGER BITS
  2689.     CALL    APPBT
  2690.     RET
  2691. ;***********************************************************************
  2692. ;PROCESS JP (GROUP 11)
  2693. ;***********************************************************************
  2694. ;***********************************************************************
  2695. ;GROUP 11 - (HL)/(IX)/(IY)
  2696. ;***********************************************************************
  2697. GP111:    CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  2698.     LD    A,0E9H            ; APPEND OP-CODE PREFIX TO BUFFER
  2699.     CALL    APPBT
  2700.     RET
  2701. ;***********************************************************************
  2702. ;GROUP 11 - CC,NN
  2703. ;*********************************************************************** 
  2704. GP112:    LD    C,B            ; GET OPD BYTE 1 IN C
  2705.     LD    A,11000010B        ; BUILD OP-CODE
  2706.     CALL    IDREG            ; COMBINE CONDITION BITS
  2707.     CALL    APPBT            ; APPEND OP-CODE TO BUFFER
  2708.     EX    DE,HL            ; GET INTEGER
  2709.     CALL    APPWD            ; APPEND LOW BYTE
  2710.     RET
  2711. ;**********************************************************************
  2712. ;GROUP 11 - NN
  2713. ;**********************************************************************
  2714. GP113:    LD    A,0C3H            ; APPEND OP-CODE TO BUFFER
  2715.     CALL    APPBT
  2716.     CALL    APPWD            ; APPEND INTEGER
  2717.     RET
  2718. ;**********************************************************************
  2719. ;PROCESS JR (GROUP 12)
  2720. ;**********************************************************************
  2721. ;**********************************************************************
  2722. ;GROUP 12 CC,E
  2723. ;**********************************************************************
  2724. GP121:    BIT    2,B            ; CHECK IF PO/PE/P/M
  2725.     JP    NZ,SYNERR        ; JUMP IF SO, ERROR
  2726.     LD    C,B            ; PUT OPR BYTE 1 IN C
  2727.     EX    DE,HL            ; GET OPD INTEGER 2
  2728.     CALL    CDIS            ; CALCULATE DISPLACEMENT
  2729.     NOP                ; ROOM FOR SPARE INSTRUCTION
  2730.     NOP
  2731.     NOP
  2732.     LD    A,00100000B        ; BUILD OP-CODE
  2733.     CALL    IDREG            ; COMBINE CONDITION BITS 
  2734.     CALL    APPBT            ; APPEND OP-CODE TO BUFFER
  2735.     LD    A,L            ; GET DISPLACEMENT
  2736.     CALL    APPBT            ; APPEND TO BUFFER
  2737.     RET
  2738. ;*********************************************************************
  2739. ;GROUP 12 - E
  2740. ;*********************************************************************
  2741. GP122:    CALL    CDIS            ; CALCULATE DISPLACEMENT
  2742.     NOP                ; ROOM FOR SPARE INSTRUCTION
  2743.     NOP
  2744.     NOP
  2745.     LD    A,18H            ; APPEND OP-CODE TO BUFFER
  2746.     CALL    APPBT
  2747.     LD    A,L            ; APPEND DISP TO BUFFER
  2748.     CALL    APPBT
  2749.     RET
  2750. ;*********************************************************************
  2751. ;PROCESS DJNZ (GROUP 13)
  2752. ;*********************************************************************
  2753. GP13:    CALL    CDIS            ; CALCULATE DISPLACEMENT
  2754.     NOP                    ; ROOM FOR SPARE INSTRUCTION
  2755.     NOP
  2756.     NOP
  2757.     LD    A,10H            ; APPEND OP-CODE TO BUFFER
  2758.     CALL    APPBT
  2759.     LD    A,L            ; APPEND DISP TO BUFFER
  2760.     CALL    APPBT
  2761.     RET
  2762. ;*********************************************************************
  2763. ;CALCULATE DISPLACEMENT
  2764. ;*********************************************************************
  2765. CDIS:    PUSH    DE            ; SAVE REGS
  2766.     PUSH    BC
  2767.     LD    DE,(ADREFC)        ; GET ADDR REF CNTR
  2768.     INC    DE            ; ADD 2 (ALLOW FOR INCRD PC)
  2769.     INC    DE
  2770.     AND    A            ; CLEAR CARRY
  2771.     SBC    HL,DE            ; GET DISPLACEMENT FROM CURR LOC.
  2772.     LD    A,L            ; CHECK FOR 8 BIT OVERFLOW
  2773.     AND    10000000B
  2774.     OR    H
  2775.     JR    Z,CDIS2            ; JUMP IF NO OVERFLOW
  2776.     LD    A,L            ; CHECK -VE OVERFLOW
  2777.     OR    01111111B
  2778.     AND    H
  2779.     CPL                  
  2780.     AND    A
  2781.     JR    Z,CDIS2            ; JUMP IF NO OVERFLOW
  2782. CDIS1:    LD    C,'R'            ; INDICATE RANGE ERROR
  2783.     CALL    ERROR
  2784.     XOR    A            ; CLEAR ZERO FLAG
  2785.     INC    A
  2786. CDIS2:    POP    BC            ; REPLACE REGS
  2787.     POP    DE
  2788.     RET
  2789. ;********************************************************************
  2790. ;PROCESS CALL (GROUP 14)
  2791. ;********************************************************************
  2792. ;********************************************************************
  2793. ;GROUP 14 - CC,NN
  2794. ;********************************************************************
  2795. GP141:    LD    C,B            ; GET OPD BYTE 1 IN C
  2796.     LD    A,11000100B        ; BUILD OP-CODE
  2797.     CALL    IDREG            ; COMBINE CONDITION BIT
  2798.     CALL    APPBT            ; APPEND OP-CODE TO BUFFER
  2799.     EX    DE,HL            ; GET INTEGER
  2800.     CALL    APPWD            ; APPEND INTEGER
  2801.     RET
  2802. ;********************************************************************
  2803. ;GROUP 14 - NN
  2804. ;********************************************************************
  2805. GP142:    LD    A,0CDH            ; APPEND OP-CODE TO BUFFER
  2806.     CALL    APPBT
  2807.     CALL    APPWD            ; APPEND INTEGER
  2808.     RET
  2809. ;********************************************************************
  2810. ;PROCESS RET (GROUP 15)
  2811. ;********************************************************************
  2812. ;********************************************************************
  2813. ;GROUP 15 - NO OPERAND
  2814. ;********************************************************************
  2815. GP151:    LD    A,0C9H            ; APPEND OP-CODE TO BUFFER
  2816.     CALL    APPBT
  2817.     RET
  2818. ;********************************************************************
  2819. ;GROUP 15 - CC
  2820. ;********************************************************************
  2821. GP152:    LD    C,B            ; GET OPD BYTE 1 IN C
  2822.     LD    A,11000000B        ; BUILD OP-CODE
  2823.     CALL    IDREG            ; COMBINE CONDITION BITS
  2824.     CALL    APPBT            ; APPEND OP-CODE TO BUFFER
  2825.     RET
  2826. ;********************************************************************
  2827. ;PROCESS RST (GROUP 16)
  2828. ;********************************************************************
  2829. GP16:                    ; INTEGER MAY ONLY BE 0/08H/
  2830.                     ; 10H/18H/20H/28H/30H/38H
  2831.     LD    A,L            ; CHECK FOR INVALID VALUE
  2832.     AND    11000111B
  2833.     OR    H
  2834.     JP    NZ,SYNERR        ; JUMP IF INVALID
  2835.     LD    A,L            ; BUILD OP-CODE
  2836.     OR    11000111B
  2837.     CALL    APPBT            ; APPEND TO BUFFER
  2838.     RET
  2839. ;********************************************************************
  2840. ;PROCESS IN (GROUP 17)
  2841. ;********************************************************************
  2842. ;********************************************************************
  2843. ;GROUP 17 - A,(N)
  2844. ;********************************************************************
  2845. GP171:    LD    A,B            ; GET OPD BYTE 1
  2846.     CP    77H            ; MUST BE 'A' REG
  2847.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  2848.     LD    A,D            ; INTEGER MUST BE < 256
  2849.     AND    A
  2850.     NOP                ; ROOM FOR SPARE INSTRUCTION
  2851.     NOP
  2852.     NOP
  2853.     LD    A,0DBH            ; APPEND OP-CODE TO BUFFER
  2854.     CALL    APPBT
  2855.     LD    A,E            ; APPEND INTEGER TO BUFFER
  2856.     CALL    APPBT
  2857.     RET
  2858. ;********************************************************************
  2859. ;GROUP 17 - R,(C)
  2860. ;********************************************************************
  2861. GP172:    LD    A,0EDH            ; APPEND OP-CODE PREFIX TO BUFFER
  2862.     CALL    APPBT
  2863.     LD    C,B            ; GET OPD BYTE 1 IN C
  2864.     LD    A,01000000B        ; BUILD OP-CODE
  2865.      CALL    IDREG            ; COMBINE REG BITS
  2866.     CALL    APPBT            
  2867.     RET
  2868. ;********************************************************************
  2869. ;PROCESS OUT (GROUP 18)
  2870. ;********************************************************************
  2871. ;********************************************************************
  2872. ;GROUP 18 - (C),R
  2873. ;********************************************************************
  2874. GP181:    LD    A,0EDH            ; APPEND OP-CODE PREFIX TO BUFFER
  2875.     CALL    APPBT            
  2876.     LD    A,01000001B        ; BUILD OP-CODE
  2877.     CALL    IDREG            ; COMBINE REG BITS
  2878.     CALL    APPBT            ; APPEND TO BUFFER
  2879.     RET
  2880. ;*******************************************************************
  2881. ;GROUP 18 - (N),A
  2882. ;*******************************************************************
  2883. GP182:    LD    A,C            ; GET OPD BYTE 2
  2884.     CP    77H            ; MUST BE 'A' REG
  2885.     JP    NZ,SYNERR        ; JUMP IF NOT
  2886.     LD    A,H            ; MUST BE < 256
  2887.     AND    A
  2888.     NOP                ; ROOM FOR SPARE INSTRUCTION
  2889.     NOP
  2890.     NOP
  2891.     LD    A,0D3H            ; APPEND OP-CODE TO BUFFER
  2892.     CALL    APPBT
  2893.     LD    A,L            ; APPEND INTEGER TO BUFFER
  2894.     CALL    APPBT
  2895.     RET
  2896. ;*******************************************************************
  2897. ;PROCESS PUSH/POP (GROUP 19)
  2898. ;*******************************************************************
  2899. GP19:    LD    A,(ODBT1)        ; GET OPD BYTE 1
  2900.     CP    13H            ; SP NOT PERMITTED
  2901.     JP    Z,SYNERR
  2902.     LD    C,B            ; GET OPD BYTE 1 IN C
  2903.     CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  2904.     LD    A,(ORTKBF+1)        ; GET APR DISTING. BITS
  2905.     CALL    IREGP            ; COMBINE REG PAIR BITS
  2906.     CALL    APPBT            ; APPEND TO BUFFER
  2907.     RET
  2908. ;********************************************************************
  2909. ;PROCESS EX (GROUP 1A)
  2910. ;********************************************************************
  2911. ;********************************************************************
  2912. ;GROUP 1A - (SP),HL/IX/IY
  2913. ;********************************************************************
  2914. GP1A1:    LD    B,C            ; GET OPR BYTE 2 IN C
  2915.     LD    A,C
  2916.     AND    3            ; MUST BE HL/IX/IY
  2917.     CP    2
  2918.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  2919.     CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  2920.     LD    A,0E3H            ; APPEND AP-CODE TO BUFFER
  2921.      CALL    APPBT            
  2922.     RET
  2923. ;********************************************************************    
  2924. ;GROUP 1A - AF,AF'
  2925. ;********************************************************************
  2926. GP1A2:    LD    A,B            ; GET OPD BYTE 1
  2927.     CP    17H            ; MUST BE AF
  2928.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  2929.     LD    A,08H            ; APPEND OP-CODE TO BUFFER
  2930.     CALL    APPBT
  2931.     RET
  2932. ;********************************************************************
  2933. ;GROUP 1A - DE,HL
  2934. ;********************************************************************
  2935. GP1A3:    LD    A,B            ; GET SPD BYTE 1
  2936.     CP    11H            ; MUST BE DE
  2937.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  2938.     LD    A,C            ; GET OPD BYTE 2
  2939.     CP    12H            ; MUST BE HL
  2940.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  2941.     LD    A,0EBH            ; APPEND OP-CODE TO BUFFER
  2942.     CALL    APPBT
  2943.     RET
  2944. ;********************************************************************
  2945. ;PROCESS ADC/SBC (GROUP 1B)
  2946. ;********************************************************************
  2947. ;GROUP 1B - A,R
  2948. ;********************************************************************
  2949. GP1B1:    LD    A,B            ; GET OPD BYTE 1
  2950.     CP    77H            ; MUST BE 'A' REG
  2951.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  2952.     LD    A,(ORTKBF+1)        ; GET OPD DISTING BITS
  2953.     AND    00010000B        ; AND MASK IT
  2954.     OR    10001000B        ; BUILD OP-CODE
  2955.     CALL    ISREG            ; COMBINE REGISTER BITS
  2956.     CALL    APPBT            ; APPEND BYTE TO BUFFER
  2957.     RET
  2958. ;*******************************************************************    
  2959. ;GROUP 1B - A,N
  2960. ;*******************************************************************
  2961. GP1B2:    LD    A,B            ; GET OPD BYTE 1
  2962.     CP    77H            ; MUST BE 'A' REG
  2963.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  2964.     LD    A,(ORTKBF+1)        ; GET OPR DISTING BITS
  2965.     AND    00010000B        ; AND MASK IT
  2966.     OR    11001110B        ; BUILD OP-CODE
  2967.     CALL    APPBT            ; APPEND TO BUFFER
  2968.     EX    DE,HL            ; GET INTEGER IN HL
  2969.     CALL    CHKOF            ; FLAG OVERFLOW FROM L IF ANY
  2970.     LD    A,L            ; APPEND INTEGER TO BUFFER
  2971.     CALL    APPBT
  2972.     RET
  2973. ;*******************************************************************
  2974. ;GROUP 1B A,(HL)/(IX+D)/(IY+D)
  2975. ;*******************************************************************
  2976. GP1B3:    LD    A,B            ; GET OPD BYTE 1
  2977.     CP    77H            ; MUST BE 'A' REG
  2978.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  2979.     LD    B,C            ; PUT OPD BYTE 2 IN B
  2980.     CALL    INDPF            ; APPEND INDEX PREFIX IF ANY
  2981.     LD    A,(ORTKBF+1)        ; GET OPR DISTING BIT
  2982.     AND    00010000B        ; AND MASK IT
  2983.     OR    10001110B        ; BUILD OP-CODE
  2984.     CALL    APPBT            ; APPEND IT TO BUFFER
  2985.     EX    DE,HL            ; GET DISP. INTEGER
  2986.     CALL    DISBT            ; APPEND DISPLACEMENT INTEGER IF REQD
  2987.     RET
  2988. ;********************************************************************
  2989. ;GROUP 1B - HL,BC/DE/HL/SP
  2990. ;********************************************************************
  2991. GP1B4:    LD    A,B            ; GET OPD BYTE 1
  2992.     CP    12H            ; MUST BE HL
  2993.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  2994.     LD    A,C            ; GET OPD BYTE 2
  2995.     CP    14H            ; MUST BE BC/DE/HL/SP
  2996.     JP    NC,SYNERR        ; JUMP IF NOT, ERROR
  2997.     LD    A,0EDH            ; APPEND PREFIX BYTE TO BUFFER
  2998.     CALL    APPBT            
  2999.     LD    A,(ORTKBF+1)        ; GET OPR DISTING BIT
  3000.     AND    00001000B        ; MASK IT
  3001.     OR    01000010B        ; BUILD OP-CODE
  3002.     CALL    IREGP            ; COMBINE REG PAIR BITS
  3003.     CALL    APPBT            ; APPEND IT TO BUFFER
  3004.     RET
  3005. ;*******************************************************************
  3006. ;PROCESS ADD (GROUP 1C)
  3007. ;*******************************************************************
  3008. ;*******************************************************************
  3009. ;GROUP 1C - A,R
  3010. ;*******************************************************************
  3011. GP1C1:    LD    A,B            ; GET OPD BYTE 1
  3012.     CP    77H            ; MUST BE 'A' REG
  3013.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3014.     LD    A,10000000B        ; BUILD OP-CODE
  3015.     CALL    ISREG            ; COMBINE REG BITS
  3016.     CALL    APPBT            ; APPEND TO BUFFER
  3017.     RET
  3018. ;*******************************************************************
  3019. ;GROUP 1C - A,N   
  3020. ;*******************************************************************
  3021. GP1C2:    LD    A,B            ; GET OPD BYTE 1
  3022.     CP    77H            ; MUST BE 'A' REG
  3023.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3024.     LD    A,0C6H            ; APPEND OP-CODE
  3025.     CALL    APPBT            
  3026.     EX    DE,HL            ; GET INTEGER IN HL
  3027.     CALL    CHKOF            ; FLAG ANY OVERFLOW FROM L
  3028.     LD    A,L            ; APPEND INTEGER TO BUFFER
  3029.     CALL    APPBT
  3030.     RET
  3031. ;********************************************************************    
  3032. ;GROUP 1C - A,(HL)/(IX+D)/(IY+D)
  3033. ;********************************************************************
  3034. GP1C3:    LD    A,B            ; GET OPD BYTE 1
  3035.     CP    77H            ; MUST BE 'A' REG
  3036.     JP    NZ,SYNERR
  3037.     LD    B,C            ; PUT OPD BYTE 2 IN B
  3038.     CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  3039.     LD    A,86H            ; APPEND OP-CODE TO BUFFER
  3040.     CALL    APPBT
  3041.     EX    DE,HL            ; GET DISP INTEGER IN HL
  3042.     CALL    DISBT            ; APPEND IT IF REQD
  3043.     RET
  3044. ;********************************************************************
  3045. ;GROUP 1C - HL/IX/IY,RP
  3046. ;********************************************************************
  3047. GP1C4:    LD    A,B            ; GET OPD BYTE 1 
  3048.     AND    11B            ; MUST BE HL/IX/IY
  3049.     CP    10B
  3050.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3051.     LD    A,C            ; GET OPD BYTE 2
  3052.     AND    11B            ; IS IT BC/DE/SP
  3053.     CP    10B
  3054.     JR    NZ,GP1C41        ; JUMP IF SO
  3055.     LD    A,C            ; IS IT SAME AS OPD 1?
  3056.     CP    B
  3057.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3058. GP1C41:    CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  3059.     LD    A,00001001B        ; BUILD OP-CODE
  3060.     CALL    IREGP            ; COMBINE REG PAIR BITS
  3061.     CALL    APPBT
  3062.     RET
  3063. ;********************************************************************
  3064. ;PROCESS LD (GROUP 1D)
  3065. ;********************************************************************
  3066. ;********************************************************************
  3067. ;GROUP 1D - A,(BC)/(DE)
  3068. ;********************************************************************
  3069. GP1D1:    LD    A,B            ; GET OPD BYTE 1
  3070.     CP    77H            ; MUST BE 'A' REG
  3071.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3072.     LD    A,00001010B        ; BUILD OP-CODE
  3073.     CALL    IREGP            ; COMBINE REG BITS
  3074.     CALL    APPBT            ; APPEND OP-CODE TO BUFFER
  3075.     RET
  3076. ;********************************************************************
  3077. ;GROUP 1D - A,I/R
  3078. ;********************************************************************
  3079. GP1D2:    LD    A,B            ; GET OPD BYTE 1
  3080.     CP    77H            ; MUST BE 'A' REG
  3081.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3082.     LD    A,0EDH            ; APPEND PREFIX BYTE TO BUFFER
  3083.     CALL    APPBT            
  3084.     LD    A,01010111B        ; BUILD OP-CODE
  3085.     CALL    IDREG            ; COMBINE REG BIT
  3086.     CALL    APPBT            ; APPEND OP-CODE TO BUFFER
  3087.     RET
  3088. ;********************************************************************    
  3089. ;GROUP 1D - A,(NN)
  3090. ;********************************************************************
  3091. GP1D3:    LD    A,B            ; GET OPD BYTE 1
  3092.     CP    77H            ; MUST BE 'A' REG
  3093.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3094.     EX    DE,HL            ; GET INTEGER IN HL
  3095.     LD    A,3AH            ; APPEND OP-CODE TO BEFFER
  3096.     CALL    APPBT
  3097.     CALL    APPWD            ; APPEND INTEGER
  3098.     RET
  3099. ;********************************************************************    
  3100. ;GROUP 1D - (BC)/(DE),A
  3101. ;********************************************************************
  3102. GP1D4:    LD    A,C            ; GET OPD BYTE 2
  3103.     CP    77H            ; MUST BE 'A' REG
  3104.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3105.     LD    C,B            ; PUT OPD BYTE 1 IN C
  3106.     LD    A,00000010B        ; BUILD OP-CODE
  3107.     CALL    IREGP            ; COMBINE REG PAIR BITS
  3108.     CALL    APPBT            ; APPEND OP-CODE TO BUFFER
  3109.     RET
  3110. ;*******************************************************************
  3111. ;GROUP 1D - (HL)/(IX+D)/(IY+D),N
  3112. ;*******************************************************************
  3113. GP1D5:    CALL    INDPF            ; APPEND INDEX PREFIX TO BUFFER
  3114.     LD    A,36H
  3115.     CALL    APPBT            ; APPEND OP-CODE
  3116.     CALL    DISBT            ; APPEND DISP BYTE IF REQD
  3117.     EX    DE,HL            ; GET INTEGER IN HL
  3118.     CALL    CHKOF            ; FLAG OVERFLOW FROM L
  3119.     LD    A,L            ; APPEND INTEGER TO BUFFER
  3120.     CALL    APPBT
  3121.     RET
  3122. ;*******************************************************************
  3123. ;GROUP 1D - BC/DE/HL/SP/IX/IY,NN
  3124. ;*******************************************************************
  3125. GP1D6:    LD    A,B            ; GET OPD BYTE 1
  3126.     CP    17H            ; MUST NOT BE AF REG PAIR
  3127.     JP    Z,SYNERR        ; JUMP IF IT IS, ERROR
  3128.     LD    C,B            ; GET OPD BYTE 1 IN C
  3129.     CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  3130.     LD    A,00000001B        ; BUILD OP-CODE
  3131.     CALL    IREGP            ; COMBINE REG PAIR BITS
  3132.     CALL    APPBT            ; APPEND OP-CODE
  3133.     EX    DE,HL            ; GET INTEGER IN HL
  3134.     CALL    APPWD            ; APPEND INTEGER
  3135.     RET
  3136. ;*******************************************************************
  3137. ;GROUP 1D - BC/DE/HL/SP/IX/IY,(NN)
  3138. ;*******************************************************************
  3139. GP1D7:    LD    A,B            ; GET OPD BYTE 1
  3140.     LD    C,B            ; PUT IN C
  3141.     CP    17H            ; MUST NOT BE AF
  3142.     JP    Z,SYNERR        ; JUMP IF IT IS, ERROR
  3143.     AND    11B            ; TEST FOR HL/IX/IY
  3144.     CP    10B            ; TREAT HL/IX/IY SEPARATELY
  3145.     JR    Z,GP1D71        ; JUMP IF HL/IX/IY
  3146.     LD    A,0EDH            ; APPEND PREFIX BYTE
  3147.     CALL    APPBT
  3148.     LD    A,01001011B        ; BUILD OP-CODE
  3149.     CALL    IREGP            ; COMBINE REG PAIR BITS
  3150.     JR    GP1D72
  3151. GP1D71:    CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  3152.     LD    A,2AH            ; APPEND OP-CODE TO BUFFER
  3153. GP1D72:    CALL    APPBT
  3154.     EX    DE,HL            ; GET INTEGER IN HL
  3155.     CALL    APPWD            ; APPEND INTEGER
  3156.     RET
  3157. ;********************************************************************
  3158. ;GROUP 1D - (HL)/(IX+D)/(IY+D),R
  3159. ;********************************************************************
  3160. GP1D8:    CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  3161.     LD    A,01110000B        ; BUILD OP-CODE
  3162.     CALL    ISREG            ; COMBINE REG BITS
  3163.     CALL    APPBT            ; APPEND OP-CODE TO BUFFER
  3164.     CALL    DISBT            ; APPEND TO BUFFER IF REQD
  3165.     RET
  3166. ;********************************************************************
  3167. ;GROUP 1D - I/R,A
  3168. ;********************************************************************
  3169. GP1D9:    LD    A,C            ; GET OPD BYTE 2
  3170.     CP    77H            ; MUST BE 'A' REG
  3171.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3172.     LD    C,B            ; PUT OPD BYTE 1 IN C
  3173.     LD    A,0EDH            ; APPEND PREFIX BYTE
  3174.     CALL    APPBT
  3175.     LD    A,01000111B        ; BUILD OP-CODE
  3176.     CALL    IDREG            ; COMBINE REG BIT
  3177.     CALL    APPBT            ; APPEND OP-CODE
  3178.     RET
  3179. ;********************************************************************
  3180. ;GROUP 1D - (NN),A
  3181. ;********************************************************************
  3182. GP1DA:    LD    A,C            ; GET OPD BYTE 2
  3183.     CP    77H            ; MUST BE 'A' REG
  3184.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3185.     LD    A,32H            ; APPEND OP-CODE TO BUFFER
  3186.     CALL    APPBT
  3187.     CALL    APPWD            ; APPEND INTEGER
  3188.     RET
  3189. ;********************************************************************
  3190. ;GROUP 1D = (NN),BC/DE/HL/SP/IX/IY
  3191. ;********************************************************************
  3192. GP1DB:    LD    A,C            ; GET OPD BYTE 2
  3193.     LD    B,C            ; PUT IN B
  3194.     CP    17H            ; MUST NOT BE AF
  3195.     JP    Z,SYNERR        ; JUMP IF IT IS, ERROR
  3196.     AND    11B            ; TEST FOR HL/IX/IY
  3197.     CP    10B
  3198.     JR    Z,GP1DB1        ; JUMP TO TREAT HL/IX/IY SEPARATELY
  3199.     LD    A,0EDH            ; APPEND PREFIX BYTE
  3200.     CALL    APPBT
  3201.     LD    A,01000011B        ; BUILD OP-CODE
  3202.     CALL    IREGP            ; COMBINE REG PAIR BITS
  3203.     JR    GP1DB2
  3204. GP1DB1:    CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  3205.     LD    A,22H            ; PUT OP-CODE IN A
  3206. GP1DB2:    CALL    APPBT            ; APPEND OP-CODE
  3207.     CALL    APPWD            ; APPEND INTEGER
  3208.     RET
  3209. ;**********************************************************************
  3210. ;GROUP 1D - R,(HL)/(IX+D)/(IY+D)
  3211. ;**********************************************************************
  3212. GP1DC:    LD    A,B            ; SWAP B AND C
  3213.     LD    B,C
  3214.     LD    C,A
  3215.     CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  3216.     LD    A,01000110B        ; BUILD OP-CODE
  3217.     CALL    IDREG            ; COMBINE REG BITS
  3218.     CALL    APPBT            ; APPEND OP-CODE
  3219.     EX    DE,HL            ; GET INTEGER IN HL
  3220.     CALL    DISBT            ; APPEND DISP BYTE IF REQD
  3221.     RET
  3222. ;**********************************************************************
  3223. ;GROUP 1D - R,N
  3224. ;**********************************************************************
  3225. GP1DD:    LD    C,B            ; PUT OPD BYTE 1 IN C
  3226.     LD    A,00000110B        ; BUILD OP-CODE
  3227.     CALL    IDREG            ; COMBINE REG BITS
  3228.     CALL    APPBT            ; APPEND OP-CODE TO BUFFER
  3229.     EX    DE,HL            ; GET INTEGER IN HL
  3230.     CALL    CHKOF            ; FLAG OVERFLOW FROM L
  3231.     LD    A,L            ; APPEND INTEGER TO BUFFER
  3232.     CALL    APPBT
  3233.     RET
  3234. ;**********************************************************************
  3235. ;GROUP 1D - R,R
  3236. ;**********************************************************************
  3237. GP1DE:    LD    A,01000000B        ; BUILD OP-CODE
  3238.     CALL    ISREG            ; COMBINE SOURCE REG BITS
  3239.     LD    C,B
  3240.     CALL    IDREG            ; COMBINE DEST REG BITS
  3241.     CALL    APPBT            ; APPEND OP-CODE
  3242.     RET
  3243. ;*********************************************************************
  3244. ;GROUP 1D - SP,HL/IX/IY
  3245. ;*********************************************************************
  3246. GP1DF:    LD    A,B            ; GET OPD BYTE 1
  3247.     CP    13H            ; MUST BE SP
  3248.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3249.     LD    A,C            ; GET OPD BYTE 2
  3250.     LD    B,C            ; PUT IN B
  3251.     AND    11B            ; MUST BE HL/IX/IY
  3252.     CP    10B
  3253.     JP    NZ,SYNERR        ; JUMP IF NOT, ERROR
  3254.     CALL    INDPF            ; APPEND INDEX PREFIX IF REQD
  3255.     LD    A,0F9H            ; APPEND OP-CODE TO BUFFER
  3256.     CALL    APPBT
  3257.     RET
  3258. ;*******************************************************************
  3259. ;GET OPERAND PAIR BYTE
  3260. ;THE M.S. NIBBLE OF AN OPERAND TOKEN BYTE
  3261. ;SIGNIFIES THE OPERAND GROUP (0-E). THIS
  3262. ;SUBROUTINE BUILDS A BYTE WHOSE M.S. NIBBLE
  3263. ;IS THE GROUP OF OPERAND 1 AND WHOSE L.S.
  3264. ;NIBBLE IS THE GROUP OF OPERAND 2.
  3265. ;THIS COMPOSITE BYTE IS CALLED THE OPERAND
  3266. ;PAIR BYTE AND IS USED TO DETERMINE WHICH
  3267. ;PROCESSING SUBROUTINE (GP...) TO USE TO
  3268. ;GENERATE THE ASSEMBLED CODE.
  3269. ;
  3270. ;ON EXIT:
  3271. ;       A CONTAINS THE OPERAND BYTE PAIR
  3272. ;*******************************************************************
  3273. ODPBT:    PUSH    BC            ; SAVE BC
  3274.     LD    A,(ODBT1)        ; GET 1ST OPERAND BYTE
  3275.     AND    0F0H            ; MASK OPERAND GROUP NIBBLE  
  3276.     LD    B,A            ; SAVE IN B
  3277.     LD    A,(ODBT2)        ; GET 2ND OPERAND BYTE
  3278.     AND    0F0H            ; MASK OPERAND GROUP NIBBLE
  3279.     RRCA                ; SHIFT INTO LOWER 4 BITS
  3280.     RRCA
  3281.     RRCA
  3282.     RRCA
  3283.     OR    B            ; CONSTRUCT COMPOSITE OPERAND
  3284.                     ; GROUP BYTE IN A
  3285.     POP    BC            ; REPLACE BC
  3286.     RET
  3287. ;******************************************************************
  3288. ;GENERATE INDEX REGISTER PREFIX BYTE
  3289. ;ON ENTRY:
  3290. ;       B CONTAINS OPERAND TOKEN
  3291. ;PREFIX IS APPENDED TO ASSD CODE BUFFER IF
  3292. ;OPERAND IS IX OR IY.
  3293. ;******************************************************************
  3294. INDPF:    BIT    3,B            ; IS OPERAND IX OR IY?
  3295.     RET    Z            ; NO PREFIX IF NOT, RETURN
  3296.     LD    A,0DDH            ; PUT PREFIX BYTE FOR IX IN A
  3297.     BIT    2,B            ; IS OPERAND IY?
  3298.     JR    Z,INDPF1        ; JUMP IF NOT
  3299.     LD    A,0FDH            ; PUT PREFIX BYTE FOR IY IN A
  3300. INDPF1:    CALL    APPBT            ; APPEND BYTE TO ASSD CODE BUFFER
  3301.     RET
  3302. ;******************************************************************
  3303. ;GENERATE DISPLACEMENT BYTE
  3304. ;USE NO. IN HL FOR DISPLACEMENT
  3305. ;B CONTAINS OPERAND BYTE
  3306. ;******************************************************************
  3307. DISBT:    BIT    3,B            ; IS OPERAND IX OR IY?
  3308.     RET    Z            ; IF NOT, NO DISP. BYTE REQD
  3309.     CALL    CHKOF            ; CHECK NO. IN HL FOR 8 BIT OVERFLOW
  3310.     LD    A,L            ; GET L.S. BYTE IN ACC.
  3311.     CALL    APPBT            ; AND APPEND TO ASSD CODE BUFFER
  3312.     RET
  3313. ;******************************************************************
  3314. ;CHECK OVERFLOW FROM L
  3315. ;VALUE ERROR INDICATED IF SO
  3316. ;******************************************************************
  3317. CHKOF:    PUSH    BC            ; SAVE BC
  3318.     LD    A,H            ; GET REG CONTAINING POSSIBLE OVERFLOW
  3319.     AND    A            ; IS IT ZERO?
  3320.     JR    Z,CHKOF1        ; IF SO, NO OVERFLOW
  3321.     INC    A            ; WAS IT -1? (FF)
  3322.     JR    Z,CHKOF1        ; IF SO, NO OVERFLOW
  3323.     LD    C,'V'            ; OTHERWISE INDICATE 'VALUE' ERROR
  3324.     CALL    ERROR
  3325. CHKOF1:    POP    BC            ; REPLACE BC
  3326.     RET
  3327. ;*****************************************************************
  3328. ;INSERT SOURCE REG
  3329. ;ON ENTRY:
  3330. ;       C CONTAINS OPERAND BYTE
  3331. ;       A CONTAINS CODE BYTE BEING BUILT
  3332. ;ON EXIT:
  3333. ;       A HAS HAD THE REGISTER VALUE INSERTED
  3334. ;       TO BITD 0,1 & 2
  3335. ;*****************************************************************
  3336. ISREG:    PUSH    BC            ; SAVE REG
  3337.     LD    B,A            ; SAVE CODE BEING BUILT IN B
  3338.     LD    A,C            ; GET OPERAND BYTE FROM C
  3339.     AND    00000111B        ; MASK REGISTER VALUE
  3340.     OR    B            ; COMBINE WITH CODE BEING BUILT
  3341.     POP    BC            ; REPLACE REG
  3342.     RET
  3343. ;******************************************************************
  3344. ;INSERT DESTINATION REGISTER
  3345. ;ON ENTRY:
  3346. ;       C CONTAINS OPERAND BYTE
  3347. ;       A CONTAINS CODE BYTE BEING BUILT
  3348. ;ON EXIT:
  3349. ;       A HAS HAD THE REGISTER VALUE INSERTED
  3350. ;         TO BITS 3,4 & 5
  3351. ;******************************************************************
  3352. IDREG:    PUSH    BC            ; SAVE BC
  3353.     LD    B,A            ; SAVE CODE BEING BUILT IN B
  3354.     LD    A,C            ; GET OPERAND BYTE FROM C
  3355.     AND    00000111B        ; MASK REGISTER VALUE
  3356.     RLCA                ; SHIFT TO DESTINATION REG POSITION
  3357.     RLCA
  3358.     RLCA
  3359.     OR    B            ; COMBINE WITH CODE BEING BUILT
  3360.     POP    BC            ; REPLACE BC
  3361.     RET
  3362. ;******************************************************************
  3363. ;INSERT REGISTER PAIR
  3364. ;ON ENTRY:
  3365. ;       C CONTAINS OPERAND BYTE
  3366. ;       A CONTAINS CODE BYTE BEING BUILT
  3367. ;ON EXIT:
  3368. ;       A HAS HAD THE REGISTER PAIR VALUE
  3369. ;         INSERTED TO BITS 4 & 5.
  3370. ;******************************************************************
  3371. IREGP:    PUSH    BC            ; SAVE BC
  3372.     LD    B,A            ; SAVE CODE BEING BUILT IN B
  3373.     LD    A,C            ; GET OPERAND BYTE FROM C
  3374.     AND    00000011B        ; MASK REGISTER PAIR VALUE
  3375.     RLCA                ; SHIFT TO CORRECT REG PAIR POSITION
  3376.     RLCA
  3377.     RLCA
  3378.     RLCA
  3379.     OR    B            ; COMBINE WITH CODE BEING BUILT
  3380.     POP    BC            ; REPLACE BC
  3381.     RET
  3382. ;*******************************************************************
  3383. ;APPEND WORD TO ASSEMBLED CODE BUFFER
  3384. ;*******************************************************************
  3385. APPWD:    LD    A,L            ; APPEND LOW BYTE
  3386.     CALL    APPBT
  3387.     LD    A,H            ; APPEND HIGH BYTE
  3388.     CALL    APPBT
  3389.     RET
  3390. ;*******************************************************************
  3391. ;APPEND BYTE TO ASSEMBLED CODE BUFFER
  3392. ;*******************************************************************
  3393. APPBT:    PUSH    HL            ; SAVE REGISTERS
  3394.     PUSH    DE
  3395.     EX AF,AF'             ; SAVE NEW BYTE IN A'
  3396.     LD    HL,ASSCOD        ; SET POINTER TO ASSD CODE BUFF
  3397.     LD    A,(ASCDNO)        ; GET 'NO. BYTES ASSD CODE'
  3398.     LD    E,A            ; TO E
  3399.     LD    D,0            ; CLEAR D
  3400.     ADD    HL,DE            ; ADD TO POINTER
  3401.     EX AF,AF'            ; RECOVER NEW BYTE
  3402.     LD    (HL),A            ; AND PUT IN ASSD CODE BUFF
  3403.     INC    E            ; INCR CNTR
  3404.     LD    A,E            ; AND REPLACE
  3405.     LD    (ASCDNO),A        ; IN 'NO. BYTES ASSD CODE'
  3406.     POP    DE            ; REPLACE REGS
  3407.     POP    HL
  3408.     RET
  3409. ;*******************************************************************
  3410. ;ADJUST ADDRESS REFERENCE COUNTER
  3411. ;*******************************************************************
  3412. ADJARC:    PUSH    HL            ; SAVE REGS
  3413.     PUSH    DE
  3414.     LD    HL,(ADREFC)        ; GET ADDR REF CNTR
  3415.     LD    A,(ASCDNO)        ; ADD TO THIS VALUE THE NO.
  3416.     LD    E,A
  3417.     LD    D,0            ; OF BYTES OF ASSD CODE
  3418.     ADD    HL,DE            ; AND PUT BACK INTO
  3419.     LD    (ADREFC),HL        ; ADDR REF CNTR
  3420.     POP    DE            ; REPLACE REGS
  3421.     POP    HL
  3422.     RET
  3423. ;******************************************************************
  3424. ;DEFAULT NOP'S
  3425. ;******************************************************************
  3426. DNOPS:    PUSH    BC            ; SAVE BC
  3427.     LD    C,'S'            ; INDICATE SYNTAX ERROR
  3428.     CALL    ERROR            
  3429.     LD    A,4            ; RESERVE 4 BYTES NOP'S
  3430.     LD    (ASCDNO),A
  3431.     POP    BC            ; REPLACE BC
  3432.     RET
  3433. ;******************************************************************
  3434. ;PERFORM RELEVANT OUTPUT
  3435. ;******************************************************************
  3436. PFRLO:    LD    A,(PASSNO)        ; WHICH PASS?
  3437.     CP    1
  3438.     RET    Z            ; NO OUTPUT ON PASS 1
  3439.     CP    2
  3440.     JR    Z,PFRLO1        ; JUMP IF PASS 2
  3441.     CP    3
  3442.     JR    Z,PFRLO2        ; JUMP IF PASS 3
  3443.     LD    A,(ERRBUF)
  3444.     CP    SPACE
  3445.     RET    Z
  3446.     CALL    OLNBF            ; OUTPUT LINE BUFFER TO LIST DEV.
  3447.     CALL    LSTLN            ; LIST RESULTS OF ASSEMBLY
  3448.     RET
  3449. PFRLO1:    CALL    LSTLN            ; LIST RESULTS OF ASSEMBLY
  3450.     LD    A,(AFLAGS)        ; TEST 'END' FLAG
  3451.     BIT    1,A
  3452.     RET    Z            ; LOOP IF NOT END
  3453.     CALL    LSYMT            ; LIST SYMBOL TABLE
  3454.     RET
  3455. PFRLO2:    CALL    OBJO            ; DO OBJECT FILE OUTPUT
  3456.     RET
  3457. ;*****************************************************************
  3458. ;OUTPUT CONTENTS OF LINE BUFFER TO LIST DEV.
  3459. ;*****************************************************************
  3460. OLNBF:    PUSH    HL            ; SAVE REGS
  3461.     PUSH    BC
  3462.     LD    HL,LINBUF        ; SET POINTER TO LINE BUFFER
  3463. OLNBF1:    LD    C,(HL)            ; GET A CHAR
  3464.     CALL    LO            ; OUTPUT TO LIST DEVICE
  3465.     LD    A,C            ; WAS IT CR?
  3466.     CP    CR
  3467.     JR    Z,OLNBF2        ; JUMP IF SO
  3468.     INC    HL
  3469.     JR    OLNBF1
  3470. OLNBF2:    POP    BC            ; REPLACE REGS
  3471.     POP    HL
  3472.     RET
  3473. ;****************************************************************
  3474. ;LIST RESULT OF ASSEMBLY OF 1 LINE.
  3475. ;****************************************************************
  3476. LSTLN:    PUSH    HL            ; SAVE REGS
  3477.     PUSH    DE
  3478.     PUSH    BC
  3479.     PUSH    IX
  3480.     LD    A,(ERRBUF)        ; PRINT CONTENTS OF ERROR BUFFER
  3481.     LD    C,A            
  3482.     CALL    LO
  3483.     LD    C,SPACE            ; PRINT SPACE
  3484.     CALL    LO
  3485.     LD    HL,(ADDISR)        ; GET CONT. OF ADDR DISP. REG
  3486.     LD    A,(ASCDNO)        ; GET NO. OF BYTES OF ASSD. CODE
  3487.     LD    D,A            ; INTO D
  3488.     LD    IX,ASSCOD        ; SET POINTER TO ASSD. CODE
  3489. LSTLN3:    LD    E,4            ; MAX. NO. OF BYTES/LINE
  3490.     PUSH    DE            ; PRESERVE D
  3491.     CALL    LISTAD            ; PRINT ADDR REF.
  3492.     POP    DE
  3493.     LD    C,SPACE            ; PRINT SPACE
  3494.     CALL    LO
  3495.     LD    A,D            ; ANY BYTES TO PRINT
  3496.     AND    A
  3497.     JR    Z,LSTLN4        ; JUMP IF NOT
  3498. LSTLN1:    LD    A,(IX)            ; GET BYTE
  3499.     PUSH    DE            ; PRESERVE D
  3500.     CALL    LISTBT            ; PRINT 1 BYTE
  3501.     POP    DE
  3502.     INC    IX            ; INCR POINTER TO NEXT BYTE
  3503.     INC    HL            ; INCR CORRES. ADDR. REF.
  3504.     DEC    E
  3505.     DEC    D            ; DECR NO OF BYTES
  3506.     JR    Z,LSTLN4        ; JUMP IF NONE LEFT
  3507.     LD    A,E            ; PRINTED 4 ON THIS LINE?
  3508.     AND    A
  3509.     JR    NZ,LSTLN1        ; JUMP IF NOT
  3510. LSTLN2:    CALL    LFEED
  3511.     LD    C,CR            ; PRINT CR CR SP SP
  3512.     LD    B,2
  3513.     CALL    OUTC
  3514.     LD    C,SPACE
  3515.     LD    B,2               
  3516.     CALL    OUTC
  3517.     JR    LSTLN3
  3518. LSTLN4:    RLC    E            ; PRINT SPACES UP TO BEGINNING OF TEXT
  3519.     INC    E
  3520.     LD    B,E
  3521.     LD    C,SPACE
  3522.     CALL    OUTC            ; OUTPUT CHAR N TIMES
  3523.     CALL    LFEED            ; PRINT LF OR NEW PAGE HEADER
  3524.     POP    IX            ; REPLACE REGS
  3525.     POP    BC
  3526.     POP    DE
  3527.     POP    HL
  3528.     RET
  3529. ;*******************************************************************
  3530. ;OUTPUT CHAR N TIMES TO LIST DEVICE
  3531. ;*******************************************************************
  3532. OUTC:    CALL    LO            ; COUNT IN B
  3533.     DJNZ    OUTC
  3534.     RET
  3535. ;*******************************************************************
  3536. ;LIST BYTE
  3537. ;CONVERTS BYTE IN ACC TO 2 ASCII
  3538. ;HEXADECIMAL CHARACTERS AND OUTPUTS THEM
  3539. ;TO LIST OR PUNCH DEVICE DEPENDING ON PASS.
  3540. ;THE BYTE IS ALSO SUBTRACTED FROM D TO
  3541. ;HELP COMPUTE CHECKSUMS.
  3542. ;*******************************************************************
  3543. LISTBT:    PUSH    BC            ; SAVE REGS
  3544.     LD    B,A            ; SAVE BYTE IN B
  3545.     AND    0F0H            ; GET M.S. NIBBLE
  3546.     RRCA
  3547.     RRCA
  3548.     RRCA
  3549.     RRCA
  3550.     CALL    BINHX            ; CONVERT TO ASCII HEXADECIMAL
  3551.     LD    C,A            ; OUTPUT TO RELEVANT DEVICE
  3552.     CALL    XO
  3553.     LD    A,B            ; GET BYTE AGAIN
  3554.     AND    0FH            ; GET L.S. NIBBLE
  3555.     CALL    BINHX            ; CONVERT TO ASCII HEX
  3556.     LD    C,A            ; OUTPUT TO RELEVANT DEVICE
  3557.     CALL    XO
  3558.     LD    A,D            ; GET CUMULATIVE CHECKSUM
  3559.     SUB    B            ; SUBTRACT NEW BYTE
  3560.     LD    D,A            ; REPLACE CHECKSUM
  3561.     POP    BC            ; REPLACE REG
  3562.     RET
  3563. ;.................................................................
  3564. BINHX:    CP    10D            ; CONVERT VALUE IN A TO ASCII HEX
  3565.     JR    NC,BINHX1
  3566.     ADD    A,'0'
  3567.     RET
  3568. BINHX1:    ADD    A,'A'-10D
  3569.     RET
  3570. ;**********************************************************************
  3571. ;OUTPUT TO DEVICE RELEVANT TO PASS NO.
  3572. ;**********************************************************************
  3573. XO:    LD    A,(PASSNO)
  3574.     CP    3
  3575.     JP    Z,PCHO
  3576.     JP    LO
  3577. ;**********************************************************************
  3578. ;LIST ADDRESS
  3579. ;**********************************************************************
  3580. LISTAD:    LD    A,H
  3581.     CALL    LISTBT
  3582.     LD    A,L
  3583.     CALL    LISTBT
  3584.     RET
  3585. ;**********************************************************************    
  3586. ;LINE FEED.
  3587. ;**********************************************************************
  3588. LFEED:    PUSH    BC            ; SAVE REGS
  3589.     LD    A,(LINE)        ; TIME FOR A NEW PAGE?
  3590.     CP    PLINES-9-1
  3591.     JR    NC,LFEED1
  3592.     INC    A            ; INCREMENT LINE NO.
  3593.     LD    (LINE),A
  3594.     LD    C,LF            ; PRINT LF
  3595.     CALL    LO
  3596.     JR    LFEED2
  3597. LFEED1:    CALL    HEADR            ; PRINT PAGE HEADER
  3598.     LD    C,SPACE
  3599.     LD    B,16D
  3600.     CALL    OUTC
  3601. LFEED2:    POP    BC            ; REPLACE REGS
  3602.     RET
  3603. ;*********************************************************************
  3604. ;PRINT PAGE HEADER ON LIST DEVICE
  3605. ;*********************************************************************
  3606. HEADR:    PUSH    HL            ; SAVE REGS
  3607.     PUSH    BC
  3608.     LD    C,CR            ; PRINT CR, 5 X LF
  3609.     CALL    LO
  3610.     LD    C,LF
  3611.     LD    B,5
  3612.     CALL    OUTC
  3613.       LD      HL,PHEAD        ; POINTER TO PAGE HEADING
  3614.     CALL    LSTST
  3615.     JR    HEADR1
  3616. PHEAD:    DEFM    'CROWE Z80 ASSEMBLER V1.1 PAGE '
  3617.     DEFB    0
  3618. HEADR1:    CALL    PRNTP            ; PRINT PAGE NO.
  3619.     CALL    INCP            ; INCREMENT PAGE NO.
  3620.     XOR    A            ; ZERO LINE NO.
  3621.     LD    (LINE),A
  3622.     LD    C,CR            ; PRINT CR LF
  3623.     CALL    LO
  3624.     LD    C,LF
  3625.      CALL    LO
  3626.     LD    HL,TITBUF        ; PRINT CONTENTS OF TITLE BUFFER
  3627.     CALL    LSTST
  3628.     LD    C,CR            ; PRINT CR, 3 X LR, 16 X SP
  3629.     CALL    LO
  3630.     LD    C,LF
  3631.     LD    B,3
  3632.     CALL    OUTC
  3633.     POP    BC            ; REPLACE REGS
  3634.     POP    HL
  3635.     RET
  3636. ;**********************************************************************
  3637. ;LIST STRING
  3638. ;**********************************************************************
  3639. LSTST:    PUSH    BC            ; SAVE REG
  3640. LSTST1:    LD    A,(HL)            ; GET A CHAR
  3641.     AND    A            ; TEST FOR TERMINATOR CHAR
  3642.     JR    Z,LSTST2
  3643.     LD    C,A            ; IF NOT, PRINT IT
  3644.     CALL    LO
  3645.     INC    HL            ; INCREMENT POINTER
  3646.     JR    LSTST1            ; LOOP
  3647. LSTST2:    POP    BC            ; REPLACE REGS
  3648.     RET
  3649. ;**********************************************************************
  3650. ;PRINT PAGE NO.
  3651. ;**********************************************************************
  3652. PRNTP:    PUSH    HL            ; SAVE REGS
  3653.     PUSH    DE
  3654.     LD    DE,0            ; CLEAR DIGIT CNTR AND NON ZERO FLAG
  3655.     LD    HL,PAGE+1
  3656.     CALL    PNT2DG
  3657.     DEC    HL
  3658.     CALL    PNT2DG
  3659.     POP    DE            ; REPLACE REGS
  3660.     POP    HL
  3661.     RET
  3662. ;....................................................................
  3663. ;PRINT 2 DIGITS
  3664. ;....................................................................
  3665. PNT2DG:    RLD                ; ROTATE NIBBLES
  3666.     CALL    PNTDG            ; PRINT A DIGIT
  3667.     RLD                ; ROTATE NIBBLES
  3668.     CALL    PNTDG            ; PRINT A DIGIT
  3669.     RLD                ; ROTATE NIBBLES
  3670.     RET
  3671. ;...................................................................
  3672. ;PRINT A DIGIT
  3673. ;...................................................................
  3674. PNTDG:    PUSH    BC            ; SAVE REG
  3675.     LD    B,A            ; INCR DIGIT COUNT
  3676.     INC    E
  3677.     AND    0FH
  3678.     JR    NZ,PNTDG1        ; IS IT 0?
  3679.     BIT    0,D            ; LEADING ZERO?
  3680.     JR    NZ,PNTDG2
  3681.     JR    PNTDG3
  3682. PNTDG1:    SET    0,D            ; NON ZERO, SET FLAG
  3683. PNTDG2:    OR    30H            ; CONVERT TO ASCII
  3684.     LD    C,A            ; PRINT IT
  3685.     CALL    LO
  3686. PNTDG3:    LD    A,B
  3687.     POP    BC            ; REPLACE REG
  3688.     RET
  3689. ;*******************************************************************
  3690. ;INCREMENT PAGE NO.
  3691. ;*******************************************************************
  3692. INCP:    PUSH    HL            ; SAVE REG
  3693.     LD    HL,(PAGE)        ; GET PAGE NO (4 DIG BCD)
  3694.     LD    A,L            ; INCREMENT L.S. BYTE
  3695.     ADD    A,1
  3696.     DAA                       ; DECIMAL ADJUST
  3697.     LD    L,A            
  3698.     LD    A,H            ; CARRY TO M.S. BYTE
  3699.     ADC    A,0            
  3700.     DAA                ; DECIMAL ADJUST
  3701.     LD    H,A
  3702.     LD    (PAGE),HL        ; REPLACE PAGE NO.
  3703.     POP    HL            ; REPLACE REG
  3704.     RET
  3705. ;*******************************************************************
  3706. ;LIST SYMBOL TABLE
  3707. ;*******************************************************************
  3708. LSYMT:    PUSH    HL            ; SAVE REGS
  3709.     PUSH    DE
  3710.     PUSH    BC
  3711.     LD    C,CR            ; OUTPUT CR
  3712.     CALL    LO
  3713.     LD    A,(LINE)        ; GET LINE NO.
  3714. LSYMT1:    CP    PLINES-9-1        ; BOTTOM OF PAGE?
  3715.     JR    NC,LSYMT3        ; JUMP IF SO
  3716.     INC    A            ; ELSE INCR LINE NO.
  3717.     LD    B,A            ; SAVE IN B
  3718.     LD    C,LF            ; OUTPUT LF
  3719.     CALL    LO
  3720.     LD    A,B            ; GET LINE NO. IN A
  3721.     JR    LSYMT1            ; LOOP
  3722. LSYMT3:    CALL    HEADR            ; PRINT PAGE HEADER
  3723.     LD    HL,SYMTAB        ; POINT AT SYMBOL TABLE
  3724. LSYMT4:    LD    D,SPERL            ; LOAD NO OF SYMBOLS PER LINE
  3725. LSYMT5:    LD    A,(HL)            ; GET CHAR COUNT
  3726.     AND    A            ; IS IT ZERO?
  3727.     JR    Z,LSYM10        ; JUMP IF SO, END OF TABLE
  3728.     LD    B,A            ; PUT COUNT IN B
  3729.     LD    E,7            ; SPACES COUNT IN E
  3730.     INC    HL            ; INCR PNTR
  3731.                     ; PRINT SYMBOL
  3732. LSYMT6:    LD    C,(HL)            ; GET CHAR IN C
  3733.     CALL    LO            ; OUTPUT TO LIST DEVICE
  3734.     INC    HL            ; INCR PNTR
  3735.     DEC    E            ; DECR SPACE CNTR
  3736.     DEC    B            ; DECR CHAR CNTR
  3737.     JR    NZ,LSYMT6        ; LOOP IF NOT FINISHED
  3738.     LD    B,E            ; GET SPACES COUNT
  3739.     LD    C,SPACE            ; AND OUTPUT THAT NO.
  3740.     CALL    OUTC            ; OF SPACES
  3741.     INC    HL            ; INCR PNTR TO VALUE
  3742.     LD    A,(HL)            ; GET M.S. BYTE
  3743.     PUSH    DE            ; SAVE DE
  3744.     CALL    LISTBT            ; OUTPUT IN HEX
  3745.     DEC    HL            ; POINT AT L.S. BYTE
  3746.     LD    A,(HL)            ; GET IT
  3747.     CALL    LISTBT            ; OUTPUT IN HEX
  3748.     POP    DE            ; REPLACE DE
  3749.     INC    HL            ; POINT TO ATTRIBUTE BYTE
  3750.     INC    HL
  3751.     LD    C,SPACE            ; OUTPUT A SPACE
  3752.     CALL    LO
  3753.     LD    C,SPACE            ; SET UP A FURTHER SPACE
  3754.     BIT    1,(HL)            ; M FLAG SET?
  3755.     INC    HL            ; (INCR POINTER)
  3756.     JR    Z,LSYMT7        ; JUMP IF NOT
  3757.     LD    C,'M'            ; CHANGE SPACE TO 'M'
  3758. LSYMT7:    CALL    LO            ; OUTPUT CHAR
  3759.     DEC    D            ; DECR SYM/LINE CNT
  3760.     JR    Z,LSYMT8        ; JUMP IF DONE
  3761.     LD    C,SPACE            ; ELSE OUTPUT 2 SPACES
  3762.     LD    B,2
  3763.     CALL    OUTC
  3764.     JR    LSYMT5            ; AND LOOP
  3765. LSYMT8:    LD    A,(LINE)        ; GET LINE NO.
  3766.     CP    PLINES-9-1        ; BOTTOM OF PAGE?
  3767.     JR    NC,LSYMT9        ; JUMP IF SO
  3768.     INC    A            ; ELSE INCR LINE NO.
  3769.     LD    (LINE),A            
  3770.     LD    C,CR            ; LIST CR/LF
  3771.     CALL    LO
  3772.     LD    C,LF
  3773.     CALL    LO
  3774.     JR    LSYMT4            ; AND LOOP
  3775. LSYMT9:    CALL    HEADR            ; PRINT PAGE HEADER
  3776.     JR    LSYMT4            ; AND LOOP 
  3777. LSYM10:    POP    BC            ; REPLACE REGS
  3778.     POP    DE
  3779.     POP    HL
  3780.     RET
  3781. ;***************************************************************
  3782. ;OBJECT OUTPUT.
  3783. ;PERFORM OUTPUT OF OBJECT CODE USING THE INTEL
  3784. ;HEXADECIMAL OBJECT FORMAT WITH RECORD LENGTH
  3785. ;OF 'RECSIZ'
  3786. ;***************************************************************
  3787. OBJO:    PUSH    HL            ; SAVE REGS
  3788.     PUSH    DE
  3789.     PUSH    BC
  3790.     LD    HL,AFLAGS        ; END FLAG SET?
  3791.     BIT    1,(HL)
  3792.     JR    Z,OBJO2            ; JUMP IF NOT
  3793.     CALL    ODREC            ; PUNCH DATA RECORD
  3794.     CALL    OEREC            ; PUNCH EOF RECORD
  3795.     CALL    RUNOUT            ; PUCH TAPE RUNOUT
  3796.     JR    OBJO7
  3797. OBJO2:    BIT    0,(HL)            ; ADDR DISCONTINUITY FLAG SET?
  3798.     JR    Z,OBJO3            ; JUMP IF NOT
  3799.     CALL    ODREC            ; PUNCH DATA RECORD
  3800.     JR    OBJO7
  3801. OBJO3:    LD    C,0            ; CLEAR PNTR TO ASSD CODE BUFFER
  3802.     LD    A,(ASCDNO)        ; ANY BYTES OF ASSD CODE?
  3803.     LD    B,A            ; SAVE NO. IN B
  3804.     AND    A            ; ZERO?
  3805. OBJO4:    JR    Z,OBJO7            ; JUMP IF ZERO
  3806.     LD    HL,(ADDISR)        ; GET ADDR DISP REG IN HL
  3807.     LD    A,(OBJCNT)        ; ANY BYTES IN OBJECT BUFFER?
  3808.     AND    A            
  3809.     JR    NZ,OBJO5        ; JUMP IF SO
  3810.     LD    (RECADR),HL        ; ELSE COPY ADDR DISP REG
  3811.                     ; INTO RECORD ADDR
  3812. OBJO5:    INC    HL            ; INCR ADDR DISP REG
  3813.     LD    (ADDISR),HL        
  3814.                     ; TRANSFR BYTE FROM ASSD CODE BUFF
  3815.                     ; TO OBJECT BUFFER
  3816.     LD    HL,ASSCOD        ; POINT AT ASSD CODE BUFF
  3817.     LD    E,C            ; PUT ASSD CODE BUFF CNTR IN DE
  3818.     LD    D,0
  3819.     ADD    HL,DE            ; COMPUTE PNTR TO BYTE FOR TRANSFER
  3820.     LD    A,(HL)            ; GET BYTE
  3821.     EX AF,AF'            ; SAVE IN A'
  3822.     LD    HL,OBJBUF        ; POINT AT OBJECT BUFF
  3823.     LD    A,(OBJCNT)        ; PUT OBJ BUFF CNTR IN DE
  3824.     LD    E,A
  3825.     ADD    HL,DE            ; COMPUTE PNTR TO INSERT POSITION
  3826.     EX AF,AF'            ; GET BACK BYTE
  3827.     LD    (HL),A            ; AND APPEND TO OBJECT BUFFER
  3828.     LD    A,E            ; GET OBJ COUNT
  3829.     INC    A            ; INCREMENT IT
  3830.     LD    (OBJCNT),A        ; REPLACE COUNT IN OBJCNT
  3831.     CP    RECSIZ            ; ENOUGH BYTES FOR A RECORD
  3832.     JR    NZ,OBJO6        ; JUMP IF NOT
  3833.     CALL    ODREC            ; ELSE OUTPUT DATA RECORD
  3834. OBJO6:    INC    C            ; INCREMENT ASD CODE BUFF CNTR
  3835.     DEC    B            ; DECR NO OF BYTES
  3836.     JR    OBJO4            ; AND LOOP
  3837. OBJO7:    POP    BC            ; REPLACE REGS
  3838.     POP    DE
  3839.     POP    HL
  3840.     RET
  3841. ;***********************************************************************
  3842. ;OUTPUT DATA RECORD
  3843. ;OUTPUTS DATA RECORD USING INTEL'S HEXADECIMAL
  3844. ;OBJECT CODE FORMAT
  3845. ;***********************************************************************
  3846. ODREC:    PUSH    HL            ; SAVE REGS
  3847.     PUSH    DE
  3848.     PUSH    BC
  3849.     LD    A,(OBJCNT)        ; GET NO OF BYTES IN OBJ BUFF
  3850.     AND    A            ; IS IT ZERO?
  3851.     JR    Z,ODREC2        ; JUMP IF SO 
  3852.     LD    B,A            ; PUT COUNT IN B
  3853.     LD    C,':'            ; OUTPUT RECORD MARK
  3854.     CALL    PCHO            ; TO PUNCH DEVICE
  3855.     LD    D,0            ; CLEAR CHECKSUM REG D
  3856.     LD    A,B            ; OUTPUT BYTE COUNT
  3857.     CALL    LISTBT              
  3858.     LD    HL,(RECADR)        ; OUTPUT RECORD ADDR
  3859.     CALL    LISTAD
  3860.     XOR    A            ; OUTPUT RECORD TYPE (0)
  3861.     CALL    LISTBT
  3862.     LD    HL,OBJBUF        ; SET PNTR TO OBJECT BUFFER
  3863. ODREC1:    LD    A,(HL)            ; OUTPUT DATA BYTE
  3864.     CALL    LISTBT
  3865.     INC    HL            ; INCR PNTR
  3866.     DEC    B            ; DECR COUNT
  3867.     JR    NZ,ODREC1        ; LOOP IF NOT ZERO
  3868.     LD    A,D            ; OUTPUT CHECKSUM
  3869.     CALL    LISTBT
  3870.     LD    C,CR            ; OUTPUT CR
  3871.     CALL    PCHO
  3872.     LD    C,LF            ; OUTPUT LF
  3873.     CALL    PCHO
  3874.     XOR     A              ; SET NO. OF BYTES IN OBJBUF=0
  3875.     LD    (OBJCNT),A
  3876. ODREC2:    POP    BC            ; REPLACE REGS
  3877.     POP    DE
  3878.     POP    HL
  3879.     RET
  3880. ;********************************************************************
  3881. ;OUTPUT END OF FILE RECORD
  3882. ;OUTPUTS END OF FILE RECORD TO PUNCH DEVICE
  3883. ;USING INTEL'S HEXADECIMAL OBJECT FORMAT
  3884. ;********************************************************************
  3885. OEREC:    PUSH    HL            ; SAVE REGS
  3886.     PUSH    DE
  3887.     PUSH    BC
  3888.     LD    C,':'            ; OUTPUT RECORD MARK
  3889.     CALL    PCHO
  3890.     XOR    A            ; CLEAR A AND CHECKSUM (IN D)
  3891.     LD    D,A
  3892.     CALL    LISTBT            ; OUTPUT ZERO BYTE COUNT
  3893.     LD    HL,(STADDR)        ; GET START ADDR
  3894.     CALL    LISTAD            ; AND OUTPUT IT
  3895.     LD    A,1            ; OUTPUT RECORD TYPE (1)
  3896.     CALL    LISTBT
  3897.     LD    A,D            ; OUTPUT CHECKSUM
  3898.     CALL    LISTBT
  3899.     LD    C,CR            ; OUTPUT CR
  3900.     CALL    PCHO
  3901.     LD    C,LF            ; OUTPUT LF
  3902.     CALL    PCHO
  3903.     POP    BC            ; REPLACE REGS
  3904.     POP    DE
  3905.     POP    HL
  3906.     RET
  3907. ;*******************************************************************
  3908. ;RUNOUT
  3909. ;OUTPUTS 30 CM OF BLANK TAPE FOR PUNCHED TAPE
  3910. ;LEADER AND TRAILER.
  3911. ;IF NOT REQUIRED PUT 'RET' IN FIRST LOCATION
  3912. ;OF SUBROUTINE.
  3913. ;*******************************************************************
  3914. RUNOUT:    RET;PUSH    BC            ; SAVE REG
  3915.     LD    B,120            ; PUT COUNT IN B
  3916.     LD    C,NUL            ; PUT NULL CHAR IN C
  3917. RUN1:    CALL    PCHO            ; OUTPUT CHAR TO PUNCH
  3918.     DJNZ    RUN1            ; LOOP UNTIL DONE
  3919.     POP    BC            ; REPLACE REG
  3920.     RET
  3921. ;*******************************************************************
  3922. ;GET SYMBOL
  3923. ;ON ENTRY:
  3924. ;    HL POINTS AT 1ST CHAR OF SYMBOL    
  3925. ;       DE POINTS AT BUFFER
  3926. ;ON EXIT:
  3927. ;       HL POINTS AT CHAR AFTER SYMBOL
  3928. ;       BUFFER CONTAINS SYMBOL        
  3929. ;*******************************************************************
  3930. GSYM:    PUSH    IX            ; SAVE REGISTERS
  3931.     PUSH    BC
  3932.     LD    B,0            ; CLEAR CHAR COUNT
  3933.     PUSH    DE            ; SAVE START OF BUFFER POINTER
  3934.     POP    IX
  3935.     INC    DE            ; LEAVE SPACE IN BUFF FOR CHAR COUNT
  3936. GSYM1:    LD    (DE),A            ; PUT CHAR IN BUFFER
  3937.     INC    DE            ; INCREMENT POINTERS
  3938.     INC    HL
  3939.     INC    B            ; AND COUNTER
  3940.     LD    A,B            ; IS THAT 6 CHARS?
  3941.     CP    6
  3942.     JR    Z,GSYM2              
  3943.     LD    A,(HL)            ; FETCH NEXT CHAR
  3944.     CALL    VALID            ; IS IT VALID IN A SYMBOL?
  3945.     JR    C,GSYM1            ; JUMP IF SO
  3946. GSYM3:    LD    (IX),B            ; NO, END OF SYMBOL
  3947.     POP    BC            ; REPLACE SAVED REGISTERS
  3948.     POP    IX
  3949.     RET
  3950. GSYM2:    LD    A,(HL)            ; SCAN TO FIRST NON VALID CHAR
  3951.     CALL    VALID
  3952.     JR    NC,GSYM3
  3953.     INC    HL
  3954.     JR    GSYM2
  3955. ;**********************************************************************    
  3956. ;VALID LABEL CHAR?
  3957. ;ON ENTRY:
  3958. ;       A CONTAINS CHARACTER
  3959. ;ON EXIT:
  3960. ;       A CONTANS CHARACTER
  3961. ;       CARRY FLAG IS SET IF VALID.    
  3962. ;************************************************************************
  3963. VALID:    CP    'A'
  3964.     JR    C,VALID1
  3965.     CP    'Z'+1
  3966.     RET    C            ; VALID
  3967. VALID1:    CP    '0'
  3968.     JR    C,VALID2
  3969.     CP    '9'+1
  3970.     RET    C            ; VALID
  3971. VALID2:    CP    '?'
  3972.     JR    Z,VALID3
  3973.     CP    '-'
  3974.     JR    Z,VALID3
  3975.     SCF                   ; NOT VALID, CLEAR CARRY FLAG.
  3976.     CCF
  3977.     RET
  3978. VALID3:    SCF                     ; VALID, SET CARRY FLAG
  3979.     RET
  3980.  
  3981. ;*********************************************************************
  3982. ;GET TOKEN(S) FROM LIST
  3983. ;ON ENTRY:
  3984. ;       SYMBUF CONTAINS SYMBOL
  3985. ;       HL CONTAINS POINTER TO LIST POINTER TABLE
  3986. ;       DE POINTS AT DESTINATION FOR TOKENS
  3987. ;       C CONTAINS NO. OF TOKEN BYTES PER LIST ENTRY.
  3988. ;ON EXIT:
  3989. ;       TOKEN(S) ARE IN DESTINATION.
  3990. ;       LAST ONE IS ALSO IN A
  3991. ;       ZERO FLAG SET IF NOT IN LIST.
  3992. ;**********************************************************************
  3993. OPTOK:    PUSH    DE            ; SAVE PTR TO DEST FOR TOKENS.
  3994.     LD    A,(SYMBUF)        ; GET NO. OF BYTES IN STRING
  3995.     LD    B,A
  3996.     PUSH    BC            ; SAVE TOKEN BYTE COUNT (C)
  3997.                     ; AND STRING CHAR COUNT (B)
  3998.     SUB    1            ; (BYTES IN STRING - 1)
  3999.     RLCA                ; *2
  4000.     LD    E,A
  4001.     LD    D,0
  4002.     ADD    HL,DE            ; POINTER TO CORRECT WORD OF PNTR TABL
  4003.     LD    A,(HL)
  4004.     INC    HL
  4005.     LD    H,(HL)
  4006.     LD    L,A            ; HL POINTS TO CORRECT SECTION OF LIST
  4007. OPTOK3:    LD    DE,SYMBUF+1
  4008.     POP    BC
  4009.     PUSH    BC            ; B CONTAINS NO. OF CHARS IN STRING
  4010.     LD    A,(HL)            ; GET FIRST CHAR OF LIST ENTRY
  4011.     OR    A            ; IS IT 0?
  4012.     JR    Z,OPTOK4        ; YES, END OF LIST
  4013. OPTOK1:    EX    DE,HL            ; NO, COMPARE A CHAR
  4014.     CP    (HL)
  4015.     EX    DE,HL
  4016.     INC    HL            ; INCR POINTERS
  4017.     INC    DE
  4018.     JR    NZ,OPTOK2        ; CHARS NOT EQU, GO TO NEXT ENTRY
  4019.     DEC    B            ; CHARS EQU, DECR COUNT
  4020.     LD    A,(HL)            ; GET A CHAR
  4021.     JR    NZ,OPTOK1        ; MORE CHARS TO COMPARE
  4022.     POP    BC            ; NO MORE CHARS TO COMPARE
  4023.     POP    DE            ; MATCH FOUND, GET POINTER AND
  4024.                     ; COUNT FOR TOKEN BUFFER.
  4025. OPTOK5:    LD    A,(HL)
  4026.     LD    (DE),A            ; TRANSFER A BYTE
  4027.     INC    HL
  4028.     INC    DE
  4029.     DEC    C
  4030.     JR    NZ,OPTOK5
  4031.     INC    C            ; CLEAR ZERO FLAG
  4032.     RET                ; AND RETURN
  4033. OPTOK4:    POP    BC            ; ADJUST STACK
  4034.     POP    DE
  4035.     RET                ; AND RETURN
  4036. OPTOK2:    LD    A,B            ; ADD REMAINING COUNT+
  4037.                     ; (NO OF TOKENS)-1 TO LIST PNTR
  4038.     POP    BC
  4039.     PUSH    BC
  4040.     ADD    A,C
  4041.     DEC    A
  4042.     LD    E,A
  4043.     LD    D,0
  4044.     ADD    HL,DE            ; HL POINTING TO NEXT LIST ENTRY
  4045.     JR    OPTOK3            ; GO CHECK NEXT ENTRY
  4046. ;*************************************************************************
  4047. ;LOCATE A GIVEN SYMBOL IN THE SYMBOL TABLE,
  4048. ;OR THE CORRECT ALPHABETIC LOCATION FOR IT.
  4049. ;ON ENTRY:
  4050. ;       SEARCHED SYMBOL IS IN SYMBOL BUFFER.
  4051. ;ON EXIT:
  4052. ;       DE CONTAINS PNTR TO START OF ENTRY
  4053. ;          OR ALPHABETIC INSERTION POSITION.
  4054. ;       HL POINTS AT VALUE IF PRESENT
  4055. ;       ZERO FLAG SET IF FOUND IN TABLE.
  4056. ;*************************************************************************
  4057. LOCATE:    PUSH    BC            ; SAVE REGISTERS
  4058.     PUSH    IX
  4059.     LD    HL,SYMTAB        ; SET POINTER TO SYMBOL TABLE
  4060. LOC1:    PUSH    HL            ; SAVE POINTER TO START OF ENTRY
  4061.     POP    DE            ; IN DE
  4062.     LD    C,(HL)            ; SAVE NO OF CHARS IN SYM IN C
  4063.     INC    C            ; TEST C FOR ZERO
  4064.     DEC    C
  4065.     JR    Z,LOC3            ; IF ZERO THEN END OF TABLE
  4066.     LD    IX,SYMBUF        ; SET POINTER TO SYMBOL BUFFER
  4067.     LD    B,(IX)            ; SAVE NO OF CHARS IN SEARCHED SYM
  4068.     INC    HL            ; MOVE BOTH POINTERS TO 1ST
  4069.     INC    IX            ; CHARS OF SYMBOLS
  4070. LOC2:    LD    A,(IX)            ; COMPARE A CHAR 
  4071.     CP    (HL)
  4072.     JR    C,LOC3            ; TOO FAR
  4073.     JR    NZ,LOC5            ; NOT FAR ENOUGH   
  4074.                     ; CHARS EQUAL SO FAR
  4075.     INC    HL            ; MOVE BOTH POINTERS ON 1
  4076.     INC    IX
  4077.     DEC    C            ; DECR TABL SYM CHAR COUNT
  4078.     JR    Z,LOC6
  4079.     DEC    B            ; DECR SEARCHED SYM CHAR COUNT
  4080.     JR    Z,LOC3            ; TOO FAR
  4081.     JR    LOC2            ; EQUAL SO FAR
  4082. LOC6:    DEC    B
  4083.     JR    Z,LOC4            ; MATCH FOUND, RETURN WITH ZERO
  4084.                     ; FLAG SET, DE POINTING AT
  4085.                     ; ENTRY, & HL AT VALUE
  4086. LOC5:    LD    A,3            ; SET POINTER TO NEXT ENTRY
  4087.                     ; (ADD COUNTER+3 TO TABLE POINTER)
  4088.     ADD    A,C
  4089.     LD    C,A
  4090.     LD    B,0
  4091.     ADD    HL,BC
  4092.     JR    LOC1
  4093. LOC3:    INC     C            ; TOO FAR, RESET ZERO FLAG
  4094. LOC4:    POP    IX            ; REPLACE REGS & RETURN
  4095.     POP    BC            ; WITH ZERO FLAG=0
  4096.     RET                ; DE CONTAINS START OF ENTRY
  4097. ;***********************************************************************
  4098. ;TRANSFER LABEL (AND VALUE) TO SYMBOL BUFFER
  4099. ;ON ENTRY:  HL CONTAINS VALUE OF LABEL
  4100. ;ON EXIT:  HL CONTAINS POINTER TO ATTRIBUTE BYTE
  4101. ;             IN SYMBOL BUFFER
  4102. ;***********************************************************************
  4103. LBSYM:    PUSH    BC            ; SAVE REGS
  4104.     PUSH    DE
  4105.     LD    A,(LABBUF)        ; HOW MANY CHARS IN LABEL?
  4106.     AND    A            ; IS IT ZERO?
  4107.     JR    Z,LBSYM1        ; JUMP IF SO, NO LABEL
  4108.     INC    A            ; ADD 1 TO NUMBER
  4109.     LD    C,A            ; AND PUT IT IN BC
  4110.     LD    B,0
  4111.     PUSH    HL            ; SAVE VALUE OF LABEL
  4112.     LD    HL,LABBUF        ; SET SOURCE PNTR = LABEL BUFFER
  4113.     LD    DE,SYMBUF        ; SET DEST PNTR = SYMBOL BUFFER
  4114.     LDIR                ; TRANSFER LABEL TO SYMBOL BUFFER
  4115.     EX    DE,HL            ; PUT SYMBOL BUFF PNTR IN HL
  4116.     POP    DE            ; GET VALUE IN DE
  4117.     LD    (HL),E            ; AND PUT IN SYMBUF
  4118.     INC    HL
  4119.     LD    (HL),D
  4120.     INC    HL
  4121.     LD    (HL),0            ; CLEAR ATTRIBUTES BYTE
  4122.     XOR    A            ; CLEAR ZERO FLAG
  4123.     INC    A
  4124. LBSYM1:    POP    DE            ; REPLACE REGS
  4125.     POP    BC
  4126.     RET
  4127. ;***********************************************************************
  4128. ;CHECK SYMBOL IS NOT RESERVED WORD
  4129. ;ON ENTRY SYMBOL IS IN SYMBUF
  4130. ;CARRY FLAG SET IF RESERVED WORD.
  4131. ;***********************************************************************
  4132. SYMCH:    PUSH    HL            ; SAVE REGISTERS
  4133.     PUSH    DE
  4134.     PUSH    BC
  4135.                     ; CHECK IF SYMB = RESERVED WORD
  4136.     LD    A,(SYMBUF)        ; GET NO OF CHARS IN SYMB
  4137.     CP    6            ; MORE THAN 5 ?
  4138.     JR    NC,SYMCH3        ; IF SO NOT RESERVED WORD
  4139.     LD    DE,TEMP            ; CHECK IF IN OPERATOR LIST
  4140.     LD    HL,ORLSTP        ; PNTR TO OPR LIST PNTR TABLE
  4141.     LD    C,2            ; 2 TOKENS/ENTRY IN LIST
  4142.     CALL    OPTOK            ; IN LIST?
  4143.     JR    NZ,SYMCH1        ; JUMP IF SO
  4144.     LD    A,(SYMBUF)        ; GET NO OF CHARS IN SYMB
  4145.     CP    4            ; MORE THAT 3?
  4146.     JR    NC,SYMCH3        ; IF SO NOT RESERVED WORD
  4147.     LD    DE,TEMP            ; CHECK IF IN OPND KW LIST
  4148.     LD    HL,OPKLST        ; PNTR TO LIST PNTR TABLE
  4149.     LD    C,1            ; 1 TOKEN/ENTRY IN LIST
  4150.     CALL    OPTOK            ; IN LIST?
  4151.     JR    Z,SYMCH2        ; JUMP IF NOT
  4152.                     ; RESERVED WORD USED
  4153. SYMCH1:    LD    C,'W'            ; INDICATE ERROR
  4154.     CALL    ERROR
  4155.     SCF                ; SET CARRY FLAG
  4156.     JR    SYMCH3
  4157. SYMCH2:    AND    A            ; NOT RESERVED WORD, CLEAR CARRY
  4158. SYMCH3:    POP    BC            ; REPLACE REGISTERS
  4159.     POP    DE
  4160.     POP    HL
  4161.     RET
  4162. ;**********************************************************************
  4163. ;INSERT SYMBOL INTO SYMBOL TABLE
  4164. ;ON ENTRY DE POINTS AT INSERTION POSITION
  4165. ;SYMBOL IS IN SYMBOL BUFFER (SYMBUF)
  4166. ;**********************************************************************
  4167. INSERT:    EXX                ; SAVE REGS
  4168.     PUSH    HL
  4169.     PUSH    DE
  4170.     PUSH    BC
  4171.     EXX
  4172.     PUSH    HL
  4173.     PUSH    BC
  4174.     PUSH    DE
  4175.     LD    HL,(MEMTOP)        ; GET POINTER TO TOP OF
  4176.     LD    DE,-10            ; AVAILABLE RAM (WITH ROOM FOR ANOTHER
  4177.     ADD    HL,DE            ; ENTRY)
  4178.     LD    DE,(SYMEND)        ; GET PNTR TO END OF SYMBOL TABLE
  4179.     AND    A            ; CLEAR CARRY
  4180.     SBC    HL,DE            ; IS TABLE FULL?
  4181.     JR    NC,INSRT1        ; JUMP IF NOT
  4182.     LD    HL,AFLAGS        ; SET SYM TAB OVERFLOW FLAG
  4183.     SET    2,(HL)
  4184.     POP    DE            ; ADJUST STACK
  4185.     JR    INSRT2              
  4186. INSRT1:    POP    DE            ; LEAVE PNTR TO INSERT POS IN DE'
  4187.     PUSH    DE
  4188.     EXX
  4189.     POP    DE            ; GET PNTR TO INSERT POS
  4190.                     ; OPEN UP A GAP IN TABLE USING
  4191.                     ; BLOCK MOVE. DE WILL CONTAIN DEST.
  4192.                     ; HL THE SOURCE AND BC THE NO.
  4193.                     ; OF BYTES
  4194.     AND    A            ; CLEAR CARRY
  4195.     LD    HL,(SYMEND)        ; FIND NO OF BYTES BETWEEN INSERTION
  4196.     SBC    HL,DE            ; POSITION AND END OF SYMBOL
  4197.     INC    HL            ; TABLE
  4198.     PUSH    HL            ; SAVE NO OF BYTES ON STACK
  4199.     LD    HL,(SYMEND)
  4200.     LD    D,H
  4201.     LD    E,L
  4202.     LD    A,(SYMBUF)        ; CALCULATE NO OF BYTES FOR INSERTION
  4203.     ADD    A,4
  4204.     LD    C,A            ; PUT IN BC
  4205.     LD    B,0
  4206.     PUSH    BC            ; SAVE IN BC'
  4207.     EXX
  4208.     POP    BC
  4209.     EXX
  4210.     ADD    HL,BC
  4211.     LD    (SYMEND),HL        ; SAVE NEW END OF SYMBOL TABLE
  4212.     EX    DE,HL
  4213.     POP    BC            ; NO OF BYTES
  4214.     LDDR                ; MOVE BLOCK TO OPEN GAP
  4215.                     ; INSERT NEW SYMBOL RECORD
  4216.                     ; INTO GAP
  4217.     EXX
  4218.     LD    HL,SYMBUF
  4219.     LDIR
  4220. INSRT2:    POP    BC            ; REPLACE REGS
  4221.     POP    HL
  4222.     EXX
  4223.     POP    BC
  4224.     POP    DE
  4225.     POP    HL
  4226.     EXX
  4227.     RET
  4228. ;*********************************************************************
  4229. ;SCAN TO NEXT NON SPACE CHAR
  4230. ;ON ENTRY:
  4231. ;       HL CONTAINS POINTER
  4232. ;ON EXIT:
  4233. ;       HL POINTS AT FIRST NON-SPACE CHAR
  4234. ;*********************************************************************
  4235. SCNSP:    LD    A,(HL)            ; GET A CHAR
  4236.     CP    SPACE            ; IS IT A SPACE?
  4237.     RET    NZ            ; IF NOT RETURN
  4238.     INC    HL            ; INCREMENT POINTER
  4239.     JR    SCNSP
  4240. ;*********************************************************************
  4241. ;CHECK IF ASCII CHAR IN ACC
  4242. ;IS A LETTER. SET CARRY FLAG IF SO.
  4243. ;*********************************************************************
  4244. ALPHA:    CP    'A'
  4245.     JR    C,ALPHA1
  4246.     CP    'Z'+1
  4247.     RET
  4248. ALPHA1:    OR    A            ; NOT LETTER, CLEAR CARRY
  4249.     RET
  4250. ;*********************************************************************
  4251. ;CHECK IF DIGIT (0-9) IN ACC.
  4252. ;IF SO, RETURN WITH CARRY SET.
  4253. ;*********************************************************************
  4254. DIGIT:    CP    '0'
  4255.     JR    C,DIGIT1
  4256.     CP    '9'+1
  4257.     RET
  4258. DIGIT1:    OR    A            ; NOT DIGIT, CLEAR CARRY
  4259.     RET
  4260. ;********************************************************************
  4261. ;ERROR ROUTINE. SET ERROR CHAR IF NOT
  4262. ;ALREADY SET.
  4263. ;ON ENTRY:
  4264. ;       C CONTAINS ASCII ERROR CHAR
  4265. ;ON EXIT:
  4266. ;       ERRBUF CONTAINS ERROR CHAR
  4267. ;*******************************************************************
  4268. ERROR:    LD    A,(ERRBUF)        ; GET CONTENT OF ERROR DISPLAY REG.
  4269.     CP    SPACE            ; IS IT A SPACE?
  4270.     RET    NZ
  4271.     LD    A,C            ; YES, REPLACE WITH ERROR INDICATOR
  4272.     LD    (ERRBUF),A
  4273.     RET
  4274. ;*******************************************************************
  4275. ;OPERATOR LIST
  4276. ;EACH SECTION OF LIST CONTAINS OPERATOR
  4277. ;STRING FOLLOWED BY OPERATOR GROUP TOKEN
  4278. ;(1-1D) FOLLOWED BY OPERATOR VALUE.
  4279. ;*******************************************************************
  4280. ORLSTP:    DEFW    OR1            ; POINTER LIST TO THE SECTIONS
  4281.     DEFW    OR2            ; OF THE OPERATOR LIST WITH
  4282.     DEFW    OR3            ; DIFFERENT NOS. OF CHARS
  4283.     DEFW    OR4
  4284.     DEFW    OR5
  4285. OR1:    DEFB     0            ; OPERATOR LIST ITSELF
  4286. OR2:    DEFM    'LD'
  4287.     DEFB    1DH
  4288.     DEFB    00H
  4289.     DEFM    'JP'
  4290.     DEFB    91H
  4291.     DEFB    00H
  4292.     DEFM    'CP'
  4293.     DEFB    0CH
  4294.     DEFB    38H
  4295.     DEFM    'IN'
  4296.     DEFB    17H
  4297.     DEFB    00H
  4298.     DEFM    'OR'
  4299.     DEFB    0CH
  4300.     DEFB    30H
  4301.     DEFM    'DI'
  4302.     DEFB    0AH
  4303.     DEFB    0F3H
  4304.     DEFM    'EI'
  4305.     DEFB    0AH
  4306.     DEFB    0FBH
  4307.     DEFM    'IM'
  4308.     DEFB    0EH
  4309.     DEFB    00H
  4310.     DEFM    'RL'
  4311.     DEFB    0FH
  4312.     DEFB    10H
  4313.     DEFM    'RR'
  4314.     DEFB    0FH
  4315.     DEFB    18H
  4316.     DEFM    'JR'
  4317.     DEFB    92H
  4318.     DEFB    00H
  4319.     DEFM    'EX'
  4320.     DEFB    1AH
  4321.     DEFB    00H
  4322.     DEFB    00H
  4323. OR3:    DEFM    'INC'
  4324.     DEFB    0DH
  4325.     DEFB    00H
  4326.     DEFM    'DEC'
  4327.     DEFB    0DH
  4328.     DEFB    09H
  4329.     DEFM    'OUT'
  4330.     DEFB    18H
  4331.     DEFB    00H
  4332.     DEFM    'AND'
  4333.     DEFB    0CH
  4334.     DEFB    20H
  4335.     DEFM    'ORG'
  4336.     DEFB    01H
  4337.     DEFB    00H
  4338.     DEFM    'EQU'
  4339.     DEFB    02H
  4340.     DEFB    00H
  4341.     DEFM    'END'
  4342.     DEFB    04H
  4343.     DEFB    00H
  4344.     DEFM    'EXX'
  4345.     DEFB    0AH
  4346.     DEFB    0D9H
  4347.     DEFM    'DAA'
  4348.     DEFB    0AH
  4349.     DEFB    27H
  4350.     DEFM    'CPL'
  4351.     DEFB    0AH
  4352.     DEFB    2FH
  4353.     DEFM    'CCF'
  4354.     DEFB    0AH
  4355.     DEFB    3FH
  4356.     DEFM    'SCF'
  4357.     DEFB    0AH
  4358.     DEFB    37H
  4359.     DEFM    'NOP'
  4360.     DEFB    0AH
  4361.     DEFB    00H
  4362.     DEFM    'RLA'
  4363.     DEFB    0AH
  4364.     DEFB    17H
  4365.     DEFM    'RRA'
  4366.     DEFB    0AH
  4367.     DEFB    1FH
  4368.     DEFM    'LDI'
  4369.     DEFB    0BH
  4370.     DEFB    0A0H
  4371.     DEFM    'LDD'
  4372.     DEFB    0BH
  4373.     DEFB    0A8H
  4374.     DEFM    'CPI'
  4375.     DEFB    0BH
  4376.     DEFB    0A1H
  4377.     DEFM    'CPD'
  4378.     DEFB    0BH
  4379.     DEFB    0A9H
  4380.     DEFM    'NEG'
  4381.     DEFB    0BH
  4382.     DEFB    44H
  4383.     DEFM    'RLD'
  4384.     DEFB    0BH
  4385.     DEFB    6FH
  4386.     DEFM    'RRD'
  4387.     DEFB    0BH
  4388.     DEFB    67H
  4389.     DEFM    'INI'
  4390.     DEFB    0BH
  4391.     DEFB    0A2H
  4392.     DEFM    'IND'
  4393.     DEFB    0BH
  4394.     DEFB    0AAH
  4395.     DEFM    'XOR'
  4396.     DEFB    0CH
  4397.     DEFB    28H
  4398.     DEFM    'RLC'
  4399.     DEFB    0FH
  4400.     DEFB    00H
  4401.     DEFM    'SLA'
  4402.     DEFB    0FH              
  4403.     DEFB    20H
  4404.     DEFM    'RRC'
  4405.     DEFB     0FH
  4406.     DEFB    08H
  4407.     DEFM    'SRA'
  4408.     DEFB    0FH
  4409.     DEFB    28H
  4410.     DEFM    'SRL'
  4411.     DEFB    0FH
  4412.     DEFB    38H
  4413.     DEFM    'BIT'
  4414.     DEFB    10H
  4415.     DEFB    40H
  4416.     DEFM    'SET'
  4417.     DEFB    10H
  4418.     DEFB    0C0H
  4419.     DEFM    'RES'
  4420.     DEFB    10H
  4421.     DEFB    80H
  4422.     DEFM    'RET'
  4423.     DEFB    95H
  4424.     DEFB    00H
  4425.     DEFM    'RST'
  4426.     DEFB    16H
  4427.     DEFB    00H
  4428.     DEFM    'POP'
  4429.     DEFB    19H
  4430.     DEFB    0C1H
  4431.     DEFM    'ADC'
  4432.     DEFB    1BH
  4433.     DEFB    08H
  4434.     DEFM    'SBC'
  4435.     DEFB    1BH
  4436.     DEFB    10H
  4437.     DEFM    'ADD'
  4438.     DEFB    1CH
  4439.     DEFB    00H
  4440.     DEFM    'SUB'
  4441.     DEFB    0CH
  4442.     DEFB    10H
  4443.     DEFB    00H
  4444. OR4:    DEFM    'CALL'
  4445.     DEFB    94H
  4446.     DEFB    00H
  4447.     DEFM    'DEFL'
  4448.     DEFB    03H
  4449.     DEFB    00H
  4450.     DEFM    'DEFB'
  4451.     DEFB    05H
  4452.     DEFB    00H
  4453.     DEFM    'DEFW'
  4454.     DEFB    06H
  4455.     DEFB    00H
  4456.     DEFM    'DEFS'
  4457.     DEFB    07H
  4458.     DEFB    00H
  4459.     DEFM    'DEFM'
  4460.     DEFB    08H
  4461.     DEFB    00H
  4462.     DEFM    'HALT'
  4463.     DEFB    0AH
  4464.     DEFB    76H
  4465.     DEFM    'RLCA'
  4466.     DEFB    0AH
  4467.     DEFB    07H
  4468.     DEFM    'RRCA'
  4469.     DEFB    0AH
  4470.     DEFB    0FH
  4471.     DEFM    'LDIR'
  4472.     DEFB    0BH              
  4473.     DEFB    0B0H
  4474.     DEFM    'LDDR'
  4475.     DEFB    0BH
  4476.     DEFB    0B8H
  4477.     DEFM    'CPIR'
  4478.     DEFB    0BH
  4479.     DEFB    0B1H
  4480.     DEFM    'CPDR'
  4481.     DEFB    0BH
  4482.     DEFB    0B9H
  4483.     DEFM    'RETI'
  4484.     DEFB    0BH
  4485.     DEFB    4DH
  4486.     DEFM    'RETN'
  4487.     DEFB    0BH
  4488.     DEFB    45H
  4489.     DEFM    'INIR'
  4490.     DEFB    0BH
  4491.     DEFB    0B2H
  4492.     DEFM    'INDR'
  4493.     DEFB    0BH
  4494.     DEFB    0BAH
  4495.     DEFM    'OUTI'
  4496.     DEFB    0BH
  4497.     DEFB    0A3H
  4498.     DEFM    'OTIR'
  4499.     DEFB    0BH
  4500.     DEFB    0B3H
  4501.     DEFM    'OUTD'
  4502.     DEFB    0BH
  4503.     DEFB    0ABH
  4504.     DEFM    'OTDR'
  4505.     DEFB    0BH
  4506.     DEFB    8BH
  4507.     DEFM    'DJNZ'
  4508.     DEFB    13H
  4509.     DEFB    00H
  4510.     DEFM    'PUSH'
  4511.     DEFB    19H
  4512.     DEFB    0C5H
  4513.     DEFB    00H
  4514. OR5:    DEFM    'TITLE'
  4515.     DEFB    09H
  4516.     DEFB    00H
  4517.     DEFB    00H
  4518. ;**********************************************************************
  4519. ;OPERAND KEYWORD LIST
  4520. ;CONTAINS OPERAND KEYWORDS FOLLOWED BY
  4521. ;TOKENS FOR THEM.
  4522. ;**********************************************************************
  4523. OPKLST:    DEFW    OPKW1            ; POINTER LIST TO DIFFERENT
  4524.     DEFW    OPKW2            ; SECTIONS OF OPERAND
  4525.     DEFW    OPKW3            ; KEYWORD LIST.
  4526. OPKW1:    DEFB    'A'
  4527.     DEFB    77H
  4528.     DEFB    'B'
  4529.     DEFB    70H
  4530.     DEFB    'C'
  4531.     DEFB    71H
  4532.     DEFB    'D'
  4533.     DEFB    72H
  4534.     DEFB    'E'
  4535.     DEFB    73H
  4536.     DEFB    'H'
  4537.     DEFB    74H
  4538.     DEFB    'L'
  4539.     DEFB    75H
  4540.     DEFB    'Z'
  4541.     DEFB    89H
  4542.     DEFB    'P'
  4543.     DEFB    8EH
  4544.     DEFB    'M'
  4545.     DEFB    8FH
  4546.     DEFB    'I'
  4547.     DEFB    20H
  4548.     DEFB    'R'
  4549.     DEFB    21H
  4550.     DEFB    00H
  4551. OPKW2:    DEFM    'AF'
  4552.     DEFB    17H
  4553.     DEFM    'BC'
  4554.     DEFB    10H
  4555.     DEFM    'DE'
  4556.     DEFB    11H
  4557.     DEFM    'HL'
  4558.     DEFB    12H
  4559.     DEFM    'SP'
  4560.     DEFB    13H
  4561.     DEFM    'IX'
  4562.     DEFB    1AH
  4563.     DEFM    'IY'
  4564.     DEFB    1EH
  4565.     DEFM    'NC'
  4566.     DEFB    8AH
  4567.     DEFM    'NZ'
  4568.     DEFB    88H
  4569.     DEFM    'PE'
  4570.     DEFB    8DH
  4571.     DEFM    'PO'
  4572.     DEFB    8CH
  4573.     DEFB    00H
  4574. OPKW3:    DEFM    'AF'''
  4575.     DEFB    0E0H
  4576.     DEFB    00H
  4577. ;*********************************************************************
  4578. ;BRACKETABLE OPERAND LIST.
  4579. ;*********************************************************************
  4580. BKLST:    DEFB    12H            ; HL
  4581.     DEFB    40H            ; (HL)
  4582.     DEFB    1AH            ; IX
  4583.     DEFB    48H            ; (IX)
  4584.     DEFB    1EH            ; IY
  4585.     DEFB    4CH            ; (IY)
  4586.     DEFB    13H            ; SP
  4587.     DEFB    50H            ; (SP)
  4588.     DEFB    11H            ; DE
  4589.     DEFB    61H            ; (DE)
  4590.     DEFB    10H            ; BC
  4591.     DEFB    60H            ; (BC)
  4592.     DEFB    71H            ; C
  4593.     DEFB    0A0H            ; (C)
  4594.     DEFB    0CAH            ; IX+D
  4595.     DEFB    0BAH            ; (IX+D)
  4596.     DEFB    0CEH            ; IY+D
  4597.     DEFB    0BEH            ; (IY+D)
  4598.     DEFB    90H            ; N
  4599.     DEFB    0D0H            ; (N)
  4600.     DEFB    00H            ; END OF LIST
  4601. ;*********************************************************************
  4602. ;MULTI-CHARACTER FUNCTION LIST.
  4603. ;*********************************************************************
  4604. MFLSTP:    DEFW    MCF1
  4605.         DEFW    MCF2
  4606.     DEFW    MCF3
  4607.     DEFW    MCF4
  4608. MCF1:    DEFB    0
  4609. MCF2:    DEFM    'OR'
  4610.     DEFB    7AH
  4611.     DEFM    'EQ'
  4612.     DEFB    89H
  4613.     DEFM    'GT'
  4614.     DEFB    91H
  4615.     DEFM    'LT'
  4616.     DEFB    99H
  4617.     DEFB    0
  4618. MCF3:    DEFM    'NOT'
  4619.     DEFB    17H
  4620.     DEFM    'LOW'
  4621.     DEFB    27H
  4622.     DEFM    'RES'
  4623.     DEFB    2EH
  4624.     DEFM    'MOD'
  4625.     DEFB    4DH
  4626.     DEFM    'SHR'
  4627.     DEFB    55H
  4628.     DEFM    'SHL'
  4629.     DEFB    5DH
  4630.     DEFM    'AND'
  4631.     DEFB    73H
  4632.     DEFM    'XOR'
  4633.     DEFB    82H
  4634.     DEFM    'UGT'
  4635.     DEFB    0A1H
  4636.     DEFM    'ULT'
  4637.     DEFB    0A9H
  4638.     DEFB    0
  4639. MCF4:    DEFM    'HIGH'
  4640.     DEFB    1FH
  4641.     DEFB    0
  4642. ;***********************************************************************
  4643. ;SINGLE CHAR FUNCTION LIST.
  4644. ;***********************************************************************
  4645. SFLSTP:    DEFW    SCF1            ; POINTER TO LIST
  4646. SCF1:    DEFM    '+'
  4647.     DEFB    7H
  4648.     DEFM    '-'
  4649.     DEFB    0FH
  4650.     DEFM    '\'
  4651.     DEFB    17H
  4652.     DEFM    '*'
  4653.     DEFB    3DH
  4654.     DEFM    '/'
  4655.     DEFB    45H
  4656.     DEFM    '&'
  4657.     DEFB    73H
  4658.     DEFM    '^'
  4659.     DEFB    7AH
  4660.     DEFM    '='
  4661.     DEFB    89H
  4662.     DEFM    '>'
  4663.     DEFB    91H
  4664.     DEFM    '<'
  4665.     DEFB    99H
  4666.     DEFB    0
  4667. ;
  4668. ;******************************************************************
  4669. ;    LINKAGES TO CP/M START HERE - J.P.J.  4/5/82
  4670. ;******************************************************************
  4671. ;
  4672. ;
  4673. SRCFCB:    DEFB    0        ;FCB STARTS WITH 0 FOR DEFAULT DRIVE
  4674. SRCFN:    DEFM    '        '    ;RESERVE 8 CHARS FOR FILE NAME
  4675.     DEFM    'Z80'        ;USE EXTENSION OF Z80
  4676.     DEFB    0        ;START WITH EXTENT 0
  4677.     DEFS    23        ;23 BYTES FOR CP/M
  4678. SRCPTR:    DEFS    2        ;FOR CHARACTER POINTER
  4679. SRCOPN:    DEFM    'C'        ;DECLARE CLOSED
  4680. ;
  4681. LSTFCB:    DEFB    0        ;LISTING FILE SETUP
  4682. LSTFN:    DEFM    '        '
  4683.     DEFM    'PRN'        ;PRINT FILE
  4684.     DEFB    0        ;EXTENT 0
  4685.     DEFS    23
  4686. LSTPTR:    DEFS    2
  4687. LSTOPN:    DEFM    'C'
  4688. ;
  4689. HEXFCB:    DEFB    0        ;SAME FOR HEX FILE
  4690. HEXFN:     DEFM    '        '
  4691.     DEFM    'HEX'
  4692.     DEFB    0
  4693.     DEFS    23
  4694. HEXPTR:    DEFS    2
  4695. HEXOPN:    DEFM    'C'
  4696. ;
  4697. MEMCK:     LD A, (7H)        ;GET HIGH ORDER BYTE OF BDOS ENTRY
  4698.     LD B,A            ;XFER TO B
  4699.     LD A, (6H)        ;LOW BYTE TO A
  4700.     RET
  4701. ;
  4702. CONOUT:    PUSH     BC        ;NO REGISTERS MAY BE DESTROYED
  4703.     PUSH    DE
  4704.     PUSH    HL
  4705. OUT4:    LD A,C
  4706.     CALL    PUTCON
  4707. ;
  4708. GENRET:    POP    HL        ;GENERAL RETURN FOR ALL SUBR'S
  4709.     POP     DE
  4710.     POP    BC
  4711.     RET
  4712. ;
  4713. ;
  4714. OPNOUT:    PUSH    DE        ;OPEN (DE) FCB FOR OUTPUT
  4715.     LD C, DELFIL        ;FIRST DELETE CURRENT
  4716.     CALL    CPM
  4717.     POP    DE
  4718.     LD C, MAKFIL        ;THEN RE-CREATE
  4719.     JP    CPM
  4720. ;
  4721. CONIN:    PUSH    BC        ;CONSOLE INP IS ONLY COMMON
  4722.     PUSH    DE        ; POINT FOR ALL PASSES SO DO
  4723.     PUSH    HL        ; SETUP HERE
  4724. ;
  4725.     LD A, (SRCOPN)        ;IS SRC OPEN?
  4726.     CP 'O'
  4727.     CALL NZ, CPYFCB        ;IF NOT, CREATE FCB'S
  4728.     LD HL, (NXTPAS)        ;POINT TO PASS SEQUENCE
  4729.     LD A, (HL)        ;GET NEXT PASS NUMBER
  4730.     INC HL            ;UPDATE POINTER
  4731.     LD (NXTPAS), HL        ;SAVE POINTER
  4732.     PUSH    AF
  4733. ;
  4734.     CP 'Q'            ;QUIT ?
  4735.     CALL Z,    FLUSH        ;YES, FLUSH BUFFERS
  4736.     POP    AF
  4737.     PUSH    AF
  4738. ;
  4739.     CP '1'            ;PASS 1?
  4740.     JR Z,    PAS1  
  4741.     CP '2'            ;PASS 2?
  4742.     JP Z,    PAS2  
  4743.     CP '3'            ;PASS 3?
  4744.     JP Z,    PAS3  
  4745.     CP '4'            ;PASS 4 USES CONSOLE OUTPUT 
  4746.     JR Z,    PAS1  
  4747. INPRET:    POP    AF        ;IF NONE OF ABOVE, EXIT
  4748.     JR    GENRET  
  4749. ;
  4750. NXTPAS:    DEFW    SEQNO        ;SEQUENCE # POINTER
  4751. SEQNO:    DEFM    '1423Q'        ;DEFAULT SEQUENCE
  4752. CPYFCB: LD HL, DFCB+9        ;POINT TO FILE EXTENSION
  4753.     LD DE, SEQNO+2        ;POINT TO PASS 2 FLAG
  4754.     LD A, (HL)        ;GET DRIVE/SKIP FLAG FOR LST
  4755.     CP    'N'
  4756.     JR Z,    CPYF1        ;IF N, SKIP THE SRC LIST
  4757.     CP     'B'        ;PUT ON DRIVE B?
  4758.     JR NZ,    DOIT        ;NO, PUT LISTING ON DRIVE A
  4759.     LD A,   2        ;B IS DRIVE 2
  4760.     LD (LSTFCB),A        ;SET DRIVE BYTE TO 'B'
  4761.     JR DOIT
  4762. CPYF1:    LD (DE), A        ;SKIP IT
  4763. DOIT:    INC HL            ;POINT TO HEX SWITCH
  4764.     INC DE            ;POINT TO PASS 3 FLAG
  4765.     LD A,(HL)        ;GET DRIVE/SKIP FOR HEX
  4766.     CP 'N'            ;SKIP?
  4767.     JR Z,    CPYF2        ;IF Z, SKIP
  4768.     CP 'B'            ;PUT ON DRIVE B?
  4769.     JR NZ,    COPYIT        ;IF NOT 'B' NO
  4770.     LD A,2            ;B IS DRIVE 2
  4771.     LD (HEXFCB),A
  4772.     JR    COPYIT
  4773. CPYF2:    LD (DE), A        ;DON'T DO IT
  4774. COPYIT:    LD BC, 8H        ;SETUP FOR LDIR
  4775. ;
  4776.     LD DE, SRCFN        ;DESTINATION
  4777.     PUSH    BC
  4778.     CALL    MOVFCB
  4779. ;
  4780.     LD DE, LSTFN
  4781.     POP    BC
  4782.     PUSH    BC
  4783.     CALL    MOVFCB
  4784. ;
  4785.     LD DE, HEXFN
  4786.     POP    BC
  4787. ;
  4788. MOVFCB:    LD HL, DFCB+1        ;FILE NAME STARTS IN POS 1
  4789.     LDIR
  4790.     RET
  4791. ;
  4792. PAS1:    XOR A            ;MAKE SURE OPEN FIRST 
  4793.     LD (SRCFCB+12), A     ; EXTENT
  4794.     LD DE,    SRCFCB
  4795.     LD C, OPNFIL
  4796.     CALL     CPM
  4797.     CP 0FFH            ;SUCESSFUL?
  4798.     JR Z,    NOSRC          ; NO, LET US KNOW
  4799.     LD A, 'O'        ; DECLARE OPEN
  4800.     LD (SRCOPN), A
  4801.     XOR A            ;FIRST RECORD IS #0
  4802.     LD (SRCFCB+32), A
  4803.     LD HL, SRCBUF+1024
  4804.     LD (SRCPTR), HL
  4805.     JR    INPRET  
  4806. ;
  4807. NOSRC:    LD DE, NFMSG        ;NO FILE MESSAGE
  4808. ERROUT:    LD C, PRBUF        ;PRINT STRING FUNCTION
  4809.     CALL     CPM
  4810.     CALL    GETCON        ;WAIT FOR KEYSTROKE TO EXIT
  4811.     JP    BOOT
  4812. ;
  4813. NFMSG:    DEFB    CR
  4814.     DEFB    LF
  4815.     DEFM    'NO SOURCE FILE FOUND'
  4816.     DEFB    CR
  4817.     DEFB    LF
  4818.     DEFM    '$'
  4819. ;
  4820. PAS2:    LD A, (HEXOPN)        ;HEX FILE OPEN FROM PREV?
  4821.     CP 'O'
  4822.     CALL Z, FLUSH        ;YES, FLUSH AND CLOSE
  4823. ;
  4824.     LD DE, LSTFCB        ;OPEN LISTING FILE
  4825.     CALL    OPNOUT
  4826.     CP 0FFH            ;SUCESSFUL?
  4827.     JR Z,    DSKERR      ;NO, ERROR MSG
  4828.     LD A, 'O'
  4829.     LD (LSTOPN),A        ;DECLARE OPEN
  4830.     XOR A            ;START WITH RECORD 0
  4831.     LD (LSTFCB+32), A
  4832.     LD HL, LSTBUF        ;DECLARE EMPTY
  4833.     LD (LSTPTR), HL
  4834.     JR    PAS1          ;GO OPEN SRC
  4835. ;
  4836. DSKERR:    LD DE, ERRMSG
  4837.     JR    ERROUT      ;GOTO ERROR OUTPUT RTN
  4838. ;
  4839. ERRMSG:    DEFB    CR
  4840.     DEFB    LF
  4841.     DEFM    'DISK ERROR, ASSEMBLY ABORTED'
  4842.     DEFB    CR
  4843.     DEFB    LF
  4844.     DEFM    '$'
  4845. ;
  4846. PAS3:    LD A, (LSTOPN)        ;LIST STILL OPEN?
  4847.     CP 'O'
  4848.     CALL Z,    FLUSH        ;YES, FLUSH AND CLOSE
  4849.     LD DE, HEXFCB
  4850.     CALL    OPNOUT        ;OPEN HEX FILE FOR OUTPUT
  4851.     CP 0FFH            ;SUCESS?
  4852.     JR Z,    DSKERR      ;NO, ABORT
  4853. ;
  4854.     LD A, 'O'
  4855.     LD (HEXOPN),A        ;DECLARE OPEN
  4856.     XOR A
  4857.     LD (HEXFCB+32), A
  4858.     LD HL, HEXBUF         ;DECLARE EMPTY
  4859.     LD (HEXPTR), HL
  4860.     JP    PAS1          ;GO OPEN SRC
  4861. ;
  4862. FLUSH:    LD A, (HEXOPN)        ;HEX FILE OPEN?
  4863.     CP 'O'            ; IF O, YES
  4864.     JR Z,    HEXFL  
  4865. ;
  4866.     LD A, (LSTOPN)        ;LIST FILE OPEN?
  4867.     CP 'O'            ; IF O, YES
  4868.     RET NZ            ; NO OPEN OUTPUT FILES, EXIT
  4869. ;
  4870.     LD DE, LSTBUF        ;DE POINTS TO START
  4871.     LD HL, (LSTPTR)        ;HL POINTS TO CURRENT CHAR
  4872.     LD BC, LSTFCB        ;NEED FCB PTR FOR CP/M
  4873.     JR    MTBUF  
  4874. ;
  4875. HEXFL:    LD DE, HEXBUF        ;COMMENTS AS FOR LST FILE
  4876.     LD HL, (HEXPTR)
  4877.     LD BC, HEXFCB
  4878. ;
  4879. MTBUF:    LD A, L            ;FIND IF ON RECORD BOUNDARY
  4880.     AND 127
  4881.     JR Z,    MTBUF2      ;IF Z, YES
  4882.     LD (HL), CTLZ        ;PUT ^Z AS EOF MARK
  4883. ;
  4884. MTBUF2:    PUSH    BC        ;SAVE FCB PTR
  4885.     OR A            ;CLEAR CARRY
  4886.     SBC HL, DE        ;CALC # BYTES IN BUFFER
  4887.     JR NZ,    AREREC      ;IF NZ, ARE RECORDS TO WRITE
  4888.     POP BC            ;ELSE EXIT
  4889.     RET
  4890. ;
  4891. AREREC:    LD B, 7            ;B = SHIFT COUNTER
  4892. DIV128:    SRL H            ; BYTES/128 = # RECORDS
  4893.     RR  L
  4894.     DJNZ    DIV128      ;LOOP TIL DONE
  4895. ;
  4896.     LD B, L            ;B = # RECORDS
  4897.     OR A            ;FIND IF EVEN RECORD AGAIN
  4898.     JR Z,    EVNREC  
  4899. ;
  4900.     INC B            ;DON'T WANT TO LOSE PARTIAL
  4901. EVNREC:    EX DE, HL        ;HL = BUFFER POINTER
  4902.     POP    DE        ;DE = FCB POINTER
  4903. ;
  4904.     CALL    FLBUF        ;WRITE BUFFER TO DISK
  4905.     LD C, CLSFIL        ;CLOSE FUNCTION
  4906.     PUSH    DE
  4907.     CALL    CPM
  4908.     POP    DE
  4909.     LD HL, 38        ;(DE+38) = FILE OPEN FLAG
  4910.     ADD HL, DE
  4911.     LD (HL), 'C'        ;DECLARE CLOSED
  4912.     RET
  4913. ;
  4914. FLBUF:    PUSH    BC        ;B=#RECS, C=CHAR
  4915.     PUSH    HL        ;HL=BUFFER POINTER
  4916.     PUSH    DE        ;DE=FCB PTR
  4917. ;
  4918.     EX DE, HL        ;DE NOW = BUFFER PTR
  4919.     LD C, SETDMA
  4920.     CALL    CPM        ;DMA NOW = BUFFER
  4921. ;
  4922.     POP    DE        ;GET FCB PTR BACK
  4923.     PUSH    DE
  4924.     LD C, WRNR        ;WRITE NEXT REC FUNCTION
  4925.     CALL    CPM
  4926. ;
  4927.     OR A            ;SET FLAGS
  4928.     JP NZ,    DSKERR
  4929. ;
  4930.     POP    DE
  4931.     POP    HL
  4932.     POP    BC
  4933. ;
  4934.     DEC B
  4935.     RET Z            ;IF Z, ALL RECORDS WRITTEN
  4936. ;
  4937.     LD A, L
  4938.     ADD A, 128        ;UPDATE DATA POINTER
  4939.     LD L, A
  4940.     JR NC,    FLBUF  
  4941.     INC H
  4942.     JR    FLBUF  
  4943. ;
  4944. PCHOUT:    PUSH    BC
  4945.     PUSH    DE
  4946.     PUSH    HL
  4947.     LD HL, (HEXPTR)        ;BUFFER POINTER
  4948.     LD A,H            ;GET HIGH ORDER
  4949.     CP (HEXBUF+1025)/256       ;FULL?
  4950.     JR Z,    DMPHEX      ;IF Z, BUFFER FULL
  4951. ;
  4952. HEXCHR:    LD (HL),C
  4953.     INC HL            ;NOT FULL, JUST STORE CHAR
  4954.     LD (HEXPTR), HL
  4955.     JP    GENRET
  4956. ;
  4957. DMPHEX:    PUSH    BC        ;SAVE CHAR
  4958.     LD B, 8            ;8 RECORD BUFFER
  4959.     LD HL, HEXBUF        ;SETUP FOR FLBUF
  4960.     LD DE, HEXFCB
  4961.     CALL    FLBUF
  4962. ;
  4963.     POP    BC        ;GET CHAR BACK
  4964.     LD HL,    HEXBUF        ;START AT BEGINNING AGAIN
  4965.     JR    HEXCHR  
  4966. ;
  4967. LSTO:    PUSH    BC
  4968.     PUSH    DE
  4969.     PUSH    HL
  4970.     LD A,(PASSNO)        ;GET CURRENT PASS
  4971.     CP 4            ;IS IT PASS 4 ?
  4972.     JP Z,    OUT4        ;IF YES, OUTPUT TO CONSOLE
  4973.     LD HL, (LSTPTR)        ;NO, OUTPUT TO .PRN
  4974.     LD A, H
  4975.     CP (LSTBUF+1025)/256    ;FULL?
  4976.     JR Z,    DMPLST      ;YES, FLUSH
  4977. ;
  4978. LSTCHR:    LD (HL), C        ;STORE CHAR IN I/O BUFFER
  4979.     INC HL            ;UPDATE POINTER
  4980.     LD (LSTPTR), HL
  4981.     JP    GENRET
  4982. ;
  4983. DMPLST:    PUSH    BC
  4984.     LD B, 8            ;BUFFER = 8 RECORDS
  4985.     LD HL, LSTBUF        ;START AT BEGINNING
  4986.     LD DE, LSTFCB        ;FCB FOR CP/M
  4987.     CALL    FLBUF
  4988. ;
  4989.     POP    BC        ;GET THIS OUTPUT CHAR BACK
  4990.     LD HL, LSTBUF        ;RESTART AT BEGINNING
  4991.     JR    LSTCHR  
  4992. ;
  4993. RDRIN:    PUSH    BC
  4994.     PUSH    DE
  4995.     PUSH    HL
  4996.     LD HL, (SRCPTR)        ;GET SRC POINTER
  4997.     LD A, H
  4998.     CP (SRCBUF+1025)/256     ;PAST END? 
  4999.     JR Z,    SRCRD          ;YES, GO GET MORE
  5000. ;
  5001. NXTCHR:    LD A, (HL)        ;GET CHAR
  5002.     INC HL
  5003.     LD (SRCPTR), HL        ;SAVE POINTER
  5004.     JP    GENRET
  5005. ;
  5006. SRCRD:    LD BC, 0880H        ;B=#RECS, C=BYTES/REC
  5007.     LD DE, SRCBUF        ;DESTINATION
  5008. ;
  5009. NXTREC:    PUSH    DE
  5010.     PUSH    BC
  5011.     LD C, SETDMA
  5012.     CALL    CPM
  5013. ;
  5014.     LD DE, SRCFCB
  5015.     LD C, RDNR        ;READ NEXT RECORD
  5016.     CALL    CPM
  5017. ;
  5018.     POP    BC
  5019.     POP    DE
  5020.     CP 1            ;1 MEANS FILE DONE
  5021.     JR Z,    SRCDON  
  5022. ;
  5023.     LD A, E            ;UPDATE DESTINATION
  5024.     ADD A, C
  5025.     LD E, A
  5026.     JR NC,    DOK  
  5027.     INC D
  5028. DOK:    DEC B            ;DONE 8 RECORDS?
  5029.     JR NZ,    NXTREC      ;NO, CONTINUE
  5030. ;
  5031. SRCDON:    LD HL, SRCBUF        ;START AT BEGINNING
  5032.     JR    NXTCHR  
  5033. ;
  5034. ;
  5035. ;
  5036. ;**********************************************************************
  5037. ;RAM STORAGE AREA.
  5038. ;**********************************************************************
  5039. MEMTOP:    DEFS    2            ; HIGHEST AVAILABLE RAM LOC. ADDR
  5040. PASSNO:    DEFS    1            ; PASS NUMBER
  5041. LINPNT:    DEFS    2            ; POINTER TO LINE BUFFER
  5042. LINBUF:    DEFS    LBFSZ            ; LINE BUFFER
  5043. LABBUF:    DEFS    7            ; LABEL BUFFER
  5044. SYMBUF:    DEFS    10            ; SYMBOL BUFFER
  5045. PAGE:    DEFS    2            ; PAGE NO. (BCD)
  5046. LINE:    DEFS    1            ; LINE NUMBER
  5047. ERRBUF:    DEFS    1            ; ERROR INDICATOR BUFFER
  5048. ADREFC:    DEFS    2            ; ADDRESS REFERENCE COUNTER
  5049. ADDISR:    DEFS    2            ; ADDRESS DISPLAY REGISTER
  5050. ASCDNO:    DEFS    1            ; NO. OF BYTES OF ASSEMBLED CODE
  5051. ASSCOD:    DEFS    ACBSIZ            ; ASSEMBLED CODE BUFFER
  5052. TITBUF:    DEFS    TITSIZ+1        ; TITLE BUFFER
  5053. SYMEND:    DEFS    2            ; POINTER TO END OF SYMBOL TABLE
  5054. ORTKBF:    DEFS    2            ; OPERATOR TOKEN BUFFER
  5055. TEMP:    DEFS    2            ; DUMMY LOCATION
  5056. ODBT1:    DEFS    1            ; OPERAND-1 TOKEN BUFFER
  5057. ODBT2:    DEFS    1            ; OPERAND-2 TOKEN BUFFER
  5058. ODINT1:    DEFS    2            ; OPERAND-1 VALUE
  5059. ODINT2:    DEFS    2            ; OPERAND-2 VALUE
  5060. AFLAGS:    DEFS    1            ; ASSEMBLY FLAGS
  5061.                     ; BIT 0 - ADDR DISCONT. FLAG
  5062.                     ; BIT 1 - END FLAG
  5063.                     ; BIT 2 - SYMB TABLE O/F FLAG
  5064. OBJCNT:    DEFS    1            ; NO OF BYTES IN OBJ BUFF
  5065. RECADR:    DEFS    2            ; TARGET ADDR OF 1ST BYTE OF RECORD
  5066. STADDR:    DEFS    2            ; START ADDR BUFFER FOR 'END' OPD
  5067. OBJBUF:    DEFS    RECSIZ            ; OBJECT CODE BUFFER
  5068. FTOKR:    DEFS    1            ; FUNCTION TOKEN REGISTER
  5069. FCNT:    DEFS    1            ; FUNCTION STACK COUNTER
  5070. FSTK:    DEFS    MAXFSK            ; START OF FUNCTION STACK
  5071. ARCNT:    DEFS    1            ; ARITHMETIC STACK COUNTER
  5072. ARSTK:    DEFS    MAXASK            ; ARITHMETIC STACK
  5073.     DEFS    STKSIZ
  5074. STACK:    DEFS    0            ; STACK FROM HERE BACK ^
  5075. ;
  5076.     ORG    1F00H            ; MUST START ON PAGE BOUNDARY
  5077. ;
  5078. SRCBUF:    DEFS    1024
  5079. LSTBUF:    DEFS    1024
  5080. HEXBUF:    DEFS    1024
  5081. ;
  5082. SYMTAB:    DEFS    0            ; SYMBOL TABLE HERE TO MEMTOP
  5083.  
  5084.     END
  5085.  
  5086.