home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-02-12 | 51.7 KB | 3,127 lines |
- ;** ASSEMBLER PROGRAM UTILITY FILE - BY ├RAIG ┬RUCE - 26-╙EP-1994
-
- ;======== ASSEMBLE PROCESSOR INSTRUCTION ========
-
- ; NUM BKT INS NUM BKT INS NUM BKT INS NUM BKT INS NUM BKT INS
- ; 00. XX. XXX 12. 63. BVC 24. 22. EOR 36. 20. PHA 48. 27. STA
- ; 01. 12. ADC 13. 15. BVS 25. 05. INC 37. 35. PHP 49. 50. STX
- ; 02. 63. AND 14. 38. CLC 26. 26. INX 38. 40. PLA 50. 51. STY
- ; 03. 00. ASL 15. 39. CLD 27. 27. INY 39. 55. PLP 51. 12. TAX
- ; 04. 00. BCC 16. 44. CLI 28. 06. JMP 40. 20. ROL 52. 13. TAY
- ; 05. 16. BCS 17. 57. CLV 29. 38. JSR 41. 26. ROR 53. 38. TSX
- ; 06. 24. BEQ 18. 24. CMP 30. 28. LDA 42. 10. RTI 54. 08. TXA
- ; 07. 47. BIT 19. 15. CPX 31. 51. LDX 43. 20. RTS 55. 26. TXS
- ; 08. 56. BMI 20. 16. CPY 32. 52. LDY 44. 03. SBC 56. 45. TYA
- ; 09. 25. BNE 21. 60. DEC 33. 24. LSR 45. 50. SEC
- ; 10. 42. BPL 22. 17. DEX 34. 52. NOP 46. 51. SED
- ; 11. 51. BRK 23. 18. DEY 35. 45. ORA 47. 56. SEI
-
- INSTR╬AMES = * ;NAMES OF INSTRUCTION, 3 CHARS EACH
- .ASC "XXXADCANDASLBCCBCSBEQBITBMIBNEBPLBRKBVCBVSCLCCLDCLICLVCMPCPXCPY"
- .ASC "DECDEXDEYEORINCINXINYJMPJSRLDALDXLDYLSRNOPORAPHAPHPPLAPLPROLROR"
- .ASC "RTIRTSSBCSECSEDSEISTASTXSTYTAXTAYTSXTXATXSTYA"
-
- INSTR╚ASH╨TRS = * ;POINTERS TO INSTRUCTION NUMBERS OR >=100=INDIRECTS
- ;BUCKETX0..X1..X2..X3..X4..X5..X6..X7..X8..X9
- .BYTE 100,000,000,044,000,025,028,000,054,000 ;BUCKETS 00-09
- .BYTE 042,000,103,052,000,106,109,022,023,000 ;BUCKETS 10-19
- .BYTE 112,000,024,000,116,009,120,124,030,000 ;BUCKETS 20-29
- .BYTE 000,000,000,000,000,037,000,000,127,015 ;BUCKETS 30-39
- .BYTE 038,000,010,000,016,131,000,007,000,000 ;BUCKETS 40-49
- .BYTE 134,137,142,000,000,039,145,017,000,000 ;BUCKETS 50-59
- .BYTE 021,000,000,148 ;BUCKETS 60-63
-
- INSTR╚ASH╔NDIRECTS = *
- .BYTE 004,003,000 ;OFF=100, BUCKET=00, INSTRS=BCC,ASL
- .BYTE 001,051,000 ;OFF=103, BUCKET=12, INSTRS=ADC,TAX
- .BYTE 019,013,000 ;OFF=106, BUCKET=15, INSTRS=CPX,BVS
- .BYTE 005,020,000 ;OFF=109, BUCKET=16, INSTRS=BCS,CPY
- .BYTE 043,036,040,000 ;OFF=112, BUCKET=20, INSTRS=RTS,PHA,ROL
- .BYTE 006,018,033,000 ;OFF=116, BUCKET=24, INSTRS=BEQ,CMP,LSR
- .BYTE 026,041,055,000 ;OFF=120, BUCKET=26, INSTRS=INX,ROR,TXS
- .BYTE 048,027,000 ;OFF=124, BUCKET=27, INSTRS=STA,INY
- .BYTE 029,014,053,000 ;OFF=127, BUCKET=38, INSTRS=JSR,CLC,TSX
- .BYTE 035,056,000 ;OFF=131, BUCKET=45, INSTRS=ORA,TYA
- .BYTE 049,045,000 ;OFF=134, BUCKET=50, INSTRS=STX,SEC
- .BYTE 031,050,011,046,000;OFF=137,BUCK=51, INSTRS=LDX,STY,BRK,SED
- .BYTE 032,034,000 ;OFF=142, BUCKET=52, INSTRS=LDY,NOP
- .BYTE 008,047,000 ;OFF=145, BUCKET=56, INSTRS=BMI,SEI
- .BYTE 002,012,000 ;OFF=148, BUCKET=63, INSTRS=AND,BVC
-
- PARSE╔D├HECK╔NSTR = * ;( .┴=INSTR╬UM╘O├HECK ) : .├╙=NOT╔NSTR, .┴+.╪:UNCH
- STA WORK
- ASL
- ADC WORK
- TAY
- LDA STRING┬UF+0
- CMP INSTR╬AMES+0,Y
- BNE +
- LDA STRING┬UF+1
- CMP INSTR╬AMES+1,Y
- BNE +
- LDA STRING┬UF+2
- CMP INSTR╬AMES+2,Y
- BNE +
- CLC
- LDA WORK
- RTS
- + SEC
- RTS
-
- INSTR = * ;( .┴=INSTR╬UM )
- ;** GOT INSTRUCTION NUMBER
- STA INSTR╬UM
- BIT ORIGIN╙ET
- BMI +
- LDA #ERR╧RIGIN╬OT╙ET
- JMP ERROR
- + BIT DEBUG
- BPL +
- STA NUMBER+0
- LDA #0
- STA NUMBER+1
- STA NUMBER+2
- STA NUMBER+3
- LDA #<INSTR═SG
- LDY #>INSTR═SG
- JSR PUTS
- LDX #NUMBER
- JSR PUTNUM
- LDA #CHR├╥
- JSR PUTCHAR
-
- ;** GET ADDRESSING MODE AND VALUE
- + JSR INSTR╟ET┴DDR═ODE
- BIT DEBUG
- BPL +++
- LDA INSTR┴DDR═ODE
- STA NUMBER+0
- LDA #0
- STA NUMBER+1
- STA NUMBER+2
- STA NUMBER+3
- LDA #<INSTR┴DDR═SG1
- LDY #>INSTR┴DDR═SG1
- JSR PUTS
- LDX #NUMBER
- JSR PUTNUM
- LDA #<INSTR┴DDR═SG2
- LDY #>INSTR┴DDR═SG2
- JSR PUTS
- LDA INSTR╓ALUE+0
- LDY INSTR╓ALUE+1
- STA NUMBER+0
- STY NUMBER+1
- LDA INSTR╓ALUE╘YPE
- BMI +
- LDX #NUMBER
- JSR PUTNUM
- JMP ++
- + LDA #"?"
- JSR PUTCHAR
- + LDA #CHR├╥
- JSR PUTCHAR
-
- ;** GET OPCODE FOR INSTR/ADDRMODE
- + NOP
- - LDA INSTR╬UM
- LDX INSTR┴DDR═ODE
- JSR INSTR╟ET╧PCODE
- BCC +
- LDX INSTR┴DDR═ODE
- LDA INSTR┴DMODE╨ROMOTE,X
- STA INSTR┴DDR═ODE
- BNE -
- LDA #ERR╫RONG┴DMODE
- JMP ERROR
- + BIT DEBUG
- BPL ++
- LDA #<INSTR├ODE═SG
- LDY #>INSTR├ODE═SG
- JSR PUTS
- LDA ADDRESS+1
- JSR PUTHEX
- LDA ADDRESS+0
- JSR PUTHEX
- LDA #":"
- JSR PUTCHAR
- LDA #" "
- JSR PUTCHAR
- LDA INSTR╧PCODE
- JSR PUTHEX
- LDA INSTR╠EN
- CMP #1
- BEQ +
- LDA #" "
- JSR PUTCHAR
- LDA INSTR╓ALUE+0
- JSR PUTHEX
- LDA INSTR╠EN
- CMP #2
- BEQ +
- LDA #" "
- JSR PUTCHAR
- LDA INSTR╓ALUE+1
- JSR PUTHEX
- + LDA #CHR├╥
- JSR PUTCHAR
-
- ;** STORE THE INSTRUCTION INTO MEMORY
- + LDA INSTR╧PCODE
- STA MEM╨UT╓ALS+0
- LDA INSTR╓ALUE+0
- LDY INSTR╓ALUE+1
- STA MEM╨UT╓ALS+1
- STY MEM╨UT╓ALS+2
- LDX ADDRESS+0
- LDY ADDRESS+1
- LDA INSTR╠EN
- JSR MEM╨UT
-
- ;** ADD RELOCATABLE REFERENCE
- LDA INSTR╓ALUE╘YPE
- BEQ ++
- CMP #$04
- BCS ++
- LDX ADDRESS+0
- LDY ADDRESS+1
- INX
- BNE +
- INY
- + JSR RECORD╥ELOC╥EF
-
- ;** INCREMENT ADDRESS AND FINISH
- + CLC
- LDA ADDRESS+0
- ADC INSTR╠EN
- STA ADDRESS+0
- BCC +
- INC ADDRESS+1
- BNE +
- LDA #ERR┴DDRESS╫RAP
- JMP ERROR
- + JMP PARSE┼ND
-
- INSTR═SG = *
- .ASC "GOT PROCESSOR INSTRUCTION="
- .BYTE 0
- INSTR┴DDR═SG1 = *
- .ASC "GOT ADDRESS MODE="
- .BYTE 0
- INSTR┴DDR═SG2 = *
- .ASC ", VALUE="
- .BYTE 0
- INSTR├ODE═SG = *
- .ASC "CODE = "
- .BYTE 0
- INSTR┴DMODE╨ROMOTE = *
- .BYTE $00,$00,$00,$00,$07,$08,$09,$00,$00,$00,$00,$00,$00
-
- ; NUM NAME GEN BYT TOKENS
- ; --- --------- --- --- -------
- ; 00. <NONE> 00. 0 <NONE>
- ; 01. IMPLIED 00. 1 ├╥
- ; 02. IMMEDIATE 00. 2 # / EXP8 / ├╥
- ; 03. RELATIVE 00. 2 EXP16 / ├╥
- ; 04. ZEROPAGE 07. 2 EXP8 / ├╥
- ; 05. ZP,X 08. 2 EXP8 / , / X / ├╥
- ; 06. ZP,Y 09. 2 EXP8 / , / Y / ├╥
- ; 07. ABSOLUTE 00. 3 EXP16 / ├╥
- ; 08. ABS,X 00. 3 EXP16 / , / X / ├╥
- ; 09. ABS,Y 00. 3 EXP16 / , / Y / ├╥
- ; 10. INDIRECT 00. 3 ( / EXP16 / ) / ├╥
- ; 11. (IND,X) 00. 2 ( / EXP8 / , / X / ) / ├╥
- ; 12. (IND),Y 00. 2 ( / EXP8 / ) / , / Y / ├╥
- ;
- ; ┴LL ZP MODES CAN BE PROMOTED TO ABS EXCEPT FOR ZP,Y FOR STX AND ZP,X FOR STY.
- ; ╔NDY MODE CAUSES SOME SPECIAL PROBLEMS--╔'LL HAVE TO PATCH THE HOLE.
-
- INSTR╟ET┴DDR═ODE = * ;( ADDRESS, INSTR╬UM ) : INSTR┴DDR═ODE, INSTR╓ALUE,
- LDA #$00 ; INSTR╓ALUE╘YPE
- STA INSTR╓ALUE+0
- STA INSTR╓ALUE+1
- STA INSTR╓ALUE╘YPE
- LDA TOKEN╬EXT├HAR
- CMP #"#"
- BEQ ADMODE╔MMEDIATE
- CMP #"("
- BEQ ADMODE╔NDIRECT
- CMP #CHR├╥
- BNE +
- JSR GET╘OKEN ;GET THE ├╥
- LDA #01 ;IMPLIED
- STA INSTR┴DDR═ODE
- RTS
- + LDA INSTR╬UM
- CMP #14
- BCS +
- CMP #4
- BCC +
- CMP #7
- BEQ +
- CMP #11
- BEQ +
- JMP ADMODE╥ELATIVE
- ;** ZP OR ABS, STRAIGHT OR INDEXED
- + LDA #0
- JSR ADMODE╚ANDLE┼XPR
- LDY #04 ;ZEROPAGE MODE
- CPX #1
- BEQ +
- LDY #07 ;ABSOLUTE MODE
- + STY INSTR┴DDR═ODE
- CMP #CHR├╥
- BNE +
- RTS
- + CMP #","
- BEQ +
- - JMP SYNTAX┼RROR
- + JSR ADMODE╟ET╪┘
- INC INSTR┴DDR═ODE
- CPX #0
- BEQ +
- INC INSTR┴DDR═ODE
- + CMP #CHR├╥
- BNE -
- RTS
-
- ADMODE╔MMEDIATE = *
- JSR GET╘OKEN ;GET THE "#"
- LDA #1
- JSR ADMODE╚ANDLE┼XPR
- CMP #CHR├╥
- BEQ +
- JMP SYNTAX┼RROR
- + LDA #02
- STA INSTR┴DDR═ODE
- RTS
-
- ADMODE╥ELATIVE = *
- LDA #2
- JSR ADMODE╚ANDLE┼XPR
- CMP #CHR├╥
- BEQ +
- JMP SYNTAX┼RROR
- + LDA #03
- STA INSTR┴DDR═ODE
- RTS
-
- ADMODE╔NDIRECT = *
- JSR GET╘OKEN ;GET THE "("
- LDA #0
- JSR PARSE┼XPRESSION
- CMP #","
- BEQ ADMODE╔ND╪
- CMP #")"
- BEQ +
- - JMP SYNTAX┼RROR
- + JSR GET╘OKEN
- LDX TOKEN╘YPE
- CPX #TOKEN╙PECIAL
- BNE -
- LDA TOKEN├HAR
- CMP #","
- BEQ ADMODE╔ND┘
- CMP #CHR├╥
- BNE -
- LDA #0
- STA ADMODE═UST┬E
- JSR ADMODE╚ANDLE┼XPR╔N
- LDA #10
- STA INSTR┴DDR═ODE
- RTS
-
- ADMODE╔ND╪ = *
- LDA #1
- STA ADMODE═UST┬E
- JSR ADMODE╚ANDLE┼XPR╔N
- JSR ADMODE╟ET╪┘
- CPX #0
- BEQ +
- - JMP SYNTAX┼RROR
- + CMP #")"
- BNE -
- JSR GET╘OKEN
- CPX #TOKEN╙PECIAL
- BNE -
- CMP #CHR├╥
- BNE -
- LDA #11
- STA INSTR┴DDR═ODE
- RTS
-
- ADMODE╔ND┘ = *
- LDA #1
- STA ADMODE═UST┬E
- JSR ADMODE╚ANDLE┼XPR╔N
- JSR ADMODE╟ET╪┘
- CPX #1
- BEQ +
- - JMP SYNTAX┼RROR
- + CMP #CHR├╥
- BNE -
- LDA #12
- STA INSTR┴DDR═ODE
- RTS
-
- ADMODE╟ET╪┘ = * ;( .╪=TOKEN╘YPE, TOKEN ) : .┴=SPECIAL├HAR, .╪=0:X/1:Y
- JSR GET╘OKEN
- LDX TOKEN╘YPE
- CPX #TOKEN╔DENTIFIER
- BEQ +
- - JMP SYNTAX┼RROR
- + LDA STRING╠EN
- CMP #1
- BNE -
- LDA STRING┬UF+0
- LDY #0
- CMP #"X"
- BEQ +
- INY
- CMP #"Y"
- BNE -
- + TYA
- PHA
- JSR GET╘OKEN
- LDX TOKEN╘YPE
- CPX #TOKEN╙PECIAL
- BNE -
- PLA
- TAX
- LDA TOKEN├HAR
- RTS
-
- ADMODE═UST┬E .BUF 1
- ADMODE├HAR .BUF 1
- ADMODE╚OLE .BUF 1
-
- ADMODE╚ANDLE┼XPR = * ;( .┴=1:BYTE+2:REL, ADDRESS ) : .┴=NEXT├HAR, .╪=VAL┬YTES,
- STA ADMODE═UST┬E ; INSTR╓ALUE, INSTR╓ALUE╘YPE
- LDA #0
- JSR PARSE┼XPRESSION
- STA ADMODE├HAR
-
- ADMODE╚ANDLE┼XPR╔N = *
- JSR EVALUATE┼XPRESSION
- LDA ID╓AL+0
- LDY ID╓AL+1
- STA INSTR╓ALUE+0
- STY INSTR╓ALUE+1
- LDA ID╘YPE
- STA INSTR╓ALUE╘YPE
- BCS ADMODE┼XPR╚OLE
- LDA ID╓AL+2
- ORA ID╓AL+3
- BEQ +
- - LDA #ERR╓ALUE╘OO╠ARGE
- JMP ERROR
- + LDA ADMODE═UST┬E
- BNE ++
- LDX #2
- LDA INSTR╓ALUE+1
- BNE +
- - LDX #1
- + LDA ADMODE├HAR
- RTS
- + CMP #1 ;MUST BE BYTE
- BNE +
- LDA INSTR╓ALUE+1
- BNE --
- BEQ -
- + CLC ;MUST BE RELATIVE
- LDA ADDRESS+0
- ADC #2
- STA WORK+14
- LDA ADDRESS+1
- ADC #0
- STA WORK+15
- SEC
- LDA INSTR╓ALUE+0
- SBC WORK+14
- STA INSTR╓ALUE+0
- TAX
- LDA INSTR╓ALUE+1
- SBC WORK+15
- STA INSTR╓ALUE+1
- CMP #0
- BNE +
- CPX #128
- BCC ++
- - LDA #ERR┬RANCH╘OO╞AR
- JMP ERROR
- + CMP #$FF
- BNE -
- CPX #128
- BCC -
- + LDA #0
- STA INSTR╓ALUE+1
- LDX #1
- LDA ADMODE├HAR
- RTS
-
- ADMODE┼XPR╚OLE = *
- ;** GET PRESUMED HOLE TYPE
- LDA #$02 ;HOLE╘YPE=WORD
- LDX ADMODE═UST┬E
- BEQ +
- LDA #$01 ;HOLE╘YPE=BYTE
- CPX #1
- BEQ +
- LDA #$40 ;HOLE╘YPE=BRANCH
- ;** CHECK FOR SPECIAL CASES OF "STX ZP,Y" AND "STY ZP,X" WHICH MUST BE ZP
- + CMP #$02
- BNE +
- LDX INSTR╬UM
- CPX #49 ;INSTR.49==STX
- BCC +
- CPX #50+1 ;INSTR.50==STY
- BCS +
- LDX ADMODE├HAR
- CPX #","
- BNE +
- LDA #$01 ;IS ONE OF SPECIALS, SO HOLE MUST BE 8-BITS
- ;** RECORD THE HOLE
- + PHA
- TAX
- LDA #1
- JSR ADD═EMORY╚OLE
- ;** GET THE RETURN VALUES
- PLA
- CMP #$40
- BNE +
- LDA #1
- + TAX
- LDY #$80
- STY INSTR╓ALUE╘YPE
- LDY #$00
- STY INSTR╓ALUE+0
- STY INSTR╓ALUE+1
- LDA ADMODE├HAR
- RTS
-
- ;TAKEN FROM ═IGHTY ═ON 4.0: INSTR# + ADDR═ODE -> OPCODE CONVERSION + LENGTH
-
- OPCODE┬ASE = WORK+14
- OPCODE┴DMODE╬UM = WORK+15
-
- INSTR╟ET╧PCODE = * ;( .┴=INSTR#, .╪=ADDR═ODE ) : INSTR╧PCODE, INSTR╠EN, .├╙=INV
- TAY ;.$DA4B [A8 ] TAY
- LDA OPCODE┬ASE╘AB,Y ;.$DA4C [B9 55 C2] LDA $C255,Y
- STA OPCODE┬ASE ;.$DA4F [85 48 ] STA $48
- STX OPCODE┴DMODE╬UM ;.$DA51 [86 49 ] STX $49
- LDA OPCODE┴DMODE╘AB,Y ;.$DA53 [B9 8D C2] LDA $C28D,Y
- BMI ++ ;.$DA56 [30 0E ] BMI $DA66
- CMP OPCODE┴DMODE╬UM ;.$DA58 [C5 49 ] CMP $49
- BNE + ;.$DA5A [D0 08 ] BNE $DA64
- LDA OPCODE╠EN╘AB,X ;.$DA5C [BD 6C C3] LDA $C36C,X
- TAX ;.$DA5F [AA ] TAX
- LDA OPCODE┬ASE ;.$DA60 [A5 48 ] LDA $48
- STA INSTR╧PCODE ;
- STX INSTR╠EN ;
- CLC ;.$DA62 [18 ] CLC
- RTS ;.$DA63 [60 ] RTS
- + NOP ;
- - SEC ;.$DA64 [38 ] SEC
- RTS ;.$DA65 [60 ] RTS
- ;
- + AND #$7F ;.$DA66 [29 7F ] AND #$7F
- TAY ;.$DA68 [A8 ] TAY
- LDA OPCODE╧R╧FF╘AB,Y ;.$DA69 [B9 60 C3] LDA $C360,Y
- CLC ;.$DA6C [18 ] CLC
- ADC OPCODE┴DMODE╬UM ;.$DA6D [65 49 ] ADC $49
- TAY ;.$DA6F [A8 ] TAY
- DEY ; <THE AD MODES START FROM 1 NOT 0 LIKE IN MM4>
- LDA OPCODE╧R═ASK╘AB,Y ;.$DA70 [B9 D2 C2] LDA $C2D2,Y
- BMI - ;.$DA73 [30 EF ] BMI $DA64
- ORA OPCODE┬ASE ;.$DA75 [05 48 ] ORA $48
- TAY ;.$DA77 [A8 ] TAY
- LDA OPCODE╠EN╘AB,X ;.$DA78 [BD 6C C3] LDA $C36C,X
- TAX ;.$DA7B [AA ] TAX
- TYA ;.$DA7C [98 ] TYA
- STA INSTR╧PCODE ;
- STX INSTR╠EN ;
- CLC ;.$DA7D [18 ] CLC
- RTS ;.$DA7E [60 ] RTS
-
- OPCODE┬ASE╘AB = *
- .BYTE $00,$61,$21,$02,$90,$B0,$F0,$24,$30,$D0,$10,$00,$50,$70,$18,$D8
- .BYTE $58,$B8,$C1,$E0,$C0,$C6,$CA,$88,$41,$E6,$E8,$C8,$4C,$20,$A1,$A2
- .BYTE $A0,$42,$EA,$01,$48,$08,$68,$28,$22,$62,$40,$60,$E1,$38,$F8,$78
- .BYTE $81,$86,$84,$AA,$A8,$BA,$8A,$9A,$98
-
- OPCODE┴DMODE╘AB = *
- .BYTE $00,$81,$81,$82,$03,$03,$03,$83,$03,$03,$03,$01,$03,$03,$01,$01
- .BYTE $01,$01,$81,$84,$84,$85,$01,$01,$81,$85,$01,$01,$86,$07,$81,$87
- .BYTE $88,$82,$01,$81,$01,$01,$01,$01,$82,$82,$01,$01,$81,$01,$01,$01
- .BYTE $89,$8A,$8B,$01,$01,$01,$01,$01,$01
-
- OPCODE╠EN╘AB = *
- .BYTE $00,$01,$02,$02,$02,$02,$02,$03,$03,$03,$03,$02,$02
-
- OPCODE╧R╧FF╘AB = *
- .BYTE 0,0,12,24,36,48,60,72,84,96,108,120
-
- OPCODE╧R═ASK╘AB = *
- ; 01 02 03 04 05 06 07 08 09 10 11 12 : ADDR═ODE
- ; -- -- -- -- -- -- -- -- -- -- -- -- <IF COMPRESSED>
- .BYTE $80,$08,$80,$04,$14,$80,$0C,$1C,$18,$80,$00,$10 ;[TRIM:1+0=1] [ADD=2]
- .BYTE $08,$80,$80,$04,$14,$80,$0C,$1C,$80,$80,$80,$80 ;[TRIM:0+4=4] [ADD=2]
- .BYTE $80,$80,$80,$04,$80,$80,$0C,$80,$80,$80,$80,$80 ;[TRIM:3+5=8] [ADD=2]
- .BYTE $80,$00,$80,$04,$80,$80,$0C,$80,$80,$80,$80,$80 ;[TRIM:1+5=6] [ADD=2]
- .BYTE $80,$80,$80,$04,$14,$80,$0C,$1C,$80,$80,$80,$80 ;[TRIM:3+4=7] [ADD=2]
- .BYTE $80,$80,$80,$80,$80,$80,$00,$80,$80,$20,$80,$80 ;[TRIM:6+2=8] [ADD=2]
- .BYTE $80,$00,$80,$04,$80,$14,$0C,$80,$1C,$80,$80,$80 ;[TRIM:1+3=4] [ADD=2]
- .BYTE $80,$00,$80,$04,$14,$80,$0C,$1C,$80,$80,$80,$80 ;[TRIM:1+4=5] [ADD=2]
- .BYTE $80,$80,$80,$04,$14,$80,$0C,$1C,$18,$80,$00,$10 ;[TRIM:3+0=3] [ADD=2]
- .BYTE $80,$80,$80,$04,$80,$14,$0C,$80,$80,$80,$80,$80 ;[TRIM:3+5=8] [ADD=2]
- .BYTE $80,$80,$80,$04,$14,$80,$0C,$80,$80,$80,$80,$80 ;[TRIM:3+5=8] [ADD=2]
-
- ;======== EXPRESSION HANDLING ========
-
- PARSE┼XPR╘YPE .BUF 1
-
- PARSE┼XPRESSION = * ;( .┴=TYPE(0=NUM,1=EITHER) ) : .┴=NEXT╙PECIAL├HAR,.╪=TYPE
- STA PARSE┼XPR╘YPE
- LDX #16
- STX EXP╧FFSET
- LDA #"+"
- STA EXP╧P+0,X
- LDX #3
- - LDA #0
- STA EXP╚OLE╘YPE,X
- LDA #ACE═EM╬ULL
- STA EXP╚OLE┴DDR,X
- LDA SOURCE╠INE,X
- STA EXP╙RC╠INE,X
- LDA FILE╨TR,X
- STA EXP╙RC╞ILE,X
- DEX
- BPL -
- LDA SOURCE├OL
- STA EXP╙RC├OL
- BIT DEBUG
- BPL EXP╟ET╧PERAND
- LDA #<PARSE┼XPR═SG
- LDY #>PARSE┼XPR═SG
- JSR PUTS
-
- ;** EXPECTING OPERAND
- EXP╟ET╧PERAND = *
- LDA #0
- STA EXP╨LUS├OUNT
- STA EXP═INUS├OUNT
- STA EXP╠ESS├OUNT
- STA EXP╟REATER├OUNT
- EXP╟ET╧PERAND├ONT = *
- LDX EXP╧FFSET
- LDA #0
- STA EXP╥ESERVED,X
- JSR GET╘OKEN
- CPX #TOKEN╙PECIAL
- BNE EXP╬OT╙PECIAL
- LDA TOKEN├HAR
- CMP #"+"
- BNE +
- INC EXP╨LUS├OUNT
- JMP EXP╟ET╧PERAND├ONT
- + CMP #"-"
- BNE +
- INC EXP═INUS├OUNT
- JMP EXP╟ET╧PERAND├ONT
- + CMP #">"
- BNE +
- INC EXP╟REATER├OUNT
- JMP EXP╟ET╧PERAND├ONT
- + CMP #"<"
- BNE +
- INC EXP╠ESS├OUNT
- JMP EXP╟ET╧PERAND├ONT
- + CMP #"*"
- BNE +
- JMP EXP╧PN╙TAR
- + JMP EXP╧PN╥ELATIVE
-
- EXP╬OT╙PECIAL = *
- LDX EXP╧FFSET
- LDA EXP═INUS├OUNT
- AND #$01
- LSR
- ROR
- STA EXP╙IGN,X
- JSR EXP╞IGURE╚I╠O
- STA EXP╚I╠O,X
- LDA #$00
- STA EXP╘YPE,X
- LDX TOKEN╘YPE
- CPX #TOKEN╔DENTIFIER
- BNE +
- LDA #0
- JMP EXP╧PN╔DENTIFIER
- + CPX #TOKEN╬UMBER
- BNE +
- JMP EXP╧PN╬UMBER
- + CPX #TOKEN╙TRING
- BNE +
- JMP EXP╧PN╙TRING
- + JMP SYNTAX┼RROR
- PARSE┼XPR═SG = *
- .ASC "...MUST PARSE AN EXPRESSION..."
- .BYTE CHR├╥,0
-
- ;"┴STEROIDS DO NOT CONCERN ME, ┴DMIRAL. ╔ WANT THAT SHIP, NOT EXCUSES!"
- ;"═UDHOLE!? ╙LIMY!!? ═Y HOME, THIS IS!"
-
- EXP╞IGURE╚I╠O╫ORK .BUF 1
-
- EXP╞IGURE╚I╠O = * ; ( ) : .┴=╚I╠O_VALUE ;.╪:UNCHANGED
- LDA EXP╟REATER├OUNT
- CMP #16
- BCC +
- LDA #15
- + ASL
- ASL
- ASL
- ASL
- STA EXP╞IGURE╚I╠O╫ORK
- LDA EXP╠ESS├OUNT
- CMP #2
- BCC +
- LDA #1
- + ORA EXP╞IGURE╚I╠O╫ORK
- RTS
-
- EXP╧PN╥EL┼XIT .BUF 1 ;WHETHER TO EXIT EXP AFTER RELATIVE REF.
-
- EXP╧PN╥ELATIVE = *
- LDX #0
- CMP #":"
- BEQ +
- LDX #$FF
- + STX EXP╧PN╥EL┼XIT
- LDA EXP╨LUS├OUNT ;THERE MUST BE SOME PLUSES OR MINUSES
- ORA EXP═INUS├OUNT
- BNE +
- JMP SYNTAX┼RROR
- + JSR EXP╞IGURE╚I╠O
- LDX EXP╧FFSET
- STA EXP╚I╠O,X
- LDA #0
- STA EXP╙IGN,X
- LDA #"+"
- LDY EXP╨LUS├OUNT
- BEQ +
- LDX EXP═INUS├OUNT
- BEQ ++
- JMP SYNTAX┼RROR
- + LDA #"-"
- LDY EXP═INUS├OUNT
- BNE +
- JMP SYNTAX┼RROR
- + DEY
- JSR GEN╥EL╠ABEL
- LDA EXP╧PN╥EL┼XIT
- ;** FALL THROUGH
-
- EXP╧PN╔DENTIFIER = *
- PHA
- JSR FIND╙YMBOL
- LDX EXP╧FFSET
- LDA ID╘YPE
- CMP #$81
- BCC +
- CMP #$FF
- BEQ +
- LDA #ERR╬ON╬UM╔D┼XPR
- JMP ERROR
- + STA EXP╘YPE,X
- LDY #0
- CMP #$80
- BCS +
- - LDA ID╓AL,Y
- STA EXP╓ALUE,X
- INX
- INY
- CPY #4
- BCC -
- PLA
- JMP EXP╟ET╧PERATOR
- + INC EXP╒NRES├NT
- - LDA ID╨TR,Y
- STA EXP╓ALUE,X
- INX
- INY
- CPY #4
- BCC -
- PLA
- JMP EXP╟ET╧PERATOR
-
- EXP╧PN╙TAR = *
- BIT ORIGIN╙ET
- BMI +
- LDA #ERR╧RIGIN╬OT╙ET
- JMP ERROR
- + LDX EXP╧FFSET
- LDA EXP═INUS├OUNT
- AND #$01
- LSR
- ROR
- STA EXP╙IGN,X
- JSR EXP╞IGURE╚I╠O
- STA EXP╚I╠O,X
- LDA #$01
- STA EXP╘YPE,X
- LDA ADDRESS+0
- STA EXP╓ALUE+0,X
- LDA ADDRESS+1
- STA EXP╓ALUE+1,X
- LDA #0
- STA EXP╓ALUE+2,X
- STA EXP╓ALUE+3,X
- LDA #0
- JMP EXP╟ET╧PERATOR
-
- EXP╧PN╬UMBER = *
- LDX EXP╧FFSET
- LDA #$00
- STA EXP╘YPE,X
- LDY #0
- - LDA NUMBER,Y
- STA EXP╓ALUE,X
- INX
- INY
- CPY #4
- BCC -
- LDA #0
- JMP EXP╟ET╧PERATOR
-
- EXP╧PN╙TRING = *
- LDA STRING╠EN
- CMP #1
- BNE +
- ;** INTERPRET STRING AS NUMBER
- LDX EXP╧FFSET
- LDA #$00
- STA EXP╘YPE,X
- LDA STRING┬UF+0
- STA EXP╓ALUE+0,X
- LDA #0
- STA EXP╓ALUE+1,X
- STA EXP╓ALUE+2,X
- STA EXP╓ALUE+3,X
- LDA #0
- JMP EXP╟ET╧PERATOR
-
- ;** INTERPRET STRING AS ACTUAL STRING
- + LDA EXP╨LUS├OUNT
- ORA EXP═INUS├OUNT
- ORA EXP╠ESS├OUNT
- ORA EXP╟REATER├OUNT
- BEQ +
- - LDA #ERR╔NVAL╙TR╧PERS
- JMP ERROR
- + LDA EXP╧FFSET
- CMP #16
- BNE -
- LDA PARSE┼XPR╘YPE
- BNE +
- - JMP SYNTAX┼RROR
- + JSR GET╘OKEN
- CPX #TOKEN╙PECIAL
- BNE -
- + LDX #$80
- RTS
-
- EXP╟ET╧PERATOR = * ;(.┴=EXIT╞LAG)
- PHA
- CLC
- LDA EXP╧FFSET
- ADC #14
- STA EXP╧FFSET
- BCC +
- LDA #ERR╘OO═ANY╧PERANDS
- JMP ERROR
- + PLA
- CMP #0
- BEQ +
- - LDX EXP╧FFSET
- TXA
- STA EXP╠ENGTH
- LDA SOURCE├OL
- STA EXP╙RC├OL
- LDA TOKEN├HAR
- LDX #0
- RTS
- + JSR GET╘OKEN
- LDX TOKEN╘YPE
- CPX #TOKEN╙PECIAL
- BEQ +
- JMP SYNTAX┼RROR
- + LDA TOKEN├HAR
- CMP #"+"
- BEQ +
- CMP #"-"
- BNE -
- + LDX EXP╧FFSET
- STA EXP╧P,X
- JMP EXP╟ET╧PERAND
-
- EVALUATE┼XPRESSION = * ;( EXP╘ABLE ) : .├╙=UNRESOLVED, ID╓AL, ID╘YPE
- LDX #3
- LDA #0
- - STA ID╓AL,X
- DEX
- BPL -
- STA ID╘YPE
- LDA EXP╒NRES├NT
- BEQ +
- LDA #$80
- STA ID╘YPE
- SEC
- RTS
- + LDX #16
- STX EXP╧FFSET
-
- EVAL╬EXT = *
- LDX EXP╧FFSET
- LDA EXP╘YPE,X
- EOR ID╘YPE ;(+-:VAL+VAL=VAL,ADR+VAL=ADR,VAL+ADR=ADR,ADR+ADR=VAL)
- STA ID╘YPE
- LDY #$00
- - LDA EXP╓ALUE,X
- STA NUMBER,Y
- INX
- INY
- CPY #4
- BCC -
- LDX EXP╧FFSET
- LDA EXP╙IGN,X
- BPL +
- JSR EVAL╬EGATE
- + LDX EXP╧FFSET
- CPX #16
- BEQ +
- LDA EXP╚I╠O,X
- BEQ +
- JSR EVAL╚I╠O
- + LDX EXP╧FFSET
- LDA EXP╧P,X
- CMP #"+"
- BEQ +
- JSR EVAL╬EGATE
- ;** PERFORM ADDITION
- + CLC
- LDY #4
- LDX #0
- - LDA ID╓AL,X
- ADC NUMBER,X
- STA ID╓AL,X
- INX
- DEY
- BNE -
- ;** GO ONTO NEXT OPERATION
- CLC
- LDA EXP╧FFSET
- ADC #14
- STA EXP╧FFSET
- CMP EXP╠ENGTH
- BCC EVAL╬EXT
- ;** CHECK GLOBAL HI-LO
- LDA EXP╚I╠O+16
- BEQ +
- LDX #3
- - LDA ID╓AL,X
- STA NUMBER,X
- DEX
- BPL -
- LDA EXP╚I╠O+16
- JSR EVAL╚I╠O
- LDX #3
- - LDA NUMBER,X
- STA ID╓AL,X
- DEX
- BPL -
- + CLC
- BIT DEBUG
- BMI +
- RTS
- + LDA #<EVAL═SG
- LDY #>EVAL═SG
- JSR PUTS
- LDX #ID╓AL
- JSR PUTNUM
- LDA #","
- JSR PUTCHAR
- LDA #" "
- JSR PUTCHAR
- LDA #"V"
- LDX ID╘YPE
- BEQ +
- LDA #"A"
- + JSR PUTCHAR
- LDA #CHR├╥
- JSR PUTCHAR
- CLC
- RTS
- EVAL═SG = *
- .ASC "EVALUATE: RESULT="
- .BYTE 0
-
- EVAL╬EGATE = * ;( NUMBER ) : -NUMBER
- SEC
- LDY #4
- LDX #0
- - LDA #0
- SBC NUMBER,X
- STA NUMBER,X
- INX
- DEY
- BNE -
- RTS
-
- EVAL╚I╠O├NT .BUF 1
-
- EVAL╚I╠O = *
- ;VALUE $10 WILL EXTRACT HIGH BYTE OF ADDR, $01 WILL EXTRACT LOW BYTE
- PHA
- LSR
- LSR
- LSR
- LSR
- TAX
- BEQ +
- - LDA NUMBER+1
- STA NUMBER+0
- LDA NUMBER+2
- STA NUMBER+1
- LDA NUMBER+3
- STA NUMBER+2
- LDA #$00
- STA NUMBER+3
- DEX
- BNE -
- + PLA
- AND #$0F
- BEQ +
- LDX #0
- STX NUMBER+3
- STX NUMBER+2
- STX NUMBER+1
- + RTS
-
- ;======== SYMBOL TABLE MANAGEMENT ========
-
- FIND╙YMBOL = * ;( STRING┬UF, STRING╠EN ) : .┴=CODE,ID╨TR,ID╓AL
- ;** RET: CODE .┴=(SYM╞OUND,SYM╒NRESOLVED,SYM╬EW)
- JSR HASH
- LDY #3
- - LDA (HASH╨TR),Y
- STA MP,Y
- DEY
- BPL -
- FIND╙YM╬EXT = *
- LDA MP+3
- CMP #ACE═EM╬ULL
- BNE +
- JMP FIND╙YM├REATE
- + LDA #<SYM┬UF
- LDY #>SYM┬UF
- STA ZP+0
- STY ZP+1
- LDA #12+8+1
- LDY #0
- JSR FETCH
- LDA SYM╬AME╠EN
- CMP STRING╠EN
- BNE FIND╙YM├ONT
- CMP #8+1
- BCC +
- CLC
- ADC #12+1
- LDY #0
- JSR FETCH
- + LDX #0
- - LDA STRING┬UF,X
- BEQ +
- CMP SYM╬AME,X
- BNE FIND╙YM├ONT
- INX
- BNE -
- + LDX #3
- - LDA MP,X
- STA ID╨TR,X
- LDA SYM╓ALUE,X
- STA ID╓AL,X
- DEX
- BPL -
- LDA SYM╘YPE
- STA ID╘YPE
- LDA #SYM╞OUND
- BIT SYM╘YPE
- BPL +
- LDA #SYM╒NRESOLVED
- + RTS
-
- FIND╙YM├ONT = *
- LDX #3
- - LDA SYM╬EXT,X
- STA MP,X
- DEX
- BPL -
- JMP FIND╙YM╬EXT
-
- FIND╙YM├REATE = *
- LDA #$80
- STA SYM╘YPE
- STA ID╘YPE
- LDA #$00
- STA SYM├LASS
- STA SYM╒NRES╧PND
- LDA STRING╠EN
- STA SYM╬AME╠EN
- LDX #0
- - LDA STRING┬UF,X
- STA SYM╬AME,X
- BEQ +
- INX
- BNE -
- + CLC
- LDA #12+1
- ADC SYM╬AME╠EN
- LDY #0
- JSR MALLOC
- BCC +
- LDA #ERR╔NSUFFICIENT═EMORY
- JMP ERROR
- + LDY #3
- - LDA #ACE═EM╬ULL
- STA SYM╓ALUE,Y
- LDA #0
- STA ID╓AL,Y
- LDA (HASH╨TR),Y
- STA SYM╬EXT,Y
- LDA MP,Y
- STA ID╨TR,Y
- STA (HASH╨TR),Y
- DEY
- BPL -
- JSR STASH╙YMBOL
- LDA #SYM╬EW
- RTS
-
- FETCH╙YMBOL = * ;( [MP] ) : SYM┬UF
- LDA #<SYM┬UF
- LDY #>SYM┬UF
- STA ZP+0
- STY ZP+1
- LDA #12+8+1
- LDY #0
- JSR FETCH
- LDA SYM╬AME╠EN
- CMP #8+1
- BCC +
- CLC
- ADC #12+1
- LDY #0
- JSR FETCH
- + RTS
-
- FETCH╙YMBOL╚EADER = * ;( [MP] ) : SYM┬UF (HEADER)
- LDA #<SYM┬UF
- LDY #>SYM┬UF
- STA ZP+0
- STY ZP+1
- LDA #12
- LDY #0
- JSR FETCH
- RTS
-
- STASH╙YMBOL = * ;( SYM┬UF, [MP] )
- LDA #<SYM┬UF
- LDY #>SYM┬UF
- STA ZP+0
- STY ZP+1
- CLC
- LDA #12+1
- ADC SYM╬AME╠EN
- LDY #0
- JSR STASH
- RTS
-
- STASH╙YMBOL╚EADER = * ;( SYM┬UF(HEADER), [MP] )
- LDA #<SYM┬UF
- LDY #>SYM┬UF
- STA ZP+0
- STY ZP+1
- LDA #12
- LDY #0
- JSR STASH
- RTS
-
- INIT╙YMBOL╘ABLE = *
- LDA #<IDENT╚ASH╘ABLE
- LDY #>IDENT╚ASH╘ABLE
- LDX #HASH╘ABLE╨AGES
- ;** FALL THROUGH
-
- FILL╬ULL = *
- STA WORK+0
- STY WORK+1
- LDY #0
- LDA #ACE═EM╬ULL
- - STA (WORK),Y
- INY
- BNE -
- INC WORK+1
- DEX
- BNE -
- RTS
-
- FIND╒NRES╙YMBOL = *
- ;** FETCHES SYMBOL AND REFERENCE
- LDA #$80
- STA DUMP╙YM╧PT
- JMP DUMP╙YMBOL╘ABLE╔N
- FOUND╒NRES╙YMBOL = *
- LDX #3
- - LDA SYM╓ALUE,X
- STA EXP╨TR,X
- DEX
- BPL -
- JSR FETCH┼XP
- RTS
-
- DUMP╙YM┼NTRIES .BUF 2
- DUMP╙YM╧PT .BUF 1
- DUMP├OUNT = ID╓AL
-
- DUMP╙YMBOL╘ABLE = *
- LDA #$00
- STA DUMP╙YM╧PT
- LDX #3
- - STA DUMP├OUNT,X
- DEX
- BPL -
- BIT SYM─UMP
- BMI +
- RTS
- + LDA #<DUMP╙YM═SG1
- LDY #>DUMP╙YM═SG1
- JSR PUTS
- DUMP╙YMBOL╘ABLE╔N = *
- LDA #<IDENT╚ASH╘ABLE
- LDY #>IDENT╚ASH╘ABLE
- STA HASH╨TR+0
- STY HASH╨TR+1
- LDA #0
- LDY #HASH╘ABLE┼NTRIES╚IGH
- STA DUMP╙YM┼NTRIES+0
- STY DUMP╙YM┼NTRIES+1
- - JSR DUMP╙YM┬UCKET
- CLC
- LDA HASH╨TR+0
- ADC #4
- STA HASH╨TR+0
- BCC +
- INC HASH╨TR+1
- + INC DUMP╙YM┼NTRIES+0
- BNE -
- DEC DUMP╙YM┼NTRIES+1
- BNE -
- LDA #<DUMP╙YM═SG2
- LDY #>DUMP╙YM═SG2
- JSR PUTS
- LDX #DUMP├OUNT
- JSR PUTNUM
- LDA #CHR├╥
- JSR PUTCHAR
- RTS
-
- DUMP╙YM┬UCKET = *
- LDY #3
- - LDA (HASH╨TR),Y
- STA MP,Y
- DEY
- BPL -
- - LDA MP+3
- CMP #ACE═EM╬ULL
- BNE +
- RTS
- + JSR FETCH╙YMBOL
- JSR DUMP╙YMBOL
- LDX #3
- - LDA SYM╬EXT,X
- STA MP,X
- DEX
- BPL -
- JMP --
-
- DUMP╙YMBOL = *
- BIT DUMP╙YM╧PT
- BPL ++
- LDA SYM╘YPE
- CMP #$80
- BEQ +
- CMP #$FF
- BNE ++
- + PLA ;** POP CALL FROM DUMP╙YM┬UCKET
- PLA
- PLA ;** POP CALL FROM DUMP╙YMBOL╘ABLE
- PLA
- JMP FOUND╒NRES╙YMBOL
- + LDX #DUMP├OUNT
- JSR INC╠ONG
- LDA #0
- STA NUMBER+2
- STA NUMBER+3
- SEC
- LDA HASH╨TR+0
- SBC #<IDENT╚ASH╘ABLE
- STA NUMBER+0
- LDA HASH╨TR+1
- SBC #>IDENT╚ASH╘ABLE
- STA NUMBER+1
- LSR NUMBER+1
- ROR NUMBER+0
- LSR NUMBER+1
- ROR NUMBER+0
- LDX #NUMBER
- LDY #4
- JSR WPUTNUM
- LDA #2
- JSR SPACE
- LDX #3
- - LDA SYM╓ALUE,X
- STA NUMBER,X
- DEX
- BPL -
- LDA NUMBER+3
- JSR PUTHEX
- LDA NUMBER+2
- JSR PUTHEX
- LDA NUMBER+1
- JSR PUTHEX
- LDA NUMBER+0
- JSR PUTHEX
- LDA #1
- JSR SPACE
- LDX #NUMBER
- LDY #10
- JSR WPUTNUM
- LDA #2
- JSR SPACE
- LDA #"V"
- LDX SYM╘YPE
- BEQ +
- LDA #"A"
- BIT SYM╘YPE
- BPL +
- LDA #"?"
- + JSR PUTCHAR
- LDA #2
- JSR SPACE
- LDA #<SYM╬AME
- LDY #>SYM╬AME
- JSR PUTS
- LDA #CHR├╥
- JSR PUTCHAR
- JSR CHECK╙TOP
- RTS
-
- SPACE├OUNT .BUF 1
-
- SPACE = *
- STA SPACE├OUNT
- - LDA #" "
- JSR PUTCHAR
- DEC SPACE├OUNT
- BNE -
- RTS
-
- DUMP╙YM═SG1 = *
- .ASC "╚┴╙╚ ╚┼╪╓┴╠╒┼ ─┼├╔═┴╠ ╘ ╬┴═┼"
- .BYTE CHR├╥
- .ASC "---- -------- ---------- - -----"
- .BYTE CHR├╥,0
- DUMP╙YM═SG2 = *
- .ASC "--"
- .BYTE CHR├╥
- .ASC "╬UMBER OF SYMBOLS: "
- .BYTE 0
- ;1234567890123456789012345678901234567890
-
- HASH╫ORK .BUF 2
-
- HASH = *
- LDA #$AA
- STA HASH╓AL+0
- STA HASH╓AL+1
- LDX #0
- - LDA STRING┬UF,X
- BNE +
- LDA HASH╓AL+0
- STA HASH╨TR+0
- LDA HASH╓AL+1
- AND #HASH╘ABLE═ASK
- ASL HASH╨TR+0
- ROL
- ASL HASH╨TR+0
- ROL
- STA HASH╨TR+1
- CLC
- LDA HASH╨TR+0
- ADC #<IDENT╚ASH╘ABLE
- STA HASH╨TR+0
- LDA HASH╨TR+1
- ADC #>IDENT╚ASH╘ABLE
- STA HASH╨TR+1
- RTS
- ;** HASH╓AL := HASH╓AL * 37;
- + LDA HASH╓AL+0
- LDY HASH╓AL+1
- STA HASH╫ORK+0
- STY HASH╫ORK+1
- ASL ;TIMES 2
- ROL HASH╓AL+1
- ASL ;TIMES 4
- ROL HASH╓AL+1
- ASL ;TIMES 8
- ROL HASH╓AL+1
- JSR HASH┴DD╫ORK ;TIMES 9
- ASL ;TIMES 18
- ROL HASH╓AL+1
- ASL ;TIMES 36
- ROL HASH╓AL+1
- JSR HASH┴DD╫ORK ;TIMES 37
- ADC STRING┬UF,X
- STA HASH╓AL+0
- BCC +
- INC HASH╓AL+1
- + INX
- BNE -
-
- HASH┴DD╫ORK = *
- CLC
- ADC HASH╫ORK+0
- STA HASH╓AL+0
- LDA HASH╓AL+1
- ADC HASH╫ORK+1
- STA HASH╓AL+1
- LDA HASH╓AL+0
- RTS
-
- ;======== SYMBOLS, EXPRESSIONS, AND HOLES: SYMBOL DEFINITION SUPPORT ========
-
- PARSE─EFINE╓AR = *
- JSR FIND╙YMBOL
- CMP #SYM╬EW
- BEQ +
- LDA SYM╘YPE
- CMP #$80
- BEQ +
- LDA #ERR╥EDEFINED╙YMBOL
- JMP ERROR
- + LDA #$FF
- STA SYM╘YPE
- JSR STASH╙YMBOL
- LDX #3
- - LDA ID╨TR,X
- STA VAR╨TR,X
- DEX
- BPL -
- RTS
-
- ADD═EMORY╚OLE = * ;( .╪=HOLE╘YPE, ADDRESS+.┴ )
- ;** PUT IN HOLE INFORMATION
- STX EXP╚OLE╘YPE
- CLC
- ADC ADDRESS+0
- STA EXP╚OLE┴DDR+0
- LDA ADDRESS+1
- ADC #0
- STA EXP╚OLE┴DDR+1
- LDA #0
- STA EXP╚OLE┴DDR+2
- STA EXP╚OLE┴DDR+3
- JMP ADD╚OLE╔N
-
- ADD╓ARIABLE╚OLE = * ;( VAR╨TR, EXP╘ABLE ) : ...
- ;** PUT IN HOLE INFORMATION
- LDA #$80
- STA EXP╚OLE╘YPE
- LDX #3
- - LDA VAR╨TR,X
- STA EXP╚OLE┴DDR,X
- DEX
- BPL -
-
- ADD╚OLE╔N = *
- ;** KEEP A COUNT OF THE GLOBAL NUMBER OF UNRESOLVED REFERENCES
- LDX #HOLE├OUNT
- JSR INC╠ONG
- ;** KEEP A SEPARATE COUNT OF THE UNRESOLVED RELATIVE LABELS:THEY MUST BE RESD
- LDA STRING╠EN
- CMP #2
- BCC +
- LDA STRING┬UF+1
- CMP #"+"
- BEQ +
- CMP #"-"
- BNE ++
- + LDX #REL╚OLE├OUNT
- JSR INC╠ONG
- ;** ALLOCATE STORAGE FOR EXPRESSION DESCRIPTOR
- + LDA EXP╠ENGTH
- LDY #0
- JSR MALLOC
- BCC +
- LDA #ERR╔NSUFFICIENT═EMORY
- JMP ERROR
- + LDX #3
- - LDA MP,X
- STA EXP╨TR,X
- DEX
- BPL -
- ;** SCAN FOR POINTERS TO UNRESOLVED LABELS, REFS INTO CORRESP.REFERENCE LISTS
- LDX #16
- STX EXP╧FFSET
-
- ADD╚OLE╬EXT = *
- LDX EXP╧FFSET
- LDA EXP╘YPE,X
- BPL ADD╚OLE├ONT
- LDY #0
- - LDA EXP╓ALUE,X
- STA MP,Y
- INX
- INY
- CPY #4
- BCC -
- JSR FETCH╙YMBOL╚EADER
- LDX EXP╧FFSET
- LDY #0
- - LDA SYM╓ALUE,Y
- STA EXP╬EXT╒NRES,X
- LDA EXP╨TR,Y
- STA SYM╓ALUE,Y
- INX
- INY
- CPY #4
- BCC -
- LDX EXP╧FFSET
- LDA SYM╒NRES╧PND
- STA EXP╬EXT╧PND,X
- STX SYM╒NRES╧PND
- JSR STASH╙YMBOL╚EADER
-
- ADD╚OLE├ONT = *
- CLC
- LDA EXP╧FFSET
- ADC #14
- STA EXP╧FFSET
- CMP EXP╠ENGTH
- BCC ADD╚OLE╬EXT
-
- ;** STORE EXPRESSION DESCRIPTOR
- JMP STASH┼XP
-
- PLUG╙TACK╚EAD .BUF 4
- PLUG╥EC┬UF = *
- PLUG╥EC╬EXT .BUF 4
- PLUG╥EC╓AR╨TR .BUF 4
- PLUG╥EC╔D╓AL .BUF 4
- PLUG╥EC╔D╘YPE .BUF 1
-
- PLUG╙TACK╔NIT = *
- LDA #ACE═EM╬ULL
- STA PLUG╙TACK╚EAD+3
- RTS
-
- PLUG╙TACK╨USH = * ;( VAR╨TR, ID╓AL, ID╘YPE )
- LDA #13
- LDY #0
- JSR MALLOC
- BCC +
- LDA #ERR╔NSUFFICIENT═EMORY
- JSR ERROR
- + LDX #3
- - LDA PLUG╙TACK╚EAD,X
- STA PLUG╥EC╬EXT,X
- LDA MP,X
- STA PLUG╙TACK╚EAD,X
- LDA VAR╨TR,X
- STA PLUG╥EC╓AR╨TR,X
- LDA ID╓AL,X
- STA PLUG╥EC╔D╓AL,X
- DEX
- BPL -
- LDA ID╘YPE
- STA PLUG╥EC╔D╘YPE
- LDA #<PLUG╥EC┬UF
- LDY #>PLUG╥EC┬UF
- STA ZP+0
- STY ZP+1
- LDA #13
- LDY #0
- JSR STASH
- RTS
-
- PLUG╙TACK╨OP = * ;( ) : VAR╨TR, ID╓AL, ID╘YPE, .├╙=EMPTY
- LDX #3
- - LDA PLUG╙TACK╚EAD,X
- STA MP,X
- DEX
- BPL -
- LDA MP+3
- CMP #ACE═EM╬ULL
- BNE +
- SEC
- RTS
- + LDA #<PLUG╥EC┬UF
- LDY #>PLUG╥EC┬UF
- STA ZP+0
- STY ZP+1
- LDA #13
- LDY #0
- JSR FETCH
- LDA #13
- LDY #0
- JSR FREE
- LDX #3
- - LDA PLUG╥EC╬EXT,X
- STA PLUG╙TACK╚EAD,X
- LDA PLUG╥EC╓AR╨TR,X
- STA VAR╨TR,X
- LDA PLUG╥EC╔D╓AL,X
- STA ID╓AL,X
- DEX
- BPL -
- LDA PLUG╥EC╔D╘YPE
- STA ID╘YPE
- RTS
-
- ASSIGN╓AR╙AVE .BUF 10
-
- ASSIGN╓ARIABLE = * ;( VAR╨TR, ID╓AL, ID╘YPE ) : ... ;CHANGES ID╨TR,VAR╨TR,ETC.
- JSR PLUG╙TACK╔NIT
- ;** ASSIGN VALUE TO VARIABLE
- ASSIGN╓AR┬ODY = *
- LDX #3
- - LDA VAR╨TR,X
- STA MP,X
- DEX
- BPL -
- JSR FETCH╙YMBOL╚EADER
- LDA SYM╘YPE
- CMP #$FF
- BEQ +
- LDA #ERR╔NTERN┴SSIGN
- JMP ERROR
- + LDX #3
- - LDA SYM╓ALUE,X
- STA EXP╨TR,X
- LDA ID╓AL,X
- STA SYM╓ALUE,X
- DEX
- BPL -
- LDA SYM╒NRES╧PND
- STA EXP╧FFSET
- LDA ID╘YPE
- STA SYM╘YPE
- JSR STASH╙YMBOL╚EADER
-
- ;** CASCADE CHANGES IF NECESSARY
- ;╥UN THROUGH REFERENCE LIST, FILLING IN VALUE OF ID, UNLINKING FROM THIS ID.
- ;╔F WE RESOLVE AN EXPRESSION, EVALUATE IT, AND IF THE HOLE IS IN MEMORY, FILL
- ;IT. ╔F THE FILLED HOLE IS ANOTHER VARIABLE, PUSH THE <VAR╨TR,ID╓AL,ID╘YPE>
- ;VALUES ONTO THE PLUG STACK AND CONTINUE WITH REFERENCE LIST FOR THE CURRENT
- ;VARIABLE. ╫HEN WE ARE DONE WITH THE CURRENT LABEL, POP A VARIABLE OFF THE
- ;PLUG STACK AND CONTINUE WITH IT. ╧THERWISE, EXIT.
- ASSIGN╓AR├ASCADE = *
- LDA EXP╨TR+3
- CMP #ACE═EM╬ULL
- BNE +
- JSR PLUG╙TACK╨OP
- BCC ASSIGN╓AR┬ODY
- RTS
- ;** FETCH UNRESOLVED EXPRESSION
- + JSR FETCH┼XP
- ;** FILL IN VALUE
- LDX EXP╧FFSET
- LDA ID╘YPE
- STA EXP╘YPE,X
- LDY #0
- - LDA ID╓AL,Y
- STA EXP╓ALUE,X
- INX
- INY
- CPY #4
- BCC -
- DEC EXP╒NRES├NT
- BNE ASSIGN╓AR╒NRESOLVED
- JMP ASSIGN╓AR╥ESOLVED
-
- ;** STILL UNRESOLVED--STASH MODIFIED EXPRESSION
- ASSIGN╓AR╒NRESOLVED = *
- JSR STASH┼XP
- JMP ASSIGN╓AR├ASCADE├ONT
-
- ;** RESOLVED--EVALUATE EXPRESSION, FILL IN HOLE
- ASSIGN╓AR╥ESOLVED = *
- LDX #3
- - LDA EXP╨TR,X
- STA MP,X
- DEX
- BPL -
- LDA EXP╠ENGTH
- LDY #0
- JSR FREE
- ;** SAVE VAR╨TR,ID╓AL,ID╘YPE,EXP╧FFSET
- LDX #3
- - LDA VAR╨TR,X
- STA ASSIGN╓AR╙AVE+0,X
- LDA EXP╚OLE┴DDR,X
- STA VAR╨TR,X
- LDA ID╓AL,X
- STA ASSIGN╓AR╙AVE+4,X
- DEX
- BPL -
- LDA ID╘YPE
- STA ASSIGN╓AR╙AVE+8
- LDA EXP╧FFSET
- STA ASSIGN╓AR╙AVE+9
- LDX #HOLE├OUNT
- JSR DEC╠ONG
- LDA SYM├LASS
- CMP #$01
- BEQ +
- LDX #REL╚OLE├OUNT
- JSR DEC╠ONG
- ;** EVALUATE NEW EXPRESSION
- + JSR EVALUATE┼XPRESSION
- ;** FILL HOLE--ID HOLE: PUSH HOLE PLUG--DO SOMETHING ELSE FOR MEMORY HOLE
- LDA EXP╚OLE╘YPE
- CMP #$80
- BEQ +
- JSR FILL═EMORY╚OLE
- JMP ++
- + JSR PLUG╙TACK╨USH
- ;** RESTORE VAR╨TR,ID╓AL,ID╘YPE,EXP╧FFSET
- + LDX #3
- - LDA ASSIGN╓AR╙AVE+0,X
- STA VAR╨TR,X
- LDA ASSIGN╓AR╙AVE+4,X
- STA ID╓AL,X
- DEX
- BPL -
- LDA ASSIGN╓AR╙AVE+8
- STA ID╘YPE
- LDA ASSIGN╓AR╙AVE+9
- STA EXP╧FFSET
-
- ;** GO ONTO NEXT UNRESOLVED EXPRESSION
- ASSIGN╓AR├ASCADE├ONT = *
- LDX EXP╧FFSET
- LDA EXP╬EXT╧PND,X
- STA EXP╧FFSET
- LDY #0
- - LDA EXP╬EXT╒NRES,X
- STA EXP╨TR,Y
- INX
- INY
- CPY #4
- BCC -
- JMP ASSIGN╓AR├ASCADE
-
- FETCH┼XP = * ;( [EXP╨TR] ) : EXP╘ABLE, MP=EXP╨TR
- LDX #3
- - LDA EXP╨TR,X
- STA MP,X
- DEX
- BPL -
- LDA #<EXP╘ABLE
- LDY #>EXP╘ABLE
- STA ZP+0
- STY ZP+1
- LDA #16+14
- LDY #0
- JSR FETCH
- LDA EXP╠ENGTH
- CMP #16+14+1
- BCC +
- LDA EXP╠ENGTH
- LDY #0
- JSR FETCH
- + RTS
-
- STASH┼XP = * ;( [EXP╨TR], EXP╘ABLE ) : MP=EXP╨TR
- LDX #3
- - LDA EXP╨TR,X
- STA MP,X
- DEX
- BPL -
- LDA #<EXP╘ABLE
- LDY #>EXP╘ABLE
- STA ZP+0
- STY ZP+1
- LDA EXP╠ENGTH
- LDY #0
- JSR STASH
- RTS
-
- FILL═H╘YPE .BUF 1
-
- FILL═EMORY╚OLE = * ;( .┴=HOLE╘YPE, VAR╨TR, ID╓AL, ID╘YPE )
- STA FILL═H╘YPE
- BIT DEBUG
- BPL FILL═H├ONT
- LDA #<FILL═H═SG1
- LDY #>FILL═H═SG1
- JSR PUTS
- LDA VAR╨TR+1
- JSR PUTHEX
- LDA VAR╨TR+0
- JSR PUTHEX
- LDA #<FILL═H═SG2
- LDY #>FILL═H═SG2
- JSR PUTS
- LDX #ID╓AL
- JSR PUTNUM
- LDA #" "
- JSR PUTCHAR
- LDA #"("
- JSR PUTCHAR
- LDA #"V"
- LDX ID╘YPE
- BEQ +
- LDA #"A"
- + JSR PUTCHAR
- LDA #<FILL═H═SG3
- LDY #>FILL═H═SG3
- JSR PUTS
- LDA FILL═H╘YPE
- JSR PUTHEX
- LDA #CHR├╥
- JSR PUTCHAR
- ;%%%
-
- FILL═H├ONT = *
- LDA FILL═H╘YPE
- CMP #$40
- BEQ FILL═H┬RANCH
- TAX
- DEX
- - LDA ID╓AL,X
- STA MEM╨UT╓ALS,X
- DEX
- BPL -
- LDX FILL═H╘YPE
- DEX
- - INX
- CPX #4
- BCS +
- LDA ID╓AL,X
- BEQ -
- LDA #ERR╓ALUE╘OO╠ARGE
- JMP ERROR╥EF
- + LDA FILL═H╘YPE
- LDX VAR╨TR+0
- LDY VAR╨TR+1
- JSR MEM╨UT
- ;** ADD RELOCATABLE REFERENCE
- LDA ID╘YPE
- BEQ +
- CMP #$04
- BCS +
- LDX VAR╨TR+0
- LDY VAR╨TR+1
- JSR RECORD╥ELOC╥EF
- + RTS
-
- FILL═H┬RANCH = *
- LDA ID╓AL+2
- ORA ID╓AL+3
- BEQ +
- LDA #ERR╓ALUE╘OO╠ARGE
- JMP ERROR╥EF
- + CLC
- LDA VAR╨TR+0
- ADC #1
- STA MEM╨UT╓ALS+0
- LDA VAR╨TR+1
- ADC #0
- STA MEM╨UT╓ALS+1
- SEC
- LDA ID╓AL+0
- SBC MEM╨UT╓ALS+0
- STA MEM╨UT╓ALS+0
- TAX
- LDA ID╓AL+1
- SBC MEM╨UT╓ALS+1
- STA MEM╨UT╓ALS+1
- CMP #0
- BNE +
- CPX #128
- BCC ++
- - LDA #ERR┬RANCH╘OO╞AR
- JMP ERROR
- + CMP #$FF
- BNE -
- CPX #128
- BCC -
- + LDA #1
- LDX VAR╨TR+0
- LDY VAR╨TR+1
- JSR MEM╨UT
- RTS
-
- FILL═H═SG1 = *
- .ASC "FILL MEMORY HOLE: ADDRESS=$"
- .BYTE 0
- FILL═H═SG2 = *
- .ASC ", VALUE="
- .BYTE 0
- FILL═H═SG3 = *
- .ASC "), HOLE╘YPE=$"
- .BYTE 0
-
- ;======== PROGRAM MEMORY STORAGE ========
-
- MEM╔NIT = * ;( )
- LDA #ACE═EM╬ULL
- STA MEM┬UF╨TR+3
- LDX #0
- LDA #ACE═EM╬ULL
- - STA MEM╨TR╘ABLE,X
- INX
- BNE -
- RTS
-
- MEM╨UT╙AVE .BUF 2
-
- MEM╨UT = * ;( .╪┘=ADDR,.┴=BYTE├OUNT, MEM╨UT╓ALS )
- STA MEM╨UT├OUNT
- STY MEM╨UT╨AGE
- LDY #0
-
- MEM╨UT╬EXT = *
- LDA MEM┬UF╨TR+3
- CMP #ACE═EM╬ULL
- BEQ MEM╨UT═ISS
- LDA MEM╨UT╨AGE
- CMP MEM┬UF╨AGE
- BNE MEM╨UT═ISS
- LDA MEM╨UT╓ALS,Y
- STA MEM┬UF,X
- INX
- BNE +
- INC MEM╨UT╨AGE
- + INY
- CPY MEM╨UT├OUNT
- BCC MEM╨UT╬EXT
- RTS
-
- MEM╨UT═ISS = *
- STX MEM╨UT╙AVE+0
- STY MEM╨UT╙AVE+1
- JSR MEM╞LUSH┬UF
- JSR MEM╞ETCH┬UF
- LDX MEM╨UT╙AVE+0
- LDY MEM╨UT╙AVE+1
- JMP MEM╨UT╬EXT
-
- MEM╞LUSH┬UF = *
- LDA #<MEM┬UF
- LDY #>MEM┬UF
- STA ZP+0
- STY ZP+1
- ;** FLUSH OLD PAGE
- LDX #3
- - LDA MEM┬UF╨TR,X
- STA MP,X
- DEX
- BPL -
- LDA MP+3
- CMP #ACE═EM╬ULL
- BEQ +
- LDA MEM┬UF╨AGE
- AND #$03
- CLC
- ADC MP+1
- STA MP+1
- LDA #0
- LDY #1
- JSR STASH
- + RTS
-
- MEM╞ETCH┬UF = * ;( MEM╨UT╨AGE )
- LDA #<MEM┬UF
- LDY #>MEM┬UF
- STA ZP+0
- STY ZP+1
- LDA MEM╨UT╨AGE
- STA MEM┬UF╨AGE
- AND #%11111100
- TAY
- LDX #0
- - LDA MEM╨TR╘ABLE,Y
- STA MEM┬UF╨TR,X
- STA MP,X
- INY
- INX
- CPX #4
- BCC -
- LDA MP+3
- CMP #ACE═EM╬ULL
- BEQ MEM╞ETCH┬UF╬EW
- LDA MEM╨UT╨AGE
- AND #$03
- CLC
- ADC MP+1
- STA MP+1
- LDA #0
- LDY #1
- JSR FETCH
- RTS
-
- MEM╞ETCH┬UF╬EW = *
- LDA #0
- LDY #4
- JSR MALLOC
- LDA MEM┬UF╨AGE
- AND #%11111100
- TAY
- LDX #0
- - LDA MP,X
- STA MEM╨TR╘ABLE,Y
- STA MEM┬UF╨TR,X
- INY
- INX
- CPX #4
- BCC -
- RTS
-
- MEM╙AVE┴DDR .BUF 2
- MEM╙AVE╞D .BUF 1
- MEM╙AVE╠EN .BUF 1 ;0==256
-
- MEM╙AVE = * ;( .┴=FD, .╪┘=FROM, ADDRESS=TO)
- STA MEM╙AVE╞D
- STX MEM╙AVE┴DDR+0
- STY MEM╙AVE┴DDR+1
- JSR MEM╞LUSH┬UF
-
- MEM╙AVE╬EXT = *
- LDA MEM╙AVE┴DDR+0
- CMP ADDRESS+0
- LDA MEM╙AVE┴DDR+1
- SBC ADDRESS+1
- BCC +
- RTS
- + LDA MEM╙AVE┴DDR+1
- STA MEM╨UT╨AGE
- JSR MEM╞ETCH┬UF ;SETS (ZP)
- LDA #0
- STA MEM╙AVE╠EN
- ;** SET BOTTOM
- LDA MEM╙AVE┴DDR+0
- BEQ ++
- CLC
- LDA ZP+0
- ADC MEM╙AVE┴DDR+0
- STA ZP+0
- BCC +
- INC ZP+1
- + SEC
- LDA MEM╙AVE╠EN
- SBC MEM╙AVE┴DDR+0
- STA MEM╙AVE╠EN
- ;** SET TOP
- + LDA MEM╙AVE┴DDR+1
- CMP ADDRESS+1
- BCC +
- SEC
- LDA #0
- SBC ADDRESS+0
- TAX
- LDA MEM╙AVE╠EN
- STX MEM╙AVE╠EN
- SEC
- SBC MEM╙AVE╠EN
- STA MEM╙AVE╠EN
- ;** SAVE THE PAGE
- + LDY #0
- LDA MEM╙AVE╠EN
- BNE +
- INY
- + LDX MEM╙AVE╞D
- JSR WRITE
- LDA MEM╙AVE╠EN
- BEQ +
- CLC
- ADC MEM╙AVE┴DDR+0
- STA MEM╙AVE┴DDR+0
- BCC ++
- + INC MEM╙AVE┴DDR+1
- + JMP MEM╙AVE╬EXT
-
- RECORD╥ELOC╥EF = * ;( .╪┘=REF┴DDRESS, .┴=VALUE╘YPE )
- RTS
-
- ;======== TOKENIZER ========
-
- ;* FILL ENTIRE BUFFER, PAD WITH SPACES; .├╙=EOF
- FILLBUF = *
- LDA #<SOURCE┬UF
- LDY #>SOURCE┬UF
- STA ZP
- STY ZP+1
- LDA #0
- LDY #1
- STA BUFPTR
- LDX SOURCE╞CB
- JSR READ
- BNE +
- SEC
- RTS
- + CPY #1
- BCC +
- CLC
- RTS
- + TAY
- LDA #" "
- - STA SOURCE┬UF,Y
- INY
- BNE -
- CLC
- RTS
-
- GET╬EXT├HAR = *
- INC BUFPTR
- BEQ +
- - LDY BUFPTR
- LDA SOURCE┬UF,Y
- RTS
- + JSR FILLBUF
- BCC -
- LDA #CHR┼╧╞
- RTS
-
- EAT╫HITESPACE = * ;() : .┴=╬EXT├HAR
- LDA PREV├HAR
- CMP #" "
- BEQ +
- CMP #CHR╘AB
- BEQ +
- RTS
- + LDY BUFPTR
- - INY
- BEQ +
- EAT╫H├ONT = *
- LDA SOURCE┬UF,Y
- CMP #" "
- BEQ -
- CMP #CHR╘AB
- BEQ -
- STY BUFPTR
- RTS
- + JSR FILLBUF
- BCS +
- LDY #0
- JMP EAT╫H├ONT
- + LDA #CHR┼╧╞
- RTS
-
- ;*** TOKEN DISPATCH ***
- ;RET: .╪=TOKEN╔DENTIFIER, .┴=NEXT├HAR, .┘=STRLEN, STRING╠EN, STRING┬UF
- ; .╪=TOKEN╬UMBER, .┘=NUMLEN, NUMBER
- ; .╪=TOKEN╙TRING, .┴=FIRST├HAR,.┘=STRLEN, STRING╠EN, STRING┬UF
- ; .╪=TOKEN╙PECIAL, .┴=CHAR
-
- TOK─EBUG╙AVE .BUF 3
-
- GET╘OKEN = *
- LDA NEW├OL
- STA SOURCE├OL
- LDA NEW╠INE+0
- STA SOURCE╠INE+0
- LDA NEW╠INE+1
- STA SOURCE╠INE+1
- LDA NEW╠INE+2
- STA SOURCE╠INE+2
- LDA NEW╠INE+3
- STA SOURCE╠INE+3
- BIT DEBUG
- BPL GET╘OKEN╥EAL
- JSR GET╘OKEN╥EAL
- STA TOK─EBUG╙AVE+0
- STX TOK─EBUG╙AVE+1
- STY TOK─EBUG╙AVE+2
- JSR DISP╘OKEN
- LDA TOK─EBUG╙AVE+0
- LDX TOK─EBUG╙AVE+1
- LDY TOK─EBUG╙AVE+2
- RTS
-
- GET╘OKEN╥EAL = *
- LDA PREV├HAR
- CMP #" "
- BNE +
- - JSR EAT╫HITESPACE
- + CMP #CHR╘AB
- BEQ -
- CMP #"@"
- BCC +
- JMP GET╔DENTIFIER
- + CMP #"'"
- BCC CMP═ORE1
- BNE +
- JMP GET╙TRING
- + CMP #"0"
- BCC TOK╙PECIAL
- CMP #":"
- BCS +
-
- TOK╬UM = *
- JMP GET╬UMBER
-
- + CMP #";"
- BNE +
- JMP EAT├OMMENT
-
- TOK╙PECIAL = *
- JMP GET╙PECIAL╘OKEN
-
- CMP═ORE1 = *
- CMP #"$"
- BCC +
- BEQ TOK╬UM
- CMP #"%"
- BEQ TOK╬UM
- JMP GET╙PECIAL╘OKEN
-
- + CMP #CHR╤UOTE
- BNE TOK╙PECIAL
- JMP GET╙TRING
-
- ;*** COMMENT ***
-
- EAT├OMMENT = *
- LDY BUFPTR
- - INY
- BEQ +
-
- COMMENT├HAR = *
- LDA SOURCE┬UF,Y
- CMP #CHR├╥
- BNE -
- STY BUFPTR
- JMP GET╙PECIAL╘OKEN
- + JSR FILLBUF
- BCS +
- LDY #0
- BEQ COMMENT├HAR
- + LDA #CHR┼╧╞
- JMP GET╙PECIAL╘OKEN
-
- ;*** SPECIAL ***
-
- GET╙PECIAL╘OKEN = *
- CMP #CHR├╥
- BNE +
- INC NEW╠INE+0
- BNE +
- INC NEW╠INE+1
- BNE +
- INC NEW╠INE+2
- BNE +
- INC NEW╠INE+3
- + CMP #CHR┼╧╞
- BNE +
- STA PREV├HAR
- STA TOKEN├HAR
- LDX #TOKEN┼╧╞
- STX TOKEN╘YPE
- RTS
- + PHA
- JSR GET╬EXT├HAR
- STA PREV├HAR
- STA TOKEN╬EXT├HAR
- PLA
- LDX #TOKEN╙PECIAL
- STX TOKEN╘YPE
- STA TOKEN├HAR
- RTS
-
- ;*** IDENTIFIER ***
-
- GET╔DENTIFIER = *
- STA STRING┬UF
- LDY #1
- STY STRING╠EN
- - JSR GET╬EXT├HAR
- CMP #"@"
- BCC IDENT┼XIT
-
- IDENT╟OOD├HAR = *
- LDY STRING╠EN
- STA STRING┬UF,Y
- INC STRING╠EN
- CPY #240
- BCC -
- STA PREV├HAR
- LDA #ERR╔DENT╘OO╠ONG
- JMP ERROR
-
- IDENT┼XIT = *
- CMP #"."
- BEQ IDENT╟OOD├HAR
- CMP #"_"
- BEQ IDENT╟OOD├HAR
- CMP #"0"
- BCC +
- CMP #":"
- BCC IDENT╟OOD├HAR
- + CMP #" "
- BNE +
- - STA PREV├HAR
- JSR EAT╫HITESPACE
- + CMP #CHR╘AB
- BEQ -
- STA PREV├HAR
- LDA #0
- LDY STRING╠EN
- STA STRING┬UF,Y
- LDA PREV├HAR
- LDY STRING╠EN
- LDX #TOKEN╔DENTIFIER
- STX TOKEN╘YPE
- CMP #";"
- BNE +
- LDA #CHR├╥
- + STA TOKEN╬EXT├HAR
- RTS
-
- ;*** STRING ***
-
- GET╙TRING = *
- STA STR─ELIMIT
- LDA #0
- STA STRING╠EN
- - JSR GET╬EXT├HAR
- STA PREV├HAR
- CMP #CHR┼╧╞
- BEQ STR┼OF
- CMP STR─ELIMIT
- BEQ STR┼XIT
- CMP #CHR├╥
- BEQ STR┼OF
- CMP #"\"
- BEQ STR┼SC
- GET╙TR╨UT = *
- LDY STRING╠EN
- STA STRING┬UF,Y
- INC STRING╠EN
- LDA STRING╠EN
- CMP #241
- BCC -
- STA PREV├HAR
- LDA #ERR╙TRING╘OO╠ONG
- JMP ERROR
-
- STR┼SC = *
- JSR GET╬EXT├HAR
- CMP #CHR├╥
- BEQ STR┼OF
- CMP #CHR┼╧╞
- BEQ STR┼OF
- LDX #STR┼SC├HAR┼ND-STR┼SC├HAR-1
- - CMP STR┼SC├HAR,X
- BEQ +
- DEX
- BPL -
- JMP GET╙TR╨UT
- + LDA STR┼SC╘RANS,X
- JMP GET╙TR╨UT
-
- STR┼SC├HAR = *
- .ASC "\NBTRAZ'E0Q"
- .BYTE CHR╤UOTE
- STR┼SC├HAR┼ND = *
- STR┼SC╘RANS = *
- .BYTE 92,13,20,9,10,7,0,39,27,0,34,34
-
- STR┼OF = *
- LDA #ERR╬O├LOSE╤UOTE
- JMP ERROR
-
- STR┼XIT = *
- JSR GET╬EXT├HAR
- STA PREV├HAR
- LDA #0 ;BUT MAY CONTAIN \0
- LDY STRING╠EN
- STA STRING┬UF,Y
- LDA STRING┬UF+0
- LDX #TOKEN╙TRING
- STX TOKEN╘YPE
- STA TOKEN├HAR
- RTS
-
- GET╬UMBER = *
- PHA
- LDX #3
- LDA #0
- - STA NUMBER,X
- DEX
- BPL -
- PLA
- LDX #16
- CMP #"$"
- BEQ +
- LDX #2
- CMP #"%"
- BEQ +
- LDX #10
- STX NUM┬ASE
- BNE GOT╬EXT─IGIT
- + STX NUM┬ASE
- JSR GET╬EXT├HAR
- STA PREV├HAR
- JSR CHECK─IGIT
- BCC +
- LDA #ERR┬AD╬UMBER
- JMP ERROR
- + TXA
- JMP GOT╬EXT─IGIT
-
- NEXT─IGIT = *
- JSR GET╬EXT├HAR
- STA PREV├HAR
- CMP #"_"
- BEQ NEXT─IGIT
- GOT╬EXT─IGIT = *
- JSR CHECK─IGIT
- BCS GET╬UM┼XIT
- PHA
- JSR SHIFT╬UMBER
- BCS OVERFLOW┼XIT╨LA
- PLA
- CLC
- ADC NUMBER
- STA NUMBER
- BCC +
- INC NUMBER+1
- BNE +
- INC NUMBER+2
- BNE +
- INC NUMBER+3
- BEQ OVERFLOW┼XIT
- + JMP NEXT─IGIT
-
- OVERFLOW┼XIT╨LA = *
- PLA
- OVERFLOW┼XIT = *
- LDA #ERR╬UM╧VERFLOW
- JMP ERROR
-
- GET╬UM┼XIT = *
- LDY #3
- - LDA NUMBER,Y
- BEQ +
- DEY
- BPL -
- INY
- + INY
- STY TOKEN╬UM┬YTES
- LDX #TOKEN╬UMBER
- STX TOKEN╘YPE
- RTS
-
- CHECK─IGIT = * ;( .┴=ASCII─IGIT ) : .┴=BIN─IGIT, .╪=ASCII─IGIT, .├├=OK
- TAX
- CMP #"0"
- BCC CHECK┬AD
- CMP #"9"+1
- BCC CHECK┴ND
- CMP #"A"
- BCC CHECK┬AD
- CMP #"F"+1
- BCC +
- CMP #"┴"
- BCC CHECK┬AD
- CMP #"╞"+1
- BCS CHECK┬AD
- + SEC
- SBC #7
- CHECK┴ND = *
- AND #$0F
- CMP NUM┬ASE
- RTS
- CHECK┬AD = *
- SEC
- RTS
-
- SHIFT╬UMBER = *
- LDA NUM┬ASE
- CMP #10
- BNE +
- LDX #3
- - LDA NUMBER,X
- STA NUM╙AVE,X
- DEX
- BPL -
- LDX #2
- JSR ROLL╬UMBER
- JSR ADD╬UMBER
- LDX #1
- JSR ROLL╬UMBER
- RTS
- + LDX #1
- CMP #16
- BNE +
- LDX #4
- + JSR ROLL╬UMBER
- RTS
-
- ROLL╬UMBER = * ;( .╪=TIMES )
- ASL NUMBER
- ROL NUMBER+1
- ROL NUMBER+2
- ROL NUMBER+3
- BCS +
- DEX
- BNE ROLL╬UMBER
- RTS
- + PLA
- PLA
- SEC
- RTS
-
- ADD╬UMBER = *
- LDX #0
- CLC
- - LDA NUMBER,X
- ADC NUM╙AVE,X
- STA NUMBER,X
- INX
- TXA
- AND #$03
- BNE -
- BCS +
- RTS
- + PLA
- PLA
- SEC
- RTS
-
- ;======== DEBUGGING TOKEN DISPLAY ROUTINES ========
-
- DISP╘OKEN = * ;( .TOKEN╘YPE )
- LDX TOKEN╘YPE
- CPX #TOKEN╔DENTIFIER
- BEQ DISP╔DENTIFIER
- CPX #TOKEN╙TRING
- BEQ DISP╙TRING
- CPX #TOKEN╙PECIAL
- BNE +
- JMP DISP╙PECIAL
- + CPX #TOKEN╬UMBER
- BNE +
- JMP DISP╬UMBER
- + RTS
-
- DISP╔DENTIFIER = *
- LDA #"I"
- JSR PUTCHAR
- LDA #":"
- JSR PUTCHAR
- JSR SHOW╙TR
- LDA #","
- JSR PUTCHAR
- JSR HASH
- LDA #0
- STA NUMBER+2
- STA NUMBER+3
- LDA HASH╓AL+0
- LDY HASH╓AL+1
- STA NUMBER+0
- STY NUMBER+1
- LDX #NUMBER
- JSR PUTNUM
- LDA #","
- JSR PUTCHAR
- SEC
- LDA HASH╨TR+0
- SBC #<IDENT╚ASH╘ABLE
- STA NUMBER+0
- LDA HASH╨TR+1
- SBC #>IDENT╚ASH╘ABLE
- STA NUMBER+1
- LSR NUMBER+1
- ROR NUMBER+0
- LSR NUMBER+1
- ROR NUMBER+0
- LDX #NUMBER
- JSR PUTNUM
- LDA #","
- JSR PUTCHAR
- LDA TOKEN╬EXT├HAR
- SHOW├HAR = *
- CMP #CHR├╥
- BNE +
- LDA #"\"
- JSR PUTCHAR
- LDA #"N"
- + JSR PUTCHAR
- SHOW├╥ = *
- LDA #CHR├╥
- JSR PUTCHAR
- RTS
-
- DISP╙TRING = *
- LDA #"S"
- JSR PUTCHAR
- LDA #":"
- JSR PUTCHAR
- JSR SHOW╙TR
- JMP SHOW├╥
-
- SHOW╙TR = *
- LDA #<STRING┬UF
- LDY #>STRING┬UF
- STA ZP+0
- STY ZP+1
- LDA STRING╠EN
- LDY #0
- LDX #STDOUT
- JSR WRITE
- RTS
-
- DISP╙PECIAL = *
- LDA #"C"
- JSR PUTCHAR
- LDA #":"
- JSR PUTCHAR
- LDA TOKEN├HAR
- JMP SHOW├HAR
-
- DISP╬UMBER = *
- LDA #"N"
- JSR PUTCHAR
- LDA #":"
- JSR PUTCHAR
- LDA #<STRING┬UF
- LDY #>STRING┬UF
- STA ZP+0
- STY ZP+1
- LDX #NUMBER
- LDA #1
- JSR UTOA
- STY STRING╠EN
- JSR SHOW╙TR
- JMP SHOW├╥
-
- ;=== DYNAMIC MEMORY ROUTINES ===
-
- MALLOC╫ORK = MEM╫ORK ;(16) ;REQUIRED WORK AREA; DEFINED EARLIER
-
- MALLOC╚EAD .BUF 4
- TPA╞REE╞IRST .BUF 1
- TPA╞REE═IN .BUF 1
- TPA╞REE╨AGES .BUF 1
- TPA┴REA╙TART .BUF 1
- TPA┴REA┼ND .BUF 1
-
- ;*** MALLOC╔NIT()
-
- MALLOC╔NIT = *
- LDA #ACE═EM╬ULL
- STA MALLOC╚EAD+3
- LDX #0
- LDA #$FF
- - STA TPA╞REEMAP,X
- INX
- BNE -
- LDX #>BSS┼ND
- LDA #<BSS┼ND
- BEQ +
- INX
- + STX TPA╞REE╞IRST
- STX TPA┴REA╙TART
- LDX ACE═EM╘OP+1
- STX MALLOC╫ORK
- STX TPA┴REA┼ND
- TXA
- SEC
- SBC TPA╞REE╞IRST
- BCS +
- LDA #0
- + STA TPA╞REE╨AGES
- CLC
- ADC #1
- STA TPA╞REE═IN
- LDX TPA╞REE╞IRST
- CPX MALLOC╫ORK
- BCS +
- LDA #$00
- - STA TPA╞REEMAP,X
- INX
- CPX MALLOC╫ORK
- BCC -
- + RTS
-
- LIB╨AGES .BUF 1
-
- LIB╨AGE┴LLOC = * ;( .┴=PAGES ) : [MP]
- STA LIB╨AGES
- LDX #$00
- LDY #ACE═EM╔NTERNAL-1
- JSR PAGEALLOC
- BCS +
- RTS
- + JSR TPA╨AGE┴LLOC
- BCS +
- RTS
- + LDA LIB╨AGES
- LDX #ACE═EM╔NTERNAL
- LDY #$FF
- JSR PAGEALLOC
- BCS +
- RTS
- + SEC
- ;RTS
- ;LDA #<NOMEM═SG
- ;LDY #>NOMEM═SG
- ;JSR EPUTS
- LDA #ERR╔NSUFFICIENT═EMORY
- JMP ERROR
-
- ;NOMEM═SG = *
- ;.BYTE CHR├╥
- ;.ASC "╔NSUFFICIENT MEMORY, ABORTING."
- ;.BYTE CHR├╥,0
-
- NEWMAX .BUF 1
-
- TPA╨AGE┴LLOC = * ;( LIB╨AGES ) : [MP]
- LDA LIB╨AGES
- CMP TPA╞REE═IN
- BCS TPA╞REEMAP╞ULL
- ;** FIRST FREE
- LDX TPA╞REE╞IRST
- LDA TPA╞REEMAP,X
- BEQ ++
- - INX
- BEQ TPA╞REEMAP╞ULL
- LDA TPA╞REEMAP,X
- BNE -
- STX TPA╞REE╞IRST
- JMP ++
- TPA╞REEMAP╞ULL = *
- LDA LIB╨AGES
- CMP TPA╞REE═IN
- BCS +
- STA TPA╞REE═IN
- + SEC
- RTS
-
- ;** SEARCH
- + DEX
- - LDY LIB╨AGES
- - INX
- BEQ TPA╞REEMAP╞ULL
- LDA TPA╞REEMAP,X
- BNE --
- DEY
- BNE -
-
- ;** ALLOCATE
- STX NEWMAX
- LDY LIB╨AGES
- LDA #$41
- - STA TPA╞REEMAP,X
- DEX
- DEY
- BNE -
- INX
- CPX TPA╞REE╞IRST
- BNE +
- LDY NEWMAX
- INY
- STY TPA╞REE╞IRST
- + SEC
- LDA TPA╞REE╨AGES
- SBC LIB╨AGES
- STA TPA╞REE╨AGES
- LDA #0
- LDY #ACE═EM╔NTERNAL
- STA MP+0
- STX MP+1
- STA MP+2
- STY MP+3
- CLC
- RTS
-
- MALLOC╠EN╙AVE .BUF 3
-
- MALLOC = *
- QUICK═ALLOC = *
- STA MALLOC╠EN╙AVE+0
- STY MALLOC╠EN╙AVE+1
- JSR LIB═ALLOC
- BCS +
- RTS
- + LDX MALLOC╠EN╙AVE+1
- LDA MALLOC╠EN╙AVE+0
- BEQ +
- INX
- + TXA
- CPX #>1024
- BCS +
- LDX #>1024
- + TXA
- STA MALLOC╠EN╙AVE+2
- JSR LIB╨AGE┴LLOC
- BCC +
- RTS
- + LDA #0
- LDY MALLOC╠EN╙AVE+2
- JSR FREE
- LDA MALLOC╠EN╙AVE+0
- LDY MALLOC╠EN╙AVE+1
- JMP MALLOC
-
- ;*** MALLOC( .┴┘=┬YTES ) : [MP]=╞AR╨OINTER
-
- MALLOC═EM╬EXT╨TR = MALLOC╫ORK+0 ;(4)
- MALLOC═EM╠ENGTH = MALLOC╫ORK+4 ;(2)
- MALLOC╠ENGTH = MALLOC╫ORK+6 ;(2)
- MALLOC╤ = MALLOC╫ORK+8 ;(4)
-
- LIB═ALLOC = *
- CLC
- ADC #7
- BCC +
- INY
- + AND #$F8
- STA MALLOC╠ENGTH
- STY MALLOC╠ENGTH+1
- LDX #3
- - LDA MALLOC╚EAD,X
- STA MP,X
- LDA #ACE═EM╬ULL
- STA MALLOC╤,X
- DEX
- BPL -
-
- MALLOC╠OOK = *
- LDA MP+3
- CMP #ACE═EM╬ULL
- BNE +
-
- MALLOC┼RROR┼XIT = *
- LDA #ACE═EM╬ULL
- STA MP+3
- LDA #ACE┼RR╔NSUFFICIENT═EMORY
- STA ERRNO
- SEC
- RTS
-
- + LDX #MALLOC═EM╬EXT╨TR
- LDY #6
- JSR ZPLOAD
- LDA MALLOC═EM╠ENGTH
- CMP MALLOC╠ENGTH
- LDA MALLOC═EM╠ENGTH+1
- SBC MALLOC╠ENGTH+1
- BCS MALLOC╟OT┬LOCK
- LDX #3
- - LDA MP,X
- STA MALLOC╤,X
- LDA MALLOC═EM╬EXT╨TR,X
- STA MP,X
- DEX
- BPL -
- JMP MALLOC╠OOK
-
- MALLOC╟OT┬LOCK = *
- LDA MALLOC═EM╠ENGTH
- CMP MALLOC╠ENGTH
- BNE +
- LDA MALLOC═EM╠ENGTH+1
- SBC MALLOC╠ENGTH+1
- BEQ MALLOC╘AKE╫HOLE┬LOCK
- + SEC
- LDA MALLOC═EM╠ENGTH
- SBC MALLOC╠ENGTH
- STA MALLOC═EM╠ENGTH
- LDA MALLOC═EM╠ENGTH+1
- SBC MALLOC╠ENGTH+1
- STA MALLOC═EM╠ENGTH+1
- LDX #MALLOC═EM╬EXT╨TR
- LDY #6
- JSR ZPSTORE
- CLC
- LDA MP+0
- ADC MALLOC═EM╠ENGTH
- STA MP+0
- LDA MP+1
- ADC MALLOC═EM╠ENGTH+1
- STA MP+1
- CLC
- RTS
-
- MALLOC╘AKE╫HOLE┬LOCK = *
- LDA MALLOC╤+3
- CMP #ACE═EM╬ULL
- BNE +
- LDX #3
- - LDA MALLOC═EM╬EXT╨TR,X
- STA MALLOC╚EAD,X
- DEX
- BPL -
- CLC
- RTS
- + LDX #3
- - LDA MP,X
- LDY MALLOC╤,X
- STA MALLOC╤,X
- STY MP,X
- DEX
- BPL -
- LDX #MALLOC═EM╬EXT╨TR
- LDY #4
- JSR ZPSTORE
- LDX #3
- - LDA MALLOC╤,X
- STA MP,X
- DEX
- BPL -
- CLC
- RTS
-
- ;*** FREE( [MP]=╞AR╨OINTER, .┴┘=╠ENGTH ) █ALTERS [MP]▌
-
- FREE═EM╬EXT╨TR = MALLOC╫ORK+0 ;(4)
- FREE═EM╠ENGTH = MALLOC╫ORK+4 ;(2)
- FREE╠ENGTH = MALLOC╫ORK+6 ;(2)
- FREE╬EW╨TR = MALLOC╫ORK+8 ;(4)
- FREE╤ = MALLOC╫ORK+12 ;(4)
-
- FREE = *
- CLC
- ADC #7
- BCC +
- INY
- + AND #$F8
- STA FREE╠ENGTH+0
- STY FREE╠ENGTH+1
- LDX #3
- - LDA MP,X
- STA FREE╬EW╨TR,X
- LDA MALLOC╚EAD,X
- STA MP,X
- LDA #ACE═EM╬ULL
- STA FREE╤,X
- DEX
- BPL -
-
- FREE╙EARCH╠OOP = *
- LDA MP+3
- CMP #ACE═EM╬ULL
- BEQ FREE├OALESCE╤AND╬EW
- LDA MP+0
- CMP FREE╬EW╨TR+0
- LDA MP+1
- SBC FREE╬EW╨TR+1
- LDA MP+2
- SBC FREE╬EW╨TR+2
- LDA MP+3
- SBC FREE╬EW╨TR+3
- BCS FREE├OALESCE╤AND╬EW
- + LDX #FREE═EM╬EXT╨TR
- LDY #4
- JSR ZPLOAD
- LDX #3
- - LDA MP,X
- STA FREE╤,X
- LDA FREE═EM╬EXT╨TR,X
- STA MP,X
- DEX
- BPL -
- BMI FREE╙EARCH╠OOP
-
- FREE├OALESCE╤AND╬EW = *
- LDX #3
- - LDA FREE╤,X
- STA MP,X
- DEX
- BPL -
- LDA MP+3
- CMP #ACE═EM╬ULL
- BNE +
- ;** PREV IS HEAD
- LDX #3
- - LDA MALLOC╚EAD,X
- STA FREE═EM╬EXT╨TR,X
- LDA FREE╬EW╨TR,X
- STA MALLOC╚EAD,X
- DEX
- BPL -
- LDA FREE╠ENGTH+0
- LDY FREE╠ENGTH+1
- STA FREE═EM╠ENGTH+0
- STY FREE═EM╠ENGTH+1
- JMP FREE├OALESCE╬EW┴ND╨
-
- ;** PREV IS REAL
- + LDX #FREE═EM╬EXT╨TR
- LDY #6
- JSR ZPLOAD
- LDA MP+3
- CMP FREE╬EW╨TR+3
- BNE +
- LDA MP+2
- CMP FREE╬EW╨TR+2
- BNE +
- CLC
- LDA MP+0
- ADC FREE═EM╠ENGTH
- TAX
- LDA MP+1
- ADC FREE═EM╠ENGTH+1
- CMP FREE╬EW╨TR+1
- BNE +
- CPX FREE╬EW╨TR
- BNE +
- ;** PREV DOES COALESCE
- CLC
- LDA FREE═EM╠ENGTH
- ADC FREE╠ENGTH
- STA FREE═EM╠ENGTH
- LDA FREE═EM╠ENGTH+1
- ADC FREE╠ENGTH+1
- STA FREE═EM╠ENGTH+1
- LDX #3
- - LDA FREE╤,X
- STA FREE╬EW╨TR,X
- DEX
- BPL -
- BMI FREE├OALESCE╬EW┴ND╨
-
- ;** PREV DOES NOT COALESCE
- + LDX #FREE╬EW╨TR
- LDY #4
- JSR ZPSTORE
- LDA FREE╠ENGTH+0
- LDY FREE╠ENGTH+1
- STA FREE═EM╠ENGTH+0
- STY FREE═EM╠ENGTH+1
-
- FREE├OALESCE╬EW┴ND╨ = *
- LDA FREE╬EW╨TR+3
- CMP FREE═EM╬EXT╨TR+3
- BNE +
- LDA FREE╬EW╨TR+2
- CMP FREE═EM╬EXT╨TR+2
- BNE +
- CLC
- LDA FREE╬EW╨TR
- ADC FREE═EM╠ENGTH
- TAX
- LDA FREE╬EW╨TR+1
- ADC FREE═EM╠ENGTH+1
- CMP FREE═EM╬EXT╨TR+1
- BNE +
- CPX FREE═EM╬EXT╨TR
- BNE +
-
- ;** NEW AND NEXT COALESCE
- LDX #3
- - LDA FREE═EM╬EXT╨TR,X
- STA MP,X
- DEX
- BPL -
- LDA FREE═EM╠ENGTH+1
- PHA
- LDA FREE═EM╠ENGTH+0
- PHA
- LDX #FREE═EM╬EXT╨TR
- LDY #6
- JSR ZPLOAD
- CLC
- PLA
- ADC FREE═EM╠ENGTH+0
- STA FREE═EM╠ENGTH+0
- PLA
- ADC FREE═EM╠ENGTH+1
- STA FREE═EM╠ENGTH+1
-
- + LDX #3
- - LDA FREE╬EW╨TR,X
- STA MP,X
- DEX
- BPL -
- LDX #FREE═EM╬EXT╨TR
- LDY #6
- JSR ZPSTORE
- CLC
- RTS
-
- ;======== STANDARD LIBRARY ========
-
- EPUTS = *
- LDX #STDERR
- JMP FPUTS
- PUTS = *
- LDX #STDOUT
- FPUTS = *
- STA ZP+0
- STY ZP+1
- FPUTS┌P = *
- LDY #$FF
- - INY
- LDA (ZP),Y
- BNE -
- TYA
- LDY #0
- JMP WRITE
-
- PUTCHAR = *
- LDX #STDOUT
- PUTC = *
- STA PUTC┬UFFER
- LDA #<PUTC┬UFFER
- LDY #>PUTC┬UFFER
- STA ZP+0
- STY ZP+1
- LDA #1
- LDY #0
- JMP WRITE
- PUTC┬UFFER .BUF 1
-
- GETARG = *
- STY ZP+1
- ASL
- STA ZP+0
- ROL ZP+1
- CLC
- LDA ACE┴RGV
- ADC ZP+0
- STA ZP+0
- LDA ACE┴RGV+1
- ADC ZP+1
- STA ZP+1
- LDY #0
- LDA (ZP),Y
- TAX
- INY
- LDA (ZP),Y
- STX ZP+0
- STA ZP+1
- LDA ZP+0
- LDY ZP+1
- RTS
-
- ;END OF FILE + BLANK LINE
-
-