diff options
Diffstat (limited to 'plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.h')
-rw-r--r-- | plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.h b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.h new file mode 100644 index 00000000..f5a3ca69 --- /dev/null +++ b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.h @@ -0,0 +1,106 @@ +// Nintendo Game Boy GBS music file emulator core + +// Game_Music_Emu 0.6-pre +#ifndef GBS_CORE_H +#define GBS_CORE_H + +#include "Gme_Loader.h" +#include "Rom_Data.h" +#include "Gb_Cpu.h" +#include "Gb_Apu.h" + +class Gbs_Core : public Gme_Loader { +public: + + // GBS file header + struct header_t + { + enum { size = 112 }; + + char tag [ 3]; + byte vers; + byte track_count; + byte first_track; + byte load_addr [ 2]; + byte init_addr [ 2]; + byte play_addr [ 2]; + byte stack_ptr [ 2]; + byte timer_modulo; + byte timer_mode; + char game [32]; // strings can be 32 chars, NOT terminated + char author [32]; + char copyright [32]; + + // True if header has valid file signature + bool valid_tag() const; + }; + + // Header for currently loaded file + header_t const& header() const { return header_; } + + // Sound chip + Gb_Apu& apu() { return apu_; } + + // Adjusts music tempo, where 1.0 is normal. Can be changed while playing. + void set_tempo( double ); + + // Starts track, where 0 is the first. Uses specified APU mode. + blargg_err_t start_track( int, Gb_Apu::mode_t = Gb_Apu::mode_cgb ); + + // Ends time frame at time t + typedef int time_t; // clock count + blargg_err_t end_frame( time_t t ); + + // Clocks between calls to play routine + time_t play_period() const { return play_period_; } + +protected: + typedef int addr_t; + + // Current time + time_t time() const { return cpu.time() + end_time; } + + // Runs emulator to time t + blargg_err_t run_until( time_t t ); + + // Runs CPU until time becomes >= 0 + void run_cpu(); + + // Reads/writes memory and I/O + int read_mem( addr_t ); + void write_mem( addr_t, int ); + +// Implementation +public: + Gbs_Core(); + ~Gbs_Core(); + virtual void unload(); + +protected: + virtual blargg_err_t load_( Data_Reader& ); + +private: + enum { ram_addr = 0xA000 }; + enum { io_base = 0xFF00 }; + enum { hi_page = io_base - ram_addr }; + + Rom_Data rom; + int tempo; + time_t end_time; + time_t play_period_; + time_t next_play; + header_t header_; + Gb_Cpu cpu; + Gb_Apu apu_; + byte ram [0x4000 + 0x2000 + Gb_Cpu::cpu_padding]; + + void update_timer(); + void jsr_then_stop( byte const [] ); + void set_bank( int n ); + void write_io_inline( int offset, int data, int base ); + void write_io_( int offset, int data ); + int read_io( int offset ); + void write_io( int offset, int data ); +}; + +#endif |