home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-02-12 | 28.6 KB | 1,493 lines |
- ;*** AS V1.00 PROGRAM: ONE-PASS ASSEMBLER - BY ├RAIG ┬RUCE - 15-╧CT-1994
-
- ; ╘HIS IS THE ┬UDDY-ASSEMBLER VERSION OF THE PROGRAM
-
- ;TODO: -IMPLEMENT STORAGE CLASSES: $00=INTERNAL, $01=REL.LABEL, $80=EXPORTED
- ; -IMPLEMENT ALL VAR TYPES: 0=VALUE, 1=ADDRESS, 2=ADDR.HIGH, 3=ADDR.LOW
- ; -IMPLEMENT SOURCE COLUMN, MAKE LINE:COL POINT TO START OF CUR TOKEN
- ; -MAKE IT SO YOU CAN USE A "\<├╥>" TO CONTINUE A LINE
- ; -ADD MORE OPERATORS: * / & ▄ ▐ FULL PRECEDENCE?
- ; -CACHE CURRENT SYMBOL
- ; -SUBTLE PROBLEM: SHORT BLOCKS ON READ WILL CAUSE TOKENS TO BE SPLIT
- ; BECAUSE OF BUFFER FILLING WITH SPACES. SOLUTION: PUSH SHORT BLOCKS
- ; TO HIGH END OF BUFFER, SET POINTER? BETTER SOLUTION: READ UNTIL
- ; BUFFER IS FULL OR EOF IS HIT.
-
- .SEQ ACEHEAD.S
- .ORG ACE┴PP┴DDRESS
- .OBJ "@0:AS"
-
- JMP MAIN
- .BYTE ACE╔─1,ACE╔─2,ACE╔─3
- .BYTE 64,0 ;** STACK,RESERVED
-
- ;======== GLOBAL DECLARATIONS ========
-
- SOURCE╞CB = 2 ;(1) ;FILE CONTROL BLOCK OF CURRENT INPUT FILE
- BUFPTR = 3 ;(1) ;BYTE OFFSET INSIDE OF SOURCE BUFFER
- SOURCE╠INE = 4 ;(4) ;SOURCE FILE CURRENT LINE
- NUMBER = 8 ;(4) ;TOKEN: 32-BIT NUMBER VALUE
- STRING╠EN = 12 ;(1) ;LENGTH OF STRING IN STRING BUFFER
- PREV├HAR = 13 ;(1) ;PREVIOUS CHARACTER SCANNED, NEXT READ (1-TOO-FAR)
- TOKEN╘YPE = 14 ;(1) ;TOKEN: TYPE
- TOKEN╬EXT├HAR = 15 ;(1) ;TOKEN: NEXT CHAR AFTER TOKEN
- TOKEN╬UM┬YTES = 16 ;(1) ;TOKEN: NUMBER LENGTH (1-4 BYTES)
- TOKEN├HAR = 17 ;(1) ;TOKEN: CHARACTER
- NAME = 18 ;(2) ;POINTER TO SOURCE FILENAME
- SOURCE├OL = 20 ;(1) ;SOURCE FILE COLUMN WITHIN LINE
- NEXT╨LUS╠AB = 22 ;(4) ;NUMBER FOR NEXT "+" LABEL
- PREV═INUS╠AB = 26 ;(4) ;NUMBER FOR PREVIOUS "-" LABEL
- ADDRESS = 30 ;(4) ;CURRENT MEMORY ADDRESS FOR CODE ASSEMBLY
- HASH╓AL = 34 ;(2) ;16-BIT HASH VALUE RESULT
- HASH╨TR = 36 ;(2) ;POINTER TO SELECTED ENTRY IN IDENTIFIER HASH TABLE
- ID╨TR = 38 ;(4) ;POINTER TO CURRENT IDENTIFIER DESCRIPTOR
- ID╓AL = 42 ;(4) ;VALUE OF CURRENT IDENTIFIER
- VAR╨TR = 46 ;(4) ;POINTER TO CURRENT IDENTIFIER TO BE DEFINED
- FILE╨TR = 50 ;(4) ;POINTER TO CURRENT FILE INFO DESCRIPTOR
- ID╘YPE = 54 ;(1) ;TYPE OF CURRENT IDENTIFIER (VALUE,ADDRESS,UNRES)
- ORIGIN╙ET = 55 ;(1) ;FLAG INDICATING WHETHER ORIGIN HAS BEEN SET
- EXP╨LUS├OUNT = 56 ;(1) ;NUMBER OF PLUS MONADIC OPERATORS OF AN OPERAND
- EXP═INUS├OUNT = 57 ;(1) ;NUMBER OF MINUS MONADIC OPERATORS OF AN OPERAND
- EXP╠ESS├OUNT = 58 ;(1) ;NUMBER OF LOW-BYTE MONADIC OPERATORS OF AN OPERAND
- EXP╟REATER├OUNT = 59 ;(1) ;NUMBER OF HIGH-BYTE MONADIC OPERATORS OF AN OPERAND
- EXP╧FFSET = 60 ;(1) ;OFFSET OF CUR OPERAND IN AN EXPRESSION DESCRIPTOR
- EXP╨TR = 62 ;(4) ;POINTER TO EXPRESSION DESCRIPTOR IN FAR MEMORY
- ADDRESS╧RIGIN = 66 ;(4) ;ORIGIN AS SET BY ORG DIRECTIVE
- HOLE├OUNT = 70 ;(4) ;NUMBER OF HOLES (UNRESOLVED REFERENCES)
- REL╚OLE├OUNT = 74 ;(4) ;NUMBER OF HOLES FOR RELATIVE (INTERNAL) REFERENCES
- INSTR╬UM = 78 ;(1) ;ASSEM INSTR: INSTRUCTION NUMBER (1-56)
- INSTR┴DDR═ODE = 79 ;(1) ;ASSEM INSTR: ADDRESSING MODE FOR INSTR (1-12)
- INSTR╓ALUE = 80 ;(2) ;ASSEM INSTR: OPERAND VALUE FOR INSTR (8/16 BIT)
- INSTR╓ALUE╘YPE = 82 ;(1) ;ASSEM INSTR: OPERAND VALUE TYPE
- INSTR╧PCODE = 83 ;(1) ;ASSEM INSTR: OPCODE OF INSTR/ADDRMODE
- INSTR╠EN = 84 ;(1) ;ASSEM INSTR: LENGTH OF INSTRUCTION
- MEM┬UF╨AGE = 85 ;(1) ;MEM PUT: PAGE OF BUFFER
- MEM┬UF╨TR = 86 ;(4) ;MEM PUT: POINTER TO 1╦ MEMORY-BUFFER BLOCK
- MEM╨UT╓ALS = 90 ;(4) ;MEM PUT: VALUES TO PUT INTO MEMORY
- MEM╨UT├OUNT = 94 ;(1) ;MEM PUT: NUMBER OF VALUES TO PUT INTO MEMORY
- MEM╨UT╨AGE = 95 ;(1) ;MEM PUT: CURRENT PAGE FOR VALUES
- NEW╠INE = 96 ;(4) ;CURRENT INPUT LINE
- NEW├OL = 100 ;(1) ;CURRENT INPUT COLUMN
- ARG = 102 ;(2) ;CURRENT COMMAND LINE ARGUMENT
- RESERVED = 104
- MEM╫ORK = 112 ;(16) ;WORK AREA FOR THE MEMORY ROUTINES/LOW-LEVEL WORK
- STR─ELIMIT = 112 ;(1) ;STRING TOKENIZE: DELIMITER--OVERLAP
- NUM┬ASE = 113 ;(1) ;NUMBER TOKENIZE: BASE--OVERLAP
- NUM╙AVE = 114 ;(4) ;NUMBER TOKENIZE: SAVE--OVERLAP
- WORK = 112 ;(16) ;MISCELLANEOUS WORK--LOW-LEVEL--OVERLAP
-
- HASH╘ABLE╨AGES = 16
- HASH╘ABLE┼NTRIES╚IGH = 4
- HASH╘ABLE═ASK = $03
- SYM╬EW = $81
- SYM╒NRESOLVED = $80
- SYM╞OUND = 0
-
- TOKEN╔DENTIFIER = 0
- TOKEN╬UMBER = 1
- TOKEN╙TRING = 2
- TOKEN╙PECIAL = 3
- TOKEN┼╧╞ = 4
-
- CHR├╥ = $0D
- CHR╤UOTE = $22
- CHR╘AB = $09
- CHR┼╧╞ = $00
-
- ERR╧K = 0 ;OK
- ERR╔DENT╘OO╠ONG = 1 ;AN IDENTIFIER TOKEN EXCEEDS 240 CHARS IN LENGTH
- ERR╙TRING╘OO╠ONG = 2 ;A STRING LITERAL EXCEEDS 255 CHARS IN LENGTH
- ERR╬O├LOSE╤UOTE = 3 ;RAN INTO A ├╥ BEFORE END OF STRING LITERAL
- ERR┬AD╬UMBER = 4 ;INVALID NUMERIC LITERAL
- ERR╬UM╧VERFLOW = 5 ;NUMERIC LITERAL VALUE OVERFLOWS 32-BITS
- ERR╙YNTAX = 6 ;SYNTAX ERROR
- ERR╔NVAL╙TR╧PERS = 7 ;ATTEMPT TO PERFORM NUMERIC OPERATORS ON A STRING
- ERR╘OO═ANY╧PERANDS = 8 ;EXPRESSION HAS MORE THAN 17 OPERANDS
- ERR╔NSUFFICIENT═EMORY = 9 ;RAN OUT OF MEMORY DURING COMPILATION PROCESS
- ERR╥EDEFINED╙YMBOL = 10 ;ATTEMPT TO REDEFINE A SYMBOL
- ERR╧RIGIN╬OT╙ET = 11 ;ATTEMPT TO ASSEMBLE CODE WITH CODE ORIGIN NOT SET
- ERR╔NTERN┴SSIGN = 12 ;INTERNAL ERROR: ATTEMPT TO ASSIGN TO UNEXPECTED ID
- ERR╬ON╬UM╔D┼XPR = 13 ;NON-NUMERIC SYMBOL IN A NUMERIC EXPRESSION
- ERR┼XPECT╧PERATOR = 14 ;EXPECTING AN OPERATOR
- ERR┼XPECT╧PERAND = 15 ;EXPECTING AN OPERAND
- ERR┼XPECT├OMMAND = 16 ;EXPECTING A COMMAND
- ERR╓ALUE╘OO╠ARGE = 17 ;VALUE IS TOO LARGE FOR OPERATION (OR IS NEGATIVE)
- ERR┬RANCH╘OO╞AR = 18 ;BRANCH OUT OF RANGE
- ERR╬OT╔MPLEMENTED = 19 ;FEATURE IS NOT (YET) IMPLEMENTED
- ERR╫RONG┴DMODE = 20 ;INSTRUCTION DOES NOT SUPPORT GIVEN ADDRESS MODE
- ERR┴DDRESS╫RAP = 21 ;ADDRESS WRAPED AROUND 64╦ CODE ADDRESS SPACE
- ERR╧BJECT╞ILE = 22 ;ERROR TRYING TO WRITE OUTPUT OBJECT FILE
- ERR╬OT╥ESOLVED┼XPR = 23 ;DIRECTIVE REQUIRES RESOLVED EXPRESSION
- ERR╧RIGIN┴LREADY╙ET = 24 ;CODE ORIGIN ALREADY SET; YOU CAN'T SET IT TWICE
- ERR╒NRESD╥EFERENCES = 25 ;UNRESOLVED REFERENCE
- ERR─OT├OMMAND = 26 ;THIS ASSEMBLER DOESN'T ACCEPT DOT COMMANDS
-
- DEBUG .BUF 1 ;DISPLAY DEBUG INFORMATION: $FF=YES, $00=NO
- SYM─UMP .BUF 1 ;DISPLAY SYMBOL TABLE DUMP: $FF=YES, $00=NO
- OUTPUT╘YPE .BUF 1 ;TYPE OF OUTPUT MODULE: $00=BINARY, $01=RELOC, $80=LINK
-
- ;======== MAIN ROUTINE ========
-
- MAIN = *
- ;** CHECK FOR LARGE ENOUGH ╘╨┴
- SEC
- LDA #<BSS┼ND
- CMP ACE═EM╘OP+0
- LDA #>BSS┼ND
- SBC ACE═EM╘OP+1
- BCS +
- JMP MAIN├ONT
- + LDA #<TPA═SG
- LDY #>TPA═SG
- JSR EPUTS
- DIE = *
- LDA #1
- LDX #0
- JMP EXIT
-
- TPA═SG = *
- .ASC "AS: ╔NSUFFICIENT PROGRAM SPACE TO RUN IN"
- .BYTE CHR├╥,0
-
- USAGE = *
- LDA #<USAGE═SG
- LDY #>USAGE═SG
- JSR EPUTS
- JMP DIE
-
- USAGE═SG = *
- .ASC "USAGE: AS [-HELP] [-S] [-D] [FILE ...]"
- .BYTE CHR├╥,CHR├╥
- .ASC " -HELP : PRODUCE THIS INFORMATION, DON'T RUN"
- .BYTE CHR├╥
- .ASC " -S : PRODUCE SYMBOL TABLE DUMP AT END"
- .BYTE CHR├╥
- .ASC " -D : PROVIDE DEBUGGING INFORMATION (LOTS)"
- .BYTE CHR├╥,0
-
- DEFAULT╔NPUT = *
- .ASC "-STDIN-"
- .BYTE 0
-
- FILENAME╒SED .BUF 1
-
- MAIN├ONT = *
- ;** INIT GLOBALS
- LDA #$00
- STA DEBUG ;DEFAULT OFF
- STA SYM─UMP ;DEFAULT NONE
- STA OUTPUT╘YPE ;DEFAULT BINARY
- LDA #$00
- STA FILENAME╒SED
- LDA #0
- STA ARG+0
- STA ARG+1
- JSR AS╔NIT
- LDX #7
- - LDA WRITE─EFAULT╬AME,X
- STA WRITE╬AME,X
- DEX
- BPL -
-
- MAIN╬EXT = *
- JSR CHECK╙TOP
- INC ARG+0
- BNE +
- INC ARG+1
- + LDA ARG+0
- LDY ARG+1
- JSR GETARG
- LDA ZP+0
- ORA ZP+1
- BEQ MAIN┼XIT
- LDA ZP+0
- LDY ZP+1
- STA NAME+0
- STY NAME+1
- LDY #0
- LDA (ZP),Y
- CMP #"-"
- BNE +
- JSR HANDLE╞LAGS
- JMP MAIN╬EXT
- + JSR ECHO
- JSR MAIN╞ILE
- JMP MAIN╬EXT
-
- MAIN┼XIT = *
- BIT FILENAME╒SED
- BMI +
- LDA #<DEFAULT╔NPUT
- LDY #>DEFAULT╔NPUT
- STA NAME+0
- STY NAME+1
- JSR ECHO
- JSR MAIN╙TDIN
- + LDA #$00
- LDX #3
- - ORA HOLE├OUNT
- DEX
- BPL -
- CMP #$00
- BEQ +
- JSR FIND╒NRES╙YMBOL
- LDA #ERR╒NRESD╥EFERENCES
- JMP ERROR╥EF
- + JSR WRITE╧BJECT╞ILE
- JSR DUMP╙YMBOL╘ABLE
- RTS
-
- HANDLE╞LAGS = *
- INY
- LDA (ZP),Y
- BNE +
- RTS
- + CMP #"S"
- BEQ FLAG╙
- CMP #"D"
- BEQ FLAG─
- JMP USAGE
-
- FLAG╙ = *
- LDA #$FF
- STA SYM─UMP
- JMP HANDLE╞LAGS
-
- FLAG─ = *
- LDA #$FF
- STA DEBUG
- JMP HANDLE╞LAGS
-
- ECHO = *
- LDA #<ECHO═SG1
- LDY #>ECHO═SG1
- JSR EPUTS
- JSR ECHO╬AME
- LDA #<ECHO═SG2
- LDY #>ECHO═SG2
- JMP EPUTS
- ECHO╬AME = *
- LDA NAME+0
- LDY NAME+1
- JMP EPUTS
-
- ECHO═SG1 = *
- .ASC "ASSEMBLING SOURCE FILE "
- .BYTE CHR╤UOTE,0
- ECHO═SG2 = *
- .BYTE CHR╤UOTE,CHR├╥,0
-
- MAIN╞ILE = *
- BIT FILENAME╒SED
- BMI +
- JSR MAIN┼XTRACT╧BJ
- + LDA NAME+0
- LDY NAME+1
- STA ZP+0
- STY ZP+1
- LDA #"R"
- JSR OPEN
- BCC +
- JSR ECHO╬AME
- LDA #<MAIN╞ILE┼RR
- LDY #>MAIN╞ILE┼RR
- JSR EPUTS
- JMP DIE
- + STA SOURCE╞CB
- JSR AS─RIVER
- LDA SOURCE╞CB
- JSR CLOSE
- LDA #$FF
- STA FILENAME╒SED
- RTS
- MAIN╞ILE┼RR = *
- .ASC ": ├ANNOT OPEN FILE"
- .BYTE CHR├╥,0
-
- MAIN╙TDIN = *
- LDA #STDIN
- STA SOURCE╞CB
- JSR AS─RIVER
- RTS
-
- MAIN┼XTRACT╧BJ = *
- LDX #0 ;COPY-START
- LDY #0
- - LDA (NAME),Y
- BEQ +++
- CMP #":"
- BEQ +
- CMP #"/"
- BNE ++
- + TYA
- TAX
- INX
- + INY
- BNE -
- + TXA
- TAY
- LDX #0
- - LDA (NAME),Y
- STA STRING┬UF,X
- BEQ +
- INY
- INX
- BNE -
- + NOP
- - CPX #3
- BCS +
- RTS
- + LDA STRING┬UF-2,X
- CMP #","
- BNE +
- LDA #0
- DEX
- DEX
- STA STRING┬UF,X
- JMP -
- + CMP #"."
- BEQ +
- RTS
- + LDA STRING┬UF-1,X
- CMP #"S"
- BEQ +
- RTS
- + CPX #18
- BCC +
- LDX #18
- + LDA #","
- STA STRING┬UF-2,X
- LDA #"P"
- STA STRING┬UF-1,X
- LDA #0
- STA STRING┬UF,X
- - LDA STRING┬UF,X
- STA WRITE╬AME,X
- DEX
- BPL -
- RTS
-
- AS╔NIT = * ;INITIALIZE VARIABLES FOR ASSEMBLY
- LDX #3
- LDA #0
- - STA NEW╠INE,X
- STA NEXT╨LUS╠AB,X
- STA PREV═INUS╠AB,X
- STA ADDRESS,X
- STA HOLE├OUNT,X
- STA REL╚OLE├OUNT,X
- DEX
- BPL -
- STA NEW├OL
- LDA #1
- STA NEW╠INE+0
- STA NEXT╨LUS╠AB+0
- LDA #$00
- STA ORIGIN╙ET
- LDA #<$1300
- LDY #>$1300
- STA ADDRESS+0
- STY ADDRESS+1
- STA ADDRESS╧RIGIN+0
- STY ADDRESS╧RIGIN+1
- JSR MALLOC╔NIT
- JSR INIT╙YMBOL╘ABLE
- JSR MEM╔NIT
- RTS
-
- ;======== DRIVER ========
-
- AS─RIVER = *
- LDA #$FF
- STA BUFPTR
- LDA #" "
- STA PREV├HAR
- - JSR PARSE
- BCC -
- RTS
-
- WRITE╧B╘RY .BUF 1
- WRITE╧B╞D .BUF 1
-
- WRITE╧BJECT╞ILE = *
- LDA #<WRITE═SG
- LDY #>WRITE═SG
- JSR EPUTS
- LDA #<WRITE╬AME
- LDY #>WRITE╬AME
- JSR EPUTS
- LDA #CHR╤UOTE
- LDX #STDERR
- JSR PUTC
- LDX #STDERR
- LDA #CHR├╥
- JSR PUTC
- LDA #2
- STA WRITE╧B╘RY
- LDA #<WRITE╬AME
- LDY #>WRITE╬AME
- STA ZP+0
- STY ZP+1
-
- ;** OPEN OBJECT FOR WRITING
- - LDA #"W"
- JSR OPEN
- BCC ++
- LDA ERRNO
- CMP #ACE┼RR╞ILE┼XISTS
- BEQ +
- - LDA #ERR╧BJECT╞ILE
- JMP ERROR
- + DEC WRITE╧B╘RY
- BEQ -
- JSR REMOVE
- BCS -
- JMP --
- + STA WRITE╧B╞D
-
- ;** WRITE OBJECT DATA
- LDA ADDRESS╧RIGIN+0
- LDX WRITE╧B╞D
- JSR PUTC
- LDA ADDRESS╧RIGIN+1
- LDX WRITE╧B╞D
- JSR PUTC
- LDA WRITE╧B╞D
- LDX ADDRESS╧RIGIN+0
- LDY ADDRESS╧RIGIN+1
- JSR MEM╙AVE
-
- ;** CLOSE OBJECT
- LDA WRITE╧B╞D
- JSR CLOSE
- BCC +
- LDA #ERR╧BJECT╞ILE
- JMP ERROR
- + LDA #<WRITE╥ANGE═SG1
- LDY #>WRITE╥ANGE═SG1
- JSR EPUTS
- LDA ADDRESS╧RIGIN+1
- LDX #STDERR
- JSR FPUTHEX
- LDA ADDRESS╧RIGIN+0
- LDX #STDERR
- JSR FPUTHEX
- LDA #<WRITE╥ANGE═SG2
- LDY #>WRITE╥ANGE═SG2
- JSR EPUTS
- SEC
- LDA ADDRESS+0
- SBC #1
- PHA
- LDA ADDRESS+1
- SBC #0
- LDX #STDERR
- JSR FPUTHEX
- PLA
- LDX #STDERR
- JSR FPUTHEX
- LDA #<WRITE╥ANGE═SG3
- LDY #>WRITE╥ANGE═SG3
- JSR EPUTS
- SEC
- LDA ADDRESS+0
- SBC ADDRESS╧RIGIN+0
- STA WORK+0
- LDA ADDRESS+1
- SBC ADDRESS╧RIGIN+1
- STA WORK+1
- LDA #0
- STA WORK+2
- STA WORK+3
- LDX #WORK
- JSR EPUTNUM
- LDA #<WRITE╥ANGE═SG4
- LDY #>WRITE╥ANGE═SG4
- JSR EPUTS
- RTS
-
- WRITE─EFAULT╬AME = *
- .ASC "A.OUT,P"
- .BYTE 0
- WRITE═SG = *
- .ASC "WRITING OBJECT FILE "
- .BYTE CHR╤UOTE,0
- WRITE╥ANGE═SG1 = *
- .ASC "CODE RANGE: $"
- .BYTE 0
- WRITE╥ANGE═SG2 = *
- .ASC "--$"
- .BYTE 0
- WRITE╥ANGE═SG3 = *
- .ASC " ("
- .BYTE 0
- WRITE╥ANGE═SG4 = *
- .ASC " BYTES)"
- .BYTE CHR├╥,0
-
- ;======== PARSER ========
-
- PARSE = *
- ;** AT BEGINNING OF COMMAND
- JSR CHECK╙TOP
- JSR GET╘OKEN
- LDA TOKEN╘YPE
- CMP #TOKEN┼╧╞
- BNE +
- SEC
- RTS
- + CMP #TOKEN╔DENTIFIER
- BNE PARSE╬OT╔D
- LDA TOKEN╬EXT├HAR
- CMP #"="
- BNE +
- JMP PARSE┼QUATE
- + CMP #":"
- BNE +
- JMP PARSE┴DDRESS
- + JMP PARSE╔DENTIFIER
-
- PARSE╬OT╔D = *
- CMP #TOKEN╙PECIAL
- BEQ +
- SYNTAX┼RROR = *
- LDA #ERR╙YNTAX
- JMP ERROR
- + LDA TOKEN├HAR
- CMP #CHR├╥
- BNE +
- JMP PARSE┼ND
- + CMP #"+"
- BNE +
- JMP PARSE╨LUS
- + CMP #"-"
- BNE +
- JMP PARSE═INUS
- + CMP #"#"
- BNE +
- JMP PARSE┼ND
- + CMP #"."
- BNE +
- JMP PARSE─OT├OMMAND
- + JMP SYNTAX┼RROR
-
- ;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
-
- PARSE┼QUATE = *
- JSR PARSE─EFINE╓AR
- JSR GET╘OKEN
- CPX #TOKEN╙PECIAL
- BEQ +
- - JMP SYNTAX┼RROR
- + CMP #"="
- BNE -
- LDA #0
- JSR PARSE┼XPRESSION
- CMP #CHR├╥
- BNE -
- JSR EVALUATE┼XPRESSION
- BCS +
- JSR ASSIGN╓ARIABLE
- JMP ++
- + JSR ADD╓ARIABLE╚OLE
- + BIT DEBUG
- BPL +
- LDA #<PARSE┼QUATE═SG
- LDY #>PARSE┼QUATE═SG
- JSR PUTS
- + JMP PARSE┼ND
- PARSE┼QUATE═SG = *
- .ASC "PARSE┼QUATE: ASSIGN PARSED EXPRESSION TO VARIABLE."
- .BYTE CHR├╥,0
-
- PARSE┴DDRESS = *
- JSR PARSE─EFINE╓AR
- JSR GET╘OKEN
- CPX #TOKEN╙PECIAL
- BEQ +
- - JMP SYNTAX┼RROR
- + CMP #":"
- BEQ +
- JMP SYNTAX┼RROR
- + JSR PARSE┴SSIGN┴DDRESS
- BIT DEBUG
- BPL +
- LDA #<PARSE┴DDRESS═SG
- LDY #>PARSE┴DDRESS═SG
- JSR PUTS
- + JMP PARSE┼ND
- PARSE┴DDRESS═SG = *
- .ASC "PARSE┴DDRESS: ASSIGN CURRENT ADDRESS TO VARIABLE."
- .BYTE CHR├╥,0
-
- PARSE┴SSIGN┴DDRESS = *
- BIT ORIGIN╙ET
- BMI +
- LDA #ERR╧RIGIN╬OT╙ET
- JMP ERROR
- + LDX #3
- - LDA ADDRESS,X
- STA ID╓AL,X
- DEX
- BPL -
- LDA #$01
- STA ID╘YPE
- JMP ASSIGN╓ARIABLE
-
- PARSE╨LUS = *
- LDA #"+"
- LDY #0
- JSR GEN╥EL╠ABEL
- JSR PARSE─EFINE╓AR
- JSR PARSE┴SSIGN┴DDRESS
- BIT DEBUG
- BPL +
- LDA #<PARSE╨LUS═SG
- LDY #>PARSE╨LUS═SG
- JSR PUTS
- LDX #NEXT╨LUS╠AB
- JSR PUTNUM
- LDA #CHR├╥
- JSR PUTCHAR
- + INC NEXT╨LUS╠AB+0
- BNE +
- INC NEXT╨LUS╠AB+1
- BNE +
- INC NEXT╨LUS╠AB+2
- BNE +
- INC NEXT╨LUS╠AB+3
- + JMP PARSE┼ND
- PARSE╨LUS═SG = *
- .ASC "PARSE╨LUS: ASSIGN CURRENT ADDRESS TO A SYNTHEIC '+' VARIABLE:"
- .BYTE 0
-
- PARSE═INUS = *
- INC PREV═INUS╠AB+0
- BNE +
- INC PREV═INUS╠AB+1
- BNE +
- INC PREV═INUS╠AB+2
- BNE +
- INC PREV═INUS╠AB+3
- + LDA #"-"
- LDY #0
- JSR GEN╥EL╠ABEL
- JSR PARSE─EFINE╓AR
- JSR PARSE┴SSIGN┴DDRESS
- BIT DEBUG
- BPL +
- LDA #<PARSE═INUS═SG
- LDY #>PARSE═INUS═SG
- JSR PUTS
- LDX #PREV═INUS╠AB
- JSR PUTNUM
- LDA #CHR├╥
- JSR PUTCHAR
- + JMP PARSE┼ND
- PARSE═INUS═SG = *
- .ASC "PARSE═INUS: ASSIGN CURRENT ADDRESS TO A SYNTHETIC '-' VARIABLE:"
- .BYTE 0
-
- GEN╥EL╠ABEL = * ;( .┴=TYPE, .┘=RELATIVE )
- STA STRING┬UF+1
- CMP #"+"
- BNE +
- CLC
- TYA
- ADC NEXT╨LUS╠AB
- STA NUMBER+0
- LDY #3
- LDX #1
- - LDA NEXT╨LUS╠AB,X
- ADC #0
- STA NUMBER,X
- INX
- DEY
- BNE -
- JMP ++
- + SEC
- STY NUMBER+0
- LDA PREV═INUS╠AB+0
- SBC NUMBER+0
- STA NUMBER+0
- LDY #3
- LDX #1
- - LDA PREV═INUS╠AB,X
- SBC #0
- STA NUMBER,X
- INX
- DEY
- BNE -
- + LDA #"╠"
- STA STRING┬UF+0
- LDA #<STRING┬UF+2
- LDY #>STRING┬UF+2
- STA ZP+0
- STY ZP+1
- LDX #NUMBER
- LDA #1
- JSR UTOA
- INY
- INY
- LDA #"C"
- STA STRING┬UF,Y
- INY
- LDA #0
- STA STRING┬UF,Y
- STY STRING╠EN
- RTS
-
- PARSE┼ND = *
- BIT DEBUG
- BPL +
- LDA #<PARSE┼ND═SG
- LDY #>PARSE┼ND═SG
- JSR PUTS
- + CLC
- RTS
- PARSE┼ND═SG = *
- .ASC "-----=-----"
- .BYTE CHR├╥,CHR├╥,0
-
- PARSE╔DENTIFIER = * ;LINE STARTING WITH AN IDENTIFIER
- JSR HASH
- ;** CHECK IF IDENTIFIER IS A PROCESSOR INSTRUCTION
- LDA STRING╠EN
- CMP #3
- BNE PARSE╔D╬OT╔NSTR
- LDA HASH╓AL+0
- AND #63
- TAX
- LDA INSTR╚ASH╨TRS,X
- CMP #100
- BCS +
- JSR PARSE╔D├HECK╔NSTR
- BCS PARSE╔D╬OT╔NSTR
- JMP INSTR
- + SEC
- SBC #100
- TAX
- - LDA INSTR╚ASH╔NDIRECTS,X
- BEQ PARSE╔D╬OT╔NSTR
- JSR PARSE╔D├HECK╔NSTR
- BCS +
- JMP INSTR
- + INX
- BNE -
-
- ;** CHECK IF IDENTIFIER IS A DIRECTIVE
- PARSE╔D╬OT╔NSTR = *
- JSR CHECK╔F─IRECTIVE
- BCS PARSE╔D╬OT─IRECTIVE
- JMP DIRECTIVE
-
- ;** CHECK IF IDENTIFIER IS A MACRO
- PARSE╔D╬OT─IRECTIVE = *
- LDA #ERR┼XPECT├OMMAND
- JMP ERROR
-
- PARSE─OT├OMMAND = *
- LDA #ERR─OT├OMMAND
- JMP ERROR
-
- ;======== HANDLE ASSEMBLER DIRECTIVES ========
-
- DIREC╬UM .BUF 1
-
- CHECK╔F─IRECTIVE = * ;( STRING┬UF, STRING╠EN ) : .├╙=NO, .┴=DIR╬UM
- LDA #0
- STA DIREC╬UM
-
- DIREC├HECK╬EXT = *
- LDX DIREC╬UM
- LDY DIREC╧FFSETS,X
- LDX #0
- - LDA STRING┬UF,X
- CMP DIREC╬AMES,Y
- BNE DIREC├HECK├ONT
- CMP #$00
- BNE +
- LDA DIREC╬UM
- CLC
- RTS
- + INY
- INX
- BNE -
-
- DIREC├HECK├ONT = *
- INC DIREC╬UM
- LDA DIREC╬UM
- CMP #16
- BCC DIREC├HECK╬EXT
- LDA #0
- SEC
- RTS
-
- DIREC╧FFSETS = *
- .BYTE 00,03,07,10,13,16,20,28,31,37,42,48,54,63,70
-
- DIREC╬AMES = *
- .ASC "DB" ;DN=01. OFF=00
- .BYTE 0
- .ASC "BUF" ;DN=02. OFF=03
- .BYTE 0
- .ASC "DW" ;DN=03. OFF=07
- .BYTE 0
- .ASC "DT" ;DN=04. OFF=10
- .BYTE 0
- .ASC "DL" ;DN=05. OFF=13
- .BYTE 0
- .ASC "ORG" ;DN=06. OFF=16
- .BYTE 0
- .ASC "INCLUDE" ;DN=07. OFF=20
- .BYTE 0
- .ASC "IF" ;DN=08. OFF=28
- .BYTE 0
- .ASC "ELSIF" ;DN=09. OFF=31
- .BYTE 0
- .ASC "ELSE" ;DN=10. OFF=37
- .BYTE 0
- .ASC "ENDIF" ;DN=11. OFF=42
- .BYTE 0
- .ASC "MACRO" ;DN=12. OFF=48
- .BYTE 0
- .ASC "ENDMACRO" ;DN=13. OFF=54
- .BYTE 0
- .ASC "EXPORT" ;DN=14. OFF=63
- .BYTE 0
- .ASC "BSS" ;DN=15. OFF=70
- .BYTE 0
-
- DIREC╓ECTORS = *
- .WORD DIREC─B,DIREC┬UF,DIREC─W,DIREC─T,DIREC─L,DIREC╧RG,DIREC╔NCLUDE
- .WORD DIREC╔F,DIREC┼LSIF,DIREC┼LSE,DIREC┼NDIF,DIREC═ACRO,DIREC┼NDMACRO
- .WORD DIREC┼XPORT,DIREC┬SS
-
- DIRECTIVE = * ;( .┴=DIR╬UM )
- BIT DEBUG
- BPL +
- PHA
- LDA #<DIREC═SG
- LDY #>DIREC═SG
- JSR PUTS
- PLA
- + ASL
- TAY
- LDA DIREC╓ECTORS+0,Y
- STA WORK+14
- LDA DIREC╓ECTORS+1,Y
- STA WORK+15
- JSR +
- JMP PARSE┼ND
- + JMP (WORK+14)
- DIREC═SG = *
- .ASC "MUST PARSE A DIRECTIVE"
- .BYTE CHR├╥,0
-
- DIREC╧RG = *
- BIT ORIGIN╙ET
- BPL +
- LDA #ERR╧RIGIN┴LREADY╙ET
- JMP ERROR
- + LDA #0
- JSR PARSE┼XPRESSION
- CMP #CHR├╥
- BEQ +
- JMP SYNTAX┼RROR
- + JSR EVALUATE┼XPRESSION
- BCC +
- LDA #ERR╬OT╥ESOLVED┼XPR
- JMP ERROR
- + LDA ID╓AL+2
- ORA ID╓AL+3
- BEQ +
- LDA #ERR╓ALUE╘OO╠ARGE
- JMP ERROR
- + LDA ID╓AL+0
- LDY ID╓AL+1
- STA ADDRESS+0
- STY ADDRESS+1
- STA ADDRESS╧RIGIN+0
- STY ADDRESS╧RIGIN+1
- LDA #$FF
- STA ORIGIN╙ET
- BIT DEBUG
- BPL +
- LDA #<DIREC╧RG═SG
- LDY #>DIREC╧RG═SG
- JSR PUTS
- LDA ID╓AL+1
- JSR PUTHEX
- LDA ID╓AL+0
- JSR PUTHEX
- LDA #CHR├╥
- JSR PUTCHAR
- + RTS
- DIREC╧RG═SG = *
- .ASC "SETTING CODE ORIGIN TO $"
- .BYTE 0
-
- DIREC─F╙IZE .BUF 1
- DIREC─F├HAR .BUF 1
-
- DIREC─B = *
- LDA #1
- BNE DIREC─L╔N
- DIREC─W = *
- LDA #2
- BNE DIREC─L╔N
- DIREC─T = *
- LDA #3
- BNE DIREC─L╔N
- DIREC─L = *
- LDA #4
- DIREC─L╔N = *
- STA DIREC─F╙IZE
- BIT ORIGIN╙ET
- BMI DIREC─F╬EXT
- LDA #ERR╧RIGIN╬OT╙ET
- JMP ERROR
-
- DIREC─F╬EXT = *
- LDA #1
- JSR PARSE┼XPRESSION
- STA DIREC─F├HAR
- CPX #0
- BEQ +
- JSR DIREC─F╙TRING
- JMP DIREC─F├ONT
- + JSR EVALUATE┼XPRESSION
- BCS ++
- LDX DIREC─F╙IZE
- - CPX #4
- BCS ++
- LDA ID╓AL,X
- BNE +
- INX
- BNE -
- + LDA #ERR╓ALUE╘OO╠ARGE
- JMP ERROR
- + LDA #1
- LDY #0
- STA DIREC─F├OUNT+0
- STY DIREC─F├OUNT+1
- JSR DIREC─F╨UT
-
- DIREC─F├ONT = *
- LDA DIREC─F├HAR
- CMP #","
- BEQ DIREC─F╬EXT
- CMP #CHR├╥
- BEQ +
- JMP SYNTAX┼RROR
- + RTS
-
- DIREC─F╙TR╨OS .BUF 1
-
- DIREC─F╙TRING = *
- LDA #0
- STA DIREC─F╙TR╨OS
- STA ID╘YPE
- STA ID╓AL+1
- STA ID╓AL+2
- STA ID╓AL+3
- - LDX DIREC─F╙TR╨OS
- CPX STRING╠EN
- BCC +
- RTS
- + LDA STRING┬UF,X
- STA ID╓AL+0
- LDA #1
- LDY #0
- STA DIREC─F├OUNT+0
- STY DIREC─F├OUNT+1
- JSR DIREC─F╨UT
- INC DIREC─F╙TR╨OS
- JMP -
-
- DIREC─F├OUNT .BUF 2
-
- DIREC─F╨UT = * ;(ADDRESS++, ID╓AL, ID╘YPE, DIREC─F╙IZE, DIREC─F├OUNT--, EXP┬UF)
- LDA DIREC─F├OUNT+0
- ORA DIREC─F├OUNT+1
- BNE +
- RTS
-
- ;** DEBUG INFORMATION
- + BIT DEBUG
- BPL +++
- LDA #<DIREC─F╨UT═SG1
- LDY #>DIREC─F╨UT═SG1
- JSR PUTS
- LDA ADDRESS+1
- JSR PUTHEX
- LDA ADDRESS+0
- JSR PUTHEX
- LDA #<DIREC─F╨UT═SG2
- LDY #>DIREC─F╨UT═SG2
- JSR PUTS
- BIT ID╘YPE
- BPL +
- LDA #"?"
- JSR PUTCHAR
- JMP ++
- + LDX #ID╓AL
- JSR PUTNUM
- + LDA #CHR├╥
- JSR PUTCHAR
-
- ;** HANDLE UNRESOLVED REFERENCE
- + BIT ID╘YPE
- BPL +
- LDX DIREC─F╙IZE
- LDA #0
- JSR ADD═EMORY╚OLE
-
- ;** HANDLE RESOLVED REFERENCE
- + LDX #3
- - LDA ID╓AL,X
- STA MEM╨UT╓ALS,X
- DEX
- BPL -
- LDA DIREC─F╙IZE
- LDX ADDRESS+0
- LDY ADDRESS+1
- JSR MEM╨UT
- ;** ADD RELOCATABLE REFERENCE
- LDA ID╘YPE
- BEQ +
- CMP #$04
- BCS +
- LDX ADDRESS+0
- LDY ADDRESS+1
- JSR RECORD╥ELOC╥EF
-
- ;** GO ONTO NEXT PUT
- + CLC
- LDA ADDRESS+0
- ADC DIREC─F╙IZE
- STA ADDRESS+0
- BCC +
- INC ADDRESS+1
- BNE +
- LDA #ERR┴DDRESS╫RAP
- JMP ERROR
- + LDA DIREC─F├OUNT+0
- BNE +
- DEC DIREC─F├OUNT+1
- + DEC DIREC─F├OUNT+0
- JMP DIREC─F╨UT
-
- DIREC─F╨UT═SG1 = *
- .ASC "DEFINE-PUT: ADDRESS=$"
- .BYTE 0
- DIREC─F╨UT═SG2 = *
- .ASC ", VALUE="
- .BYTE 0
-
- DIREC┬UF = *
- BIT ORIGIN╙ET
- BMI +
- LDA #ERR╧RIGIN╬OT╙ET
- JMP ERROR
- + LDA #0
- JSR PARSE┼XPRESSION
- CMP #CHR├╥
- BEQ +
- JMP SYNTAX┼RROR
- + JSR EVALUATE┼XPRESSION
- BCC +
- LDA #ERR╬OT╥ESOLVED┼XPR
- JMP ERROR
- + LDA ID╓AL+2
- ORA ID╓AL+3
- BEQ +
- LDA #ERR╓ALUE╘OO╠ARGE
- JMP ERROR
- + LDA ID╓AL+0
- LDY ID╓AL+1
- STA DIREC─F├OUNT+0
- STY DIREC─F├OUNT+1
- + LDA #0
- STA ID╘YPE
- STA ID╓AL+0
- STA ID╓AL+1
- STA ID╓AL+2
- STA ID╓AL+3
- LDA #1
- STA DIREC─F╙IZE
- JSR DIREC─F╨UT
- RTS
-
- DIREC╔NCLUDE = *
- DIREC╔F = *
- DIREC┼LSIF = *
- DIREC┼LSE = *
- DIREC┼NDIF = *
- DIREC═ACRO = *
- DIREC┼NDMACRO = *
- DIREC┼XPORT = *
- LDA #ERR╬OT╔MPLEMENTED
- JMP ERROR
- DIREC┬SS = *
- BIT ORIGIN╙ET
- BPL +
- LDA #ERR╧RIGIN╬OT╙ET
- JMP ERROR
- + NOP
- LDA #ERR╬OT╔MPLEMENTED
- JMP ERROR
-
- ;======== ERROR HANDLER ========
-
- ERROR├ODE .BUF 1
- ERROR╨OS .BUF 1
- ERROR┼XIT├ODE = ACE┼XIT─ATA+0 ;$FC8A09CB:EDITOR-REPOS
- ERROR┼XIT╠INE = ACE┼XIT─ATA+4
- ERROR┼XIT├OL = ACE┼XIT─ATA+8
- ERROR┼XIT╥EPOS = ACE┼XIT─ATA+12
- ERROR┼XIT╞ILEP = ACE┼XIT─ATA+13
- ERROR┼XIT╥ESER = ACE┼XIT─ATA+14
- ERROR┬UF = ACE┼XIT─ATA+15
-
- ERROR╥EF = *
- JSR ERROR╨RERAMBLE
- LDA #<ERROR═SG2
- LDY #>ERROR═SG2
- JSR ERROR├AT
- LDX #3
- - LDA EXP╙RC╠INE,X
- STA WORK+0,X
- LDA EXP╙RC╞ILE,X
- STA WORK+4,X
- DEX
- BPL -
- LDA EXP╙RC├OL
- LDX #WORK+0
- LDY #WORK+4
- JSR ERROR─ISP╞ILE
- JMP ERROR╔N
-
- ERROR╨RERAMBLE = *
- STA ERROR├ODE
- LDX #14
- - LDA ERROR┼XIT╚EAD,X
- STA ERROR┼XIT├ODE,X
- DEX
- BPL -
- LDA #0
- STA ERROR╨OS
- LDA #<ERROR═SG1
- LDY #>ERROR═SG1
- JSR ERROR├AT
- LDX #SOURCE╠INE
- LDY #FILE╨TR
- LDA SOURCE├OL
- JMP ERROR─ISP╞ILE
-
- ERROR = *
- JSR ERROR╨RERAMBLE
- ERROR╔N = *
- LDX ERROR╨OS
- LDA #" "
- STA ERROR┬UF,X
- INC ERROR╨OS
- LDA ERROR├ODE
- ASL
- TAX
- LDA ERR─ESC+1,X
- TAY
- LDA ERR─ESC+0,X
- JSR ERROR├AT
- LDA ERROR├ODE
- CMP #ERR╒NRESD╥EFERENCES
- BNE +
- LDA #<SYM╬AME
- LDY #>SYM╬AME
- JSR ERROR├AT
- + LDA #<ERROR┬UF
- LDY #>ERROR┬UF
- JSR EPUTS
- LDA #CHR├╥
- LDX #STDERR
- JSR PUTC
- LDA #1
- LDX #0
- JMP EXIT
-
- ERR─ISP╞I╞P .BUF 1
- ERR─ISP╞I├OL .BUF 1
- ERR─ISP╞I╠IN .BUF 1
-
- ERROR─ISP╞ILE = * ;( .╪=ZP╠INE╧FF, .┴=COL, .┘=ZP╞ILE╨TR, ERROR╨OS ) : ERROR╨OS
- ;** USES NAME INSTEAD OF FILE╨TR FOR NOW
- ;** PRODUCES OUTPUT OF THE FORM: ("FILENAME":1234:12)
- STA ERR─ISP╞I├OL
- STX ERR─ISP╞I╠IN
- STY ERR─ISP╞I╞P
- LDX ERROR╨OS
- LDA #"("
- STA ERROR┬UF,X
- INX
- LDA #CHR╤UOTE
- STA ERROR┬UF,X
- INX
- STX ERROR╨OS
- LDA NAME+0
- LDY NAME+1
- JSR ERROR├AT
- LDA #CHR╤UOTE
- STA ERROR┬UF,X
- INX
- LDA #":"
- STA ERROR┬UF,X
- INX
- STX ERROR╨OS
- LDX ERR─ISP╞I╠IN
- JSR ERROR─ISP╞ILE┴PNUM
- LDA #":"
- STA ERROR┬UF,X
- INX
- STX ERROR╨OS
- LDA ERR─ISP╞I├OL
- STA NUMBER+0
- LDA #0
- STA NUMBER+1
- STA NUMBER+2
- STA NUMBER+3
- LDX #NUMBER
- JSR ERROR─ISP╞ILE┴PNUM
- LDA #")"
- STA ERROR┬UF,X
- INX
- STX ERROR╨OS
- RTS
-
- ERROR─ISP╞ILE┴PNUM = * ;( .╪=ZPOFF, ERROR╨OS ) : .╪=ERROR╨OS
- LDA #<PUTNUM╬UM
- LDY #>PUTNUM╬UM
- STA ZP+0
- STY ZP+1
- LDA #1
- JSR UTOA
- LDA #<PUTNUM╬UM
- LDY #>PUTNUM╬UM
- ;** FALL THROUGH
-
- ERROR├AT = * ;( .┴┘=STR, ERROR╨OS ) : .╪=ERROR╨OS
- STA WORK+14
- STY WORK+15
- LDX ERROR╨OS
- LDY #0
- - LDA (WORK+14),Y
- STA ERROR┬UF,X
- BEQ +
- INX
- INY
- BNE -
- + STX ERROR╨OS
- RTS
-
- ERROR┼XIT╚EAD = *
- .BYTE $FC,$8A,$09,$CB,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$06,$00
- ERROR═SG1 = *
- .ASC "ERR "
- .BYTE 0
- ERROR═SG2 = *
- .ASC ", REF"
- .BYTE 0
-
- ERR─ESC .WORD ERR00,ERR01,ERR02,ERR03,ERR04,ERR05,ERR06,ERR07,ERR08,ERR09
- .WORD ERR10,ERR11,ERR12,ERR13,ERR14,ERR15,ERR16,ERR17,ERR18,ERR19
- .WORD ERR20,ERR21,ERR22,ERR23,ERR24,ERR25,ERR26
-
- ERR00 .ASC "╧K--NO ERROR"
- .BYTE 0
- ERR01 .ASC "┴N IDENTIFIER TOKEN EXCEEDS 240 CHARS IN LENGTH"
- .BYTE 0
- ERR02 .ASC "┴ STRING LITERAL EXCEEDS 240 CHARS IN LENGTH"
- .BYTE 0
- ERR03 .ASC "╥AN INTO A ├╥ BEFORE END OF STRING LITERAL"
- .BYTE 0
- ERR04 .ASC "╔NVALID NUMERIC LITERAL"
- .BYTE 0
- ERR05 .ASC "╬UMERIC LITERAL VALUE OVERFLOWS 32-BITS"
- .BYTE 0
- ERR06 .ASC "╙YNTAX ERROR"
- .BYTE 0
- ERR07 .ASC "┴TTEMPT TO PERFORM NUMERIC OPERATORS ON A STRING"
- .BYTE 0
- ERR08 .ASC "┼XPRESSION HAS MORE THAN 17 OPERANDS"
- .BYTE 0
- ERR09 .ASC "╥AN OUT OF MEMORY DURING COMPILATION PROCESS"
- .BYTE 0
- ERR10 .ASC "┴TTEMPT TO REDEFINE A SYMBOL"
- .BYTE 0
- ERR11 .ASC "┴TTEMPT TO ASSEMBLE CODE WITH CODE ORIGIN NOT SET"
- .BYTE 0
- ERR12 .ASC "╔NTERNAL ERROR: ATTEMPT TO ASSIGN TO UNEXPECTED ID"
- .BYTE 0
- ERR13 .ASC "╬ON-NUMERIC SYMBOL IN A NUMERIC EXPRESSION"
- .BYTE 0
- ERR14 .ASC "┼XPECTING AN OPERATOR"
- .BYTE 0
- ERR15 .ASC "┼XPECTING AN OPERAND"
- .BYTE 0
- ERR16 .ASC "┼XPECTING A COMMAND"
- .BYTE 0
- ERR17 .ASC "╓ALUE IS TOO LARGE OR NEGATIVE"
- .BYTE 0
- ERR18 .ASC "┬RANCH OUT OF RANGE"
- .BYTE 0
- ERR19 .ASC "╞EATURE IS NOT (YET) IMPLEMENTED"
- .BYTE 0
- ERR20 .ASC "╔NSTRUCTION DOES NOT SUPPORT GIVEN ADDRESS MODE"
- .BYTE 0
- ERR21 .ASC "┴DDRESS WRAPED AROUND 64╦ CODE ADDRESS SPACE"
- .BYTE 0
- ERR22 .ASC "┼RROR TRYING TO WRITE OUTPUT OBJECT FILE"
- .BYTE 0
- ERR23 .ASC "─IRECTIVE REQUIRES RESOLVED EXPRESSION"
- .BYTE 0
- ERR24 .ASC "├ODE ORIGIN ALREADY SET; YOU CAN'T SET IT TWICE"
- .BYTE 0
- ERR25 .ASC "╒NRESOLVED SYMBOL: "
- .BYTE 0
- ERR26 .ASC "╘HUS ASSEMBLER DOESN'T ACCEPT .DOT COMMANDS, ┬UDDY!"
- .BYTE 0
-
- WPUTNUM = *
- LDA #STDOUT
- STA PUTNUM╞D
- JMP PUTNUM╔N
- EPUTNUM = *
- LDA #STDERR
- JMP FPUTNUM
- PUTNUM = *
- LDA #STDOUT
- FPUTNUM = *
- STA PUTNUM╞D
- LDY #1
- PUTNUM╔N = *
- LDA #<PUTNUM╬UM
- STA ZP+0
- LDA #>PUTNUM╬UM
- STA ZP+1
- TYA
- JSR UTOA
- LDX PUTNUM╞D
- JMP FPUTS┌P
-
- PUTNUM╞D .BUF 1
- PUTNUM╬UM .BUF 11
-
- PUTHEX = * ;( .┴=VALUE )
- LDX #STDOUT
- FPUTHEX = * ;( .┴=VALUE, .╪=FD )
- STX PUTNUM╞D
- PHA
- LSR
- LSR
- LSR
- LSR
- TAX
- LDA PUTHEX├HARS,X
- LDX PUTNUM╞D
- JSR PUTC
- PLA
- AND #$0F
- TAX
- LDA PUTHEX├HARS,X
- LDX PUTNUM╞D
- JSR PUTC
- RTS
- PUTHEX├HARS = *
- .ASC "0123456789ABCDEF"
-
- CHECK╙TOP = *
- JSR STOPKEY
- BCS +
- RTS
- + LDA #<STOPPED═SG
- LDY #>STOPPED═SG
- JSR EPUTS
- LDA #1
- LDX #0
- JMP EXIT
-
- STOPPED═SG = *
- .ASC "<╙TOPPED>"
- .BYTE CHR├╥,0
-
- ;======== UTILITY FUNCTIONS ========
-
- INC╠ONG = * ;( .╪=ZP╧FFSET )
- INC 0,X
- BNE +
- INC 1,X
- BNE +
- INC 2,X
- BNE +
- INC 3,X
- + RTS
-
- DEC╠ONG = * ;( .╪=ZP╧FFSET )
- SEC
- LDA 0,X
- SBC #1
- STA 0,X
- INX
- LDY #3
- - LDA 0,X
- SBC #0
- STA 0,X
- INX
- DEY
- BNE -
- RTS
-
- ;======== INCLUDED FILES ========
-
- .SEQ ASHELP.S
-
- ;======== BSS ========
-
- BSS = *
- SOURCE┬UF = BSS+0 ;( 256 BYTES)
- STRING┬UF = SOURCE┬UF+256 ;( 256 BYTES)
- SYM┬UF = STRING┬UF+256 ;( 256 BYTES)
- SYM╬EXT = SYM┬UF+0
- SYM╓ALUE = SYM┬UF+4
- SYM╒NRES╧PND = SYM┬UF+8
- SYM╘YPE = SYM┬UF+9
- SYM├LASS = SYM┬UF+10
- SYM╬AME╠EN = SYM┬UF+11
- SYM╬AME = SYM┬UF+12
- SYM╚ASH = SYM┬UF+254
- EXP╘ABLE = SYM┬UF+256 ;( 256 BYTES == 15 ENTRIES)
- EXP╚OLE╘YPE = EXP╘ABLE+0
- EXP╠ENGTH = EXP╘ABLE+1
- EXP╒NRES├NT = EXP╘ABLE+2
- EXP╙RC├OL = EXP╘ABLE+3
- EXP╚OLE┴DDR = EXP╘ABLE+4
- EXP╙RC╠INE = EXP╘ABLE+8
- EXP╙RC╞ILE = EXP╘ABLE+12
- EXP╞IELD = EXP╘ABLE+0
- EXP╧P = EXP╞IELD+0
- EXP╘YPE = EXP╞IELD+1
- EXP╙IGN = EXP╞IELD+2
- EXP╚I╠O = EXP╞IELD+3
- EXP╓ALUE = EXP╞IELD+4
- EXP╬EXT╒NRES = EXP╞IELD+8
- EXP╬EXT╧PND = EXP╞IELD+12
- EXP╥ESERVED = EXP╞IELD+13
- IDENT╚ASH╘ABLE = EXP╘ABLE+256 ;(4096 BYTES == 1024 ENTRIES (REF:H╘AB╨AG)
- MEM╨TR╘ABLE = IDENT╚ASH╘ABLE+4096 ;( 256 BYTES == 64 ENTRIES)
- MEM┬UF = MEM╨TR╘ABLE+256 ;( 256 BYTES)
- WRITE╬AME = MEM┬UF+256 ;( 20 BYTES)
- TPA╞REEMAP = WRITE╬AME+20 ;( 256 BYTES)
- BSS┼ND = TPA╞REEMAP+256
-