home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / ACE12-SRC-4.SFX / ashelp.s next >
Encoding:
Text File  |  1990-02-12  |  51.7 KB  |  3,127 lines

  1. ;** ASSEMBLER PROGRAM UTILITY FILE - BY ├RAIG ┬RUCE - 26-╙EP-1994
  2.  
  3. ;======== ASSEMBLE PROCESSOR INSTRUCTION ========
  4.  
  5. ; NUM BKT INS     NUM BKT INS     NUM BKT INS     NUM BKT INS     NUM BKT INS
  6. ; 00. XX. XXX     12. 63. BVC     24. 22. EOR     36. 20. PHA     48. 27. STA
  7. ; 01. 12. ADC     13. 15. BVS     25. 05. INC     37. 35. PHP     49. 50. STX
  8. ; 02. 63. AND     14. 38. CLC     26. 26. INX     38. 40. PLA     50. 51. STY
  9. ; 03. 00. ASL     15. 39. CLD     27. 27. INY     39. 55. PLP     51. 12. TAX
  10. ; 04. 00. BCC     16. 44. CLI     28. 06. JMP     40. 20. ROL     52. 13. TAY
  11. ; 05. 16. BCS     17. 57. CLV     29. 38. JSR     41. 26. ROR     53. 38. TSX
  12. ; 06. 24. BEQ     18. 24. CMP     30. 28. LDA     42. 10. RTI     54. 08. TXA
  13. ; 07. 47. BIT     19. 15. CPX     31. 51. LDX     43. 20. RTS     55. 26. TXS
  14. ; 08. 56. BMI     20. 16. CPY     32. 52. LDY     44. 03. SBC     56. 45. TYA
  15. ; 09. 25. BNE     21. 60. DEC     33. 24. LSR     45. 50. SEC
  16. ; 10. 42. BPL     22. 17. DEX     34. 52. NOP     46. 51. SED
  17. ; 11. 51. BRK     23. 18. DEY     35. 45. ORA     47. 56. SEI
  18.  
  19. INSTR╬AMES = *  ;NAMES OF INSTRUCTION, 3 CHARS EACH
  20.    .ASC "XXXADCANDASLBCCBCSBEQBITBMIBNEBPLBRKBVCBVSCLCCLDCLICLVCMPCPXCPY"
  21.    .ASC "DECDEXDEYEORINCINXINYJMPJSRLDALDXLDYLSRNOPORAPHAPHPPLAPLPROLROR"
  22.    .ASC "RTIRTSSBCSECSEDSEISTASTXSTYTAXTAYTSXTXATXSTYA"
  23.  
  24. INSTR╚ASH╨TRS = *  ;POINTERS TO INSTRUCTION NUMBERS OR >=100=INDIRECTS
  25.    ;BUCKETX0..X1..X2..X3..X4..X5..X6..X7..X8..X9
  26.    .BYTE 100,000,000,044,000,025,028,000,054,000  ;BUCKETS 00-09
  27.    .BYTE 042,000,103,052,000,106,109,022,023,000  ;BUCKETS 10-19
  28.    .BYTE 112,000,024,000,116,009,120,124,030,000  ;BUCKETS 20-29
  29.    .BYTE 000,000,000,000,000,037,000,000,127,015  ;BUCKETS 30-39
  30.    .BYTE 038,000,010,000,016,131,000,007,000,000  ;BUCKETS 40-49
  31.    .BYTE 134,137,142,000,000,039,145,017,000,000  ;BUCKETS 50-59
  32.    .BYTE 021,000,000,148                          ;BUCKETS 60-63
  33.  
  34. INSTR╚ASH╔NDIRECTS = *
  35.    .BYTE 004,003,000     ;OFF=100, BUCKET=00, INSTRS=BCC,ASL
  36.    .BYTE 001,051,000     ;OFF=103, BUCKET=12, INSTRS=ADC,TAX
  37.    .BYTE 019,013,000     ;OFF=106, BUCKET=15, INSTRS=CPX,BVS
  38.    .BYTE 005,020,000     ;OFF=109, BUCKET=16, INSTRS=BCS,CPY
  39.    .BYTE 043,036,040,000 ;OFF=112, BUCKET=20, INSTRS=RTS,PHA,ROL
  40.    .BYTE 006,018,033,000 ;OFF=116, BUCKET=24, INSTRS=BEQ,CMP,LSR
  41.    .BYTE 026,041,055,000 ;OFF=120, BUCKET=26, INSTRS=INX,ROR,TXS
  42.    .BYTE 048,027,000     ;OFF=124, BUCKET=27, INSTRS=STA,INY
  43.    .BYTE 029,014,053,000 ;OFF=127, BUCKET=38, INSTRS=JSR,CLC,TSX
  44.    .BYTE 035,056,000     ;OFF=131, BUCKET=45, INSTRS=ORA,TYA
  45.    .BYTE 049,045,000     ;OFF=134, BUCKET=50, INSTRS=STX,SEC
  46.    .BYTE 031,050,011,046,000;OFF=137,BUCK=51, INSTRS=LDX,STY,BRK,SED
  47.    .BYTE 032,034,000     ;OFF=142, BUCKET=52, INSTRS=LDY,NOP
  48.    .BYTE 008,047,000     ;OFF=145, BUCKET=56, INSTRS=BMI,SEI
  49.    .BYTE 002,012,000     ;OFF=148, BUCKET=63, INSTRS=AND,BVC
  50.  
  51. PARSE╔D├HECK╔NSTR = *  ;( .┴=INSTR╬UM╘O├HECK ) : .├╙=NOT╔NSTR, .┴+.╪:UNCH
  52.    STA WORK
  53.    ASL
  54.    ADC WORK
  55.    TAY
  56.    LDA STRING┬UF+0
  57.    CMP INSTR╬AMES+0,Y
  58.    BNE +
  59.    LDA STRING┬UF+1
  60.    CMP INSTR╬AMES+1,Y
  61.    BNE +
  62.    LDA STRING┬UF+2
  63.    CMP INSTR╬AMES+2,Y
  64.    BNE +
  65.    CLC
  66.    LDA WORK
  67.    RTS
  68. +  SEC
  69.    RTS
  70.  
  71. INSTR = *  ;( .┴=INSTR╬UM )
  72.    ;** GOT INSTRUCTION NUMBER
  73.    STA INSTR╬UM
  74.    BIT ORIGIN╙ET
  75.    BMI +
  76.    LDA #ERR╧RIGIN╬OT╙ET
  77.    JMP ERROR
  78. +  BIT DEBUG
  79.    BPL +
  80.    STA NUMBER+0
  81.    LDA #0
  82.    STA NUMBER+1
  83.    STA NUMBER+2
  84.    STA NUMBER+3
  85.    LDA #<INSTR═SG
  86.    LDY #>INSTR═SG
  87.    JSR PUTS
  88.    LDX #NUMBER
  89.    JSR PUTNUM
  90.    LDA #CHR├╥
  91.    JSR PUTCHAR
  92.  
  93.    ;** GET ADDRESSING MODE AND VALUE
  94. +  JSR INSTR╟ET┴DDR═ODE
  95.    BIT DEBUG
  96.    BPL +++
  97.    LDA INSTR┴DDR═ODE
  98.    STA NUMBER+0
  99.    LDA #0
  100.    STA NUMBER+1
  101.    STA NUMBER+2
  102.    STA NUMBER+3
  103.    LDA #<INSTR┴DDR═SG1
  104.    LDY #>INSTR┴DDR═SG1
  105.    JSR PUTS
  106.    LDX #NUMBER
  107.    JSR PUTNUM
  108.    LDA #<INSTR┴DDR═SG2
  109.    LDY #>INSTR┴DDR═SG2
  110.    JSR PUTS
  111.    LDA INSTR╓ALUE+0
  112.    LDY INSTR╓ALUE+1
  113.    STA NUMBER+0
  114.    STY NUMBER+1
  115.    LDA INSTR╓ALUE╘YPE
  116.    BMI +
  117.    LDX #NUMBER
  118.    JSR PUTNUM
  119.    JMP ++
  120. +  LDA #"?"
  121.    JSR PUTCHAR
  122. +  LDA #CHR├╥
  123.    JSR PUTCHAR
  124.  
  125.    ;** GET OPCODE FOR INSTR/ADDRMODE
  126. +  NOP
  127. -  LDA INSTR╬UM
  128.    LDX INSTR┴DDR═ODE
  129.    JSR INSTR╟ET╧PCODE
  130.    BCC +
  131.    LDX INSTR┴DDR═ODE
  132.    LDA INSTR┴DMODE╨ROMOTE,X
  133.    STA INSTR┴DDR═ODE
  134.    BNE -
  135.    LDA #ERR╫RONG┴DMODE
  136.    JMP ERROR
  137. +  BIT DEBUG
  138.    BPL ++
  139.    LDA #<INSTR├ODE═SG
  140.    LDY #>INSTR├ODE═SG
  141.    JSR PUTS
  142.    LDA ADDRESS+1
  143.    JSR PUTHEX
  144.    LDA ADDRESS+0
  145.    JSR PUTHEX
  146.    LDA #":"
  147.    JSR PUTCHAR
  148.    LDA #" "
  149.    JSR PUTCHAR
  150.    LDA INSTR╧PCODE
  151.    JSR PUTHEX
  152.    LDA INSTR╠EN
  153.    CMP #1
  154.    BEQ +
  155.    LDA #" "
  156.    JSR PUTCHAR
  157.    LDA INSTR╓ALUE+0
  158.    JSR PUTHEX
  159.    LDA INSTR╠EN
  160.    CMP #2
  161.    BEQ +
  162.    LDA #" "
  163.    JSR PUTCHAR
  164.    LDA INSTR╓ALUE+1
  165.    JSR PUTHEX
  166. +  LDA #CHR├╥
  167.    JSR PUTCHAR
  168.  
  169.    ;** STORE THE INSTRUCTION INTO MEMORY
  170. +  LDA INSTR╧PCODE
  171.    STA MEM╨UT╓ALS+0
  172.    LDA INSTR╓ALUE+0
  173.    LDY INSTR╓ALUE+1
  174.    STA MEM╨UT╓ALS+1
  175.    STY MEM╨UT╓ALS+2
  176.    LDX ADDRESS+0
  177.    LDY ADDRESS+1
  178.    LDA INSTR╠EN
  179.    JSR MEM╨UT
  180.  
  181.    ;** ADD RELOCATABLE REFERENCE
  182.    LDA INSTR╓ALUE╘YPE
  183.    BEQ ++
  184.    CMP #$04
  185.    BCS ++
  186.    LDX ADDRESS+0
  187.    LDY ADDRESS+1
  188.    INX
  189.    BNE +
  190.    INY
  191. +  JSR RECORD╥ELOC╥EF
  192.  
  193.    ;** INCREMENT ADDRESS AND FINISH
  194. +  CLC
  195.    LDA ADDRESS+0
  196.    ADC INSTR╠EN
  197.    STA ADDRESS+0
  198.    BCC +
  199.    INC ADDRESS+1
  200.    BNE +
  201.    LDA #ERR┴DDRESS╫RAP
  202.    JMP ERROR
  203. +  JMP PARSE┼ND
  204.  
  205. INSTR═SG = *
  206.    .ASC "GOT PROCESSOR INSTRUCTION="
  207.    .BYTE 0
  208. INSTR┴DDR═SG1 = *
  209.    .ASC "GOT ADDRESS MODE="
  210.    .BYTE 0
  211. INSTR┴DDR═SG2 = *
  212.    .ASC ", VALUE="
  213.    .BYTE 0
  214. INSTR├ODE═SG = *
  215.    .ASC "CODE = "
  216.    .BYTE 0
  217. INSTR┴DMODE╨ROMOTE = *
  218.    .BYTE $00,$00,$00,$00,$07,$08,$09,$00,$00,$00,$00,$00,$00
  219.  
  220. ; NUM  NAME       GEN  BYT  TOKENS
  221. ; ---  ---------  ---  ---  -------
  222. ; 00.  <NONE>     00.    0  <NONE>
  223. ; 01.  IMPLIED    00.    1  ├╥
  224. ; 02.  IMMEDIATE  00.    2  #     / EXP8  / ├╥
  225. ; 03.  RELATIVE   00.    2  EXP16 / ├╥
  226. ; 04.  ZEROPAGE   07.    2  EXP8  / ├╥
  227. ; 05.  ZP,X       08.    2  EXP8  / ,     / X   / ├╥
  228. ; 06.  ZP,Y       09.    2  EXP8  / ,     / Y   / ├╥
  229. ; 07.  ABSOLUTE   00.    3  EXP16 / ├╥
  230. ; 08.  ABS,X      00.    3  EXP16 / ,     / X   / ├╥
  231. ; 09.  ABS,Y      00.    3  EXP16 / ,     / Y   / ├╥
  232. ; 10.  INDIRECT   00.    3  (     / EXP16 / )   / ├╥
  233. ; 11.  (IND,X)    00.    2  (     / EXP8  / ,   / X   / )  / ├╥
  234. ; 12.  (IND),Y    00.    2  (     / EXP8  / )   / ,   / Y  / ├╥
  235. ;
  236. ; ┴LL ZP MODES CAN BE PROMOTED TO ABS EXCEPT FOR ZP,Y FOR STX AND ZP,X FOR STY.
  237. ; ╔NDY MODE CAUSES SOME SPECIAL PROBLEMS--╔'LL HAVE TO PATCH THE HOLE.
  238.  
  239. INSTR╟ET┴DDR═ODE = *  ;( ADDRESS, INSTR╬UM ) : INSTR┴DDR═ODE, INSTR╓ALUE,
  240.    LDA #$00             ;                        INSTR╓ALUE╘YPE
  241.    STA INSTR╓ALUE+0
  242.    STA INSTR╓ALUE+1
  243.    STA INSTR╓ALUE╘YPE
  244.    LDA TOKEN╬EXT├HAR
  245.    CMP #"#"
  246.    BEQ ADMODE╔MMEDIATE
  247.    CMP #"("
  248.    BEQ ADMODE╔NDIRECT
  249.    CMP #CHR├╥
  250.    BNE +
  251.    JSR GET╘OKEN  ;GET THE ├╥
  252.    LDA #01       ;IMPLIED
  253.    STA INSTR┴DDR═ODE
  254.    RTS
  255. +  LDA INSTR╬UM
  256.    CMP #14
  257.    BCS +
  258.    CMP #4
  259.    BCC +
  260.    CMP #7
  261.    BEQ +
  262.    CMP #11
  263.    BEQ +
  264.    JMP ADMODE╥ELATIVE
  265.    ;** ZP OR ABS, STRAIGHT OR INDEXED
  266. +  LDA #0
  267.    JSR ADMODE╚ANDLE┼XPR
  268.    LDY #04  ;ZEROPAGE MODE
  269.    CPX #1
  270.    BEQ +
  271.    LDY #07  ;ABSOLUTE MODE
  272. +  STY INSTR┴DDR═ODE
  273.    CMP #CHR├╥
  274.    BNE +
  275.    RTS
  276. +  CMP #","
  277.    BEQ +
  278. -  JMP SYNTAX┼RROR
  279. +  JSR ADMODE╟ET╪┘
  280.    INC INSTR┴DDR═ODE
  281.    CPX #0
  282.    BEQ +
  283.    INC INSTR┴DDR═ODE
  284. +  CMP #CHR├╥
  285.    BNE -
  286.    RTS
  287.  
  288. ADMODE╔MMEDIATE = *
  289.    JSR GET╘OKEN  ;GET THE "#"
  290.    LDA #1
  291.    JSR ADMODE╚ANDLE┼XPR
  292.    CMP #CHR├╥
  293.    BEQ +
  294.    JMP SYNTAX┼RROR
  295. +  LDA #02
  296.    STA INSTR┴DDR═ODE
  297.    RTS
  298.  
  299. ADMODE╥ELATIVE = *
  300.    LDA #2
  301.    JSR ADMODE╚ANDLE┼XPR
  302.    CMP #CHR├╥
  303.    BEQ +
  304.    JMP SYNTAX┼RROR
  305. +  LDA #03
  306.    STA INSTR┴DDR═ODE
  307.    RTS
  308.  
  309. ADMODE╔NDIRECT = *
  310.    JSR GET╘OKEN  ;GET THE "("
  311.    LDA #0
  312.    JSR PARSE┼XPRESSION
  313.    CMP #","
  314.    BEQ ADMODE╔ND╪
  315.    CMP #")"
  316.    BEQ +
  317. -  JMP SYNTAX┼RROR
  318. +  JSR GET╘OKEN
  319.    LDX TOKEN╘YPE
  320.    CPX #TOKEN╙PECIAL
  321.    BNE -
  322.    LDA TOKEN├HAR
  323.    CMP #","
  324.    BEQ ADMODE╔ND┘
  325.    CMP #CHR├╥
  326.    BNE -
  327.    LDA #0
  328.    STA ADMODE═UST┬E
  329.    JSR ADMODE╚ANDLE┼XPR╔N
  330.    LDA #10
  331.    STA INSTR┴DDR═ODE
  332.    RTS
  333.  
  334.    ADMODE╔ND╪ = *
  335.    LDA #1
  336.    STA ADMODE═UST┬E
  337.    JSR ADMODE╚ANDLE┼XPR╔N
  338.    JSR ADMODE╟ET╪┘
  339.    CPX #0
  340.    BEQ +
  341. -  JMP SYNTAX┼RROR
  342. +  CMP #")"
  343.    BNE -
  344.    JSR GET╘OKEN
  345.    CPX #TOKEN╙PECIAL
  346.    BNE -
  347.    CMP #CHR├╥
  348.    BNE -
  349.    LDA #11
  350.    STA INSTR┴DDR═ODE
  351.    RTS
  352.  
  353.    ADMODE╔ND┘ = *
  354.    LDA #1
  355.    STA ADMODE═UST┬E
  356.    JSR ADMODE╚ANDLE┼XPR╔N
  357.    JSR ADMODE╟ET╪┘
  358.    CPX #1
  359.    BEQ +
  360. -  JMP SYNTAX┼RROR
  361. +  CMP #CHR├╥
  362.    BNE -
  363.    LDA #12
  364.    STA INSTR┴DDR═ODE
  365.    RTS
  366.  
  367. ADMODE╟ET╪┘ = *  ;( .╪=TOKEN╘YPE, TOKEN ) : .┴=SPECIAL├HAR, .╪=0:X/1:Y
  368.    JSR GET╘OKEN
  369.    LDX TOKEN╘YPE
  370.    CPX #TOKEN╔DENTIFIER
  371.    BEQ +
  372. -  JMP SYNTAX┼RROR
  373. +  LDA STRING╠EN
  374.    CMP #1
  375.    BNE -
  376.    LDA STRING┬UF+0
  377.    LDY #0
  378.    CMP #"X"
  379.    BEQ +
  380.    INY
  381.    CMP #"Y"
  382.    BNE -
  383. +  TYA
  384.    PHA
  385.    JSR GET╘OKEN
  386.    LDX TOKEN╘YPE
  387.    CPX #TOKEN╙PECIAL
  388.    BNE -
  389.    PLA
  390.    TAX
  391.    LDA TOKEN├HAR
  392.    RTS
  393.  
  394. ADMODE═UST┬E .BUF 1
  395. ADMODE├HAR   .BUF 1
  396. ADMODE╚OLE   .BUF 1
  397.  
  398. ADMODE╚ANDLE┼XPR = *  ;( .┴=1:BYTE+2:REL, ADDRESS ) : .┴=NEXT├HAR, .╪=VAL┬YTES,
  399.    STA ADMODE═UST┬E   ;                               INSTR╓ALUE, INSTR╓ALUE╘YPE
  400.    LDA #0
  401.    JSR PARSE┼XPRESSION
  402.    STA ADMODE├HAR
  403.  
  404.    ADMODE╚ANDLE┼XPR╔N = *
  405.    JSR EVALUATE┼XPRESSION
  406.    LDA ID╓AL+0
  407.    LDY ID╓AL+1
  408.    STA INSTR╓ALUE+0
  409.    STY INSTR╓ALUE+1
  410.    LDA ID╘YPE
  411.    STA INSTR╓ALUE╘YPE
  412.    BCS ADMODE┼XPR╚OLE
  413.    LDA ID╓AL+2
  414.    ORA ID╓AL+3
  415.    BEQ +
  416. -  LDA #ERR╓ALUE╘OO╠ARGE
  417.    JMP ERROR
  418. +  LDA ADMODE═UST┬E
  419.    BNE ++
  420.    LDX #2
  421.    LDA INSTR╓ALUE+1
  422.    BNE +
  423. -  LDX #1
  424. +  LDA ADMODE├HAR
  425.    RTS
  426. +  CMP #1  ;MUST BE BYTE
  427.    BNE +
  428.    LDA INSTR╓ALUE+1
  429.    BNE --
  430.    BEQ -
  431. +  CLC     ;MUST BE RELATIVE
  432.    LDA ADDRESS+0
  433.    ADC #2
  434.    STA WORK+14
  435.    LDA ADDRESS+1
  436.    ADC #0
  437.    STA WORK+15
  438.    SEC
  439.    LDA INSTR╓ALUE+0
  440.    SBC WORK+14
  441.    STA INSTR╓ALUE+0
  442.    TAX
  443.    LDA INSTR╓ALUE+1
  444.    SBC WORK+15
  445.    STA INSTR╓ALUE+1
  446.    CMP #0
  447.    BNE +
  448.    CPX #128
  449.    BCC ++
  450. -  LDA #ERR┬RANCH╘OO╞AR
  451.    JMP ERROR
  452. +  CMP #$FF
  453.    BNE -
  454.    CPX #128
  455.    BCC -
  456. +  LDA #0
  457.    STA INSTR╓ALUE+1
  458.    LDX #1
  459.    LDA ADMODE├HAR
  460.    RTS
  461.  
  462.    ADMODE┼XPR╚OLE = *
  463.    ;** GET PRESUMED HOLE TYPE
  464.    LDA #$02    ;HOLE╘YPE=WORD
  465.    LDX ADMODE═UST┬E
  466.    BEQ +
  467.    LDA #$01    ;HOLE╘YPE=BYTE
  468.    CPX #1
  469.    BEQ +
  470.    LDA #$40      ;HOLE╘YPE=BRANCH
  471.    ;** CHECK FOR SPECIAL CASES OF "STX ZP,Y" AND "STY ZP,X" WHICH MUST BE ZP
  472. +  CMP #$02
  473.    BNE +
  474.    LDX INSTR╬UM
  475.    CPX #49       ;INSTR.49==STX
  476.    BCC +
  477.    CPX #50+1     ;INSTR.50==STY
  478.    BCS +
  479.    LDX ADMODE├HAR
  480.    CPX #","
  481.    BNE +
  482.    LDA #$01      ;IS ONE OF SPECIALS, SO HOLE MUST BE 8-BITS
  483.    ;** RECORD THE HOLE
  484. +  PHA
  485.    TAX
  486.    LDA #1
  487.    JSR ADD═EMORY╚OLE
  488.    ;** GET THE RETURN VALUES
  489.    PLA
  490.    CMP #$40
  491.    BNE +
  492.    LDA #1
  493. +  TAX
  494.    LDY #$80
  495.    STY INSTR╓ALUE╘YPE
  496.    LDY #$00
  497.    STY INSTR╓ALUE+0
  498.    STY INSTR╓ALUE+1
  499.    LDA ADMODE├HAR
  500.    RTS
  501.  
  502. ;TAKEN FROM ═IGHTY ═ON 4.0: INSTR# + ADDR═ODE -> OPCODE CONVERSION + LENGTH
  503.  
  504. OPCODE┬ASE      = WORK+14
  505. OPCODE┴DMODE╬UM = WORK+15
  506.  
  507. INSTR╟ET╧PCODE = *  ;( .┴=INSTR#, .╪=ADDR═ODE ) : INSTR╧PCODE, INSTR╠EN, .├╙=INV
  508.    TAY                          ;.$DA4B  [A8      ]  TAY
  509.    LDA OPCODE┬ASE╘AB,Y          ;.$DA4C  [B9 55 C2]  LDA $C255,Y
  510.    STA OPCODE┬ASE               ;.$DA4F  [85 48   ]  STA $48
  511.    STX OPCODE┴DMODE╬UM          ;.$DA51  [86 49   ]  STX $49
  512.    LDA OPCODE┴DMODE╘AB,Y        ;.$DA53  [B9 8D C2]  LDA $C28D,Y
  513.    BMI ++                       ;.$DA56  [30 0E   ]  BMI $DA66
  514.    CMP OPCODE┴DMODE╬UM          ;.$DA58  [C5 49   ]  CMP $49
  515.    BNE +                        ;.$DA5A  [D0 08   ]  BNE $DA64
  516.    LDA OPCODE╠EN╘AB,X           ;.$DA5C  [BD 6C C3]  LDA $C36C,X
  517.    TAX                          ;.$DA5F  [AA      ]  TAX
  518.    LDA OPCODE┬ASE               ;.$DA60  [A5 48   ]  LDA $48
  519.    STA INSTR╧PCODE              ;
  520.    STX INSTR╠EN                 ;
  521.    CLC                          ;.$DA62  [18      ]  CLC
  522.    RTS                          ;.$DA63  [60      ]  RTS
  523. +  NOP                          ;
  524. -  SEC                          ;.$DA64  [38      ]  SEC
  525.    RTS                          ;.$DA65  [60      ]  RTS
  526.                                 ;
  527. +  AND #$7F                     ;.$DA66  [29 7F   ]  AND #$7F
  528.    TAY                          ;.$DA68  [A8      ]  TAY
  529.    LDA OPCODE╧R╧FF╘AB,Y         ;.$DA69  [B9 60 C3]  LDA $C360,Y
  530.    CLC                          ;.$DA6C  [18      ]  CLC
  531.    ADC OPCODE┴DMODE╬UM          ;.$DA6D  [65 49   ]  ADC $49
  532.    TAY                          ;.$DA6F  [A8      ]  TAY
  533.    DEY                          ; <THE AD MODES START FROM 1 NOT 0 LIKE IN MM4>
  534.    LDA OPCODE╧R═ASK╘AB,Y        ;.$DA70  [B9 D2 C2]  LDA $C2D2,Y
  535.    BMI -                        ;.$DA73  [30 EF   ]  BMI $DA64
  536.    ORA OPCODE┬ASE               ;.$DA75  [05 48   ]  ORA $48
  537.    TAY                          ;.$DA77  [A8      ]  TAY
  538.    LDA OPCODE╠EN╘AB,X           ;.$DA78  [BD 6C C3]  LDA $C36C,X
  539.    TAX                          ;.$DA7B  [AA      ]  TAX
  540.    TYA                          ;.$DA7C  [98      ]  TYA
  541.    STA INSTR╧PCODE              ;
  542.    STX INSTR╠EN                 ;
  543.    CLC                          ;.$DA7D  [18      ]  CLC
  544.    RTS                          ;.$DA7E  [60      ]  RTS
  545.  
  546. OPCODE┬ASE╘AB = *
  547.    .BYTE $00,$61,$21,$02,$90,$B0,$F0,$24,$30,$D0,$10,$00,$50,$70,$18,$D8
  548.    .BYTE $58,$B8,$C1,$E0,$C0,$C6,$CA,$88,$41,$E6,$E8,$C8,$4C,$20,$A1,$A2
  549.    .BYTE $A0,$42,$EA,$01,$48,$08,$68,$28,$22,$62,$40,$60,$E1,$38,$F8,$78
  550.    .BYTE $81,$86,$84,$AA,$A8,$BA,$8A,$9A,$98
  551.  
  552. OPCODE┴DMODE╘AB = *
  553.    .BYTE $00,$81,$81,$82,$03,$03,$03,$83,$03,$03,$03,$01,$03,$03,$01,$01
  554.    .BYTE $01,$01,$81,$84,$84,$85,$01,$01,$81,$85,$01,$01,$86,$07,$81,$87
  555.    .BYTE $88,$82,$01,$81,$01,$01,$01,$01,$82,$82,$01,$01,$81,$01,$01,$01
  556.    .BYTE $89,$8A,$8B,$01,$01,$01,$01,$01,$01
  557.  
  558. OPCODE╠EN╘AB = *
  559.    .BYTE $00,$01,$02,$02,$02,$02,$02,$03,$03,$03,$03,$02,$02
  560.  
  561. OPCODE╧R╧FF╘AB = *
  562.    .BYTE 0,0,12,24,36,48,60,72,84,96,108,120
  563.  
  564. OPCODE╧R═ASK╘AB = *
  565.    ;      01  02  03  04  05  06  07  08  09  10  11  12 : ADDR═ODE
  566.    ;      --  --  --  --  --  --  --  --  --  --  --  --     <IF COMPRESSED>
  567.    .BYTE $80,$08,$80,$04,$14,$80,$0C,$1C,$18,$80,$00,$10  ;[TRIM:1+0=1] [ADD=2]
  568.    .BYTE $08,$80,$80,$04,$14,$80,$0C,$1C,$80,$80,$80,$80  ;[TRIM:0+4=4] [ADD=2]
  569.    .BYTE $80,$80,$80,$04,$80,$80,$0C,$80,$80,$80,$80,$80  ;[TRIM:3+5=8] [ADD=2]
  570.    .BYTE $80,$00,$80,$04,$80,$80,$0C,$80,$80,$80,$80,$80  ;[TRIM:1+5=6] [ADD=2]
  571.    .BYTE $80,$80,$80,$04,$14,$80,$0C,$1C,$80,$80,$80,$80  ;[TRIM:3+4=7] [ADD=2]
  572.    .BYTE $80,$80,$80,$80,$80,$80,$00,$80,$80,$20,$80,$80  ;[TRIM:6+2=8] [ADD=2]
  573.    .BYTE $80,$00,$80,$04,$80,$14,$0C,$80,$1C,$80,$80,$80  ;[TRIM:1+3=4] [ADD=2]
  574.    .BYTE $80,$00,$80,$04,$14,$80,$0C,$1C,$80,$80,$80,$80  ;[TRIM:1+4=5] [ADD=2]
  575.    .BYTE $80,$80,$80,$04,$14,$80,$0C,$1C,$18,$80,$00,$10  ;[TRIM:3+0=3] [ADD=2]
  576.    .BYTE $80,$80,$80,$04,$80,$14,$0C,$80,$80,$80,$80,$80  ;[TRIM:3+5=8] [ADD=2]
  577.    .BYTE $80,$80,$80,$04,$14,$80,$0C,$80,$80,$80,$80,$80  ;[TRIM:3+5=8] [ADD=2]
  578.  
  579. ;======== EXPRESSION HANDLING ========
  580.  
  581. PARSE┼XPR╘YPE .BUF 1
  582.  
  583. PARSE┼XPRESSION = *  ;( .┴=TYPE(0=NUM,1=EITHER) ) : .┴=NEXT╙PECIAL├HAR,.╪=TYPE
  584.    STA PARSE┼XPR╘YPE
  585.    LDX #16
  586.    STX EXP╧FFSET
  587.    LDA #"+"
  588.    STA EXP╧P+0,X
  589.    LDX #3
  590. -  LDA #0
  591.    STA EXP╚OLE╘YPE,X
  592.    LDA #ACE═EM╬ULL
  593.    STA EXP╚OLE┴DDR,X
  594.    LDA SOURCE╠INE,X
  595.    STA EXP╙RC╠INE,X
  596.    LDA FILE╨TR,X
  597.    STA EXP╙RC╞ILE,X
  598.    DEX
  599.    BPL -
  600.    LDA SOURCE├OL
  601.    STA EXP╙RC├OL
  602.    BIT DEBUG
  603.    BPL EXP╟ET╧PERAND
  604.    LDA #<PARSE┼XPR═SG
  605.    LDY #>PARSE┼XPR═SG
  606.    JSR PUTS
  607.  
  608.    ;** EXPECTING OPERAND
  609.    EXP╟ET╧PERAND = *
  610.    LDA #0
  611.    STA EXP╨LUS├OUNT
  612.    STA EXP═INUS├OUNT
  613.    STA EXP╠ESS├OUNT
  614.    STA EXP╟REATER├OUNT
  615.    EXP╟ET╧PERAND├ONT = *
  616.    LDX EXP╧FFSET
  617.    LDA #0
  618.    STA EXP╥ESERVED,X
  619.    JSR GET╘OKEN
  620.    CPX #TOKEN╙PECIAL
  621.    BNE EXP╬OT╙PECIAL
  622.    LDA TOKEN├HAR
  623.    CMP #"+"
  624.    BNE +
  625.    INC EXP╨LUS├OUNT
  626.    JMP EXP╟ET╧PERAND├ONT
  627. +  CMP #"-"
  628.    BNE +
  629.    INC EXP═INUS├OUNT
  630.    JMP EXP╟ET╧PERAND├ONT
  631. +  CMP #">"
  632.    BNE +
  633.    INC EXP╟REATER├OUNT
  634.    JMP EXP╟ET╧PERAND├ONT
  635. +  CMP #"<"
  636.    BNE +
  637.    INC EXP╠ESS├OUNT
  638.    JMP EXP╟ET╧PERAND├ONT
  639. +  CMP #"*"
  640.    BNE +
  641.    JMP EXP╧PN╙TAR
  642. +  JMP EXP╧PN╥ELATIVE
  643.  
  644.    EXP╬OT╙PECIAL = *
  645.    LDX EXP╧FFSET
  646.    LDA EXP═INUS├OUNT
  647.    AND #$01
  648.    LSR
  649.    ROR
  650.    STA EXP╙IGN,X
  651.    JSR EXP╞IGURE╚I╠O
  652.    STA EXP╚I╠O,X
  653.    LDA #$00
  654.    STA EXP╘YPE,X
  655.    LDX TOKEN╘YPE
  656.    CPX #TOKEN╔DENTIFIER
  657.    BNE +
  658.    LDA #0
  659.    JMP EXP╧PN╔DENTIFIER
  660. +  CPX #TOKEN╬UMBER
  661.    BNE +
  662.    JMP EXP╧PN╬UMBER
  663. +  CPX #TOKEN╙TRING
  664.    BNE +
  665.    JMP EXP╧PN╙TRING
  666. +  JMP SYNTAX┼RROR
  667.    PARSE┼XPR═SG = *
  668.    .ASC "...MUST PARSE AN EXPRESSION..."
  669.    .BYTE CHR├╥,0
  670.  
  671. ;"┴STEROIDS DO NOT CONCERN ME, ┴DMIRAL.  ╔ WANT THAT SHIP, NOT EXCUSES!"
  672. ;"═UDHOLE!?  ╙LIMY!!?  ═Y HOME, THIS IS!"
  673.  
  674. EXP╞IGURE╚I╠O╫ORK .BUF 1
  675.  
  676. EXP╞IGURE╚I╠O = * ; ( ) : .┴=╚I╠O_VALUE ;.╪:UNCHANGED
  677.    LDA EXP╟REATER├OUNT
  678.    CMP #16
  679.    BCC +
  680.    LDA #15
  681. +  ASL
  682.    ASL
  683.    ASL
  684.    ASL
  685.    STA EXP╞IGURE╚I╠O╫ORK
  686.    LDA EXP╠ESS├OUNT
  687.    CMP #2
  688.    BCC +
  689.    LDA #1
  690. +  ORA EXP╞IGURE╚I╠O╫ORK
  691.    RTS
  692.  
  693. EXP╧PN╥EL┼XIT .BUF 1  ;WHETHER TO EXIT EXP AFTER RELATIVE REF.
  694.  
  695. EXP╧PN╥ELATIVE = *
  696.    LDX #0
  697.    CMP #":"
  698.    BEQ +
  699.    LDX #$FF
  700. +  STX EXP╧PN╥EL┼XIT
  701.    LDA EXP╨LUS├OUNT  ;THERE MUST BE SOME PLUSES OR MINUSES
  702.    ORA EXP═INUS├OUNT
  703.    BNE +
  704.    JMP SYNTAX┼RROR
  705. +  JSR EXP╞IGURE╚I╠O
  706.    LDX EXP╧FFSET
  707.    STA EXP╚I╠O,X
  708.    LDA #0
  709.    STA EXP╙IGN,X
  710.    LDA #"+"
  711.    LDY EXP╨LUS├OUNT
  712.    BEQ +
  713.    LDX EXP═INUS├OUNT
  714.    BEQ ++
  715.    JMP SYNTAX┼RROR
  716. +  LDA #"-"
  717.    LDY EXP═INUS├OUNT
  718.    BNE +
  719.    JMP SYNTAX┼RROR
  720. +  DEY
  721.    JSR GEN╥EL╠ABEL
  722.    LDA EXP╧PN╥EL┼XIT
  723.    ;** FALL THROUGH
  724.  
  725. EXP╧PN╔DENTIFIER = *
  726.    PHA
  727.    JSR FIND╙YMBOL
  728.    LDX EXP╧FFSET
  729.    LDA ID╘YPE
  730.    CMP #$81
  731.    BCC +
  732.    CMP #$FF
  733.    BEQ +
  734.    LDA #ERR╬ON╬UM╔D┼XPR
  735.    JMP ERROR
  736. +  STA EXP╘YPE,X
  737.    LDY #0
  738.    CMP #$80
  739.    BCS +
  740. -  LDA ID╓AL,Y
  741.    STA EXP╓ALUE,X
  742.    INX
  743.    INY
  744.    CPY #4
  745.    BCC -
  746.    PLA
  747.    JMP EXP╟ET╧PERATOR
  748. +  INC EXP╒NRES├NT
  749. -  LDA ID╨TR,Y
  750.    STA EXP╓ALUE,X
  751.    INX
  752.    INY
  753.    CPY #4
  754.    BCC -
  755.    PLA
  756.    JMP EXP╟ET╧PERATOR
  757.  
  758. EXP╧PN╙TAR = *
  759.    BIT ORIGIN╙ET
  760.    BMI +
  761.    LDA #ERR╧RIGIN╬OT╙ET
  762.    JMP ERROR
  763. +  LDX EXP╧FFSET
  764.    LDA EXP═INUS├OUNT
  765.    AND #$01
  766.    LSR
  767.    ROR
  768.    STA EXP╙IGN,X
  769.    JSR EXP╞IGURE╚I╠O
  770.    STA EXP╚I╠O,X
  771.    LDA #$01
  772.    STA EXP╘YPE,X
  773.    LDA ADDRESS+0
  774.    STA EXP╓ALUE+0,X
  775.    LDA ADDRESS+1
  776.    STA EXP╓ALUE+1,X
  777.    LDA #0
  778.    STA EXP╓ALUE+2,X
  779.    STA EXP╓ALUE+3,X
  780.    LDA #0
  781.    JMP EXP╟ET╧PERATOR
  782.  
  783. EXP╧PN╬UMBER = *
  784.    LDX EXP╧FFSET
  785.    LDA #$00
  786.    STA EXP╘YPE,X
  787.    LDY #0
  788. -  LDA NUMBER,Y
  789.    STA EXP╓ALUE,X
  790.    INX
  791.    INY
  792.    CPY #4
  793.    BCC -
  794.    LDA #0
  795.    JMP EXP╟ET╧PERATOR
  796.  
  797. EXP╧PN╙TRING = *
  798.    LDA STRING╠EN
  799.    CMP #1
  800.    BNE +
  801.    ;** INTERPRET STRING AS NUMBER
  802.    LDX EXP╧FFSET
  803.    LDA #$00
  804.    STA EXP╘YPE,X
  805.    LDA STRING┬UF+0
  806.    STA EXP╓ALUE+0,X
  807.    LDA #0
  808.    STA EXP╓ALUE+1,X
  809.    STA EXP╓ALUE+2,X
  810.    STA EXP╓ALUE+3,X
  811.    LDA #0
  812.    JMP EXP╟ET╧PERATOR
  813.  
  814.    ;** INTERPRET STRING AS ACTUAL STRING
  815. +  LDA EXP╨LUS├OUNT
  816.    ORA EXP═INUS├OUNT
  817.    ORA EXP╠ESS├OUNT
  818.    ORA EXP╟REATER├OUNT
  819.    BEQ +
  820. -  LDA #ERR╔NVAL╙TR╧PERS
  821.    JMP ERROR
  822. +  LDA EXP╧FFSET
  823.    CMP #16
  824.    BNE -
  825.    LDA PARSE┼XPR╘YPE
  826.    BNE +
  827. -  JMP SYNTAX┼RROR
  828. +  JSR GET╘OKEN
  829.    CPX #TOKEN╙PECIAL
  830.    BNE -
  831. +  LDX #$80
  832.    RTS
  833.  
  834. EXP╟ET╧PERATOR = *  ;(.┴=EXIT╞LAG)
  835.    PHA
  836.    CLC
  837.    LDA EXP╧FFSET
  838.    ADC #14
  839.    STA EXP╧FFSET
  840.    BCC +
  841.    LDA #ERR╘OO═ANY╧PERANDS
  842.    JMP ERROR
  843. +  PLA
  844.    CMP #0
  845.    BEQ +
  846. -  LDX EXP╧FFSET
  847.    TXA
  848.    STA EXP╠ENGTH
  849.    LDA SOURCE├OL
  850.    STA EXP╙RC├OL
  851.    LDA TOKEN├HAR
  852.    LDX #0
  853.    RTS
  854. +  JSR GET╘OKEN
  855.    LDX TOKEN╘YPE
  856.    CPX #TOKEN╙PECIAL
  857.    BEQ +
  858.    JMP SYNTAX┼RROR
  859. +  LDA TOKEN├HAR
  860.    CMP #"+"
  861.    BEQ +
  862.    CMP #"-"
  863.    BNE -
  864. +  LDX EXP╧FFSET
  865.    STA EXP╧P,X
  866.    JMP EXP╟ET╧PERAND
  867.  
  868. EVALUATE┼XPRESSION = *  ;( EXP╘ABLE ) : .├╙=UNRESOLVED, ID╓AL, ID╘YPE
  869.    LDX #3
  870.    LDA #0
  871. -  STA ID╓AL,X
  872.    DEX
  873.    BPL -
  874.    STA ID╘YPE
  875.    LDA EXP╒NRES├NT
  876.    BEQ +
  877.    LDA #$80
  878.    STA ID╘YPE
  879.    SEC
  880.    RTS
  881.  + LDX #16
  882.    STX EXP╧FFSET
  883.  
  884.    EVAL╬EXT = *
  885.    LDX EXP╧FFSET
  886.    LDA EXP╘YPE,X
  887.    EOR ID╘YPE    ;(+-:VAL+VAL=VAL,ADR+VAL=ADR,VAL+ADR=ADR,ADR+ADR=VAL)
  888.    STA ID╘YPE
  889.    LDY #$00
  890. -  LDA EXP╓ALUE,X
  891.    STA NUMBER,Y
  892.    INX
  893.    INY
  894.    CPY #4
  895.    BCC -
  896.    LDX EXP╧FFSET
  897.    LDA EXP╙IGN,X
  898.    BPL +
  899.    JSR EVAL╬EGATE
  900. +  LDX EXP╧FFSET
  901.    CPX #16
  902.    BEQ +
  903.    LDA EXP╚I╠O,X
  904.    BEQ +
  905.    JSR EVAL╚I╠O
  906. +  LDX EXP╧FFSET
  907.    LDA EXP╧P,X
  908.    CMP #"+"
  909.    BEQ +
  910.    JSR EVAL╬EGATE
  911.    ;** PERFORM ADDITION
  912. +  CLC
  913.    LDY #4
  914.    LDX #0
  915. -  LDA ID╓AL,X
  916.    ADC NUMBER,X
  917.    STA ID╓AL,X
  918.    INX
  919.    DEY
  920.    BNE -
  921.    ;** GO ONTO NEXT OPERATION
  922.    CLC
  923.    LDA EXP╧FFSET
  924.    ADC #14
  925.    STA EXP╧FFSET
  926.    CMP EXP╠ENGTH
  927.    BCC EVAL╬EXT
  928.    ;** CHECK GLOBAL HI-LO
  929.    LDA EXP╚I╠O+16
  930.    BEQ +
  931.    LDX #3
  932. -  LDA ID╓AL,X
  933.    STA NUMBER,X
  934.    DEX
  935.    BPL -
  936.    LDA EXP╚I╠O+16
  937.    JSR EVAL╚I╠O
  938.    LDX #3
  939. -  LDA NUMBER,X
  940.    STA ID╓AL,X
  941.    DEX
  942.    BPL -
  943. +  CLC
  944.    BIT DEBUG
  945.    BMI +
  946.    RTS
  947. +  LDA #<EVAL═SG
  948.    LDY #>EVAL═SG
  949.    JSR PUTS
  950.    LDX #ID╓AL
  951.    JSR PUTNUM
  952.    LDA #","
  953.    JSR PUTCHAR
  954.    LDA #" "
  955.    JSR PUTCHAR
  956.    LDA #"V"
  957.    LDX ID╘YPE
  958.    BEQ +
  959.    LDA #"A"
  960. +  JSR PUTCHAR
  961.    LDA #CHR├╥
  962.    JSR PUTCHAR
  963.    CLC
  964.    RTS
  965.    EVAL═SG = *
  966.    .ASC "EVALUATE: RESULT="
  967.    .BYTE 0
  968.  
  969. EVAL╬EGATE = *  ;( NUMBER ) : -NUMBER
  970.    SEC
  971.    LDY #4
  972.    LDX #0
  973. -  LDA #0
  974.    SBC NUMBER,X
  975.    STA NUMBER,X
  976.    INX
  977.    DEY
  978.    BNE -
  979.    RTS
  980.  
  981. EVAL╚I╠O├NT .BUF 1
  982.  
  983. EVAL╚I╠O = *
  984.    ;VALUE $10 WILL EXTRACT HIGH BYTE OF ADDR, $01 WILL EXTRACT LOW BYTE
  985.    PHA
  986.    LSR
  987.    LSR
  988.    LSR
  989.    LSR
  990.    TAX
  991.    BEQ +
  992. -  LDA NUMBER+1
  993.    STA NUMBER+0
  994.    LDA NUMBER+2
  995.    STA NUMBER+1
  996.    LDA NUMBER+3
  997.    STA NUMBER+2
  998.    LDA #$00
  999.    STA NUMBER+3
  1000.    DEX
  1001.    BNE -
  1002. +  PLA
  1003.    AND #$0F
  1004.    BEQ +
  1005.    LDX #0
  1006.    STX NUMBER+3
  1007.    STX NUMBER+2
  1008.    STX NUMBER+1
  1009. +  RTS
  1010.  
  1011. ;======== SYMBOL TABLE MANAGEMENT ========
  1012.  
  1013. FIND╙YMBOL = *  ;( STRING┬UF, STRING╠EN ) : .┴=CODE,ID╨TR,ID╓AL
  1014.    ;** RET: CODE .┴=(SYM╞OUND,SYM╒NRESOLVED,SYM╬EW)
  1015.    JSR HASH
  1016.    LDY #3
  1017. -  LDA (HASH╨TR),Y
  1018.    STA MP,Y
  1019.    DEY
  1020.    BPL -
  1021.    FIND╙YM╬EXT = *
  1022.    LDA MP+3
  1023.    CMP #ACE═EM╬ULL
  1024.    BNE +
  1025.    JMP FIND╙YM├REATE
  1026. +  LDA #<SYM┬UF
  1027.    LDY #>SYM┬UF
  1028.    STA ZP+0
  1029.    STY ZP+1
  1030.    LDA #12+8+1
  1031.    LDY #0
  1032.    JSR FETCH
  1033.    LDA SYM╬AME╠EN
  1034.    CMP STRING╠EN
  1035.    BNE FIND╙YM├ONT
  1036.    CMP #8+1
  1037.    BCC +
  1038.    CLC
  1039.    ADC #12+1
  1040.    LDY #0
  1041.    JSR FETCH
  1042. +  LDX #0
  1043. -  LDA STRING┬UF,X
  1044.    BEQ +
  1045.    CMP SYM╬AME,X
  1046.    BNE FIND╙YM├ONT
  1047.    INX
  1048.    BNE -
  1049. +  LDX #3
  1050. -  LDA MP,X
  1051.    STA ID╨TR,X
  1052.    LDA SYM╓ALUE,X
  1053.    STA ID╓AL,X
  1054.    DEX
  1055.    BPL -
  1056.    LDA SYM╘YPE
  1057.    STA ID╘YPE
  1058.    LDA #SYM╞OUND
  1059.    BIT SYM╘YPE
  1060.    BPL +
  1061.    LDA #SYM╒NRESOLVED
  1062. +  RTS
  1063.  
  1064.    FIND╙YM├ONT = *
  1065.    LDX #3
  1066. -  LDA SYM╬EXT,X
  1067.    STA MP,X
  1068.    DEX
  1069.    BPL -
  1070.    JMP FIND╙YM╬EXT
  1071.  
  1072. FIND╙YM├REATE = *
  1073.    LDA #$80
  1074.    STA SYM╘YPE
  1075.    STA ID╘YPE
  1076.    LDA #$00
  1077.    STA SYM├LASS
  1078.    STA SYM╒NRES╧PND
  1079.    LDA STRING╠EN
  1080.    STA SYM╬AME╠EN
  1081.    LDX #0
  1082. -  LDA STRING┬UF,X
  1083.    STA SYM╬AME,X
  1084.    BEQ +
  1085.    INX
  1086.    BNE -
  1087. +  CLC
  1088.    LDA #12+1
  1089.    ADC SYM╬AME╠EN
  1090.    LDY #0
  1091.    JSR MALLOC
  1092.    BCC +
  1093.    LDA #ERR╔NSUFFICIENT═EMORY
  1094.    JMP ERROR
  1095. +  LDY #3
  1096. -  LDA #ACE═EM╬ULL
  1097.    STA SYM╓ALUE,Y
  1098.    LDA #0
  1099.    STA ID╓AL,Y
  1100.    LDA (HASH╨TR),Y
  1101.    STA SYM╬EXT,Y
  1102.    LDA MP,Y
  1103.    STA ID╨TR,Y
  1104.    STA (HASH╨TR),Y
  1105.    DEY
  1106.    BPL -
  1107.    JSR STASH╙YMBOL
  1108.    LDA #SYM╬EW
  1109.    RTS
  1110.  
  1111. FETCH╙YMBOL = *  ;( [MP] ) : SYM┬UF
  1112.    LDA #<SYM┬UF
  1113.    LDY #>SYM┬UF
  1114.    STA ZP+0
  1115.    STY ZP+1
  1116.    LDA #12+8+1
  1117.    LDY #0
  1118.    JSR FETCH
  1119.    LDA SYM╬AME╠EN
  1120.    CMP #8+1
  1121.    BCC +
  1122.    CLC
  1123.    ADC #12+1
  1124.    LDY #0
  1125.    JSR FETCH
  1126. +  RTS
  1127.  
  1128. FETCH╙YMBOL╚EADER = *  ;( [MP] ) : SYM┬UF (HEADER)
  1129.    LDA #<SYM┬UF
  1130.    LDY #>SYM┬UF
  1131.    STA ZP+0
  1132.    STY ZP+1
  1133.    LDA #12
  1134.    LDY #0
  1135.    JSR FETCH
  1136.    RTS
  1137.  
  1138. STASH╙YMBOL = *  ;( SYM┬UF, [MP] )
  1139.    LDA #<SYM┬UF
  1140.    LDY #>SYM┬UF
  1141.    STA ZP+0
  1142.    STY ZP+1
  1143.    CLC
  1144.    LDA #12+1
  1145.    ADC SYM╬AME╠EN
  1146.    LDY #0
  1147.    JSR STASH
  1148.    RTS
  1149.  
  1150. STASH╙YMBOL╚EADER = *  ;( SYM┬UF(HEADER), [MP] )
  1151.    LDA #<SYM┬UF
  1152.    LDY #>SYM┬UF
  1153.    STA ZP+0
  1154.    STY ZP+1
  1155.    LDA #12
  1156.    LDY #0
  1157.    JSR STASH
  1158.    RTS
  1159.  
  1160. INIT╙YMBOL╘ABLE = *
  1161.    LDA #<IDENT╚ASH╘ABLE
  1162.    LDY #>IDENT╚ASH╘ABLE
  1163.    LDX #HASH╘ABLE╨AGES
  1164.    ;** FALL THROUGH
  1165.  
  1166. FILL╬ULL = *
  1167.    STA WORK+0
  1168.    STY WORK+1
  1169.    LDY #0
  1170.    LDA #ACE═EM╬ULL
  1171. -  STA (WORK),Y
  1172.    INY
  1173.    BNE -
  1174.    INC WORK+1
  1175.    DEX
  1176.    BNE -
  1177.    RTS
  1178.  
  1179. FIND╒NRES╙YMBOL = *
  1180.    ;** FETCHES SYMBOL AND REFERENCE
  1181.    LDA #$80
  1182.    STA DUMP╙YM╧PT
  1183.    JMP DUMP╙YMBOL╘ABLE╔N
  1184.    FOUND╒NRES╙YMBOL = *
  1185.    LDX #3
  1186. -  LDA SYM╓ALUE,X
  1187.    STA EXP╨TR,X
  1188.    DEX
  1189.    BPL -
  1190.    JSR FETCH┼XP
  1191.    RTS
  1192.  
  1193. DUMP╙YM┼NTRIES .BUF 2
  1194. DUMP╙YM╧PT .BUF 1
  1195. DUMP├OUNT = ID╓AL
  1196.  
  1197. DUMP╙YMBOL╘ABLE = *
  1198.    LDA #$00
  1199.    STA DUMP╙YM╧PT
  1200.    LDX #3
  1201. -  STA DUMP├OUNT,X
  1202.    DEX
  1203.    BPL -
  1204.    BIT SYM─UMP
  1205.    BMI +
  1206.    RTS
  1207. +  LDA #<DUMP╙YM═SG1
  1208.    LDY #>DUMP╙YM═SG1
  1209.    JSR PUTS
  1210.   DUMP╙YMBOL╘ABLE╔N  = *
  1211.    LDA #<IDENT╚ASH╘ABLE
  1212.    LDY #>IDENT╚ASH╘ABLE
  1213.    STA HASH╨TR+0
  1214.    STY HASH╨TR+1
  1215.    LDA #0
  1216.    LDY #HASH╘ABLE┼NTRIES╚IGH
  1217.    STA DUMP╙YM┼NTRIES+0
  1218.    STY DUMP╙YM┼NTRIES+1
  1219. -  JSR DUMP╙YM┬UCKET
  1220.    CLC
  1221.    LDA HASH╨TR+0
  1222.    ADC #4
  1223.    STA HASH╨TR+0
  1224.    BCC +
  1225.    INC HASH╨TR+1
  1226. +  INC DUMP╙YM┼NTRIES+0
  1227.    BNE -
  1228.    DEC DUMP╙YM┼NTRIES+1
  1229.    BNE -
  1230.    LDA #<DUMP╙YM═SG2
  1231.    LDY #>DUMP╙YM═SG2
  1232.    JSR PUTS
  1233.    LDX #DUMP├OUNT
  1234.    JSR PUTNUM
  1235.    LDA #CHR├╥
  1236.    JSR PUTCHAR
  1237.    RTS
  1238.  
  1239.    DUMP╙YM┬UCKET = *
  1240.    LDY #3
  1241. -  LDA (HASH╨TR),Y
  1242.    STA MP,Y
  1243.    DEY
  1244.    BPL -
  1245. -  LDA MP+3
  1246.    CMP #ACE═EM╬ULL
  1247.    BNE +
  1248.    RTS
  1249. +  JSR FETCH╙YMBOL
  1250.    JSR DUMP╙YMBOL
  1251.    LDX #3
  1252. -  LDA SYM╬EXT,X
  1253.    STA MP,X
  1254.    DEX
  1255.    BPL -
  1256.    JMP --
  1257.  
  1258.    DUMP╙YMBOL = *
  1259.    BIT DUMP╙YM╧PT
  1260.    BPL ++
  1261.    LDA SYM╘YPE
  1262.    CMP #$80
  1263.    BEQ +
  1264.    CMP #$FF
  1265.    BNE ++
  1266. +  PLA ;** POP CALL FROM DUMP╙YM┬UCKET
  1267.    PLA
  1268.    PLA ;** POP CALL FROM DUMP╙YMBOL╘ABLE
  1269.    PLA
  1270.    JMP FOUND╒NRES╙YMBOL
  1271. +  LDX #DUMP├OUNT
  1272.    JSR INC╠ONG
  1273.    LDA #0
  1274.    STA NUMBER+2
  1275.    STA NUMBER+3
  1276.    SEC
  1277.    LDA HASH╨TR+0
  1278.    SBC #<IDENT╚ASH╘ABLE
  1279.    STA NUMBER+0
  1280.    LDA HASH╨TR+1
  1281.    SBC #>IDENT╚ASH╘ABLE
  1282.    STA NUMBER+1
  1283.    LSR NUMBER+1
  1284.    ROR NUMBER+0
  1285.    LSR NUMBER+1
  1286.    ROR NUMBER+0
  1287.    LDX #NUMBER
  1288.    LDY #4
  1289.    JSR WPUTNUM
  1290.    LDA #2
  1291.    JSR SPACE
  1292.    LDX #3
  1293. -  LDA SYM╓ALUE,X
  1294.    STA NUMBER,X
  1295.    DEX
  1296.    BPL -
  1297.    LDA NUMBER+3
  1298.    JSR PUTHEX
  1299.    LDA NUMBER+2
  1300.    JSR PUTHEX
  1301.    LDA NUMBER+1
  1302.    JSR PUTHEX
  1303.    LDA NUMBER+0
  1304.    JSR PUTHEX
  1305.    LDA #1
  1306.    JSR SPACE
  1307.    LDX #NUMBER
  1308.    LDY #10
  1309.    JSR WPUTNUM
  1310.    LDA #2
  1311.    JSR SPACE
  1312.    LDA #"V"
  1313.    LDX SYM╘YPE
  1314.    BEQ +
  1315.    LDA #"A"
  1316.    BIT SYM╘YPE
  1317.    BPL +
  1318.    LDA #"?"
  1319. +  JSR PUTCHAR
  1320.    LDA #2
  1321.    JSR SPACE
  1322.    LDA #<SYM╬AME
  1323.    LDY #>SYM╬AME
  1324.    JSR PUTS
  1325.    LDA #CHR├╥
  1326.    JSR PUTCHAR
  1327.    JSR CHECK╙TOP
  1328.    RTS
  1329.  
  1330.    SPACE├OUNT .BUF 1
  1331.  
  1332.    SPACE = *
  1333.    STA SPACE├OUNT
  1334. -  LDA #" "
  1335.    JSR PUTCHAR
  1336.    DEC SPACE├OUNT
  1337.    BNE -
  1338.    RTS
  1339.  
  1340.    DUMP╙YM═SG1 = *
  1341.    .ASC "╚┴╙╚  ╚┼╪╓┴╠╒┼    ─┼├╔═┴╠  ╘  ╬┴═┼"
  1342.    .BYTE CHR├╥
  1343.    .ASC "----  -------- ----------  -  -----"
  1344.    .BYTE CHR├╥,0
  1345.    DUMP╙YM═SG2 = *
  1346.    .ASC "--"
  1347.    .BYTE CHR├╥
  1348.    .ASC "╬UMBER OF SYMBOLS: "
  1349.    .BYTE 0
  1350. ;1234567890123456789012345678901234567890
  1351.  
  1352. HASH╫ORK .BUF 2
  1353.  
  1354. HASH = *
  1355.    LDA #$AA
  1356.    STA HASH╓AL+0
  1357.    STA HASH╓AL+1
  1358.    LDX #0
  1359. -  LDA STRING┬UF,X
  1360.    BNE +
  1361.    LDA HASH╓AL+0
  1362.    STA HASH╨TR+0
  1363.    LDA HASH╓AL+1
  1364.    AND #HASH╘ABLE═ASK
  1365.    ASL HASH╨TR+0
  1366.    ROL
  1367.    ASL HASH╨TR+0
  1368.    ROL
  1369.    STA HASH╨TR+1
  1370.    CLC
  1371.    LDA HASH╨TR+0
  1372.    ADC #<IDENT╚ASH╘ABLE
  1373.    STA HASH╨TR+0
  1374.    LDA HASH╨TR+1
  1375.    ADC #>IDENT╚ASH╘ABLE
  1376.    STA HASH╨TR+1
  1377.    RTS
  1378.    ;** HASH╓AL := HASH╓AL * 37;
  1379. +  LDA HASH╓AL+0
  1380.    LDY HASH╓AL+1
  1381.    STA HASH╫ORK+0
  1382.    STY HASH╫ORK+1
  1383.    ASL              ;TIMES 2
  1384.    ROL HASH╓AL+1
  1385.    ASL              ;TIMES 4
  1386.    ROL HASH╓AL+1
  1387.    ASL              ;TIMES 8
  1388.    ROL HASH╓AL+1
  1389.    JSR HASH┴DD╫ORK  ;TIMES 9
  1390.    ASL              ;TIMES 18
  1391.    ROL HASH╓AL+1
  1392.    ASL              ;TIMES 36
  1393.    ROL HASH╓AL+1
  1394.    JSR HASH┴DD╫ORK  ;TIMES 37
  1395.    ADC STRING┬UF,X
  1396.    STA HASH╓AL+0
  1397.    BCC +
  1398.    INC HASH╓AL+1
  1399. +  INX
  1400.    BNE -
  1401.  
  1402. HASH┴DD╫ORK = *
  1403.    CLC
  1404.    ADC HASH╫ORK+0
  1405.    STA HASH╓AL+0
  1406.    LDA HASH╓AL+1
  1407.    ADC HASH╫ORK+1
  1408.    STA HASH╓AL+1
  1409.    LDA HASH╓AL+0
  1410.    RTS
  1411.  
  1412. ;======== SYMBOLS, EXPRESSIONS, AND HOLES: SYMBOL DEFINITION SUPPORT ========
  1413.  
  1414. PARSE─EFINE╓AR = *
  1415.    JSR FIND╙YMBOL
  1416.    CMP #SYM╬EW
  1417.    BEQ +
  1418.    LDA SYM╘YPE
  1419.    CMP #$80
  1420.    BEQ +
  1421.    LDA #ERR╥EDEFINED╙YMBOL
  1422.    JMP ERROR
  1423. +  LDA #$FF
  1424.    STA SYM╘YPE
  1425.    JSR STASH╙YMBOL
  1426.    LDX #3
  1427. -  LDA ID╨TR,X
  1428.    STA VAR╨TR,X
  1429.    DEX
  1430.    BPL -
  1431.    RTS
  1432.  
  1433. ADD═EMORY╚OLE = *  ;( .╪=HOLE╘YPE, ADDRESS+.┴ )
  1434.    ;** PUT IN HOLE INFORMATION
  1435.    STX EXP╚OLE╘YPE
  1436.    CLC
  1437.    ADC ADDRESS+0
  1438.    STA EXP╚OLE┴DDR+0
  1439.    LDA ADDRESS+1
  1440.    ADC #0
  1441.    STA EXP╚OLE┴DDR+1
  1442.    LDA #0
  1443.    STA EXP╚OLE┴DDR+2
  1444.    STA EXP╚OLE┴DDR+3
  1445.    JMP ADD╚OLE╔N
  1446.  
  1447. ADD╓ARIABLE╚OLE = *  ;( VAR╨TR, EXP╘ABLE ) : ...
  1448.    ;** PUT IN HOLE INFORMATION
  1449.    LDA #$80
  1450.    STA EXP╚OLE╘YPE
  1451.    LDX #3
  1452. -  LDA VAR╨TR,X
  1453.    STA EXP╚OLE┴DDR,X
  1454.    DEX
  1455.    BPL -
  1456.  
  1457.    ADD╚OLE╔N = *
  1458.    ;** KEEP A COUNT OF THE GLOBAL NUMBER OF UNRESOLVED REFERENCES
  1459.    LDX #HOLE├OUNT
  1460.    JSR INC╠ONG
  1461.    ;** KEEP A SEPARATE COUNT OF THE UNRESOLVED RELATIVE LABELS:THEY MUST BE RESD
  1462.    LDA STRING╠EN
  1463.    CMP #2
  1464.    BCC +
  1465.    LDA STRING┬UF+1
  1466.    CMP #"+"
  1467.    BEQ +
  1468.    CMP #"-"
  1469.    BNE ++
  1470. +  LDX #REL╚OLE├OUNT
  1471.    JSR INC╠ONG
  1472.    ;** ALLOCATE STORAGE FOR EXPRESSION DESCRIPTOR
  1473. +  LDA EXP╠ENGTH
  1474.    LDY #0
  1475.    JSR MALLOC
  1476.    BCC +
  1477.    LDA #ERR╔NSUFFICIENT═EMORY
  1478.    JMP ERROR
  1479. +  LDX #3
  1480. -  LDA MP,X
  1481.    STA EXP╨TR,X
  1482.    DEX
  1483.    BPL -
  1484.    ;** SCAN FOR POINTERS TO UNRESOLVED LABELS, REFS INTO CORRESP.REFERENCE LISTS
  1485.    LDX #16
  1486.    STX EXP╧FFSET
  1487.  
  1488.    ADD╚OLE╬EXT = *
  1489.    LDX EXP╧FFSET
  1490.    LDA EXP╘YPE,X
  1491.    BPL ADD╚OLE├ONT
  1492.    LDY #0
  1493. -  LDA EXP╓ALUE,X
  1494.    STA MP,Y
  1495.    INX
  1496.    INY
  1497.    CPY #4
  1498.    BCC -
  1499.    JSR FETCH╙YMBOL╚EADER
  1500.    LDX EXP╧FFSET
  1501.    LDY #0
  1502. -  LDA SYM╓ALUE,Y
  1503.    STA EXP╬EXT╒NRES,X
  1504.    LDA EXP╨TR,Y
  1505.    STA SYM╓ALUE,Y
  1506.    INX
  1507.    INY
  1508.    CPY #4
  1509.    BCC -
  1510.    LDX EXP╧FFSET
  1511.    LDA SYM╒NRES╧PND
  1512.    STA EXP╬EXT╧PND,X
  1513.    STX SYM╒NRES╧PND
  1514.    JSR STASH╙YMBOL╚EADER
  1515.  
  1516.    ADD╚OLE├ONT = *
  1517.    CLC
  1518.    LDA EXP╧FFSET
  1519.    ADC #14
  1520.    STA EXP╧FFSET
  1521.    CMP EXP╠ENGTH
  1522.    BCC ADD╚OLE╬EXT
  1523.  
  1524.    ;** STORE EXPRESSION DESCRIPTOR
  1525.    JMP STASH┼XP
  1526.  
  1527. PLUG╙TACK╚EAD .BUF 4
  1528. PLUG╥EC┬UF    = *
  1529. PLUG╥EC╬EXT   .BUF 4
  1530. PLUG╥EC╓AR╨TR .BUF 4
  1531. PLUG╥EC╔D╓AL  .BUF 4
  1532. PLUG╥EC╔D╘YPE .BUF 1
  1533.  
  1534. PLUG╙TACK╔NIT = *
  1535.    LDA #ACE═EM╬ULL
  1536.    STA PLUG╙TACK╚EAD+3
  1537.    RTS
  1538.  
  1539. PLUG╙TACK╨USH = *  ;( VAR╨TR, ID╓AL, ID╘YPE )
  1540.    LDA #13
  1541.    LDY #0
  1542.    JSR MALLOC
  1543.    BCC +
  1544.    LDA #ERR╔NSUFFICIENT═EMORY
  1545.    JSR ERROR
  1546. +  LDX #3
  1547. -  LDA PLUG╙TACK╚EAD,X
  1548.    STA PLUG╥EC╬EXT,X
  1549.    LDA MP,X
  1550.    STA PLUG╙TACK╚EAD,X
  1551.    LDA VAR╨TR,X
  1552.    STA PLUG╥EC╓AR╨TR,X
  1553.    LDA ID╓AL,X
  1554.    STA PLUG╥EC╔D╓AL,X
  1555.    DEX
  1556.    BPL -
  1557.    LDA ID╘YPE
  1558.    STA PLUG╥EC╔D╘YPE
  1559.    LDA #<PLUG╥EC┬UF
  1560.    LDY #>PLUG╥EC┬UF
  1561.    STA ZP+0
  1562.    STY ZP+1
  1563.    LDA #13
  1564.    LDY #0
  1565.    JSR STASH
  1566.    RTS
  1567.  
  1568. PLUG╙TACK╨OP = *  ;( ) : VAR╨TR, ID╓AL, ID╘YPE, .├╙=EMPTY
  1569.    LDX #3
  1570. -  LDA PLUG╙TACK╚EAD,X
  1571.    STA MP,X
  1572.    DEX
  1573.    BPL -
  1574.    LDA MP+3
  1575.    CMP #ACE═EM╬ULL
  1576.    BNE +
  1577.    SEC
  1578.    RTS
  1579. +  LDA #<PLUG╥EC┬UF
  1580.    LDY #>PLUG╥EC┬UF
  1581.    STA ZP+0
  1582.    STY ZP+1
  1583.    LDA #13
  1584.    LDY #0
  1585.    JSR FETCH
  1586.    LDA #13
  1587.    LDY #0
  1588.    JSR FREE
  1589.    LDX #3
  1590. -  LDA PLUG╥EC╬EXT,X
  1591.    STA PLUG╙TACK╚EAD,X
  1592.    LDA PLUG╥EC╓AR╨TR,X
  1593.    STA VAR╨TR,X
  1594.    LDA PLUG╥EC╔D╓AL,X
  1595.    STA ID╓AL,X
  1596.    DEX
  1597.    BPL -
  1598.    LDA PLUG╥EC╔D╘YPE
  1599.    STA ID╘YPE
  1600.    RTS
  1601.  
  1602. ASSIGN╓AR╙AVE .BUF 10
  1603.  
  1604. ASSIGN╓ARIABLE = *  ;( VAR╨TR, ID╓AL, ID╘YPE ) : ... ;CHANGES ID╨TR,VAR╨TR,ETC.
  1605.    JSR PLUG╙TACK╔NIT
  1606.    ;** ASSIGN VALUE TO VARIABLE
  1607.    ASSIGN╓AR┬ODY = *
  1608.    LDX #3
  1609. -  LDA VAR╨TR,X
  1610.    STA MP,X
  1611.    DEX
  1612.    BPL -
  1613.    JSR FETCH╙YMBOL╚EADER
  1614.    LDA SYM╘YPE
  1615.    CMP #$FF
  1616.    BEQ +
  1617.    LDA #ERR╔NTERN┴SSIGN
  1618.    JMP ERROR
  1619. +  LDX #3
  1620. -  LDA SYM╓ALUE,X
  1621.    STA EXP╨TR,X
  1622.    LDA ID╓AL,X
  1623.    STA SYM╓ALUE,X
  1624.    DEX
  1625.    BPL -
  1626.    LDA SYM╒NRES╧PND
  1627.    STA EXP╧FFSET
  1628.    LDA ID╘YPE
  1629.    STA SYM╘YPE
  1630.    JSR STASH╙YMBOL╚EADER
  1631.  
  1632.    ;** CASCADE CHANGES IF NECESSARY
  1633.    ;╥UN THROUGH REFERENCE LIST, FILLING IN VALUE OF ID, UNLINKING FROM THIS ID.
  1634.    ;╔F WE RESOLVE AN EXPRESSION, EVALUATE IT, AND IF THE HOLE IS IN MEMORY, FILL
  1635.    ;IT.  ╔F THE FILLED HOLE IS ANOTHER VARIABLE, PUSH THE <VAR╨TR,ID╓AL,ID╘YPE>
  1636.    ;VALUES ONTO THE PLUG STACK AND CONTINUE WITH REFERENCE LIST FOR THE CURRENT
  1637.    ;VARIABLE.  ╫HEN WE ARE DONE WITH THE CURRENT LABEL, POP A VARIABLE OFF THE
  1638.    ;PLUG STACK AND CONTINUE WITH IT.  ╧THERWISE, EXIT.
  1639.    ASSIGN╓AR├ASCADE = *
  1640.    LDA EXP╨TR+3
  1641.    CMP #ACE═EM╬ULL
  1642.    BNE +
  1643.    JSR PLUG╙TACK╨OP
  1644.    BCC ASSIGN╓AR┬ODY
  1645.    RTS
  1646.    ;** FETCH UNRESOLVED EXPRESSION
  1647. +  JSR FETCH┼XP
  1648.    ;** FILL IN VALUE
  1649.    LDX EXP╧FFSET
  1650.    LDA ID╘YPE
  1651.    STA EXP╘YPE,X
  1652.    LDY #0
  1653. -  LDA ID╓AL,Y
  1654.    STA EXP╓ALUE,X
  1655.    INX
  1656.    INY
  1657.    CPY #4
  1658.    BCC -
  1659.    DEC EXP╒NRES├NT
  1660.    BNE ASSIGN╓AR╒NRESOLVED
  1661.    JMP ASSIGN╓AR╥ESOLVED
  1662.  
  1663.    ;** STILL UNRESOLVED--STASH MODIFIED EXPRESSION
  1664.    ASSIGN╓AR╒NRESOLVED = *
  1665.    JSR STASH┼XP
  1666.    JMP ASSIGN╓AR├ASCADE├ONT
  1667.  
  1668.    ;** RESOLVED--EVALUATE EXPRESSION, FILL IN HOLE
  1669.    ASSIGN╓AR╥ESOLVED = *
  1670.    LDX #3
  1671. -  LDA EXP╨TR,X
  1672.    STA MP,X
  1673.    DEX
  1674.    BPL -
  1675.    LDA EXP╠ENGTH
  1676.    LDY #0
  1677.    JSR FREE
  1678.    ;** SAVE VAR╨TR,ID╓AL,ID╘YPE,EXP╧FFSET
  1679.    LDX #3
  1680. -  LDA VAR╨TR,X
  1681.    STA ASSIGN╓AR╙AVE+0,X
  1682.    LDA EXP╚OLE┴DDR,X
  1683.    STA VAR╨TR,X
  1684.    LDA ID╓AL,X
  1685.    STA ASSIGN╓AR╙AVE+4,X
  1686.    DEX
  1687.    BPL -
  1688.    LDA ID╘YPE
  1689.    STA ASSIGN╓AR╙AVE+8
  1690.    LDA EXP╧FFSET
  1691.    STA ASSIGN╓AR╙AVE+9
  1692.    LDX #HOLE├OUNT
  1693.    JSR DEC╠ONG
  1694.    LDA SYM├LASS
  1695.    CMP #$01
  1696.    BEQ +
  1697.    LDX #REL╚OLE├OUNT
  1698.    JSR DEC╠ONG
  1699.    ;** EVALUATE NEW EXPRESSION
  1700. +  JSR EVALUATE┼XPRESSION
  1701.    ;** FILL HOLE--ID HOLE: PUSH HOLE PLUG--DO SOMETHING ELSE FOR MEMORY HOLE
  1702.    LDA EXP╚OLE╘YPE
  1703.    CMP #$80
  1704.    BEQ +
  1705.    JSR FILL═EMORY╚OLE
  1706.    JMP ++
  1707. +  JSR PLUG╙TACK╨USH
  1708.    ;** RESTORE VAR╨TR,ID╓AL,ID╘YPE,EXP╧FFSET
  1709. +  LDX #3
  1710. -  LDA ASSIGN╓AR╙AVE+0,X
  1711.    STA VAR╨TR,X
  1712.    LDA ASSIGN╓AR╙AVE+4,X
  1713.    STA ID╓AL,X
  1714.    DEX
  1715.    BPL -
  1716.    LDA ASSIGN╓AR╙AVE+8
  1717.    STA ID╘YPE
  1718.    LDA ASSIGN╓AR╙AVE+9
  1719.    STA EXP╧FFSET
  1720.  
  1721.    ;** GO ONTO NEXT UNRESOLVED EXPRESSION
  1722.    ASSIGN╓AR├ASCADE├ONT = *
  1723.    LDX EXP╧FFSET
  1724.    LDA EXP╬EXT╧PND,X
  1725.    STA EXP╧FFSET
  1726.    LDY #0
  1727. -  LDA EXP╬EXT╒NRES,X
  1728.    STA EXP╨TR,Y
  1729.    INX
  1730.    INY
  1731.    CPY #4
  1732.    BCC -
  1733.    JMP ASSIGN╓AR├ASCADE
  1734.  
  1735. FETCH┼XP = *  ;( [EXP╨TR] ) : EXP╘ABLE, MP=EXP╨TR
  1736.    LDX #3
  1737. -  LDA EXP╨TR,X
  1738.    STA MP,X
  1739.    DEX
  1740.    BPL -
  1741.    LDA #<EXP╘ABLE
  1742.    LDY #>EXP╘ABLE
  1743.    STA ZP+0
  1744.    STY ZP+1
  1745.    LDA #16+14
  1746.    LDY #0
  1747.    JSR FETCH
  1748.    LDA EXP╠ENGTH
  1749.    CMP #16+14+1
  1750.    BCC +
  1751.    LDA EXP╠ENGTH
  1752.    LDY #0
  1753.    JSR FETCH
  1754. +  RTS
  1755.  
  1756. STASH┼XP = *  ;( [EXP╨TR], EXP╘ABLE ) : MP=EXP╨TR
  1757.    LDX #3
  1758. -  LDA EXP╨TR,X
  1759.    STA MP,X
  1760.    DEX
  1761.    BPL -
  1762.    LDA #<EXP╘ABLE
  1763.    LDY #>EXP╘ABLE
  1764.    STA ZP+0
  1765.    STY ZP+1
  1766.    LDA EXP╠ENGTH
  1767.    LDY #0
  1768.    JSR STASH
  1769.    RTS
  1770.  
  1771. FILL═H╘YPE .BUF 1
  1772.  
  1773. FILL═EMORY╚OLE = *  ;( .┴=HOLE╘YPE, VAR╨TR, ID╓AL, ID╘YPE )
  1774.    STA FILL═H╘YPE
  1775.    BIT DEBUG
  1776.    BPL FILL═H├ONT
  1777.    LDA #<FILL═H═SG1
  1778.    LDY #>FILL═H═SG1
  1779.    JSR PUTS
  1780.    LDA VAR╨TR+1
  1781.    JSR PUTHEX
  1782.    LDA VAR╨TR+0
  1783.    JSR PUTHEX
  1784.    LDA #<FILL═H═SG2
  1785.    LDY #>FILL═H═SG2
  1786.    JSR PUTS
  1787.    LDX #ID╓AL
  1788.    JSR PUTNUM
  1789.    LDA #" "
  1790.    JSR PUTCHAR
  1791.    LDA #"("
  1792.    JSR PUTCHAR
  1793.    LDA #"V"
  1794.    LDX ID╘YPE
  1795.    BEQ +
  1796.    LDA #"A"
  1797. +  JSR PUTCHAR
  1798.    LDA #<FILL═H═SG3
  1799.    LDY #>FILL═H═SG3
  1800.    JSR PUTS
  1801.    LDA FILL═H╘YPE
  1802.    JSR PUTHEX
  1803.    LDA #CHR├╥
  1804.    JSR PUTCHAR
  1805.    ;%%%
  1806.  
  1807.    FILL═H├ONT = *
  1808.    LDA FILL═H╘YPE
  1809.    CMP #$40
  1810.    BEQ FILL═H┬RANCH
  1811.    TAX
  1812.    DEX
  1813. -  LDA ID╓AL,X
  1814.    STA MEM╨UT╓ALS,X
  1815.    DEX
  1816.    BPL -
  1817.    LDX FILL═H╘YPE
  1818.    DEX
  1819. -  INX
  1820.    CPX #4
  1821.    BCS +
  1822.    LDA ID╓AL,X
  1823.    BEQ -
  1824.    LDA #ERR╓ALUE╘OO╠ARGE
  1825.    JMP ERROR╥EF
  1826. +  LDA FILL═H╘YPE
  1827.    LDX VAR╨TR+0
  1828.    LDY VAR╨TR+1
  1829.    JSR MEM╨UT
  1830.    ;** ADD RELOCATABLE REFERENCE
  1831.    LDA ID╘YPE
  1832.    BEQ +
  1833.    CMP #$04
  1834.    BCS +
  1835.    LDX VAR╨TR+0
  1836.    LDY VAR╨TR+1
  1837.    JSR RECORD╥ELOC╥EF
  1838. +  RTS
  1839.  
  1840.    FILL═H┬RANCH = *
  1841.    LDA ID╓AL+2
  1842.    ORA ID╓AL+3
  1843.    BEQ +
  1844.    LDA #ERR╓ALUE╘OO╠ARGE
  1845.    JMP ERROR╥EF
  1846. +  CLC
  1847.    LDA VAR╨TR+0
  1848.    ADC #1
  1849.    STA MEM╨UT╓ALS+0
  1850.    LDA VAR╨TR+1
  1851.    ADC #0
  1852.    STA MEM╨UT╓ALS+1
  1853.    SEC
  1854.    LDA ID╓AL+0
  1855.    SBC MEM╨UT╓ALS+0
  1856.    STA MEM╨UT╓ALS+0
  1857.    TAX
  1858.    LDA ID╓AL+1
  1859.    SBC MEM╨UT╓ALS+1
  1860.    STA MEM╨UT╓ALS+1
  1861.    CMP #0
  1862.    BNE +
  1863.    CPX #128
  1864.    BCC ++
  1865. -  LDA #ERR┬RANCH╘OO╞AR
  1866.    JMP ERROR
  1867. +  CMP #$FF
  1868.    BNE -
  1869.    CPX #128
  1870.    BCC -
  1871. +  LDA #1
  1872.    LDX VAR╨TR+0
  1873.    LDY VAR╨TR+1
  1874.    JSR MEM╨UT
  1875.    RTS
  1876.  
  1877. FILL═H═SG1 = *
  1878.    .ASC "FILL MEMORY HOLE: ADDRESS=$"
  1879.    .BYTE 0
  1880. FILL═H═SG2 = *
  1881.    .ASC ", VALUE="
  1882.    .BYTE 0
  1883. FILL═H═SG3 = *
  1884.    .ASC "), HOLE╘YPE=$"
  1885.    .BYTE 0
  1886.  
  1887. ;======== PROGRAM MEMORY STORAGE ========
  1888.  
  1889. MEM╔NIT = *  ;( )
  1890.    LDA #ACE═EM╬ULL
  1891.    STA MEM┬UF╨TR+3
  1892.    LDX #0
  1893.    LDA #ACE═EM╬ULL
  1894. -  STA MEM╨TR╘ABLE,X
  1895.    INX
  1896.    BNE -
  1897.    RTS
  1898.  
  1899. MEM╨UT╙AVE .BUF 2
  1900.  
  1901. MEM╨UT = *  ;( .╪┘=ADDR,.┴=BYTE├OUNT, MEM╨UT╓ALS )
  1902.    STA MEM╨UT├OUNT
  1903.    STY MEM╨UT╨AGE
  1904.    LDY #0
  1905.  
  1906.    MEM╨UT╬EXT = *
  1907.    LDA MEM┬UF╨TR+3
  1908.    CMP #ACE═EM╬ULL
  1909.    BEQ MEM╨UT═ISS
  1910.    LDA MEM╨UT╨AGE
  1911.    CMP MEM┬UF╨AGE
  1912.    BNE MEM╨UT═ISS
  1913.    LDA MEM╨UT╓ALS,Y
  1914.    STA MEM┬UF,X
  1915.    INX
  1916.    BNE +
  1917.    INC MEM╨UT╨AGE
  1918. +  INY
  1919.    CPY MEM╨UT├OUNT
  1920.    BCC MEM╨UT╬EXT
  1921.    RTS
  1922.  
  1923.    MEM╨UT═ISS = *
  1924.    STX MEM╨UT╙AVE+0
  1925.    STY MEM╨UT╙AVE+1
  1926.    JSR MEM╞LUSH┬UF
  1927.    JSR MEM╞ETCH┬UF
  1928.    LDX MEM╨UT╙AVE+0
  1929.    LDY MEM╨UT╙AVE+1
  1930.    JMP MEM╨UT╬EXT
  1931.  
  1932. MEM╞LUSH┬UF = *
  1933.    LDA #<MEM┬UF
  1934.    LDY #>MEM┬UF
  1935.    STA ZP+0
  1936.    STY ZP+1
  1937.    ;** FLUSH OLD PAGE
  1938.    LDX #3
  1939. -  LDA MEM┬UF╨TR,X
  1940.    STA MP,X
  1941.    DEX
  1942.    BPL -
  1943.    LDA MP+3
  1944.    CMP #ACE═EM╬ULL
  1945.    BEQ +
  1946.    LDA MEM┬UF╨AGE
  1947.    AND #$03
  1948.    CLC
  1949.    ADC MP+1
  1950.    STA MP+1
  1951.    LDA #0
  1952.    LDY #1
  1953.    JSR STASH
  1954. +  RTS
  1955.  
  1956. MEM╞ETCH┬UF = *  ;( MEM╨UT╨AGE )
  1957.    LDA #<MEM┬UF
  1958.    LDY #>MEM┬UF
  1959.    STA ZP+0
  1960.    STY ZP+1
  1961.    LDA MEM╨UT╨AGE
  1962.    STA MEM┬UF╨AGE
  1963.    AND #%11111100
  1964.    TAY
  1965.    LDX #0
  1966. -  LDA MEM╨TR╘ABLE,Y
  1967.    STA MEM┬UF╨TR,X
  1968.    STA MP,X
  1969.    INY
  1970.    INX
  1971.    CPX #4
  1972.    BCC -
  1973.    LDA MP+3
  1974.    CMP #ACE═EM╬ULL
  1975.    BEQ MEM╞ETCH┬UF╬EW
  1976.    LDA MEM╨UT╨AGE
  1977.    AND #$03
  1978.    CLC
  1979.    ADC MP+1
  1980.    STA MP+1
  1981.    LDA #0
  1982.    LDY #1
  1983.    JSR FETCH
  1984.    RTS
  1985.    
  1986.    MEM╞ETCH┬UF╬EW = *
  1987.    LDA #0
  1988.    LDY #4
  1989.    JSR MALLOC
  1990.    LDA MEM┬UF╨AGE
  1991.    AND #%11111100
  1992.    TAY
  1993.    LDX #0
  1994. -  LDA MP,X
  1995.    STA MEM╨TR╘ABLE,Y
  1996.    STA MEM┬UF╨TR,X
  1997.    INY
  1998.    INX
  1999.    CPX #4
  2000.    BCC -
  2001.    RTS
  2002.  
  2003. MEM╙AVE┴DDR .BUF 2
  2004. MEM╙AVE╞D   .BUF 1
  2005. MEM╙AVE╠EN  .BUF 1  ;0==256
  2006.  
  2007. MEM╙AVE = *  ;( .┴=FD, .╪┘=FROM, ADDRESS=TO)
  2008.    STA MEM╙AVE╞D
  2009.    STX MEM╙AVE┴DDR+0
  2010.    STY MEM╙AVE┴DDR+1
  2011.    JSR MEM╞LUSH┬UF
  2012.  
  2013.    MEM╙AVE╬EXT = *
  2014.    LDA MEM╙AVE┴DDR+0
  2015.    CMP ADDRESS+0
  2016.    LDA MEM╙AVE┴DDR+1
  2017.    SBC ADDRESS+1
  2018.    BCC +
  2019.    RTS
  2020. +  LDA MEM╙AVE┴DDR+1
  2021.    STA MEM╨UT╨AGE
  2022.    JSR MEM╞ETCH┬UF   ;SETS (ZP)
  2023.    LDA #0
  2024.    STA MEM╙AVE╠EN
  2025.    ;** SET BOTTOM
  2026.    LDA MEM╙AVE┴DDR+0
  2027.    BEQ ++
  2028.    CLC
  2029.    LDA ZP+0
  2030.    ADC MEM╙AVE┴DDR+0
  2031.    STA ZP+0
  2032.    BCC +
  2033.    INC ZP+1
  2034. +  SEC
  2035.    LDA MEM╙AVE╠EN
  2036.    SBC MEM╙AVE┴DDR+0
  2037.    STA MEM╙AVE╠EN
  2038.    ;** SET TOP
  2039. +  LDA MEM╙AVE┴DDR+1
  2040.    CMP ADDRESS+1
  2041.    BCC +
  2042.    SEC
  2043.    LDA #0
  2044.    SBC ADDRESS+0
  2045.    TAX
  2046.    LDA MEM╙AVE╠EN
  2047.    STX MEM╙AVE╠EN
  2048.    SEC
  2049.    SBC MEM╙AVE╠EN
  2050.    STA MEM╙AVE╠EN
  2051.    ;** SAVE THE PAGE
  2052. +  LDY #0
  2053.    LDA MEM╙AVE╠EN
  2054.    BNE +
  2055.    INY
  2056. +  LDX MEM╙AVE╞D
  2057.    JSR WRITE
  2058.    LDA MEM╙AVE╠EN
  2059.    BEQ +
  2060.    CLC
  2061.    ADC MEM╙AVE┴DDR+0
  2062.    STA MEM╙AVE┴DDR+0
  2063.    BCC ++
  2064. +  INC MEM╙AVE┴DDR+1
  2065. +  JMP MEM╙AVE╬EXT
  2066.  
  2067. RECORD╥ELOC╥EF = *  ;( .╪┘=REF┴DDRESS, .┴=VALUE╘YPE )
  2068.    RTS
  2069.  
  2070. ;======== TOKENIZER ========
  2071.  
  2072. ;* FILL ENTIRE BUFFER, PAD WITH SPACES; .├╙=EOF
  2073. FILLBUF = *
  2074.    LDA #<SOURCE┬UF
  2075.    LDY #>SOURCE┬UF
  2076.    STA ZP
  2077.    STY ZP+1
  2078.    LDA #0
  2079.    LDY #1
  2080.    STA BUFPTR
  2081.    LDX SOURCE╞CB
  2082.    JSR READ
  2083.    BNE +
  2084.    SEC
  2085.    RTS
  2086. +  CPY #1
  2087.    BCC +
  2088.    CLC
  2089.    RTS
  2090. +  TAY
  2091.    LDA #" "
  2092. -  STA SOURCE┬UF,Y
  2093.    INY
  2094.    BNE -
  2095.    CLC
  2096.    RTS
  2097.  
  2098. GET╬EXT├HAR = *
  2099.    INC BUFPTR
  2100.    BEQ +
  2101. -  LDY BUFPTR
  2102.    LDA SOURCE┬UF,Y
  2103.    RTS
  2104. +  JSR FILLBUF
  2105.    BCC -
  2106.    LDA #CHR┼╧╞
  2107.    RTS
  2108.  
  2109. EAT╫HITESPACE = *  ;() : .┴=╬EXT├HAR
  2110.    LDA PREV├HAR
  2111.    CMP #" "
  2112.    BEQ +
  2113.    CMP #CHR╘AB
  2114.    BEQ +
  2115.    RTS
  2116. +  LDY BUFPTR
  2117. -  INY
  2118.    BEQ +
  2119.    EAT╫H├ONT = *
  2120.    LDA SOURCE┬UF,Y
  2121.    CMP #" "
  2122.    BEQ -
  2123.    CMP #CHR╘AB
  2124.    BEQ -
  2125.    STY BUFPTR
  2126.    RTS
  2127. +  JSR FILLBUF
  2128.    BCS +
  2129.    LDY #0
  2130.    JMP EAT╫H├ONT
  2131. +  LDA #CHR┼╧╞
  2132.    RTS
  2133.  
  2134. ;*** TOKEN DISPATCH ***
  2135. ;RET: .╪=TOKEN╔DENTIFIER, .┴=NEXT├HAR, .┘=STRLEN, STRING╠EN, STRING┬UF
  2136. ;     .╪=TOKEN╬UMBER,     .┘=NUMLEN, NUMBER
  2137. ;     .╪=TOKEN╙TRING,     .┴=FIRST├HAR,.┘=STRLEN, STRING╠EN, STRING┬UF
  2138. ;     .╪=TOKEN╙PECIAL,    .┴=CHAR
  2139.  
  2140. TOK─EBUG╙AVE .BUF 3
  2141.  
  2142. GET╘OKEN = *
  2143.    LDA NEW├OL
  2144.    STA SOURCE├OL
  2145.    LDA NEW╠INE+0
  2146.    STA SOURCE╠INE+0
  2147.    LDA NEW╠INE+1
  2148.    STA SOURCE╠INE+1
  2149.    LDA NEW╠INE+2
  2150.    STA SOURCE╠INE+2
  2151.    LDA NEW╠INE+3
  2152.    STA SOURCE╠INE+3
  2153.    BIT DEBUG
  2154.    BPL GET╘OKEN╥EAL
  2155.    JSR GET╘OKEN╥EAL
  2156.    STA TOK─EBUG╙AVE+0
  2157.    STX TOK─EBUG╙AVE+1
  2158.    STY TOK─EBUG╙AVE+2
  2159.    JSR DISP╘OKEN
  2160.    LDA TOK─EBUG╙AVE+0
  2161.    LDX TOK─EBUG╙AVE+1
  2162.    LDY TOK─EBUG╙AVE+2
  2163.    RTS
  2164.  
  2165. GET╘OKEN╥EAL = *
  2166.    LDA PREV├HAR
  2167.    CMP #" "
  2168.    BNE +
  2169. -  JSR EAT╫HITESPACE
  2170. +  CMP #CHR╘AB
  2171.    BEQ -
  2172.    CMP #"@"
  2173.    BCC +
  2174.    JMP GET╔DENTIFIER
  2175. +  CMP #"'"
  2176.    BCC CMP═ORE1
  2177.    BNE +
  2178.    JMP GET╙TRING
  2179. +  CMP #"0"
  2180.    BCC TOK╙PECIAL
  2181.    CMP #":"
  2182.    BCS +
  2183.  
  2184.    TOK╬UM = *
  2185.    JMP GET╬UMBER
  2186.  
  2187. +  CMP #";"
  2188.    BNE +
  2189.    JMP EAT├OMMENT
  2190.  
  2191.    TOK╙PECIAL = *
  2192.    JMP GET╙PECIAL╘OKEN
  2193.  
  2194.    CMP═ORE1 = *
  2195.    CMP #"$"
  2196.    BCC +
  2197.    BEQ TOK╬UM
  2198.    CMP #"%"
  2199.    BEQ TOK╬UM
  2200.    JMP GET╙PECIAL╘OKEN
  2201.  
  2202. +  CMP #CHR╤UOTE
  2203.    BNE TOK╙PECIAL
  2204.    JMP GET╙TRING
  2205.  
  2206. ;*** COMMENT ***
  2207.  
  2208. EAT├OMMENT = *
  2209.    LDY BUFPTR
  2210. -  INY
  2211.    BEQ +
  2212.  
  2213.    COMMENT├HAR = *
  2214.    LDA SOURCE┬UF,Y
  2215.    CMP #CHR├╥
  2216.    BNE -
  2217.    STY BUFPTR
  2218.    JMP GET╙PECIAL╘OKEN
  2219. +  JSR FILLBUF
  2220.    BCS +
  2221.    LDY #0
  2222.    BEQ COMMENT├HAR
  2223. +  LDA #CHR┼╧╞
  2224.    JMP GET╙PECIAL╘OKEN
  2225.  
  2226. ;*** SPECIAL ***
  2227.  
  2228. GET╙PECIAL╘OKEN = *
  2229.    CMP #CHR├╥
  2230.    BNE +
  2231.    INC NEW╠INE+0
  2232.    BNE +
  2233.    INC NEW╠INE+1
  2234.    BNE +
  2235.    INC NEW╠INE+2
  2236.    BNE +
  2237.    INC NEW╠INE+3
  2238. +  CMP #CHR┼╧╞
  2239.    BNE +
  2240.    STA PREV├HAR
  2241.    STA TOKEN├HAR
  2242.    LDX #TOKEN┼╧╞
  2243.    STX TOKEN╘YPE
  2244.    RTS
  2245. +  PHA
  2246.    JSR GET╬EXT├HAR
  2247.    STA PREV├HAR
  2248.    STA TOKEN╬EXT├HAR
  2249.    PLA
  2250.    LDX #TOKEN╙PECIAL
  2251.    STX TOKEN╘YPE
  2252.    STA TOKEN├HAR
  2253.    RTS
  2254.  
  2255. ;*** IDENTIFIER ***
  2256.  
  2257. GET╔DENTIFIER = *
  2258.    STA STRING┬UF
  2259.    LDY #1
  2260.    STY STRING╠EN
  2261. -  JSR GET╬EXT├HAR
  2262.    CMP #"@"
  2263.    BCC IDENT┼XIT
  2264.  
  2265.    IDENT╟OOD├HAR = *
  2266.    LDY STRING╠EN
  2267.    STA STRING┬UF,Y
  2268.    INC STRING╠EN
  2269.    CPY #240
  2270.    BCC -
  2271.    STA PREV├HAR
  2272.    LDA #ERR╔DENT╘OO╠ONG
  2273.    JMP ERROR
  2274.  
  2275.    IDENT┼XIT = *
  2276.    CMP #"."
  2277.    BEQ IDENT╟OOD├HAR
  2278.    CMP #"_"
  2279.    BEQ IDENT╟OOD├HAR
  2280.    CMP #"0"
  2281.    BCC +
  2282.    CMP #":"
  2283.    BCC IDENT╟OOD├HAR
  2284. +  CMP #" "
  2285.    BNE +
  2286. -  STA PREV├HAR
  2287.    JSR EAT╫HITESPACE
  2288. +  CMP #CHR╘AB
  2289.    BEQ -
  2290.    STA PREV├HAR
  2291.    LDA #0
  2292.    LDY STRING╠EN
  2293.    STA STRING┬UF,Y
  2294.    LDA PREV├HAR
  2295.    LDY STRING╠EN
  2296.    LDX #TOKEN╔DENTIFIER
  2297.    STX TOKEN╘YPE
  2298.    CMP #";"
  2299.    BNE +
  2300.    LDA #CHR├╥
  2301. +  STA TOKEN╬EXT├HAR
  2302.    RTS
  2303.  
  2304. ;*** STRING ***
  2305.  
  2306. GET╙TRING = *
  2307.    STA STR─ELIMIT
  2308.    LDA #0
  2309.    STA STRING╠EN
  2310. -  JSR GET╬EXT├HAR
  2311.    STA PREV├HAR
  2312.    CMP #CHR┼╧╞
  2313.    BEQ STR┼OF
  2314.    CMP STR─ELIMIT
  2315.    BEQ STR┼XIT
  2316.    CMP #CHR├╥
  2317.    BEQ STR┼OF
  2318.    CMP #"\"
  2319.    BEQ STR┼SC
  2320.    GET╙TR╨UT = *
  2321.    LDY STRING╠EN
  2322.    STA STRING┬UF,Y
  2323.    INC STRING╠EN
  2324.    LDA STRING╠EN
  2325.    CMP #241
  2326.    BCC -
  2327.    STA PREV├HAR
  2328.    LDA #ERR╙TRING╘OO╠ONG
  2329.    JMP ERROR
  2330.  
  2331. STR┼SC = *
  2332.    JSR GET╬EXT├HAR
  2333.    CMP #CHR├╥
  2334.    BEQ STR┼OF
  2335.    CMP #CHR┼╧╞
  2336.    BEQ STR┼OF
  2337.    LDX #STR┼SC├HAR┼ND-STR┼SC├HAR-1
  2338. -  CMP STR┼SC├HAR,X
  2339.    BEQ +
  2340.    DEX
  2341.    BPL -
  2342.    JMP GET╙TR╨UT
  2343. +  LDA STR┼SC╘RANS,X
  2344.    JMP GET╙TR╨UT
  2345.  
  2346. STR┼SC├HAR = *
  2347.    .ASC "\NBTRAZ'E0Q"
  2348.    .BYTE CHR╤UOTE
  2349.    STR┼SC├HAR┼ND = *
  2350. STR┼SC╘RANS = *
  2351.    .BYTE 92,13,20,9,10,7,0,39,27,0,34,34
  2352.  
  2353. STR┼OF = *
  2354.    LDA #ERR╬O├LOSE╤UOTE
  2355.    JMP ERROR
  2356.  
  2357. STR┼XIT = *
  2358.    JSR GET╬EXT├HAR
  2359.    STA PREV├HAR
  2360.    LDA #0  ;BUT MAY CONTAIN \0
  2361.    LDY STRING╠EN
  2362.    STA STRING┬UF,Y
  2363.    LDA STRING┬UF+0
  2364.    LDX #TOKEN╙TRING
  2365.    STX TOKEN╘YPE
  2366.    STA TOKEN├HAR
  2367.    RTS
  2368.  
  2369. GET╬UMBER = *
  2370.    PHA
  2371.    LDX #3
  2372.    LDA #0
  2373. -  STA NUMBER,X
  2374.    DEX
  2375.    BPL -
  2376.    PLA
  2377.    LDX #16
  2378.    CMP #"$"
  2379.    BEQ +
  2380.    LDX #2
  2381.    CMP #"%"
  2382.    BEQ +
  2383.    LDX #10
  2384.    STX NUM┬ASE
  2385.    BNE GOT╬EXT─IGIT
  2386. +  STX NUM┬ASE
  2387.    JSR GET╬EXT├HAR
  2388.    STA PREV├HAR
  2389.    JSR CHECK─IGIT
  2390.    BCC +
  2391.    LDA #ERR┬AD╬UMBER
  2392.    JMP ERROR
  2393. +  TXA
  2394.    JMP GOT╬EXT─IGIT
  2395.  
  2396. NEXT─IGIT = *
  2397.    JSR GET╬EXT├HAR
  2398.    STA PREV├HAR
  2399.    CMP #"_"
  2400.    BEQ NEXT─IGIT
  2401. GOT╬EXT─IGIT = *
  2402.    JSR CHECK─IGIT
  2403.    BCS GET╬UM┼XIT
  2404.    PHA
  2405.    JSR SHIFT╬UMBER
  2406.    BCS OVERFLOW┼XIT╨LA
  2407.    PLA
  2408.    CLC
  2409.    ADC NUMBER
  2410.    STA NUMBER
  2411.    BCC +
  2412.    INC NUMBER+1
  2413.    BNE +
  2414.    INC NUMBER+2
  2415.    BNE +
  2416.    INC NUMBER+3
  2417.    BEQ OVERFLOW┼XIT
  2418. +  JMP NEXT─IGIT
  2419.  
  2420. OVERFLOW┼XIT╨LA = *
  2421.    PLA
  2422. OVERFLOW┼XIT = *
  2423.    LDA #ERR╬UM╧VERFLOW
  2424.    JMP ERROR
  2425.  
  2426. GET╬UM┼XIT = *
  2427.    LDY #3
  2428. -  LDA NUMBER,Y
  2429.    BEQ +
  2430.    DEY
  2431.    BPL -
  2432.    INY
  2433. +  INY
  2434.    STY TOKEN╬UM┬YTES
  2435.    LDX #TOKEN╬UMBER
  2436.    STX TOKEN╘YPE
  2437.    RTS
  2438.  
  2439. CHECK─IGIT = *  ;( .┴=ASCII─IGIT ) : .┴=BIN─IGIT, .╪=ASCII─IGIT, .├├=OK
  2440.    TAX
  2441.    CMP #"0"
  2442.    BCC CHECK┬AD
  2443.    CMP #"9"+1
  2444.    BCC CHECK┴ND
  2445.    CMP #"A"
  2446.    BCC CHECK┬AD
  2447.    CMP #"F"+1
  2448.    BCC +
  2449.    CMP #"┴"
  2450.    BCC CHECK┬AD
  2451.    CMP #"╞"+1
  2452.    BCS CHECK┬AD
  2453. +  SEC
  2454.    SBC #7
  2455.    CHECK┴ND = *
  2456.    AND #$0F
  2457.    CMP NUM┬ASE
  2458.    RTS
  2459.    CHECK┬AD = *
  2460.    SEC
  2461.    RTS
  2462.  
  2463. SHIFT╬UMBER = *
  2464.    LDA NUM┬ASE
  2465.    CMP #10
  2466.    BNE +
  2467.    LDX #3
  2468. -  LDA NUMBER,X
  2469.    STA NUM╙AVE,X
  2470.    DEX
  2471.    BPL -
  2472.    LDX #2
  2473.    JSR ROLL╬UMBER
  2474.    JSR ADD╬UMBER
  2475.    LDX #1
  2476.    JSR ROLL╬UMBER
  2477.    RTS
  2478. +  LDX #1
  2479.    CMP #16
  2480.    BNE +
  2481.    LDX #4
  2482. +  JSR ROLL╬UMBER
  2483.    RTS
  2484.  
  2485.    ROLL╬UMBER = *  ;( .╪=TIMES )
  2486.    ASL NUMBER
  2487.    ROL NUMBER+1
  2488.    ROL NUMBER+2
  2489.    ROL NUMBER+3
  2490.    BCS +
  2491.    DEX
  2492.    BNE ROLL╬UMBER
  2493.    RTS
  2494. +  PLA
  2495.    PLA
  2496.    SEC
  2497.    RTS
  2498.  
  2499.    ADD╬UMBER = *
  2500.    LDX #0
  2501.    CLC
  2502. -  LDA NUMBER,X
  2503.    ADC NUM╙AVE,X
  2504.    STA NUMBER,X
  2505.    INX
  2506.    TXA
  2507.    AND #$03
  2508.    BNE -
  2509.    BCS +
  2510.    RTS
  2511. +  PLA
  2512.    PLA
  2513.    SEC
  2514.    RTS
  2515.  
  2516. ;======== DEBUGGING TOKEN DISPLAY ROUTINES ========
  2517.  
  2518. DISP╘OKEN = *  ;( .TOKEN╘YPE )
  2519.    LDX TOKEN╘YPE
  2520.    CPX #TOKEN╔DENTIFIER
  2521.    BEQ DISP╔DENTIFIER
  2522.    CPX #TOKEN╙TRING
  2523.    BEQ DISP╙TRING
  2524.    CPX #TOKEN╙PECIAL
  2525.    BNE +
  2526.    JMP DISP╙PECIAL
  2527. +  CPX #TOKEN╬UMBER
  2528.    BNE +
  2529.    JMP DISP╬UMBER
  2530. +  RTS
  2531.  
  2532. DISP╔DENTIFIER = *
  2533.    LDA #"I"
  2534.    JSR PUTCHAR
  2535.    LDA #":"
  2536.    JSR PUTCHAR
  2537.    JSR SHOW╙TR
  2538.    LDA #","
  2539.    JSR PUTCHAR
  2540.    JSR HASH
  2541.    LDA #0
  2542.    STA NUMBER+2
  2543.    STA NUMBER+3
  2544.    LDA HASH╓AL+0
  2545.    LDY HASH╓AL+1
  2546.    STA NUMBER+0
  2547.    STY NUMBER+1
  2548.    LDX #NUMBER
  2549.    JSR PUTNUM
  2550.    LDA #","
  2551.    JSR PUTCHAR
  2552.    SEC
  2553.    LDA HASH╨TR+0
  2554.    SBC #<IDENT╚ASH╘ABLE
  2555.    STA NUMBER+0
  2556.    LDA HASH╨TR+1
  2557.    SBC #>IDENT╚ASH╘ABLE
  2558.    STA NUMBER+1
  2559.    LSR NUMBER+1
  2560.    ROR NUMBER+0
  2561.    LSR NUMBER+1
  2562.    ROR NUMBER+0
  2563.    LDX #NUMBER
  2564.    JSR PUTNUM
  2565.    LDA #","
  2566.    JSR PUTCHAR
  2567.    LDA TOKEN╬EXT├HAR
  2568.    SHOW├HAR = *
  2569.    CMP #CHR├╥
  2570.    BNE +
  2571.    LDA #"\"
  2572.    JSR PUTCHAR
  2573.    LDA #"N"
  2574. +  JSR PUTCHAR
  2575.    SHOW├╥ = *
  2576.    LDA #CHR├╥
  2577.    JSR PUTCHAR
  2578.    RTS
  2579.  
  2580. DISP╙TRING = *
  2581.    LDA #"S"
  2582.    JSR PUTCHAR
  2583.    LDA #":"
  2584.    JSR PUTCHAR
  2585.    JSR SHOW╙TR
  2586.    JMP SHOW├╥
  2587.  
  2588. SHOW╙TR = *
  2589.    LDA #<STRING┬UF
  2590.    LDY #>STRING┬UF
  2591.    STA ZP+0
  2592.    STY ZP+1
  2593.    LDA STRING╠EN
  2594.    LDY #0
  2595.    LDX #STDOUT
  2596.    JSR WRITE
  2597.    RTS
  2598.  
  2599. DISP╙PECIAL = *
  2600.    LDA #"C"
  2601.    JSR PUTCHAR
  2602.    LDA #":"
  2603.    JSR PUTCHAR
  2604.    LDA TOKEN├HAR
  2605.    JMP SHOW├HAR
  2606.  
  2607. DISP╬UMBER = *
  2608.    LDA #"N"
  2609.    JSR PUTCHAR
  2610.    LDA #":"
  2611.    JSR PUTCHAR
  2612.    LDA #<STRING┬UF
  2613.    LDY #>STRING┬UF
  2614.    STA ZP+0
  2615.    STY ZP+1
  2616.    LDX #NUMBER
  2617.    LDA #1
  2618.    JSR UTOA
  2619.    STY STRING╠EN
  2620.    JSR SHOW╙TR
  2621.    JMP SHOW├╥
  2622.  
  2623. ;=== DYNAMIC MEMORY ROUTINES ===
  2624.  
  2625. MALLOC╫ORK = MEM╫ORK ;(16)  ;REQUIRED WORK AREA; DEFINED EARLIER
  2626.  
  2627. MALLOC╚EAD   .BUF 4
  2628. TPA╞REE╞IRST .BUF 1
  2629. TPA╞REE═IN   .BUF 1
  2630. TPA╞REE╨AGES .BUF 1
  2631. TPA┴REA╙TART .BUF 1
  2632. TPA┴REA┼ND   .BUF 1
  2633.  
  2634. ;*** MALLOC╔NIT()
  2635.  
  2636. MALLOC╔NIT = *
  2637.    LDA #ACE═EM╬ULL
  2638.    STA MALLOC╚EAD+3
  2639.    LDX #0
  2640.    LDA #$FF
  2641. -  STA TPA╞REEMAP,X
  2642.    INX
  2643.    BNE -
  2644.    LDX #>BSS┼ND
  2645.    LDA #<BSS┼ND
  2646.    BEQ +
  2647.    INX
  2648. +  STX TPA╞REE╞IRST
  2649.    STX TPA┴REA╙TART
  2650.    LDX ACE═EM╘OP+1
  2651.    STX MALLOC╫ORK
  2652.    STX TPA┴REA┼ND
  2653.    TXA
  2654.    SEC
  2655.    SBC TPA╞REE╞IRST
  2656.    BCS +
  2657.    LDA #0
  2658. +  STA TPA╞REE╨AGES
  2659.    CLC
  2660.    ADC #1
  2661.    STA TPA╞REE═IN
  2662.    LDX TPA╞REE╞IRST
  2663.    CPX MALLOC╫ORK
  2664.    BCS +
  2665.    LDA #$00
  2666. -  STA TPA╞REEMAP,X
  2667.    INX
  2668.    CPX MALLOC╫ORK
  2669.    BCC -
  2670. +  RTS
  2671.  
  2672. LIB╨AGES .BUF 1
  2673.  
  2674. LIB╨AGE┴LLOC = *  ;( .┴=PAGES ) : [MP]
  2675.    STA LIB╨AGES
  2676.    LDX #$00
  2677.    LDY #ACE═EM╔NTERNAL-1
  2678.    JSR PAGEALLOC
  2679.    BCS +
  2680.    RTS
  2681. +  JSR TPA╨AGE┴LLOC
  2682.    BCS +
  2683.    RTS
  2684. +  LDA LIB╨AGES
  2685.    LDX #ACE═EM╔NTERNAL
  2686.    LDY #$FF
  2687.    JSR PAGEALLOC
  2688.    BCS +
  2689.    RTS
  2690. +  SEC
  2691.    ;RTS
  2692.    ;LDA #<NOMEM═SG
  2693.    ;LDY #>NOMEM═SG
  2694.    ;JSR EPUTS
  2695.    LDA #ERR╔NSUFFICIENT═EMORY
  2696.    JMP ERROR
  2697.  
  2698.    ;NOMEM═SG = *
  2699.    ;.BYTE CHR├╥
  2700.    ;.ASC "╔NSUFFICIENT MEMORY, ABORTING."
  2701.    ;.BYTE CHR├╥,0
  2702.  
  2703. NEWMAX   .BUF 1
  2704.  
  2705. TPA╨AGE┴LLOC = *  ;( LIB╨AGES ) : [MP]
  2706.    LDA LIB╨AGES
  2707.    CMP TPA╞REE═IN
  2708.    BCS TPA╞REEMAP╞ULL
  2709.    ;** FIRST FREE
  2710.    LDX TPA╞REE╞IRST
  2711.    LDA TPA╞REEMAP,X
  2712.    BEQ ++
  2713. -  INX
  2714.    BEQ TPA╞REEMAP╞ULL
  2715.    LDA TPA╞REEMAP,X
  2716.    BNE -
  2717.    STX TPA╞REE╞IRST
  2718.    JMP ++
  2719.    TPA╞REEMAP╞ULL = *
  2720.    LDA LIB╨AGES
  2721.    CMP TPA╞REE═IN
  2722.    BCS +
  2723.    STA TPA╞REE═IN
  2724. +  SEC
  2725.    RTS
  2726.  
  2727.    ;** SEARCH
  2728. +  DEX
  2729. -  LDY LIB╨AGES
  2730. -  INX
  2731.    BEQ TPA╞REEMAP╞ULL
  2732.    LDA TPA╞REEMAP,X
  2733.    BNE --
  2734.    DEY
  2735.    BNE -
  2736.  
  2737.    ;** ALLOCATE
  2738.    STX NEWMAX
  2739.    LDY LIB╨AGES
  2740.    LDA #$41
  2741. -  STA TPA╞REEMAP,X
  2742.    DEX
  2743.    DEY
  2744.    BNE -
  2745.    INX
  2746.    CPX TPA╞REE╞IRST
  2747.    BNE +
  2748.    LDY NEWMAX
  2749.    INY
  2750.    STY TPA╞REE╞IRST
  2751. +  SEC
  2752.    LDA TPA╞REE╨AGES
  2753.    SBC LIB╨AGES
  2754.    STA TPA╞REE╨AGES
  2755.    LDA #0
  2756.    LDY #ACE═EM╔NTERNAL
  2757.    STA MP+0
  2758.    STX MP+1
  2759.    STA MP+2
  2760.    STY MP+3
  2761.    CLC
  2762.    RTS
  2763.  
  2764. MALLOC╠EN╙AVE .BUF 3
  2765.  
  2766. MALLOC = *
  2767. QUICK═ALLOC = *
  2768.    STA MALLOC╠EN╙AVE+0
  2769.    STY MALLOC╠EN╙AVE+1
  2770.    JSR LIB═ALLOC
  2771.    BCS +
  2772.    RTS
  2773. +  LDX MALLOC╠EN╙AVE+1
  2774.    LDA MALLOC╠EN╙AVE+0
  2775.    BEQ +
  2776.    INX
  2777. +  TXA
  2778.    CPX #>1024
  2779.    BCS +
  2780.    LDX #>1024
  2781. +  TXA
  2782.    STA MALLOC╠EN╙AVE+2
  2783.    JSR LIB╨AGE┴LLOC
  2784.    BCC +
  2785.    RTS
  2786. +  LDA #0
  2787.    LDY MALLOC╠EN╙AVE+2
  2788.    JSR FREE
  2789.    LDA MALLOC╠EN╙AVE+0
  2790.    LDY MALLOC╠EN╙AVE+1
  2791.    JMP MALLOC
  2792.  
  2793. ;*** MALLOC( .┴┘=┬YTES ) : [MP]=╞AR╨OINTER
  2794.  
  2795. MALLOC═EM╬EXT╨TR = MALLOC╫ORK+0 ;(4)
  2796. MALLOC═EM╠ENGTH  = MALLOC╫ORK+4 ;(2)
  2797. MALLOC╠ENGTH     = MALLOC╫ORK+6 ;(2)
  2798. MALLOC╤          = MALLOC╫ORK+8 ;(4)
  2799.  
  2800. LIB═ALLOC = *
  2801.    CLC
  2802.    ADC #7
  2803.    BCC +
  2804.    INY
  2805. +  AND #$F8
  2806.    STA MALLOC╠ENGTH
  2807.    STY MALLOC╠ENGTH+1
  2808.    LDX #3
  2809. -  LDA MALLOC╚EAD,X
  2810.    STA MP,X
  2811.    LDA #ACE═EM╬ULL
  2812.    STA MALLOC╤,X
  2813.    DEX
  2814.    BPL -
  2815.  
  2816.    MALLOC╠OOK = *
  2817.    LDA MP+3
  2818.    CMP #ACE═EM╬ULL
  2819.    BNE +
  2820.  
  2821.    MALLOC┼RROR┼XIT = *
  2822.    LDA #ACE═EM╬ULL
  2823.    STA MP+3
  2824.    LDA #ACE┼RR╔NSUFFICIENT═EMORY
  2825.    STA ERRNO
  2826.    SEC
  2827.    RTS
  2828.  
  2829. +  LDX #MALLOC═EM╬EXT╨TR
  2830.    LDY #6
  2831.    JSR ZPLOAD
  2832.    LDA MALLOC═EM╠ENGTH
  2833.    CMP MALLOC╠ENGTH
  2834.    LDA MALLOC═EM╠ENGTH+1
  2835.    SBC MALLOC╠ENGTH+1
  2836.    BCS MALLOC╟OT┬LOCK
  2837.    LDX #3
  2838. -  LDA MP,X
  2839.    STA MALLOC╤,X
  2840.    LDA MALLOC═EM╬EXT╨TR,X
  2841.    STA MP,X
  2842.    DEX
  2843.    BPL -
  2844.    JMP MALLOC╠OOK
  2845.  
  2846.    MALLOC╟OT┬LOCK = *
  2847.    LDA MALLOC═EM╠ENGTH
  2848.    CMP MALLOC╠ENGTH
  2849.    BNE +
  2850.    LDA MALLOC═EM╠ENGTH+1
  2851.    SBC MALLOC╠ENGTH+1
  2852.    BEQ MALLOC╘AKE╫HOLE┬LOCK
  2853. +  SEC
  2854.    LDA MALLOC═EM╠ENGTH
  2855.    SBC MALLOC╠ENGTH
  2856.    STA MALLOC═EM╠ENGTH
  2857.    LDA MALLOC═EM╠ENGTH+1
  2858.    SBC MALLOC╠ENGTH+1
  2859.    STA MALLOC═EM╠ENGTH+1
  2860.    LDX #MALLOC═EM╬EXT╨TR
  2861.    LDY #6
  2862.    JSR ZPSTORE
  2863.    CLC
  2864.    LDA MP+0
  2865.    ADC MALLOC═EM╠ENGTH
  2866.    STA MP+0
  2867.    LDA MP+1
  2868.    ADC MALLOC═EM╠ENGTH+1
  2869.    STA MP+1
  2870.    CLC
  2871.    RTS
  2872.  
  2873.    MALLOC╘AKE╫HOLE┬LOCK = *
  2874.    LDA MALLOC╤+3
  2875.    CMP #ACE═EM╬ULL
  2876.    BNE +
  2877.    LDX #3
  2878. -  LDA MALLOC═EM╬EXT╨TR,X
  2879.    STA MALLOC╚EAD,X
  2880.    DEX
  2881.    BPL -
  2882.    CLC
  2883.    RTS
  2884. +  LDX #3
  2885. -  LDA MP,X
  2886.    LDY MALLOC╤,X
  2887.    STA MALLOC╤,X
  2888.    STY MP,X
  2889.    DEX
  2890.    BPL -
  2891.    LDX #MALLOC═EM╬EXT╨TR
  2892.    LDY #4
  2893.    JSR ZPSTORE
  2894.    LDX #3
  2895. -  LDA MALLOC╤,X
  2896.    STA MP,X
  2897.    DEX
  2898.    BPL -
  2899.    CLC
  2900.    RTS
  2901.  
  2902. ;*** FREE( [MP]=╞AR╨OINTER, .┴┘=╠ENGTH )  █ALTERS [MP]▌
  2903.  
  2904. FREE═EM╬EXT╨TR = MALLOC╫ORK+0  ;(4)
  2905. FREE═EM╠ENGTH  = MALLOC╫ORK+4  ;(2)
  2906. FREE╠ENGTH     = MALLOC╫ORK+6  ;(2)
  2907. FREE╬EW╨TR     = MALLOC╫ORK+8  ;(4)
  2908. FREE╤          = MALLOC╫ORK+12 ;(4)
  2909.  
  2910. FREE = *
  2911.    CLC
  2912.    ADC #7
  2913.    BCC +
  2914.    INY
  2915. +  AND #$F8
  2916.    STA FREE╠ENGTH+0
  2917.    STY FREE╠ENGTH+1
  2918.    LDX #3
  2919. -  LDA MP,X
  2920.    STA FREE╬EW╨TR,X
  2921.    LDA MALLOC╚EAD,X
  2922.    STA MP,X
  2923.    LDA #ACE═EM╬ULL
  2924.    STA FREE╤,X
  2925.    DEX
  2926.    BPL -
  2927.  
  2928.    FREE╙EARCH╠OOP = *
  2929.    LDA MP+3
  2930.    CMP #ACE═EM╬ULL
  2931.    BEQ FREE├OALESCE╤AND╬EW
  2932.    LDA MP+0
  2933.    CMP FREE╬EW╨TR+0
  2934.    LDA MP+1
  2935.    SBC FREE╬EW╨TR+1
  2936.    LDA MP+2
  2937.    SBC FREE╬EW╨TR+2
  2938.    LDA MP+3
  2939.    SBC FREE╬EW╨TR+3
  2940.    BCS FREE├OALESCE╤AND╬EW
  2941. +  LDX #FREE═EM╬EXT╨TR
  2942.    LDY #4
  2943.    JSR ZPLOAD
  2944.    LDX #3
  2945. -  LDA MP,X
  2946.    STA FREE╤,X
  2947.    LDA FREE═EM╬EXT╨TR,X
  2948.    STA MP,X
  2949.    DEX
  2950.    BPL -
  2951.    BMI FREE╙EARCH╠OOP
  2952.  
  2953.    FREE├OALESCE╤AND╬EW = *
  2954.    LDX #3
  2955. -  LDA FREE╤,X
  2956.    STA MP,X
  2957.    DEX
  2958.    BPL -
  2959.    LDA MP+3
  2960.    CMP #ACE═EM╬ULL
  2961.    BNE +
  2962.    ;** PREV IS HEAD
  2963.    LDX #3
  2964. -  LDA MALLOC╚EAD,X
  2965.    STA FREE═EM╬EXT╨TR,X
  2966.    LDA FREE╬EW╨TR,X
  2967.    STA MALLOC╚EAD,X
  2968.    DEX
  2969.    BPL -
  2970.    LDA FREE╠ENGTH+0
  2971.    LDY FREE╠ENGTH+1
  2972.    STA FREE═EM╠ENGTH+0
  2973.    STY FREE═EM╠ENGTH+1
  2974.    JMP FREE├OALESCE╬EW┴ND╨
  2975.  
  2976.    ;** PREV IS REAL
  2977. +  LDX #FREE═EM╬EXT╨TR
  2978.    LDY #6
  2979.    JSR ZPLOAD
  2980.    LDA MP+3
  2981.    CMP FREE╬EW╨TR+3
  2982.    BNE +
  2983.    LDA MP+2
  2984.    CMP FREE╬EW╨TR+2
  2985.    BNE +
  2986.    CLC
  2987.    LDA MP+0
  2988.    ADC FREE═EM╠ENGTH
  2989.    TAX
  2990.    LDA MP+1
  2991.    ADC FREE═EM╠ENGTH+1
  2992.    CMP FREE╬EW╨TR+1
  2993.    BNE +
  2994.    CPX FREE╬EW╨TR
  2995.    BNE +
  2996.    ;** PREV DOES COALESCE
  2997.    CLC
  2998.    LDA FREE═EM╠ENGTH
  2999.    ADC FREE╠ENGTH
  3000.    STA FREE═EM╠ENGTH
  3001.    LDA FREE═EM╠ENGTH+1
  3002.    ADC FREE╠ENGTH+1
  3003.    STA FREE═EM╠ENGTH+1
  3004.    LDX #3
  3005. -  LDA FREE╤,X
  3006.    STA FREE╬EW╨TR,X
  3007.    DEX
  3008.    BPL -
  3009.    BMI FREE├OALESCE╬EW┴ND╨
  3010.  
  3011.    ;** PREV DOES NOT COALESCE
  3012. +  LDX #FREE╬EW╨TR
  3013.    LDY #4
  3014.    JSR ZPSTORE
  3015.    LDA FREE╠ENGTH+0
  3016.    LDY FREE╠ENGTH+1
  3017.    STA FREE═EM╠ENGTH+0
  3018.    STY FREE═EM╠ENGTH+1
  3019.  
  3020.    FREE├OALESCE╬EW┴ND╨ = *
  3021.    LDA FREE╬EW╨TR+3
  3022.    CMP FREE═EM╬EXT╨TR+3
  3023.    BNE +
  3024.    LDA FREE╬EW╨TR+2
  3025.    CMP FREE═EM╬EXT╨TR+2
  3026.    BNE +
  3027.    CLC
  3028.    LDA FREE╬EW╨TR
  3029.    ADC FREE═EM╠ENGTH
  3030.    TAX
  3031.    LDA FREE╬EW╨TR+1
  3032.    ADC FREE═EM╠ENGTH+1
  3033.    CMP FREE═EM╬EXT╨TR+1
  3034.    BNE +
  3035.    CPX FREE═EM╬EXT╨TR
  3036.    BNE +
  3037.  
  3038.    ;** NEW AND NEXT COALESCE
  3039.    LDX #3
  3040. -  LDA FREE═EM╬EXT╨TR,X
  3041.    STA MP,X
  3042.    DEX
  3043.    BPL -
  3044.    LDA FREE═EM╠ENGTH+1
  3045.    PHA
  3046.    LDA FREE═EM╠ENGTH+0
  3047.    PHA
  3048.    LDX #FREE═EM╬EXT╨TR
  3049.    LDY #6
  3050.    JSR ZPLOAD
  3051.    CLC
  3052.    PLA
  3053.    ADC FREE═EM╠ENGTH+0
  3054.    STA FREE═EM╠ENGTH+0
  3055.    PLA
  3056.    ADC FREE═EM╠ENGTH+1
  3057.    STA FREE═EM╠ENGTH+1
  3058.  
  3059. +  LDX #3
  3060. -  LDA FREE╬EW╨TR,X
  3061.    STA MP,X
  3062.    DEX
  3063.    BPL -
  3064.    LDX #FREE═EM╬EXT╨TR
  3065.    LDY #6
  3066.    JSR ZPSTORE
  3067.    CLC
  3068.    RTS
  3069.  
  3070. ;======== STANDARD LIBRARY ========
  3071.  
  3072. EPUTS = *
  3073.    LDX #STDERR
  3074.    JMP FPUTS
  3075. PUTS = *
  3076.    LDX #STDOUT
  3077. FPUTS = *
  3078.    STA ZP+0
  3079.    STY ZP+1
  3080. FPUTS┌P = *
  3081.    LDY #$FF
  3082. -  INY
  3083.    LDA (ZP),Y
  3084.    BNE -
  3085.    TYA
  3086.    LDY #0
  3087.    JMP WRITE
  3088.  
  3089. PUTCHAR = *
  3090.    LDX #STDOUT
  3091. PUTC = *
  3092.    STA PUTC┬UFFER
  3093.    LDA #<PUTC┬UFFER
  3094.    LDY #>PUTC┬UFFER
  3095.    STA ZP+0
  3096.    STY ZP+1
  3097.    LDA #1
  3098.    LDY #0
  3099.    JMP WRITE
  3100.    PUTC┬UFFER .BUF 1
  3101.  
  3102. GETARG = *
  3103.    STY ZP+1
  3104.    ASL
  3105.    STA ZP+0
  3106.    ROL ZP+1
  3107.    CLC
  3108.    LDA ACE┴RGV
  3109.    ADC ZP+0
  3110.    STA ZP+0
  3111.    LDA ACE┴RGV+1
  3112.    ADC ZP+1
  3113.    STA ZP+1
  3114.    LDY #0
  3115.    LDA (ZP),Y
  3116.    TAX
  3117.    INY
  3118.    LDA (ZP),Y
  3119.    STX ZP+0
  3120.    STA ZP+1
  3121.    LDA ZP+0
  3122.    LDY ZP+1
  3123.    RTS
  3124.  
  3125. ;END OF FILE + BLANK LINE
  3126.  
  3127.