Files
player/Project/Src/NES/6502.s
2025-06-27 00:32:57 +08:00

1611 lines
54 KiB
ArmAsm
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

INCLUDE equates.s
INCLUDE 6502mac.s
IMPORT NES_RAM ;nes_main.c __align(1024) uint8 NES_RAM[0x800];//保持1024字节对齐
IMPORT NES_SRAM ;nes_main.c uint8 NES_SRAM[0x2000];
IMPORT spr_ram ; uint8 spr_ram[0x100];
EXPORT cpunmi ;cpu中断标志
EXPORT cpuirq ;cpu中断标志
EXPORT clocks ;apu要的cpu时钟
EXPORT cpu_data ;地址 cart.s
EXPORT NMI6502
EXPORT CPU_reset
EXPORT run6502
EXPORT op_table
IRQ_VECTOR EQU 0xfffe ; //IRQ / BRK中断向量地址
RES_VECTOR EQU 0xfffc ;// 复位中断向量地址
NMI_VECTOR EQU 0xfffa ;// NMI中断向量地址
;cycle flags- (stored in cycles reg for speed)存储在周期章速度
CYC_C EQU 0x01 ;Carry bit 进位
;BRANCH EQU 0x02 ;branch instruction encountered 遇到分支指令
CYC_I EQU 0x04 ;IRQ mask
CYC_D EQU 0x08 ;Decimal bit 小数位
CYC_V EQU 0x40 ;Overflow bit 溢出位
;CYC_MASK EQU 0xFF;CYCLE-1 ;Mask
AREA cpu_code, CODE, READONLY ;, ALIGN=2
; 不要对 ARM 代码节使用 ALIGN=0 或 ALIGN=1。
; 不要对 Thumb 代码节使用 ALIGN=0。
;AREA 伪代码也是需要语法的AREA 后面跟着段名标号然后是属性CODE 表示这是一
;个代码段READONLY 表示这个段是只读的
;|.text|系统默认的代码段名
; ALIGN 指令通过用零或 NOP 指令进行填充将当前位置对齐到指定边界
;ENTRY 这个伪代码是用来定义入口点
THUMB ;Thumb是ARM体系结构中一种16位的指令集
; REQUIRE8 ;REQUIRE8 指令指定当前文件要求堆栈八字节对齐。 它设置 REQ8 编译属性以通知链接器。
PRESERVE8 ;{TRUE} ;PRESERVE8 指令指定当前文件保持堆栈八字节对齐。 它设置 PRES8 编译属性以通知链接器。
;如果您省略 PRESERVE8 和 PRESERVE8 {FALSE},汇编程序会检查修改 sp 的指令,
;以决定是否设置 PRES8 编译属性。 ARM 建议明确指定 PRESERVE8。
; ARM使用r0作为返回值
;参数传递ARM寄存器到堆栈首先将参数赋给r0, r1等
; PROC 为子程序开始ENDP 为子程序结束
;r0,r1,r2=temp regs
m6502_nz RN r3 ;bit 31=N, Z=1 if bits 0-7=0 ;RN定义寄存器名
m6502_rmem RN r4 ;readmem_tbl
m6502_a RN r5 ;//bits 0-23=0, 还用于清除在内存中的字节
m6502_x RN r6 ;bits 0-23=0
m6502_y RN r7 ;bits 0-23=0
cycles RN r8 ;//also VDIC flags也VDIC标志
m6502_pc RN r9
globalptr RN r10 ;=wram_globals* ptr
m6502_optbl RN r10
cpu_zpage RN r11 ;=CPU_RAM
addy RN r12 ;//keep this at r12 (从头 APCS) //addr :代表8位地址
;r13=SP
;r14=LR
;r15=PC
;---------------------------------------------------
_00; BRK
;----------------------------------------------------------------------------
ldr r0,lastbank ; 6502PC从 ROM的最后偏移量
sub r1,m6502_pc,r0
add r0,r1,#1
push16 ;save PC
encodeP (B+R) ;save P
ldr r12,=IRQ_VECTOR
bl VecCont
fetch 7
LTORG ;指令, LTORG可能是在一个可执行的位置
;----------------------------------------------------------------------------
_01; ORA ($nn,X)
;----------------------------------------------------------------------------
doIIX
opORA
fetch 6
;----------------------------------------------------------------------------
_05; ORA $nn
;----------------------------------------------------------------------------
doZ
opORA
fetch 3
;----------------------------------------------------------------------------
_06; ASL $nn
;----------------------------------------------------------------------------
doZ
opASL
fetch_c 5
;----------------------------------------------------------------------------
_08; PHP
;----------------------------------------------------------------------------
encodeP (B+R)
push8 r0
fetch 3
;----------------------------------------------------------------------------
_09; ORA #$nn
;----------------------------------------------------------------------------
doIMM
opORA
fetch 2
;----------------------------------------------------------------------------
_0A; ASL
;----------------------------------------------------------------------------
adds m6502_a,m6502_a,m6502_a
mov m6502_nz,m6502_a,asr#24 ;NZ
orr cycles,cycles,#CYC_C ;Prepare C
fetch_c 2 ;also subs carry
;----------------------------------------------------------------------------
_0D; ORA $nnnn
;----------------------------------------------------------------------------
doABS
opORA
fetch 4
;----------------------------------------------------------------------------
_0E; ASL $nnnn
;----------------------------------------------------------------------------
doABS
opASL
fetch_c 6
;----------------------------------------------------------------------------
_10; BPL *
;----------------------------------------------------------------------------
tst m6502_nz,#0x80000000
ldrsb r0,[m6502_pc],#1
addeq m6502_pc,m6502_pc,r0
; subeq cycles,cycles,#3*CYCLE
subeq cycles,cycles,#256
fetch 2
;----------------------------------------------------------------------------
_11; ORA ($nn),Y
;----------------------------------------------------------------------------
doIIY
opORA
fetch 5
;----------------------------------------------------------------------------
_15; ORA $nn,X
;----------------------------------------------------------------------------
doZIXf
opORA
fetch 4
;----------------------------------------------------------------------------
_16; ASL $nn,X
;----------------------------------------------------------------------------
doZIXf
opASL
fetch_c 6
;----------------------------------------------------------------------------
_18; CLC
;----------------------------------------------------------------------------
bic cycles,cycles,#CYC_C
fetch 2
;----------------------------------------------------------------------------
_19; ORA $nnnn,Y
;----------------------------------------------------------------------------
doAIY
opORA
fetch 4
;----------------------------------------------------------------------------
_1D; ORA $nnnn,X
;----------------------------------------------------------------------------
doAIX
opORA
fetch 4
;----------------------------------------------------------------------------
_1E; ASL $nnnn,X
;----------------------------------------------------------------------------
doAIX
opASL
fetch_c 7
;----------------------------------------------------------------------------
_20; JSR $nnnn
;----------------------------------------------------------------------------
ldrb r2,[m6502_pc],#1
ldr r1,lastbank
sub r0,m6502_pc,r1
ldrb r1,[m6502_pc]
orr m6502_pc,r2,r1,lsl#8
push16
encodePC
fetch 6
;----------------------------------------------------------------------------
_21; AND ($nn,X)
;----------------------------------------------------------------------------
doIIX
opAND
fetch 6
;----------------------------------------------------------------------------
_24; BIT $nn
;----------------------------------------------------------------------------
doZ
opBIT
fetch 3
;----------------------------------------------------------------------------
_25; AND $nn
;----------------------------------------------------------------------------
doZ
opAND
fetch 3
;----------------------------------------------------------------------------
_26; ROL $nn
;----------------------------------------------------------------------------
doZ
opROL
fetch 5
;----------------------------------------------------------------------------
_28; PLP
;----------------------------------------------------------------------------
pop8 r0
decodeP
fetch 4
;----------------------------------------------------------------------------
_29; AND #$nn
;----------------------------------------------------------------------------
doIMM
opAND
fetch 2
;----------------------------------------------------------------------------
_2A; ROL
;----------------------------------------------------------------------------
movs cycles,cycles,lsr#1 ;get C
orrcs m6502_a,m6502_a,#0x00800000
adds m6502_a,m6502_a,m6502_a
mov m6502_nz,m6502_a,asr#24 ;NZ
adc cycles,cycles,cycles ;Set C
fetch 2
;----------------------------------------------------------------------------
_2C; BIT $nnnn
;----------------------------------------------------------------------------
doABS
opBIT
fetch 4
;----------------------------------------------------------------------------
_2D; AND $nnnn
;----------------------------------------------------------------------------
doABS
opAND
fetch 4
;----------------------------------------------------------------------------
_2E; ROL $nnnn
;----------------------------------------------------------------------------
doABS
opROL
fetch 6
;----------------------------------------------------------------------------
_30; BMI *
;----------------------------------------------------------------------------
tst m6502_nz,#0x80000000
ldrsb r0,[m6502_pc],#1
addne m6502_pc,m6502_pc,r0
; subne cycles,cycles,#3*CYCLE
subne cycles,cycles,#256
fetch 2
;----------------------------------------------------------------------------
_31; AND ($nn),Y
;----------------------------------------------------------------------------
doIIY
opAND
fetch 5
;----------------------------------------------------------------------------
_35; AND $nn,X
;----------------------------------------------------------------------------
doZIXf
opAND
fetch 4
;----------------------------------------------------------------------------
_36; ROL $nn,X
;----------------------------------------------------------------------------
doZIXf
opROL
fetch 6
;----------------------------------------------------------------------------
_38; SEC
;----------------------------------------------------------------------------
orr cycles,cycles,#CYC_C
fetch 2
;----------------------------------------------------------------------------
_39; AND $nnnn,Y
;----------------------------------------------------------------------------
doAIY
opAND
fetch 4
;----------------------------------------------------------------------------
_3D; AND $nnnn,X
;----------------------------------------------------------------------------
doAIX
opAND
fetch 4
;----------------------------------------------------------------------------
_3E; ROL $nnnn,X
;----------------------------------------------------------------------------
doAIX
opROL
fetch 7
;----------------------------------------------------------------------------
_40; RTI
;----------------------------------------------------------------------------
pop8 r0 ;pop 6502 flags and decode
decodeP
pop16 ;pop the return address
encodePC
fetch 6
;----------------------------------------------------------------------------
_41; EOR ($nn,X)
;----------------------------------------------------------------------------
doIIX
opEOR
fetch 6
;----------------------------------------------------------------------------
_45; EOR $nn
;----------------------------------------------------------------------------
doZ
opEOR
fetch 3
;----------------------------------------------------------------------------
_46; LSR $nn
;----------------------------------------------------------------------------
doZ
opLSR
fetch_c 5
;----------------------------------------------------------------------------
_48; PHA
;----------------------------------------------------------------------------
mov r0,m6502_a,lsr#24
push8 r0
fetch 3
;----------------------------------------------------------------------------
_49; EOR #$nn
;----------------------------------------------------------------------------
doIMM
opEOR
fetch 2
;----------------------------------------------------------------------------
_4A; LSR
;----------------------------------------------------------------------------
movs m6502_nz,m6502_a,lsr#25 ;Z, N=0
mov m6502_a,m6502_nz,lsl#24 ;result without garbage
orr cycles,cycles,#CYC_C ;Prepare C
fetch_c 2
;----------------------------------------------------------------------------
_4C; JMP $nnnn
;----------------------------------------------------------------------------
ldrb r0,[m6502_pc],#1
ldrb r1,[m6502_pc]
orr m6502_pc,r0,r1,lsl#8
encodePC
fetch 3
;----------------------------------------------------------------------------
_4D; EOR $nnnn
;----------------------------------------------------------------------------
doABS
opEOR
fetch 4
;----------------------------------------------------------------------------
_4E; LSR $nnnn
;----------------------------------------------------------------------------
doABS
opLSR
fetch_c 6
;----------------------------------------------------------------------------
_50; BVC *
;----------------------------------------------------------------------------
tst cycles,#CYC_V
ldrsb r0,[m6502_pc],#1
addeq m6502_pc,m6502_pc,r0
; subeq cycles,cycles,#3*CYCLE
subeq cycles,cycles,#256
fetch 2
;----------------------------------------------------------------------------
_51; EOR ($nn),Y
;----------------------------------------------------------------------------
doIIY
opEOR
fetch 5
;----------------------------------------------------------------------------
_55; EOR $nn,X
;----------------------------------------------------------------------------
doZIXf
opEOR
fetch 4
;----------------------------------------------------------------------------
_56; LSR $nn,X
;----------------------------------------------------------------------------
doZIXf
opLSR
fetch_c 6
;----------------------------------------------------------------------------
_58; CLI
;----------------------------------------------------------------------------
bic cycles,cycles,#CYC_I
fetch 2
;----------------------------------------------------------------------------
_59; EOR $nnnn,Y
;----------------------------------------------------------------------------
doAIY
opEOR
fetch 4
;----------------------------------------------------------------------------
_5D; EOR $nnnn,X
;----------------------------------------------------------------------------
doAIX
opEOR
fetch 4
;----------------------------------------------------------------------------
_5E; LSR $nnnn,X
;----------------------------------------------------------------------------
doAIX
opLSR
fetch_c 7
;----------------------------------------------------------------------------
_60; RTS
;----------------------------------------------------------------------------
pop16
add m6502_pc,m6502_pc,#1
encodePC
fetch 6
;----------------------------------------------------------------------------
_61; ADC ($nn,X)
;----------------------------------------------------------------------------
doIIX
opADC
fetch_c 6
;----------------------------------------------------------------------------
_65; ADC $nn
;----------------------------------------------------------------------------
doZ
opADC
fetch_c 3
;----------------------------------------------------------------------------
_66; ROR $nn
;----------------------------------------------------------------------------
doZ
opROR
fetch 5
;----------------------------------------------------------------------------
_68; PLA
;----------------------------------------------------------------------------
pop8 m6502_nz
mov m6502_a,m6502_nz,lsl#24
fetch 4
;----------------------------------------------------------------------------
_69; ADC #$nn
;----------------------------------------------------------------------------
doIMM
opADC
fetch_c 2
;----------------------------------------------------------------------------
_6A; ROR
;----------------------------------------------------------------------------
movs cycles,cycles,lsr#1 ;get C
mov m6502_a,m6502_a,rrx
movs m6502_nz,m6502_a,asr#24 ;NZ
and m6502_a,m6502_a,#0xff000000
adc cycles,cycles,cycles ;Set C
fetch 2
;----------------------------------------------------------------------------
_6C; JMP ($nnnn) JMP ($data16) 间接寻址 *********************************
;----------------------------------------------------------------------------
doABS
adr r1,memmap_tbl
and r2,addy,#0xE000 ;
; ldr r1,[r1,r2,lsr#11] ;>>11 addr&0x7FF
lsr r0,r2,#11
ldr r1,[r1,r0] ;在数据传送之前,将偏移量加到Rn 中,其结果作为传送数据的存储地址
ldrb m6502_pc,[r1,addy] ;//若使用后缀"!",则结果写回到Rn中
add r1,r1,addy
ldrb r0,[r1,#1]
orr m6502_pc,m6502_pc,r0,lsl#8 ;m6502_pc=r9使用ORR 指令将近R9的高8 位数据移入到R0低8位
encodePC
fetch 5
;----------------------------------------------------------------------------
_6D; ADC $nnnn
;----------------------------------------------------------------------------
doABS
opADC
fetch_c 4
;----------------------------------------------------------------------------
_6E; ROR $nnnn
;----------------------------------------------------------------------------
doABS
opROR
fetch 6
;----------------------------------------------------------------------------
_70; BVS *
;----------------------------------------------------------------------------
tst cycles,#CYC_V
ldrsb r0,[m6502_pc],#1
addne m6502_pc,m6502_pc,r0
; subne cycles,cycles,#3*CYCLE
subne cycles,cycles,#256
fetch 2
;----------------------------------------------------------------------------
_71; ADC ($nn),Y
;----------------------------------------------------------------------------
doIIY
opADC
fetch_c 5
;----------------------------------------------------------------------------
_75; ADC $nn,X
;----------------------------------------------------------------------------
doZIXf
opADC
fetch_c 4
;----------------------------------------------------------------------------
_76; ROR $nn,X
;----------------------------------------------------------------------------
doZIXf
opROR
fetch 6
;----------------------------------------------------------------------------
_78; SEI
;----------------------------------------------------------------------------
orr cycles,cycles,#CYC_I
fetch 2
;----------------------------------------------------------------------------
_79; ADC $nnnn,Y
;----------------------------------------------------------------------------
doAIY
opADC
fetch_c 4
;----------------------------------------------------------------------------
_7D; ADC $nnnn,X
;----------------------------------------------------------------------------
doAIX
opADC
fetch_c 4
;----------------------------------------------------------------------------
_7E; ROR $nnnn,X
;----------------------------------------------------------------------------
doAIX
opROR
fetch 7
;----------------------------------------------------------------------------
_81; STA ($nn,X)
;----------------------------------------------------------------------------
doIIX
opSTORE m6502_a
fetch 6
;----------------------------------------------------------------------------
_84; STY $nn
;----------------------------------------------------------------------------
doZ
opSTORE m6502_y
fetch 3
;----------------------------------------------------------------------------
_85; STA $nn
;----------------------------------------------------------------------------
doZ
opSTORE m6502_a
fetch 3
;----------------------------------------------------------------------------
_86; STX $nn
;----------------------------------------------------------------------------
doZ
opSTORE m6502_x
fetch 3
;----------------------------------------------------------------------------
_88; DEY
;----------------------------------------------------------------------------
sub m6502_y,m6502_y,#0x01000000
mov m6502_nz,m6502_y,asr#24
fetch 2
;----------------------------------------------------------------------------
_8A; TXA
;----------------------------------------------------------------------------
mov m6502_a,m6502_x
mov m6502_nz,m6502_x,asr#24
fetch 2
;----------------------------------------------------------------------------
_8C; STY $nnnn
;----------------------------------------------------------------------------
doABS
opSTORE m6502_y
fetch 4
;----------------------------------------------------------------------------
_8D; STA $nnnn
;----------------------------------------------------------------------------
doABS
opSTORE m6502_a
fetch 4
;----------------------------------------------------------------------------
_8E; STX $nnnn
;----------------------------------------------------------------------------
doABS
opSTORE m6502_x
fetch 4
;----------------------------------------------------------------------------
_90; BCC *
;----------------------------------------------------------------------------
tst cycles,#CYC_C ;Test Carry
ldrsb r0,[m6502_pc],#1
addeq m6502_pc,m6502_pc,r0
; subeq cycles,cycles,#3*CYCLE
subeq cycles,cycles,#256
fetch 2
;----------------------------------------------------------------------------
_91; STA ($nn),Y
;----------------------------------------------------------------------------
doIIY
opSTORE m6502_a
fetch 6
;----------------------------------------------------------------------------
_94; STY $nn,X
;----------------------------------------------------------------------------
doZIXf
opSTORE m6502_y
fetch 4
;----------------------------------------------------------------------------
_95; STA $nn,X
;----------------------------------------------------------------------------
doZIXf
opSTORE m6502_a
fetch 4
;----------------------------------------------------------------------------
_96; STX $nn,Y
;----------------------------------------------------------------------------
doZIYf
opSTORE m6502_x
fetch 4
;----------------------------------------------------------------------------
_98; TYA
;----------------------------------------------------------------------------
mov m6502_a,m6502_y
mov m6502_nz,m6502_y,asr#24
fetch 2
;----------------------------------------------------------------------------
_99; STA $nnnn,Y
;----------------------------------------------------------------------------
doAIY
opSTORE m6502_a
fetch 5
;----------------------------------------------------------------------------
_9A; TXS
;----------------------------------------------------------------------------
mov r0,m6502_x,lsr#24
strb r0,m6502_s
fetch 2
;----------------------------------------------------------------------------
_9D; STA $nnnn,X
;----------------------------------------------------------------------------
doAIX
opSTORE m6502_a
fetch 5
;----------------------------------------------------------------------------
_A0; LDY #$nn
;----------------------------------------------------------------------------
doIMM
opLOAD m6502_y
fetch 2
;----------------------------------------------------------------------------
_A1; LDA ($nn,X)
;----------------------------------------------------------------------------
doIIX
opLOAD m6502_a
fetch 6
;----------------------------------------------------------------------------
_A2; LDX #$nn
;----------------------------------------------------------------------------
doIMM
opLOAD m6502_x
fetch 2
;----------------------------------------------------------------------------
_A4; LDY $nn
;----------------------------------------------------------------------------
doZ
opLOAD m6502_y
fetch 3
;----------------------------------------------------------------------------
_A5; LDA $nn
;----------------------------------------------------------------------------
doZ
opLOAD m6502_a
fetch 3
;----------------------------------------------------------------------------
_A6; LDX $nn
;----------------------------------------------------------------------------
doZ
opLOAD m6502_x
fetch 3
;----------------------------------------------------------------------------
_A8; TAY
;----------------------------------------------------------------------------
mov m6502_y,m6502_a
mov m6502_nz,m6502_y,asr#24
fetch 2
;----------------------------------------------------------------------------
_A9; LDA #$nn
;----------------------------------------------------------------------------
doIMM
opLOAD m6502_a
fetch 2
;----------------------------------------------------------------------------
_AA; TAX
;----------------------------------------------------------------------------
mov m6502_x,m6502_a
mov m6502_nz,m6502_x,asr#24
fetch 2
;----------------------------------------------------------------------------
_AC; LDY $nnnn
;----------------------------------------------------------------------------
doABS
opLOAD m6502_y
fetch 4
;----------------------------------------------------------------------------
_AD; LDA $nnnn
;----------------------------------------------------------------------------
doABS
opLOAD m6502_a
fetch 4
;----------------------------------------------------------------------------
_AE; LDX $nnnn
;----------------------------------------------------------------------------
doABS
opLOAD m6502_x
fetch 4
;----------------------------------------------------------------------------
_B0; BCS *
;----------------------------------------------------------------------------
tst cycles,#CYC_C ;Test Carry
ldrsb r0,[m6502_pc],#1
addne m6502_pc,m6502_pc,r0
; subne cycles,cycles,#3*CYCLE
subne cycles,cycles,#256
fetch 2
;----------------------------------------------------------------------------
_B1; LDA ($nn),Y
;----------------------------------------------------------------------------
doIIY
opLOAD m6502_a
fetch 5
;----------------------------------------------------------------------------
_B4; LDY $nn,X
;----------------------------------------------------------------------------
doZIX
opLOAD m6502_y
fetch 4
;----------------------------------------------------------------------------
_B5; LDA $nn,X
;----------------------------------------------------------------------------
doZIX
opLOAD m6502_a
fetch 4
;----------------------------------------------------------------------------
_B6; LDX $nn,Y
;----------------------------------------------------------------------------
doZIY
opLOAD m6502_x
fetch 4
;----------------------------------------------------------------------------
_B8; CLV
;----------------------------------------------------------------------------
bic cycles,cycles,#CYC_V
fetch 2
;----------------------------------------------------------------------------
_B9; LDA $nnnn,Y
;----------------------------------------------------------------------------
doAIY
opLOAD m6502_a
fetch 4
;----------------------------------------------------------------------------
_BA; TSX
;----------------------------------------------------------------------------
ldrb m6502_x,m6502_s
mov m6502_x,m6502_x,lsl#24
mov m6502_nz,m6502_x,asr#24
fetch 2
;----------------------------------------------------------------------------
_BC; LDY $nnnn,X
;----------------------------------------------------------------------------
doAIX
opLOAD m6502_y
fetch 4
;----------------------------------------------------------------------------
_BD; LDA $nnnn,X
;----------------------------------------------------------------------------
doAIX
opLOAD m6502_a
fetch 4
;----------------------------------------------------------------------------
_BE; LDX $nnnn,Y
;----------------------------------------------------------------------------
doAIY
opLOAD m6502_x
fetch 4
;----------------------------------------------------------------------------
_C0; CPY #$nn
;----------------------------------------------------------------------------
doIMM
opCOMP m6502_y
fetch_c 2
;----------------------------------------------------------------------------
_C1; CMP ($nn,X)
;----------------------------------------------------------------------------
doIIX
opCOMP m6502_a
fetch_c 6
;----------------------------------------------------------------------------
_C4; CPY $nn
;----------------------------------------------------------------------------
doZ
opCOMP m6502_y
fetch_c 3
;----------------------------------------------------------------------------
_C5; CMP $nn
;----------------------------------------------------------------------------
doZ
opCOMP m6502_a
fetch_c 3
;----------------------------------------------------------------------------
_C6; DEC $nn
;----------------------------------------------------------------------------
doZ
opDEC
fetch 5
;----------------------------------------------------------------------------
_C8; INY
;----------------------------------------------------------------------------
add m6502_y,m6502_y,#0x01000000
mov m6502_nz,m6502_y,asr#24
fetch 2
;----------------------------------------------------------------------------
_C9; CMP #$nn
;----------------------------------------------------------------------------
doIMM
opCOMP m6502_a
fetch_c 2
;----------------------------------------------------------------------------
_CA; DEX
;----------------------------------------------------------------------------
sub m6502_x,m6502_x,#0x01000000
mov m6502_nz,m6502_x,asr#24
fetch 2
;----------------------------------------------------------------------------
_CC; CPY $nnnn
;----------------------------------------------------------------------------
doABS
opCOMP m6502_y
fetch_c 4
;----------------------------------------------------------------------------
_CD; CMP $nnnn
;----------------------------------------------------------------------------
doABS
opCOMP m6502_a
fetch_c 4
;----------------------------------------------------------------------------
_CE; DEC $nnnn
;----------------------------------------------------------------------------
doABS
opDEC
fetch 6
;----------------------------------------------------------------------------
_D0; BNE *
;----------------------------------------------------------------------------
tst m6502_nz,#0xff
ldrsb r0,[m6502_pc],#1
addne m6502_pc,m6502_pc,r0
; subne cycles,cycles,#3*CYCLE
subne cycles,cycles,#256
fetch 2
;----------------------------------------------------------------------------
_D1; CMP ($nn),Y
;----------------------------------------------------------------------------
doIIY
opCOMP m6502_a
fetch_c 5
;----------------------------------------------------------------------------
_D5; CMP $nn,X
;----------------------------------------------------------------------------
doZIXf
opCOMP m6502_a
fetch_c 4
;----------------------------------------------------------------------------
_D6; DEC $nn,X
;----------------------------------------------------------------------------
doZIXf
opDEC
fetch 6
;----------------------------------------------------------------------------
_D8; CLD
;----------------------------------------------------------------------------
bic cycles,cycles,#CYC_D
fetch 2
;----------------------------------------------------------------------------
_D9; CMP $nnnn,Y
;----------------------------------------------------------------------------
doAIY
opCOMP m6502_a
fetch_c 4
;----------------------------------------------------------------------------
_DD; CMP $nnnn,X
;----------------------------------------------------------------------------
doAIX
opCOMP m6502_a
fetch_c 4
;----------------------------------------------------------------------------
_DE; DEC $nnnn,X
;----------------------------------------------------------------------------
doAIX
opDEC
fetch 7
;----------------------------------------------------------------------------
_E0; CPX #$nn
;----------------------------------------------------------------------------
doIMM
opCOMP m6502_x
fetch_c 2
;----------------------------------------------------------------------------
_E1; SBC ($nn,X)
;----------------------------------------------------------------------------
doIIX
opSBC
fetch_c 6
;----------------------------------------------------------------------------
_E4; CPX $nn
;----------------------------------------------------------------------------
doZ
opCOMP m6502_x
fetch_c 3
;----------------------------------------------------------------------------
_E5; SBC $nn
;----------------------------------------------------------------------------
doZ
opSBC
fetch_c 3
;----------------------------------------------------------------------------
_E6; INC $nn
;----------------------------------------------------------------------------
doZ
opINC
fetch 5
;----------------------------------------------------------------------------
_E8; INX
;----------------------------------------------------------------------------
add m6502_x,m6502_x,#0x01000000
mov m6502_nz,m6502_x,asr#24
fetch 2
;----------------------------------------------------------------------------
_E9; SBC #$nn
;----------------------------------------------------------------------------
doIMM
opSBC
fetch_c 2
;----------------------------------------------------------------------------
_EA; NOP
;----------------------------------------------------------------------------
fetch 2
;----------------------------------------------------------------------------
_EC; CPX $nnnn
;----------------------------------------------------------------------------
doABS
opCOMP m6502_x
fetch_c 4
;----------------------------------------------------------------------------
_ED; SBC $nnnn
;----------------------------------------------------------------------------
doABS
opSBC
fetch_c 4
;----------------------------------------------------------------------------
_EE; INC $nnnn
;----------------------------------------------------------------------------
doABS
opINC
fetch 6
;----------------------------------------------------------------------------
_F0; BEQ *
;----------------------------------------------------------------------------
tst m6502_nz,#0xff
ldrsb r0,[m6502_pc],#1
addeq m6502_pc,m6502_pc,r0
; subeq cycles,cycles,#3*CYCLE
subeq cycles,cycles,#256
fetch 2
;----------------------------------------------------------------------------
_F1; SBC ($nn),Y
;----------------------------------------------------------------------------
doIIY
opSBC
fetch_c 5
;----------------------------------------------------------------------------
_F5; SBC $nn,X
;----------------------------------------------------------------------------
doZIXf
opSBC
fetch_c 4
;----------------------------------------------------------------------------
_F6; INC $nn,X
;----------------------------------------------------------------------------
doZIXf
opINC
fetch 6
;----------------------------------------------------------------------------
_F8; SED
;----------------------------------------------------------------------------
orr cycles,cycles,#CYC_D
fetch 2
;----------------------------------------------------------------------------
_F9; SBC $nnnn,Y
;----------------------------------------------------------------------------
doAIY
opSBC
fetch_c 4
;----------------------------------------------------------------------------
_FD; SBC $nnnn,X
;----------------------------------------------------------------------------
doAIX
opSBC
fetch_c 4
;----------------------------------------------------------------------------
_FE; INC $nnnn,X
;----------------------------------------------------------------------------
doAIX
opINC
fetch 7
;***********************************************************以下指令是一些HACK游戏需要******************
_FF; ISB $????,X 加的,不确定正确 激龟忍者传2无敌HACK需要
;-------------------------------------------------------------------
doAIX ;MR_AX();
opSBC ;ISB();
;MW_EA(); #define MW_EA() WR6502(EA,DT) // EA .... EFFECTIVE ADDRESS
fetch 5 ;ADD_CYCLE(5); // DT .... DATA
;------------------------------------------------------------------------
_FB; ISB $????,X 加的,不确定正确 激龟忍者传2无敌HACK需要
;-------------------------------------------------------------------
doAIY ;MR_AY();
opSBC ;ISB();
;MW_EA();
fetch 5 ;ADD_CYCLE(5);
;------------------------------------------------------------------------
_14; 加的,不确定正确 激龟忍者传2无敌HACK需要
;-------------------------------------------------------------------
add m6502_pc,m6502_pc,#1 ;R.PC++;
fetch 4 ;ADD_CYCLE(4);
;-------------------------------------------------------------------
_67; // RRA $?? 帝国战机无敌HACK需要
;-------------------------------------------------------------------
doZ ;MR_ZP();
opADC ;RRA();
;MW_ZP();
fetch 5 ;ADD_CYCLE(5);
;--------------------------------------------------------------------
_03; // SLO ($??,X) 帝国战机无敌HACK需要
;-------------------------------------------------------------------
doIIX ;MR_IX();
;SLO();
;MW_EA();
fetch 8; ;ADD_CYCLE(8);
;-----------------------------------------------------------------
_07; // SLO $??
;------------------------------------------------------------------
doZ ;MR_ZP();
;SLO();
;MW_ZP();
fetch 5 ;ADD_CYCLE(5);
;----------------------------------------------------------------------------
IMPORT debug_6502 ;main.c
_xx; ??? ;invalid opcode 无效的操作码
;----------------------------------------------------------------------------
mov r1,#1 ;不用debug可以直接注译这两行
bl debug_6502
fetch 2
;*****************************************************************************************************
AREA cpu_run, CODE, READONLY
run6502 PROC;r0=要运行的cpu周期*256
;----------------------------------------------------------------------------
stmfd sp!,{r4-r11,lr} ;将这几个寄存器中的值保存到堆栈中
ldr globalptr,=cpu_data ;r10 wram_globals: 读取地址
ldr cpu_zpage,=NES_RAM ;r11
ldr cpu_zpage,[cpu_zpage] ;NES_RAM用了指针
adr r1,cpuregs
ldmia r1,{m6502_nz-m6502_pc} ;restore 6502 state恢复6502状态 r3-r9
add cycles,cycles,r0
ldrb r0,cpuirqf ;cpu中断标志
cmp r0,#0x01;
beq CheckI ;EQ 相等(EQual) irq6502;
fetch 0 ;//提取操作码并运行
exit_run
ldrb r0,cpunmif ;cpu中断标志
cmp r0,#0x01;
beq NMI6502 ;EQ 相等(EQual)
exit_nmi
adr r0,cpuregs
stmia r0,{m6502_nz-m6502_pc} ;保存6502状态 r3-r9
ldmfd sp!,{r4-r11,pc} ;exit
ENDP
;***************************************************************************************
NMI6502 PROC;---------------------------
mov r0,#0
str r0,cpunmif;清除cpu中断标志
ldr r12,=NMI_VECTOR ;NMI? addy
bl Vec6502
sub cycles,cycles,#7*256 ;CYCLE=256 6502的中断潜伏期为七 (7) 个周
; 期; 这也就是说需要需要七 (7) 个周期来移入和移出一个中断
b exit_nmi ;return
ENDP
;----------------------------------------------------------------------------
default_scanlinehook
fetch 0
;----------------------------------------------------------
CheckI ;Check Interrupt Disable 检查中断禁用
;----------------------------------------------------------
tst cycles,#CYC_I
bne default_scanlinehook ;we dont want no stinkin irqs 我们不需要没有讨厌的IRQ
;----------------------------------------------------------
irq6502
;----------------------------------------------------------
mov r0,#0
str r0,cpuirqf;清除cpu中断标志
ldr r12,=IRQ_VECTOR
bl Vec6502
fetch 7
;----------------------------------------------------------
Vec6502
;----------------------------------------------------------
ldr r0,lastbank
sub r0,m6502_pc,r0
push16 ;save PC
encodeP (R) ;save P
VecCont
push8 r0
orr cycles,cycles,#CYC_I ;disable IRQ IRQ
ldr r0,memmap_tbl+28 ;7*4
; ldrb m6502_pc,[r0,r12]!
ldrb m6502_pc,[r0,r12] ;在数据传送之前,将偏移量加到Rn 中,其结果作为传送数据的存储地址
;若使用后缀"!",则结果写回到Rn中
add r0,r0,r12 ;R12=0xfffc ;// 复位中断向量地址
ldrb r2,[r0,#1]
orr m6502_pc,m6502_pc,r2,lsl#8
encodePC ;get IRQ vector得到6502 PC ROM的偏移量
bx lr ; 函数返回
;----------------------------------------------------------------------------
CPU_reset PROC ;called by loadcart (r0-r9 are free to use)
;----------------------------------------------------------------------------
str lr,[sp,#-4]!
mov m6502_a,#0
mov m6502_x,#0
mov m6502_y,#0
mov m6502_nz,#0
adr m6502_rmem,readmem_tbl ;把readmem_tbl的地址加载到m6502_rmem
; ldr r0,=NES_RAM+0x100 ;256
ldr r0,=NES_RAM ;NES_RAM用了指针
ldr r0,[r0] ;
add r0,#0x100
str r0,m6502_s ;S=0xFD (0x100-3) 把一个寄存器按字存储到存储器中
;-------------------------------------------------------
mov r0,#0
str r0,cpunmif;清除cpu中断标志
str r0,cpuirqf ;清除cpu中断标志
;------------------------------------------
mov cycles,#0 ;D=0, C=0, V=0, I=1 disable IRQ.
ldr r12,=RES_VECTOR ;// 复位中断向量地址
bl Vec6502
adr r0,cpuregs ;读取地址
stmia r0,{m6502_nz-m6502_pc} ;保存6502状态
ldr r1,=exit_run ;
str r1,nexttimeout ;保存指令执行完后下一步的PC地址
ldr pc,[sp],#4
ENDP
; nop
;-------------------------------------------------------------------------
AREA rwram_code, CODE, READONLY;READWRITE**************************************
;----------------------------------------------------------------------------
;memory
;------------------------------------------------------------------------
empty_R ;读地址不正确read bad address (error)
;----------------------------------------------------------------------------
mov r0,r12
mov r1,#2
bl debug_6502
;----------------------------------
mov r0,#0
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
void PROC;- - - - - - - - -空函数
mov r0,#0
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
ENDP
;----------------------------------------------------------------------------
ram_R ;ram read ($0000-$1FFF)
;----------------------------------------------------------------------------
bic addy,addy,#0x1f800 ;only 0x07FF is RAM
ldrb r0,[cpu_zpage,addy]
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
ram_W ;ram write ($0000-$1FFF)
;----------------------------------------------------------------------------
bic addy,addy,#0x1f800 ;only 0x07FF is RAM
strb r0,[cpu_zpage,addy] ; cpu_zpage RN r11 ;=CPU_RAM
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
sram_R ;sram read ($6000-$7FFF)
;----------------------------------------------------------------------------
sub r1,addy,#0x6000
ldr r2,memmap_tbl+12
; ldrb r0,[cpu_zpage,r1]
ldrb r0,[r2,r1]
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
sram_W ;sram write ($6000-$7FFF)
;----------------------------------------------------------------------------
sub addy,addy,#0x6000
ldr r1,memmap_tbl+12
; strb r0,[cpu_zpage,addy]
strb r0,[r1,addy]
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
rom_R60 ;rom read ($6000-$7FFF)
;----------------------------------------------------------------------------
ldr r1,memmap_tbl+12
ldrb r0,[r1,addy]
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
rom_R80 ;rom read ($8000-$9FFF)
;----------------------------------------------------------------------------
ldr r1,memmap_tbl+16
ldrb r0,[r1,addy]
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
rom_RA0 ;rom read ($A000-$BFFF)
;----------------------------------------------------------------------------
ldr r1,memmap_tbl+20
ldrb r0,[r1,addy]
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
rom_RC0 ;rom read ($C000-$DFFF)
;----------------------------------------------------------------------------
ldr r1,memmap_tbl+24
ldrb r0,[r1,addy]
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
rom_RE0 ;rom read ($E000-$FFFF)
;----------------------------------------------------------------------------
ldr r1,memmap_tbl+28
ldrb r0,[r1,addy]
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
nop
;----------------------------------------------------------------------------
;IO
AREA io_code, CODE, READONLY ;--
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
IO_R ;I/O read
;----------------------------------------------------------------------------
mov r2,#0x4018 ;$4018-$6000
cmp r12,r2
bhi Read_Low ;HI 无符号数大于 C==1 && Z==0
sub r1,r12,#0x4000 ;addy=r12
subs r1,r1,#0x15
bmi empty_R ;读地址不正确 MI 负数(MInus) N==1
cmp r1,#3
; ldrmi pc,[pc,r2,lsl#2]
ldr r2,=io_read_tbl ;//改过加3行
add r2,r2,r1,lsl#2 ;<<2
ldrmi pc,[r2]
b empty_R ;读地址不正确
; nop
io_read_tbl
DCD apu_4015R;void;_4015r ;4015 (sound)
DCD joy0_R ;4016: controller 1
DCD joy1_R ;4017: controller 2
;----------------------------------------------------------------------------
IO_W ;I/O write
;----------------------------------------------------------------------------
mov r2,#0x4018 ;$4018-$6000
cmp r12,r2
bhi Write_Low ;HI 无符号数大于 C==1 && Z==0
sub r1,r12,#0x4000 ;addy=r12
cmp r1,#0x18
; ldrmi pc,[pc,r2,lsl#2]
ldr r2,=io_write_tbl ;//改过加3行
add r2,r2,r1,lsl#2 ;<<2
ldrmi pc,[r2] ;//直接操作pc太他妈危险了
b empty_R ;读地址不正确
nop
io_write_tbl
DCD apu_w;void;_4000w
DCD apu_w;_4001w
DCD apu_w;_4002w
DCD apu_w;_4003w
DCD apu_w;_4004w
DCD apu_w;_4005w
DCD apu_w;_4006w
DCD apu_w;_4007w
DCD apu_w;_4008w
DCD apu_w;void;
DCD apu_w;_400aw
DCD apu_w;void;_400bw
DCD apu_w;void;_400cw
DCD apu_w;void
DCD apu_w;void;_400ew
DCD apu_w;void;_400fw
DCD apu_w;void;_4010w
DCD apu_w;void;_4011w
DCD apu_w;void;_4012w
DCD apu_w;void;_4013w
DCD dma_W ;$4014: Sprite DMA transfer
DCD apu_4015w;void;_4015w ; 声音通道切换
DCD joy0_W ;$4016: Joypad 0 write;joypad_write_ptr
DCD void;joy1_W;$4017: ?
;-------------------------------------------------------------------------------
IMPORT asm_Mapper_ReadLow
Read_Low PROC;$5000-$6000 mapper->MemoryReadLow(addr);
;------------------------------------------------------------------------------
stmfd sp!,{r3,lr} ;LR 寄存器放栈
mov r0,r12
bl asm_Mapper_ReadLow
ldmfd sp!,{r3,lr}
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
ENDP
;-------------------------------------------------------------------------------
IMPORT asm_Mapper_WriteLow
Write_Low PROC;$5000-$6000 mapper->MemoryWriteLow( data, addr);
;------------------------------------------------------------------------------
stmfd sp!,{r3,lr} ;LR 寄存器放栈
mov r1,r12
bl asm_Mapper_WriteLow
ldmfd sp!,{r3,lr}
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
ENDP
;-----------------------------------------------------------------------------
IMPORT Apu_Write ;apu.c
IMPORT Apu_Write4015 ;apu.c
;-----------------------------------------------------------------------------------
apu_w ; 0x4000--0x4013
;---------------------------------------------------------------------------------
stmfd sp!,{r3,lr} ;LR 寄存器放栈
bl Apu_Write
ldmfd sp!,{r3,lr}
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;-----------------------------------------------------------------------------------
apu_4015w
;-------------------------------------------------------------------------
stmfd sp!,{r3,lr} ;LR 寄存器放栈
bl Apu_Write4015
ldmfd sp!,{r3,lr}
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
IMPORT Apu_Read4015 ;apu.c
apu_4015R ;4015
;----------------------------------------------------------------------------------
stmfd sp!,{r3,lr} ;LR 寄存器放栈
add r0,r1,#0x15
bl Apu_Read4015
ldmfd sp!,{r3,lr}
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
dma_W ;(4014) sprite DMA transfer 精灵DMA传输 DMA访问精灵RAM
;通过写一个值xx到这个端口引起CPU内存地址为$xx00$xxFF的区域传送到精灵内存
;----------------------------------------------------------------------------
sub cycles,cycles,#512*256
stmfd sp!,{r3,lr}
and r1,r0,#0xe0
adr r2,memmap_tbl
lsr r1,r1,#3
ldr r2,[r2,r1]
and r0,r0,#0xff
add r2,r2,r0,lsl#8 ;addy r2=DMA source 源
ldr r1,=spr_ram ;r1 DMA的 目的地 ppu.c
ldr r1,[r1] ;spr_ram用了指针
mov r0,#64 ;256/4/8
copy_
subs r0,r0,#1 ;-1
ldr r3,[r2,r0,lsl#2]
str r3,[r1,r0,lsl#2] ;<<2 *4
bne copy_
ldmfd sp!,{r3,lr}
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
IMPORT PADdata
IMPORT PADdata1
joy0_W ;4016 手柄1键值 [7:0]右7 左6 下5 上4 Start3 Select2 B1 A0 )
;----------------------------------------------------------------------------
tst r0,#1 ;01
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bxne lr ;NE 不等NotEqual
ldr r1,=PADdata; //手柄1键值
ldr r1,[r1]
str r1,joy0data
ldr r1,=PADdata1; //手柄1键值
ldr r1,[r1]
str r1,joy1data
bx lr
;-----------------------------------------------------------------------------
joy1_W ;4017 手柄1键值 [7:0]右7 左6 下5 上4 Start3 Select2 B1 A0 )
;----------------------------------------------------------------------------
;tst r0,#1 ; 0??1
;orr lr,#0x01 ;lr最低位置1防止进入arm状态
;bxne lr ;NE 不等NotEqual
bx lr
;----------------------------------------------------------------------------
joy0_R ;4016
;----------------------------------------------------------------------------
ldr r0,joy0data ;串行数据 当前读取位;joy0data是键值
mov r1,r0,lsr#1 ;>>1
str r1,joy0data
and r0,r0,#1 ;&1
orr r0,r0,#0x40 ;|0x40
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;----------------------------------------------------------------------------
joy1_R ;4017
;----------------------------------------------------------------------------
ldr r0,joy1data ;串行数据 当前读取位;joy0data是键值
mov r1,r0,lsr#1 ;>>1
str r1,joy1data
and r0,r0,#1 ;&1
orr r0,r0,#0x40 ;|0x80 0xf8?
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;--------------------------------------------------------------
K6502_Read PROC;apu Rendering DPCM channel #5 r0=APU->ApuC5Address不确定正确*
;---------------------------------------------------------------
EXPORT K6502_Read ;switch ( wAddr & 0xe000 ) apu.c
stmfd sp!,{lr}
mov r1,r0,lsr#13 ;>>13= & 0xe000
ldr r2,=CPU_RAM;;//存储器映象 ram+rom
ldr r1,[r2,r1,lsl#2] ;lookup rom ptr..查找ptr
bic r0,r0,#0xe000 ;and r0,#0x1fff &0x1fff
ldrb r0,[r1,r0]
ldmfd sp!,{lr}
bx lr
ENDP
nop
;------------------------------------------------------------------------
AREA CPU_GPU, CODE, READONLY
IMPORT PPU_WriteToPort ;PPU.c
IMPORT PPU_ReadFromPort ;PPU.c
;------------------------------------------------------------------------------------
PPU_W
stmfd sp!,{r3,lr} ;LR 寄存器放栈
mov r1,r12
bl PPU_WriteToPort
ldmfd sp!,{r3,lr}
orr lr,#0x01 ;lr最低位置1防止进入arm状态
bx lr
;--------------------------------------------------------------------------------------
PPU_R
stmfd sp!,{r3,lr} ;LR 寄存器放栈 会改变R4
mov r0,r12
bl PPU_ReadFromPort
ldmfd sp!,{r3,lr}
orr lr,#0x01
bx lr
nop
;-----------------------------------------------------------------------------------------
AREA cpu_code, DATA, READONLY
;-----------------------------------------------------------------------------------------
op_table ;DCD 用于分配一段字内存单元 op_table内存块起始地址标号
DCD _00,_01,_xx,_03,_xx,_05,_06,_07,_08,_09,_0A,_xx,_xx,_0D,_0E,_xx
DCD _10,_11,_xx,_xx,_14,_15,_16,_xx,_18,_19,_xx,_xx,_xx,_1D,_1E,_xx
DCD _20,_21,_xx,_xx,_24,_25,_26,_xx,_28,_29,_2A,_xx,_2C,_2D,_2E,_xx
DCD _30,_31,_xx,_xx,_xx,_35,_36,_xx,_38,_39,_xx,_xx,_xx,_3D,_3E,_xx
DCD _40,_41,_xx,_xx,_xx,_45,_46,_xx,_48,_49,_4A,_xx,_4C,_4D,_4E,_xx
DCD _50,_51,_xx,_xx,_xx,_55,_56,_xx,_58,_59,_xx,_xx,_xx,_5D,_5E,_xx
DCD _60,_61,_xx,_xx,_xx,_65,_66,_67,_68,_69,_6A,_xx,_6C,_6D,_6E,_xx
DCD _70,_71,_xx,_xx,_xx,_75,_76,_xx,_78,_79,_xx,_xx,_xx,_7D,_7E,_xx
DCD _xx,_81,_xx,_xx,_84,_85,_86,_xx,_88,_xx,_8A,_xx,_8C,_8D,_8E,_xx
DCD _90,_91,_xx,_xx,_94,_95,_96,_xx,_98,_99,_9A,_xx,_xx,_9D,_xx,_xx
DCD _A0,_A1,_A2,_xx,_A4,_A5,_A6,_xx,_A8,_A9,_AA,_xx,_AC,_AD,_AE,_xx
DCD _B0,_B1,_xx,_xx,_B4,_B5,_B6,_xx,_B8,_B9,_BA,_xx,_BC,_BD,_BE,_xx
DCD _C0,_C1,_xx,_xx,_C4,_C5,_C6,_xx,_C8,_C9,_CA,_xx,_CC,_CD,_CE,_xx
DCD _D0,_D1,_xx,_xx,_xx,_D5,_D6,_xx,_D8,_D9,_xx,_xx,_xx,_DD,_DE,_xx
DCD _E0,_E1,_xx,_xx,_E4,_E5,_E6,_xx,_E8,_E9,_EA,_xx,_EC,_ED,_EE,_xx
DCD _F0,_F1,_xx,_xx,_xx,_F5,_F6,_xx,_F8,_F9,_xx,_FB,_xx,_FD,_FE,_FF
;---------------------------------------------------------------------------------
AREA wram_globals0, DATA, READWRITE
;---------------------------------------------------------------------------------
cpu_data
DCD 0 ;opz # 4 //代码表地址
;readmem_tbl
DCD ram_R ;$0000
DCD PPU_R ;$2000
DCD IO_R ;$4000
DCD sram_R ;$6000
DCD rom_R80 ;$8000
DCD rom_RA0 ;$A000
DCD rom_RC0 ;$C000
DCD rom_RE0 ;$E000
;writemem_tbl
DCD ram_W ;$0000
DCD PPU_W ;$2000 r0传参数
DCD IO_W ;$4000
DCD sram_W ;$6000
DCD void ;$8000
DCD void ;$A000
DCD void ;$C000
DCD void ;$E000
CPU_RAM ;memmap_tbl 存储器映象
DCD NES_RAM ;$0000 0000-7fff keep $400 byte aligned for 6502 stack shit
DCD NES_RAM ;$2000 should 保持1024字节对齐
DCD NES_RAM ;$4000 never
DCD NES_SRAM; NES_RAM-0x5800 ;$6000 change改变
rommap % 4*4 ;$8000-FFFF memmap_tbl+16
cpustate
;group these together for save/loadstate
% 7*4 ;cpuregs (nz,c,a,x,y,cycles,pc)
DCD 0 ;m6502_s:
DCD 0 ;lastbank: 最后MEMMAP添加到PC 用于计算当前的PC
DCD 0 ;nexttimeout: jump here when cycles runs out 跳到下一个时钟周期运行
DCD 0 ;rombase # 4 ;//ROM开始地址
DCD 0 ;romnumber # 4 ;//
DCD 0 ;rommask # 4 ;//ROM掩膜 rommask=romsize-1
DCD 0 ;joy0data # 4 ;//手柄1串行数据
DCD 0 ;joy1data # 4 ;//手柄2串行数据
clocks
DCD 0 ;clocksh # 4 ;//执行的时钟数 apu用
cpunmi
DCD 0 ;cpunmif # 4 ;cpu中断标志
cpuirq
DCD 0 ;cpuirqf # 4 ;cpu中断标志
; DCW 0 DCW定义16位变量
;----------------------------------------------------------------------------
; ALIGN ;通过用零或空指令NOP填充来使当前位置与一个指定的边界对齐
END
;align 4