EdAsm/EDASM.SRC/ASM/ASM1.S

2176 lines
66 KiB
ArmAsm

Name : ASM1.S
End of file : 37,977
This file was generated using the DiskBrowser utility with minimal editing.
It is meant for viewing purposes only.
MSB OFF
REP 50
;
; EDASM.ASM - load addr:$6800-$9EFF (len $4000)
; The 1st part of the code ($6800-$77FF) is relocated
; to $D000 of LCBank2. The rest of the code remained
; resident @ $7800-$9EFF
;
; Basically, compilers can be written as:
; Source -> Scanner/Lexer -> Parser -> CodeGenerator
;
; ORG $5800 ;modify ORG in ASSEMBLER.1
ORG $D000
;
; This part of the code is loaded into memory
; at $6800 and relocated to $D000 bank2
;
; Print the symbol table after an assembly listing
; The symbol table is about 27K. If there is not
; enough mem to do a listing, the assembler will
; print only those symbols it can sort. The VO
; symbol table may not contain all idfers
; Ref pg 84,113
;
DoPass3 LDA LstASym ;List symbols?
ORA LstVSym
BMI ChkPrtCols ;Yes
RTS
;
ChkPrtCols LDA #4
BIT Lst6Cols
BPL UsePrtr
;
LDA #6
UsePrtr LDX PrSlot ;Printer?
BNE SetPtrCols ;Yes
LDA #2 ;40-col std video
SetPtrCols STA NumCols ;# of print cols=2,4,6
;
; Find out if the symbol table is empty by
; checking the header nodes.
;
LDA #0
TAY ;Y=0
ChkLoop CMP HeaderT,Y ;Do we have an empty symbol table?
BNE LD025 ;No
INY
BNE ChkLoop
JMP LD16E ;All zeroes => Yes
;
LD025 LDA #0
STA SortF ;Default to sort by symbol
BIT SubTtlF ;Output subtitle?
BVC LD056 ;No
;
LDA #$FF
STA SubTtlF ;There is a subtitle string
LDX #ChnFile ;Get the src Pathname
LDA PNTable,X ; from table of ptrs
STA SrcPathP
LDA PNTable+1,X
STA SrcPathP+1
;
; The buffers below are overwritten
; since we are done w/assembly
;
LDX #12
STX ChnPNB
LD042 LDA SymbolTxt-1,X
STA ChnPNB,X
DEX
BNE LD042
;
LDX #16 ;Include null char
LD04D LDA SortedTxt,X
STA SubTitle,X
DEX
BPL LD04D
;
LD056 LDA EndSymT
BNE LD05C
DEC EndSymT+1
LD05C DEC EndSymT
BIT DskSrcF ;Should this instr be after LDY #HeaderT?
LDA #<HeaderT
LDY #>HeaderT
BMI LD06A ;branch never taken
;
LDA StrtSymT+1
LDY StrtSymT
LD06A STY SymNodeP ;Points @ node containing
STA SymNodeP+1 ; symbolicname
STY SavSTS ;Save Start of SymTbl
STA SavSTS+1 ; as it will be trashed
LDA #2 ;Skip over ptr to
BNE LD099 ; next node
;
; The code below will trash the link ptrs (field) of nodes
; (StrtSymT) - points @ symbolicname field of the node
; (SymNodeP) - points @ link field of the same node
; (StrtSymT) & (SymNodeP) will be changed
; The purpose is to change the layout of the Nodes
; removing the link field altogether
; Layout of record now looks like this:
; symbolicname (variable in length)
; flagbyte
; 16-bit value
;
LD076 LDY #0
LD078 LDA (StrtSymT),Y ;Get char fr symbolicname
STA (SymNodeP),Y ; move it forward in node
BPL LD081 ;eo symbolicname
INY
BNE LD078
;
LD081 LDX #3
LD083 INY
LDA (StrtSymT),Y ;Copy flagbyte
STA (SymNodeP),Y ; & value field
DEX
BNE LD083
;
INY
TYA
CLC
ADC SymNodeP ;Point @ next node
STA SymNodeP
BCC LD096
INC SymNodeP+1
;
LD096 INY ;Skip over link field
INY
TYA
LD099 CLC
ADC StrtSymT
STA StrtSymT ;Point @ symbolicname of next node
BCC LD0A2
INC StrtSymT+1
;
LD0A2 CMP EndSymT ;EO symbol table?
LDA StrtSymT+1
SBC EndSymT+1
BCC LD076 ;No
;
LDY SymNodeP+1
LDX SymNodeP
BNE LD0B1
DEY
LD0B1 DEX
STX EndSymT ;New end of Symbol table
STY EndSymT+1
;
LDA SavSTS ;Restore Start of symbol table
STA StrtSymT
LDA SavSTS+1
STA StrtSymT+1
NOP
;
LD0BF LDA StrtSymT ;Start w/the 1st rec
STA SymP
LDA StrtSymT+1
STA SymP+1
;
; The code below builds a fixed array of 2/4-bytes entries for sorting
; Sort by Symbol - array of 2-bytes entries. Each element is a ptr
; to a symbolicnname
; Sort by Address - array of 4-byte entries. Each element consists
; of a ptr to a symbolicname and address associated with
; the symbolicname
;
LDA #2 ;Default to 2-byte entries
BIT SortF ;Sort by symbol?
BPL LD0CE ;Yes
ASL ;Sort by addr - use 4-byte entries
LD0CE CLC
ADC EndSymT
STA UnsortedP ;Points to a 2/4-byte entry in
STA SortedP
LDA EndSymT+1
ADC #0
STA UnsortedP+1 ; the aux array for fixed rec size
STA SortedP+1 ;Init this for later use by PrSymTbl
LDA #0
STA RecCnt
STA RecCnt+1
;
; This loop builds up the aux array
;
LD0E3 JSR PollKbd ;Abort?
BCC LD0EB
JMP AbortAsm ;Yes
;
LD0EB LDY #0
LD0ED LDA (SymP),Y ;Looking for eo symbolicname
BPL LD0F5 ;Got it
INY
JMP LD0ED
;
LD0F5 BIT SortF ;Sort by Address? (Also means is it phase 2?)
BMI LD108 ;Yes, skip code below
;
; Sort by symbol - always done since (SortF) was set to $00 initially
; (SortF) will set to $FF after printing if LstASym=$80
;
ORA #%10000000 ;set msb on for last
STA (SymP),Y ; char of symbolicname
INY
LDA (SymP),Y ;Get symbol's flag byte
BPL LD108 ;Symbol is defined (msb off)
ORA #%01111110 ;Retain original $80 and $01 bits
EOR #%10000000 ;Clear msb to mark symbol is
STA (SymP),Y ; undefined =$7E/$7F (ref pg 231)
;
; msb of ALL chars of symbolicname are on
; msb of flagbyte is off ($7x)
;
LD108 INY
LDA (SymP),Y ;Get associated addr
STA SymAddr ;Save here just in case we need it later
INY
LDA (SymP),Y
STA SymAddr+1
STY SymIdx ;Save index for $D198 call
;
LDA SymP
LDY #0
STA (UnsortedP),Y ;Ptr to symbolic name
LDA SymP+1
INY
STA (UnsortedP),Y
BIT SortF ;Sort by symbol?
BPL LD12D ;Yes
;
INY
LDA SymAddr
STA (UnsortedP),Y ;Store associated addr
INY
LDA SymAddr+1
STA (UnsortedP),Y
;
LD12D JSR LD198 ;Setup envron for next entry
BCC LD0E3 ;Continue building up work array
;
; Building of the aux work array of 2/4-byte records is complete
;
LDA UnsortedP
BNE LD138
DEC UnsortedP+1
LD138 DEC UnsortedP
;
LDA UnsortedP
STA AuxAryE
LDA UnsortedP+1
STA AuxAryE+1 ;Points @ EO array to be sorted
BIT LstASym ;Alphabetic Symbol listing?
BPL LD14C ;no
;
JSR DoSort
JSR PrSymTbl ;Print it
;
LD14C DEC SortF
LDA SortF ;Do we need to sort by address?
CMP #$FF
BNE LD16E ;No -> done
BIT SubTtlF ;SBTL directive?
BVC LD163 ;No
;
; Overwrite 'SYMBOL'00 with 'ADDRESS'00
;
LDX #7
LD15A LDA AddrTxt,X
STA SubTitle+10,X
DEX
BPL LD15A
;
LD163 BIT LstVSym ;Value ordered listing?
BPL LD16E ;no
;
LDA #$80
STA LstASym ;Force an Alphabetic sort
JMP LD0BF ;Build aux array again w/(SortF)=$FF
;
LD16E LDA #$00
STA SubTtlF ;Reset SBTL flag
doRtn RTS
;
SymbolTxt ASC 'SYMBOL TABLE'
SortedTxt ASC 'SORTED BY SYMBOL' ;null-terminated
DB 0
AddrTxt ASC 'ADDRESS'
DB 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Setup enviornment to process next entry of 2/4-byte array
; Output
; C=1 out of mem or EO symbol table
;
LD198 CLC
LDA SymIdx ;Get index into symbol's record
ADC #1 ;Skip over hi-byte of assoc addr
ADC SymP
STA SymP ;Points @ next record of Symbol table
BCC LD1A5
INC SymP+1
;
LD1A5 LDA UnsortedP ;Ptr to entry of aux array
CMP MemTop
LDA UnsortedP+1
SBC MemTop+1
BCS doRtn1 ;Probably out of mem
;
CLC
LDA #2
BIT SortF ;Sort by Symbol?
BPL LD1B7 ;Yes
ASL ;=4
LD1B7 ADC UnsortedP
STA UnsortedP ;Point @ next empty slot
BCC LD1BF
INC UnsortedP+1
;
LD1BF INC RecCnt
BNE LD1C5
INC RecCnt+1
LD1C5 LDA SymP ;Check if EO symbol table?
CMP EndSymT
LDA SymP+1
SBC EndSymT+1 ;C=1 => yes
doRtn1 RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Sorting Algorithm
; See Disassembled ProDOS Linker for more details
; Before calling, the work array of 2-byte/4-byte
; entries must be setup
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DoSort LDA NumRecs ;Size of unsorted array
STA Jump
LDA NumRecs+1
STA Jump+1
;
; WHILE Jump <> 0
;
WhileLoop LSR Jump+1 ;Jump := Jump DIV 2
ROR Jump
LDA Jump
ORA Jump+1
BNE LD1E1
RTS
;
LD1E1 SEC
LDA NumRecs
SBC Jump
STA EndIdx ;NumRecs-Jump
LDA NumRecs+1
SBC Jump+1
STA EndIdx+1
;
LDX #0
STX StrtIdx+1
INX
STX StrtIdx ;=1
;
; FOR JJJ := 1 to NumRecs-Jump
;
ForLoop LDA StrtIdx
STA JJJ
LDA StrtIdx+1
STA JJJ+1
;
; REPEAT
;
RptLoop CLC
LDA JJJ
ADC Jump
STA III ;III := JJJ + Jump
LDA JJJ+1
ADC Jump+1
STA III+1
;
LDX #3
LD20C LDA JJJ,X ;$9F-$A2
STA J.TH,X ;$AB-$AE
DEX
BPL LD20C
;
; Compute ptrs to the i-th & j-th elements
; of the array being sorted
; NB. The code below assumes the mem locations
; JJJ & III are consecutively declared
; Mulby4/Mulby2 and add to (EndSymT)
; For the 4-byte entries array (Sort by Address)
; (J.TH)=(EndSymT)+JJJ;4 and (I.TH)=(EndSymT)+III;4
; For the 2-byte entries array (Sort by Symbol)
; (J.TH)=(EndSymT)+JJJ;2 and (I.TH)=(EndSymT)+III;2
;
LDX #2
LD215 ASL J.TH,X ;Compute offset fr
ROL J.TH+1,X ; BO of fixed array
BIT SortF ;Sort by Symbol?
BPL LD221 ;Yes
ASL J.TH,X ;No, it's sort by address
ROL J.TH+1,X
;
LD221 CLC
LDA EndSymT ;First compute ptr to the j-th
ADC J.TH,X ; & then on looping back
STA J.TH,X
LDA EndSymT+1
ADC J.TH+1,X
STA J.TH+1,X
DEX
DEX
BEQ LD215 ; the i-th element
;
BIT SortF ;Sort by Symbol
BPL LD268 ;Yes
;
; Sort addresses in ascending order
; (J.TH)-ptr to j-th element
; (I.TH)-ptr to i-th element
;
CLC
LDA #2
ADC J.TH ;Skip over ptr to symbolicname
STA SymPJ
LDA #0
ADC J.TH+1
STA SymPJ+1 ; to point @ 16-bit address
;
CLC
LDA #2
ADC I.TH
STA SymPI
LDA #0
ADC I.TH+1
STA SymPI+1
;
; IF Ary[J].addr > Ary[I].addr then SWAP(Ary[J], Ary[I])
;
LDY #1
LDA (SymPJ),Y ;Compare addresses (hi-byte first)
CMP (SymPI),Y
BEQ LD25D
BCS LD264
LD25A JMP NextJ ;less than
;
LD25D DEY ;Y=0
LDA (SymPI),Y ;Hi-bytes equal so compare lo-bytes
CMP (SymPJ),Y
BCS LD25A
LD264 LDY #3 ;Greater than => swap entries
BNE LD298 ;always
;
; Sort by symbol
; IF Ary[J].name > Ary[I].name then SWAP(Ary[J], Ary[I])
;
LD268 LDY #0
LDA (J.TH),Y ;Get ptr to symbolicname field
TAX
INY
LDA (J.TH),Y ;with an entry of the symbol table
STA SymPJ+1
STX SymPJ
;
LDA (I.TH),Y
TAX
DEY ;=0
LDA (I.TH),Y
STA SymPI
STX SymPI+1
;
LD27E LDA (SymPJ),Y ;Get len byte of symbolic name
CMP (SymPI),Y ;Compare it against its counterpart
BNE LD294 ;No match
INY
CPY #14 ;At most 14 chars will be compared
BCS NextJ
LDA (SymPJ),Y
TAX
AND (SymPI),Y
BMI LD27E ;All chars match
TAX
BPL NextJ
SEC ;Flag we have to swap ptrs
LD294 BCC NextJ ;C=0 ==> 1st symbol < 2nd symbol
;
; Swap contents of 2/4-byte table
; Fall thru : 2-byte entries
;
LDY #1
LD298 LDA (J.TH),Y ;Swap ptrs to the symbolicnames (if Y=1/3)
TAX
LDA (I.TH),Y
STA (J.TH),Y ;as well as corr addresses (if Y=3)
TXA
STA (I.TH),Y
DEY
BPL LD298
;
SEC
LDA JJJ
SBC Jump
STA JJJ ;JJJ := JJJ - Jump
LDA JJJ+1
SBC Jump+1
STA JJJ+1 ;Is J > Jump?
BMI NextJ ;No, less than
ORA JJJ
BEQ NextJ ;No, JJJ=Jump
JMP RptLoop
;
; UNTIL JJJ =< Jump
;
NextJ INC StrtIdx
BNE LD2C1
INC StrtIdx+1
;
LD2C1 LDA StrtIdx+1 ;Finish w/FOR loop?
CMP EndIdx+1
BCC LD2D2
BEQ LD2CC
LD2C9 JMP WhileLoop ;No
;
LD2CC LDA EndIdx
CMP StrtIdx
BCC LD2C9
LD2D2 JMP ForLoop ;Start Index =< End Index
REP 50
;
; Print the sorted symbols and addresses
; (SortedP) should be pointing @ BO aux work array
;
PrSymTbl JSR PrtFF
LD2D8 LDA #0
STA ColCnt ;# of cols printed
JSR PollKbd ;Abort assembling
BCC LD2E4
JMP AbortAsm ;Yes
;
; NB: All chars of symbolicname would have their msb on
; The msb of the corr flag byte is 0
;
LD2E4 LDY #0
LDA (SortedP),Y ;Get ptr to symbolicname
STA SymP
INY
LDA (SortedP),Y
STA SymP+1
DEY ;Y=0
LD2F0 LDA (SymP),Y ;Is it the flag byte?
BPL LD2F8 ;Yes
INY
JMP LD2F0
;
LD2F8 LDA #SPACE
STA SymRefCh ;Init with a blank
LDA #$00
STA IsFwdRef
LDA (SymP),Y ;Get flag byte
ROR ;bit01 -> C (Check bit $01)
BCC LD307 ;=> Forward referenced bit was off
DEC IsFwdRef ;-1
LD307 ROL ;Get back flag byte
CMP #$7E
BCC LD310
LDA #'*' ;Symbol was referenced but not defined
BNE LD329 ;always
;
LD310 BIT Bit40 ;Was symbol unreferenced?
BEQ LD319 ;No
LDA #'?' ;Defined but never referenced
BNE LD329
;
LD319 BIT Bit10 ;Was symbol defined to be EXTERN?
BEQ LD322
LDA #'X' ;Yes
BNE LD329
;
LD322 BIT Bit08 ;Was symbol defined to be ENTRY?
BEQ LD32B
;
LDA #'N' ;Yes
LD329 STA SymRefCh
LD32B LDA SymRefCh
JSR PutC
INY
LDA (SymP),Y ;Get symbol's addr
TAX
INY
LDA (SymP),Y ;Get its hi-byte
BNE LD348 ;Definitely 16-bits
BIT IsFwdRef ;Was forward-referenced bit on?
BMI LD348 ;Yes, consider all such addr as 16 bits
;
LDA #SPACE ;Print 2 spaces for zp/single-byte addr
JSR PutC
JSR PutC
JMP LD34B
;
LD348 JSR PrByte ;addr
LD34B TXA
JSR PrByte
LDA #SPACE
JSR PutC
;
; Print up to 14 chars of the symbolicname
;
LDY #0
LD356 LDA (SymP),Y ;Get char fr symbolicname
BPL LD362 ;It is the flagbyte
JSR PutC
INY
CPY #14
BCC LD356
;
; If symbolicname < 14 chars long, print reqd # of blanks
;
LD362 DEY
LD363 INY
CPY #14
BCS LD370
LDA #SPACE
JSR PutC
JMP LD363 ;Loop back to print more spaces
;
LD370 JSR AdvRecP ;Adv to next entry of aux array
BCS doRtn2 ;We're done with table
INC ColCnt
LDA ColCnt
CMP NumCols
BCC LD383
JSR PutCR ;Further printing will
JMP LD2D8 ; start on next row
LD383 JMP LD2E4 ;Further printing is on same row
doRtn2 RTS
;=================================================
; Adv ptr to next entry of work array
; On return
; C=1 - End of work array
;
AdvRecP CLC
LDA #2
BIT SortF ;Sort by addr?
BPL LD38F ;No, by symbol
ASL ;=4
LD38F ADC SortedP ;next Rec
STA SortedP
BCC LD397
INC SortedP+1
LD397 LDA SortedP ;EO aux array?
CMP AuxAryE
LDA SortedP+1
SBC AuxAryE+1
RTS
;=================================================
; Checks if external ROM is present
; (A)=slot # (1-7)
; Z=1 yes, Z=0 no
;=================================================
Chk4ROM TAX
LDA #%00000010
LD3A3 DEX
BEQ LD3A9
ASL
BNE LD3A3
;
LD3A9 BIT SLTBYT ;Is a Slot ROM present?
BNE LD3B1 ;Yes
LDA #1
RTS
LD3B1 LDA #0 ;Z=1
RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; (Y)=preserved
; Get ptr to next line record and save it
;
LD3B4 LDA SrcP ;save temporarily
PHA
LDA SrcP+1
PHA
TYA
PHA
JSR NextRec ;Point @ start of next src line
LDX FCTIndex
LDA SrcP ;Save it
STA XA060,X
LDA SrcP+1
STA XA060+1,X
PLA
TAY ;restore
PLA
STA SrcP+1
PLA
STA SrcP
RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; START of Assembler's Tables
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; ($D3D4) Table of Ptrs to messages incl. error msgs
; Ref page 219 Workbench
;
ErrMsgT EQU * ;Error code
DW LD50F ;0
DW LD524 ;2
DW LD539 ;4
DW LD54A ;6
DW LD553 ;8
DW LD56C ;A
DW LD57E ;C
DW LD58C ;E
DW LD59F ;10
DW LD5AA ;12
DW LD5C0 ;14
DW LD5D4 ;16
DW LD5E8 ;18
DW LD5F6 ;1A
DW LD605 ;1C
DW LD612 ;1E
DW LD626 ;20
DW $0000 ;22 - none?
DW LD63B ;24
DW LD64D ;26
DW LD65A ;28
DW LD668 ;2A
DW LD678 ;2C
DW LD688 ;2E
DW LD6A0 ;30
DW LD6BD ;32
DW LD6CB ;34
DW LD6DD ;36
DW LD6F1 ;38
DW LD705 ;3A
DW LD71A ;3C
DW LD726 ;3E
DW LD739 ;40
DW LD74B ;42
DW LD75A ;44
DW LD76E ;46
DW LD781 ;48
ErrMsgTE EQU *
;=================================================
FileTxt ASC ' # ELIF' ;FILE #
ASEndTxt EQU *
ASErrTxt ASC ' ERRORS IN THIS ASSEMBLY'
DB $00
SuccTxt EQU *
ASC '** SUCCESSFUL ASSEMBLY := NO ERRORS'
DB $00
WarnTxt ASC ' WARNINGS IN THIS ASSEMBLY'
DB $00
CreatTxt ASC '** ASSEMBLER CREATED ON '
DB $01
FSPCTxt ASC '** FREE SPACE PAGE COUNT'
DB $01
TotLnTxt ASC '** TOTAL LINES ASSEMBLED '
DB $01
ContTxt ASC 'PRESS RETURN TO CONTINUE'
DB $01
AbortTxt ASC 'ASSEMBLY ABORTED. PRESS RETURN'
DB $01
InLinTxt ASC 'ENIL NI ' ;' IN LINE'
ASC 'RORRE ' ;' ERROR'
;=================================================
; There is a table of ptrs to these messages
;
LD50F ASC 'UNDEFINED IDENTIFIER'
DB $00
LD524 ASC 'DUPLICATE IDENTIFIER'
DB $00
LD539 ASC 'UNDEFINED OPCODE'
DB $00
LD54A ASC 'OVERFLOW'
DB $00
LD553 ASC 'RELATIVE EXPRSN OPERATOR'
DB $00
LD56C ASC 'EXPRESSION SYNTAX'
DB $00
LD57E ASC 'EQUATE SYNTAX'
DB $00
LD58C ASC 'INVALID IDENTIFIER'
DB $00
LD59F ASC 'DSECT/DEND'
DB $00
LD5AA ASC 'SYMBOL/RLD TABLE FULL'
DB $00
LD5C0 ASC 'ASSEMBLER PARAMETER'
DB $00
LD5D4 ASC 'INCLUDE/CHN NESTING'
DB $00
LD5E8 ASC 'MACRO NESTING'
DB $00
LD5F6 ASC 'MACRO ARGUMENT'
DB $00
LD605 ASC 'ADDRESS MODE'
DB $00
LD612 ASC 'RESERVED IDENTIFIER'
DB $00
LD626 ASC 'MACRO FILE NOT FOUND'
DB $00
LD63B ASC 'DIRECTIVE OPERAND'
DB $00
LD64D ASC 'BRANCH RANGE'
DB $00
LD65A ASC 'BYTE OVERFLOW'
DB $00
LD668 ASC 'INDIRECT SYNTAX'
DB $00
LD678 ASC 'INDEXING SYNTAX'
DB $00
LD688 ASC 'INDIRECT REQUIRES ZPAGE'
DB $00
LD6A0 ASC 'INVALID AFTER 1ST IDENTIFIER'
DB $00
LD6BD ASC 'SW16 REGISTER'
DB $00
LD6CB ASC 'INVALID DELIMITER'
DB $00
LD6DD ASC 'OBJ BUFFER OVERFLOW'
DB $00
LD6F1 ASC 'OBJ BUFFER CONFLICT'
DB $00
LD705 ASC 'INVALID FROM INCLUDE'
DB $00
LD71A ASC 'BUFFER SIZE'
DB $00
LD726 ASC '>255 EXTRNS/ENTRYS'
DB $00
LD739 ASC 'DUPLICATE EXT/ENT'
DB $00
LD74B ASC 'SWEET16 OPCODE'
DB $01
LD75A ASC 'EXTRN USED AS ZXTRN'
DB $01
LD76E ASC 'ORG MUST BE > $100'
DB $00
LD781 ASC '6502X ADRS MODE/OPCODE'
DB $00
;
LD798 ASC '----- NEXT OBJECT FILE NAME IS '
LD7B7 DB $0D
ASC 'SOURCE FILE #'
LD7C7 DB $0D
ASC ' INCLUDE FILE #'
;=================================================
; This table works in conjunction wth the next table
; They are indexed with the same (X)
; Table for operand parser (47 bytes)
; If -ve token (other than $A0) matched with src char
; If followed by $00 - proceed to evaluate expr
; If followed by $A0 - chk for a CR
; If there is a CR and next token is
; +ve and odd - return to caller with C=0 and (A)=MODULO2
; which is an index btwn (0-12) for further processing
; to determine the length of the instruction
; +ve and even - call a rtn for further processing (2,4,6 valid)
; If -ve token does not match src char
; use table $D806 to advance to next -ve token
; ($D7D7)
;
MSB ON
AModTkns EQU *
ASC '#' ;$A3
DB $00 ;Evaluate Expression
ASC ' ' ;Check for white space
DB 4+1 ;If CR, ret its mod2 value - imm
;
LD7DB ASC '(' ;$A8
DB $00 ;eval expr
ASC ',' ;$AC
ASC 'X' ;$D8
ASC ')' ;$A9
ASC ' ' ;Check for CR
DB $02 ;Helper rtn 1 - IsZPMod?
DB 14+1 ;$0F - (zp,X)
LD7E3 DB $06 ;Helper rtn 3 - Is65C02?
DB 24+1 ;$19 - (abs,X)
;
LD7E5 ASC ')' ;$A9
ASC ',' ;$AC
ASC 'Y' ;$D9
ASC ' ' ;Check for CR
DB $02 ;helper rtn 1
DB 12+1 ;$0D - (zp),y
;
LD7EB ASC ' ' ;Check for CR
DB $06 ;helper rtn 3
DB $02 ;helper rtn 1
DB 16+1 ;$11 - (zp)
LD7EF DB 18+1 ;$13 - (abs)
;
LD7F0 DB $04 ;helper rtn 2 - IsAccMode?
DB 20+1 ;$15 - Acc
LD7F2 DB $8D ;cr
DB 20+1 ;$15 - Acc
LD7F4 ASC ' ;' ;$BB
DB 20+1 ;$15 - Acc
;
LD7F6 DB $00 ;eval expr
ASC ' ' ;Check for CR
DB $02 ;Helper rtn 1
DB 2+1 ;$03 - zp
LD7FA DB 0+1 ;$01 - abs
;
LD7FB ASC ',' ;$AC
ASC 'X' ;$D8
ASC ' ' ;Check for CR
DB $02 ;Helper rtn 1
DB 6+1 ;$07 - zp,X
LD800 DB 8+1 ;$09 - abs,X
;
LD801 ASC 'Y' ;$D9
ASC ' ' ;Check for whitespace
DB $02 ;Helper rtn 1
DB 22+1 ;$17 - zp,Y
LD805 DB 10+1 ;$0B - abs,Y
MSB OFF
;=================================================
; ($D806) - 47 bytes
; Command to the AdrMod parser
; if token is
; 0 - compare next src char to next token in $D7D7 table
; +ve - index to next token in $D7D7 table to be used to
; compare against curr src char
; -ve - error token
;
; error code = error token & $7E
;
AModCmds DB LD7DB-AModTkns ;index to token in $D7D7 to be used next
DB $00 ;Compare next token and src char
DB $80+$34 ;error code
DB $00
DB LD7F0-AModTkns ;$19
DB $00
DB LD7E5-AModTkns ;$0E
DB $80+$2A ;Index Syntax
;
DB $80+$2A
DB $80+$34 ;Invalid Delimiter
DB LD7E3-AModTkns ;$0C
DB $00
DB $80+$2E ;Indirect req zp
DB $00
DB $80+$2A
DB LD7EB-AModTkns ;$14
;
DB $80+$2A
DB $80+$34
DB $80+$2E
DB $00
DB $80+$34
DB LD7EF-AModTkns ;$18
DB LD7EF-AModTkns ;$18
DB $00
;
DB $00
DB LD7F2-AModTkns ;$1B
DB $00
DB LD7F4-AModTkns ;$1D
DB $00
DB LD7F6-AModTkns ;$1F
DB $00
DB $00
;
DB LD7FB-AModTkns ;$24
DB LD7FA-AModTkns ;$23
DB $00
DB $00
DB $80+$34
DB LD801-AModTkns ;$2A
DB $80+$34 ;Invalid Delimiter
DB LD800-AModTkns ;$29
;
DB $00
DB $00
DB $80+$2C ;Indexing Syntax
DB $80+$34
DB LD805-AModTkns ;$2E
DB $00
DB $00
;=================================================
; ($D835) 6502/X6502 Opcode Translation table 213 bytes
; The 15 addressing modes of a 65C02
; 1) implied - opcode
; 2) accumulator - opcode
; 3) program counter relative - opcode reladdr
; 4) immediate - opcode #
; 5) direct - opcode zp
; 6) absolute - opcode abs
; 7) direct indexed X - opcode zp,X
; 8) absolute indexed X - opcode abs,X
; 9) direct indexed Y - opcode zp,Y
; 10) absolute indexed Y - opcode abs,Y
; 11) indexed indirect X - opcode (zp,X)
; 12) absolute indexed indirect X - JMP (abs,X)
; 13) absolute indirect - JMP (abs)
; 14) indirect - opcode (zp)
; 15) indirect indexed Y - opcode (zp),Y
;=================================================
; Implied and accumulator mode opcodes are all single bytes
; PC rel (branch ops) are 2 bytes
; Only these 3 modes need to be considered separately viz
; JMP (abs) - 1 of its kind!
; opcode (abs,X) JMP (abs,X) - one of its kind
; opcode zp,Y - LDX zp,Y STX zp,Y - 2 only
; NOP,BRK special
;
; This table is for ADC/AND/ etc
; L8516 DB $03,$02,$02,$02,$03,$03,$02,$02,$02 ;instr len for 9 addr modes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OpcodeT EQU *
ADCOps EQU *
DB $6D ;ADC abs 3
DB $65 ;ADC zp 2
DB $69 ;ADC # 2
DB $75 ;ADC zp,X 2
DB $7D ;ADC abs,X 3
DB $79 ;ADC abs,Y 3
DB $71 ;ADC (zp),Y 2
DB $61 ;ADC (zp,X) 2
DB $72 ;ADC (zp) - C02 2
;
ANDOps EQU *
DB $2D ;AND abs
DB $25 ;AND zp
DB $29 ;AND #
DB $35 ;AND zp,X
DB $3D ;AND abs,X
DB $39 ;AND abs,Y
DB $31 ;AND (zp),Y
DB $21 ;AND (zp,X)
DB $32 ;AND (zp) - C02
;
ASLOps EQU *
DB $0E ;ASL abs
DB $06 ;ASL zp
DB $0A ;ASL A
DB $16 ;ASL zp,X
DB $1E ;ASL abs,X
;
DB $90 ;BCC
DB $B0 ;BCS
DB $F0 ;BEQ
;
BITOps EQU *
DB $2C ;BIT abs
DB $24 ;BIT zp
DB $89 ;BIT # - C02
DB $34 ;BIT zp,X - C02
DB $3C ;BIT abs,X - C02
;
DB $30 ;BMI
DB $D0 ;BNE
DB $10 ;BPL
DB $80 ;BRA
DB $00 ;BRK
DB $50 ;BVC
DB $70 ;BVS
;
CLROps EQU *
DB $18 ;CLC
DB $D8 ;CLD
DB $58 ;CLI
DB $B8 ;CLV
;
CMPOps DB $CD ;CMP
DB $C5 ;CMP
DB $C9 ;CMP #
DB $D5 ;CMP
DB $DD ;CMP
DB $D9 ;CMP
DB $D1 ;CMP
DB $C1 ;CMP
DB $D2 ;CMP
;
CPXOps EQU *
DB $EC ;CPX abs
DB $E4 ;CPX zp
DB $E0 ;CPX #
;
CPYOps EQU *
DB $CC ;CPY abs
DB $C4 ;CPY zp
DB $C0 ;CPY #
;
DECOps EQU *
DB $CE ;DEC abs
DB $C6 ;DEC zp
DB $3A ;DEC A - C02
DB $D6 ;DEC zp,X
DB $DE ;DEC abs,X
;
DB $CA ;DEX
DB $88 ;DEY
;
EOROps EQU *
DB $4D ;EOR
DB $45 ;EOR
DB $49 ;EOR
DB $55 ;EOR
DB $5D ;EOR
DB $59 ;EOR
DB $51 ;EOR
DB $41 ;EOR
DB $52 ;EOR
;
INCOps EQU *
DB $EE ;INC
DB $E6 ;INC
DB $1A ;INC
DB $F6 ;INC
DB $FE ;INC
;
DB $E8 ;INX
DB $C8 ;INY
;
JMPOps EQU *
DB $4C ;JMP abs
DB $6C ;JMP (abs)
DB $7C ;JMP (abs,X) - C02
;
JSROps DB $20 ;JSR abs
;
LDAOps EQU *
DB $AD ;LDA
DB $A5 ;LDA
DB $A9 ;LDA
DB $B5 ;LDA
DB $BD ;LDA
DB $B9 ;LDA
DB $B1 ;LDA
DB $A1 ;LDA
DB $B2 ;LDA
;
LDXOps EQU *
DB $AE ;LDX abs
DB $A6 ;LDX zp
DB $A2 ;LDX #
DB $B6 ;LDX zp,Y
DB $00 ;Acc - (TXA)
DB $BE ;LDX abs,Y
;
LDYOps EQU *
DB $AC ;LDY abs
DB $A4 ;LDY zp
DB $A0 ;LDY #
DB $B4 ;LDY zp,X
DB $BC ;LDY abs,X
;
LSROps EQU *
DB $4E ;LSR
DB $46 ;LSR
DB $4A ;LSR
DB $56 ;LSR
DB $5E ;LSR
;
NOPOps DB $EA ;NOP
;
ORAOps EQU *
DB $0D ;ORA
DB $05 ;ORA
DB $09 ;ORA
DB $15 ;ORA
DB $1D ;ORA
DB $19 ;ORA
DB $11 ;ORA
DB $01 ;ORA
DB $12 ;ORA
;
PSHOps EQU *
DB $48 ;PHA
DB $08 ;PHP
DB $DA ;PHX
DB $5A ;PHY
DB $68 ;PLA
DB $28 ;PLP
DB $FA ;PLX
DB $7A ;PLY
;
ROLOps EQU *
DB $2E ;ROL
DB $26 ;ROL
DB $2A ;ROL
DB $36 ;ROL
DB $3E ;ROL
;
ROROps EQU *
DB $6E ;ROR
DB $66 ;ROR
DB $6A ;ROR
DB $76 ;ROR
DB $7E ;ROR
;
DB $40 ;RTI
DB $60 ;RTS
;
SBCOps EQU *
DB $ED ;SBC
DB $E5 ;SBC
DB $E9 ;SBC
DB $F5 ;SBC
DB $FD ;SBC
DB $F9 ;SBC
DB $F1 ;SBC
DB $E1 ;SBC
DB $F2 ;SBC
;
DB $38 ;SEC
DB $F8 ;SED
DB $78 ;SEI
;
STAOps EQU *
DB $8D ;STA abs
DB $85 ;STA zp
DB $00 ;# - missing
DB $95 ;STA zp,X
DB $9D ;STA abs,X
DB $99 ;STA abs,Y
DB $91 ;STA (zp),y
DB $81 ;STA (zp,X)
DB $92 ;STA (zp)
;
STXOps EQU *
DB $8E ;STX abs
DB $86 ;STX zp
DB $00 ;abs,X missing
DB $96 ;STX zp,Y
;
STYOps EQU *
DB $8C ;STY abs
DB $84 ;STY zp
DB $00 ;abs,X missing
DB $94 ;STY zp,X
;
STZOps EQU *
DB $9C ;STZ abs - C02
DB $64 ;STZ zp - C02
DB $00 ;# - missing
DB $74 ;STZ zp,X - C02
DB $9E ;STZ abs,X - C02
;
DB $AA ;TAX
DB $A8 ;TAY
;
TRBOps EQU *
DB $1C ;TRB abs - C02
DB $14 ;TRB zp - C02
;
TSBOps EQU *
DB $0C ;TSB abs - C02
DB $04 ;TSB zp - C02
;
DB $BA ;TSX
DB $8A ;TXA
DB $9A ;TXS
DB $98 ;TYA
;
; ($D8EC) These are SW16 pseudo opcodes (30 bytes)
; SET ($10) is treated separately & is missing fr this table
; NB-Like the table above, these pseudo opcodes are
; in alphabetic order
;
SW16Ops EQU *
DB $A0 ;ADD
DB $03 ;BC
DB $0A ;BK
DB $05 ;BM
DB $08 ;BM1
DB $02 ;BNC
DB $09 ;BNM1
DB $07 ;BNZ
DB $04 ;BP
DB $01 ;BR
DB $0E ;BRL
DB $0C ;BS
DB $0F ;BSL
DB $06 ;BZ
DB $0D ;CPIM
DB $D0 ;CPR
DB $F0 ;DCR
DB $E0 ;INR
DB $20 ;LD
DB $60 ;LDD
DB $40 ;LDI
DB $80 ;POP
DB $C0 ;POPD
DB $00 ;RTN
DB $0B ;RS
DB $30 ;ST
DB $50 ;STI
DB $70 ;STD
DB $90 ;STP
DB $B0 ;SUB
;=================================================
; ($D90A) 213 bytes cycle times
; A value of $29 -> no cycle times?
;=================================================
CycTimes DB 4 ;ADC abs
DB 3 ;ADC zp
DB 2 ;ADC #
DB 4 ;ADC zp,X
DB 4 ;ADC abs,X
DB 4 ;ADC abs,Y
DB 5 ;ADC (zp),y
DB 6 ;ADC (zp,X)
DB 5 ;ADC (zp)
;
DB 04,03,02,04,04,04,05,06,05;AND
DB 06,05,02,06,07 ;ASL
DB 03,03,03 ;BCC,BCS,BEQ
DB 04,03,02,04,04 ;BIT
DB 03,03,03,03,07,03,03;BMI,BNE,BPL,BRA,BRK,BVC,BVS
DB 02,02,02,02 ;CLC,CLD,CLI,CLV
;
DB 04,03,02,04,04,04,05,06,05;CMP
;
DB 04,03,02 ;CPX
DB 04,03,02 ;CPY
;
DB 06,05,02,06,07 ;DEC
DB 02,02 ;DEX,DEY
;
DB 04,03,02,04,04,04,05,06,05;EOR
DB 06,05,02,06,07 ;INC
DB 02,02 ;INX,INY
;
DB 03,05,06,06 ;JMP,JSR
DB 04,03,02,04,04,04,05,06,05;LDA
;
DB 04,03,02,04,$29,04;LDX
DB 04,03,02,04,04 ;LDY
DB 06,05,02,06,07 ;LSR
DB 02 ;NOP
DB 04,03,02,04,04,04,05,06,05;ORA
DB 03,03,03,03 ;PHA,PHP,PHX,PHY
DB 04,04,04,04 ;PLA,PLP,PLX,PLY
;
DB 06,05,02,06,07 ;ROL
DB 06,05,02,06,07 ;ROR
;
DB 6,6 ;RTI,RTS
DB 04,03,02,04,04,04,05,06,05;SBC
;
DB 02,02,02 ;SEC,SED,SEI
DB 04,03,$29,04,05,05,06,06,05;STA
;
DB 04,03,$29,04 ;STX
DB 04,03,$29,04 ;STY
DB 04,03,$29,04,05 ;STZ
;
DB 02,02 ;TAX,TAY
DB 06,05,06,05 ;TRB,TSB
DB 02,02,02,02 ;TSX,TXA,TXS,TYA
;
; 30 bytes - no cycle time for SW16 pseudo opcodes
;
DB $29,$29,$29,$29,$29,$29,$29,$29
DB $29,$29,$29,$29,$29,$29,$29,$29
DB $29,$29,$29,$29,$29,$29,$29,$29
DB $29,$29,$29,$29,$29,$29
;=================================================
; ($D9DF) Char mapping
; char NV-B DIZC
; '0'-'9' --> $43 (0100 0011)
; 'A'-'F' --> $40 (0100 0000) (hexdec)
; 'G'-'Z' --> $00 (0000 0000)
; 'a'-'f' --> $C0 (1100 0000)
; 'g'-'z' --> $80 (1000 0000)
; others --> $01 (0000 0001)
; Value is popped into Status reg
; setting/resetting its ALL bits
;
CharMap1 DB $01,$01,$01,$01,$01,$01,$01,$01
DB $01,$01,$01,$01,$01,$01,$01,$01
DB $01,$01,$01,$01,$01,$01,$01,$01
DB $01,$01,$01,$01,$01,$01,$01,$01
DB $01,$01,$01,$01,$01,$01,$01,$01
DB $01,$01,$01,$01,$01,$01,$01,$01
DB $43,$43,$43,$43,$43,$43,$43,$43;$30-$39
DB $43,$43
DB $01,$01,$01,$01,$01,$01,$01
DB $40,$40,$40,$40,$40,$40;$41-$46
DB $00,00,00,00,00,00,00,00,00
DB $00,00,00,00,00,00,00,00,00,00,00
DB $01,01,01,01,01,01
DB $C0,$C0,$C0,$C0,$C0,$C0;$61-$66
DB $80,$80,$80,$80,$80,$80,$80,$80,$80;$67-$7A
DB $80,$80,$80,$80,$80,$80,$80,$80,$80
DB $80,$80
DB $01,$01,$01,$01,$01
;=================================================
; Char mapping
; char NV-B DIZC
; '0'-'9' --> $42 (0100 0010)
; 'A'-'F' --> $40 (0100 0000)
; 'G'-'Z' --> $00 (0000 0000)
; 'a'-'f' --> $C0 (1100 0000)
; 'g'-'z' --> $80 (1000 0000)
; others --> $01 (0000 0001)
; Value is popped into Status reg
; setting/resetting its ALL bits
;
CharMap2 DB 01,01,01,01,01,01,01,01
DB 01,01,01,01,01,01,01,01
DB 01,01,01,01,01,01,01,01
DB 01,01,01,01,01,01,01,01
DB 01,01,01,01,01,01,01,01
DB 01,01,01,01,01,01,00,01
DB $42,$42,$42,$42,$42,$42;$30-$39
DB $42,$42,$42,$42
DB 01,01,01,01,01,01,01
DB $40,$40,$40,$40,$40,$40;$41-$46
DB 00,00,00,00,00,00,00,00,00
DB 00,00,00,00,00,00,00,00,00,00,00
DB 01,01,01,01,01,01
DB $C0,$C0,$C0,$C0,$C0,$C0;$61-$66
DB $80,$80,$80,$80,$80,$80,$80,$80,$80;$67-$7A
DB $80,$80,$80,$80,$80,$80,$80,$80,$80
DB $80,$80
DB 01,01,01,01,01
;=================================================
; Directives/Mnemonics/Sweet16 table
; The table entries are variable in length
; because of the DCI text field
; Format of an entry
; If mnemonics
; 1) DCI text - variable in len
; 2) 1st flag byte - permitted addressing modes
; 3) 2nd flag byte - permitted addressing modes
; 4) index into opcode & cycle timing tables
; If directives
; 1) DCI text
; 2) flag byte - $80/$81
; 3) DDB JMP addr-1
;
; 1st Flag byte
; 1000 000x - directives (if x=1, print expr result field)
; 0100 xxxx - sweet16 pseudo opcode
; 0010 0000 - single byte opcodes excluding acc mode opcodes
; 0001 000x - JMP,JSR,CPIM,BSL,BRL
; 0000 1000 - branch opcodes
; 0000 0100 - LDX,STX --> special mode viz LDX zp,Y or STX zp,Y
; 0000 0011 - ADC,AND,CMP,EOR,LDA,ORA,SBC,STA
; 0000 0010 - ASL,DEC,INC,LSR,ROL,ROR
; 0000 0001 - JMP (abs)
; 0000 0000 - BIT,CPX,CPY,LDY,STY,STZ,TRB,TSB
;
; 1st Flag byte - addressing modes
; 1000 0000 - Directives
; 0100 0000 - Sweet 16
; 0010 0000 - Implied mode
; 0001 0000 - (abs)
; 0000 1000 - Relative mode
; 0000 0100 - zp,Y (for LDX,STX)
; 0000 0011 - (zp)
; 0000 0010 - acc mode
; 0000 0001 - (abs,X) (for JMP)
; 0000 0000
;
; 2nd flag byte - addressing modes
;
; 1000 0000 - (zp,X)
; 0100 0000 - (zp),Y
; 0010 0000 - abs,Y
; 0001 0000 - abs,X
; 0000 1000 - zp,X
; 0000 0100 - immediate mode
; 0000 0010 - zp
; 0000 0001 - abs
;
; NB: If the meaning of the bits in the 2 flag bytes
; are re-arranged/changed, the data tables OpcodeT,
; ModeBitsT etc. must be modified as well. Code
; involving the use of these values must be re-written
;
; Single byte (excluding those which are acc modes)
; & branch ops don't have sub-tables
;
MnemTbl EQU *
LtrA DCI 'ADC' ;mnemonics
DB %00000011 ;$03
DB %11111111 ;$FF
DB ADCOps-OpcodeT ;index to sub-table of Opcode table
DCI 'ADD'
DB $40 ;0100 0000
DB $02
DB SW16Ops-OpcodeT
DCI 'AND'
DB %00000011 ;$03
DB %11111111 ;$FF
DB ANDOps-OpcodeT
DCI 'ASC'
DB %10000000
DDB L8DD2-1
DCI 'ASL'
DB %00000010 ;$02
DB %00011011 ;$1B
DB ASLOps-OpcodeT
LtrB DCI 'BC'
DB $48 ;0100 1000
DB $03
DB SW16Ops-OpcodeT+1
;
DCI 'BCC'
DB %00001000 ;$08
DB %00000011 ;$03
DB $17 ; -OpcodeT
DCI 'BCS'
DB $08
DB $03
DB $18
DCI 'BEQ'
DB $08
DB $03
DB $19
DCI 'BGE'
DB $08
DB $03
DB $18
;
DCI 'BIT'
DB %00000000 ;$00
DB %00011111 ;$1F
DB BITOps-OpcodeT
DCI 'BK'
DB $60 ;0110 0000
DB $00
DB SW16Ops-OpcodeT+2
DCI 'BLT'
DB $08
DB $03
DB $17
DCI 'BM'
DB $48 ;0100 1000
DB $03
DB SW16Ops-OpcodeT+3
DCI 'BM1'
DB $48 ;0100 1000
DB $03
DB SW16Ops-OpcodeT+4
;
DCI 'BMI'
DB $08
DB $03
DB $1F ; -OpCodeT
DCI 'BNC'
DB $48 ;0100 1000
DB $03
DB SW16Ops-OpcodeT+5
DCI 'BNE'
DB $08
DB $03
DB $20
DCI 'BNM1'
DB $48 ;0100 1000
DB $03
DB SW16Ops-OpcodeT+6
DCI 'BNZ'
DB $48 ;0100 1000
DB $03
DB SW16Ops-OpcodeT+7
DCI 'BP'
DB $48 ;0100 1000
DB $03
DB SW16Ops-OpcodeT+8
DCI 'BPL'
DB $08
DB $03
DB $21
DCI 'BR'
DB $48 ;0100 1000
DB $03
DB SW16Ops-OpcodeT+9
DCI 'BRA'
DB $08
DB $03
DB $22
;
DCI 'BRK'
DB $20
DB $00
DB $23
DCI 'BRL'
DB $58 ;0101 1000
DB $03
DB SW16Ops-OpcodeT+10
DCI 'BS'
DB $48 ;0100 1000
DB $03
DB SW16Ops-OpcodeT+11
DCI 'BSL'
DB $58 ;0101 1000
DB $03
DB SW16Ops-OpcodeT+12
;
DCI 'BVC'
DB $08
DB $03
DB $24
DCI 'BVS'
DB $08
DB $03
DB $25
DCI 'BZ'
DB $48 ;0100 1000
DB $03
DB SW16Ops-OpcodeT+13
LtrC DCI 'CHN'
DFB $80
DDB L928C-1
DCI 'CHR'
DFB $80
DDB L8FC7-1
;
DCI 'CLC'
DB $20 ;0010 0000
DB $00
DB $26
DCI 'CLD'
DB $20
DB $00
DB $27
DCI 'CLI'
DB $20
DB $00
DB $28
DCI 'CLV'
DB $20
DB $00
DB $29
;
DCI 'CMP'
DB $03 ;0000 0011
DB $FF
DB CMPOps-OpcodeT
DCI 'CPIM'
DB $50 ;0101 0000
DB $01
DB SW16Ops-OpcodeT+14
DCI 'CPR'
DB $40
DB $02
DB SW16Ops-OpcodeT+15
;
DCI 'CPX'
DB $00
DB $07
DB CPXOps-OpcodeT
DCI 'CPY'
DB $00
DB $07
DB CPYOps-OpcodeT
;
LtrD DCI 'DATE'
DB $80
DDB L901D-1
DCI 'DB'
DB $80
DDB L8CC3-1
DCI 'DCI'
DB $80
DDB L8E54-1
DCI 'DCR'
DB $40
DB $02
DB SW16Ops-OpcodeT+16
DCI 'DDB'
DB $80
DDB L8DCD-1
;
DCI 'DEC'
DB $02 ;0000 0010
DB $1B
DB DECOps-OpcodeT
DCI 'DEF'
DB $81
DDB L9144-1
DCI 'DEND'
DB $80
DDB L908E-1
;
DCI 'DEX'
DB $20
DB $00
DB $3E
DCI 'DEY'
DB $20
DB $00
DB $3F
;
DCI 'DFB'
DB $80
DDB L8CC3-1
DCI 'DO'
DB $81 ;1000 0001
DDB L90B7-1
DCI 'DS'
DB $81
DDB L8C0E-1
DCI 'DSECT'
DB $80
DDB L9065-1
DCI 'DW'
DB $80
DDB L8D67-1
LtrE DCI 'ELSE'
DB $80
DDB L90CB-1
DCI 'ENTRY'
DB $81
DDB L9144-1
;
DCI 'EOR'
DB $03
DB $FF
DB EOROps-OpcodeT
DCI 'EQU'
DB $81
DDB L8A31-1
DCI 'EXTRN'
DB $81
DDB L91A8-1
LtrF DCI 'FAIL'
DB $80
DDB L9215-1
DCI 'FIN'
DB $80
DDB L90D7-1
LtrI DCI 'IBUFSIZ'
DB $81
DDB L93C4-1
DCI 'IDNUM'
DB $80
DDB L905E-1
DCI 'IFEQ'
DB $81
DDB L90DE-1
DCI 'IFGE'
DB $81
DDB L90FC-1
DCI 'IFGT'
DB $81
DDB L90EB-1
DCI 'IFNE'
DB $81
DDB L90B7-1
DCI 'IFLE'
DB $81
DDB L9112-1
DCI 'IFLT'
DB $81
DDB L9107-1
;
DCI 'INC'
DB $02
DB $1B
DB INCOps-OpcodeT
DCI 'INCLUDE'
DB $80
DDB L9360-1
DCI 'INR'
DB $40
DB $02
DB SW16Ops-OpcodeT+17
DCI 'INTERP'
DB $81
DDB L9131-1
;
DCI 'INX'
DB $20
DB $00
DB $4E
DCI 'INY'
DB $20
DB $00
DB $4F
LtrJ DCI 'JMP'
DB $11 ;0001 0001
DB %00000001
DB JMPOps-OpcodeT
DCI 'JSR'
DB $10 ;0001 0000
DB %00000001
DB JSROps-OpcodeT
;
LtrL DCI 'LD'
DB $40
DB $02
DB SW16Ops-OpcodeT+18
;
DCI 'LDA'
DB $03
DB $FF
DB LDAOps-OpcodeT
;
DCI 'LDD'
DB $40
DB $02
DB SW16Ops-OpcodeT+19
DCI 'LDI'
DB $40
DB $02
DB SW16Ops-OpcodeT+20
DCI 'LDP'
DB $40
DB $02
DB SW16Ops-OpcodeT+21
;
DCI 'LDX'
DB $04 ;0000_0100
DB %00100111 ;$27
DB LDXOps-OpcodeT
DCI 'LDY'
DB $00
DB %00011111 ;$1F
DB LDYOps-OpcodeT
;
DCI 'LSL'
DB $02
DB $1B
DB ASLOps-OpcodeT
DCI 'LSR'
DB $02
DB $1B
DB LSROps-OpcodeT
;
DCI 'LST'
DB $80
DDB L8ECA-1
LtrM DCI 'MACLIB'
DB $80
DDB L937F-1
DCI 'MSB'
DB $80
DDB L8E66-1
;
LtrN DCI 'NOP'
DB $20
DB $00
DB $6D
LtrO DCI 'OBJ'
DB $81
DDB L8BAD-1
;
DCI 'ORA'
DB $03
DB $FF
DB ORAOps-OpcodeT
DCI 'ORG'
DB $81
DDB L8A82-1
LtrP DCI 'PAGE'
DB $80
DDB DoPage-1
DCI 'PAUSE'
DB $80
DDB L927A-1
;
DCI 'PHA'
DB $20
DB $00
DB $77
DCI 'PHP'
DB $20
DB $00
DB $78
DCI 'PHX'
DB $20
DB $00
DB $79
DCI 'PHY'
DB $20
DB $00
DB $7A
DCI 'PLA'
DB $20
DB $00
DB $7B
DCI 'PLP'
DB $20
DB $00
DB $7C
DCI 'PLX'
DB $20
DB $00
DB $7D
DCI 'PLY'
DB $20
DB $00
DB $7E
;
DCI 'POP'
DB $40
DB $02
DB SW16Ops-OpcodeT+21
DCI 'POPD'
DB $40
DB $02
DB SW16Ops-OpcodeT+22
LtrR DCI 'REF'
DB $81
DDB L91A8-1
DCI 'REL'
DB $80
DDB L9126-1
DCI 'REP'
DB $80
DDB L8FA3-1
;
DCI 'ROL'
DB $02
DB $1B
DB ROLOps-OpcodeT
DCI 'ROR'
DB $02
DB $1B
DB ROROps-OpcodeT
;
DCI 'RS'
DB $60 ;0110 0000
DB $00
DB SW16Ops-OpcodeT+24
;
DCI 'RTI'
DB $20
DB $00
DB $89
DCI 'RTN'
DB $60 ;0110 0000
DB $00
DB $23 ;BRK?
DCI 'RTS'
DB $20
DB $00
DB $8A
;
LtrS DCI 'SBC'
DB $03
DB $FF
DB SBCOps-OpcodeT
DCI 'SBTL'
DB $80
DDB L8F61-1
DCI 'SBUFSIZ'
DB $81
DDB L93C7-1
;
DCI 'SEC'
DB $20
DB $00
DB $94
DCI 'SED'
DB $20
DB $00
DB $95
DCI 'SEI'
DB $20
DB $00
DB $96
;
DCI 'SET'
DB $C0 ;1100 0000
DDB L94C0-1
DCI 'SKP'
DB $80
DDB L8FEA-1
DCI 'ST'
DB $40
DB $02
DB SW16Ops-OpcodeT+25
;
DCI 'STA'
DB %00000011
DB %11111011
DB STAOps-OpcodeT
DCI 'STD'
DB $40
DB $02
DB SW16Ops-OpcodeT+27
DCI 'STI'
DB $40
DB $02
DB SW16Ops-OpcodeT+26
DCI 'STP'
DB $40
DB $02
DB SW16Ops-OpcodeT+28
DCI 'STR'
DB $80
DDB L8E94-1
;
DCI 'STX'
DB $04 ;0000_0100
DB %00000011 ;$03
DB STXOps-OpcodeT
DCI 'STY'
DB $00
DB $0B ;0000_1011
DB STYOps-OpcodeT
DCI 'STZ'
DB $00
DB $1B
DB STZOps-OpcodeT
;
DCI 'SUB'
DB $40
DB $02
DB SW16Ops-OpcodeT+29
DCI 'SYS'
DB $81
DDB L9131-1
DCI 'SW16'
DB $C0 ;1100 0000
DDB L946F-1
;
LtrT DCI 'TAX'
DB $20
DB $00
DB $AD
DCI 'TAY'
DB $20
DB $00
DB $AE
DCI 'TIME'
DB $80
DDB L905E-1
;
DCI 'TRB'
DB $00
DB $03
DB TRBOps-OpcodeT
DCI 'TSB'
DB $00
DB $03
DB TSBOps-OpcodeT
;
DCI 'TSX'
DB $20
DB $00
DB $B3
DCI 'TXA'
DB $20
DB $00
DB $B4
DCI 'TXS'
DB $20
DB $00
DB $B5
DCI 'TYA'
DB $20
DB $00
DB $B6
;
LtrX DCI 'X6502'
DB $81
DDB L9139-1
LtrZ DCI 'ZDEF'
DB $81
DDB L9140-1
DCI 'ZREF'
DB $81
DDB L91A4-1
DCI 'ZXTRN'
DB $81
DDB L91A4-1
DotDrtv DCI '.ASCII'
DB $80
DDB L8DD2-1
DCI '.BLOCK'
DB $81
DDB L8C0E-1
DCI '.BYTE'
DB $80
DDB L8CC3-1
DCI '.DBYTE'
DB $80
DDB L8DCD-1
DCI '.DEF'
DB $81
DDB L9144-1
DCI '.EQU'
DB $81
DDB L8A31-1
DCI '.INCLUDE'
DB $80
DDB L9360-1
DCI '.LIST'
DB $80
DDB L8F3D-1
DCI '.NOLIST'
DB $80
DDB L8F3A-1
DCI '.ORG'
DB $81
DDB L8A82-1
DCI '.PAGE'
DB $80
DDB DoPage-1
DCI '.REF'
DB $81
DDB L91A8-1
DCI '.SKIP'
DB $80
DDB L8FEA-1
DCI '.TITLE'
DB $80
DDB L8F61-1
DCI '.WORD'
DB $80
DDB L8D67-1
DS 4,0 ;unused
;=================================================
; Table of ptrs to first letter subtables
;
Tbl1stLet DW DotDrtv
DW LtrA
DW LtrB
DW LtrC
DW LtrD
DW LtrE
DW LtrF
DW $0000
DW $0000
DW LtrI
DW LtrJ
DW $0000
DW LtrL
DW LtrM
DW LtrN
DW LtrO
DW LtrP
DW $0000
DW LtrR
DW LtrS
DW LtrT
DW $0000
DW $0000
DW $0000
DW LtrX
DW $0000
DW LtrZ
;
; Assembler's creation date and time
;
LDF3F ASC '30-APR-85'
LDF48 ASC '22:46 '
;
; Area to preserve the zero page locations $60-$F1
;
SvZPArea DS $92,0
;
; ($DFE0) Haven't figure out what is this!
; May be encoded message. Or just random bytes
; generated by a DS 32 statement
;
DW $D581
DW $D589
DW $D58E
DW $D546
DW $A023
DW $A048
DW $A308
DW $DCC7
DW $9BF8
DW $A071
DW $B9AF
DW $9B18
DW $9B6D
DW $DDC0
DW $9F49
DW $C8D3
REP 50