mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-12-11 05:01:09 +00:00
84 lines
1.7 KiB
C
84 lines
1.7 KiB
C
|
|
||
|
#include "Nsf_Emu.h"
|
||
|
|
||
|
#if !NSF_EMU_APU_ONLY
|
||
|
#include "Nes_Namco_Apu.h"
|
||
|
#endif
|
||
|
|
||
|
#include "blargg_source.h"
|
||
|
|
||
|
int Nsf_Emu::cpu_read( nes_addr_t addr )
|
||
|
{
|
||
|
int result;
|
||
|
|
||
|
result = cpu::low_mem [addr & 0x7FF];
|
||
|
if ( !(addr & 0xE000) )
|
||
|
goto exit;
|
||
|
|
||
|
result = *cpu::get_code( addr );
|
||
|
if ( addr > 0x7FFF )
|
||
|
goto exit;
|
||
|
|
||
|
result = sram [addr & (sizeof sram - 1)];
|
||
|
if ( addr > 0x5FFF )
|
||
|
goto exit;
|
||
|
|
||
|
if ( addr == Nes_Apu::status_addr )
|
||
|
return apu.read_status( cpu::time() );
|
||
|
|
||
|
#if !NSF_EMU_APU_ONLY
|
||
|
if ( addr == Nes_Namco_Apu::data_reg_addr && namco )
|
||
|
return namco->read_data();
|
||
|
#endif
|
||
|
|
||
|
result = addr >> 8; // simulate open bus
|
||
|
|
||
|
if ( addr != 0x2002 )
|
||
|
dprintf( "Read unmapped $%.4X\n", (unsigned) addr );
|
||
|
|
||
|
exit:
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
void Nsf_Emu::cpu_write( nes_addr_t addr, int data )
|
||
|
{
|
||
|
{
|
||
|
nes_addr_t offset = addr ^ sram_addr;
|
||
|
if ( offset < sizeof sram )
|
||
|
{
|
||
|
sram [offset] = data;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
{
|
||
|
int temp = addr & 0x7FF;
|
||
|
if ( !(addr & 0xE000) )
|
||
|
{
|
||
|
cpu::low_mem [temp] = data;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( unsigned (addr - Nes_Apu::start_addr) <= Nes_Apu::end_addr - Nes_Apu::start_addr )
|
||
|
{
|
||
|
GME_APU_HOOK( this, addr - Nes_Apu::start_addr, data );
|
||
|
apu.write_register( cpu::time(), addr, data );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
unsigned bank = addr - bank_select_addr;
|
||
|
if ( bank < bank_count )
|
||
|
{
|
||
|
blargg_long offset = rom.mask_addr( data * (blargg_long) bank_size );
|
||
|
if ( offset >= rom.size() )
|
||
|
set_warning( "Invalid bank" );
|
||
|
cpu::map_code( (bank + 8) * bank_size, bank_size, rom.at_addr( offset ) );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
cpu_write_misc( addr, data );
|
||
|
}
|
||
|
|
||
|
#define CPU_READ( cpu, addr, time ) STATIC_CAST(Nsf_Emu&,*cpu).cpu_read( addr )
|
||
|
#define CPU_WRITE( cpu, addr, data, time ) STATIC_CAST(Nsf_Emu&,*cpu).cpu_write( addr, data )
|