Improved video capabilities in 2 Minutes Drill (tilemap support, basic scrolling) just to realize that it uses Taito F3 video chip, lovely ...

This commit is contained in:
Angelo Salese 2011-04-04 00:20:00 +00:00
parent 0566d3e089
commit 92f4268f08

View File

@ -13,7 +13,7 @@ TODO:
- simulate the sensors (there are still some shutter errors/defender errors that pops up) - simulate the sensors (there are still some shutter errors/defender errors that pops up)
- Hook-up timers for shutter/defender sensors (check service mode) - Hook-up timers for shutter/defender sensors (check service mode)
- Dip-Switches - Dip-Switches
- find video control regs (layer enable, scroll) - This HW uses the same video chip as Taito F3, convert the driver by using that;
BG scroll: BG scroll:
BG maps are 2048x256 (128x16 16x16 tiles). BG maps are 2048x256 (128x16 16x16 tiles).
@ -34,10 +34,10 @@ looks like regs @460000 are used, pairs at N, and N+8, so
Sound - Yamaha YM2610B Sound - Yamaha YM2610B
Taito custom ICs - TC0400YSC Taito custom ICs - TC0400YSC (m68k -> ym2610 communication)
- TC0260DAR - TC0260DAR (palette chip)
- TC0630FDP - TC0630FDP (Taito F3 video chip)
- TC0510NI0 - TC0510NIO (known input chip)
DAC -26.6860Mhz DAC -26.6860Mhz
-32.0000Mhz -32.0000Mhz
@ -62,10 +62,16 @@ public:
UINT16 * m_map4ram; UINT16 * m_map4ram;
UINT16 * m_charram; UINT16 * m_charram;
UINT16 * m_textram; UINT16 * m_textram;
UINT16 * m_unkram; UINT16 * m_vregs;
// UINT16 * m_paletteram; // currently this uses generic palette handling // UINT16 * m_paletteram; // currently this uses generic palette handling
UINT16 * m_iodata; UINT16 * m_iodata;
tilemap_t *m_map1_tilemap;
tilemap_t *m_map2_tilemap;
tilemap_t *m_map3_tilemap;
tilemap_t *m_map4_tilemap;
tilemap_t *m_tx_tilemap;
/* input-related */ /* input-related */
UINT16 m_defender_sensor; UINT16 m_defender_sensor;
UINT16 m_shutter_sensor; UINT16 m_shutter_sensor;
@ -74,59 +80,190 @@ public:
device_t *m_maincpu; device_t *m_maincpu;
}; };
/*
[0]
x--- ---- ---- ---- flip y
-x-- ---- ---- ---- flip x
---- ---- xxxx xxxx color
[1]
xxxx xxxx xxxx xxxx tile number
*/
static TILE_GET_INFO( get_map1_tile_info )
{
_2mindril_state *state = machine.driver_data<_2mindril_state>();
int tile = state->m_map1ram[tile_index*2+1] & 0xffff;
int color = state->m_map1ram[tile_index*2+0] & 0xff;
UINT8 flipxy = (state->m_map1ram[tile_index*2+0] & 0xc000) >> 14;
SET_TILE_INFO(
#define DRAW_MAP(map,num) \ 0,
{ int x, y; \ tile,
for (y = 0; y < 16; y++) \ color,
for (x = 0; x < 128; x++) \ TILE_FLIPYX(flipxy));
{ \
UINT16 data0 = map[y * 128 + x * 2]; \
UINT16 data1 = map[y * 128 + x * 2 + 1]; \
drawgfx_transpen(bitmap, \
cliprect,screen->machine().gfx[0], data1, \
data0 & 0xff, \
data0 & 0x4000, data0 & 0x8000, \
x * 16 - 512 /*+(((INT16)(state->m_unkram[0x60000 / 2 + num])) / 32)*/, \
y * 16 /*+(((INT16)(state->m_unkram[0x60008 / 2 + num])) / 32)*/,0); \
} \
} }
static SCREEN_UPDATE( drill ) static TILE_GET_INFO( get_map2_tile_info )
{ {
_2mindril_state *state = screen->machine().driver_data<_2mindril_state>(); _2mindril_state *state = machine.driver_data<_2mindril_state>();
bitmap_fill(bitmap, NULL, 0); int tile = state->m_map2ram[tile_index*2+1] & 0xffff;
int color = state->m_map2ram[tile_index*2+0] & 0xff;
UINT8 flipxy = (state->m_map2ram[tile_index*2+0] & 0xc000) >> 14;
DRAW_MAP(state->m_map1ram, 0) SET_TILE_INFO(
DRAW_MAP(state->m_map2ram, 1) 0,
DRAW_MAP(state->m_map3ram, 2) tile,
DRAW_MAP(state->m_map4ram, 3) color,
TILE_FLIPYX(flipxy));
}
static TILE_GET_INFO( get_map3_tile_info )
{ {
int x, y; _2mindril_state *state = machine.driver_data<_2mindril_state>();
for (y = 0; y < 64; y++) int tile = state->m_map3ram[tile_index*2+1] & 0xffff;
for(x = 0; x < 64; x++) int color = state->m_map3ram[tile_index*2+0] & 0xff;
UINT8 flipxy = (state->m_map3ram[tile_index*2+0] & 0xc000) >> 14;
SET_TILE_INFO(
0,
tile,
color,
TILE_FLIPYX(flipxy));
}
static TILE_GET_INFO( get_map4_tile_info )
{ {
drawgfx_transpen( bitmap, _2mindril_state *state = machine.driver_data<_2mindril_state>();
cliprect, int tile = state->m_map4ram[tile_index*2+1] & 0xffff;
screen->machine().gfx[1], int color = state->m_map4ram[tile_index*2+0] & 0xff;
state->m_textram[y * 64 + x] & 0xff, //1ff ?? UINT8 flipxy = (state->m_map4ram[tile_index*2+0] & 0xc000) >> 14;
((state->m_textram[y * 64 + x] >> 9) & 0xf),
0, 0, SET_TILE_INFO(
x*8,y*8,0); 0,
tile,
color,
TILE_FLIPYX(flipxy));
} }
/*
xxxx xxx- ---- ---- color
---- ---- xxxx xxxx tile number
*/
static TILE_GET_INFO( get_tx_tile_info )
{
_2mindril_state *state = machine.driver_data<_2mindril_state>();
int tile = state->m_textram[tile_index] & 0xff;
int color = (state->m_textram[tile_index] & 0xfe00) >> 9;
SET_TILE_INFO(
1,
tile,
color,
0);
} }
/*printf("%.4X %.4X %.4X %.4X %.4X %.4X\n", state->m_unkram[0x60000 / 2], state->m_unkram[0x60000 / 2 + 1], state->m_unkram[0x60000 / 2 + 2],
state->m_unkram[0x60000 / 2 + 3], state->m_unkram[0x60000 / 2 + 4], state->m_unkram[0x60000 / 2 + 5]);*/ static WRITE16_HANDLER( map1vram_w )
return 0; {
_2mindril_state *state = space->machine().driver_data<_2mindril_state>();
COMBINE_DATA(&state->m_map1ram[offset]);
tilemap_mark_tile_dirty(state->m_map1_tilemap,offset >> 1);
}
static WRITE16_HANDLER( map2vram_w )
{
_2mindril_state *state = space->machine().driver_data<_2mindril_state>();
COMBINE_DATA(&state->m_map2ram[offset]);
tilemap_mark_tile_dirty(state->m_map2_tilemap,offset >> 1);
}
static WRITE16_HANDLER( map3vram_w )
{
_2mindril_state *state = space->machine().driver_data<_2mindril_state>();
COMBINE_DATA(&state->m_map3ram[offset]);
tilemap_mark_tile_dirty(state->m_map3_tilemap,offset >> 1);
}
static WRITE16_HANDLER( map4vram_w )
{
_2mindril_state *state = space->machine().driver_data<_2mindril_state>();
COMBINE_DATA(&state->m_map4ram[offset]);
tilemap_mark_tile_dirty(state->m_map4_tilemap,offset >> 1);
}
static WRITE16_HANDLER( tvram_w )
{
_2mindril_state *state = space->machine().driver_data<_2mindril_state>();
COMBINE_DATA(&state->m_textram[offset]);
tilemap_mark_tile_dirty(state->m_tx_tilemap,offset);
}
static WRITE16_HANDLER( charram_w )
{
_2mindril_state *state = space->machine().driver_data<_2mindril_state>();
COMBINE_DATA(&state->m_charram[offset]);
gfx_element_mark_dirty(space->machine().gfx[1], offset / 16);
}
static WRITE16_HANDLER( vregs_w )
{
_2mindril_state *state = space->machine().driver_data<_2mindril_state>();
COMBINE_DATA(&state->m_vregs[offset]);
//popmessage("%04x %04x %04x %04x %04x %04x %04x %04x",state->m_vregs[0x0/2] & 0x7fff,state->m_vregs[0x2/2]& 0x7fff,state->m_vregs[0x4/2]& 0x7fff,state->m_vregs[0x6/2]& 0x7fff,
// state->m_vregs[0x8/2],state->m_vregs[0xa/2],state->m_vregs[0xc/2],state->m_vregs[0xe/2]);
popmessage("%04x %04x",state->m_vregs[0x18/2],state->m_vregs[0x1a/2]);
} }
static VIDEO_START( drill ) static VIDEO_START( drill )
{ {
_2mindril_state *state = machine.driver_data<_2mindril_state>(); _2mindril_state *state = machine.driver_data<_2mindril_state>();
state->m_map1_tilemap = tilemap_create(machine, get_map1_tile_info,tilemap_scan_rows,16,16,64,32);
state->m_map2_tilemap = tilemap_create(machine, get_map2_tile_info,tilemap_scan_rows,16,16,64,32);
state->m_map3_tilemap = tilemap_create(machine, get_map3_tile_info,tilemap_scan_rows,16,16,64,32);
state->m_map4_tilemap = tilemap_create(machine, get_map4_tile_info,tilemap_scan_rows,16,16,64,32);
state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows,8,8,64,64);
machine.gfx[0]->color_granularity = 16; machine.gfx[0]->color_granularity = 16;
gfx_element_set_source(machine.gfx[1], (UINT8 *)state->m_charram); gfx_element_set_source(machine.gfx[1], (UINT8 *)state->m_charram);
tilemap_set_transparent_pen(state->m_map1_tilemap,0);
tilemap_set_transparent_pen(state->m_map2_tilemap,0);
tilemap_set_transparent_pen(state->m_map3_tilemap,0);
tilemap_set_transparent_pen(state->m_map4_tilemap,0);
tilemap_set_transparent_pen(state->m_tx_tilemap,0);
}
static SCREEN_UPDATE( drill )
{
_2mindril_state *state = screen->machine().driver_data<_2mindril_state>();
bitmap_fill(bitmap, NULL, 0);
// tilemap_set_scrollx(state->m_map1_tilemap, 0, (state->m_vregs[0x0/2] & 0x003f) << 10);
// tilemap_set_scrollx(state->m_map2_tilemap, 0, (0xffff-state->m_vregs[0x2/2]) >> 6);
// tilemap_set_scrollx(state->m_map3_tilemap, 0, (0xffff-state->m_vregs[0x4/2]) >> 6);
// tilemap_set_scrollx(state->m_map4_tilemap, 0, (0xffff-state->m_vregs[0x6/2]) >> 6);
tilemap_set_scrolly(state->m_map1_tilemap, 0, state->m_vregs[0x8/2] >> 7);
tilemap_set_scrolly(state->m_map2_tilemap, 0, state->m_vregs[0xa/2] >> 7);
tilemap_set_scrolly(state->m_map3_tilemap, 0, state->m_vregs[0xc/2] >> 7);
tilemap_set_scrolly(state->m_map4_tilemap, 0, state->m_vregs[0xe/2] >> 7);
//state->m_vregs[0x8/2],state->m_vregs[0xa/2],state->m_vregs[0xc/2],state->m_vregs[0xe/2
tilemap_draw(bitmap,cliprect,state->m_map1_tilemap,0,0);
tilemap_draw(bitmap,cliprect,state->m_map2_tilemap,0,0);
tilemap_draw(bitmap,cliprect,state->m_map3_tilemap,0,0);
tilemap_draw(bitmap,cliprect,state->m_map4_tilemap,0,0);
tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0);
return 0;
} }
static READ16_HANDLER( drill_io_r ) static READ16_HANDLER( drill_io_r )
@ -235,30 +372,26 @@ static WRITE16_HANDLER( sensors_w )
} }
} }
static WRITE16_HANDLER( charram_w )
{
_2mindril_state *state = space->machine().driver_data<_2mindril_state>();
COMBINE_DATA(&state->m_charram[offset]);
gfx_element_mark_dirty(space->machine().gfx[1], offset / 16);
}
static ADDRESS_MAP_START( drill_map, AS_PROGRAM, 16 ) static ADDRESS_MAP_START( drill_map, AS_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_ROM AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_RANGE(0x200000, 0x20ffff) AM_RAM
AM_RANGE(0x300000, 0x3000ff) AM_RAM AM_RANGE(0x300000, 0x3000ff) AM_RAM
AM_RANGE(0x410000, 0x411fff) AM_RAM AM_BASE_MEMBER(_2mindril_state, m_map1ram) AM_RANGE(0x400000, 0x40ffff) AM_RAM
AM_RANGE(0x412000, 0x413fff) AM_RAM AM_BASE_MEMBER(_2mindril_state, m_map2ram) AM_RANGE(0x410000, 0x411fff) AM_RAM_WRITE(map1vram_w) AM_BASE_MEMBER(_2mindril_state, m_map1ram)
AM_RANGE(0x414000, 0x415fff) AM_RAM AM_BASE_MEMBER(_2mindril_state, m_map3ram) AM_RANGE(0x412000, 0x413fff) AM_RAM_WRITE(map2vram_w) AM_BASE_MEMBER(_2mindril_state, m_map2ram)
AM_RANGE(0x416000, 0x417fff) AM_RAM AM_BASE_MEMBER(_2mindril_state, m_map4ram) AM_RANGE(0x414000, 0x415fff) AM_RAM_WRITE(map3vram_w) AM_BASE_MEMBER(_2mindril_state, m_map3ram)
AM_RANGE(0x41c000, 0x41dfff) AM_RAM AM_BASE_MEMBER(_2mindril_state, m_textram) AM_RANGE(0x416000, 0x417fff) AM_RAM_WRITE(map4vram_w) AM_BASE_MEMBER(_2mindril_state, m_map4ram)
AM_RANGE(0x41c000, 0x41dfff) AM_RAM_WRITE(tvram_w) AM_BASE_MEMBER(_2mindril_state, m_textram)
AM_RANGE(0x41e000, 0x41ffff) AM_RAM_WRITE(charram_w) AM_BASE_MEMBER(_2mindril_state, m_charram) AM_RANGE(0x41e000, 0x41ffff) AM_RAM_WRITE(charram_w) AM_BASE_MEMBER(_2mindril_state, m_charram)
AM_RANGE(0x400000, 0x4fffff) AM_RAM AM_BASE_MEMBER(_2mindril_state, m_unkram)// video stuff, 460000 - video regs ? AM_RANGE(0x420000, 0x42ffff) AM_RAM
AM_RANGE(0x430000, 0x43ffff) AM_RAM
AM_RANGE(0x460000, 0x46001f) AM_RAM_WRITE(vregs_w) AM_BASE_MEMBER(_2mindril_state, m_vregs)
// AM_RANGE(0x400000, 0x4fffff) AM_RAM AM_BASE_MEMBER(_2mindril_state, m_unkram)// video stuff, 460000 - video regs ?
AM_RANGE(0x500000, 0x501fff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x500000, 0x501fff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x502000, 0x503fff) AM_RAM AM_RANGE(0x502000, 0x503fff) AM_RAM // presumably more paletteram
AM_RANGE(0x600000, 0x600007) AM_DEVREADWRITE8("ymsnd", ym2610_r, ym2610_w, 0x00ff) AM_RANGE(0x600000, 0x600007) AM_DEVREADWRITE8("ymsnd", ym2610_r, ym2610_w, 0x00ff)
AM_RANGE(0x60000c, 0x60000d) AM_RAM AM_RANGE(0x60000c, 0x60000d) AM_RAM // check me
AM_RANGE(0x60000e, 0x60000f) AM_RAM AM_RANGE(0x60000e, 0x60000f) AM_RAM // check me
AM_RANGE(0x700000, 0x70000f) AM_READWRITE(drill_io_r,drill_io_w) AM_BASE_MEMBER(_2mindril_state, m_iodata) // i/o AM_RANGE(0x700000, 0x70000f) AM_READWRITE(drill_io_r,drill_io_w) AM_BASE_MEMBER(_2mindril_state, m_iodata) // i/o
AM_RANGE(0x800000, 0x800001) AM_WRITE(sensors_w) AM_RANGE(0x800000, 0x800001) AM_WRITE(sensors_w)
ADDRESS_MAP_END ADDRESS_MAP_END