📄 smashtv.c
字号:
}
return value1;
}
}
static int totcarn_speedup_r(int offset)
{
if (offset)
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0x7ddf0)]);
}
else
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0x7dde0)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xffc0c970 && !value1)
{
DO_SPEEDUP_LOOP_1(0x1000040, 0xa0, 0x90, INT16, INT16);
}
return value1;
}
}
static int trogp_speedup_r(int offset)
{
if (offset)
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0xa1ef0)]);
}
else
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0xa1ee0)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xffe210d0 && !value1)
{
DO_SPEEDUP_LOOP_1(0x1000040, 0xc0, 0xa0, INT32, INT32);
}
return value1;
}
}
static int trog_speedup_r(int offset)
{
if (offset)
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0xa20b0)]);
}
else
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0xa20a0)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xffe20630 && !value1)
{
DO_SPEEDUP_LOOP_1(0x1000040, 0xc0, 0xa0, INT32, INT32);
}
return value1;
}
}
static int trog3_speedup_r(int offset)
{
if (offset)
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0xa2090)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xffe20660 && !value1)
{
DO_SPEEDUP_LOOP_1(0x1000040, 0xc0, 0xa0, INT32, INT32);
}
return value1;
}
else
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0xa2080)]);
}
}
static int mk_speedup_r(int offset)
{
if (offset)
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0x4f050)]);
}
else
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0x4f040)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xffce1ec0 && !value1)
{
DO_SPEEDUP_LOOP_3(0x104b6b0, 0x104b6f0, 0x104b710);
}
return value1;
}
}
static int hiimpact_speedup_r(int offset)
{
if (!offset)
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0x53140)]);
}
else
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0x53150)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xffe28bb0 && !value1)
{
DO_SPEEDUP_LOOP_3(0x1000080, 0x10000a0, 0x10000c0);
}
return value1;
}
}
static int shimpact_speedup_r(int offset)
{
if (!offset)
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0x52060)]);
}
else
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0x52070)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xffe27f00 && !value1)
{
DO_SPEEDUP_LOOP_3(0x1000000, 0x1000020, 0x1000040);
}
return value1;
}
}
#define T2_FFC08C40 \
a5x = (INT32)(DEREF_INT8(a1+0x2d0)); /* MOVB *A1(2D0h),A5 */ \
DEREF_INT8(a1+0x2d0) = a2 & 0xff; /* MOVB A2,*A1(2D0h) */ \
a3x = 0xf0; /* MOVI F0h,A3 */ \
a5x = (UINT32)a5x * (UINT32)a3x; /* MPYU A3,A5 */ \
a5x += 0x1008000; /* ADDI 1008000h,A5 */ \
a3x = (UINT32)a2 * (UINT32)a3x; /* MPYU A2,A3 */ \
a3x += 0x1008000; /* ADDI 1008000h,A3 */ \
a7x = (INT32)(DEREF_INT16(a1+0x190)); /* MOVE *A1(190h),A7,0*/ \
a6x = (INT32)(DEREF_INT16(a5x+0x50)); /* MOVE *A5(50h),A6,0 */ \
a7x -= a6x; /* SUB A6,A7 */ \
a6x = (INT32)(DEREF_INT16(a3x+0x50)); /* MOVE *A3(50h),A6,0 */ \
a7x += a6x; /* ADD A6,A7 */ \
DEREF_INT16(a1+0x190) = a7x & 0xffff; /* MOVE A7,*A1(190h),0*/ \
a5x = DEREF_INT32(a5x+0xa0); /* MOVE *A5(A0h),A5,1 */ \
a3x = DEREF_INT32(a3x+0xa0); /* MOVE *A3(A0h),A3,1 */ \
a6x = DEREF_INT32(a1+0x140); /* MOVE *A1(140h),A6,1*/ \
a6xa7x = (INT64)a6x * a3x / a5x; /* MPYS A3,A6 */ \
/* DIVS A5,A6 */ \
DEREF_INT32(a1+0x140) = a6xa7x & 0xffffffff; /* MOVE A6,*A1(140h),1*/
static int term2_speedup_r(int offset)
{
if (offset)
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0xaa050)]);
}
else
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0xaa040)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xffcdc270 && !value1)
{
INT32 a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a14,b0,b1,b2;
INT32 a3x,a5x,a6x,a7x;
INT64 a6xa7x;
b1 = 0;
b2 = (INT32)(DEREF_INT16(0x100F640));
if (!b2)
{
cpu_spinuntil_int();
return value1;
}
b2--;
b0 = 0x01008000;
a4 = 0x7fffffff;
while (1)
{
a10 = b0;
a0 = a10;
a3 = a4;
if (b1 < b2)
{
a4 = (INT32)(DEREF_INT16(a10+0xc0));
a4 <<= 16;
}
else
{
a4 = 0x80000000;
}
b0 += 0xf0;
a6 = 0x80000000;
a5 = 0x80000000;
goto t2_FFC07DD0;
t2_FFC078C0:
a8 = DEREF_INT32(a1+0x1c0);
a7 = DEREF_INT32(a1+0x1a0);
a14 = (INT32)(DEREF_INT16(a1+0x220));
if (a14 & 0x6000)
{
goto t2_FFC07C50;
}
if (a8 <= a3)
{
goto t2_FFC07AE0;
}
a2 = b1 - 1;
T2_FFC08C40
a14 = DEREF_INT32(a1);
DEREF_INT32(a0) = a14;
DEREF_INT32(a14+0x20) = a0;
a14 = b0 - 0x1e0;
DEREF_INT32(a1+0x20) = a14;
a9 = DEREF_INT32(a14);
DEREF_INT32(a14) = a1;
DEREF_INT32(a9+0x20) = a1;
DEREF_INT32(a1) = a9;
goto t2_FFC07DD0;
t2_FFC07AE0:
if (a8 >= a4)
{
goto t2_FFC07C50;
}
a2 = b1 + 1;
T2_FFC08C40
a14 = DEREF_INT32(a1);
DEREF_INT32(a0) = a14;
DEREF_INT32(a14+0x20) = a0;
a14 = b0;
a9 = DEREF_INT32(a14+0x20);
DEREF_INT32(a1) = a14;
DEREF_INT32(a14+0x20) = a1;
DEREF_INT32(a9) = a1;
DEREF_INT32(a1+0x20) = a9;
goto t2_FFC07DD0;
t2_FFC07C50:
if (a8 > a6)
{
a1 = a0;
a6 = a8;
a5 = a7;
goto t2_FFC07DD0;
}
if ((a8 == a6) && (a7 >= a5))
{
a1 = a0;
a6 = a8;
a5 = a7;
goto t2_FFC07DD0;
}
a14 = DEREF_INT32(a0+0x20);
DEREF_INT32(a14) = a1;
DEREF_INT32(a1+0x20) = a14;
a14 = DEREF_INT32(a1);
DEREF_INT32(a0) = a14;
DEREF_INT32(a1) = a0;
DEREF_INT32(a0 +0x20) = a1;
DEREF_INT32(a14+0x20) = a0;
t2_FFC07DD0:
BURN_TIME(50);
if (TMS34010_ICount <= 0)
{
break;
}
a1 = DEREF_INT32(a0);
if (a10 != a1)
{
goto t2_FFC078C0;
}
b1++;
if (b1 > b2)
{
cpu_spinuntil_int();
return value1;
}
}
}
return value1;
}
}
int strkforc_speedup_r(int offset)
{
if (!offset)
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0x71dc0)]);
}
else
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0x71dd0)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xffe0a290 && !value1)
{
DO_SPEEDUP_LOOP_1(0x1000060, 0xc0, 0xa0, INT32, INT32);
}
return value1;
}
}
static int mk2_speedup_r(int offset)
{
if (!offset)
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0x68e60)]);
}
else
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0x68e70)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xff80db70 && !value1)
{
DO_SPEEDUP_LOOP_3(0x105d480, 0x105d4a0, 0x105d4c0);
}
return value1;
}
}
static int nbajam_speedup_r(int offset)
{
if (offset)
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0x754d0)]);
}
else
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0x754c0)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xff833480 && !value1)
{
DO_SPEEDUP_LOOP_1(0x1008040, 0xd0, 0xb0, INT16, INT16);
}
return value1;
}
}
static int narc_music_speedup_r (int offset)
{
unsigned char a, b;
a = Machine->memory_region[Machine->drv->cpu[1].memory_region][0x0228];
b = Machine->memory_region[Machine->drv->cpu[1].memory_region][0x0226];
if ((a==b)&&(cpu_getpc()==0xc786)) cpu_spinuntil_int();
return a;
}
static int narc_digitizer_speedup_r (int offset)
{
unsigned char a, b;
a = Machine->memory_region[Machine->drv->cpu[2].memory_region][0x0228];
b = Machine->memory_region[Machine->drv->cpu[2].memory_region][0x0226];
if ((a==b)&&(cpu_getpc()==0xc786)) cpu_spinuntil_int();
return a;
}
static int mk_sound_speedup_r (int offset)
{
unsigned char a, b;
a = Machine->memory_region[Machine->drv->cpu[1].memory_region][0x0218];
b = Machine->memory_region[Machine->drv->cpu[1].memory_region][0x0216];
if ((a==b)&&(cpu_getpc()==0xf579)) cpu_spinuntil_int(); /* MK */
if ((a==b)&&(cpu_getpc()==0xf5db)) cpu_spinuntil_int(); /* totcarn */
if ((a==b)&&(cpu_getpc()==0xf5d2)) cpu_spinuntil_int(); /* term2 */
return a;
}
static int smashtv_sound_speedup_r (int offset)
{
unsigned char a, b;
a = Machine->memory_region[Machine->drv->cpu[1].memory_region][0x0218];
b = Machine->memory_region[Machine->drv->cpu[1].memory_region][0x0216];
if ((a==b)&&(cpu_getpc()==0x963d)) cpu_spinuntil_int(); /* smashtv */
if ((a==b)&&(cpu_getpc()==0x97d1)) cpu_spinuntil_int(); /* trog, trogp */
if ((a==b)&&(cpu_getpc()==0x97be)) cpu_spinuntil_int(); /* hiimpact */
if ((a==b)&&(cpu_getpc()==0x984c)) cpu_spinuntil_int(); /* shimpact */
if ((a==b)&&(cpu_getpc()==0x9883)) cpu_spinuntil_int(); /* strkforc */
return a;
}
static void remove_access_errors(void)
{
/* get rid of unmapped access errors during tests */
install_mem_write_handler(0, TOBYTE(0x00200000), TOBYTE(0x0020003f), MWA_NOP);
install_mem_write_handler(0, TOBYTE(0x01100000), TOBYTE(0x0110003f), MWA_NOP);
install_mem_read_handler(0, TOBYTE(0x00200000), TOBYTE(0x0020003f), MRA_NOP);
install_mem_read_handler(0, TOBYTE(0x01100000), TOBYTE(0x0110003f), MRA_NOP);
}
static void load_gfx_roms_4bit(void)
{
int i;
unsigned char d1,d2,d3,d4;
unsigned char *mem_rom;
memset(GFX_ROM,0,wms_gfx_rom_size);
mem_rom = Machine->memory_region[2];
/* load the graphics ROMs -- quadruples 2 bits each */
for (i=0;i<wms_gfx_rom_size;i+=2)
{
d1 = ((mem_rom[ (i )/4])>>(2*((i )%4)))&0x03;
d2 = ((mem_rom[wms_gfx_rom_size/4+(i )/4])>>(2*((i )%4)))&0x03;
d3 = ((mem_rom[ (i+1)/4])>>(2*((i+1)%4)))&0x03;
d4 = ((mem_rom[wms_gfx_rom_size/4+(i+1)/4])>>(2*((i+1)%4)))&0x03;
WRITE_WORD(&GFX_ROM[i],d1|(d2<<2)|(d1<<4)|(d2<<6)|(d3<<8)|(d4<<10)|(d3<<12)|(d4<<14));
}
free(Machine->memory_region[2]);
Machine->memory_region[2] = 0;
}
static void load_gfx_roms_6bit(void)
{
int i;
unsigned char d1,d2,d3,d4,d5,d6;
unsigned char *mem_rom;
memset(GFX_ROM,0,wms_gfx_rom_size);
mem_rom = Machine->memory_region[2];
/* load the graphics ROMs -- quadruples 2 bits each */
for (i=0;i<wms_gfx_rom_size;i+=2)
{
d1 = ((mem_rom[ (i )/4])>>(2*((i )%4)))&0x03;
d2 = ((mem_rom[ wms_gfx_rom_size/4+(i )/4])>>(2*((i )%4)))&0x03;
d3 = ((mem_rom[2*wms_gfx_rom_size/4+(i )/4])>>(2*((i )%4)))&0x03;
d4 = ((mem_rom[ (i+1)/4])>>(2*((i+1)%4)))&0x03;
d5 = ((mem_rom[ wms_gfx_rom_size/4+(i+1)/4])>>(2*((i+1)%4)))&0x03;
d6 = ((mem_rom[2*wms_gfx_rom_size/4+(i+1)/4])>>(2*((i+1)%4)))&0x03;
WRITE_WORD(&GFX_ROM[i],d1|(d2<<2)|(d3<<4)|(d4<<8)|(d5<<10)|(d6<<12));
}
free(Machine->memory_region[2]);
Machine->memory_region[2] = 0;
}
static void load_gfx_roms_8bit(void)
{
int i;
unsigned char d1,d2;
unsigned char *mem_rom;
memset(GFX_ROM,0,wms_gfx_rom_size);
mem_rom = Machine->memory_region[2];
/* load the graphics ROMs -- quadruples */
for (i=0;i<wms_gfx_rom_size;i+=4)
{
d1 = mem_rom[ i/4];
d2 = mem_rom[ wms_gfx_rom_size/4+i/4];
WRITE_WORD(&GFX_ROM[i ],(unsigned int)((unsigned int)(d1) | ((unsigned int)(d2)<<8)));
d1 = mem_rom[2*wms_gfx_rom_size/4+i/4];
d2 = mem_rom[3*wms_gfx_rom_size/4+i/4];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -