/gme/nes_cpu_io.h

http://game-music-emu.googlecode.com/ · C Header · 83 lines · 66 code · 17 blank · 0 comment · 15 complexity · 66e97e756901102dd0a686a20215d0d3 MD5 · raw file

  1. #include "Nsf_Emu.h"
  2. #if !NSF_EMU_APU_ONLY
  3. #include "Nes_Namco_Apu.h"
  4. #endif
  5. #include "blargg_source.h"
  6. int Nsf_Emu::cpu_read( nes_addr_t addr )
  7. {
  8. int result;
  9. result = cpu::low_mem [addr & 0x7FF];
  10. if ( !(addr & 0xE000) )
  11. goto exit;
  12. result = *cpu::get_code( addr );
  13. if ( addr > 0x7FFF )
  14. goto exit;
  15. result = sram [addr & (sizeof sram - 1)];
  16. if ( addr > 0x5FFF )
  17. goto exit;
  18. if ( addr == Nes_Apu::status_addr )
  19. return apu.read_status( cpu::time() );
  20. #if !NSF_EMU_APU_ONLY
  21. if ( addr == Nes_Namco_Apu::data_reg_addr && namco )
  22. return namco->read_data();
  23. #endif
  24. result = addr >> 8; // simulate open bus
  25. if ( addr != 0x2002 )
  26. debug_printf( "Read unmapped $%.4X\n", (unsigned) addr );
  27. exit:
  28. return result;
  29. }
  30. void Nsf_Emu::cpu_write( nes_addr_t addr, int data )
  31. {
  32. {
  33. nes_addr_t offset = addr ^ sram_addr;
  34. if ( offset < sizeof sram )
  35. {
  36. sram [offset] = data;
  37. return;
  38. }
  39. }
  40. {
  41. int temp = addr & 0x7FF;
  42. if ( !(addr & 0xE000) )
  43. {
  44. cpu::low_mem [temp] = data;
  45. return;
  46. }
  47. }
  48. if ( unsigned (addr - Nes_Apu::start_addr) <= Nes_Apu::end_addr - Nes_Apu::start_addr )
  49. {
  50. GME_APU_HOOK( this, addr - Nes_Apu::start_addr, data );
  51. apu.write_register( cpu::time(), addr, data );
  52. return;
  53. }
  54. unsigned bank = addr - bank_select_addr;
  55. if ( bank < bank_count )
  56. {
  57. blargg_long offset = rom.mask_addr( data * (blargg_long) bank_size );
  58. if ( offset >= rom.size() )
  59. set_warning( "Invalid bank" );
  60. cpu::map_code( (bank + 8) * bank_size, bank_size, rom.at_addr( offset ) );
  61. return;
  62. }
  63. cpu_write_misc( addr, data );
  64. }
  65. #define CPU_READ( cpu, addr, time ) STATIC_CAST(Nsf_Emu&,*cpu).cpu_read( addr )
  66. #define CPU_WRITE( cpu, addr, data, time ) STATIC_CAST(Nsf_Emu&,*cpu).cpu_write( addr, data )