starting SMS work

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@756 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2009-08-16 13:00:07 +00:00
parent d8f51995c4
commit 3e49ffd0bf
10 changed files with 246 additions and 80 deletions

View file

@ -13,7 +13,7 @@
#include "../unzip/unzip_stream.h"
static char *rom_exts[] = { "bin", "gen", "smd", "iso" };
static const char *rom_exts[] = { "bin", "gen", "smd", "iso", "sms", "gg", "sg" };
void (*PicoCartUnloadHook)(void) = NULL;
@ -99,7 +99,10 @@ pm_file *pm_open(const char *path)
if (zipentry->uncompressed_size >= 128*1024) goto found_rom_zip;
if (strlen(zipentry->name) < 5) continue;
ext = zipentry->name+strlen(zipentry->name)-3;
ext = zipentry->name + strlen(zipentry->name) - 2;
if (ext[-1] != '.') ext--;
if (ext[-1] != '.') ext--;
for (i = 0; i < sizeof(rom_exts)/sizeof(rom_exts[0]); i++)
if (strcasecmp(ext, rom_exts[i]) == 0) goto found_rom_zip;
}
@ -437,7 +440,7 @@ static unsigned char *PicoCartAlloc(int filesize)
return rom;
}
int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize)
int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize,int is_sms)
{
unsigned char *rom=NULL; int size, bytes_read;
if (f==NULL) return 1;
@ -478,19 +481,22 @@ int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize)
return 3;
}
// maybe we are loading MegaCD BIOS?
if (!(PicoAHW & PAHW_MCD) && size == 0x20000 && (!strncmp((char *)rom+0x124, "BOOT", 4) ||
!strncmp((char *)rom+0x128, "BOOT", 4))) {
PicoAHW |= PAHW_MCD;
rom = cd_realloc(rom, size);
}
if (!is_sms)
{
// maybe we are loading MegaCD BIOS?
if (!(PicoAHW & PAHW_MCD) && size == 0x20000 && (!strncmp((char *)rom+0x124, "BOOT", 4) ||
!strncmp((char *)rom+0x128, "BOOT", 4))) {
PicoAHW |= PAHW_MCD;
rom = cd_realloc(rom, size);
}
// Check for SMD:
if (size >= 0x4200 && (size&0x3fff)==0x200 &&
((rom[0x2280] == 'S' && rom[0x280] == 'E') || (rom[0x280] == 'S' && rom[0x2281] == 'E'))) {
DecodeSmd(rom,size); size-=0x200; // Decode and byteswap SMD
// Check for SMD:
if (size >= 0x4200 && (size&0x3fff)==0x200 &&
((rom[0x2280] == 'S' && rom[0x280] == 'E') || (rom[0x280] == 'S' && rom[0x2281] == 'E'))) {
DecodeSmd(rom,size); size-=0x200; // Decode and byteswap SMD
}
else Byteswap(rom,size); // Just byteswap
}
else Byteswap(rom,size); // Just byteswap
if (prom) *prom=rom;
if (psize) *psize=size;
@ -520,7 +526,7 @@ int PicoCartInsert(unsigned char *rom,unsigned int romsize)
PicoCartUnloadHook = NULL;
}
PicoAHW &= PAHW_MCD;
PicoAHW &= PAHW_MCD|PAHW_SMS;
PicoMemResetHooks();
PicoDmaHook = NULL;
@ -531,7 +537,7 @@ int PicoCartInsert(unsigned char *rom,unsigned int romsize)
PicoMemReset();
if (!(PicoAHW & PAHW_MCD))
if (!(PicoAHW & (PAHW_MCD|PAHW_SMS)))
PicoCartDetect();
// setup correct memory map for loaded ROM
@ -543,15 +549,25 @@ int PicoCartInsert(unsigned char *rom,unsigned int romsize)
case PAHW_SVP: PicoMemSetup(); break;
case PAHW_MCD: PicoMemSetupCD(); break;
case PAHW_PICO: PicoMemSetupPico(); break;
case PAHW_SMS: PicoMemSetupMS(); break;
}
PicoMemReset();
PicoPower();
if (PicoAHW & PAHW_SMS)
PicoPowerMS();
else
PicoPower();
return 0;
}
void PicoCartUnload(void)
{
if (PicoCartUnloadHook != NULL) {
PicoCartUnloadHook();
PicoCartUnloadHook = NULL;
}
if (Pico.rom != NULL) {
SekFinishIdleDet();
free(Pico.rom);

View file

@ -289,6 +289,10 @@ void PicoFrame(void)
PicoFrameMCD();
return;
}
else if (PicoAHW & PAHW_SMS) {
PicoFrameMS();
return;
}
//if(Pico.video.reg[12]&0x2) Pico.video.status ^= 0x10; // change odd bit in interlace mode

View file

@ -57,6 +57,7 @@ extern int PicoOpt; // bitfield
#define PAHW_32X (1<<1)
#define PAHW_SVP (1<<2)
#define PAHW_PICO (1<<3)
#define PAHW_SMS (1<<4)
extern int PicoAHW; // Pico active hw
extern int PicoVer;
extern int PicoSkipFrame; // skip rendering frame, but still do sound (if enabled) and emulation stuff
@ -133,7 +134,7 @@ pm_file *pm_open(const char *path);
size_t pm_read(void *ptr, size_t bytes, pm_file *stream);
int pm_seek(pm_file *stream, long offset, int whence);
int pm_close(pm_file *fp);
int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize);
int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize,int is_sms);
int PicoCartInsert(unsigned char *rom,unsigned int romsize);
void Byteswap(unsigned char *data,int len);
void PicoCartUnload(void);

