summaryrefslogtreecommitdiff
path: root/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.h')
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.h70
1 files changed, 70 insertions, 0 deletions
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.h
new file mode 100644
index 00000000..ba8445d3
--- /dev/null
+++ b/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.h
@@ -0,0 +1,70 @@
+// Sinclair Spectrum AY music file emulator
+
+// Game_Music_Emu 0.5.2
+#ifndef AY_EMU_H
+#define AY_EMU_H
+
+#include "Classic_Emu.h"
+#include "Ay_Apu.h"
+#include "Ay_Cpu.h"
+
+class Ay_Emu : private Ay_Cpu, public Classic_Emu {
+ typedef Ay_Cpu cpu;
+public:
+ // AY file header
+ enum { header_size = 0x14 };
+ struct header_t
+ {
+ byte tag [8];
+ byte vers;
+ byte player;
+ byte unused [2];
+ byte author [2];
+ byte comment [2];
+ byte max_track;
+ byte first_track;
+ byte track_info [2];
+ };
+
+ static gme_type_t static_type() { return gme_ay_type; }
+public:
+ Ay_Emu();
+ ~Ay_Emu();
+ struct file_t {
+ header_t const* header;
+ byte const* end;
+ byte const* tracks;
+ };
+protected:
+ blargg_err_t track_info_( track_info_t*, int track ) const;
+ blargg_err_t load_mem_( byte const*, long );
+ blargg_err_t start_track_( int );
+ blargg_err_t run_clocks( blip_time_t&, int );
+ void set_tempo_( double );
+ void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
+ void update_eq( blip_eq_t const& );
+private:
+ file_t file;
+
+ unsigned play_addr;
+ cpu_time_t play_period;
+ cpu_time_t next_play;
+ Blip_Buffer* beeper_output;
+ int beeper_delta;
+ int last_beeper;
+ int apu_addr;
+ int cpc_latch;
+ bool spectrum_mode;
+ bool cpc_mode;
+
+ // large items
+ struct {
+ byte padding1 [0x100];
+ byte ram [0x10000 + 0x100];
+ } mem;
+ Ay_Apu apu;
+ friend void ay_cpu_out( Ay_Cpu*, cpu_time_t, unsigned addr, int data );
+ void cpu_out_misc( cpu_time_t, unsigned addr, int data );
+};
+
+#endif