mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
starting SMS work
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@756 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
d8f51995c4
commit
3e49ffd0bf
10 changed files with 246 additions and 80 deletions
50
pico/cart.c
50
pico/cart.c
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
55
pico/sms.c
Normal 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);
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue