home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug034.arc / CROWECPM.Z80 < prev    next >
Text File  |  1979-12-31  |  146KB  |  5,115 lines

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