📄 nes6502.c
字号:
ADC(4, ABSOLUTE_BYTE); break; case 0x6E: /* ROR $nnnn */ ROR(6, ABSOLUTE, mem_write, addr); break; case 0x6F: /* RRA $nnnn */ RRA(6, ABSOLUTE, mem_write, addr); break; case 0x70: /* BVS $nnnn */ BVS(); break; case 0x71: /* ADC ($nn),Y */ ADC(5, INDIR_Y_BYTE); break; case 0x73: /* RRA ($nn),Y */ RRA(8, INDIR_Y, mem_write, addr); break; case 0x75: /* ADC $nn,X */ ADC(4, ZP_IND_X_BYTE); break; case 0x76: /* ROR $nn,X */ ROR(6, ZP_IND_X, ZP_WRITE, baddr); break; case 0x77: /* RRA $nn,X */ RRA(6, ZP_IND_X, ZP_WRITE, baddr); break; case 0x78: /* SEI */ SEI(); break; case 0x79: /* ADC $nnnn,Y */ ADC(4, ABS_IND_Y_BYTE); break; case 0x7B: /* RRA $nnnn,Y */ RRA(7, ABS_IND_Y, mem_write, addr); break; case 0x7D: /* ADC $nnnn,X */ ADC(4, ABS_IND_X_BYTE); break; case 0x7E: /* ROR $nnnn,X */ ROR(7, ABS_IND_X, mem_write, addr); break; case 0x7F: /* RRA $nnnn,X */ RRA(7, ABS_IND_X, mem_write, addr); break; case 0x80: /* NOP #$nn */ case 0x82: /* NOP #$nn */ case 0x89: /* NOP #$nn */ case 0xC2: /* NOP #$nn */ case 0xE2: /* NOP #$nn */ DOP(2); break; case 0x81: /* STA ($nn,X) */ STA(6, INDIR_X_ADDR, mem_write, addr); break; case 0x83: /* SAX ($nn,X) */ SAX(6, INDIR_X_ADDR, mem_write, addr); break; case 0x84: /* STY $nn */ STY(3, ZERO_PAGE_ADDR, ZP_WRITE, baddr); break; case 0x85: /* STA $nn */ STA(3, ZERO_PAGE_ADDR, ZP_WRITE, baddr); break; case 0x86: /* STX $nn */ STX(3, ZERO_PAGE_ADDR, ZP_WRITE, baddr); break; case 0x87: /* SAX $nn */ SAX(3, ZERO_PAGE_ADDR, ZP_WRITE, baddr); break; case 0x88: /* DEY */ DEY(); break; case 0x8A: /* TXA */ TXA(); break; case 0x8B: /* ANE #$nn */ ANE(2, IMMEDIATE_BYTE); break; case 0x8C: /* STY $nnnn */ STY(4, ABSOLUTE_ADDR, mem_write, addr); break; case 0x8D: /* STA $nnnn */ STA(4, ABSOLUTE_ADDR, mem_write, addr); break; case 0x8E: /* STX $nnnn */ STX(4, ABSOLUTE_ADDR, mem_write, addr); break; case 0x8F: /* SAX $nnnn */ SAX(4, ABSOLUTE_ADDR, mem_write, addr); break; case 0x90: /* BCC $nnnn */ BCC(); break; case 0x91: /* STA ($nn),Y */ STA(6, INDIR_Y_ADDR, mem_write, addr); break; case 0x93: /* SHA ($nn),Y */ SHA(6, INDIR_Y_ADDR, mem_write, addr); break; case 0x94: /* STY $nn,X */ STY(4, ZP_IND_X_ADDR, ZP_WRITE, baddr); break; case 0x95: /* STA $nn,X */ STA(4, ZP_IND_X_ADDR, ZP_WRITE, baddr); break; case 0x96: /* STX $nn,Y */ STX(4, ZP_IND_Y_ADDR, ZP_WRITE, baddr); break; case 0x97: /* SAX $nn,Y */ SAX(4, ZP_IND_Y_ADDR, ZP_WRITE, baddr); break; case 0x98: /* TYA */ TYA(); break; case 0x99: /* STA $nnnn,Y */ STA(5, ABS_IND_Y_ADDR, mem_write, addr); break; case 0x9A: /* TXS */ TXS(); break; case 0x9B: /* SHS $nnnn,Y */ SHS(5, ABS_IND_Y_ADDR, mem_write, addr); break; case 0x9C: /* SHY $nnnn,X */ SHY(5, ABS_IND_X_ADDR, mem_write, addr); break; case 0x9D: /* STA $nnnn,X */ STA(5, ABS_IND_X_ADDR, mem_write, addr); break; case 0x9E: /* SHX $nnnn,Y */ SHX(5, ABS_IND_Y_ADDR, mem_write, addr); break; case 0x9F: /* SHA $nnnn,Y */ SHA(5, ABS_IND_Y_ADDR, mem_write, addr); break; case 0xA0: /* LDY #$nn */ LDY(2, IMMEDIATE_BYTE); break; case 0xA1: /* LDA ($nn,X) */ LDA(6, INDIR_X_BYTE); break; case 0xA2: /* LDX #$nn */ LDX(2, IMMEDIATE_BYTE); break; case 0xA3: /* LAX ($nn,X) */ LAX(6, INDIR_X_BYTE); break; case 0xA4: /* LDY $nn */ LDY(3, ZERO_PAGE_BYTE); break; case 0xA5: /* LDA $nn */ LDA(3, ZERO_PAGE_BYTE); break; case 0xA6: /* LDX $nn */ LDX(3, ZERO_PAGE_BYTE); break; case 0xA7: /* LAX $nn */ LAX(3, ZERO_PAGE_BYTE); break; case 0xA8: /* TAY */ TAY(); break; case 0xA9: /* LDA #$nn */ LDA(2, IMMEDIATE_BYTE); break; case 0xAA: /* TAX */ TAX(); break; case 0xAB: /* LXA #$nn */ LXA(2, IMMEDIATE_BYTE); break; case 0xAC: /* LDY $nnnn */ LDY(4, ABSOLUTE_BYTE); break; case 0xAD: /* LDA $nnnn */ LDA(4, ABSOLUTE_BYTE); break; case 0xAE: /* LDX $nnnn */ LDX(4, ABSOLUTE_BYTE); break; case 0xAF: /* LAX $nnnn */ LAX(4, ABSOLUTE_BYTE); break; case 0xB0: /* BCS $nnnn */ BCS(); break; case 0xB1: /* LDA ($nn),Y */ LDA(5, INDIR_Y_BYTE); break; case 0xB3: /* LAX ($nn),Y */ LAX(5, INDIR_Y_BYTE); break; case 0xB4: /* LDY $nn,X */ LDY(4, ZP_IND_X_BYTE); break; case 0xB5: /* LDA $nn,X */ LDA(4, ZP_IND_X_BYTE); break; case 0xB6: /* LDX $nn,Y */ LDX(4, ZP_IND_Y_BYTE); break; case 0xB7: /* LAX $nn,Y */ LAX(4, ZP_IND_Y_BYTE); break; case 0xB8: /* CLV */ CLV(); break; case 0xB9: /* LDA $nnnn,Y */ LDA(4, ABS_IND_Y_BYTE); break; case 0xBA: /* TSX */ TSX(); break; case 0xBB: /* LAS $nnnn,Y */ LAS(4, ABS_IND_Y_BYTE); break; case 0xBC: /* LDY $nnnn,X */ LDY(4, ABS_IND_X_BYTE); break; case 0xBD: /* LDA $nnnn,X */ LDA(4, ABS_IND_X_BYTE); break; case 0xBE: /* LDX $nnnn,Y */ LDX(4, ABS_IND_Y_BYTE); break; case 0xBF: /* LAX $nnnn,Y */ LAX(4, ABS_IND_Y_BYTE); break; case 0xC0: /* CPY #$nn */ CPY(2, IMMEDIATE_BYTE); break; case 0xC1: /* CMP ($nn,X) */ CMP(6, INDIR_X_BYTE); break; case 0xC3: /* DCP ($nn,X) */ DCP(8, INDIR_X, mem_write, addr); break; case 0xC4: /* CPY $nn */ CPY(3, ZERO_PAGE_BYTE); break; case 0xC5: /* CMP $nn */ CMP(3, ZERO_PAGE_BYTE); break; case 0xC6: /* DEC $nn */ DEC(5, ZERO_PAGE, ZP_WRITE, baddr); break; case 0xC7: /* DCP $nn */ DCP(5, ZERO_PAGE, ZP_WRITE, baddr); break; case 0xC8: /* INY */ INY(); break; case 0xC9: /* CMP #$nn */ CMP(2, IMMEDIATE_BYTE); break; case 0xCA: /* DEX */ DEX(); break; case 0xCB: /* SBX #$nn */ SBX(2, IMMEDIATE_BYTE); break; case 0xCC: /* CPY $nnnn */ CPY(4, ABSOLUTE_BYTE); break; case 0xCD: /* CMP $nnnn */ CMP(4, ABSOLUTE_BYTE); break; case 0xCE: /* DEC $nnnn */ DEC(6, ABSOLUTE, mem_write, addr); break; case 0xCF: /* DCP $nnnn */ DCP(6, ABSOLUTE, mem_write, addr); break; case 0xD0: /* BNE $nnnn */ BNE(); break; case 0xD1: /* CMP ($nn),Y */ CMP(5, INDIR_Y_BYTE); break; case 0xD3: /* DCP ($nn),Y */ DCP(8, INDIR_Y, mem_write, addr); break; case 0xD5: /* CMP $nn,X */ CMP(4, ZP_IND_X_BYTE); break; case 0xD6: /* DEC $nn,X */ DEC(6, ZP_IND_X, ZP_WRITE, baddr); break; case 0xD7: /* DCP $nn,X */ DCP(6, ZP_IND_X, ZP_WRITE, baddr); break; case 0xD8: /* CLD */ CLD(); break; case 0xD9: /* CMP $nnnn,Y */ CMP(4, ABS_IND_Y_BYTE); break; case 0xDB: /* DCP $nnnn,Y */ DCP(7, ABS_IND_Y, mem_write, addr); break; case 0xDD: /* CMP $nnnn,X */ CMP(4, ABS_IND_X_BYTE); break; case 0xDE: /* DEC $nnnn,X */ DEC(7, ABS_IND_X, mem_write, addr); break; case 0xDF: /* DCP $nnnn,X */ DCP(7, ABS_IND_X, mem_write, addr); break; case 0xE0: /* CPX #$nn */ CPX(2, IMMEDIATE_BYTE); break; case 0xE1: /* SBC ($nn,X) */ SBC(6, INDIR_X_BYTE); break; case 0xE3: /* ISB ($nn,X) */ ISB(8, INDIR_X, mem_write, addr); break; case 0xE4: /* CPX $nn */ CPX(3, ZERO_PAGE_BYTE); break; case 0xE5: /* SBC $nn */ SBC(3, ZERO_PAGE_BYTE); break; case 0xE6: /* INC $nn */ INC(5, ZERO_PAGE, ZP_WRITE, baddr); break; case 0xE7: /* ISB $nn */ ISB(5, ZERO_PAGE, ZP_WRITE, baddr); break; case 0xE8: /* INX */ INX(); break; case 0xE9: /* SBC #$nn */ case 0xEB: /* USBC #$nn */ SBC(2, IMMEDIATE_BYTE); break; case 0xEA: /* NOP */ NOP(); break; case 0xEC: /* CPX $nnnn */ CPX(4, ABSOLUTE_BYTE); break; case 0xED: /* SBC $nnnn */ SBC(4, ABSOLUTE_BYTE); break; case 0xEE: /* INC $nnnn */ INC(6, ABSOLUTE, mem_write, addr); break; case 0xEF: /* ISB $nnnn */ ISB(6, ABSOLUTE, mem_write, addr); break; case 0xF0: /* BEQ $nnnn */ BEQ(); break; case 0xF1: /* SBC ($nn),Y */ SBC(5, INDIR_Y_BYTE); break; case 0xF3: /* ISB ($nn),Y */ ISB(8, INDIR_Y, mem_write, addr); break; case 0xF5: /* SBC $nn,X */ SBC(4, ZP_IND_X_BYTE); break; case 0xF6: /* INC $nn,X */ INC(6, ZP_IND_X, ZP_WRITE, baddr); break; case 0xF7: /* ISB $nn,X */ ISB(6, ZP_IND_X, ZP_WRITE, baddr); break; case 0xF8: /* SED */ SED(); break; case 0xF9: /* SBC $nnnn,Y */ SBC(4, ABS_IND_Y_BYTE); break; case 0xFB: /* ISB $nnnn,Y */ ISB(7, ABS_IND_Y, mem_write, addr); break; case 0xFD: /* SBC $nnnn,X */ SBC(4, ABS_IND_X_BYTE); break; case 0xFE: /* INC $nnnn,X */ INC(7, ABS_IND_X, mem_write, addr); break; case 0xFF: /* ISB $nnnn,X */ ISB(7, ABS_IND_X, mem_write, addr); break; } /* Calculate remaining/elapsed clock cycles */ remaining_cycles -= instruction_cycles; total_cycles += instruction_cycles; }_execute_done: /* restore local copy of regs */ SET_LOCAL_REGS(); /* Return our actual amount of executed cycles */ return (total_cycles - old_cycles);}/* Initialize tables, etc. */void nes6502_init(void){ int index; /* Build the N / Z flag lookup table */ flag_table[0] = Z_FLAG; for (index = 1; index < 256; index++) flag_table[index] = (index & 0x80) ? N_FLAG : 0; reg_A = reg_X = reg_Y = 0; reg_S = 0xFF; /* Stack grows down */}/* Issue a CPU Reset */void nes6502_reset(void){ reg_P = Z_FLAG | R_FLAG | I_FLAG; /* Reserved bit always 1 */ int_pending = dma_cycles = 0; /* No pending interrupts */ reg_PC = bank_readaddress(RESET_VECTOR); /* Fetch reset vector */ /* TODO: 6 cycles for RESET? */}/* Non-maskable interrupt */void nes6502_nmi(void){ int_pending |= NMI_MASK;}/* Interrupt request */void nes6502_irq(void){ int_pending |= IRQ_MASK;}/* Set dma period (in cycles) */void nes6502_setdma(int cycles){ dma_cycles += cycles;}/*** $Log: nes6502.c,v $** Revision 1.2 2003/01/09 19:50:03 jkeil** NSF audio files were crashing on SPARC.**** - Define the correct HOST_ENDIAN for SPARC** - remove unaligned memory accesses**** Revision 1.1 2003/01/08 07:04:35 tmmm** initial import of Nosefart sources**** Revision 1.6 2000/07/04 04:50:07 matt** minor change to includes**** Revision 1.5 2000/07/03 02:18:16 matt** added a few notes about potential failure cases**** Revision 1.4 2000/06/09 15:12:25 matt** initial revision***/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -