📄 smashtv.c
字号:
}
}
else
{
write_data = (*BYTE_XOR_LE(rda))&0x0f;
if (write_data)
{
*wrva = wms_dma_pal | write_data;
}
}
wrva++;
wms_dma_odd_nibble++;
}
rda+=dma_skip/2;
}
break;
case 0x8003: /* draw all pixels */
dma_skip = ((wms_dma_cols + wms_dma_woffset+3)&(~3)) - wms_dma_cols;
DMA_DRAW_ALL_BYTES(*BYTE_XOR_LE(rda++));
break;
case 0x8008: /* draw nonzero pixels as color */
dma_skip = ((wms_dma_cols + wms_dma_woffset+3)&(~3)) - wms_dma_cols;
DMA_DRAW_NONZERO_BYTES_INC(wms_dma_fgcol);
break;
case 0xc008: /* draw nonzero nibbles as color */
dma_skip = ((wms_dma_cols + wms_dma_woffset+1)&(~1)) - wms_dma_cols;
for (i=0;i<(wms_dma_write_rows<<9);i+=512)
{
wrva = &(wms_videoram[wms_dma_dst+i]);
for (j=write_cols;j>=0;j--)
{
if (wms_dma_odd_nibble&0x01)
{
if ((*BYTE_XOR_LE(rda++))&0xf0)
{
*wrva = wms_dma_pal | wms_dma_fgcol;
}
}
else
{
if ((*BYTE_XOR_LE(rda))&0x0f)
{
*wrva = wms_dma_pal | wms_dma_fgcol;
}
}
wrva++;
wms_dma_odd_nibble++;
}
rda+=dma_skip/2;
}
break;
case 0x8009: /* draw nonzero pixels as color, zero as zero */
dma_skip = ((wms_dma_cols + wms_dma_woffset+3)&(~3)) - wms_dma_cols;
DMA_DRAW_ALL_BYTES((*BYTE_XOR_LE(rda++)?wms_dma_fgcol:0));
break;
case 0xe00c: /* draw all pixels as color (fill) */
case 0x800c: /* draw all pixels as color (fill) */
DMA_DRAW_ALL_BYTES(wms_dma_fgcol);
break;
case 0x8010: /* draw nothing */
break;
case 0xe012: /* draw only nonzero pixels x-flipped???? */
case 0x8012: /* draw nonzero pixels x-flipped */
dma_skip = ((wms_dma_woffset + 3 - wms_dma_cols)&(~3)) + wms_dma_cols;
DMA_DRAW_NONZERO_BYTES_DEC(write_data);
break;
case 0x8013: /* draw all pixels x-flipped */
dma_skip = ((wms_dma_woffset + 3 - wms_dma_cols)&(~3)) + wms_dma_cols;
DMA_DRAW_ALL_BYTES(*BYTE_XOR_LE(rda--));
break;
case 0x8018: /* draw nonzero pixels as color x-flipped */
dma_skip = ((wms_dma_woffset + 3 - wms_dma_cols)&(~3)) + wms_dma_cols;
DMA_DRAW_NONZERO_BYTES_DEC(wms_dma_fgcol);
break;
case 0x8022: /* draw nonzero pixels y-flipped */
dma_skip = ((wms_dma_cols + wms_dma_woffset+3)&(~3)) - wms_dma_cols;
DMA_DRAW_NONZERO_BYTES_INC(write_data);
break;
case 0x8032: /* draw nonzero pixels x-flipped and y-flipped */
dma_skip = ((wms_dma_woffset + 3 - wms_dma_cols)&(~3)) + wms_dma_cols;
DMA_DRAW_NONZERO_BYTES_DEC(write_data);
break;
default:
break;
}
timer_set (TIME_IN_NSEC(41*wms_dma_cols*wms_dma_rows), data, dma_callback);
break;
case 4:
wms_dma_subbank = data>>3;
wms_dma_odd_nibble=data>>2;
break;
case 6:
wms_dma_bank = ((data&0xfe00)?(data-0x200)*0x2000:data*0x2000);
break;
case 8:
wms_dma_x = data&0x1ff;
break;
case 0x0a:
wms_dma_y = data&0x1ff;
break;
case 0x0c:
wms_dma_cols = data;
dma_skip = data;
break;
case 0x0e:
wms_dma_rows = data;
break;
case 0x10: /* set palette */
wms_dma_pal = (data&0xff00); /* changed from rev1? */
wms_dma_pal_word = data;
break;
case 0x12: /* set color for 1-bit */
wms_dma_fgcol = data&0xff;
break;
case 0x14:
wms_dma_14 = data;
break;
case 0x16:
wms_dma_16 = data;
break;
case 0x18:
wms_dma_18 = data;
break;
case 0x1a:
wms_dma_1a = data;
break;
case 0x1c:
wms_dma_1c = data;
break;
case 0x1e:
wms_dma_1e = data;
break;
default:
break;
}
}
static void wms_to_shiftreg(unsigned int address, unsigned short* shiftreg)
{
memcpy(shiftreg, &wms_videoram[address>>3], 2*512*sizeof(unsigned short));
}
static void wms_from_shiftreg(unsigned int address, unsigned short* shiftreg)
{
memcpy(&wms_videoram[address>>3], shiftreg, 2*512*sizeof(unsigned short));
}
void wms_01c00060_w(int offset, int data) /* protection and more */
{
if ((data&0xfdff) == 0x0000) /* enable CMOS write */
{
smashtv_cmos_w_enable = 1;
}
}
int wms_01c00060_r(int offset) /* protection and more */
{
if (cpu_getpc() == wms_protect_s) /* protection */
{
TMS34010_Regs Regs;
TMS34010_GetRegs(&Regs);
Regs.pc = wms_protect_d; /* skip it! */
TMS34010_SetRegs(&Regs);
return 0xffffffff;
}
return 0xffffffff;
}
void wms_sysreg_w(int offset, int data)
{
/*
* Narc system register
* ------------------
*
* | Bit | Use
* --+-FEDCBA9876543210-+------------
* | xxxxxxxx-------- | 7 segment led on CPU board
* | --------xx------ | CMOS page
* | ----------x----- | - OBJ PAL RAM select
* | -----------x---- | - autoerase enable
* | ---------------- | - watchdog
*
*/
wms_cmos_page = (data&0xc0)<<7; /* 0x2000 offsets */
if((data&0x20)&&wms_objpalram_select) /* access VRAM */
{
install_mem_write_handler(0, TOBYTE(0x00000000), TOBYTE(0x001fffff), wms_vram_w);
install_mem_read_handler (0, TOBYTE(0x00000000), TOBYTE(0x001fffff), wms_vram_r);
}
else if(!(data&0x20)&&!wms_objpalram_select) /* access OBJPALRAM */
{
install_mem_write_handler(0, TOBYTE(0x00000000), TOBYTE(0x001fffff), wms_objpalram_w);
install_mem_read_handler (0, TOBYTE(0x00000000), TOBYTE(0x001fffff), wms_objpalram_r);
}
wms_objpalram_select = ((data&0x20)?0:0x40000);
if (data&0x10) /* turn off auto-erase */
{
wms_autoerase_enable = 0;
}
else /* enable auto-erase */
{
if (!wms_autoerase_enable)
{
wms_autoerase_start = cpu_getscanline();
}
wms_autoerase_enable = 1;
}
}
void wms_sysreg2_w(int offset, int data)
{
wms_cmos_page = (data&0xc0)<<7; /* 0x2000 offsets */
if(data&0x20&&wms_objpalram_select) /* access VRAM */
{
install_mem_write_handler(0, TOBYTE(0x00000000), TOBYTE(0x003fffff), wms_vram_w);
install_mem_read_handler (0, TOBYTE(0x00000000), TOBYTE(0x003fffff), wms_vram_r);
}
else if(!(data&0x20)&&!wms_objpalram_select) /* access OBJPALRAM */
{
install_mem_write_handler(0, TOBYTE(0x00000000), TOBYTE(0x003fffff), wms_objpalram_w);
install_mem_read_handler (0, TOBYTE(0x00000000), TOBYTE(0x003fffff), wms_objpalram_r);
}
wms_objpalram_select = ((data&0x20)?0:0x40000);
}
static int narc_unknown_r (int offset)
{
int ans = 0xffff;
return ans;
}
void wms_cmos_w(int offset, int data)
{
if (smashtv_cmos_w_enable)
{
COMBINE_WORD_MEM(&wms_cmos_ram[(offset)+wms_cmos_page], data);
}
}
int wms_cmos_r(int offset)
{
return READ_WORD(&wms_cmos_ram[(offset)+wms_cmos_page]);
}
static void smashtv_sound_nmi(void)
{
cpu_cause_interrupt(1,M6809_INT_NMI);
}
static void smashtv_sound_firq(void)
{
cpu_cause_interrupt(1,M6809_INT_FIRQ);
}
static pia6821_interface smashtv_pia_intf =
{
1, /* 1 chip */
{ PIA_DDRA, PIA_CTLA, PIA_DDRB, PIA_CTLB }, /* offsets */
{ 0 }, /* input port A */
{ 0 }, /* input bit CA1 */
{ 0 }, /* input bit CA2 */
{ 0 }, /* input port B */
{ 0 }, /* input bit CB1 */
{ 0 }, /* input bit CB2 */
{ DAC_data_w }, /* output port A */
{ 0 }, /* output port B */
{ 0 }, /* output CA2 */
{ 0 }, /* output CB2 */
{ smashtv_sound_firq }, /* IRQ A */
{ smashtv_sound_nmi } /* IRQ B */
};
void smashtv_sound_bank_select_w (int offset,int data)
{
static int bank[16] = { 0x10000, 0x30000, 0x50000, 0x10000, 0x18000, 0x38000, 0x58000, 0x18000,
0x20000, 0x40000, 0x60000, 0x10000, 0x28000, 0x48000, 0x68000, 0x18000 };
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[1].memory_region];
/* set bank address */
cpu_setbank (5, &RAM[bank[data & 0x0f]]);
}
void narc_music_bank_select_w (int offset,int data)
{
static int bank[8] = { 0x10000, 0x10000, 0x10000, 0x10000, 0x20000, 0x28000, 0x10000, 0x18000 };
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[1].memory_region];
/* set bank address */
cpu_setbank (5, &RAM[bank[data&0x07]]);
}
void narc_digitizer_bank_select_w (int offset,int data)
{
static int bank[8] = { 0x40000, 0x48000, 0x30000, 0x38000, 0x20000, 0x28000, 0x10000, 0x18000 };
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[2].memory_region];
/* set bank address */
cpu_setbank (6, &RAM[bank[data&0x07]]);
}
void mk_sound_bank_select_w (int offset,int data)
{
static int bank[8] = { 0x10000, 0x18000, 0x20000, 0x28000, 0x30000, 0x38000, 0x40000, 0x48000 };
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[1].memory_region];
/* set bank address */
cpu_setbank (5, &RAM[bank[data&0x07]]);
cpu_setbank (6, &RAM[0x4c000]);
}
void wms_load_code_roms(void)
{
memcpy(CODE_ROM,Machine->memory_region[Machine->drv->cpu[0].memory_region],wms_code_rom_size);
}
#define DEREF(REG, SIZE) *(SIZE*)(&SCRATCH_RAM[TOBYTE((REG) & 0xffffff)])
#define DEREF_INT8(REG) DEREF(REG, INT8 )
#define DEREF_INT16(REG) DEREF(REG, INT16)
#define DEREF_INT32(REG) DEREF(REG, INT32)
#define BURN_TIME(INST_CNT) TMS34010_ICount -= INST_CNT * TMS34010_AVGCYCLES
#define INT32_MOD(x) BIG_DWORD_LE(x)
#define INT16_MOD(x) (x)
/* Speed up loop body */
#define DO_SPEEDUP_LOOP(OFFS1, OFFS2, A8SIZE, A7SIZE) \
\
a8 = A8SIZE##_MOD(DEREF(a2+OFFS1, A8SIZE)); \
a7 = A7SIZE##_MOD(DEREF(a2+OFFS2, A7SIZE)); \
\
if (a8 > a1) \
{ \
a4 = a0; \
a0 = a2; \
a1 = a8; \
a5 = a7; \
BURN_TIME(10); \
continue; \
} \
\
if ((a8 == a1) && (a7 >= a5)) \
{ \
a4 = a0; \
a0 = a2; \
a1 = a8; \
a5 = a7; \
BURN_TIME(13); \
continue; \
} \
\
DEREF_INT32(a4) = BIG_DWORD_LE(a2); \
DEREF_INT32(a0) = DEREF_INT32(a2); \
DEREF_INT32(a2) = BIG_DWORD_LE(a0); \
a4 = a2; \
BURN_TIME(17);
/* Speedup catch for games using 1 location */
#define DO_SPEEDUP_LOOP_1(LOC, OFFS1, OFFS2, A8SIZE, A7SIZE) \
\
UINT32 a0 = LOC; \
UINT32 a2; \
UINT32 a4 = 0; \
INT32 a1 = 0x80000000; \
INT32 a5 = 0x80000000; \
INT32 a7,a8; \
while (TMS34010_ICount > 0) \
{ \
a2 = BIG_DWORD_LE(DEREF_INT32(a0)); \
if (!a2) \
{ \
cpu_spinuntil_int(); \
break; \
} \
DO_SPEEDUP_LOOP(OFFS1, OFFS2, A8SIZE, A7SIZE); \
}
/* Speedup catch for games using 3 locations */
#define DO_SPEEDUP_LOOP_3(LOC1, LOC2, LOC3) \
\
UINT32 a0,a2,temp1,temp2,temp3; \
UINT32 a4 = 0; \
INT32 a1,a5,a7,a8; \
\
while (TMS34010_ICount > 0) \
{ \
temp1 = BIG_DWORD_LE(DEREF_INT32(LOC1)); \
temp2 = BIG_DWORD_LE(DEREF_INT32(LOC2)); \
temp3 = BIG_DWORD_LE(DEREF_INT32(LOC3)); \
if (!temp1 && !temp2 && !temp3) \
{ \
cpu_spinuntil_int(); \
break; \
} \
a0 = LOC1; \
a1 = 0x80000000; \
a5 = 0x80000000; \
do \
{ \
a2 = BIG_DWORD_LE(DEREF_INT32(a0)); \
if (!a2) \
{ \
TMS34010_ICount -= 20; \
break; \
} \
DO_SPEEDUP_LOOP(0xc0, 0xa0, INT32, INT32); \
} while (a2); \
\
a0 = LOC2; \
a1 = 0x80000000; \
a5 = 0x80000000; \
do \
{ \
a2 = BIG_DWORD_LE(DEREF_INT32(a0)); \
if (!a2) \
{ \
TMS34010_ICount -= 20; \
break; \
} \
DO_SPEEDUP_LOOP(0xc0, 0xa0, INT32, INT32); \
} while (a2); \
\
a0 = LOC3; \
a1 = 0x80000000; \
a5 = 0x80000000; \
do \
{ \
a2 = BIG_DWORD_LE(DEREF_INT32(a0)); \
if (!a2) \
{ \
TMS34010_ICount -= 20; \
break; \
} \
DO_SPEEDUP_LOOP(0xc0, 0xa0, INT32, INT32); \
} while (a2); \
}
static int narc_speedup_r(int offset)
{
if (offset)
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0x1b310)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xffde33e0 && !value1)
{
DO_SPEEDUP_LOOP_1(0x1000040, 0xc0, 0xa0, INT32, INT32);
}
return value1;
}
else
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0x1b300)]);
}
}
static int smashtv_speedup_r(int offset)
{
if (offset)
{
return READ_WORD(&SCRATCH_RAM[TOBYTE(0x86770)]);
}
else
{
UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0x86760)]);
/* Suspend cpu if it's waiting for an interrupt */
if (cpu_getpc() == 0xffe0a340 && !value1)
{
DO_SPEEDUP_LOOP_1(0x1000040, 0xa0, 0x80, INT16, INT32);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -