LMMS
Loading...
Searching...
No Matches
nes_cpu_io.h
Go to the documentation of this file.
1
2#include "Nsf_Emu.h"
3
4#if !NSF_EMU_APU_ONLY
5 #include "Nes_Namco_Apu.h"
6#endif
7
8#include "blargg_source.h"
9
11{
12 int result;
13
14 result = cpu::low_mem [addr & 0x7FF];
15 if ( !(addr & 0xE000) )
16 goto exit;
17
18 result = *cpu::get_code( addr );
19 if ( addr > 0x7FFF )
20 goto exit;
21
22 result = sram [addr & (sizeof sram - 1)];
23 if ( addr > 0x5FFF )
24 goto exit;
25
26 if ( addr == Nes_Apu::status_addr )
27 return apu.read_status( cpu::time() );
28
29 #if !NSF_EMU_APU_ONLY
30 if ( addr == Nes_Namco_Apu::data_reg_addr && namco )
31 return namco->read_data();
32 #endif
33
34 result = addr >> 8; // simulate open bus
35
36 if ( addr != 0x2002 )
37 debug_printf( "Read unmapped $%.4X\n", (unsigned) addr );
38
39exit:
40 return result;
41}
42
44{
45 {
46 nes_addr_t offset = addr ^ sram_addr;
47 if ( offset < sizeof sram )
48 {
49 sram [offset] = data;
50 return;
51 }
52 }
53 {
54 int temp = addr & 0x7FF;
55 if ( !(addr & 0xE000) )
56 {
57 cpu::low_mem [temp] = data;
58 return;
59 }
60 }
61
63 {
64 GME_APU_HOOK( this, addr - Nes_Apu::start_addr, data );
65 apu.write_register( cpu::time(), addr, data );
66 return;
67 }
68
69 unsigned bank = addr - bank_select_addr;
70 if ( bank < bank_count )
71 {
72 blargg_long offset = rom.mask_addr( data * (blargg_long) bank_size );
73 if ( offset >= rom.size() )
74 set_warning( "Invalid bank" );
75 cpu::map_code( (bank + 8) * bank_size, bank_size, rom.at_addr( offset ) );
76 return;
77 }
78
79 cpu_write_misc( addr, data );
80}
81
82#define CPU_READ( cpu, addr, time ) STATIC_CAST(Nsf_Emu&,*cpu).cpu_read( addr )
83#define CPU_WRITE( cpu, addr, data, time ) STATIC_CAST(Nsf_Emu&,*cpu).cpu_write( addr, data )
#define GME_APU_HOOK(emu, addr, data)
Definition Classic_Emu.h:119
unsigned nes_addr_t
Definition Nes_Apu.h:10
#define debug_printf
Definition blargg_source.h:26
@ status_addr
Definition Nes_Apu.h:37
@ start_addr
Definition Nes_Apu.h:32
@ end_addr
Definition Nes_Apu.h:33
void map_code(nes_addr_t start, unsigned size, void const *code, bool mirror=false)
Definition Nes_Cpu.cpp:89
nes_time_t time() const
Definition Nes_Cpu.h:47
uint8_t const * get_code(nes_addr_t)
Definition Nes_Cpu.h:85
uint8_t low_mem[0x800]
Definition Nes_Cpu.h:29
@ data_reg_addr
Definition Nes_Namco_Apu.h:24
@ bank_count
Definition Nsf_Emu.h:65
byte sram[0x2000]
Definition Nsf_Emu.h:102
@ sram_addr
Definition Nsf_Emu.h:101
void cpu_write(nes_addr_t, int)
Definition nes_cpu_io.h:43
void cpu_write_misc(nes_addr_t, int)
Definition Nsf_Emu.cpp:389
int cpu_read(nes_addr_t)
Definition nes_cpu_io.h:10
@ bank_size
Definition Nsf_Emu.h:81
Nes_Apu apu
Definition Nsf_Emu.h:95
class Nes_Namco_Apu * namco
Definition Nsf_Emu.h:92
Rom_Data< bank_size > rom
Definition Nsf_Emu.h:82
@ bank_select_addr
Definition Nsf_Emu.h:80
CARLA_PLUGIN_EXPORT void exit(int status)
Definition interposer-safe.cpp:70
JSAMPIMAGE data
Definition jpeglib.h:945
void set_warning(const char *s)
Definition Gme_File.h:112
int result
Definition process.c:1455