diff options
Diffstat (limited to 'plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.h')
-rw-r--r-- | plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.h | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.h b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.h new file mode 100644 index 00000000..89ce0a95 --- /dev/null +++ b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.h @@ -0,0 +1,91 @@ +// Atari XL/XE SAP core CPU and RAM emulator + +// Game_Music_Emu 0.6-pre +#ifndef SAP_CORE_H +#define SAP_CORE_H + +#include "Sap_Apu.h" +#include "Nes_Cpu.h" + +class Sap_Core { +public: + + // Sound chips and common state + Sap_Apu& apu() { return apu_; } + Sap_Apu& apu2() { return apu2_; } + Sap_Apu_Impl& apu_impl() { return apu_impl_; } + + // Adjusts music tempo, where 1.0 is normal. Can be changed while playing. + void set_tempo( double ); + + // Clears RAM and sets up default vectors, etc. + void setup_ram(); + + // 64K RAM to load file data blocks into + BOOST::uint8_t* ram() { return mem.ram; } + + // Calls init routine and configures playback. RAM must have been + // set up already. + struct info_t { + int init_addr; + int play_addr; + int music_addr; + int type; + int fastplay; + bool stereo; + }; + blargg_err_t start_track( int track, info_t const& ); + + // Ends time frame at time t, then begins new at time 0 + typedef Nes_Cpu::time_t time_t; // Clock count + blargg_err_t end_frame( time_t t ); + + +// Implementation +public: + Sap_Core(); + +private: + enum { base_scanline_period = 114 }; + enum { lines_per_frame = 312 }; + typedef Nes_Cpu::addr_t addr_t; + + time_t scanline_period; + time_t next_play; + time_t time_mask; + time_t frame_start; + Nes_Cpu cpu; + Nes_Cpu::registers_t saved_state; + info_t info; + Sap_Apu apu_; + Sap_Apu apu2_; + + // large items + struct { + BOOST::uint8_t padding1 [ 0x100]; + BOOST::uint8_t ram [0x10000]; + BOOST::uint8_t padding2 [ 0x100]; + } mem; // TODO: put on freestore + Sap_Apu_Impl apu_impl_; + + void push( int b ); + void jsr_then_stop( addr_t ); + void run_routine( addr_t ); + void call_init( int track ); + bool run_cpu( time_t end ); + int play_addr(); + int read_d40b(); + int read_mem( addr_t ); + void write_D2xx( int d2xx, int data ); + + time_t time() const { return cpu.time() & time_mask; } + blargg_err_t run_until( time_t t ); + time_t play_period() const { return info.fastplay * scanline_period; } +}; + +inline void Sap_Core::set_tempo( double t ) +{ + scanline_period = (int) (base_scanline_period / t + 0.5); +} + +#endif |