diff --git a/Project/Src/NES/6502_gcc.S b/Project/Src/NES/6502_gcc.S index a238c82..5dd9456 100644 --- a/Project/Src/NES/6502_gcc.S +++ b/Project/Src/NES/6502_gcc.S @@ -34,6 +34,7 @@ // BRK +.type _00, %function _00: ldr r0,[globalptr,#lastbank] // 6502PC从 ROM的最后偏移量 sub r1,m6502_pc,r0 @@ -49,56 +50,56 @@ _00: .ltorg // 把常量放在这里 -// ---------------------------------------------------------------------------- +.type _01, %function _01:// ORA ($nn,X) // ---------------------------------------------------------------------------- doIIX opORA fetch 6 -// ---------------------------------------------------------------------------- +.type _05, %function _05:// ORA $nn // ---------------------------------------------------------------------------- doZ opORA fetch 3 -// ---------------------------------------------------------------------------- +.type _06, %function _06:// ASL $nn // ---------------------------------------------------------------------------- doZ opASL fetch_c 5 -// ---------------------------------------------------------------------------- +.type _08, %function _08:// PHP // ---------------------------------------------------------------------------- encodeP (B+R) push8 r0 fetch 3 -// ---------------------------------------------------------------------------- +.type _09, %function _09:// ORA #$nn // ---------------------------------------------------------------------------- doIMM opORA fetch 2 -// ---------------------------------------------------------------------------- +.type _0A, %function _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 -// ---------------------------------------------------------------------------- +.type _0D, %function _0D:// ORA $nnnn // ---------------------------------------------------------------------------- doABS opORA fetch 4 -// ---------------------------------------------------------------------------- +.type _0E, %function _0E:// ASL $nnnn // ---------------------------------------------------------------------------- doABS opASL fetch_c 6 -// ---------------------------------------------------------------------------- +.type _10, %function _10:// BPL * // ---------------------------------------------------------------------------- tst m6502_nz,#0x80000000 @@ -107,48 +108,48 @@ _10:// BPL * addeq m6502_pc,m6502_pc,r0 subeq cycles,cycles,#256 fetch 2 -// ---------------------------------------------------------------------------- +.type _11, %function _11:// ORA ($nn),Y // ---------------------------------------------------------------------------- doIIY opORA fetch 5 -// ---------------------------------------------------------------------------- +.type _15, %function _15:// ORA $nn,X // ---------------------------------------------------------------------------- doZIXf opORA fetch 4 -// ---------------------------------------------------------------------------- +.type _16, %function _16:// ASL $nn,X // ---------------------------------------------------------------------------- doZIXf opASL fetch_c 6 -// ---------------------------------------------------------------------------- +.type _18, %function _18:// CLC // ---------------------------------------------------------------------------- bic cycles,cycles,#CYC_C fetch 2 -// ---------------------------------------------------------------------------- +.type _19, %function _19:// ORA $nnnn,Y // ---------------------------------------------------------------------------- doAIY opORA fetch 4 -// ---------------------------------------------------------------------------- +.type _1D, %function _1D:// ORA $nnnn,X // ---------------------------------------------------------------------------- doAIX opORA fetch 4 -// ---------------------------------------------------------------------------- +.type _1E, %function _1E:// ASL $nnnn,X // ---------------------------------------------------------------------------- doAIX opASL fetch_c 7 -// ---------------------------------------------------------------------------- +.type _20, %function _20:// JSR $nnnn // ---------------------------------------------------------------------------- ldrb r2,[m6502_pc],#1 @@ -159,43 +160,43 @@ _20:// JSR $nnnn push16 encodePC fetch 6 -// ---------------------------------------------------------------------------- +.type _21, %function _21:// AND ($nn,X) // ---------------------------------------------------------------------------- doIIX opAND fetch 6 -// ---------------------------------------------------------------------------- +.type _24, %function _24:// BIT $nn // ---------------------------------------------------------------------------- doZ opBIT fetch 3 -// ---------------------------------------------------------------------------- +.type _25, %function _25:// AND $nn // ---------------------------------------------------------------------------- doZ opAND fetch 3 -// ---------------------------------------------------------------------------- +.type _26, %function _26:// ROL $nn // ---------------------------------------------------------------------------- doZ opROL fetch 5 -// ---------------------------------------------------------------------------- +.type _28, %function _28:// PLP // ---------------------------------------------------------------------------- pop8 r0 decodeP fetch 4 -// ---------------------------------------------------------------------------- +.type _29, %function _29:// AND #$nn // ---------------------------------------------------------------------------- doIMM opAND fetch 2 -// ---------------------------------------------------------------------------- +.type _2A, %function _2A:// ROL // ---------------------------------------------------------------------------- movs cycles,cycles,lsr#1 // get C @@ -206,25 +207,25 @@ _2A:// ROL mov m6502_nz,m6502_a,asr#24 // NZ adc cycles,cycles,cycles // Set C fetch 2 -// ---------------------------------------------------------------------------- +.type _2C, %function _2C:// BIT $nnnn // ---------------------------------------------------------------------------- doABS opBIT fetch 4 -// ---------------------------------------------------------------------------- +.type _2D, %function _2D:// AND $nnnn // ---------------------------------------------------------------------------- doABS opAND fetch 4 -// ---------------------------------------------------------------------------- +.type _2E, %function _2E:// ROL $nnnn // ---------------------------------------------------------------------------- doABS opROL fetch 6 -// ---------------------------------------------------------------------------- +.type _30, %function _30:// BMI * // ---------------------------------------------------------------------------- tst m6502_nz,#0x80000000 @@ -233,48 +234,48 @@ _30:// BMI * addne m6502_pc,m6502_pc,r0 subne cycles,cycles,#256 fetch 2 -// ---------------------------------------------------------------------------- +.type _31, %function _31:// AND ($nn),Y // ---------------------------------------------------------------------------- doIIY opAND fetch 5 -// ---------------------------------------------------------------------------- +.type _35, %function _35:// AND $nn,X // ---------------------------------------------------------------------------- doZIXf opAND fetch 4 -// ---------------------------------------------------------------------------- +.type _36, %function _36:// ROL $nn,X // ---------------------------------------------------------------------------- doZIXf opROL fetch 6 -// ---------------------------------------------------------------------------- +.type _38, %function _38:// SEC // ---------------------------------------------------------------------------- orr cycles,cycles,#CYC_C fetch 2 -// ---------------------------------------------------------------------------- +.type _39, %function _39:// AND $nnnn,Y // ---------------------------------------------------------------------------- doAIY opAND fetch 4 -// ---------------------------------------------------------------------------- +.type _3D, %function _3D:// AND $nnnn,X // ---------------------------------------------------------------------------- doAIX opAND fetch 4 -// ---------------------------------------------------------------------------- +.type _3E, %function _3E:// ROL $nnnn,X // ---------------------------------------------------------------------------- doAIX opROL fetch 7 -// ---------------------------------------------------------------------------- +.type _40, %function _40:// RTI // ---------------------------------------------------------------------------- pop8 r0 // pop 6502 flags and decode @@ -282,44 +283,44 @@ _40:// RTI pop16 // pop the return address encodePC fetch 6 -// ---------------------------------------------------------------------------- +.type _41, %function _41:// EOR ($nn,X) // ---------------------------------------------------------------------------- doIIX opEOR fetch 6 -// ---------------------------------------------------------------------------- +.type _45, %function _45:// EOR $nn // ---------------------------------------------------------------------------- doZ opEOR fetch 3 -// ---------------------------------------------------------------------------- +.type _46, %function _46:// LSR $nn // ---------------------------------------------------------------------------- doZ opLSR fetch_c 5 -// ---------------------------------------------------------------------------- +.type _48, %function _48:// PHA // ---------------------------------------------------------------------------- mov r0,m6502_a,lsr#24 push8 r0 fetch 3 -// ---------------------------------------------------------------------------- +.type _49, %function _49:// EOR #$nn // ---------------------------------------------------------------------------- doIMM opEOR fetch 2 -// ---------------------------------------------------------------------------- +.type _4A, %function _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 -// ---------------------------------------------------------------------------- +.type _4C, %function _4C:// JMP $nnnn // ---------------------------------------------------------------------------- ldrb r0,[m6502_pc],#1 @@ -327,19 +328,19 @@ _4C:// JMP $nnnn orr m6502_pc,r0,r1,lsl#8 encodePC fetch 3 -// ---------------------------------------------------------------------------- +.type _4D, %function _4D:// EOR $nnnn // ---------------------------------------------------------------------------- doABS opEOR fetch 4 -// ---------------------------------------------------------------------------- +.type _4E, %function _4E:// LSR $nnnn // ---------------------------------------------------------------------------- doABS opLSR fetch_c 6 -// ---------------------------------------------------------------------------- +.type _50, %function _50:// BVC * // ---------------------------------------------------------------------------- tst cycles,#CYC_V @@ -348,85 +349,85 @@ _50:// BVC * addeq m6502_pc,m6502_pc,r0 subeq cycles,cycles,#256 fetch 2 -// ---------------------------------------------------------------------------- +.type _51, %function _51:// EOR ($nn),Y // ---------------------------------------------------------------------------- doIIY opEOR fetch 5 -// ---------------------------------------------------------------------------- +.type _55, %function _55:// EOR $nn,X // ---------------------------------------------------------------------------- doZIXf opEOR fetch 4 -// ---------------------------------------------------------------------------- +.type _56, %function _56:// LSR $nn,X // ---------------------------------------------------------------------------- doZIXf opLSR fetch_c 6 -// ---------------------------------------------------------------------------- +.type _58, %function _58:// CLI // ---------------------------------------------------------------------------- bic cycles,cycles,#CYC_I fetch 2 -// ---------------------------------------------------------------------------- +.type _59, %function _59:// EOR $nnnn,Y // ---------------------------------------------------------------------------- doAIY opEOR fetch 4 -// ---------------------------------------------------------------------------- +.type _5D, %function _5D:// EOR $nnnn,X // ---------------------------------------------------------------------------- doAIX opEOR fetch 4 -// ---------------------------------------------------------------------------- +.type _5E, %function _5E:// LSR $nnnn,X // ---------------------------------------------------------------------------- doAIX opLSR fetch_c 7 -// ---------------------------------------------------------------------------- +.type _60, %function _60:// RTS // ---------------------------------------------------------------------------- pop16 add m6502_pc,m6502_pc,#1 encodePC fetch 6 -// ---------------------------------------------------------------------------- +.type _61, %function _61:// ADC ($nn,X) // ---------------------------------------------------------------------------- doIIX opADC fetch_c 6 -// ---------------------------------------------------------------------------- +.type _65, %function _65:// ADC $nn // ---------------------------------------------------------------------------- doZ opADC fetch_c 3 -// ---------------------------------------------------------------------------- +.type _66, %function _66:// ROR $nn // ---------------------------------------------------------------------------- doZ opROR fetch 5 -// ---------------------------------------------------------------------------- +.type _68, %function _68:// PLA // ---------------------------------------------------------------------------- pop8 m6502_nz mov m6502_a,m6502_nz,lsl#24 fetch 4 -// ---------------------------------------------------------------------------- +.type _69, %function _69:// ADC #$nn // ---------------------------------------------------------------------------- doIMM opADC fetch_c 2 -// ---------------------------------------------------------------------------- +.type _6A, %function _6A:// ROR // ---------------------------------------------------------------------------- movs cycles,cycles,lsr#1 // get C @@ -435,7 +436,7 @@ _6A:// ROR and m6502_a,m6502_a,#0xff000000 adc cycles,cycles,cycles // Set C fetch 2 -// ---------------------------------------------------------------------------- +.type _6C, %function _6C:// JMP ($nnnn) JMP ($data16) 间接寻址 ********************************* // ---------------------------------------------------------------------------- doABS @@ -452,19 +453,19 @@ _6C:// JMP ($nnnn) JMP ($data16) orr m6502_pc,m6502_pc,r0,lsl#8 // m6502_pc=r9使用ORR 指令将近R9的高8 位数据移入到R0低8位 encodePC fetch 5 -// ---------------------------------------------------------------------------- +.type _6D, %function _6D:// ADC $nnnn // ---------------------------------------------------------------------------- doABS opADC fetch_c 4 -// ---------------------------------------------------------------------------- +.type _6E, %function _6E:// ROR $nnnn // ---------------------------------------------------------------------------- doABS opROR fetch 6 -// ---------------------------------------------------------------------------- +.type _70, %function _70:// BVS * // ---------------------------------------------------------------------------- tst cycles,#CYC_V @@ -473,102 +474,102 @@ _70:// BVS * addne m6502_pc,m6502_pc,r0 subne cycles,cycles,#256 fetch 2 -// ---------------------------------------------------------------------------- +.type _71, %function _71:// ADC ($nn),Y // ---------------------------------------------------------------------------- doIIY opADC fetch_c 5 -// ---------------------------------------------------------------------------- +.type _75, %function _75:// ADC $nn,X // ---------------------------------------------------------------------------- doZIXf opADC fetch_c 4 -// ---------------------------------------------------------------------------- +.type _76, %function _76:// ROR $nn,X // ---------------------------------------------------------------------------- doZIXf opROR fetch 6 -// ---------------------------------------------------------------------------- +.type _78, %function _78:// SEI // ---------------------------------------------------------------------------- orr cycles,cycles,#CYC_I fetch 2 -// ---------------------------------------------------------------------------- +.type _79, %function _79:// ADC $nnnn,Y // ---------------------------------------------------------------------------- doAIY opADC fetch_c 4 -// ---------------------------------------------------------------------------- +.type _7D, %function _7D:// ADC $nnnn,X // ---------------------------------------------------------------------------- doAIX opADC fetch_c 4 -// ---------------------------------------------------------------------------- +.type _7E, %function _7E:// ROR $nnnn,X // ---------------------------------------------------------------------------- doAIX opROR fetch 7 -// ---------------------------------------------------------------------------- +.type _81, %function _81:// STA ($nn,X) // ---------------------------------------------------------------------------- doIIX opSTORE m6502_a fetch 6 -// ---------------------------------------------------------------------------- +.type _84, %function _84:// STY $nn // ---------------------------------------------------------------------------- doZ opSTORE m6502_y fetch 3 -// ---------------------------------------------------------------------------- +.type _85, %function _85:// STA $nn // ---------------------------------------------------------------------------- doZ opSTORE m6502_a fetch 3 -// ---------------------------------------------------------------------------- +.type _86, %function _86:// STX $nn // ---------------------------------------------------------------------------- doZ opSTORE m6502_x fetch 3 -// ---------------------------------------------------------------------------- +.type _88, %function _88:// DEY // ---------------------------------------------------------------------------- sub m6502_y,m6502_y,#0x01000000 mov m6502_nz,m6502_y,asr#24 fetch 2 -// ---------------------------------------------------------------------------- +.type _8A, %function _8A:// TXA // ---------------------------------------------------------------------------- mov m6502_a,m6502_x mov m6502_nz,m6502_x,asr#24 fetch 2 -// ---------------------------------------------------------------------------- +.type _8C, %function _8C:// STY $nnnn // ---------------------------------------------------------------------------- doABS opSTORE m6502_y fetch 4 -// ---------------------------------------------------------------------------- +.type _8D, %function _8D:// STA $nnnn // ---------------------------------------------------------------------------- doABS opSTORE m6502_a fetch 4 -// ---------------------------------------------------------------------------- +.type _8E, %function _8E:// STX $nnnn // ---------------------------------------------------------------------------- doABS opSTORE m6502_x fetch 4 -// ---------------------------------------------------------------------------- +.type _90, %function _90:// BCC * // ---------------------------------------------------------------------------- tst cycles,#CYC_C // Test Carry @@ -577,127 +578,127 @@ _90:// BCC * addeq m6502_pc,m6502_pc,r0 subeq cycles,cycles,#256 fetch 2 -// ---------------------------------------------------------------------------- +.type _91, %function _91:// STA ($nn),Y // ---------------------------------------------------------------------------- doIIY opSTORE m6502_a fetch 6 -// ---------------------------------------------------------------------------- +.type _94, %function _94:// STY $nn,X // ---------------------------------------------------------------------------- doZIXf opSTORE m6502_y fetch 4 -// ---------------------------------------------------------------------------- +.type _95, %function _95:// STA $nn,X // ---------------------------------------------------------------------------- doZIXf opSTORE m6502_a fetch 4 -// ---------------------------------------------------------------------------- +.type _96, %function _96:// STX $nn,Y // ---------------------------------------------------------------------------- doZIYf opSTORE m6502_x fetch 4 -// ---------------------------------------------------------------------------- +.type _98, %function _98:// TYA // ---------------------------------------------------------------------------- mov m6502_a,m6502_y mov m6502_nz,m6502_y,asr#24 fetch 2 -// ---------------------------------------------------------------------------- +.type _99, %function _99:// STA $nnnn,Y // ---------------------------------------------------------------------------- doAIY opSTORE m6502_a fetch 5 -// ---------------------------------------------------------------------------- +.type _9A, %function _9A:// TXS // ---------------------------------------------------------------------------- mov r0,m6502_x,lsr#24 strb r0,[globalptr,#m6502_s] fetch 2 -// ---------------------------------------------------------------------------- +.type _9D, %function _9D:// STA $nnnn,X // ---------------------------------------------------------------------------- doAIX opSTORE m6502_a fetch 5 -// ---------------------------------------------------------------------------- +.type _A0, %function _A0:// LDY #$nn // ---------------------------------------------------------------------------- doIMM opLOAD m6502_y fetch 2 -// ---------------------------------------------------------------------------- +.type _A1, %function _A1:// LDA ($nn,X) // ---------------------------------------------------------------------------- doIIX opLOAD m6502_a fetch 6 -// ---------------------------------------------------------------------------- +.type _A2, %function _A2:// LDX #$nn // ---------------------------------------------------------------------------- doIMM opLOAD m6502_x fetch 2 -// ---------------------------------------------------------------------------- +.type _A4, %function _A4:// LDY $nn // ---------------------------------------------------------------------------- doZ opLOAD m6502_y fetch 3 -// ---------------------------------------------------------------------------- +.type _A5, %function _A5:// LDA $nn // ---------------------------------------------------------------------------- doZ opLOAD m6502_a fetch 3 -// ---------------------------------------------------------------------------- +.type _A6, %function _A6:// LDX $nn // ---------------------------------------------------------------------------- doZ opLOAD m6502_x fetch 3 -// ---------------------------------------------------------------------------- +.type _A8, %function _A8:// TAY // ---------------------------------------------------------------------------- mov m6502_y,m6502_a mov m6502_nz,m6502_y,asr#24 fetch 2 -// ---------------------------------------------------------------------------- +.type _A9, %function _A9:// LDA #$nn // ---------------------------------------------------------------------------- doIMM opLOAD m6502_a fetch 2 -// ---------------------------------------------------------------------------- +.type _AA, %function _AA:// TAX // ---------------------------------------------------------------------------- mov m6502_x,m6502_a mov m6502_nz,m6502_x,asr#24 fetch 2 -// ---------------------------------------------------------------------------- +.type _AC, %function _AC:// LDY $nnnn // ---------------------------------------------------------------------------- doABS opLOAD m6502_y fetch 4 -// ---------------------------------------------------------------------------- +.type _AD, %function _AD:// LDA $nnnn // ---------------------------------------------------------------------------- doABS opLOAD m6502_a fetch 4 -// ---------------------------------------------------------------------------- +.type _AE, %function _AE:// LDX $nnnn // ---------------------------------------------------------------------------- doABS opLOAD m6502_x fetch 4 -// ---------------------------------------------------------------------------- +.type _B0, %function _B0:// BCS * // ---------------------------------------------------------------------------- tst cycles,#CYC_C // Test Carry @@ -706,133 +707,133 @@ _B0:// BCS * addne m6502_pc,m6502_pc,r0 subne cycles,cycles,#256 fetch 2 -// ---------------------------------------------------------------------------- +.type _B1, %function _B1:// LDA ($nn),Y // ---------------------------------------------------------------------------- doIIY opLOAD m6502_a fetch 5 -// ---------------------------------------------------------------------------- +.type _B4, %function _B4:// LDY $nn,X // ---------------------------------------------------------------------------- doZIX opLOAD m6502_y fetch 4 -// ---------------------------------------------------------------------------- +.type _B5, %function _B5:// LDA $nn,X // ---------------------------------------------------------------------------- doZIX opLOAD m6502_a fetch 4 -// ---------------------------------------------------------------------------- +.type _B6, %function _B6:// LDX $nn,Y // ---------------------------------------------------------------------------- doZIY opLOAD m6502_x fetch 4 -// ---------------------------------------------------------------------------- +.type _B8, %function _B8:// CLV // ---------------------------------------------------------------------------- bic cycles,cycles,#CYC_V fetch 2 -// ---------------------------------------------------------------------------- +.type _B9, %function _B9:// LDA $nnnn,Y // ---------------------------------------------------------------------------- doAIY opLOAD m6502_a fetch 4 -// ---------------------------------------------------------------------------- +.type _BA, %function _BA:// TSX // ---------------------------------------------------------------------------- ldrb m6502_x,[globalptr,#m6502_s] mov m6502_x,m6502_x,lsl#24 mov m6502_nz,m6502_x,asr#24 fetch 2 -// ---------------------------------------------------------------------------- +.type _BC, %function _BC:// LDY $nnnn,X // ---------------------------------------------------------------------------- doAIX opLOAD m6502_y fetch 4 -// ---------------------------------------------------------------------------- +.type _BD, %function _BD:// LDA $nnnn,X // ---------------------------------------------------------------------------- doAIX opLOAD m6502_a fetch 4 -// ---------------------------------------------------------------------------- +.type _BE, %function _BE:// LDX $nnnn,Y // ---------------------------------------------------------------------------- doAIY opLOAD m6502_x fetch 4 -// ---------------------------------------------------------------------------- +.type _C0, %function _C0:// CPY #$nn // ---------------------------------------------------------------------------- doIMM opCOMP m6502_y fetch_c 2 -// ---------------------------------------------------------------------------- +.type _C1, %function _C1:// CMP ($nn,X) // ---------------------------------------------------------------------------- doIIX opCOMP m6502_a fetch_c 6 -// ---------------------------------------------------------------------------- +.type _C4, %function _C4:// CPY $nn // ---------------------------------------------------------------------------- doZ opCOMP m6502_y fetch_c 3 -// ---------------------------------------------------------------------------- +.type _C5, %function _C5:// CMP $nn // ---------------------------------------------------------------------------- doZ opCOMP m6502_a fetch_c 3 -// ---------------------------------------------------------------------------- +.type _C6, %function _C6:// DEC $nn // ---------------------------------------------------------------------------- doZ opDEC fetch 5 -// ---------------------------------------------------------------------------- +.type _C8, %function _C8:// INY // ---------------------------------------------------------------------------- add m6502_y,m6502_y,#0x01000000 mov m6502_nz,m6502_y,asr#24 fetch 2 -// ---------------------------------------------------------------------------- +.type _C9, %function _C9:// CMP #$nn // ---------------------------------------------------------------------------- doIMM opCOMP m6502_a fetch_c 2 -// ---------------------------------------------------------------------------- +.type _CA, %function _CA:// DEX // ---------------------------------------------------------------------------- sub m6502_x,m6502_x,#0x01000000 mov m6502_nz,m6502_x,asr#24 fetch 2 -// ---------------------------------------------------------------------------- +.type _CC, %function _CC:// CPY $nnnn // ---------------------------------------------------------------------------- doABS opCOMP m6502_y fetch_c 4 -// ---------------------------------------------------------------------------- +.type _CD, %function _CD:// CMP $nnnn // ---------------------------------------------------------------------------- doABS opCOMP m6502_a fetch_c 4 -// ---------------------------------------------------------------------------- +.type _CE, %function _CE:// DEC $nnnn // ---------------------------------------------------------------------------- doABS opDEC fetch 6 -// ---------------------------------------------------------------------------- +.type _D0, %function _D0:// BNE * // ---------------------------------------------------------------------------- tst m6502_nz,#0xff @@ -841,112 +842,112 @@ _D0:// BNE * addne m6502_pc,m6502_pc,r0 subne cycles,cycles,#256 fetch 2 -// ---------------------------------------------------------------------------- +.type _D1, %function _D1:// CMP ($nn),Y // ---------------------------------------------------------------------------- doIIY opCOMP m6502_a fetch_c 5 -// ---------------------------------------------------------------------------- +.type _D5, %function _D5:// CMP $nn,X // ---------------------------------------------------------------------------- doZIXf opCOMP m6502_a fetch_c 4 -// ---------------------------------------------------------------------------- +.type _D6, %function _D6:// DEC $nn,X // ---------------------------------------------------------------------------- doZIXf opDEC fetch 6 -// ---------------------------------------------------------------------------- +.type _D8, %function _D8:// CLD // ---------------------------------------------------------------------------- bic cycles,cycles,#CYC_D fetch 2 -// ---------------------------------------------------------------------------- +.type _D9, %function _D9:// CMP $nnnn,Y // ---------------------------------------------------------------------------- doAIY opCOMP m6502_a fetch_c 4 -// ---------------------------------------------------------------------------- +.type _DD, %function _DD:// CMP $nnnn,X // ---------------------------------------------------------------------------- doAIX opCOMP m6502_a fetch_c 4 -// ---------------------------------------------------------------------------- +.type _DE, %function _DE:// DEC $nnnn,X // ---------------------------------------------------------------------------- doAIX opDEC fetch 7 -// ---------------------------------------------------------------------------- +.type _E0, %function _E0:// CPX #$nn // ---------------------------------------------------------------------------- doIMM opCOMP m6502_x fetch_c 2 -// ---------------------------------------------------------------------------- +.type _E1, %function _E1:// SBC ($nn,X) // ---------------------------------------------------------------------------- doIIX opSBC fetch_c 6 -// ---------------------------------------------------------------------------- +.type _E4, %function _E4:// CPX $nn // ---------------------------------------------------------------------------- doZ opCOMP m6502_x fetch_c 3 -// ---------------------------------------------------------------------------- +.type _E5, %function _E5:// SBC $nn // ---------------------------------------------------------------------------- doZ opSBC fetch_c 3 -// ---------------------------------------------------------------------------- +.type _E6, %function _E6:// INC $nn // ---------------------------------------------------------------------------- doZ opINC fetch 5 -// ---------------------------------------------------------------------------- +.type _E8, %function _E8:// INX // ---------------------------------------------------------------------------- add m6502_x,m6502_x,#0x01000000 mov m6502_nz,m6502_x,asr#24 fetch 2 -// ---------------------------------------------------------------------------- +.type _E9, %function _E9:// SBC #$nn // ---------------------------------------------------------------------------- doIMM opSBC fetch_c 2 -// ---------------------------------------------------------------------------- +.type _EA, %function _EA:// NOP // ---------------------------------------------------------------------------- fetch 2 -// ---------------------------------------------------------------------------- +.type _EC, %function _EC:// CPX $nnnn // ---------------------------------------------------------------------------- doABS opCOMP m6502_x fetch_c 4 -// ---------------------------------------------------------------------------- +.type _ED, %function _ED:// SBC $nnnn // ---------------------------------------------------------------------------- doABS opSBC fetch_c 4 -// ---------------------------------------------------------------------------- +.type _EE, %function _EE:// INC $nnnn // ---------------------------------------------------------------------------- doABS opINC fetch 6 -// ---------------------------------------------------------------------------- +.type _F0, %function _F0:// BEQ * // ---------------------------------------------------------------------------- tst m6502_nz,#0xff @@ -955,101 +956,94 @@ _F0:// BEQ * addeq m6502_pc,m6502_pc,r0 subeq cycles,cycles,#256 fetch 2 -// ---------------------------------------------------------------------------- +.type _F1, %function _F1:// SBC ($nn),Y // ---------------------------------------------------------------------------- doIIY opSBC fetch_c 5 -// ---------------------------------------------------------------------------- +.type _F5, %function _F5:// SBC $nn,X // ---------------------------------------------------------------------------- doZIXf opSBC fetch_c 4 -// ---------------------------------------------------------------------------- +.type _F6, %function _F6:// INC $nn,X // ---------------------------------------------------------------------------- doZIXf opINC fetch 6 -// ---------------------------------------------------------------------------- +.type _F8, %function _F8:// SED // ---------------------------------------------------------------------------- orr cycles,cycles,#CYC_D fetch 2 -// ---------------------------------------------------------------------------- +.type _F9, %function _F9:// SBC $nnnn,Y // ---------------------------------------------------------------------------- doAIY opSBC fetch_c 4 -// ---------------------------------------------------------------------------- +.type _FD, %function _FD:// SBC $nnnn,X // ---------------------------------------------------------------------------- doAIX opSBC fetch_c 4 -// ---------------------------------------------------------------------------- +.type _FE, %function _FE:// INC $nnnn,X // ---------------------------------------------------------------------------- doAIX opINC fetch 7 + + // ***********************************************************以下指令是一些HACK游戏需要****************** +.type _FF, %function _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 -// ------------------------------------------------------------------------ + doAIX + opSBC + fetch 5 + +.type _FB, %function _FB:// ISB $????,X 加的,不确定正确 激龟忍者传2无敌HACK需要 -// ------------------------------------------------------------------- - doAIY // MR_AY()// - opSBC // ISB()// - // MW_EA()// - fetch 5 // ADD_CYCLE(5)// -// ------------------------------------------------------------------------ + doAIY + opSBC + fetch 5 + +.type _14, %function _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)// + add m6502_pc,m6502_pc,#1 + fetch 4 -// ---------------------------------------------------------------------------- -_xx:// ??? // invalid opcode 无效的操作码 -// ---------------------------------------------------------------------------- +.type _67, %function +_67:// 帝国战机无敌HACK需要 + doZ + opADC + fetch 5 + +.type _03, %function +_03:// 帝国战机无敌HACK需要 + doIIX + fetch 8 + +.type _07, %function +_07: + doZ + fetch 5 + +.type _xx, %function +_xx: // invalid opcode 无效的操作码 mov r1,#1 // 不用debug可以直接注译这两行 - bl debug_6502 - + bl debug_6502 fetch 2 -@ .thumb_func +.type run6502, %function run6502: stmfd sp!,{r4-r11,lr} // 将这几个寄存器中的值保存到堆栈中 @@ -1066,6 +1060,7 @@ run6502: beq CheckI // EQ 相等(EQual) irq6502; fetch 0 // 提取操作码并运行 +.type exit_run, %function exit_run: ldrb r0,[globalptr,#cpunmif] // cpu中断标志 cmp r0,#0x01; @@ -1074,10 +1069,10 @@ exit_nmi: add r0, globalptr,#cpuregs stmia r0,{m6502_nz-m6502_pc} // 保存6502状态 r3-r9 ldmfd sp!,{r4-r11,pc} // exit -@ .end -@ .thumb_func + + NMI6502: mov r0,#0 str r0,[globalptr,#cpunmif] // 清除cpu中断标志 @@ -1086,7 +1081,7 @@ NMI6502: sub cycles,cycles,#7*256 // CYCLE=256 6502的中断潜伏期为七 (7) 个周 // 期; 这也就是说需要需要七 (7) 个周期来移入和移出一个中断 b exit_nmi // return -@ .end + default_scanlinehook: @@ -1124,7 +1119,7 @@ VecCont: encodePC // get IRQ vector得到6502 PC ROM的偏移量 bx lr -@ .thumb_func +.type CPU_reset, %function CPU_reset: // called by loadcart (r0-r9 are free to use) str lr,[sp,#-4]! mov m6502_a,#0 @@ -1154,10 +1149,11 @@ CPU_reset: // called by loadcart (r0-r9 are free to use) str r1,[globalptr,#nexttimeout] // 保存指令执行完后下一步的PC地址 ldr pc,[sp],#4 -@ .end + +.type empty_R, %function empty_R: // 读地址不正确read bad address (error) mov r0,r12 mov r1,#2 @@ -1166,26 +1162,28 @@ empty_R: // orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr -@ .thumb_func +.type void, %function void: // - - - - - - - - -空函数 mov r0,#0 orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr -@ .end +.type ram_R, %function 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 +.type ram_W, %function 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 +.type sram_R, %function sram_R: // sram read ($6000-$7FFF) sub r1,addy,#0x6000 ldr r2,[globalptr,#memmap_tbl+12] @@ -1193,6 +1191,7 @@ sram_R: // sram read ($6000-$7FFF) orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr +.type sram_W, %function sram_W: // sram write ($6000-$7FFF) sub addy,addy,#0x6000 ldr r1,[globalptr,#memmap_tbl+12] @@ -1200,36 +1199,42 @@ sram_W: // sram write ($6000-$7FFF) orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr +.type rom_R60, %function rom_R60: // rom read ($6000-$7FFF) ldr r1,[globalptr,#memmap_tbl+12] ldrb r0,[r1,addy] orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr +.type rom_R80, %function rom_R80: // rom read ($8000-$9FFF) ldr r1,[globalptr,#memmap_tbl+16] ldrb r0,[r1,addy] orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr +.type rom_RA0, %function rom_RA0: // rom read ($A000-$BFFF) ldr r1,[globalptr,#memmap_tbl+20] ldrb r0,[r1,addy] orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr +.type rom_RC0, %function rom_RC0: // rom read ($C000-$DFFF) ldr r1,[globalptr,#memmap_tbl+24] ldrb r0,[r1,addy] orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr +.type rom_RE0, %function rom_RE0: // ;rom read ($E000-$FFFF) ldr r1,[globalptr,#memmap_tbl+28] ldrb r0,[r1,addy] orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr +.type IO_R, %function IO_R: // I/O read mov r2,#0x4018 // $4018-$6000 cmp r12,r2 @@ -1254,6 +1259,7 @@ io_read_tbl: .word joy1_R // 4017: controller 2 +.type IO_W, %function IO_W: // I/O write mov r2,#0x4018 // $4018-$6000 cmp r12,r2 @@ -1297,7 +1303,7 @@ io_write_tbl: .extern asm_Mapper_ReadLow -@ .thumb_func +.type Read_Low, %function Read_Low: // $5000-$6000 mapper->MemoryReadLow(addr); stmfd sp!,{r3,lr} // LR 寄存器放栈 mov r0,r12 @@ -1305,12 +1311,11 @@ Read_Low: // $5000-$6000 mapper->MemoryReadLow(addr); ldmfd sp!,{r3,lr} orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr -@ .end .extern asm_Mapper_WriteLow -@ .thumb_func +.type Write_Low, %function Write_Low: // $5000-$6000 mapper->MemoryWriteLow( data, addr); stmfd sp!,{r3,lr} // LR 寄存器放栈 mov r1,r12 @@ -1318,12 +1323,12 @@ Write_Low: // $5000-$6000 mapper->MemoryWriteLow( data, addr); ldmfd sp!,{r3,lr} orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr -@ .end .extern Apu_Write .extern Apu_Write4015 +.type apu_w, %function apu_w: // 0x4000--0x4013 stmfd sp!,{r3,lr} // LR 寄存器放栈 bl Apu_Write @@ -1331,6 +1336,7 @@ apu_w: // 0x4000--0x4013 orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr +.type apu_4015w, %function apu_4015w: stmfd sp!,{r3,lr} bl Apu_Write4015 @@ -1341,6 +1347,7 @@ apu_4015w: .extern Apu_Read4015 +.type apu_4015R, %function apu_4015R: stmfd sp!,{r3,lr} add r0,r1,#0x15 @@ -1350,6 +1357,7 @@ apu_4015R: bx lr +.type dma_W, %function dma_W: // (4014) sprite DMA transfer 精灵DMA传输 DMA访问精灵RAM: // 通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存 sub cycles,cycles,#512*256 @@ -1376,6 +1384,7 @@ copy_: .extern PADdata .extern PADdata1 +.type joy0_W, %function joy0_W: // 4016 手柄1键值 [7:0]右7 左6 下5 上4 Start3 Select2 B1 A0 ) tst r0,#1 // 0=写,1=读 orr lr,#0x01 // lr最低位置1防止进入arm状态 @@ -1397,8 +1406,8 @@ joy1_W: // 4017 // bxne lr ;NE 不等(NotEqual) bx lr +.type joy0_R, %function joy0_R: -// 4016 ldr r0,[globalptr,#joy0data] // 串行数据 当前读取位;joy0data是键值 mov r1,r0,lsr#1 // >>1 str r1,[globalptr,#joy0data] @@ -1407,8 +1416,8 @@ joy0_R: orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr +.type joy1_R, %function joy1_R: -// 4017 ldr r0,[globalptr,#joy1data] // 串行数据 当前读取位;joy0data是键值 mov r1,r0,lsr#1 // >>1 str r1,[globalptr,#joy1data] @@ -1418,7 +1427,7 @@ joy1_R: bx lr .global K6502_Read -@ .thumb_func +.type K6502_Read, %function K6502_Read: // apu Rendering DPCM channel #5 r0=APU->ApuC5Address不确定正确* stmfd sp!,{lr} @@ -1429,12 +1438,12 @@ K6502_Read: ldrb r0,[r1,r0] ldmfd sp!,{lr} bx lr -@ .end .extern PPU_WriteToPort .extern PPU_ReadFromPort +.type PPU_W, %function PPU_W: stmfd sp!,{r3,lr} mov r1,r12 @@ -1443,6 +1452,7 @@ PPU_W: orr lr,#0x01 bx lr +.type PPU_R, %function PPU_R: stmfd sp!,{r3,lr} mov r0,r12 diff --git a/Project/Src/NES/6502cart_gcc.S b/Project/Src/NES/6502cart_gcc.S index 722947e..5b16ca9 100644 --- a/Project/Src/NES/6502cart_gcc.S +++ b/Project/Src/NES/6502cart_gcc.S @@ -25,7 +25,7 @@ -@ .thumb_func +.type cpu6502_init, %function cpu6502_init: // 压栈 stmfd sp!,{r4-r11,lr} @@ -87,11 +87,10 @@ cpu6502_init: bl CPU_reset ldmfd sp!,{r4-r11,lr} bx lr -@ .end -// ---------------------------------------------------------------------------- +.type map67_, %function map67_: // rom paging.. r0=page# // ---------------------------------------------------------------------------- ldr r1,[globalptr,#rommask] @@ -101,7 +100,8 @@ map67_: // rom paging.. r0=page# sub r0,r0,#0x6000 str r0,[globalptr,#memmap_tbl+12] b flush -// ---------------------------------------------------------------------------- + +.type map89_, %function map89_: // rom paging.. r0=page# ROM分页 // ---------------------------------------------------------------------------- ldr r1,[globalptr,#rombase] // rom开始地址 @@ -111,7 +111,8 @@ map89_: // rom paging.. r0=page# ROM add r0,r1,r0 str r0,[globalptr,#memmap_tbl+16] b flush -// ---------------------------------------------------------------------------- + +.type mapAB_, %function mapAB_: // ---------------------------------------------------------------------------- ldr r1,[globalptr,#rombase] @@ -121,7 +122,8 @@ mapAB_: add r0,r1,r0 str r0,[globalptr,#memmap_tbl+20] b flush -// ---------------------------------------------------------------------------- + +.type mapCD_, %function mapCD_: // ---------------------------------------------------------------------------- ldr r1,[globalptr,#rombase] @@ -131,7 +133,8 @@ mapCD_: add r0,r1,r0 str r0,[globalptr,#memmap_tbl+24] b flush -// ---------------------------------------------------------------------------- + +.type mapEF_, %function mapEF_: // ---------------------------------------------------------------------------- ldr r1,[globalptr,#rombase] @@ -141,7 +144,8 @@ mapEF_: add r0,r1,r0 str r0,[globalptr,#memmap_tbl+28] b flush -// ---------------------------------------------------------------------------- + +.type map89AB_, %function map89AB_: // ---------------------------------------------------------------------------- ldr r1,[globalptr,#rombase] // rom基地址(不包括头) @@ -165,7 +169,7 @@ flush: // update m6502_pc & lastbank orr lr,#0x01 // lr最低位置1防止进入arm状态 bx lr -// ---------------------------------------------------------------------------- +.type mapCDEF_, %function mapCDEF_: // ---------------------------------------------------------------------------- ldr r1,[globalptr,#rombase] @@ -176,7 +180,8 @@ mapCDEF_: str r0,[globalptr,#memmap_tbl+24] str r0,[globalptr,#memmap_tbl+28] b flush -// ---------------------------------------------------------------------------- + +.type map89ABCDEF_, %function map89ABCDEF_: // ---------------------------------------------------------------------------- ldr r1,[globalptr,#rombase]