cog/Frameworks/GME/gme/Sgc_Impl.h

117 lines
2.9 KiB
C++

// Sega/Game Gear/Coleco SGC music file emulator implementation internals
// Game_Music_Emu $vers
#ifndef SGC_IMPL_H
#define SGC_IMPL_H
#include "Gme_Loader.h"
#include "Rom_Data.h"
#include "Z80_Cpu.h"
class Sgc_Impl : public Gme_Loader {
public:
// SGC file header
struct header_t
{
enum { size = 0xA0 };
char tag [4]; // "SGC\x1A"
byte vers; // 0x01
byte rate; // 0=NTSC 1=PAL
byte reserved1 [2];
byte load_addr [2];
byte init_addr [2];
byte play_addr [2];
byte stack_ptr [2];
byte reserved2 [2];
byte rst_addrs [7*2];
byte mapping [4]; // Used by Sega only
byte first_song; // Song to start playing first
byte song_count;
byte first_effect;
byte last_effect;
byte system; // 0=Master System 1=Game Gear 2=Colecovision
byte reserved3 [23];
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;
int effect_count() const { return last_effect ? last_effect - first_effect + 1 : 0; }
};
// Header for currently loaded file
header_t const& header() const { return header_; }
Rom_Data const& rom_() const { return rom; }
int clock_rate() const { return header_.rate ? 3546893 : 3579545; }
// 0x2000 bytes
static void set_coleco_bios( void const* p ) { coleco_bios = p; }
// Clocks between calls to play routine
typedef int time_t;
void set_play_period( time_t p ) { play_period = p; }
// 0 = first track
blargg_err_t start_track( int );
// Runs for t clocks
blargg_err_t end_frame( time_t t );
// True if Master System or Game Gear
bool sega_mapping() const;
protected:
typedef Z80_Cpu Sgc_Cpu;
Sgc_Cpu cpu;
typedef int addr_t;
virtual void cpu_out( time_t, addr_t, int data ) BLARGG_PURE( ; )
// Implementation
public:
Sgc_Impl();
~Sgc_Impl();
virtual void unload();
protected:
virtual blargg_err_t load_( Data_Reader& );
private:
enum { bank_size = 0x4000 };
Rom_Data rom;
time_t play_period;
time_t next_play;
void const* bank2; // ROM selected for bank 2, in case RAM is currently hiding it
addr_t vectors_addr; // RST vectors start here
addr_t idle_addr; // return address for init/play routines
static void const* coleco_bios;
// large items
header_t header_;
blargg_vector<byte> vectors;
blargg_vector<byte> ram;
blargg_vector<byte> ram2;
blargg_vector<byte> unmapped_write;
bool run_cpu( time_t end );
void jsr( byte const (&addr) [2] );
void cpu_write( addr_t, int data );
int cpu_in( addr_t );
void set_bank( int bank, void const* data );
};
inline bool Sgc_Impl::sega_mapping() const
{
return header_.system <= 1;
}
#endif