513 lines
10 KiB
ArmAsm
513 lines
10 KiB
ArmAsm
|
||
C EQU 0x01 ;//6502 flags 6502标志
|
||
Z EQU 0x02
|
||
I EQU 0x04
|
||
D EQU 0x08
|
||
B EQU 0x10 ;//(allways 1 except when IRQ pushes it)IRQ外部中断
|
||
R EQU 0x20 ;//(locked at 1)
|
||
V EQU 0x40
|
||
N EQU 0x80
|
||
|
||
|
||
|
||
MACRO ;//translate from 6502 PC to rom offset翻译从6502 PC ROM的偏移量
|
||
encodePC
|
||
and r1,m6502_pc,#0xE000 ;//r9和0xe000按位与运算
|
||
adr r2,memmap_tbl ;//把存储器映象地址加载到r2
|
||
;// ldr r0,[r2,r1,lsr#11] ;//改过,加2行
|
||
lsr r0,r1,#11 ;//>>11位 r1/2048
|
||
ldr r0,[r2,r0] ;//读取r2地址+r1偏移的数据到r0
|
||
|
||
str r0,lastbank ;//保存6502PC从 ROM的最后偏移量
|
||
add m6502_pc,m6502_pc,r0 ;//m6502_pc+r0
|
||
MEND
|
||
|
||
MACRO ;//pack 6502 flags into r0 6502标志包装到R0
|
||
encodeP $extra
|
||
and r0,cycles,#CYC_V+CYC_D+CYC_I+CYC_C
|
||
tst m6502_nz,#0x80000000;//PSR_N
|
||
orrne r0,r0,#N ;N
|
||
tst m6502_nz,#0xff
|
||
orreq r0,r0,#Z ;Z
|
||
orr r0,r0,#$extra ;R(&B)
|
||
MEND
|
||
|
||
MACRO ;//;宏定义//unpack 6502 flags from r0 解压缩6502从R0的标志
|
||
decodeP
|
||
bic cycles,cycles,#CYC_V+CYC_D+CYC_I+CYC_C
|
||
and r1,r0,#V+D+I+C
|
||
orr cycles,cycles,r1 ;//VDIC
|
||
bic m6502_nz,r0,#0xFD ;//r0 is signed
|
||
eor m6502_nz,m6502_nz,#Z
|
||
MEND ;// ;宏定义结束
|
||
|
||
MACRO
|
||
fetch $count ;//提取操作码 ;$标号 宏名 $参数1,$参数2,...
|
||
;//---------------------------------------------------------------------
|
||
ldr r0,clocksh ;//处理apu需要的时钟数
|
||
add r0,r0,#$count
|
||
str r0,clocksh
|
||
|
||
ldr r1,opz ;//获取代码跳转表地址
|
||
;//-------------------------------------------------------------------------
|
||
subs cycles,cycles,#$count*256;//CYCLE=256 ;// 3*256 正数或0就执行下2条指令
|
||
ldrplb r0,[m6502_pc],#1 ; //从存储器中加载字节到一个寄存器中 r0=操作码
|
||
; ldrpl pc,[m6502_optbl,r0,lsl#2] ;//r10 ********r0=r0x4***运行代码的地址**************************************
|
||
ldrpl pc,[r1,r0,lsl#2]
|
||
ldr pc,nexttimeout
|
||
MEND
|
||
|
||
MACRO ;//相同的提取,但它增加了进位(位0)
|
||
fetch_c $count ;//same as fetch except it adds the Carry (bit 0) also.
|
||
;//---------------------------------------------------------------------
|
||
ldr r0,clocksh ;//处理apu需要的时钟数
|
||
add r0,r0,#$count
|
||
str r0,clocksh
|
||
|
||
ldr r1,opz ;//获取代码跳转表地址
|
||
;//-------------------------------------------------------------------------
|
||
sbcs cycles,cycles,#$count*256;//CYCLE=256
|
||
ldrplb r0,[m6502_pc],#1
|
||
; ldrpl pc,[m6502_optbl,r0,lsl#2]
|
||
ldrpl pc,[r1,r0,lsl#2]
|
||
ldr pc,nexttimeout
|
||
MEND
|
||
|
||
MACRO
|
||
clearcycles
|
||
and cycles,cycles,#CYC_MASK ;Save CPU bits
|
||
MEND
|
||
|
||
MACRO
|
||
readmemabs
|
||
and r1,addy,#0xE000
|
||
adr lr,%F0
|
||
;// ldr pc,[m6502_rmem,r1,lsr#11] ;//in: addy,r1=addy&0xE000 (for rom_R)
|
||
lsr r1,r1,#11 ;//改过,加2行 >>11
|
||
ldr pc,[m6502_rmem,r1]
|
||
|
||
0 ;//out: r0=val (bits 8-31=0 (LSR,ROR,INC,DEC,ASL)), addy preserved for RMW instructions
|
||
MEND
|
||
|
||
MACRO
|
||
readmemzp
|
||
ldrb r0,[cpu_zpage,addy]
|
||
MEND
|
||
|
||
MACRO
|
||
readmemzpi
|
||
;// ldrb r0,[cpu_zpage,addy,lsr#24]
|
||
lsr r0,addy,#24 ;//改过,加3行
|
||
ldrb r0,[cpu_zpage,r0]
|
||
|
||
MEND
|
||
|
||
MACRO
|
||
readmemzps
|
||
ldrsb m6502_nz,[cpu_zpage,addy];RAM
|
||
MEND
|
||
|
||
MACRO
|
||
readmemimm
|
||
ldrb r0,[m6502_pc],#1 ;ROM
|
||
MEND
|
||
|
||
MACRO
|
||
readmemimms
|
||
ldrsb m6502_nz,[m6502_pc],#1
|
||
MEND
|
||
|
||
MACRO
|
||
readmem
|
||
[ _type = _ABS
|
||
readmemabs
|
||
]
|
||
[ _type = _ZP
|
||
readmemzp
|
||
]
|
||
[ _type = _ZPI
|
||
readmemzpi
|
||
]
|
||
[ _type = _IMM
|
||
readmemimm
|
||
]
|
||
MEND
|
||
|
||
MACRO
|
||
readmems
|
||
[ _type = _ABS
|
||
readmemabs
|
||
orr m6502_nz,r0,r0,lsl#24
|
||
]
|
||
[ _type = _ZP
|
||
readmemzps
|
||
]
|
||
[ _type = _IMM
|
||
readmemimms
|
||
]
|
||
MEND
|
||
|
||
|
||
MACRO
|
||
writememabs
|
||
and r1,addy,#0xe000
|
||
adr r2,writemem_tbl
|
||
adr lr,%F0
|
||
;// ldr pc,[r2,r1,lsr#11] ;//in: addy,r0=val(bits 8-31=?)
|
||
lsr r1,r1,#11 ;//改过,加2行 >>11
|
||
ldr pc,[r2,r1]
|
||
|
||
0 ;out: r0,r1,r2,addy=?
|
||
MEND
|
||
|
||
MACRO
|
||
writememzp
|
||
strb r0,[cpu_zpage,addy]
|
||
MEND
|
||
|
||
MACRO
|
||
writememzpi
|
||
;// strb r0,[cpu_zpage,addy,lsr#24]
|
||
lsr r1,addy,#24 ;//改过,加2行 >>24
|
||
strb r0,[cpu_zpage,r1]
|
||
|
||
|
||
MEND
|
||
|
||
MACRO
|
||
writemem ;//写内存
|
||
[ _type = _ABS
|
||
writememabs
|
||
]
|
||
[ _type = _ZP
|
||
writememzp
|
||
]
|
||
[ _type = _ZPI
|
||
writememzpi
|
||
]
|
||
MEND
|
||
;----------------------------------------------------------------------------
|
||
|
||
MACRO ;///////////////////////////////// /////////////////////
|
||
push16 ;push r0
|
||
mov r1,r0,lsr#8
|
||
ldr r2,m6502_s
|
||
strb r1,[r2],#-1
|
||
orr r2,r2,#0x100
|
||
strb r0,[r2],#-1
|
||
strb r2,m6502_s
|
||
MEND ;r1,r2=?
|
||
|
||
MACRO
|
||
push8 $x
|
||
ldr r2,m6502_s
|
||
strb $x,[r2],#-1
|
||
strb r2,m6502_s
|
||
MEND ;r2=?
|
||
|
||
MACRO
|
||
pop16 ;pop m6502_pc
|
||
ldrb r2,m6502_s
|
||
add r2,r2,#2
|
||
strb r2,m6502_s
|
||
ldr r2,m6502_s
|
||
ldrb r0,[r2],#-1
|
||
orr r2,r2,#0x100
|
||
ldrb m6502_pc,[r2]
|
||
orr m6502_pc,m6502_pc,r0,lsl#8
|
||
MEND ;r0,r1=?
|
||
|
||
MACRO
|
||
pop8 $x
|
||
ldrb r2,m6502_s
|
||
add r2,r2,#1
|
||
strb r2,m6502_s
|
||
orr r2,r2,#0x100
|
||
ldrsb $x,[cpu_zpage,r2] ;signed for PLA & PLP
|
||
|
||
MEND ;r2=?
|
||
|
||
;----------------------------------------------------------------------------
|
||
;doXXX: load addy, increment m6502_pc
|
||
|
||
GBLA _type
|
||
|
||
_IMM EQU 1 ;immediate
|
||
_ZP EQU 2 ;zero page
|
||
_ZPI EQU 3 ;zero page indexed
|
||
_ABS EQU 4 ;absolute
|
||
|
||
MACRO
|
||
doABS ;absolute $nnnn
|
||
_type SETA _ABS
|
||
ldrb addy,[m6502_pc],#1
|
||
ldrb r0,[m6502_pc],#1
|
||
orr addy,addy,r0,lsl#8
|
||
MEND
|
||
|
||
MACRO
|
||
doAIX ;absolute indexed X $nnnn,X
|
||
_type SETA _ABS
|
||
ldrb addy,[m6502_pc],#1
|
||
ldrb r0,[m6502_pc],#1
|
||
orr addy,addy,r0,lsl#8
|
||
add addy,addy,m6502_x,lsr#24
|
||
; bic addy,addy,#0xff0000 ;Base Wars needs this
|
||
MEND
|
||
|
||
MACRO
|
||
doAIY ;absolute indexed Y $nnnn,Y
|
||
_type SETA _ABS
|
||
ldrb addy,[m6502_pc],#1
|
||
ldrb r0,[m6502_pc],#1
|
||
orr addy,addy,r0,lsl#8
|
||
add addy,addy,m6502_y,lsr#24
|
||
; bic addy,addy,#0xff0000 ;Tecmo Bowl needs this
|
||
MEND
|
||
|
||
MACRO
|
||
doIMM ;immediate #$nn
|
||
_type SETA _IMM
|
||
MEND
|
||
|
||
MACRO
|
||
doIIX ;indexed indirect X ($nn,X)
|
||
_type SETA _ABS
|
||
ldrb r0,[m6502_pc],#1
|
||
add r0,m6502_x,r0,lsl#24
|
||
;//ldrb addy,[cpu_zpage,r0,lsr#24] ;//错误:指定的转变不允许
|
||
lsr addy,r0,#24 ;//改过,加2行 >>24
|
||
ldrb addy,[cpu_zpage,addy]
|
||
|
||
add r0,r0,#0x01000000
|
||
;//ldrb r1,[cpu_zpage,r0,lsr#24] ;//R1,LSR#2;将R1中的内容右移2位
|
||
lsr r1,r0,#24 ;//改过,加2行
|
||
ldrb r1,[cpu_zpage,r1]
|
||
|
||
orr addy,addy,r1,lsl#8
|
||
MEND
|
||
|
||
MACRO
|
||
doIIY ;indirect indexed Y ($nn),Y
|
||
_type SETA _ABS
|
||
ldrb r0,[m6502_pc],#1
|
||
;// ldrb addy,[r0,cpu_zpage]! ;;在数据传送之前,将偏移量加到Rn 中,其结果作为传送数据的存储地址
|
||
;//若使用后缀"!",则结果写回到Rn中
|
||
ldrb addy,[r0,cpu_zpage]
|
||
add r0,r0,cpu_zpage ;//////////////////////////////////////
|
||
|
||
|
||
ldrb r1,[r0,#1]
|
||
orr addy,addy,r1,lsl#8
|
||
add addy,addy,m6502_y,lsr#24
|
||
; bic addy,addy,#0xff0000 ;Zelda2 needs this
|
||
MEND
|
||
|
||
MACRO
|
||
doZPI ;Zeropage indirect ($nn)
|
||
_type SETA _ABS
|
||
ldrb r0,[m6502_pc],#1
|
||
;// ldrb addy,[r0,cpu_zpage]!;;在数据传送之前,将偏移量加到Rn 中,其结果作为传送数据的存储地址
|
||
;//若使用后缀"!",则结果写回到Rn中
|
||
ldrb addy,[r0,cpu_zpage]
|
||
add r0,r0,cpu_zpage
|
||
|
||
|
||
ldrb r1,[r0,#1]
|
||
orr addy,addy,r1,lsl#8
|
||
MEND
|
||
|
||
MACRO
|
||
doZ ;zero page $nn
|
||
_type SETA _ZP
|
||
ldrb addy,[m6502_pc],#1
|
||
MEND
|
||
|
||
MACRO
|
||
doZ2 ;zero page $nn
|
||
_type SETA _ZP
|
||
ldrb addy,[m6502_pc],#2 ;ugly thing for bbr/bbs
|
||
MEND
|
||
|
||
MACRO
|
||
doZIX ;zero page indexed X $nn,X
|
||
_type SETA _ZP
|
||
ldrb addy,[m6502_pc],#1
|
||
add addy,addy,m6502_x,lsr#24
|
||
and addy,addy,#0xff ;Rygar needs this
|
||
MEND
|
||
|
||
MACRO
|
||
doZIXf ;zero page indexed X $nn,X
|
||
_type SETA _ZPI
|
||
ldrb addy,[m6502_pc],#1
|
||
add addy,m6502_x,addy,lsl#24
|
||
MEND
|
||
|
||
MACRO
|
||
doZIY ;zero page indexed Y $nn,Y
|
||
_type SETA _ZP
|
||
ldrb addy,[m6502_pc],#1
|
||
add addy,addy,m6502_y,lsr#24
|
||
and addy,addy,#0xff
|
||
MEND
|
||
|
||
MACRO
|
||
doZIYf ;zero page indexed Y $nn,Y
|
||
_type SETA _ZPI
|
||
ldrb addy,[m6502_pc],#1
|
||
add addy,m6502_y,addy,lsl#24
|
||
MEND
|
||
|
||
;----------------------------------------------------------------------------
|
||
|
||
MACRO
|
||
opADC
|
||
readmem
|
||
movs r1,cycles,lsr#1 ;get C
|
||
subcs r0,r0,#0x00000100
|
||
adcs m6502_a,m6502_a,r0,ror#8
|
||
mov m6502_nz,m6502_a,asr#24 ;NZ
|
||
orr cycles,cycles,#CYC_C+CYC_V ;Prepare C & V
|
||
bicvc cycles,cycles,#CYC_V ;V
|
||
MEND
|
||
|
||
MACRO
|
||
opAND
|
||
readmem
|
||
and m6502_a,m6502_a,r0,lsl#24
|
||
mov m6502_nz,m6502_a,asr#24 ;NZ
|
||
MEND
|
||
|
||
MACRO
|
||
opASL
|
||
readmem
|
||
add r0,r0,r0
|
||
orrs m6502_nz,r0,r0,lsl#24 ;NZ
|
||
orr cycles,cycles,#CYC_C ;Prepare C
|
||
writemem
|
||
MEND
|
||
|
||
MACRO
|
||
opBIT
|
||
readmem
|
||
bic cycles,cycles,#CYC_V ;reset V
|
||
tst r0,#V
|
||
orrne cycles,cycles,#CYC_V ;V
|
||
and m6502_nz,r0,m6502_a,lsr#24 ;Z
|
||
orr m6502_nz,m6502_nz,r0,lsl#24 ;N
|
||
MEND
|
||
|
||
MACRO
|
||
opCOMP $x ;A,X & Y
|
||
readmem
|
||
subs m6502_nz,$x,r0,lsl#24
|
||
mov m6502_nz,m6502_nz,asr#24 ;NZ
|
||
orr cycles,cycles,#CYC_C ;Prepare C
|
||
MEND
|
||
|
||
MACRO
|
||
opDEC
|
||
readmem
|
||
sub r0,r0,#1
|
||
orr m6502_nz,r0,r0,lsl#24 ;NZ
|
||
writemem
|
||
MEND
|
||
|
||
MACRO
|
||
opEOR
|
||
readmem
|
||
eor m6502_a,m6502_a,r0,lsl#24
|
||
mov m6502_nz,m6502_a,asr#24 ;NZ
|
||
MEND
|
||
|
||
MACRO
|
||
opINC
|
||
readmem
|
||
add r0,r0,#1
|
||
orr m6502_nz,r0,r0,lsl#24 ;NZ
|
||
writemem
|
||
MEND
|
||
|
||
MACRO
|
||
opLOAD $x
|
||
readmems
|
||
mov $x,m6502_nz,lsl#24
|
||
MEND
|
||
|
||
MACRO
|
||
opLSR
|
||
[ _type = _ABS
|
||
readmemabs
|
||
movs r0,r0,lsr#1
|
||
orr cycles,cycles,#CYC_C ;Prepare C
|
||
mov m6502_nz,r0 ;Z, (N=0)
|
||
writememabs
|
||
]
|
||
[ _type = _ZP
|
||
ldrb m6502_nz,[cpu_zpage,addy]
|
||
movs m6502_nz,m6502_nz,lsr#1 ;Z, (N=0)
|
||
orr cycles,cycles,#CYC_C ;Prepare C
|
||
strb m6502_nz,[cpu_zpage,addy]
|
||
]
|
||
[ _type = _ZPI
|
||
;// ldrb m6502_nz,[cpu_zpage,addy,lsr#24]
|
||
lsr m6502_nz,addy,#24 ;//改过,加2行
|
||
ldrb m6502_nz,[cpu_zpage,m6502_nz]
|
||
|
||
movs m6502_nz,m6502_nz,lsr#1 ;Z, (N=0)
|
||
orr cycles,cycles,#CYC_C ;Prepare C
|
||
;// strb m6502_nz,[cpu_zpage,addy,lsr#24]
|
||
lsr r1,addy,#24 ;//改过,加2行
|
||
strb m6502_nz,[cpu_zpage,r1]
|
||
|
||
]
|
||
MEND
|
||
|
||
MACRO
|
||
opORA
|
||
readmem
|
||
orr m6502_a,m6502_a,r0,lsl#24
|
||
mov m6502_nz,m6502_a,asr#24
|
||
MEND
|
||
|
||
MACRO
|
||
opROL
|
||
readmem
|
||
movs cycles,cycles,lsr#1 ;get C
|
||
adc r0,r0,r0
|
||
orrs m6502_nz,r0,r0,lsl#24 ;NZ
|
||
adc cycles,cycles,cycles ;Set C
|
||
writemem
|
||
MEND
|
||
|
||
MACRO
|
||
opROR
|
||
readmem
|
||
movs cycles,cycles,lsr#1 ;get C
|
||
orrcs r0,r0,#0x100
|
||
movs r0,r0,lsr#1
|
||
orr m6502_nz,r0,r0,lsl#24 ;NZ
|
||
adc cycles,cycles,cycles ;Set C
|
||
writemem
|
||
MEND
|
||
|
||
MACRO
|
||
opSBC
|
||
readmem
|
||
movs r1,cycles,lsr#1 ;get C
|
||
sbcs m6502_a,m6502_a,r0,lsl#24
|
||
and m6502_a,m6502_a,#0xff000000
|
||
mov m6502_nz,m6502_a,asr#24 ;NZ
|
||
orr cycles,cycles,#CYC_C+CYC_V ;Prepare C & V
|
||
bicvc cycles,cycles,#CYC_V ;V
|
||
MEND
|
||
|
||
MACRO
|
||
opSTORE $x
|
||
mov r0,$x,lsr#24
|
||
writemem
|
||
MEND
|
||
;----------------------------------------------------
|
||
END
|