mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-10-05 08:11:51 +02:00
This version adds speed regulation, greatly improves PPU rendering, and increases speed by ~30% over the previous version. Changelog: - Rewrote offset-per-tile mode emulation, should be correct now. Fixes Chrono Trigger, Contra III, Tetris Attack, etc. - Fixed a bug with HDMA occuring during interrupts. Fixes Tales of Phantasia souond test screen - Updated compiler to Visual Studio 2005, and enabled profile guided optimizations - Added conditional compilation of debugging functions (faster without them) - Added conditional compilation of core classes as pointers (allowing polymorphism) or objects (allowing inlining). The latter results in a speed increase - Small fixes to BG and OAM rendering routines - Corrected sprite tile bounds wrapping - Corrected sprite rendering in hires video modes - Rewrote color add/sub routines, should be correct now. Fixes Illusion of Gaia menu, etc. - Optimized video blitting routines, will temporarilly break mixed video mode screenshots - Prevented selecting menu options via return key from being recognized as keypresses by the emulator - Added system speed regulation (60hz/NTSC or 50hz/PAL)! Many thanks to kode54, GIGO, and Richard Bannister for their assistance I disabled the debugger and polymorphism, and enabled profile guided optimizations for this build, to maximize speed. The debugger and polymorphism can be re-enabled via uncommenting the respective #defines in src/base.h and recompiling, or bsnes v0.013 can be used. I may start releasing two separate builds in the future... not sure yet.
70 lines
1.6 KiB
C++
70 lines
1.6 KiB
C++
/*
|
|
[IRQ cycles]
|
|
[0] pbr,pc ; opcode
|
|
[1] pbr,pc ; io
|
|
[2] 0,s ; pbr
|
|
[3] 0,s-1 ; pch
|
|
[4] 0,s-2 ; pcl
|
|
[5] 0,s-3 ; p
|
|
[6] 0,va ; aavl
|
|
[7] 0,va+1 ; aavh
|
|
*/
|
|
void bCPU::irq_run() {
|
|
//WDC documentation is incorrect, first cycle
|
|
//is a memory read fetch from PBR:PC
|
|
switch(status.cycle_pos++) {
|
|
case 0: add_cycles(r_mem->speed(regs.pc.d)); break;
|
|
case 1: add_cycles(6); break;
|
|
case 2: stack_write(regs.pc.b); break;
|
|
case 3: stack_write(regs.pc.h); break;
|
|
case 4: stack_write(regs.pc.l); break;
|
|
case 5: stack_write(regs.p); break;
|
|
case 6: rd.l = op_read(OPMODE_ADDR, aa.w); break;
|
|
case 7: rd.h = op_read(OPMODE_ADDR, aa.w + 1);
|
|
regs.pc.b = 0x00;
|
|
regs.pc.w = rd.w;
|
|
regs.p.i = 1;
|
|
regs.p.d = 0;
|
|
#ifdef DEBUGGER
|
|
//let debugger know the new IRQ opcode address
|
|
snes->notify(SNES::CPU_EXEC_OPCODE_END);
|
|
#endif
|
|
status.cycle_pos = 0;
|
|
run_state.irq = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool bCPU::nmi_test() {
|
|
if(time.nmi_transition == 0)return false;
|
|
time.nmi_transition = 0;
|
|
|
|
run_state.wai = false;
|
|
return true;
|
|
}
|
|
|
|
bool bCPU::irq_test() {
|
|
if(time.irq_transition == 1)goto _true;
|
|
|
|
if(time.irq_read == 0) {
|
|
if(time.irq_line == 1 && (irq_trigger_pos_match(0) || irq_trigger_pos_match(2))) {
|
|
return false;
|
|
}
|
|
goto _true;
|
|
}
|
|
|
|
if(time.irq_line == 0) {
|
|
time.irq_line = 1;
|
|
goto _true;
|
|
}
|
|
|
|
return false;
|
|
|
|
_true:
|
|
time.irq_transition = 0;
|
|
|
|
run_state.wai = false;
|
|
if(regs.p.i)return false;
|
|
return true;
|
|
}
|