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

  1. ;*** AS V1.00 PROGRAM: ONE-PASS ASSEMBLER  -  BY ├RAIG ┬RUCE  -  15-╧CT-1994
  2.  
  3. ; ╘HIS IS THE ┬UDDY-ASSEMBLER VERSION OF THE PROGRAM
  4.  
  5. ;TODO: -IMPLEMENT STORAGE CLASSES: $00=INTERNAL, $01=REL.LABEL, $80=EXPORTED
  6. ;      -IMPLEMENT ALL VAR TYPES: 0=VALUE, 1=ADDRESS, 2=ADDR.HIGH, 3=ADDR.LOW
  7. ;      -IMPLEMENT SOURCE COLUMN, MAKE LINE:COL POINT TO START OF CUR TOKEN
  8. ;      -MAKE IT SO YOU CAN USE A "\<├╥>" TO CONTINUE A LINE
  9. ;      -ADD MORE OPERATORS: * / & ▄ ▐  FULL PRECEDENCE?
  10. ;      -CACHE CURRENT SYMBOL
  11. ;      -SUBTLE PROBLEM: SHORT BLOCKS ON READ WILL CAUSE TOKENS TO BE SPLIT
  12. ;       BECAUSE OF BUFFER FILLING WITH SPACES.  SOLUTION: PUSH SHORT BLOCKS
  13. ;       TO HIGH END OF BUFFER, SET POINTER?  BETTER SOLUTION: READ UNTIL
  14. ;       BUFFER IS FULL OR EOF IS HIT.
  15.  
  16. .SEQ ACEHEAD.S
  17. .ORG ACE┴PP┴DDRESS
  18. .OBJ "@0:AS"
  19.  
  20. JMP MAIN
  21. .BYTE ACE╔─1,ACE╔─2,ACE╔─3
  22. .BYTE 64,0  ;** STACK,RESERVED
  23.  
  24. ;======== GLOBAL DECLARATIONS ========
  25.  
  26. SOURCE╞CB     =  2  ;(1)   ;FILE CONTROL BLOCK OF CURRENT INPUT FILE
  27. BUFPTR        =  3  ;(1)   ;BYTE OFFSET INSIDE OF SOURCE BUFFER
  28. SOURCE╠INE    =  4  ;(4)   ;SOURCE FILE CURRENT LINE
  29. NUMBER        =  8  ;(4)   ;TOKEN: 32-BIT NUMBER VALUE
  30. STRING╠EN     = 12  ;(1)   ;LENGTH OF STRING IN STRING BUFFER
  31. PREV├HAR      = 13  ;(1)   ;PREVIOUS CHARACTER SCANNED, NEXT READ (1-TOO-FAR)
  32. TOKEN╘YPE     = 14  ;(1)   ;TOKEN: TYPE 
  33. TOKEN╬EXT├HAR = 15  ;(1)   ;TOKEN: NEXT CHAR AFTER TOKEN
  34. TOKEN╬UM┬YTES = 16  ;(1)   ;TOKEN: NUMBER LENGTH (1-4 BYTES)
  35. TOKEN├HAR     = 17  ;(1)   ;TOKEN: CHARACTER
  36. NAME          = 18  ;(2)   ;POINTER TO SOURCE FILENAME
  37. SOURCE├OL     = 20  ;(1)   ;SOURCE FILE COLUMN WITHIN LINE
  38. NEXT╨LUS╠AB   = 22  ;(4)   ;NUMBER FOR NEXT "+" LABEL
  39. PREV═INUS╠AB  = 26  ;(4)   ;NUMBER FOR PREVIOUS "-" LABEL
  40. ADDRESS       = 30  ;(4)   ;CURRENT MEMORY ADDRESS FOR CODE ASSEMBLY
  41. HASH╓AL       = 34  ;(2)   ;16-BIT HASH VALUE RESULT
  42. HASH╨TR       = 36  ;(2)   ;POINTER TO SELECTED ENTRY IN IDENTIFIER HASH TABLE
  43. ID╨TR         = 38  ;(4)   ;POINTER TO CURRENT IDENTIFIER DESCRIPTOR
  44. ID╓AL         = 42  ;(4)   ;VALUE OF CURRENT IDENTIFIER
  45. VAR╨TR        = 46  ;(4)   ;POINTER TO CURRENT IDENTIFIER TO BE DEFINED
  46. FILE╨TR       = 50  ;(4)   ;POINTER TO CURRENT FILE INFO DESCRIPTOR
  47. ID╘YPE        = 54  ;(1)   ;TYPE OF CURRENT IDENTIFIER (VALUE,ADDRESS,UNRES)
  48. ORIGIN╙ET     = 55  ;(1)   ;FLAG INDICATING WHETHER ORIGIN HAS BEEN SET
  49. EXP╨LUS├OUNT  = 56  ;(1)   ;NUMBER OF PLUS MONADIC OPERATORS OF AN OPERAND
  50. EXP═INUS├OUNT = 57  ;(1)   ;NUMBER OF MINUS MONADIC OPERATORS OF AN OPERAND
  51. EXP╠ESS├OUNT  = 58  ;(1)   ;NUMBER OF LOW-BYTE MONADIC OPERATORS OF AN OPERAND
  52. EXP╟REATER├OUNT = 59 ;(1)  ;NUMBER OF HIGH-BYTE MONADIC OPERATORS OF AN OPERAND
  53. EXP╧FFSET     = 60  ;(1)   ;OFFSET OF CUR OPERAND IN AN EXPRESSION DESCRIPTOR
  54. EXP╨TR        = 62  ;(4)   ;POINTER TO EXPRESSION DESCRIPTOR IN FAR MEMORY
  55. ADDRESS╧RIGIN = 66  ;(4)   ;ORIGIN AS SET BY ORG DIRECTIVE
  56. HOLE├OUNT     = 70  ;(4)   ;NUMBER OF HOLES (UNRESOLVED REFERENCES)
  57. REL╚OLE├OUNT  = 74  ;(4)   ;NUMBER OF HOLES FOR RELATIVE (INTERNAL) REFERENCES
  58. INSTR╬UM      = 78  ;(1)   ;ASSEM INSTR: INSTRUCTION NUMBER (1-56)
  59. INSTR┴DDR═ODE = 79  ;(1)   ;ASSEM INSTR: ADDRESSING MODE FOR INSTR (1-12)
  60. INSTR╓ALUE    = 80  ;(2)   ;ASSEM INSTR: OPERAND VALUE FOR INSTR (8/16 BIT)
  61. INSTR╓ALUE╘YPE = 82 ;(1)   ;ASSEM INSTR: OPERAND VALUE TYPE
  62. INSTR╧PCODE   = 83  ;(1)   ;ASSEM INSTR: OPCODE OF INSTR/ADDRMODE
  63. INSTR╠EN      = 84  ;(1)   ;ASSEM INSTR: LENGTH OF INSTRUCTION
  64. MEM┬UF╨AGE    = 85  ;(1)   ;MEM PUT: PAGE OF BUFFER
  65. MEM┬UF╨TR     = 86  ;(4)   ;MEM PUT: POINTER TO 1╦ MEMORY-BUFFER BLOCK
  66. MEM╨UT╓ALS    = 90  ;(4)   ;MEM PUT: VALUES TO PUT INTO MEMORY
  67. MEM╨UT├OUNT   = 94  ;(1)   ;MEM PUT: NUMBER OF VALUES TO PUT INTO MEMORY
  68. MEM╨UT╨AGE    = 95  ;(1)   ;MEM PUT: CURRENT PAGE FOR VALUES
  69. NEW╠INE       = 96  ;(4)   ;CURRENT INPUT LINE
  70. NEW├OL        = 100 ;(1)   ;CURRENT INPUT COLUMN
  71. ARG           = 102 ;(2)   ;CURRENT COMMAND LINE ARGUMENT
  72. RESERVED      = 104
  73. MEM╫ORK       = 112 ;(16)  ;WORK AREA FOR THE MEMORY ROUTINES/LOW-LEVEL WORK
  74. STR─ELIMIT    = 112 ;(1)   ;STRING TOKENIZE: DELIMITER--OVERLAP
  75. NUM┬ASE       = 113 ;(1)   ;NUMBER TOKENIZE: BASE--OVERLAP
  76. NUM╙AVE       = 114 ;(4)   ;NUMBER TOKENIZE: SAVE--OVERLAP
  77. WORK          = 112 ;(16)  ;MISCELLANEOUS WORK--LOW-LEVEL--OVERLAP
  78.  
  79. HASH╘ABLE╨AGES = 16
  80. HASH╘ABLE┼NTRIES╚IGH = 4
  81. HASH╘ABLE═ASK  = $03
  82. SYM╬EW = $81
  83. SYM╒NRESOLVED = $80
  84. SYM╞OUND = 0
  85.  
  86. TOKEN╔DENTIFIER = 0
  87. TOKEN╬UMBER  = 1
  88. TOKEN╙TRING  = 2
  89. TOKEN╙PECIAL = 3
  90. TOKEN┼╧╞     = 4
  91.  
  92. CHR├╥ = $0D
  93. CHR╤UOTE = $22
  94. CHR╘AB = $09
  95. CHR┼╧╞ = $00
  96.  
  97. ERR╧K            = 0       ;OK
  98. ERR╔DENT╘OO╠ONG  = 1       ;AN IDENTIFIER TOKEN EXCEEDS 240 CHARS IN LENGTH
  99. ERR╙TRING╘OO╠ONG = 2       ;A STRING LITERAL EXCEEDS 255 CHARS IN LENGTH
  100. ERR╬O├LOSE╤UOTE  = 3       ;RAN INTO A ├╥ BEFORE END OF STRING LITERAL
  101. ERR┬AD╬UMBER     = 4       ;INVALID NUMERIC LITERAL
  102. ERR╬UM╧VERFLOW   = 5       ;NUMERIC LITERAL VALUE OVERFLOWS 32-BITS
  103. ERR╙YNTAX        = 6       ;SYNTAX ERROR
  104. ERR╔NVAL╙TR╧PERS = 7       ;ATTEMPT TO PERFORM NUMERIC OPERATORS ON A STRING
  105. ERR╘OO═ANY╧PERANDS = 8     ;EXPRESSION HAS MORE THAN 17 OPERANDS
  106. ERR╔NSUFFICIENT═EMORY = 9  ;RAN OUT OF MEMORY DURING COMPILATION PROCESS
  107. ERR╥EDEFINED╙YMBOL = 10    ;ATTEMPT TO REDEFINE A SYMBOL
  108. ERR╧RIGIN╬OT╙ET  = 11      ;ATTEMPT TO ASSEMBLE CODE WITH CODE ORIGIN NOT SET
  109. ERR╔NTERN┴SSIGN  = 12      ;INTERNAL ERROR: ATTEMPT TO ASSIGN TO UNEXPECTED ID
  110. ERR╬ON╬UM╔D┼XPR  = 13      ;NON-NUMERIC SYMBOL IN A NUMERIC EXPRESSION
  111. ERR┼XPECT╧PERATOR = 14     ;EXPECTING AN OPERATOR
  112. ERR┼XPECT╧PERAND = 15      ;EXPECTING AN OPERAND
  113. ERR┼XPECT├OMMAND = 16      ;EXPECTING A COMMAND
  114. ERR╓ALUE╘OO╠ARGE = 17      ;VALUE IS TOO LARGE FOR OPERATION (OR IS NEGATIVE)
  115. ERR┬RANCH╘OO╞AR  = 18      ;BRANCH OUT OF RANGE
  116. ERR╬OT╔MPLEMENTED = 19     ;FEATURE IS NOT (YET) IMPLEMENTED
  117. ERR╫RONG┴DMODE   = 20      ;INSTRUCTION DOES NOT SUPPORT GIVEN ADDRESS MODE
  118. ERR┴DDRESS╫RAP   = 21      ;ADDRESS WRAPED AROUND 64╦ CODE ADDRESS SPACE
  119. ERR╧BJECT╞ILE    = 22      ;ERROR TRYING TO WRITE OUTPUT OBJECT FILE
  120. ERR╬OT╥ESOLVED┼XPR = 23    ;DIRECTIVE REQUIRES RESOLVED EXPRESSION
  121. ERR╧RIGIN┴LREADY╙ET = 24   ;CODE ORIGIN ALREADY SET; YOU CAN'T SET IT TWICE
  122. ERR╒NRESD╥EFERENCES = 25   ;UNRESOLVED REFERENCE
  123. ERR─OT├OMMAND    = 26      ;THIS ASSEMBLER DOESN'T ACCEPT DOT COMMANDS
  124.  
  125. DEBUG      .BUF 1  ;DISPLAY DEBUG INFORMATION: $FF=YES, $00=NO
  126. SYM─UMP    .BUF 1  ;DISPLAY SYMBOL TABLE DUMP: $FF=YES, $00=NO
  127. OUTPUT╘YPE .BUF 1  ;TYPE OF OUTPUT MODULE: $00=BINARY, $01=RELOC, $80=LINK
  128.  
  129. ;======== MAIN ROUTINE ========
  130.  
  131. MAIN = *
  132.    ;** CHECK FOR LARGE ENOUGH ╘╨┴
  133.    SEC
  134.    LDA #<BSS┼ND
  135.    CMP ACE═EM╘OP+0
  136.    LDA #>BSS┼ND
  137.    SBC ACE═EM╘OP+1
  138.    BCS +
  139.    JMP MAIN├ONT
  140. +  LDA #<TPA═SG
  141.    LDY #>TPA═SG
  142.    JSR EPUTS
  143. DIE = *
  144.    LDA #1
  145.    LDX #0
  146.    JMP EXIT
  147.  
  148. TPA═SG = *
  149.    .ASC "AS: ╔NSUFFICIENT PROGRAM SPACE TO RUN IN"
  150.    .BYTE CHR├╥,0
  151.  
  152. USAGE = *
  153.    LDA #<USAGE═SG
  154.    LDY #>USAGE═SG
  155.    JSR EPUTS
  156.    JMP DIE
  157.  
  158. USAGE═SG = *
  159.    .ASC "USAGE: AS [-HELP] [-S] [-D] [FILE ...]"
  160.    .BYTE CHR├╥,CHR├╥
  161.    .ASC "       -HELP : PRODUCE THIS INFORMATION, DON'T RUN"
  162.    .BYTE CHR├╥
  163.    .ASC "          -S : PRODUCE SYMBOL TABLE DUMP AT END"
  164.    .BYTE CHR├╥
  165.    .ASC "          -D : PROVIDE DEBUGGING INFORMATION (LOTS)"
  166.    .BYTE CHR├╥,0
  167.  
  168. DEFAULT╔NPUT = *
  169.    .ASC "-STDIN-"
  170.    .BYTE 0
  171.  
  172. FILENAME╒SED .BUF 1
  173.  
  174. MAIN├ONT = *
  175.    ;** INIT GLOBALS
  176.    LDA #$00
  177.    STA DEBUG        ;DEFAULT OFF
  178.    STA SYM─UMP      ;DEFAULT NONE
  179.    STA OUTPUT╘YPE   ;DEFAULT BINARY
  180.    LDA #$00
  181.    STA FILENAME╒SED
  182.    LDA #0
  183.    STA ARG+0
  184.    STA ARG+1
  185.    JSR AS╔NIT
  186.    LDX #7
  187. -  LDA WRITE─EFAULT╬AME,X
  188.    STA WRITE╬AME,X
  189.    DEX
  190.    BPL -
  191.  
  192.    MAIN╬EXT = *
  193.    JSR CHECK╙TOP
  194.    INC ARG+0
  195.    BNE +
  196.    INC ARG+1
  197. +  LDA ARG+0
  198.    LDY ARG+1
  199.    JSR GETARG
  200.    LDA ZP+0
  201.    ORA ZP+1
  202.    BEQ MAIN┼XIT
  203.    LDA ZP+0
  204.    LDY ZP+1
  205.    STA NAME+0
  206.    STY NAME+1
  207.    LDY #0
  208.    LDA (ZP),Y
  209.    CMP #"-"
  210.    BNE +
  211.    JSR HANDLE╞LAGS
  212.    JMP MAIN╬EXT
  213. +  JSR ECHO
  214.    JSR MAIN╞ILE
  215.    JMP MAIN╬EXT
  216.  
  217. MAIN┼XIT = *
  218.    BIT FILENAME╒SED
  219.    BMI +
  220.    LDA #<DEFAULT╔NPUT
  221.    LDY #>DEFAULT╔NPUT
  222.    STA NAME+0
  223.    STY NAME+1
  224.    JSR ECHO
  225.    JSR MAIN╙TDIN
  226. +  LDA #$00
  227.    LDX #3
  228. -  ORA HOLE├OUNT
  229.    DEX
  230.    BPL -
  231.    CMP #$00
  232.    BEQ +
  233.    JSR FIND╒NRES╙YMBOL
  234.    LDA #ERR╒NRESD╥EFERENCES
  235.    JMP ERROR╥EF
  236. +  JSR WRITE╧BJECT╞ILE
  237.    JSR DUMP╙YMBOL╘ABLE
  238.    RTS
  239.  
  240. HANDLE╞LAGS = *
  241.    INY
  242.    LDA (ZP),Y
  243.    BNE +
  244.    RTS
  245. +  CMP #"S"
  246.    BEQ FLAG╙
  247.    CMP #"D"
  248.    BEQ FLAG─
  249.    JMP USAGE
  250.  
  251. FLAG╙ = *
  252.    LDA #$FF
  253.    STA SYM─UMP
  254.    JMP HANDLE╞LAGS
  255.  
  256. FLAG─ = *
  257.    LDA #$FF
  258.    STA DEBUG
  259.    JMP HANDLE╞LAGS
  260.  
  261. ECHO = *
  262.    LDA #<ECHO═SG1
  263.    LDY #>ECHO═SG1
  264.    JSR EPUTS
  265.    JSR ECHO╬AME
  266.    LDA #<ECHO═SG2
  267.    LDY #>ECHO═SG2
  268.    JMP EPUTS
  269. ECHO╬AME = *
  270.    LDA NAME+0
  271.    LDY NAME+1
  272.    JMP EPUTS
  273.  
  274. ECHO═SG1 = *
  275.    .ASC "ASSEMBLING SOURCE FILE "
  276.    .BYTE CHR╤UOTE,0
  277. ECHO═SG2 = *
  278.    .BYTE CHR╤UOTE,CHR├╥,0
  279.  
  280. MAIN╞ILE = *
  281.    BIT FILENAME╒SED
  282.    BMI +
  283.    JSR MAIN┼XTRACT╧BJ
  284. +  LDA NAME+0
  285.    LDY NAME+1
  286.    STA ZP+0
  287.    STY ZP+1
  288.    LDA #"R"
  289.    JSR OPEN
  290.    BCC +
  291.    JSR ECHO╬AME
  292.    LDA #<MAIN╞ILE┼RR
  293.    LDY #>MAIN╞ILE┼RR
  294.    JSR EPUTS
  295.    JMP DIE
  296. +  STA SOURCE╞CB
  297.    JSR AS─RIVER
  298.    LDA SOURCE╞CB
  299.    JSR CLOSE
  300.    LDA #$FF
  301.    STA FILENAME╒SED
  302.    RTS
  303. MAIN╞ILE┼RR = *
  304.    .ASC ": ├ANNOT OPEN FILE"
  305.    .BYTE CHR├╥,0
  306.  
  307. MAIN╙TDIN = *
  308.    LDA #STDIN
  309.    STA SOURCE╞CB
  310.    JSR AS─RIVER
  311.    RTS
  312.  
  313. MAIN┼XTRACT╧BJ = *
  314.    LDX #0 ;COPY-START
  315.    LDY #0
  316. -  LDA (NAME),Y
  317.    BEQ +++
  318.    CMP #":"
  319.    BEQ +
  320.    CMP #"/"
  321.    BNE ++
  322. +  TYA
  323.    TAX
  324.    INX
  325. +  INY
  326.    BNE -
  327. +  TXA
  328.    TAY
  329.    LDX #0
  330. -  LDA (NAME),Y
  331.    STA STRING┬UF,X
  332.    BEQ +
  333.    INY
  334.    INX
  335.    BNE -
  336. +  NOP
  337. -  CPX #3
  338.    BCS +
  339.    RTS
  340. +  LDA STRING┬UF-2,X
  341.    CMP #","
  342.    BNE +
  343.    LDA #0
  344.    DEX
  345.    DEX
  346.    STA STRING┬UF,X
  347.    JMP -
  348. +  CMP #"."
  349.    BEQ +
  350.    RTS
  351. +  LDA STRING┬UF-1,X
  352.    CMP #"S"
  353.    BEQ +
  354.    RTS
  355. +  CPX #18
  356.    BCC +
  357.    LDX #18
  358. +  LDA #","
  359.    STA STRING┬UF-2,X
  360.    LDA #"P"
  361.    STA STRING┬UF-1,X
  362.    LDA #0
  363.    STA STRING┬UF,X
  364. -  LDA STRING┬UF,X
  365.    STA WRITE╬AME,X
  366.    DEX
  367.    BPL -
  368.    RTS
  369.  
  370. AS╔NIT = *  ;INITIALIZE VARIABLES FOR ASSEMBLY
  371.    LDX #3
  372.    LDA #0
  373. -  STA NEW╠INE,X
  374.    STA NEXT╨LUS╠AB,X
  375.    STA PREV═INUS╠AB,X
  376.    STA ADDRESS,X
  377.    STA HOLE├OUNT,X
  378.    STA REL╚OLE├OUNT,X
  379.    DEX
  380.    BPL -
  381.    STA NEW├OL
  382.    LDA #1
  383.    STA NEW╠INE+0
  384.    STA NEXT╨LUS╠AB+0
  385.    LDA #$00
  386.    STA ORIGIN╙ET
  387.    LDA #<$1300
  388.    LDY #>$1300
  389.    STA ADDRESS+0
  390.    STY ADDRESS+1
  391.    STA ADDRESS╧RIGIN+0
  392.    STY ADDRESS╧RIGIN+1
  393.    JSR MALLOC╔NIT
  394.    JSR INIT╙YMBOL╘ABLE
  395.    JSR MEM╔NIT
  396.    RTS
  397.  
  398. ;======== DRIVER ========
  399.  
  400. AS─RIVER = *
  401.    LDA #$FF
  402.    STA BUFPTR
  403.    LDA #" "
  404.    STA PREV├HAR
  405. -  JSR PARSE
  406.    BCC -
  407.    RTS
  408.  
  409. WRITE╧B╘RY .BUF 1
  410. WRITE╧B╞D  .BUF 1
  411.  
  412. WRITE╧BJECT╞ILE = *
  413.    LDA #<WRITE═SG
  414.    LDY #>WRITE═SG
  415.    JSR EPUTS
  416.    LDA #<WRITE╬AME
  417.    LDY #>WRITE╬AME
  418.    JSR EPUTS
  419.    LDA #CHR╤UOTE
  420.    LDX #STDERR
  421.    JSR PUTC
  422.    LDX #STDERR
  423.    LDA #CHR├╥
  424.    JSR PUTC
  425.    LDA #2
  426.    STA WRITE╧B╘RY
  427.    LDA #<WRITE╬AME
  428.    LDY #>WRITE╬AME
  429.    STA ZP+0
  430.    STY ZP+1
  431.  
  432.    ;** OPEN OBJECT FOR WRITING
  433. -  LDA #"W"
  434.    JSR OPEN
  435.    BCC ++
  436.    LDA ERRNO
  437.    CMP #ACE┼RR╞ILE┼XISTS
  438.    BEQ +
  439. -  LDA #ERR╧BJECT╞ILE
  440.    JMP ERROR
  441. +  DEC WRITE╧B╘RY
  442.    BEQ -
  443.    JSR REMOVE
  444.    BCS -
  445.    JMP --
  446. +  STA WRITE╧B╞D
  447.  
  448.    ;** WRITE OBJECT DATA
  449.    LDA ADDRESS╧RIGIN+0
  450.    LDX WRITE╧B╞D
  451.    JSR PUTC
  452.    LDA ADDRESS╧RIGIN+1
  453.    LDX WRITE╧B╞D
  454.    JSR PUTC
  455.    LDA WRITE╧B╞D
  456.    LDX ADDRESS╧RIGIN+0
  457.    LDY ADDRESS╧RIGIN+1
  458.    JSR MEM╙AVE
  459.  
  460.    ;** CLOSE OBJECT
  461.    LDA WRITE╧B╞D
  462.    JSR CLOSE
  463.    BCC +
  464.    LDA #ERR╧BJECT╞ILE
  465.    JMP ERROR
  466. +  LDA #<WRITE╥ANGE═SG1
  467.    LDY #>WRITE╥ANGE═SG1
  468.    JSR EPUTS
  469.    LDA ADDRESS╧RIGIN+1
  470.    LDX #STDERR
  471.    JSR FPUTHEX
  472.    LDA ADDRESS╧RIGIN+0
  473.    LDX #STDERR
  474.    JSR FPUTHEX
  475.    LDA #<WRITE╥ANGE═SG2
  476.    LDY #>WRITE╥ANGE═SG2
  477.    JSR EPUTS
  478.    SEC 
  479.    LDA ADDRESS+0
  480.    SBC #1
  481.    PHA
  482.    LDA ADDRESS+1
  483.    SBC #0
  484.    LDX #STDERR
  485.    JSR FPUTHEX
  486.    PLA
  487.    LDX #STDERR
  488.    JSR FPUTHEX
  489.    LDA #<WRITE╥ANGE═SG3
  490.    LDY #>WRITE╥ANGE═SG3
  491.    JSR EPUTS
  492.    SEC
  493.    LDA ADDRESS+0
  494.    SBC ADDRESS╧RIGIN+0
  495.    STA WORK+0
  496.    LDA ADDRESS+1
  497.    SBC ADDRESS╧RIGIN+1
  498.    STA WORK+1
  499.    LDA #0
  500.    STA WORK+2
  501.    STA WORK+3
  502.    LDX #WORK
  503.    JSR EPUTNUM
  504.    LDA #<WRITE╥ANGE═SG4
  505.    LDY #>WRITE╥ANGE═SG4
  506.    JSR EPUTS
  507.    RTS
  508.  
  509. WRITE─EFAULT╬AME = *
  510.    .ASC "A.OUT,P"
  511.    .BYTE 0
  512. WRITE═SG = *
  513.    .ASC "WRITING OBJECT FILE "
  514.    .BYTE CHR╤UOTE,0
  515. WRITE╥ANGE═SG1 = *
  516.    .ASC "CODE RANGE: $"
  517.    .BYTE 0
  518. WRITE╥ANGE═SG2 = *
  519.    .ASC "--$"
  520.    .BYTE 0
  521. WRITE╥ANGE═SG3 = *
  522.    .ASC " ("
  523.    .BYTE 0
  524. WRITE╥ANGE═SG4 = *
  525.    .ASC " BYTES)"
  526.    .BYTE CHR├╥,0
  527.  
  528. ;======== PARSER ========
  529.  
  530. PARSE = *
  531.    ;** AT BEGINNING OF COMMAND
  532.    JSR CHECK╙TOP
  533.    JSR GET╘OKEN
  534.    LDA TOKEN╘YPE
  535.    CMP #TOKEN┼╧╞
  536.    BNE +
  537.    SEC
  538.    RTS
  539. +  CMP #TOKEN╔DENTIFIER
  540.    BNE PARSE╬OT╔D
  541.    LDA TOKEN╬EXT├HAR
  542.    CMP #"="
  543.    BNE +
  544.    JMP PARSE┼QUATE
  545. +  CMP #":"
  546.    BNE +
  547.    JMP PARSE┴DDRESS
  548. +  JMP PARSE╔DENTIFIER
  549.  
  550. PARSE╬OT╔D = *
  551.    CMP #TOKEN╙PECIAL
  552.    BEQ +
  553.    SYNTAX┼RROR = *
  554.    LDA #ERR╙YNTAX
  555.    JMP ERROR
  556. +  LDA TOKEN├HAR
  557.    CMP #CHR├╥
  558.    BNE +
  559.    JMP PARSE┼ND
  560. +  CMP #"+"
  561.    BNE +
  562.    JMP PARSE╨LUS
  563. +  CMP #"-"
  564.    BNE +
  565.    JMP PARSE═INUS
  566. +  CMP #"#"
  567.    BNE +
  568.    JMP PARSE┼ND
  569. +  CMP #"."
  570.    BNE +
  571.    JMP PARSE─OT├OMMAND
  572. +  JMP SYNTAX┼RROR
  573.  
  574. ;RET: .╪=TOKEN╔DENTIFIER, .┴=NEXT├HAR, .┘=STRLEN, STRING╠EN, STRING┬UF
  575. ;     .╪=TOKEN╬UMBER,     .┘=NUMLEN, NUMBER
  576. ;     .╪=TOKEN╙TRING,     .┴=FIRST├HAR,.┘=STRLEN, STRING╠EN, STRING┬UF
  577. ;     .╪=TOKEN╙PECIAL,    .┴=CHAR
  578.  
  579. PARSE┼QUATE = *
  580.    JSR PARSE─EFINE╓AR
  581.    JSR GET╘OKEN
  582.    CPX #TOKEN╙PECIAL
  583.    BEQ +
  584. -  JMP SYNTAX┼RROR
  585. +  CMP #"="
  586.    BNE -
  587.    LDA #0
  588.    JSR PARSE┼XPRESSION
  589.    CMP #CHR├╥
  590.    BNE -
  591.    JSR EVALUATE┼XPRESSION
  592.    BCS +
  593.    JSR ASSIGN╓ARIABLE
  594.    JMP ++
  595. +  JSR ADD╓ARIABLE╚OLE
  596. +  BIT DEBUG
  597.    BPL +
  598.    LDA #<PARSE┼QUATE═SG
  599.    LDY #>PARSE┼QUATE═SG
  600.    JSR PUTS
  601. +  JMP PARSE┼ND
  602.    PARSE┼QUATE═SG = *
  603.    .ASC "PARSE┼QUATE: ASSIGN PARSED EXPRESSION TO VARIABLE."
  604.    .BYTE CHR├╥,0
  605.  
  606. PARSE┴DDRESS = *
  607.    JSR PARSE─EFINE╓AR
  608.    JSR GET╘OKEN
  609.    CPX #TOKEN╙PECIAL
  610.    BEQ +
  611. -  JMP SYNTAX┼RROR
  612. +  CMP #":"
  613.    BEQ +
  614.    JMP SYNTAX┼RROR
  615. +  JSR PARSE┴SSIGN┴DDRESS
  616.    BIT DEBUG
  617.    BPL +
  618.    LDA #<PARSE┴DDRESS═SG
  619.    LDY #>PARSE┴DDRESS═SG
  620.    JSR PUTS
  621. +  JMP PARSE┼ND
  622.    PARSE┴DDRESS═SG = *
  623.    .ASC "PARSE┴DDRESS: ASSIGN CURRENT ADDRESS TO VARIABLE."
  624.    .BYTE CHR├╥,0
  625.  
  626. PARSE┴SSIGN┴DDRESS = *
  627.    BIT ORIGIN╙ET
  628.    BMI +
  629.    LDA #ERR╧RIGIN╬OT╙ET
  630.    JMP ERROR
  631. +  LDX #3
  632. -  LDA ADDRESS,X
  633.    STA ID╓AL,X
  634.    DEX
  635.    BPL -
  636.    LDA #$01
  637.    STA ID╘YPE
  638.    JMP ASSIGN╓ARIABLE
  639.  
  640. PARSE╨LUS = *
  641.    LDA #"+"
  642.    LDY #0
  643.    JSR GEN╥EL╠ABEL
  644.    JSR PARSE─EFINE╓AR
  645.    JSR PARSE┴SSIGN┴DDRESS
  646.    BIT DEBUG
  647.    BPL +
  648.    LDA #<PARSE╨LUS═SG
  649.    LDY #>PARSE╨LUS═SG
  650.    JSR PUTS
  651.    LDX #NEXT╨LUS╠AB
  652.    JSR PUTNUM
  653.    LDA #CHR├╥
  654.    JSR PUTCHAR
  655. +  INC NEXT╨LUS╠AB+0
  656.    BNE +
  657.    INC NEXT╨LUS╠AB+1
  658.    BNE +
  659.    INC NEXT╨LUS╠AB+2
  660.    BNE +
  661.    INC NEXT╨LUS╠AB+3
  662. +  JMP PARSE┼ND
  663.    PARSE╨LUS═SG = *
  664.    .ASC "PARSE╨LUS: ASSIGN CURRENT ADDRESS TO A SYNTHEIC '+' VARIABLE:"
  665.    .BYTE 0
  666.  
  667. PARSE═INUS = *
  668.    INC PREV═INUS╠AB+0
  669.    BNE +
  670.    INC PREV═INUS╠AB+1
  671.    BNE +
  672.    INC PREV═INUS╠AB+2
  673.    BNE +
  674.    INC PREV═INUS╠AB+3
  675. +  LDA #"-"
  676.    LDY #0
  677.    JSR GEN╥EL╠ABEL
  678.    JSR PARSE─EFINE╓AR
  679.    JSR PARSE┴SSIGN┴DDRESS
  680.    BIT DEBUG
  681.    BPL +
  682.    LDA #<PARSE═INUS═SG
  683.    LDY #>PARSE═INUS═SG
  684.    JSR PUTS
  685.    LDX #PREV═INUS╠AB
  686.    JSR PUTNUM
  687.    LDA #CHR├╥
  688.    JSR PUTCHAR
  689. +  JMP PARSE┼ND
  690.    PARSE═INUS═SG = *
  691.    .ASC "PARSE═INUS: ASSIGN CURRENT ADDRESS TO A SYNTHETIC '-' VARIABLE:"
  692.    .BYTE 0
  693.  
  694. GEN╥EL╠ABEL = *  ;( .┴=TYPE, .┘=RELATIVE )
  695.    STA STRING┬UF+1
  696.    CMP #"+"
  697.    BNE +
  698.    CLC
  699.    TYA
  700.    ADC NEXT╨LUS╠AB
  701.    STA NUMBER+0
  702.    LDY #3
  703.    LDX #1
  704. -  LDA NEXT╨LUS╠AB,X
  705.    ADC #0
  706.    STA NUMBER,X
  707.    INX
  708.    DEY
  709.    BNE -
  710.    JMP ++
  711. +  SEC
  712.    STY NUMBER+0
  713.    LDA PREV═INUS╠AB+0
  714.    SBC NUMBER+0
  715.    STA NUMBER+0
  716.    LDY #3
  717.    LDX #1
  718. -  LDA PREV═INUS╠AB,X
  719.    SBC #0
  720.    STA NUMBER,X
  721.    INX
  722.    DEY
  723.    BNE -
  724. +  LDA #"╠"
  725.    STA STRING┬UF+0
  726.    LDA #<STRING┬UF+2
  727.    LDY #>STRING┬UF+2
  728.    STA ZP+0
  729.    STY ZP+1
  730.    LDX #NUMBER
  731.    LDA #1
  732.    JSR UTOA
  733.    INY
  734.    INY
  735.    LDA #"C"
  736.    STA STRING┬UF,Y
  737.    INY
  738.    LDA #0
  739.    STA STRING┬UF,Y
  740.    STY STRING╠EN
  741.    RTS
  742.  
  743. PARSE┼ND = *
  744.    BIT DEBUG
  745.    BPL +
  746.    LDA #<PARSE┼ND═SG
  747.    LDY #>PARSE┼ND═SG
  748.    JSR PUTS
  749. +  CLC
  750.    RTS
  751.    PARSE┼ND═SG = *
  752.    .ASC "-----=-----"
  753.    .BYTE CHR├╥,CHR├╥,0
  754.  
  755. PARSE╔DENTIFIER = *  ;LINE STARTING WITH AN IDENTIFIER
  756.    JSR HASH
  757.    ;** CHECK IF IDENTIFIER IS A PROCESSOR INSTRUCTION
  758.    LDA STRING╠EN
  759.    CMP #3
  760.    BNE PARSE╔D╬OT╔NSTR
  761.    LDA HASH╓AL+0
  762.    AND #63
  763.    TAX
  764.    LDA INSTR╚ASH╨TRS,X
  765.    CMP #100
  766.    BCS +
  767.    JSR PARSE╔D├HECK╔NSTR
  768.    BCS PARSE╔D╬OT╔NSTR
  769.    JMP INSTR
  770. +  SEC
  771.    SBC #100
  772.    TAX
  773. -  LDA INSTR╚ASH╔NDIRECTS,X
  774.    BEQ PARSE╔D╬OT╔NSTR
  775.    JSR PARSE╔D├HECK╔NSTR
  776.    BCS +
  777.    JMP INSTR
  778. +  INX
  779.    BNE -
  780.  
  781.    ;** CHECK IF IDENTIFIER IS A DIRECTIVE
  782.    PARSE╔D╬OT╔NSTR = *
  783.    JSR CHECK╔F─IRECTIVE
  784.    BCS PARSE╔D╬OT─IRECTIVE
  785.    JMP DIRECTIVE
  786.  
  787.    ;** CHECK IF IDENTIFIER IS A MACRO
  788.    PARSE╔D╬OT─IRECTIVE = *
  789.    LDA #ERR┼XPECT├OMMAND
  790.    JMP ERROR
  791.  
  792. PARSE─OT├OMMAND = *
  793.    LDA #ERR─OT├OMMAND
  794.    JMP ERROR
  795.  
  796. ;======== HANDLE ASSEMBLER DIRECTIVES ========
  797.  
  798. DIREC╬UM .BUF 1
  799.  
  800. CHECK╔F─IRECTIVE = *  ;( STRING┬UF, STRING╠EN ) : .├╙=NO, .┴=DIR╬UM
  801.    LDA #0
  802.    STA DIREC╬UM
  803.  
  804.    DIREC├HECK╬EXT = *
  805.    LDX DIREC╬UM
  806.    LDY DIREC╧FFSETS,X
  807.    LDX #0
  808. -  LDA STRING┬UF,X
  809.    CMP DIREC╬AMES,Y
  810.    BNE DIREC├HECK├ONT
  811.    CMP #$00
  812.    BNE +
  813.    LDA DIREC╬UM
  814.    CLC
  815.    RTS
  816. +  INY
  817.    INX
  818.    BNE -
  819.  
  820.    DIREC├HECK├ONT = *
  821.    INC DIREC╬UM
  822.    LDA DIREC╬UM
  823.    CMP #16
  824.    BCC DIREC├HECK╬EXT
  825.    LDA #0
  826.    SEC
  827.    RTS
  828.  
  829. DIREC╧FFSETS = *
  830.    .BYTE 00,03,07,10,13,16,20,28,31,37,42,48,54,63,70
  831.  
  832. DIREC╬AMES = *
  833.    .ASC "DB"       ;DN=01.  OFF=00
  834.    .BYTE 0
  835.    .ASC "BUF"      ;DN=02.  OFF=03
  836.    .BYTE 0
  837.    .ASC "DW"       ;DN=03.  OFF=07
  838.    .BYTE 0
  839.    .ASC "DT"       ;DN=04.  OFF=10
  840.    .BYTE 0
  841.    .ASC "DL"       ;DN=05.  OFF=13
  842.    .BYTE 0
  843.    .ASC "ORG"      ;DN=06.  OFF=16
  844.    .BYTE 0
  845.    .ASC "INCLUDE"  ;DN=07.  OFF=20
  846.    .BYTE 0
  847.    .ASC "IF"       ;DN=08.  OFF=28
  848.    .BYTE 0
  849.    .ASC "ELSIF"    ;DN=09.  OFF=31
  850.    .BYTE 0
  851.    .ASC "ELSE"     ;DN=10.  OFF=37
  852.    .BYTE 0
  853.    .ASC "ENDIF"    ;DN=11.  OFF=42
  854.    .BYTE 0
  855.    .ASC "MACRO"    ;DN=12.  OFF=48
  856.    .BYTE 0
  857.    .ASC "ENDMACRO" ;DN=13.  OFF=54
  858.    .BYTE 0
  859.    .ASC "EXPORT"   ;DN=14.  OFF=63
  860.    .BYTE 0
  861.    .ASC "BSS"      ;DN=15.  OFF=70
  862.    .BYTE 0
  863.  
  864. DIREC╓ECTORS = *
  865.    .WORD DIREC─B,DIREC┬UF,DIREC─W,DIREC─T,DIREC─L,DIREC╧RG,DIREC╔NCLUDE
  866.    .WORD DIREC╔F,DIREC┼LSIF,DIREC┼LSE,DIREC┼NDIF,DIREC═ACRO,DIREC┼NDMACRO
  867.    .WORD DIREC┼XPORT,DIREC┬SS
  868.  
  869. DIRECTIVE = *  ;( .┴=DIR╬UM )
  870.    BIT DEBUG
  871.    BPL +
  872.    PHA
  873.    LDA #<DIREC═SG
  874.    LDY #>DIREC═SG
  875.    JSR PUTS
  876.    PLA
  877. +  ASL
  878.    TAY
  879.    LDA DIREC╓ECTORS+0,Y
  880.    STA WORK+14
  881.    LDA DIREC╓ECTORS+1,Y
  882.    STA WORK+15
  883.    JSR +
  884.    JMP PARSE┼ND
  885. +  JMP (WORK+14)
  886.    DIREC═SG = *
  887.    .ASC "MUST PARSE A DIRECTIVE"
  888.    .BYTE CHR├╥,0
  889.  
  890. DIREC╧RG = *
  891.    BIT ORIGIN╙ET
  892.    BPL +
  893.    LDA #ERR╧RIGIN┴LREADY╙ET
  894.    JMP ERROR
  895. +  LDA #0
  896.    JSR PARSE┼XPRESSION
  897.    CMP #CHR├╥
  898.    BEQ +
  899.    JMP SYNTAX┼RROR
  900. +  JSR EVALUATE┼XPRESSION
  901.    BCC +
  902.    LDA #ERR╬OT╥ESOLVED┼XPR
  903.    JMP ERROR
  904. +  LDA ID╓AL+2
  905.    ORA ID╓AL+3
  906.    BEQ +
  907.    LDA #ERR╓ALUE╘OO╠ARGE
  908.    JMP ERROR
  909. +  LDA ID╓AL+0
  910.    LDY ID╓AL+1
  911.    STA ADDRESS+0
  912.    STY ADDRESS+1
  913.    STA ADDRESS╧RIGIN+0
  914.    STY ADDRESS╧RIGIN+1
  915.    LDA #$FF
  916.    STA ORIGIN╙ET
  917.    BIT DEBUG
  918.    BPL +
  919.    LDA #<DIREC╧RG═SG
  920.    LDY #>DIREC╧RG═SG
  921.    JSR PUTS
  922.    LDA ID╓AL+1
  923.    JSR PUTHEX
  924.    LDA ID╓AL+0
  925.    JSR PUTHEX
  926.    LDA #CHR├╥
  927.    JSR PUTCHAR
  928. +  RTS
  929.    DIREC╧RG═SG = *
  930.    .ASC "SETTING CODE ORIGIN TO $"
  931.    .BYTE 0
  932.  
  933. DIREC─F╙IZE .BUF 1
  934. DIREC─F├HAR .BUF 1
  935.  
  936. DIREC─B = *
  937.    LDA #1
  938.    BNE DIREC─L╔N
  939. DIREC─W = *
  940.    LDA #2
  941.    BNE DIREC─L╔N
  942. DIREC─T = *
  943.    LDA #3
  944.    BNE DIREC─L╔N
  945. DIREC─L = *
  946.    LDA #4
  947.    DIREC─L╔N = *
  948.    STA DIREC─F╙IZE
  949.    BIT ORIGIN╙ET
  950.    BMI DIREC─F╬EXT
  951.    LDA #ERR╧RIGIN╬OT╙ET
  952.    JMP ERROR
  953.  
  954.    DIREC─F╬EXT = *
  955.    LDA #1
  956.    JSR PARSE┼XPRESSION
  957.    STA DIREC─F├HAR
  958.    CPX #0
  959.    BEQ +
  960.    JSR DIREC─F╙TRING
  961.    JMP DIREC─F├ONT
  962. +  JSR EVALUATE┼XPRESSION
  963.    BCS ++
  964.    LDX DIREC─F╙IZE
  965. -  CPX #4
  966.    BCS ++
  967.    LDA ID╓AL,X
  968.    BNE +
  969.    INX
  970.    BNE -
  971. +  LDA #ERR╓ALUE╘OO╠ARGE
  972.    JMP ERROR
  973. +  LDA #1
  974.    LDY #0
  975.    STA DIREC─F├OUNT+0
  976.    STY DIREC─F├OUNT+1
  977.    JSR DIREC─F╨UT
  978.  
  979.    DIREC─F├ONT = *
  980.    LDA DIREC─F├HAR
  981.    CMP #","
  982.    BEQ DIREC─F╬EXT
  983.    CMP #CHR├╥
  984.    BEQ +
  985.    JMP SYNTAX┼RROR
  986. +  RTS
  987.  
  988. DIREC─F╙TR╨OS .BUF 1
  989.  
  990. DIREC─F╙TRING = *
  991.    LDA #0
  992.    STA DIREC─F╙TR╨OS
  993.    STA ID╘YPE
  994.    STA ID╓AL+1
  995.    STA ID╓AL+2
  996.    STA ID╓AL+3
  997. -  LDX DIREC─F╙TR╨OS
  998.    CPX STRING╠EN
  999.    BCC +
  1000.    RTS
  1001. +  LDA STRING┬UF,X
  1002.    STA ID╓AL+0
  1003.    LDA #1
  1004.    LDY #0
  1005.    STA DIREC─F├OUNT+0
  1006.    STY DIREC─F├OUNT+1
  1007.    JSR DIREC─F╨UT
  1008.    INC DIREC─F╙TR╨OS
  1009.    JMP -
  1010.  
  1011. DIREC─F├OUNT .BUF 2
  1012.  
  1013. DIREC─F╨UT = *  ;(ADDRESS++, ID╓AL, ID╘YPE, DIREC─F╙IZE, DIREC─F├OUNT--, EXP┬UF)
  1014.    LDA DIREC─F├OUNT+0
  1015.    ORA DIREC─F├OUNT+1
  1016.    BNE +
  1017.    RTS
  1018.  
  1019.    ;** DEBUG INFORMATION
  1020. +  BIT DEBUG
  1021.    BPL +++
  1022.    LDA #<DIREC─F╨UT═SG1
  1023.    LDY #>DIREC─F╨UT═SG1
  1024.    JSR PUTS
  1025.    LDA ADDRESS+1
  1026.    JSR PUTHEX
  1027.    LDA ADDRESS+0
  1028.    JSR PUTHEX
  1029.    LDA #<DIREC─F╨UT═SG2
  1030.    LDY #>DIREC─F╨UT═SG2
  1031.    JSR PUTS
  1032.    BIT ID╘YPE
  1033.    BPL +
  1034.    LDA #"?"
  1035.    JSR PUTCHAR
  1036.    JMP ++
  1037. +  LDX #ID╓AL
  1038.    JSR PUTNUM
  1039. +  LDA #CHR├╥
  1040.    JSR PUTCHAR
  1041.  
  1042.    ;** HANDLE UNRESOLVED REFERENCE
  1043. +  BIT ID╘YPE
  1044.    BPL +
  1045.    LDX DIREC─F╙IZE
  1046.    LDA #0
  1047.    JSR ADD═EMORY╚OLE
  1048.  
  1049.    ;** HANDLE RESOLVED REFERENCE
  1050. +  LDX #3
  1051. -  LDA ID╓AL,X
  1052.    STA MEM╨UT╓ALS,X
  1053.    DEX
  1054.    BPL -
  1055.    LDA DIREC─F╙IZE
  1056.    LDX ADDRESS+0
  1057.    LDY ADDRESS+1
  1058.    JSR MEM╨UT
  1059.    ;** ADD RELOCATABLE REFERENCE
  1060.    LDA ID╘YPE
  1061.    BEQ +
  1062.    CMP #$04
  1063.    BCS +
  1064.    LDX ADDRESS+0
  1065.    LDY ADDRESS+1
  1066.    JSR RECORD╥ELOC╥EF
  1067.  
  1068.    ;** GO ONTO NEXT PUT
  1069. +  CLC
  1070.    LDA ADDRESS+0
  1071.    ADC DIREC─F╙IZE
  1072.    STA ADDRESS+0
  1073.    BCC +
  1074.    INC ADDRESS+1
  1075.    BNE +
  1076.    LDA #ERR┴DDRESS╫RAP
  1077.    JMP ERROR
  1078. +  LDA DIREC─F├OUNT+0
  1079.    BNE +
  1080.    DEC DIREC─F├OUNT+1
  1081. +  DEC DIREC─F├OUNT+0
  1082.    JMP DIREC─F╨UT
  1083.  
  1084. DIREC─F╨UT═SG1 = *
  1085.    .ASC "DEFINE-PUT: ADDRESS=$"
  1086.    .BYTE 0
  1087. DIREC─F╨UT═SG2 = *
  1088.    .ASC ", VALUE="
  1089.    .BYTE 0
  1090.  
  1091. DIREC┬UF = *
  1092.    BIT ORIGIN╙ET
  1093.    BMI +
  1094.    LDA #ERR╧RIGIN╬OT╙ET
  1095.    JMP ERROR
  1096. +  LDA #0
  1097.    JSR PARSE┼XPRESSION
  1098.    CMP #CHR├╥
  1099.    BEQ +
  1100.    JMP SYNTAX┼RROR
  1101. +  JSR EVALUATE┼XPRESSION
  1102.    BCC +
  1103.    LDA #ERR╬OT╥ESOLVED┼XPR
  1104.    JMP ERROR
  1105. +  LDA ID╓AL+2
  1106.    ORA ID╓AL+3
  1107.    BEQ +
  1108.    LDA #ERR╓ALUE╘OO╠ARGE
  1109.    JMP ERROR
  1110. +  LDA ID╓AL+0
  1111.    LDY ID╓AL+1
  1112.    STA DIREC─F├OUNT+0
  1113.    STY DIREC─F├OUNT+1
  1114. +  LDA #0
  1115.    STA ID╘YPE
  1116.    STA ID╓AL+0
  1117.    STA ID╓AL+1
  1118.    STA ID╓AL+2
  1119.    STA ID╓AL+3
  1120.    LDA #1
  1121.    STA DIREC─F╙IZE
  1122.    JSR DIREC─F╨UT
  1123.    RTS
  1124.  
  1125. DIREC╔NCLUDE = *
  1126. DIREC╔F = *
  1127. DIREC┼LSIF = *
  1128. DIREC┼LSE = *
  1129. DIREC┼NDIF = *
  1130. DIREC═ACRO = *
  1131. DIREC┼NDMACRO = *
  1132. DIREC┼XPORT = *
  1133.    LDA #ERR╬OT╔MPLEMENTED
  1134.    JMP ERROR
  1135. DIREC┬SS = *
  1136.    BIT ORIGIN╙ET
  1137.    BPL +
  1138.    LDA #ERR╧RIGIN╬OT╙ET
  1139.    JMP ERROR
  1140. +  NOP
  1141.    LDA #ERR╬OT╔MPLEMENTED
  1142.    JMP ERROR
  1143.  
  1144. ;======== ERROR HANDLER ========
  1145.  
  1146. ERROR├ODE      .BUF 1
  1147. ERROR╨OS       .BUF 1
  1148. ERROR┼XIT├ODE  = ACE┼XIT─ATA+0    ;$FC8A09CB:EDITOR-REPOS
  1149. ERROR┼XIT╠INE  = ACE┼XIT─ATA+4
  1150. ERROR┼XIT├OL   = ACE┼XIT─ATA+8
  1151. ERROR┼XIT╥EPOS = ACE┼XIT─ATA+12
  1152. ERROR┼XIT╞ILEP = ACE┼XIT─ATA+13
  1153. ERROR┼XIT╥ESER = ACE┼XIT─ATA+14
  1154. ERROR┬UF       = ACE┼XIT─ATA+15
  1155.  
  1156. ERROR╥EF = *
  1157.    JSR ERROR╨RERAMBLE
  1158.    LDA #<ERROR═SG2
  1159.    LDY #>ERROR═SG2
  1160.    JSR ERROR├AT
  1161.    LDX #3
  1162. -  LDA EXP╙RC╠INE,X
  1163.    STA WORK+0,X
  1164.    LDA EXP╙RC╞ILE,X
  1165.    STA WORK+4,X
  1166.    DEX
  1167.    BPL -
  1168.    LDA EXP╙RC├OL
  1169.    LDX #WORK+0
  1170.    LDY #WORK+4
  1171.    JSR ERROR─ISP╞ILE
  1172.    JMP ERROR╔N
  1173.  
  1174. ERROR╨RERAMBLE = *
  1175.    STA ERROR├ODE
  1176.    LDX #14
  1177. -  LDA ERROR┼XIT╚EAD,X
  1178.    STA ERROR┼XIT├ODE,X
  1179.    DEX
  1180.    BPL -
  1181.    LDA #0
  1182.    STA ERROR╨OS
  1183.    LDA #<ERROR═SG1
  1184.    LDY #>ERROR═SG1
  1185.    JSR ERROR├AT
  1186.    LDX #SOURCE╠INE
  1187.    LDY #FILE╨TR
  1188.    LDA SOURCE├OL
  1189.    JMP ERROR─ISP╞ILE
  1190.  
  1191. ERROR = *
  1192.    JSR ERROR╨RERAMBLE
  1193.    ERROR╔N = *
  1194.    LDX ERROR╨OS
  1195.    LDA #" "
  1196.    STA ERROR┬UF,X
  1197.    INC ERROR╨OS
  1198.    LDA ERROR├ODE
  1199.    ASL
  1200.    TAX
  1201.    LDA ERR─ESC+1,X
  1202.    TAY
  1203.    LDA ERR─ESC+0,X
  1204.    JSR ERROR├AT
  1205.    LDA ERROR├ODE
  1206.    CMP #ERR╒NRESD╥EFERENCES
  1207.    BNE +
  1208.    LDA #<SYM╬AME
  1209.    LDY #>SYM╬AME
  1210.    JSR ERROR├AT
  1211. +  LDA #<ERROR┬UF
  1212.    LDY #>ERROR┬UF
  1213.    JSR EPUTS
  1214.    LDA #CHR├╥
  1215.    LDX #STDERR
  1216.    JSR PUTC
  1217.    LDA #1
  1218.    LDX #0
  1219.    JMP EXIT
  1220.  
  1221. ERR─ISP╞I╞P  .BUF 1
  1222. ERR─ISP╞I├OL .BUF 1
  1223. ERR─ISP╞I╠IN .BUF 1
  1224.  
  1225. ERROR─ISP╞ILE = *  ;( .╪=ZP╠INE╧FF, .┴=COL, .┘=ZP╞ILE╨TR, ERROR╨OS ) : ERROR╨OS
  1226.    ;** USES NAME INSTEAD OF FILE╨TR FOR NOW
  1227.    ;** PRODUCES OUTPUT OF THE FORM: ("FILENAME":1234:12)
  1228.    STA ERR─ISP╞I├OL
  1229.    STX ERR─ISP╞I╠IN
  1230.    STY ERR─ISP╞I╞P
  1231.    LDX ERROR╨OS
  1232.    LDA #"("
  1233.    STA ERROR┬UF,X
  1234.    INX
  1235.    LDA #CHR╤UOTE
  1236.    STA ERROR┬UF,X
  1237.    INX
  1238.    STX ERROR╨OS
  1239.    LDA NAME+0
  1240.    LDY NAME+1
  1241.    JSR ERROR├AT
  1242.    LDA #CHR╤UOTE
  1243.    STA ERROR┬UF,X
  1244.    INX
  1245.    LDA #":"
  1246.    STA ERROR┬UF,X
  1247.    INX
  1248.    STX ERROR╨OS
  1249.    LDX ERR─ISP╞I╠IN
  1250.    JSR ERROR─ISP╞ILE┴PNUM
  1251.    LDA #":"
  1252.    STA ERROR┬UF,X
  1253.    INX
  1254.    STX ERROR╨OS
  1255.    LDA ERR─ISP╞I├OL
  1256.    STA NUMBER+0
  1257.    LDA #0
  1258.    STA NUMBER+1
  1259.    STA NUMBER+2
  1260.    STA NUMBER+3
  1261.    LDX #NUMBER
  1262.    JSR ERROR─ISP╞ILE┴PNUM
  1263.    LDA #")"
  1264.    STA ERROR┬UF,X
  1265.    INX
  1266.    STX ERROR╨OS
  1267.    RTS
  1268.  
  1269. ERROR─ISP╞ILE┴PNUM = *  ;( .╪=ZPOFF, ERROR╨OS ) : .╪=ERROR╨OS
  1270.    LDA #<PUTNUM╬UM
  1271.    LDY #>PUTNUM╬UM
  1272.    STA ZP+0
  1273.    STY ZP+1
  1274.    LDA #1
  1275.    JSR UTOA
  1276.    LDA #<PUTNUM╬UM
  1277.    LDY #>PUTNUM╬UM
  1278.    ;** FALL THROUGH
  1279.  
  1280. ERROR├AT = *  ;( .┴┘=STR, ERROR╨OS ) : .╪=ERROR╨OS
  1281.    STA WORK+14
  1282.    STY WORK+15
  1283.    LDX ERROR╨OS
  1284.    LDY #0
  1285. -  LDA (WORK+14),Y
  1286.    STA ERROR┬UF,X
  1287.    BEQ +
  1288.    INX
  1289.    INY
  1290.    BNE -
  1291. +  STX ERROR╨OS
  1292.    RTS
  1293.  
  1294. ERROR┼XIT╚EAD = *
  1295.    .BYTE $FC,$8A,$09,$CB,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$06,$00
  1296. ERROR═SG1 = *
  1297.    .ASC "ERR "
  1298.    .BYTE 0
  1299. ERROR═SG2 = *
  1300.    .ASC ", REF"
  1301.    .BYTE 0
  1302.  
  1303. ERR─ESC .WORD ERR00,ERR01,ERR02,ERR03,ERR04,ERR05,ERR06,ERR07,ERR08,ERR09
  1304.         .WORD ERR10,ERR11,ERR12,ERR13,ERR14,ERR15,ERR16,ERR17,ERR18,ERR19
  1305.         .WORD ERR20,ERR21,ERR22,ERR23,ERR24,ERR25,ERR26
  1306.  
  1307. ERR00 .ASC "╧K--NO ERROR"
  1308.       .BYTE 0
  1309. ERR01 .ASC "┴N IDENTIFIER TOKEN EXCEEDS 240 CHARS IN LENGTH"
  1310.       .BYTE 0
  1311. ERR02 .ASC "┴ STRING LITERAL EXCEEDS 240 CHARS IN LENGTH"
  1312.       .BYTE 0
  1313. ERR03 .ASC "╥AN INTO A ├╥ BEFORE END OF STRING LITERAL"
  1314.       .BYTE 0
  1315. ERR04 .ASC "╔NVALID NUMERIC LITERAL"
  1316.       .BYTE 0
  1317. ERR05 .ASC "╬UMERIC LITERAL VALUE OVERFLOWS 32-BITS"
  1318.       .BYTE 0
  1319. ERR06 .ASC "╙YNTAX ERROR"
  1320.       .BYTE 0
  1321. ERR07 .ASC "┴TTEMPT TO PERFORM NUMERIC OPERATORS ON A STRING"
  1322.       .BYTE 0
  1323. ERR08 .ASC "┼XPRESSION HAS MORE THAN 17 OPERANDS"
  1324.       .BYTE 0
  1325. ERR09 .ASC "╥AN OUT OF MEMORY DURING COMPILATION PROCESS"
  1326.       .BYTE 0
  1327. ERR10 .ASC "┴TTEMPT TO REDEFINE A SYMBOL"
  1328.       .BYTE 0
  1329. ERR11 .ASC "┴TTEMPT TO ASSEMBLE CODE WITH CODE ORIGIN NOT SET"
  1330.       .BYTE 0
  1331. ERR12 .ASC "╔NTERNAL ERROR: ATTEMPT TO ASSIGN TO UNEXPECTED ID"
  1332.       .BYTE 0
  1333. ERR13 .ASC "╬ON-NUMERIC SYMBOL IN A NUMERIC EXPRESSION"
  1334.       .BYTE 0
  1335. ERR14 .ASC "┼XPECTING AN OPERATOR"
  1336.       .BYTE 0
  1337. ERR15 .ASC "┼XPECTING AN OPERAND"
  1338.       .BYTE 0
  1339. ERR16 .ASC "┼XPECTING A COMMAND"
  1340.       .BYTE 0
  1341. ERR17 .ASC "╓ALUE IS TOO LARGE OR NEGATIVE"
  1342.       .BYTE 0
  1343. ERR18 .ASC "┬RANCH OUT OF RANGE"
  1344.       .BYTE 0
  1345. ERR19 .ASC "╞EATURE IS NOT (YET) IMPLEMENTED"
  1346.       .BYTE 0
  1347. ERR20 .ASC "╔NSTRUCTION DOES NOT SUPPORT GIVEN ADDRESS MODE"
  1348.       .BYTE 0
  1349. ERR21 .ASC "┴DDRESS WRAPED AROUND 64╦ CODE ADDRESS SPACE"
  1350.       .BYTE 0
  1351. ERR22 .ASC "┼RROR TRYING TO WRITE OUTPUT OBJECT FILE"
  1352.       .BYTE 0
  1353. ERR23 .ASC "─IRECTIVE REQUIRES RESOLVED EXPRESSION"
  1354.       .BYTE 0
  1355. ERR24 .ASC "├ODE ORIGIN ALREADY SET; YOU CAN'T SET IT TWICE"
  1356.       .BYTE 0
  1357. ERR25 .ASC "╒NRESOLVED SYMBOL: "
  1358.       .BYTE 0
  1359. ERR26 .ASC "╘HUS ASSEMBLER DOESN'T ACCEPT .DOT COMMANDS, ┬UDDY!"
  1360.       .BYTE 0
  1361.  
  1362. WPUTNUM = *
  1363.    LDA #STDOUT
  1364.    STA PUTNUM╞D
  1365.    JMP PUTNUM╔N
  1366. EPUTNUM = *
  1367.    LDA #STDERR
  1368.    JMP FPUTNUM
  1369. PUTNUM = *
  1370.    LDA #STDOUT
  1371. FPUTNUM = *
  1372.    STA PUTNUM╞D
  1373.    LDY #1
  1374. PUTNUM╔N = *
  1375.    LDA #<PUTNUM╬UM
  1376.    STA ZP+0
  1377.    LDA #>PUTNUM╬UM
  1378.    STA ZP+1
  1379.    TYA
  1380.    JSR UTOA
  1381.    LDX PUTNUM╞D
  1382.    JMP FPUTS┌P
  1383.  
  1384. PUTNUM╞D  .BUF 1
  1385. PUTNUM╬UM .BUF 11
  1386.  
  1387. PUTHEX = *  ;( .┴=VALUE )
  1388.    LDX #STDOUT
  1389. FPUTHEX = *  ;( .┴=VALUE, .╪=FD )
  1390.    STX PUTNUM╞D
  1391.    PHA
  1392.    LSR
  1393.    LSR
  1394.    LSR
  1395.    LSR
  1396.    TAX
  1397.    LDA PUTHEX├HARS,X
  1398.    LDX PUTNUM╞D
  1399.    JSR PUTC
  1400.    PLA
  1401.    AND #$0F
  1402.    TAX
  1403.    LDA PUTHEX├HARS,X
  1404.    LDX PUTNUM╞D
  1405.    JSR PUTC
  1406.    RTS
  1407.    PUTHEX├HARS = *
  1408.    .ASC "0123456789ABCDEF"
  1409.  
  1410. CHECK╙TOP = *
  1411.    JSR STOPKEY
  1412.    BCS +
  1413.    RTS
  1414. +  LDA #<STOPPED═SG
  1415.    LDY #>STOPPED═SG
  1416.    JSR EPUTS
  1417.    LDA #1
  1418.    LDX #0
  1419.    JMP EXIT
  1420.  
  1421.    STOPPED═SG = *
  1422.    .ASC "<╙TOPPED>"
  1423.    .BYTE CHR├╥,0
  1424.  
  1425. ;======== UTILITY FUNCTIONS ========
  1426.  
  1427. INC╠ONG = *  ;( .╪=ZP╧FFSET )
  1428.    INC 0,X
  1429.    BNE +
  1430.    INC 1,X
  1431.    BNE +
  1432.    INC 2,X
  1433.    BNE +
  1434.    INC 3,X
  1435. +  RTS
  1436.  
  1437. DEC╠ONG = *  ;( .╪=ZP╧FFSET )
  1438.    SEC
  1439.    LDA 0,X
  1440.    SBC #1
  1441.    STA 0,X
  1442.    INX
  1443.    LDY #3
  1444. -  LDA 0,X
  1445.    SBC #0
  1446.    STA 0,X
  1447.    INX
  1448.    DEY
  1449.    BNE -
  1450.    RTS
  1451.  
  1452. ;======== INCLUDED FILES ========
  1453.  
  1454. .SEQ ASHELP.S
  1455.  
  1456. ;======== BSS ========
  1457.  
  1458. BSS = *
  1459. SOURCE┬UF    = BSS+0                  ;( 256 BYTES)
  1460. STRING┬UF    = SOURCE┬UF+256          ;( 256 BYTES)
  1461. SYM┬UF       = STRING┬UF+256          ;( 256 BYTES)
  1462. SYM╬EXT      = SYM┬UF+0
  1463. SYM╓ALUE     = SYM┬UF+4
  1464. SYM╒NRES╧PND = SYM┬UF+8
  1465. SYM╘YPE      = SYM┬UF+9
  1466. SYM├LASS     = SYM┬UF+10
  1467. SYM╬AME╠EN   = SYM┬UF+11
  1468. SYM╬AME      = SYM┬UF+12
  1469. SYM╚ASH      = SYM┬UF+254
  1470. EXP╘ABLE     = SYM┬UF+256            ;( 256 BYTES == 15 ENTRIES)
  1471. EXP╚OLE╘YPE  = EXP╘ABLE+0
  1472. EXP╠ENGTH    = EXP╘ABLE+1
  1473. EXP╒NRES├NT  = EXP╘ABLE+2
  1474. EXP╙RC├OL    = EXP╘ABLE+3
  1475. EXP╚OLE┴DDR  = EXP╘ABLE+4
  1476. EXP╙RC╠INE   = EXP╘ABLE+8
  1477. EXP╙RC╞ILE   = EXP╘ABLE+12
  1478. EXP╞IELD     = EXP╘ABLE+0
  1479. EXP╧P        = EXP╞IELD+0
  1480. EXP╘YPE      = EXP╞IELD+1
  1481. EXP╙IGN      = EXP╞IELD+2
  1482. EXP╚I╠O      = EXP╞IELD+3
  1483. EXP╓ALUE     = EXP╞IELD+4
  1484. EXP╬EXT╒NRES = EXP╞IELD+8
  1485. EXP╬EXT╧PND  = EXP╞IELD+12
  1486. EXP╥ESERVED  = EXP╞IELD+13
  1487. IDENT╚ASH╘ABLE = EXP╘ABLE+256      ;(4096 BYTES == 1024 ENTRIES (REF:H╘AB╨AG)
  1488. MEM╨TR╘ABLE  = IDENT╚ASH╘ABLE+4096 ;( 256 BYTES == 64 ENTRIES)
  1489. MEM┬UF       = MEM╨TR╘ABLE+256    ;( 256 BYTES)
  1490. WRITE╬AME    = MEM┬UF+256         ;(  20 BYTES)
  1491. TPA╞REEMAP   = WRITE╬AME+20       ;( 256 BYTES)
  1492. BSS┼ND       = TPA╞REEMAP+256
  1493.