summaryrefslogtreecommitdiff
path: root/apps/codecs/libgme/nes_cpu_io.h
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libgme/nes_cpu_io.h')
-rw-r--r--apps/codecs/libgme/nes_cpu_io.h94
1 files changed, 94 insertions, 0 deletions
diff --git a/apps/codecs/libgme/nes_cpu_io.h b/apps/codecs/libgme/nes_cpu_io.h
new file mode 100644
index 0000000000..4f9d416c2d
--- /dev/null
+++ b/apps/codecs/libgme/nes_cpu_io.h
@@ -0,0 +1,94 @@
1
2#include "nsf_emu.h"
3
4#ifndef NSF_EMU_APU_ONLY
5 #include "nes_namco_apu.h"
6 #include "nes_fds_apu.h"
7 #include "nes_mmc5_apu.h"
8#endif
9
10#include "blargg_source.h"
11
12int Cpu_read( struct Nsf_Emu* this, nes_addr_t addr )
13{
14 int result = this->cpu.low_mem [addr & 0x7FF];
15 if ( addr & 0xE000 )
16 {
17 result = *Cpu_get_code( &this->cpu, addr );
18 if ( addr < sram_addr )
19 {
20 if ( addr == status_addr )
21 result = Apu_read_status( &this->apu, Cpu_time( &this->cpu ) );
22 else
23 {
24 #ifndef NSF_EMU_APU_ONLY
25 if ( namco_enabled( this ) && addr == namco_data_reg_addr )
26 return Namco_read_data( &this->namco );
27
28 if ( fds_enabled( this ) && (unsigned) (addr - fds_io_addr) < fds_io_size )
29 return Fds_read( &this->fds, Cpu_time( &this->cpu ), addr );
30
31 if ( mmc5_enabled( this ) ) {
32 int i = addr - 0x5C00;
33 if ( (unsigned) i < mmc5_exram_size )
34 return this->mmc5.exram [i];
35
36 int m = addr - 0x5205;
37 if ( (unsigned) m < 2 )
38 return (this->mmc5_mul [0] * this->mmc5_mul [1]) >> (m * 8) & 0xFF;
39 }
40 #endif
41 result = addr >> 8; // simulate open bus
42 }
43 }
44 }
45
46 /* if ( addr != 0x2002 )
47 debug_printf( "Read unmapped $%.4X\n", (unsigned) addr ); */
48
49 return result;
50}
51
52void Cpu_write( struct Nsf_Emu* this, nes_addr_t addr, int data )
53{
54 int offset = addr - sram_addr;
55 if ( (unsigned) offset < sram_size )
56 {
57 this->sram [offset] = data;
58 }
59 else
60 {
61 // after sram because cpu handles most low_ram accesses internally already
62 int temp = addr & (low_ram_size-1); // also handles wrap-around
63 if ( !(addr & 0xE000) )
64 {
65 this->cpu.low_mem [temp] = data;
66 }
67 else
68 {
69 int bank = addr - banks_addr;
70 if ( (unsigned) bank < bank_count )
71 {
72 Write_bank( this, bank, data );
73 }
74 else if ( (unsigned) (addr - start_addr) <= end_addr - start_addr )
75 {
76 Apu_write_register( &this->apu, Cpu_time( &this->cpu ), addr, data );
77 }
78 else
79 {
80 #ifndef NSF_EMU_APU_ONLY
81 // 0x8000-0xDFFF is writable
82 int i = addr - 0x8000;
83 if ( fds_enabled( this ) && (unsigned) i < fdsram_size )
84 fdsram( this ) [i] = data;
85 else
86 #endif
87 Cpu_write_misc( this, addr, data );
88 }
89 }
90 }
91}
92
93#define CPU_READ( emu, addr, time ) Cpu_read( emu, addr )
94#define CPU_WRITE( emu, addr, data, time ) Cpu_write( emu, addr, data )