mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-29 02:49:54 +00:00
992 lines
28 KiB
Plaintext
992 lines
28 KiB
Plaintext
|
NEW
|
|||
|
AUTO 3,1
|
|||
|
*--------------------------------------
|
|||
|
.DUMMY
|
|||
|
.OR $A700
|
|||
|
ASM65816.SEARCH.TABLE .BS 3
|
|||
|
ASM65816.GNC .BS 3
|
|||
|
ASM65816.GNC.UC .BS 3
|
|||
|
ASM65816.GNNB .BS 3
|
|||
|
ASM65816.EXPR .BS 10
|
|||
|
ASM65816.EXP1 .BS 10
|
|||
|
ASM65816.ASM.ERROR .BS 3
|
|||
|
ASM65816.EMIT .BS 10
|
|||
|
*--------------------------------
|
|||
|
.OR $F0 F0-FF is ASM private ZeroPage
|
|||
|
LEVEL.MASK .BS 1
|
|||
|
OPBASE .BS 1
|
|||
|
MODE.BYTE .BS 1
|
|||
|
FORCE.ADDR.SIZE .BS 1
|
|||
|
.ED
|
|||
|
*--------------------------------
|
|||
|
ERR.BAD.OPCODE .EQ 0
|
|||
|
ERR.BAD.ADDRESS .EQ 1
|
|||
|
ERR.RANGE .EQ 2
|
|||
|
ERR.UNDEFINED .EQ 3
|
|||
|
*--------------------------------
|
|||
|
JMP ASM65816.ASM.INIT
|
|||
|
JMP ASM65816.ASM.LINE
|
|||
|
JMP ASM65816.EMIT.VALUE
|
|||
|
JMP DIR.OP
|
|||
|
*--------------------------------
|
|||
|
.AS -/FOR THE 6502, 65C02, 65R02, 65816/
|
|||
|
.HS 00
|
|||
|
*--------------------------------
|
|||
|
ASM65816.ASM.INIT
|
|||
|
LDA #0 MASK FOR 6502
|
|||
|
STA LEVEL.MASK
|
|||
|
LDA #15 MARGIN FOR 6502
|
|||
|
STA EMIT.MARGIN
|
|||
|
RTS
|
|||
|
*--------------------------------
|
|||
|
ASM65816.ASM.LINE
|
|||
|
LDA SEARCH.KEY 1ST LETTER
|
|||
|
CMP #'A'
|
|||
|
BCC .5 ...NOT A LETTER, SO BADOP
|
|||
|
CMP #'Z'+1
|
|||
|
BCS .5 ...NOT A LETTER, SO BADOP
|
|||
|
AND #$1F MAKE 01...1A
|
|||
|
TAX
|
|||
|
LDA FIRST.LETTER.TABLE-1,X
|
|||
|
BNE .8 ...UNUSED LETTER
|
|||
|
.5 JMP BADOPERR
|
|||
|
*---BUILD OPTBL.PNTR INTO TABLE--------
|
|||
|
.8 ADC #OPCODE.TABLE CARRY CLEAR ALREADY
|
|||
|
STA OPTBL.PNTR
|
|||
|
LDY /OPCODE.TABLE
|
|||
|
BCC .1
|
|||
|
INY
|
|||
|
.1 CPX #'R'-$40 WHICH HALF OF TABLE?
|
|||
|
BCC .2 ...FIRST HALF
|
|||
|
INY ...SECOND HALF
|
|||
|
.2 CLC INITIAL SEARCH
|
|||
|
.3 JSR ASM65816.SEARCH.TABLE
|
|||
|
BCC .5 ...NOT FOUND
|
|||
|
*---FOUND IT!--------------------
|
|||
|
LDA (OPTBL.PNTR),Y
|
|||
|
STA OPBASE
|
|||
|
INY
|
|||
|
LDA (OPTBL.PNTR),Y
|
|||
|
AND #$E1 ISOLATE LEVEL BITS
|
|||
|
BEQ .7 ...PLAIN 6502 LEVEL
|
|||
|
AND LEVEL.MASK
|
|||
|
BNE .7 ...ALLOWS 'STP' FOR BOTH 65816 & SWEET-16
|
|||
|
SEC CONTINUE SEARCH
|
|||
|
BCS .3 ...ALWAYS
|
|||
|
*---BRANCH TO PROCESS OPCODE-----
|
|||
|
.7 LDA (OPTBL.PNTR),Y
|
|||
|
AND #$1E
|
|||
|
TAY
|
|||
|
LDA OP.MODE+1,Y
|
|||
|
PHA
|
|||
|
LDA OP.MODE,Y
|
|||
|
PHA
|
|||
|
RTS
|
|||
|
*--------------------------------
|
|||
|
.MA MODE
|
|||
|
O..]1 .EQ *-OP.MODE
|
|||
|
.DA OP.]1-1
|
|||
|
.EM
|
|||
|
*--------------------------------
|
|||
|
OP.MODE
|
|||
|
>MODE SNGL 0 -- SINGLE BYTE OPCODES
|
|||
|
>MODE COPS 2 -- LDA GROUP
|
|||
|
>MODE SHIFTS 4 -- ASL GROUP
|
|||
|
>MODE REL16 6 -- BRL & PER
|
|||
|
>MODE REL8 8 -- RELATIVE BRANCHES
|
|||
|
>MODE BITS A -- BIT GROUP
|
|||
|
>MODE MOVES C -- MVP & MVN
|
|||
|
>MODE JUMPS E -- JUMP GROUP
|
|||
|
>MODE ROCKB 10 -- ROCKWELL BIT OPS
|
|||
|
>MODE ROCKC 12 -- ROCKWELL BIT OPS
|
|||
|
>MODE XN 14 -- SWEET 16 REGISTER OPS
|
|||
|
>MODE POP 16 -- SWEET 16 POP & POPD
|
|||
|
>MODE SET 18 -- SWEET 16 SET
|
|||
|
>MODE CRS 1A -- COP, REP, SEP
|
|||
|
*--------------------------------
|
|||
|
OP.SNGL
|
|||
|
EMIT.OPBASE
|
|||
|
LDA OPBASE
|
|||
|
JMP ASM65816.EMIT
|
|||
|
*--------------------------------
|
|||
|
OP.CRS JSR ASM65816.GNNB
|
|||
|
CMP #'#'
|
|||
|
BNE ERBA.E2
|
|||
|
JSR ASM65816.EXP1
|
|||
|
JMP EMIT.OP.AND.EXP.BYTE
|
|||
|
ERBA.E2
|
|||
|
JMP ERBA.EMIT.TWO
|
|||
|
*--------------------------------
|
|||
|
OP.COPS
|
|||
|
JSR GENERAL.OPERAND
|
|||
|
JSR SEE.IF.MODE.LEGAL.AT.LEVEL
|
|||
|
LDA MODE.BYTE ALL INDIRECT MODES <<<12-16-85>>>
|
|||
|
AND #$04 REQUIRE ZP VALUE <<<12-16-85>>>
|
|||
|
BEQ .1 ...NOT INDIRECT <<<12-16-85>>>
|
|||
|
CPY #14
|
|||
|
BCC .4 ...MODES 0...13
|
|||
|
DEC ADDR.LENGTH SHORTEN >(ZP) AND >(ZP),Y
|
|||
|
.4 JSR ASM65816.TEST.EXP.VALUE.ZP
|
|||
|
BNE ERBA.E2 ...MUST BE DIRECT VALUE
|
|||
|
.1 LDA ADDR.MODE.BITS.CLASS.1,Y
|
|||
|
BPL .2 VALID MODE
|
|||
|
INC ADDR.LENGTH ...DIRECT,Y NOT VALID
|
|||
|
LDA ADDR.MODE.BITS.CLASS.1+1,Y
|
|||
|
.2 EOR OPBASE
|
|||
|
CMP #$89 STA IMMED?
|
|||
|
BEQ ERBA.E2 ...YES, NO SUCH ANIMAL
|
|||
|
* FALL INTO EMIT.OP.AND.VALUE ***
|
|||
|
*--------------------------------
|
|||
|
EMIT.OP.AND.VALUE
|
|||
|
JSR ASM65816.EMIT
|
|||
|
ASM65816.EMIT.VALUE
|
|||
|
JSR EMIT.EXP.BYTE
|
|||
|
DEC ADDR.LENGTH
|
|||
|
BEQ .2
|
|||
|
LDA EXP.VALUE+1
|
|||
|
JSR ASM65816.EMIT
|
|||
|
DEC ADDR.LENGTH
|
|||
|
BEQ .2
|
|||
|
LDA EXP.VALUE+2
|
|||
|
JSR ASM65816.EMIT
|
|||
|
DEC ADDR.LENGTH
|
|||
|
BEQ .2
|
|||
|
LDA EXP.VALUE+3
|
|||
|
JSR ASM65816.EMIT
|
|||
|
.2 RTS
|
|||
|
*--------------------------------
|
|||
|
OP.BITS
|
|||
|
JSR GENERAL.OPERAND
|
|||
|
JSR SEE.IF.MODE.LEGAL.AT.LEVEL
|
|||
|
CPY #7 ONLY MODES 0...6 LEGAL
|
|||
|
BCS .2 ...NOT VALID MODE
|
|||
|
LDX OPBASE
|
|||
|
BNE .0 ...NOT BIT OPCODE
|
|||
|
LDA LEVEL.MASK
|
|||
|
AND #$20
|
|||
|
BNE .0 ...AT LEAST 65C02
|
|||
|
LDA #$60 ONLY ZP AND ABS LEGAL
|
|||
|
BNE .7 ...ALWAYS
|
|||
|
.0 LDA CLASS.5.LEGAL.MODES,X
|
|||
|
.7 AND CLASS.5.MODE.MASKS,Y
|
|||
|
BNE .4 ...LEGAL
|
|||
|
LDA PASS
|
|||
|
BEQ .1 ...IN PASS 1
|
|||
|
JSR ASM65816.TEST.EXP.VALUE.ZP
|
|||
|
BNE .2 ...TOO BIG FOR ZP
|
|||
|
.1 DEY CHANGE ABS TO ZP MODE
|
|||
|
BMI .2 ...WASN'T ABS
|
|||
|
TYA
|
|||
|
LSR
|
|||
|
BCC .2 ...WASN'T ABS
|
|||
|
LDA CLASS.5.LEGAL.MODES,X
|
|||
|
AND CLASS.5.MODE.MASKS,Y
|
|||
|
BNE .3 ...LEGAL AFTERALL
|
|||
|
.2 JMP ERBA.EMIT.TWO INVALID ADDRESS MODE
|
|||
|
.3 DEC ADDR.LENGTH
|
|||
|
*---FORM OPCODE------------------
|
|||
|
.4 LDA ADDR.MODE.BITS.CLASS.5,Y
|
|||
|
EOR CLASS.5.OPS,X
|
|||
|
LDY #$89
|
|||
|
CMP #$20
|
|||
|
BEQ .5
|
|||
|
LDY #$9C
|
|||
|
CMP #$6C
|
|||
|
BEQ .5
|
|||
|
LDY #$9E
|
|||
|
CMP #$7C
|
|||
|
BNE .6
|
|||
|
.5 TYA
|
|||
|
.6 JMP EMIT.OP.AND.VALUE
|
|||
|
*--------------------------------
|
|||
|
OP.SHIFTS
|
|||
|
JSR ASM65816.GNC CHECK FOR ACCUMULATOR MODE
|
|||
|
BNE .2 NOT ACCUM MODE
|
|||
|
JSR ASM65816.GNC
|
|||
|
BNE .2 NOT ACCUM MODE
|
|||
|
*---ACCUMULATOR MODE-------------
|
|||
|
LDA OPBASE
|
|||
|
EOR #$08 MAKE ACCUM MODE OPCODE
|
|||
|
BPL .1 NOT INC OR DEC
|
|||
|
PHA
|
|||
|
LDA LEVEL.MASK
|
|||
|
AND #$20 ONLY IN 65C02 AND ABOVE
|
|||
|
BEQ .5
|
|||
|
PLA
|
|||
|
EOR #$F0 CHANGE EA-->1A, CA-->3A
|
|||
|
.1 JMP ASM65816.EMIT
|
|||
|
*---MODES WITH OPERAND FIELD-----
|
|||
|
.2 DEC CHAR.PNTR
|
|||
|
JSR GENERAL.OPERAND
|
|||
|
JSR SEE.IF.MODE.LEGAL.AT.LEVEL
|
|||
|
CPY #5 ONLY MODES 1...4 LEGAL
|
|||
|
BCS .5
|
|||
|
TYA
|
|||
|
BEQ .5 ...NO IMMEDIATE MODE ALLOWED
|
|||
|
LDA ADDR.MODE.BITS.CLASS.1,Y
|
|||
|
EOR OPBASE
|
|||
|
JMP EMIT.OP.AND.VALUE
|
|||
|
.5 JMP ERBA.EMIT.TWO INVALID ADDRESS MODE
|
|||
|
*--------------------------------
|
|||
|
OP.REL8
|
|||
|
.DO SWEET.16
|
|||
|
LDA OPBASE CHECK FOR 'BNM1' SWEET-16 OP
|
|||
|
CMP #$09
|
|||
|
BNE .1 ...NOT 'BNM1'
|
|||
|
JSR ASM65816.GNC CHECK FOR '1'
|
|||
|
CMP #'1'
|
|||
|
BNE BADOPERR ...NO, SO BAD OP
|
|||
|
.FIN
|
|||
|
.1 JSR ASM65816.EXPR
|
|||
|
LDA OPBASE
|
|||
|
OP.REL8.A
|
|||
|
JSR ASM65816.EMIT EMIT OPCODE
|
|||
|
LDA EXP.UNDEF
|
|||
|
BMI GOEMIT ...UNDEFINED
|
|||
|
LDY EXP.VALUE+1
|
|||
|
CLC COMPUTE RELATIVE OFFSET
|
|||
|
LDA EXP.VALUE
|
|||
|
SBC ORGN
|
|||
|
STA EXP.VALUE
|
|||
|
BPL .2
|
|||
|
INY
|
|||
|
.2 TYA
|
|||
|
SBC ORGN+1
|
|||
|
BNE ERR.RANGE.EMIT.ONE
|
|||
|
EMIT.EXP.BYTE
|
|||
|
LDA EXP.VALUE
|
|||
|
GOEMIT JMP ASM65816.EMIT
|
|||
|
*--------------------------------
|
|||
|
BADOPERR
|
|||
|
LDA #ERR.BAD.OPCODE
|
|||
|
JMP ASM65816.ASM.ERROR
|
|||
|
*--------------------------------
|
|||
|
* BRL & PER, 16-bit relative
|
|||
|
*--------------------------------
|
|||
|
OP.REL16
|
|||
|
JSR ASM65816.EXPR Get value of expression
|
|||
|
JSR EMIT.OPBASE Emit the opcode, bumping origin once
|
|||
|
LDA EXP.UNDEF If undefined, say so
|
|||
|
BMI .3 (If we didn't, might be RANGE ERR)
|
|||
|
CLC ADD 2 MORE TO ORIGIN
|
|||
|
LDY ORGN+2
|
|||
|
LDA ORGN
|
|||
|
ADC #2
|
|||
|
STA EXP.VALUE+3 (TEMP)
|
|||
|
LDA ORGN+1
|
|||
|
ADC #0
|
|||
|
BCC .2
|
|||
|
INY BANK BYTE
|
|||
|
.2 CPY EXP.VALUE+2 IN SAME BANK AS TARGET?
|
|||
|
BNE ERR.RANGE.EMIT.TWO ...NO, ERR RANGE
|
|||
|
STA EXP.VALUE+2 YES, SAVE IN ANOTHER TEMP
|
|||
|
LDA EXP.VALUE TARGET-ORGN+3
|
|||
|
SBC EXP.VALUE+3
|
|||
|
STA EXP.VALUE
|
|||
|
LDA EXP.VALUE+1
|
|||
|
SBC EXP.VALUE+2
|
|||
|
STA EXP.VALUE+1
|
|||
|
.3 LDA #2
|
|||
|
STA ADDR.LENGTH
|
|||
|
JMP ASM65816.EMIT.VALUE
|
|||
|
*--------------------------------
|
|||
|
ERR.RANGE.EMIT.TWO
|
|||
|
JSR ASM65816.EMIT.ZERO
|
|||
|
ERR.RANGE.EMIT.ONE
|
|||
|
JSR ASM65816.EMIT.ZERO
|
|||
|
ASM65816.RAER
|
|||
|
LDA #ERR.RANGE
|
|||
|
JMP ASM65816.ASM.ERROR
|
|||
|
*--------------------------------
|
|||
|
OP.MOVES
|
|||
|
JSR EMIT.OPBASE
|
|||
|
JSR ASM65816.EXPR GET SOURCE BANK
|
|||
|
LDA EXP.VALUE+2
|
|||
|
PHA
|
|||
|
JSR ASM65816.GNC
|
|||
|
CMP #',' MUST HAVE COMMA HERE
|
|||
|
BNE .1 ...ILLEGAL
|
|||
|
JSR ASM65816.EXP1 GET DESTINATION BANK
|
|||
|
LDA EXP.VALUE+2
|
|||
|
JSR ASM65816.EMIT
|
|||
|
PLA
|
|||
|
JMP ASM65816.EMIT
|
|||
|
.1 JMP ERBA.EMIT.TWO
|
|||
|
*--------------------------------
|
|||
|
OP.JUMPS
|
|||
|
JSR GENERAL.OPERAND
|
|||
|
LDA LEGAL.JUMP.MODES,Y
|
|||
|
BMI .4 ...ILLEGAL
|
|||
|
ORA OPBASE
|
|||
|
TAY
|
|||
|
LDA LEVEL.MASK
|
|||
|
BMI .1 65816, ALLOW ALL MODES
|
|||
|
CPY #5 DISALLOW JML, JSL, AND PEA
|
|||
|
BCS .4 ...ONE OF THOSE
|
|||
|
CPY #1 DISALLOW JMP LONG
|
|||
|
BEQ .4
|
|||
|
AND #$20 SEE IF 65C02
|
|||
|
BNE .1 ...YES
|
|||
|
CPY #3 ...NO, DISALLOW JMP (ABS,X)
|
|||
|
BEQ .4 ...THAT'S WHAT IT IS...
|
|||
|
.1 LDA JUMP.OPCODES,Y
|
|||
|
BEQ .4 ...ILLEGAL
|
|||
|
LDY #2 ASSUME TWO BYTE ADDRESS
|
|||
|
CMP #$5C CHECK FOR "JMP LONG"
|
|||
|
BEQ .2 ...YES, 3 BYTES OF ADDRESS
|
|||
|
CMP #$22 CHECK FOR "JSL"
|
|||
|
BNE .3 ...NO, ONLY 2 BYTES OF ADDRESS
|
|||
|
.2 INY 3 BYTE ADDRESS
|
|||
|
.3 STY ADDR.LENGTH
|
|||
|
JMP EMIT.OP.AND.VALUE
|
|||
|
.4 JMP ERBA.EMIT.TWO
|
|||
|
*--------------------------------
|
|||
|
ASM65816.TEST.EXP.VALUE.ZP
|
|||
|
LDA EXP.VALUE+1
|
|||
|
ORA EXP.VALUE+2
|
|||
|
ORA EXP.VALUE+3
|
|||
|
RTS
|
|||
|
*--------------------------------
|
|||
|
LONG.INDIRECT
|
|||
|
JSR ASM65816.EXP1
|
|||
|
JSR ASM65816.GNC
|
|||
|
CMP #']'
|
|||
|
BNE ERBA.EMIT.TWO
|
|||
|
JSR ASM65816.GNC
|
|||
|
BEQ .1 ...[EXP]
|
|||
|
CMP #','
|
|||
|
BNE ERBA.EMIT.TWO
|
|||
|
JSR ASM65816.GNC.UC
|
|||
|
CMP #'Y'
|
|||
|
BNE ERBA.EMIT.TWO
|
|||
|
LDA #$47 ...[EXP],Y
|
|||
|
.HS 2C
|
|||
|
.1 LDA #$44 ...[EXP],Y
|
|||
|
STA MODE.BYTE
|
|||
|
LDA #2
|
|||
|
STA ADDR.LENGTH
|
|||
|
JMP CHECK.IF.SUFFIX.LEGAL
|
|||
|
*--------------------------------
|
|||
|
IMMEDIATE
|
|||
|
JSR ASM65816.GNC.UC
|
|||
|
CMP DLIM 16-BIT IMMEDIATE?
|
|||
|
BNE .1 ...NO, BACKUP
|
|||
|
LDA LEVEL.MASK 16-BIT IMMEDIATE OKAY?
|
|||
|
BPL ERBA.EMIT.TWO ...NOT AT 65816 LEVEL
|
|||
|
INC ADDR.LENGTH ...YES, INCREASE LENGTH
|
|||
|
BNE .2 ...ALWAYS
|
|||
|
.1 DEC CHAR.PNTR
|
|||
|
.2 JSR ASM65816.EXP1
|
|||
|
JSR ASM65816.GNC
|
|||
|
BNE ERBA.EMIT.TWO ILLEGAL
|
|||
|
LDA DLIM
|
|||
|
CMP #'/' #=23, /=2F, ^=5E
|
|||
|
BCC .4 ...#
|
|||
|
BEQ .3 .../
|
|||
|
JSR ASM65816.EXP.OVER.256 ...^
|
|||
|
.3 JSR ASM65816.EXP.OVER.256
|
|||
|
.4 LDY #0 SIGNAL IMMEDIATE MODE
|
|||
|
STY MODE.BYTE COPS NEEDS THIS <<<12-16-85>>>
|
|||
|
RTS
|
|||
|
*--------------------------------
|
|||
|
ERBA.EMIT.THREE
|
|||
|
JSR ASM65816.EMIT.ZERO
|
|||
|
ERBA.EMIT.TWO
|
|||
|
JSR ASM65816.EMIT.ZERO
|
|||
|
JSR ASM65816.EMIT.ZERO
|
|||
|
ASM65816.ERBA
|
|||
|
LDA #ERR.BAD.ADDRESS
|
|||
|
JMP ASM65816.ASM.ERROR
|
|||
|
ASM65816.EMIT.ZERO LDA #0
|
|||
|
JMP ASM65816.EMIT
|
|||
|
*--------------------------------
|
|||
|
* RETURN:
|
|||
|
* # BYTES IN ADDRESS IN ADDR.LENGTH
|
|||
|
* (Y) = INDEX TO ADDR.MODE.BITS
|
|||
|
*--------------------------------
|
|||
|
GENERAL.OPERAND
|
|||
|
JSR ASM65816.GNNB GET NEXT NON-BLANK
|
|||
|
BCS ERBA.EMIT.TWO ...NO OPERAND
|
|||
|
*---PARSE PREFIX-----------------
|
|||
|
LDY #1
|
|||
|
STY ADDR.LENGTH
|
|||
|
STA DLIM
|
|||
|
CMP #'('
|
|||
|
BEQ .3 ...indirect, must be ZP
|
|||
|
CMP #'['
|
|||
|
BEQ LONG.INDIRECT
|
|||
|
CMP #'#'
|
|||
|
BEQ IMMEDIATE
|
|||
|
CMP #'/'
|
|||
|
BEQ IMMEDIATE
|
|||
|
CMP #'^'
|
|||
|
BEQ IMMEDIATE
|
|||
|
CMP #'<'
|
|||
|
BEQ .3 MAKE FORCE SIZE = 1
|
|||
|
DEY Y=0
|
|||
|
CMP #'>'
|
|||
|
BNE .2 ...SIZE NOT FORCED
|
|||
|
JSR ASM65816.GNC
|
|||
|
LDY #3 Y=3
|
|||
|
CMP DLIM IS IT ">>"?
|
|||
|
BEQ .3 ...YES
|
|||
|
DEY Y=2
|
|||
|
STA DLIM CHANGE DLIM TO NEW VALUE
|
|||
|
CMP #'(' IS IT (?
|
|||
|
BEQ .3 ...YES, >(
|
|||
|
.2 DEC CHAR.PNTR ...NO, SO BACKUP
|
|||
|
.3 STY FORCE.ADDR.SIZE
|
|||
|
*---PARSE THE EXPRESSION---------
|
|||
|
JSR ASM65816.EXP1
|
|||
|
*---FIGURE # OF BYTES------------
|
|||
|
LDX FORCE.ADDR.SIZE
|
|||
|
BNE .6 ...FORCED WITH <, >, OR >>
|
|||
|
LDX #2 ASSUME 2-BYTE ADDRESS
|
|||
|
LDA EXP.UNDEF
|
|||
|
BMI .6
|
|||
|
LDA PASS IGNORE FWD REF FLAG IN PASS 1
|
|||
|
BEQ .4 ...PASS 1
|
|||
|
LDA EXP.FWDREF ...PASS 2, DEFINED
|
|||
|
BNE .4 ...BUT NOT FWD REF
|
|||
|
LDA EXP.VALUE+3 ...FWD REF MUST BE ONLY
|
|||
|
ORA EXP.VALUE+2 16 BITS
|
|||
|
BEQ .6 ...IT FITS!
|
|||
|
BNE ERBA.1 ...ALWAYS, ERBA
|
|||
|
.4 LDA EXP.VALUE+3 DO NOT ALLOW 32-BITS
|
|||
|
BNE ERBA.1 ...BAD ADDR
|
|||
|
LDA EXP.VALUE+2
|
|||
|
BNE .5 ...3-BYTE ADDRESS
|
|||
|
DEX X=1
|
|||
|
LDA EXP.VALUE+1
|
|||
|
BEQ .6 ...ZP
|
|||
|
.5 INX
|
|||
|
.6 STX ADDR.LENGTH
|
|||
|
*---PARSE SUFFIX-----------------
|
|||
|
DEX MAKE 0, 1, OR 2
|
|||
|
STX MODE.BYTE
|
|||
|
LDX #6
|
|||
|
.7 JSR ASM65816.GNC.UC
|
|||
|
.8 CMP MODE.CHARS,X
|
|||
|
BEQ .9
|
|||
|
CLC
|
|||
|
ROL MODE.BYTE
|
|||
|
DEX
|
|||
|
BPL .8
|
|||
|
BMI ERBA.1
|
|||
|
.9 CMP #' ' BLANK?
|
|||
|
BEQ CHECK.IF.SUFFIX.LEGAL ...YES, END OF OPERAND
|
|||
|
CMP #')' RIGHT PAREN?
|
|||
|
BNE .10 ...NO
|
|||
|
LDA DLIM WAS THERE A LEFT PAREN?
|
|||
|
CMP #'('
|
|||
|
BNE ERBA.1 ...NO
|
|||
|
.10 SEC
|
|||
|
ROL MODE.BYTE
|
|||
|
DEX
|
|||
|
BPL .7
|
|||
|
ERBA.1 JMP ERBA.EMIT.TWO ILLEGAL
|
|||
|
*--------------------------------
|
|||
|
CHECK.IF.SUFFIX.LEGAL
|
|||
|
LDY #0 SEARCH FORWARD FOR VARIOUS REASONS
|
|||
|
LDA MODE.BYTE
|
|||
|
.13 INY
|
|||
|
CPY #MODE.TABLE.SIZE+1
|
|||
|
BCS ERBA.1 ...END OF TABLE
|
|||
|
CMP MODE.TABLE-1,Y
|
|||
|
BNE .13 ...KEEP LOOKING
|
|||
|
RTS
|
|||
|
*--------------------------------
|
|||
|
SEE.IF.MODE.LEGAL.AT.LEVEL
|
|||
|
LDA LEVEL.MASK
|
|||
|
BMI .15 ...65816 LEVEL, ALL LEGAL
|
|||
|
CPY #9
|
|||
|
BCC .15 ...6502 MODES
|
|||
|
BEQ .14 ...65C02 MODE
|
|||
|
CPY #16
|
|||
|
BNE ERBA.1
|
|||
|
.14 AND #$20 AT C02 LEVEL?
|
|||
|
BEQ ERBA.1 ...NO
|
|||
|
.15 RTS
|
|||
|
*--------------------------------
|
|||
|
ASM65816.EXP.OVER.256
|
|||
|
LDA EXP.VALUE+1
|
|||
|
STA EXP.VALUE
|
|||
|
LDA EXP.VALUE+2
|
|||
|
STA EXP.VALUE+1
|
|||
|
LDA EXP.VALUE+3
|
|||
|
STA EXP.VALUE+2
|
|||
|
LDA #0
|
|||
|
STA EXP.VALUE+3
|
|||
|
RTS
|
|||
|
.DO ROCKWELL
|
|||
|
*--------------------------------
|
|||
|
* ROCKWELL 65C02 EXCLUSIVES
|
|||
|
*
|
|||
|
* RMB bit#,zp
|
|||
|
* SMB bit#,zp
|
|||
|
* BBR bit#,zp,reladdr
|
|||
|
* BBS bit#,zp,reladdr
|
|||
|
*--------------------------------
|
|||
|
OP.ROCKB
|
|||
|
JSR OP.ROCKWELL
|
|||
|
JSR ASM65816.GNC REQUIRE A COMMA
|
|||
|
CMP #','
|
|||
|
BNE .1 ...NO COMMA
|
|||
|
LDA EXP.VALUE
|
|||
|
PHA SAVE ZP VALUE
|
|||
|
JSR ASM65816.EXP1 GET BRANCH EXPRESSION
|
|||
|
JSR EMIT.OPBASE <<<12-16-85>>>
|
|||
|
PLA
|
|||
|
JMP OP.REL8.A
|
|||
|
.1 JMP ERBA.EMIT.THREE
|
|||
|
*--------------------------------
|
|||
|
OP.ROCKC
|
|||
|
JSR OP.ROCKWELL
|
|||
|
.FIN
|
|||
|
EMIT.OP.AND.EXP.BYTE
|
|||
|
JSR EMIT.OPBASE <<<12-16-85>>>
|
|||
|
JMP EMIT.EXP.BYTE <<<12-16-85>>>
|
|||
|
*--------------------------------
|
|||
|
.DO ROCKWELL
|
|||
|
OP.ROCKWELL
|
|||
|
JSR ASM65816.EXPR GET BIT #
|
|||
|
JSR ASM65816.TEST.EXP.VALUE.ZP
|
|||
|
BNE .1 ...MUST BE SMALL NUMBER!
|
|||
|
LDA EXP.VALUE
|
|||
|
CMP #8 MUST BE 0...7
|
|||
|
BCS .1 ...TOO LARGE
|
|||
|
ASL
|
|||
|
ASL
|
|||
|
ASL
|
|||
|
ASL
|
|||
|
ORA OPBASE MERGE INTO OPCODE
|
|||
|
STA OPBASE
|
|||
|
JSR ASM65816.GNC NEED A COMMA NOW
|
|||
|
CMP #','
|
|||
|
BNE .1
|
|||
|
JSR ASM65816.EXP1 GET ZP VALUE
|
|||
|
JSR ASM65816.TEST.EXP.VALUE.ZP
|
|||
|
BNE .1 MUST BE ZERO PAGE
|
|||
|
RTS
|
|||
|
.1 JMP ERBA.EMIT.TWO
|
|||
|
*--------------------------------
|
|||
|
.ELSE
|
|||
|
OP.ROCKB
|
|||
|
OP.ROCKC
|
|||
|
JMP BADOPERR
|
|||
|
.FIN
|
|||
|
|
|||
|
.DO SWEET.16
|
|||
|
*--------------------------------
|
|||
|
* SWEET-16 OPCODES
|
|||
|
*--------------------------------
|
|||
|
OP.POP
|
|||
|
JSR ASM65816.GNC.UC SEE WHICH: POP OR POPD
|
|||
|
BEQ OP.XN ...POP
|
|||
|
CMP #'D'
|
|||
|
BEQ .1
|
|||
|
JMP BADOPERR
|
|||
|
.1 LDA #$A2 ...POP
|
|||
|
STA OPBASE
|
|||
|
*--------------------------------
|
|||
|
OP.XN
|
|||
|
JSR ASM65816.GNNB
|
|||
|
BCS SWEET.ERBA
|
|||
|
CMP #'@'
|
|||
|
BNE .1 ...NOT '@N'
|
|||
|
LDA OPBASE ...'@N', SEE IF LEGAL
|
|||
|
AND #2
|
|||
|
BEQ SWEET.ERBA ...NOT LEGAL WITH THIS OP
|
|||
|
LDA OPBASE ...LEGAL, ADD $20
|
|||
|
ADC #$1F .CS., SO 1F IS 20
|
|||
|
BNE .2 ...ALWAYS
|
|||
|
.1 DEC CHAR.PNTR Backup character pointer
|
|||
|
LDA OPBASE
|
|||
|
LSR
|
|||
|
BCC SWEET.ERBA 'N' NOT LEGAL FOR THIS OP
|
|||
|
LDA OPBASE
|
|||
|
.2 AND #$F0 CLEAR AWAY LEGALITY FLAGS
|
|||
|
STA OPBASE
|
|||
|
JSR ASM65816.EXP1 GET REGISTER NUMBER
|
|||
|
JSR ASM65816.TEST.EXP.VALUE.ZP
|
|||
|
BNE SWEET.RAER
|
|||
|
LDA EXP.VALUE
|
|||
|
CMP #$10
|
|||
|
BCS SWEET.RAER
|
|||
|
ORA OPBASE
|
|||
|
JMP ASM65816.EMIT
|
|||
|
*--------------------------------
|
|||
|
SWEET.ERBA JMP ASM65816.ERBA
|
|||
|
SWEET.RAER JMP ASM65816.RAER
|
|||
|
*--------------------------------
|
|||
|
OP.SET
|
|||
|
JSR OP.XN
|
|||
|
JSR ASM65816.GNC
|
|||
|
CMP #','
|
|||
|
BNE SWEET.ERBA
|
|||
|
JSR ASM65816.EXP1
|
|||
|
LDA #2
|
|||
|
STA ADDR.LENGTH
|
|||
|
JMP ASM65816.EMIT.VALUE
|
|||
|
*--------------------------------
|
|||
|
.ELSE
|
|||
|
OP.POP
|
|||
|
OP.XN
|
|||
|
OP.SET
|
|||
|
JMP BADOPERR
|
|||
|
.FIN
|
|||
|
*--------------------------------
|
|||
|
LEGAL.JUMP.MODES
|
|||
|
.HS FF.00.00.FF.FF.FF
|
|||
|
.HS FF.FF.03.02.FF.FF
|
|||
|
.HS 01.FF.02.FF.03
|
|||
|
*--------------------------------
|
|||
|
JUMP.OPCODES
|
|||
|
.HS 4C.5C.6C.7C JMP
|
|||
|
.HS 20.22.00.FC JSR
|
|||
|
.HS 00.00.DC.00 JML
|
|||
|
.HS 22.22.00.00 JSL
|
|||
|
.HS F4.00.00.00 PEA
|
|||
|
*--------------------------------
|
|||
|
MODE.CHARS
|
|||
|
.AS / Y,)SX,/
|
|||
|
*--------------------------------
|
|||
|
MODE.TABLE
|
|||
|
.HS 00 1 -- DIRECT
|
|||
|
.HS 40 2 -- ABSOLUTE
|
|||
|
.HS 30 3 -- DIRECT,X
|
|||
|
.HS 70 4 -- ABSOLUTE,X
|
|||
|
.HS 21 5 -- DIRECT,Y
|
|||
|
.HS 61 6 -- ABSOLUTE,Y
|
|||
|
.HS 07 7 -- (DIRECT),Y
|
|||
|
.HS 34 8 -- (DIRECT,X)
|
|||
|
*---IN 65C02, 802, 816-----------
|
|||
|
.HS 04 9 -- (DIRECT)
|
|||
|
*---IN 65802, 816----------------
|
|||
|
.HS 28 A -- ...,S
|
|||
|
.HS 2F B -- (...,S),Y
|
|||
|
*---ONLY IN 65816----------------
|
|||
|
.HS 80 C -- LONG
|
|||
|
.HS B0 D -- LONG,X
|
|||
|
.HS 44 E -- >(DIRECT)
|
|||
|
.HS 47 F -- >(DIRECT),Y
|
|||
|
*---SPECIAL FOR JMP,JSR (A,X)----
|
|||
|
.HS 74 10 -- (ABSOLUTE,X)
|
|||
|
MODE.TABLE.SIZE .EQ *-MODE.TABLE
|
|||
|
*--------------------------------
|
|||
|
ADDR.MODE.BITS.CLASS.1
|
|||
|
.HS 08 0 -- IMMEDIATE
|
|||
|
.HS 04 1 -- DIRECT
|
|||
|
.HS 0C 2 -- ABSOLUTE
|
|||
|
.HS 14 3 -- DIRECT,X
|
|||
|
.HS 1C 4 -- ABSOLUTE,X
|
|||
|
.HS FF 5 -- DIRECT,Y <<<NOT LEGAL>>>
|
|||
|
.HS 18 6 -- ABSOLUTE,Y
|
|||
|
.HS 10 7 -- (DIRECT),Y
|
|||
|
.HS 00 8 -- (DIRECT,X)
|
|||
|
*---IN 65C02, 802, 816-----------
|
|||
|
.HS 13 9 -- (DIRECT)
|
|||
|
*---IN 65802, 816----------------
|
|||
|
.HS 02 A -- ...,S
|
|||
|
.HS 12 B -- (...,S),Y
|
|||
|
*---ONLY IN 65816----------------
|
|||
|
.HS 0E C -- LONG
|
|||
|
.HS 1E D -- LONG,X
|
|||
|
.HS 06 E -- >(DIRECT)
|
|||
|
.HS 16 F -- >(DIRECT),Y
|
|||
|
*--------------------------------
|
|||
|
ADDR.MODE.BITS.CLASS.5
|
|||
|
.HS 00 0 -- IMMEDIATE
|
|||
|
.HS 04 1 -- DIRECT
|
|||
|
.HS 0C 2 -- ABSOLUTE
|
|||
|
.HS 14 3 -- DIRECT,X
|
|||
|
.HS 1C 4 -- ABSOLUTE,X
|
|||
|
.HS 14 5 -- DIRECT,Y
|
|||
|
.HS 1C 6 -- ABSOLUTE,Y
|
|||
|
*--------------------------------
|
|||
|
CLASS.5.MODE.MASKS
|
|||
|
.HS 80.40.20.10.08.04.02
|
|||
|
*--------------------------------
|
|||
|
FIRST.LETTER.TABLE
|
|||
|
.DA #LTR.A-OPCODE.TABLE
|
|||
|
.DA #LTR.B-OPCODE.TABLE
|
|||
|
.DA #LTR.C-OPCODE.TABLE
|
|||
|
.DA #LTR.D-OPCODE.TABLE
|
|||
|
.DA #LTR.E-OPCODE.TABLE
|
|||
|
.DA #LTR.F-OPCODE.TABLE
|
|||
|
.DA #LTR.G-OPCODE.TABLE
|
|||
|
.DA #LTR.H-OPCODE.TABLE
|
|||
|
.DA #LTR.I-OPCODE.TABLE
|
|||
|
.DA #LTR.J-OPCODE.TABLE
|
|||
|
.DA #LTR.K-OPCODE.TABLE
|
|||
|
.DA #LTR.L-OPCODE.TABLE
|
|||
|
.DA #LTR.M-OPCODE.TABLE
|
|||
|
.DA #LTR.N-OPCODE.TABLE
|
|||
|
.DA #LTR.O-OPCODE.TABLE
|
|||
|
.DA #LTR.P-OPCODE.TABLE
|
|||
|
.DA #LTR.Q-OPCODE.TABLE
|
|||
|
.DA #LTR.R-OPCODE.TABLE
|
|||
|
.DA #LTR.S-OPCODE.TABLE
|
|||
|
.DA #LTR.T-OPCODE.TABLE
|
|||
|
.DA #LTR.U-OPCODE.TABLE
|
|||
|
.DA #LTR.V-OPCODE.TABLE
|
|||
|
.DA #LTR.W-OPCODE.TABLE
|
|||
|
.DA #LTR.X-OPCODE.TABLE
|
|||
|
.DA #LTR.Y-OPCODE.TABLE
|
|||
|
.DA #LTR.Z-OPCODE.TABLE
|
|||
|
*--------------------------------
|
|||
|
* TWO KINDS OF ENTRIES, DISTINGUISHED BY FIRST BIT:
|
|||
|
* 8-BIT ENTRIES: FIRST BIT = 0
|
|||
|
* 24-BIT ENTRIES: FIRST BIT = 1
|
|||
|
*
|
|||
|
* FIRST ENTRY AT EACH LETTER IS AN 8-BIT ENTRY.
|
|||
|
* EACH 8-BIT ENTRY IS FOLLOWED BY ONE OR MORE
|
|||
|
* 24-BIT ENTRIES.
|
|||
|
* THE SUB-LIST OF 24-BIT ENTRIES IS TERMINATED
|
|||
|
* BY THE NEXT 8-BIT ENTRY.
|
|||
|
* THE LIST OF 8-BIT ENTRIES IS TERMINATED BY
|
|||
|
* AN 8-BIT ENTRY WITH BIT 6 = 1.
|
|||
|
*
|
|||
|
* THE VALUE OF BITS 5-0 IN AN 8-BIT ENTRY
|
|||
|
* IS THE DIMINISHED ASCII CODE FOR THE
|
|||
|
* SECOND LETTER OF AN OPCODE.
|
|||
|
* THE VALUE OF BITS 5-0 OF A 24-BIT ENTRY
|
|||
|
* IS THE DIMINISHED ASCII CODE FOR THE
|
|||
|
* THIRD LETTER OF AN OPCODE.
|
|||
|
* A...Z = $81...9A
|
|||
|
* BLANK = $E0
|
|||
|
* '1' = $F1
|
|||
|
* THE VALUE OF THE SECOND BYTE OF A 24-BIT
|
|||
|
* ENTRY IS AN OPCODE BASE.
|
|||
|
* THE THIRD BYTE OF A 24-BIT ENTRY HAS TWO PARTS:
|
|||
|
* BITS 4-1 ARE AN INDEX TO THE OP.MODE
|
|||
|
* JUMP TABLE IN ASM.65816
|
|||
|
* BITS 7-5 AND 0 ARE LEVEL MASK BITS.
|
|||
|
* 000XXXX0 = 6502 OPCODE
|
|||
|
* 000XXXX1 = SWEET-16
|
|||
|
* 001XXXX0 = 65C02
|
|||
|
* 010XXXX0 = ROCKWELL SPECIALS
|
|||
|
* 100XXXX0 = 65816
|
|||
|
*
|
|||
|
* LEVEL.MASK = $00 FOR 6502
|
|||
|
* = $20 FOR 65C02
|
|||
|
* = $60 FOR ROCKWELL C02
|
|||
|
* = $A0 FOR 65816
|
|||
|
*--------------------------------
|
|||
|
OP..1 .SE 0
|
|||
|
OP..2 .SE 0
|
|||
|
.MA OP
|
|||
|
.DO "]1"=OP..1=0
|
|||
|
LTR.]1 .DA #"]2"-$80 bits 76 = 01
|
|||
|
OP..1 .SE "]1"
|
|||
|
OP..2 .SE "]2"
|
|||
|
.ELSE
|
|||
|
.DO "]2"=OP..2=0
|
|||
|
.DA #"]2"-$C0 bits 76 = 00
|
|||
|
OP..2 .SE "]2"
|
|||
|
.FIN
|
|||
|
.FIN
|
|||
|
.DA #"]3"^$40,#$]4,#O..]5!O..]6 bits 76 = 10 or 11
|
|||
|
.EM
|
|||
|
*--------------------------------
|
|||
|
O..65816 .EQ $80
|
|||
|
O..65R02 .EQ $40
|
|||
|
O..65C02 .EQ $20
|
|||
|
O..SWEET .EQ $01
|
|||
|
O.. .EQ $00
|
|||
|
*--------------------------------
|
|||
|
OPCODE.TABLE
|
|||
|
LTR.F
|
|||
|
LTR.G
|
|||
|
LTR.H
|
|||
|
LTR.K
|
|||
|
LTR.Q
|
|||
|
LTR.U
|
|||
|
LTR.V
|
|||
|
LTR.Y
|
|||
|
LTR.Z .HS 00
|
|||
|
*--------------------------------
|
|||
|
>OP A,D,C,61,COPS
|
|||
|
>OP A,D,D,A1,XN,SWEET
|
|||
|
>OP A,N,D,21,COPS
|
|||
|
>OP A,S,L,02,SHIFTS
|
|||
|
>OP B,C,C,90,REL8
|
|||
|
>OP B,C,S,B0,REL8
|
|||
|
>OP B,C," ",03,REL8,SWEET
|
|||
|
>OP B,E,Q,F0,REL8
|
|||
|
>OP B,G,E,B0,REL8
|
|||
|
>OP B,I,T,00,BITS
|
|||
|
>OP B,L,T,90,REL8
|
|||
|
>OP B,M,I,30,REL8
|
|||
|
>OP B,M," ",05,REL8,SWEET
|
|||
|
>OP B,M,1,08,REL8,SWEET
|
|||
|
>OP B,N,E,D0,REL8
|
|||
|
>OP B,N,C,02,REL8,SWEET
|
|||
|
>OP B,N,M,09,REL8,SWEET (BNM1)
|
|||
|
>OP B,N,Z,07,REL8,SWEET
|
|||
|
>OP B,P,L,10,REL8
|
|||
|
>OP B,P," ",04,REL8,SWEET
|
|||
|
>OP B,R,A,80,REL8,65C02
|
|||
|
>OP B,R,K,00,SNGL
|
|||
|
>OP B,R,L,82,REL16,65816
|
|||
|
>OP B,R," ",01,REL8,SWEET
|
|||
|
>OP B,V,C,50,REL8
|
|||
|
>OP B,V,S,70,REL8
|
|||
|
>OP B,B,R,0F,ROCKB,65R02
|
|||
|
>OP B,B,S,8F,ROCKB,65R02
|
|||
|
>OP B,K," ",0A,SNGL,SWEET
|
|||
|
>OP B,S," ",0C,REL8,SWEET
|
|||
|
>OP B,Z," ",06,REL8,SWEET
|
|||
|
>OP C,L,C,18,SNGL
|
|||
|
>OP C,L,D,D8,SNGL
|
|||
|
>OP C,L,I,58,SNGL
|
|||
|
>OP C,L,V,B8,SNGL
|
|||
|
>OP C,M,P,C1,COPS
|
|||
|
>OP C,O,P,02,CRS,65816
|
|||
|
>OP C,P,X,04,BITS
|
|||
|
>OP C,P,Y,03,BITS
|
|||
|
>OP C,P,R,D1,XN,SWEET
|
|||
|
>OP D,E,C,C2,SHIFTS
|
|||
|
>OP D,E,X,CA,SNGL
|
|||
|
>OP D,E,Y,88,SNGL
|
|||
|
>OP D,C,R,F1,XN,SWEET
|
|||
|
>OP E,O,R,41,COPS
|
|||
|
>OP I,N,C,E2,SHIFTS
|
|||
|
>OP I,N,X,E8,SNGL
|
|||
|
>OP I,N,Y,C8,SNGL
|
|||
|
>OP I,N,R,E1,XN,SWEET
|
|||
|
>OP J,M,L,08,JUMPS,65816
|
|||
|
>OP J,M,P,00,JUMPS
|
|||
|
>OP J,S,L,0C,JUMPS,65816
|
|||
|
>OP J,S,R,04,JUMPS
|
|||
|
>OP L,D,A,A1,COPS
|
|||
|
>OP L,D,X,02,BITS
|
|||
|
>OP L,D,Y,01,BITS
|
|||
|
>OP L,D," ",23,XN,SWEET
|
|||
|
>OP L,D,D,42,XN,SWEET
|
|||
|
>OP L,S,R,42,SHIFTS
|
|||
|
>OP M,V,N,54,MOVES,65816
|
|||
|
>OP M,V,P,44,MOVES,65816
|
|||
|
>OP N,O,P,EA,SNGL
|
|||
|
>OP O,R,A,01,COPS
|
|||
|
>OP P,E,A,10,JUMPS,65816
|
|||
|
>OP P,E,I,0A,BITS,65816
|
|||
|
>OP P,E,R,62,REL16,65816
|
|||
|
>OP P,H,A,48,SNGL
|
|||
|
>OP P,H,B,8B,SNGL,65816
|
|||
|
>OP P,H,D,0B,SNGL,65816
|
|||
|
>OP P,H,K,4B,SNGL,65816
|
|||
|
>OP P,H,P,08,SNGL
|
|||
|
>OP P,H,X,DA,SNGL,65C02
|
|||
|
>OP P,H,Y,5A,SNGL,65C02
|
|||
|
>OP P,L,A,68,SNGL
|
|||
|
>OP P,L,B,AB,SNGL,65816
|
|||
|
>OP P,L,D,2B,SNGL,65816
|
|||
|
>OP P,L,P,28,SNGL
|
|||
|
>OP P,L,X,FA,SNGL,65C02
|
|||
|
>OP P,L,Y,7A,SNGL,65C02
|
|||
|
>OP P,O,P,62,POP,SWEET (POP,POPD)
|
|||
|
>OP R,E,P,C2,CRS,65816
|
|||
|
>OP R,O,L,22,SHIFTS
|
|||
|
>OP R,O,R,62,SHIFTS
|
|||
|
>OP R,T,I,40,SNGL
|
|||
|
>OP R,T,L,6B,SNGL,65816
|
|||
|
>OP R,T,S,60,SNGL
|
|||
|
>OP R,T,N,00,SNGL,SWEET
|
|||
|
>OP R,M,B,07,ROCKC,65R02
|
|||
|
>OP R,S," ",0B,SNGL,SWEET
|
|||
|
>OP S,B,C,E1,COPS
|
|||
|
>OP S,E,C,38,SNGL
|
|||
|
>OP S,E,D,F8,SNGL
|
|||
|
>OP S,E,I,78,SNGL
|
|||
|
>OP S,E,P,E2,CRS,65816
|
|||
|
>OP S,E,T,11,SET,SWEET
|
|||
|
>OP S,T,A,81,COPS
|
|||
|
>OP S,T,P,DB,SNGL,65816
|
|||
|
>OP S,T,P,72,XN,SWEET
|
|||
|
>OP S,T,X,06,BITS
|
|||
|
>OP S,T,Y,05,BITS
|
|||
|
>OP S,T,Z,07,BITS,65C02
|
|||
|
>OP S,T," ",33,XN,SWEET
|
|||
|
>OP S,T,D,52,XN,SWEET
|
|||
|
>OP S,U,B,B1,XN,SWEET
|
|||
|
>OP S,M,B,87,ROCKC,65R02
|
|||
|
>OP T,A,X,AA,SNGL
|
|||
|
>OP T,A,Y,A8,SNGL
|
|||
|
>OP T,C,D,5B,SNGL,65816
|
|||
|
>OP T,C,S,1B,SNGL,65816
|
|||
|
>OP T,D,C,7B,SNGL,65816
|
|||
|
>OP T,R,B,09,BITS,65C02
|
|||
|
>OP T,S,B,08,BITS,65C02
|
|||
|
>OP T,S,C,3B,SNGL,65816
|
|||
|
>OP T,S,X,BA,SNGL
|
|||
|
>OP T,X,A,8A,SNGL
|
|||
|
>OP T,X,S,9A,SNGL
|
|||
|
>OP T,X,Y,9B,SNGL,65816
|
|||
|
>OP T,Y,A,98,SNGL
|
|||
|
>OP T,Y,X,BB,SNGL,65816
|
|||
|
>OP W,A,I,CB,SNGL,65816
|
|||
|
>OP W,D,M,42,SNGL,65816
|
|||
|
>OP X,B,A,EB,SNGL,65816
|
|||
|
>OP X,C,E,FB,SNGL,65816
|
|||
|
.HS 40 <<<TERMINATOR>>>
|
|||
|
*--------------------------------
|
|||
|
CLASS.5.OPS
|
|||
|
* BIT LDY LDX CPY CPX STY STX STZ
|
|||
|
.HS 20..A0..A2..C0..E0..80..82..60
|
|||
|
*
|
|||
|
* TSB TRB PEI
|
|||
|
.HS 00..10..D0
|
|||
|
*
|
|||
|
CLASS.5.LEGAL.MODES
|
|||
|
.HS F8..F8..E6..E0..E0..70..64..78
|
|||
|
.HS 60..60..40
|
|||
|
*
|
|||
|
* 80 -- IMMEDIATE
|
|||
|
* 40 -- DIRECT
|
|||
|
* 20 -- ABSOLUTE
|
|||
|
* 10 -- DIRECT,X
|
|||
|
* 08 -- ABSOLUTE,X
|
|||
|
* 04 -- DIRECT,Y
|
|||
|
* 02 -- ABSOLUTE,Y
|
|||
|
* 01 -- <<<NOT USED>>>
|
|||
|
*--------------------------------
|
|||
|
* OPCODE TABLE SELECTION
|
|||
|
* .OP 6502/65C02/R65C02/65816/SWEET16,...
|
|||
|
*--------------------------------
|
|||
|
DIR.OP LDA #0
|
|||
|
STA LEVEL.MASK
|
|||
|
LDA #15
|
|||
|
STA EMIT.MARGIN
|
|||
|
.1 JSR ASM65816.GNC.UC GET NEXT CHARACTER
|
|||
|
BCS .5 END
|
|||
|
LDY #-2
|
|||
|
.2 INY
|
|||
|
INY
|
|||
|
LDA PSOP.TABLE,Y
|
|||
|
BEQ .1 ...END OF TABLE, TRY NEXT CHARACTER
|
|||
|
CMP CURRENT.CHAR
|
|||
|
BNE .2 ...NOT THIS ONE
|
|||
|
.3 LDA PSOP.TABLE+1,Y
|
|||
|
STA LEVEL.MASK
|
|||
|
BPL .5
|
|||
|
LDA #18
|
|||
|
STA EMIT.MARGIN
|
|||
|
.5 RTS RETURN TO ASSEMBLER
|
|||
|
*--------------------------------
|
|||
|
PSOP.TABLE
|
|||
|
.DA #'8',#$A0 65816 = $A0
|
|||
|
.DA #'C',#$20 65C02 = $20
|
|||
|
.DO ROCKWELL
|
|||
|
.DA #'R',#$60 ROCKWELL= $60
|
|||
|
.FIN
|
|||
|
.DO SWEET.16
|
|||
|
.DA #'S',#$01 SWEET-16= $01
|
|||
|
.FIN
|
|||
|
.DA #0
|
|||
|
*--------------------------------------
|
|||
|
MAN
|
|||
|
SAVE usr/src/scmasm.30/asm65816.s
|
|||
|
LOAD usr/src/scmasm.30/scmasm.s
|
|||
|
ASM
|