View file

@ -551,6 +551,11 @@ PICO_INTERNAL void PsndClear(void);
PICO_INTERNAL void PsndGetSamples(int y);
extern int PsndDacLine;
// sms.c
void PicoPowerMS(void);
void PicoMemSetupMS(void);
void PicoFrameMS(void);
// emulation event logging
#ifndef EL_LOGMASK
#define EL_LOGMASK 0
@ -596,7 +601,7 @@ extern void lprintf(const char *fmt, ...);
#define cdprintf(x...)
#endif
#if defined(__GNUC__) && !defined(ARM)
#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 3
#define MEMH_FUNC __attribute__((aligned(4)))
#else
#define MEMH_FUNC

55
pico/sms.c Normal file
View file

@ -0,0 +1,55 @@
#include "pico_int.h"
static unsigned char z80_sms_in(unsigned short p)
{
elprintf(EL_ANOMALY, "Z80 port %04x read", p);
return 0xff;
}
static void z80_sms_out(unsigned short p, unsigned char d)
{
elprintf(EL_ANOMALY, "Z80 port %04x write %02x", p, d);
}
static unsigned char MEMH_FUNC xread(unsigned short a)
{
elprintf(EL_ANOMALY, "Z80 read [%04x]", a);
return 0;
}
static void MEMH_FUNC xwrite(unsigned int a, unsigned char data)
{
elprintf(EL_ANOMALY, "Z80 write [%04x] %02x", a, data);
}
void PicoPowerMS(void)
{
}
void PicoMemSetupMS(void)
{
z80_map_set(z80_read_map, 0x0000, 0xbfff, Pico.rom, 0);
z80_map_set(z80_read_map, 0xc000, 0xdfff, Pico.zram, 0);
z80_map_set(z80_read_map, 0xe000, 0xffff, xread, 1);
z80_map_set(z80_write_map, 0x0000, 0xbfff, Pico.rom, 0);
z80_map_set(z80_write_map, 0xc000, 0xdfff, Pico.zram, 0);
z80_map_set(z80_write_map, 0xe000, 0xffff, xwrite, 1);
#ifdef _USE_DRZ80
drZ80.z80_in = z80_sms_in;
drZ80.z80_out = z80_sms_out;
#endif
#ifdef _USE_CZ80
Cz80_Set_Fetch(&CZ80, 0x0000, 0xbfff, (UINT32)Pico.rom);
Cz80_Set_Fetch(&CZ80, 0xc000, 0xdfff, (UINT32)Pico.zram);
Cz80_Set_INPort(&CZ80, z80_sms_in);
Cz80_Set_OUTPort(&CZ80, z80_sms_out);
#endif
}
void PicoFrameMS(void)
{
z80_run(OSC_NTSC / 13 / 60);
}

View file

@ -119,7 +119,8 @@ PICO_INTERNAL void z80_reset(void)
drZ80.z80irqvector = 0xff0000; // RST 38h
drZ80.Z80PC_BASE = drZ80.Z80PC = z80_read_map[0] << 1;
// drZ80 is locked in single bank
drZ80.Z80SP_BASE = z80_read_map[0] << 1;
drZ80.Z80SP_BASE = ((PicoAHW & PAHW_SMS) ?
z80_read_map[0xc000 >> Z80_MEM_SHIFT] : z80_read_map[0]) << 1;
// drZ80.Z80SP = drZ80.z80_rebaseSP(0x2000); // 0xf000 ?
#endif
#ifdef _USE_CZ80