/gme/Kss_Emu.h

http://game-music-emu.googlecode.com/ · C++ Header · 96 lines · 77 code · 14 blank · 5 comment · 0 complexity · 4be95c9ce432bfab6a41180abe7cbf30 MD5 · raw file

  1. // MSX computer KSS music file emulator
  2. // Game_Music_Emu 0.5.5
  3. #ifndef KSS_EMU_H
  4. #define KSS_EMU_H
  5. #include "Classic_Emu.h"
  6. #include "Kss_Scc_Apu.h"
  7. #include "Kss_Cpu.h"
  8. #include "Sms_Apu.h"
  9. #include "Ay_Apu.h"
  10. class Kss_Emu : private Kss_Cpu, public Classic_Emu {
  11. typedef Kss_Cpu cpu;
  12. public:
  13. // KSS file header
  14. enum { header_size = 0x10 };
  15. struct header_t
  16. {
  17. byte tag [4];
  18. byte load_addr [2];
  19. byte load_size [2];
  20. byte init_addr [2];
  21. byte play_addr [2];
  22. byte first_bank;
  23. byte bank_mode;
  24. byte extra_header;
  25. byte device_flags;
  26. };
  27. enum { ext_header_size = 0x10 };
  28. struct ext_header_t
  29. {
  30. byte data_size [4];
  31. byte unused [4];
  32. byte first_track [2];
  33. byte last_tack [2];
  34. byte psg_vol;
  35. byte scc_vol;
  36. byte msx_music_vol;
  37. byte msx_audio_vol;
  38. };
  39. struct composite_header_t : header_t, ext_header_t { };
  40. // Header for currently loaded file
  41. composite_header_t const& header() const { return header_; }
  42. static gme_type_t static_type() { return gme_kss_type; }
  43. public:
  44. Kss_Emu();
  45. ~Kss_Emu();
  46. protected:
  47. blargg_err_t track_info_( track_info_t*, int track ) const;
  48. blargg_err_t load_( Data_Reader& );
  49. blargg_err_t start_track_( int );
  50. blargg_err_t run_clocks( blip_time_t&, int );
  51. void set_tempo_( double );
  52. void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
  53. void update_eq( blip_eq_t const& );
  54. void unload();
  55. private:
  56. Rom_Data<page_size> rom;
  57. composite_header_t header_;
  58. bool scc_accessed;
  59. bool gain_updated;
  60. void update_gain();
  61. unsigned scc_enabled; // 0 or 0xC000
  62. byte const* bank_data;
  63. int bank_count;
  64. void set_bank( int logical, int physical );
  65. blargg_long bank_size() const { return (16 * 1024L) >> (header_.bank_mode >> 7 & 1); }
  66. blip_time_t play_period;
  67. blip_time_t next_play;
  68. int ay_latch;
  69. friend void kss_cpu_out( class Kss_Cpu*, cpu_time_t, unsigned addr, int data );
  70. friend int kss_cpu_in( class Kss_Cpu*, cpu_time_t, unsigned addr );
  71. void cpu_write( unsigned addr, int data );
  72. friend void kss_cpu_write( class Kss_Cpu*, unsigned addr, int data );
  73. // large items
  74. enum { mem_size = 0x10000 };
  75. byte ram [mem_size + cpu_padding];
  76. Ay_Apu ay;
  77. Scc_Apu scc;
  78. Sms_Apu* sn;
  79. byte unmapped_read [0x100];
  80. byte unmapped_write [page_size];
  81. };
  82. #endif