/gme/gb_cpu_io.h

http://game-music-emu.googlecode.com/ · C Header · 72 lines · 61 code · 9 blank · 2 comment · 21 complexity · 6c8fad2ed5fe8be2474761ae8a843e37 MD5 · raw file

  1. #include "Gbs_Emu.h"
  2. #include "blargg_source.h"
  3. int Gbs_Emu::cpu_read( gb_addr_t addr )
  4. {
  5. int result = *cpu::get_code( addr );
  6. if ( unsigned (addr - Gb_Apu::start_addr) < Gb_Apu::register_count )
  7. result = apu.read_register( clock(), addr );
  8. #ifndef NDEBUG
  9. else if ( unsigned (addr - 0x8000) < 0x2000 || unsigned (addr - 0xE000) < 0x1F00 )
  10. debug_printf( "Read from unmapped memory $%.4x\n", (unsigned) addr );
  11. else if ( unsigned (addr - 0xFF01) < 0xFF80 - 0xFF01 )
  12. debug_printf( "Unhandled I/O read 0x%4X\n", (unsigned) addr );
  13. #endif
  14. return result;
  15. }
  16. void Gbs_Emu::cpu_write( gb_addr_t addr, int data )
  17. {
  18. unsigned offset = addr - ram_addr;
  19. if ( offset <= 0xFFFF - ram_addr )
  20. {
  21. ram [offset] = data;
  22. if ( (addr ^ 0xE000) <= 0x1F80 - 1 )
  23. {
  24. if ( unsigned (addr - Gb_Apu::start_addr) < Gb_Apu::register_count )
  25. {
  26. GME_APU_HOOK( this, addr - Gb_Apu::start_addr, data );
  27. apu.write_register( clock(), addr, data );
  28. }
  29. else if ( (addr ^ 0xFF06) < 2 )
  30. update_timer();
  31. else if ( addr == joypad_addr )
  32. ram [offset] = 0; // keep joypad return value 0
  33. else
  34. ram [offset] = 0xFF;
  35. //if ( addr == 0xFFFF )
  36. // debug_printf( "Wrote interrupt mask\n" );
  37. }
  38. }
  39. else if ( (addr ^ 0x2000) <= 0x2000 - 1 )
  40. {
  41. set_bank( data );
  42. }
  43. #ifndef NDEBUG
  44. else if ( unsigned (addr - 0x8000) < 0x2000 || unsigned (addr - 0xE000) < 0x1F00 )
  45. {
  46. debug_printf( "Wrote to unmapped memory $%.4x\n", (unsigned) addr );
  47. }
  48. #endif
  49. }
  50. #define CPU_READ_FAST( cpu, addr, time, out ) \
  51. CPU_READ_FAST_( STATIC_CAST(Gbs_Emu*,cpu), addr, time, out )
  52. #define CPU_READ_FAST_( emu, addr, time, out ) \
  53. {\
  54. out = READ_PROG( addr );\
  55. if ( unsigned (addr - Gb_Apu::start_addr) < Gb_Apu::register_count )\
  56. out = emu->apu.read_register( emu->cpu_time - time * clocks_per_instr, addr );\
  57. else\
  58. check( out == emu->cpu_read( addr ) );\
  59. }
  60. #define CPU_READ( cpu, addr, time ) \
  61. STATIC_CAST(Gbs_Emu*,cpu)->cpu_read( addr )
  62. #define CPU_WRITE( cpu, addr, data, time ) \
  63. STATIC_CAST(Gbs_Emu*,cpu)->cpu_write( addr, data )