📄 segar.c
字号:
/***************************************************************************
machine.c
Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
I/O ports)
***************************************************************************/
#include "driver.h"
void (*sega_decrypt)(int,unsigned int *);
unsigned char *segar_mem;
extern void segar_videoram_w(int offset,int data);
extern void segar_characterram_w(int offset,int data);
extern void segar_characterram2_w(int offset,int data);
extern void segar_colortable_w(int offset,int data);
extern void segar_bcolortable_w(int offset,int data);
void segar_wr(int offset, int data)
{
int pc,op,page,off;
unsigned int bad;
off=offset;
pc=cpu_getpreviouspc();
if (pc != -1)
{
op=segar_mem[pc] & 0xFF;
if (op==0x32)
{
bad=segar_mem[pc+1] & 0xFF;
page=(segar_mem[pc+2] & 0xFF) << 8;
(*sega_decrypt)(pc,&bad);
off=(page & 0xFF00) | (bad & 0x00FF);
}
}
/* MWA_ROM */
if ((off>=0x0000) && (off<=0xC7FF))
{
;
}
/* MWA_RAM */
else if ((off>=0xC800) && (off<=0xCFFF))
{
segar_mem[off]=data;
}
else if ((off>=0xE000) && (off<=0xE3FF))
{
segar_videoram_w(off - 0xE000,data);
}
/* MWA_RAM */
else if ((off>=0xE400) && (off<=0xE7FF))
{
segar_mem[off]=data;
}
else if ((off>=0xE800) && (off<=0xEFFF))
{
segar_characterram_w(off - 0xE800,data);
}
else if ((off>=0xF000) && (off<=0xF03F))
{
segar_colortable_w(off - 0xF000,data);
}
else if ((off>=0xF040) && (off<=0xF07F))
{
segar_bcolortable_w(off - 0xF040,data);
}
/* MWA_RAM */
else if ((off>=0xF080) && (off<=0xF7FF))
{
segar_mem[off]=data;
}
else if ((off>=0xF800) && (off<=0xFFFF))
{
segar_characterram2_w(off - 0xF800,data);
}
}
/****************************************************************************/
/* MB 971025 - Emulate Sega G80 security chip 315-0062 */
/****************************************************************************/
static void sega_decrypt62(int pc,unsigned int *lo)
{
unsigned int i = 0;
unsigned int b = *lo;
switch (pc & 0x03)
{
case 0x00:
/* D */
i=b & 0x23;
i+=((b & 0xC0) >> 4);
i+=((b & 0x10) << 2);
i+=((b & 0x08) << 1);
i+=(((~b) & 0x04) << 5);
i &= 0xFF;
break;
case 0x01:
/* C */
i=b & 0x03;
i+=((b & 0x80) >> 4);
i+=(((~b) & 0x40) >> 1);
i+=((b & 0x20) >> 1);
i+=((b & 0x10) >> 2);
i+=((b & 0x08) << 3);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
case 0x02:
/* B */
i=b & 0x03;
i+=((b & 0x80) >> 1);
i+=((b & 0x60) >> 3);
i+=((~b) & 0x10);
i+=((b & 0x08) << 2);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
case 0x03:
/* A */
i=b;
break;
}
*lo=i;
}
/****************************************************************************/
/* MB 971025 - Emulate Sega G80 security chip 315-0063 */
/****************************************************************************/
static void sega_decrypt63(int pc,unsigned int *lo)
{
unsigned int i = 0;
unsigned int b = *lo;
switch (pc & 0x09)
{
case 0x00:
/* D */
i=b & 0x23;
i+=((b & 0xC0) >> 4);
i+=((b & 0x10) << 2);
i+=((b & 0x08) << 1);
i+=(((~b) & 0x04) << 5);
i &= 0xFF;
break;
case 0x01:
/* C */
i=b & 0x03;
i+=((b & 0x80) >> 4);
i+=(((~b) & 0x40) >> 1);
i+=((b & 0x20) >> 1);
i+=((b & 0x10) >> 2);
i+=((b & 0x08) << 3);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
case 0x08:
/* B */
i=b & 0x03;
i+=((b & 0x80) >> 1);
i+=((b & 0x60) >> 3);
i+=((~b) & 0x10);
i+=((b & 0x08) << 2);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
case 0x09:
/* A */
i=b;
break;
}
*lo=i;
}
/****************************************************************************/
/* MB 971025 - Emulate Sega G80 security chip 315-0064 */
/****************************************************************************/
static void sega_decrypt64(int pc,unsigned int *lo)
{
unsigned int i = 0;
unsigned int b = *lo;
switch (pc & 0x03)
{
case 0x00:
/* A */
i=b;
break;
case 0x01:
/* B */
i=b & 0x03;
i+=((b & 0x80) >> 1);
i+=((b & 0x60) >> 3);
i+=((~b) & 0x10);
i+=((b & 0x08) << 2);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
case 0x02:
/* C */
i=b & 0x03;
i+=((b & 0x80) >> 4);
i+=(((~b) & 0x40) >> 1);
i+=((b & 0x20) >> 1);
i+=((b & 0x10) >> 2);
i+=((b & 0x08) << 3);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
case 0x03:
/* D */
i=b & 0x23;
i+=((b & 0xC0) >> 4);
i+=((b & 0x10) << 2);
i+=((b & 0x08) << 1);
i+=(((~b) & 0x04) << 5);
i &= 0xFF;
break;
}
*lo=i;
}
/****************************************************************************/
/* MB 971025 - Emulate Sega G80 security chip 315-0070 */
/****************************************************************************/
static void sega_decrypt70(int pc,unsigned int *lo)
{
unsigned int i = 0;
unsigned int b = *lo;
switch (pc & 0x09)
{
case 0x00:
/* B */
i=b & 0x03;
i+=((b & 0x80) >> 1);
i+=((b & 0x60) >> 3);
i+=((~b) & 0x10);
i+=((b & 0x08) << 2);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
case 0x01:
/* A */
i=b;
break;
case 0x08:
/* D */
i=b & 0x23;
i+=((b & 0xC0) >> 4);
i+=((b & 0x10) << 2);
i+=((b & 0x08) << 1);
i+=(((~b) & 0x04) << 5);
i &= 0xFF;
break;
case 0x09:
/* C */
i=b & 0x03;
i+=((b & 0x80) >> 4);
i+=(((~b) & 0x40) >> 1);
i+=((b & 0x20) >> 1);
i+=((b & 0x10) >> 2);
i+=((b & 0x08) << 3);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
}
*lo=i;
}
/****************************************************************************/
/* MB 971025 - Emulate Sega G80 security chip 315-0076 */
/****************************************************************************/
static void sega_decrypt76(int pc,unsigned int *lo)
{
unsigned int i = 0;
unsigned int b = *lo;
switch (pc & 0x09)
{
case 0x00:
/* A */
i=b;
break;
case 0x01:
/* B */
i=b & 0x03;
i+=((b & 0x80) >> 1);
i+=((b & 0x60) >> 3);
i+=((~b) & 0x10);
i+=((b & 0x08) << 2);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
case 0x08:
/* C */
i=b & 0x03;
i+=((b & 0x80) >> 4);
i+=(((~b) & 0x40) >> 1);
i+=((b & 0x20) >> 1);
i+=((b & 0x10) >> 2);
i+=((b & 0x08) << 3);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
case 0x09:
/* D */
i=b & 0x23;
i+=((b & 0xC0) >> 4);
i+=((b & 0x10) << 2);
i+=((b & 0x08) << 1);
i+=(((~b) & 0x04) << 5);
i &= 0xFF;
break;
}
*lo=i;
}
/****************************************************************************/
/* MB 971025 - Emulate Sega G80 security chip 315-0082 */
/****************************************************************************/
static void sega_decrypt82(int pc,unsigned int *lo)
{
unsigned int i = 0;
unsigned int b = *lo;
switch (pc & 0x11)
{
case 0x00:
/* A */
i=b;
break;
case 0x01:
/* B */
i=b & 0x03;
i+=((b & 0x80) >> 1);
i+=((b & 0x60) >> 3);
i+=((~b) & 0x10);
i+=((b & 0x08) << 2);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
case 0x10:
/* C */
i=b & 0x03;
i+=((b & 0x80) >> 4);
i+=(((~b) & 0x40) >> 1);
i+=((b & 0x20) >> 1);
i+=((b & 0x10) >> 2);
i+=((b & 0x08) << 3);
i+=((b & 0x04) << 5);
i &= 0xFF;
break;
case 0x11:
/* D */
i=b & 0x23;
i+=((b & 0xC0) >> 4);
i+=((b & 0x10) << 2);
i+=((b & 0x08) << 1);
i+=(((~b) & 0x04) << 5);
i &= 0xFF;
break;
}
*lo=i;
}
/****************************************************************************/
/* MB 971031 - Emulate no Sega G80 security chip */
/****************************************************************************/
static void sega_decrypt0(int pc,unsigned int *lo)
{
return;
}
/****************************************************************************/
/* MB 971025 - Set the security chip to be used */
/****************************************************************************/
void sega_security(int chip)
{
switch (chip)
{
case 62:
sega_decrypt=sega_decrypt62;
break;
case 63:
sega_decrypt=sega_decrypt63;
break;
case 64:
sega_decrypt=sega_decrypt64;
break;
case 70:
sega_decrypt=sega_decrypt70;
break;
case 76:
sega_decrypt=sega_decrypt76;
break;
case 82:
sega_decrypt=sega_decrypt82;
break;
default:
sega_decrypt=sega_decrypt0;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -