diff options
Diffstat (limited to 'trunk/src/mame/drivers/kingdrby.c')
-rw-r--r-- | trunk/src/mame/drivers/kingdrby.c | 1179 |
1 files changed, 1179 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/kingdrby.c b/trunk/src/mame/drivers/kingdrby.c new file mode 100644 index 00000000000..46e466dd9ab --- /dev/null +++ b/trunk/src/mame/drivers/kingdrby.c @@ -0,0 +1,1179 @@ +/******************************************************************************************* + +King Derby (c) 1981 Tatsumi + +driver by Andrew Gardner, Angelo Salese & Roberto Fresca +original cowrace.c by Luca Elia + +TODO: +- remaining video issues, priorities, sprites etc.; +- inputs; +- Understand how tilemap color offsets really works; +- Discrete sound part? There's a Rossini's "William Tell" bgm on the Chinese bootlegs, + I think it's tied with ay8910 port B. Update: the 1986 version sounds that just fine, could be + that this is a btanb; +- unknown memories; +- Garbage on the window tilemap if you win, it could be a btanb (masked by the color prom). +- the name "King Derby" is a raw guess, there's a chance that it uses a different name + (but there isn't any title screen in the game?) +- Fix I/O in the 1986 bootleg version; + +============================================================================================ + +file : readme.txt +author : Stefan Lindberg +created: 2009-01-03 +updated: * +version: 1.0 + + +Unknown Tazmi game, 1981? + + +Note: +Untested PCB. +A bet/gamble game i presume, possible "King Derby". +The PCB is marked 1981. + +See included PCB pics. + + + +Roms: + +Name Size CRC32 Chip Type +---------------------------------------------------------------------------- +im1_yk.g1 4096 0x1921605d D2732D +im2_yk.f1 4096 0x8504314e M5L2732K +im3_yk.e1 4096 0xb034314e M5L2732K +im4_d.d6 4096 0x20f2d999 M5L2732K +im5_d.c6 4096 0xc192cecc D2732D +im6_d.b6 4096 0x257f4e0d D2732D +s1.d1 4096 0x26974007 D2732D +s10_a.l8 4096 0x37b2736f D2732D +s2.e1 4096 0xbedebfa7 D2732D +s3.f1 4096 0x0aa59571 D2732D +s4.g1 4096 0xccd5fb0e D2732D +s5.d2 4096 0x32613df3 D2732D +s6.e2 4096 0xa151c422 D2732D +s7.f2 4096 0x7cfcee55 D2732D +s8.g2 4096 0xad667c05 D2732D +s9_a.ka 4096 0xca82cd81 D2732D +sg1_b.e1 4096 0x92ef3c13 D2732D + +*******************************************************************************************/ + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "video/mc6845.h" +#include "machine/8255ppi.h" +#include "sound/ay8910.h" +#include "sound/okim6295.h" +#include "sound/2203intf.h" +#include "machine/nvram.h" + + +class kingdrby_state : public driver_device +{ +public: + kingdrby_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) { } + + UINT8 m_sound_cmd; + UINT8 *m_vram; + UINT8 *m_attr; + tilemap_t *m_sc0_tilemap; + tilemap_t *m_sc0w_tilemap; + tilemap_t *m_sc1_tilemap; + UINT8 m_p1_hopper; + UINT8 m_p2_hopper; + UINT8 m_mux_data; + UINT8 *m_spriteram; +}; + + +#define CLK_1 XTAL_20MHz +#define CLK_2 XTAL_3_579545MHz + + +/************************************* + * + * Video Hardware + * + *************************************/ + + +/* +tile +xxxx xxxx tile number +attr +xxxx ---- basic color? +---- x--- priority +---- -xx- extra color bank? +---- ---x tile bank +*/ + +static TILE_GET_INFO( get_sc0_tile_info ) +{ + kingdrby_state *state = machine.driver_data<kingdrby_state>(); + int tile = state->m_vram[tile_index] | state->m_attr[tile_index]<<8; + int color = (state->m_attr[tile_index] & 0x06)>>1; + + tile&=0x1ff; + + SET_TILE_INFO( + 1, + tile, + color|0x40, + 0); +} + +static TILE_GET_INFO( get_sc1_tile_info ) +{ + kingdrby_state *state = machine.driver_data<kingdrby_state>(); + int tile = state->m_vram[tile_index] | state->m_attr[tile_index]<<8; + int color = (state->m_attr[tile_index] & 0x06)>>1; + + tile&=0x1ff; + //original 0xc + //0x13 + // + + SET_TILE_INFO( + 1, + tile, + color|0x40, + 0); + + tileinfo->category = (state->m_attr[tile_index] & 0x08)>>3; +} + +static VIDEO_START(kingdrby) +{ + kingdrby_state *state = machine.driver_data<kingdrby_state>(); + state->m_sc0_tilemap = tilemap_create(machine, get_sc0_tile_info,tilemap_scan_rows,8,8,32,24); + state->m_sc1_tilemap = tilemap_create(machine, get_sc1_tile_info,tilemap_scan_rows,8,8,32,24); + state->m_sc0w_tilemap = tilemap_create(machine, get_sc0_tile_info,tilemap_scan_rows,8,8,32,32); + + tilemap_set_transparent_pen(state->m_sc1_tilemap,0); +} + +static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +{ + kingdrby_state *state = machine.driver_data<kingdrby_state>(); + UINT8 *spriteram = state->m_spriteram; + int count = 0; + + /*sprites not fully understood.*/ + for(count=0;count<0x48;count+=4) + { + int x,y,spr_offs,colour,fx,dx,dy,h,w,mode; + + spr_offs = (spriteram[count]); + spr_offs &=0x7f; + mode = spr_offs; + spr_offs*=4; + colour = (spriteram[count+3] & 0xf0)>>4; + fx = spriteram[count] & 0x80; + if(spriteram[count+1] == 0) + y = 0; + else + y = 0x100-spriteram[count+1]; + x = spriteram[count+2] - ((spriteram[count+3] & 1)<<8); + + /*TODO: I really believe that this is actually driven by a prom.*/ + if((mode >= 0x168/4) && (mode <= 0x17f/4)) { h = 1; w = 1; } + else if((mode >= 0x18c/4) && (mode <= 0x18f/4)) { h = 1; w = 1; } + else if((mode >= 0x19c/4) && (mode <= 0x19f/4)) { h = 1; w = 1; } + else if((mode & 3) == 3 || (mode) >= 0x13c/4) { h = 2; w = 2; } + else { h = 3; w = 4; } + + if(fx) + { + for(dy=0;dy<h;dy++) + for(dx=0;dx<w;dx++) + drawgfx_transpen(bitmap,cliprect,machine.gfx[0],spr_offs++,colour,1,0,((x+16*w)-(dx+1)*16),(y+dy*16),0); + } + else + { + for(dy=0;dy<h;dy++) + for(dx=0;dx<w;dx++) + drawgfx_transpen(bitmap,cliprect,machine.gfx[0],spr_offs++,colour,0,0,(x+dx*16),(y+dy*16),0); + } + } +} + +static SCREEN_UPDATE(kingdrby) +{ + kingdrby_state *state = screen->machine().driver_data<kingdrby_state>(); + const rectangle &visarea = screen->visible_area(); + rectangle clip; + tilemap_set_scrollx( state->m_sc0_tilemap,0, state->m_vram[0x342]); + tilemap_set_scrolly( state->m_sc0_tilemap,0, state->m_vram[0x341]); + tilemap_set_scrollx( state->m_sc1_tilemap,0, state->m_vram[0x342]); + tilemap_set_scrolly( state->m_sc1_tilemap,0, state->m_vram[0x341]); + tilemap_set_scrolly( state->m_sc0w_tilemap,0, 32); + + /* maybe it needs two window tilemaps? (one at the top, the other at the bottom)*/ + clip.min_x = visarea.min_x; + clip.max_x = 256; + clip.min_y = 192; + clip.max_y = visarea.max_y; + + /*TILEMAP_DRAW_CATEGORY + TILEMAP_DRAW_OPAQUE doesn't suit well?*/ + tilemap_draw(bitmap,cliprect,state->m_sc0_tilemap,0,0); + draw_sprites(screen->machine(),bitmap,cliprect); + tilemap_draw(bitmap,cliprect,state->m_sc1_tilemap,TILEMAP_DRAW_CATEGORY(1),0); + tilemap_draw(bitmap,&clip,state->m_sc0w_tilemap,0,0); + + return 0; +} + +static WRITE8_HANDLER( sc0_vram_w ) +{ + kingdrby_state *state = space->machine().driver_data<kingdrby_state>(); + state->m_vram[offset] = data; + tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset); + tilemap_mark_tile_dirty(state->m_sc0w_tilemap,offset); + tilemap_mark_tile_dirty(state->m_sc1_tilemap,offset); +} + +static WRITE8_HANDLER( sc0_attr_w ) +{ + kingdrby_state *state = space->machine().driver_data<kingdrby_state>(); + state->m_attr[offset] = data; + tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset); + tilemap_mark_tile_dirty(state->m_sc0w_tilemap,offset); + tilemap_mark_tile_dirty(state->m_sc1_tilemap,offset); +} + +/************************************* + * + * I/O + * + *************************************/ + +/* hopper I/O */ + +static READ8_DEVICE_HANDLER( hopper_io_r ) +{ + kingdrby_state *state = device->machine().driver_data<kingdrby_state>(); + return (input_port_read(device->machine(),"HPIO") & 0x3f) | state->m_p1_hopper | state->m_p2_hopper; +} + +static WRITE8_DEVICE_HANDLER( hopper_io_w ) +{ + kingdrby_state *state = device->machine().driver_data<kingdrby_state>(); + state->m_p1_hopper = (data & 0x8)<<3; + state->m_p2_hopper = (data & 0x4)<<5; +// printf("%02x\n",data); +} + +static WRITE8_DEVICE_HANDLER( sound_cmd_w ) +{ + kingdrby_state *state = device->machine().driver_data<kingdrby_state>(); + cputag_set_input_line(device->machine(), "soundcpu", INPUT_LINE_NMI, PULSE_LINE); + state->m_sound_cmd = data; + /* soundlatch is unneeded since we are already using perfect interleave. */ + // soundlatch_w(space,0, data); +} + + +/* No idea about what's this (if it's really a mux etc.)*/ +static WRITE8_DEVICE_HANDLER( outport2_w ) +{ + kingdrby_state *state = device->machine().driver_data<kingdrby_state>(); +// popmessage("PPI1 port C(upper) out: %02X", data); + state->m_mux_data = data & 0x80; +} + +static READ8_DEVICE_HANDLER( input_mux_r ) +{ + kingdrby_state *state = device->machine().driver_data<kingdrby_state>(); + if(state->m_mux_data & 0x80) + return input_port_read(device->machine(),"MUX0"); + else + return input_port_read(device->machine(),"MUX1"); +} + +static READ8_DEVICE_HANDLER( key_matrix_r ) +{ + UINT16 p1_val,p2_val; + UINT8 p1_res,p2_res; + + p1_val = input_port_read(device->machine(),"KEY_1P"); + p2_val = input_port_read(device->machine(),"KEY_2P"); + + p1_res = 0; + p2_res = 0; + + switch(p1_val) + { + case 0x0001: p1_res = 0x01; break; + case 0x0002: p1_res = 0x02; break; + case 0x0004: p1_res = 0x03; break; + case 0x0008: p1_res = 0x04; break; + case 0x0010: p1_res = 0x05; break; + case 0x0020: p1_res = 0x06; break; + case 0x0040: p1_res = 0x07; break; + case 0x0080: p1_res = 0x08; break; + case 0x0100: p1_res = 0x09; break; + case 0x0200: p1_res = 0x0a; break; + case 0x0400: p1_res = 0x0b; break; + case 0x0800: p1_res = 0x0c; break; + case 0x1000: p1_res = 0x0d; break; + case 0x2000: p1_res = 0x0e; break; + case 0x4000: p1_res = 0x0f; break; + } + + switch(p2_val) + { + case 0x0001: p2_res = 0x01; break; + case 0x0002: p2_res = 0x02; break; + case 0x0004: p2_res = 0x03; break; + case 0x0008: p2_res = 0x04; break; + case 0x0010: p2_res = 0x05; break; + case 0x0020: p2_res = 0x06; break; + case 0x0040: p2_res = 0x07; break; + case 0x0080: p2_res = 0x08; break; + case 0x0100: p2_res = 0x09; break; + case 0x0200: p2_res = 0x0a; break; + case 0x0400: p2_res = 0x0b; break; + case 0x0800: p2_res = 0x0c; break; + case 0x1000: p2_res = 0x0d; break; + case 0x2000: p2_res = 0x0e; break; + case 0x4000: p2_res = 0x0f; break; + } + + return p1_res | (p2_res<<4); +} + +static READ8_DEVICE_HANDLER( sound_cmd_r ) +{ + kingdrby_state *state = device->machine().driver_data<kingdrby_state>(); + return state->m_sound_cmd; +} + +static WRITE8_HANDLER( led_array_w ) +{ + /* + offset = directly tied with the button (i.e. offset 1 = 1-2, offset 2 = 1-3 etc.) + data = xxxx ---- p2 array + ---- xxxx p1 array + they goes from 0 to 5, to indicate the number. + If one player bets something, the other led will toggle between p1 and p2 bets. + */ +} + +/************************************* + * + * Memory Map + * + *************************************/ + +static ADDRESS_MAP_START( master_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x2fff) AM_ROM + AM_RANGE(0x3000, 0x33ff) AM_RAM AM_MIRROR(0xc00) AM_SHARE("share1") + AM_RANGE(0x4000, 0x43ff) AM_RAM_WRITE(sc0_vram_w) AM_BASE_MEMBER(kingdrby_state, m_vram) + AM_RANGE(0x5000, 0x53ff) AM_RAM_WRITE(sc0_attr_w) AM_BASE_MEMBER(kingdrby_state, m_attr) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( master_io_map, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x00) AM_NOP //interrupt ack +ADDRESS_MAP_END + +static ADDRESS_MAP_START( slave_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x2fff) AM_ROM + AM_RANGE(0x3000, 0x3fff) AM_ROM //sound rom tested for the post check + AM_RANGE(0x4000, 0x43ff) AM_RAM AM_SHARE("nvram") //backup ram + AM_RANGE(0x5000, 0x5003) AM_DEVREADWRITE("ppi8255_0", ppi8255_r, ppi8255_w) /* I/O Ports */ + AM_RANGE(0x6000, 0x6003) AM_DEVREADWRITE("ppi8255_1", ppi8255_r, ppi8255_w) /* I/O Ports */ + AM_RANGE(0x7000, 0x73ff) AM_RAM AM_SHARE("share1") + AM_RANGE(0x7400, 0x74ff) AM_RAM AM_BASE_MEMBER(kingdrby_state, m_spriteram) + AM_RANGE(0x7600, 0x7600) AM_DEVWRITE_MODERN("crtc", mc6845_device, address_w) + AM_RANGE(0x7601, 0x7601) AM_DEVREADWRITE_MODERN("crtc", mc6845_device, register_r, register_w) + AM_RANGE(0x7801, 0x780f) AM_WRITE(led_array_w) + AM_RANGE(0x7a00, 0x7a00) AM_RAM //buffer for the key matrix + AM_RANGE(0x7c00, 0x7c00) AM_READ_PORT("DSW") +ADDRESS_MAP_END + +static WRITE8_HANDLER( kingdrbb_lamps_w ) +{ + // (same as the inputs but active high) +} + +static ADDRESS_MAP_START( slave_1986_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x2fff) AM_ROM + AM_RANGE(0x3000, 0x3fff) AM_ROM //sound rom tested for the post check + AM_RANGE(0x4000, 0x47ff) AM_RAM AM_SHARE("nvram") //backup ram + AM_RANGE(0x5000, 0x5003) AM_DEVREADWRITE("ppi8255_0", ppi8255_r, ppi8255_w) /* I/O Ports */ +// AM_RANGE(0x6000, 0x6003) AM_DEVREADWRITE("ppi8255_1", ppi8255_r, ppi8255_w) /* I/O Ports */ + AM_RANGE(0x7000, 0x73ff) AM_RAM AM_SHARE("share1") + AM_RANGE(0x7400, 0x74ff) AM_RAM AM_BASE_MEMBER(kingdrby_state, m_spriteram) + AM_RANGE(0x7600, 0x7600) AM_DEVWRITE_MODERN("crtc", mc6845_device, address_w) + AM_RANGE(0x7601, 0x7601) AM_DEVREADWRITE_MODERN("crtc", mc6845_device, register_r, register_w) + AM_RANGE(0x7800, 0x7800) AM_READ_PORT("KEY0") + AM_RANGE(0x7801, 0x7801) AM_READ_PORT("KEY1") + AM_RANGE(0x7802, 0x7802) AM_READ_PORT("KEY2") + AM_RANGE(0x7803, 0x7803) AM_READ_PORT("KEY3") + AM_RANGE(0x7800, 0x7803) AM_WRITE(kingdrbb_lamps_w) + AM_RANGE(0x7a00, 0x7a00) AM_READ_PORT("SYSTEM") + AM_RANGE(0x7c00, 0x7c00) AM_READ_PORT("DSW") +ADDRESS_MAP_END + +static ADDRESS_MAP_START( slave_io_map, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x00) AM_NOP //interrupt ack +ADDRESS_MAP_END + +static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x0fff) AM_ROM + AM_RANGE(0x2000, 0x23ff) AM_RAM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( sound_io_map, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x40, 0x40) AM_DEVREAD("aysnd", ay8910_r) + AM_RANGE(0x40, 0x41) AM_DEVWRITE("aysnd", ay8910_data_address_w) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( cowrace_sound_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x1fff) AM_ROM + AM_RANGE(0x2000, 0x23ff) AM_RAM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( cowrace_sound_io, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x40, 0x41) AM_DEVWRITE("aysnd", ym2203_w) +ADDRESS_MAP_END + + +/************************************* +* +* PPI configuration +* +* 5000-5003 PPI group modes 0/0 - A & B as input, C (all) as output. +* 6000-6003 PPI group modes 0/0 - B & C (lower) as input, A & C (upper) as output. +* +*************************************/ + +static const ppi8255_interface ppi8255_intf[2] = +{ + /* A & B as input, C (all) as output */ + { + DEVCB_HANDLER(hopper_io_r), /* Port A read */ + DEVCB_INPUT_PORT("IN1"), /* Port B read */ + DEVCB_NULL, /* Port C read */ + DEVCB_NULL, /* Port A write */ + DEVCB_NULL, /* Port B write */ + DEVCB_HANDLER(hopper_io_w) /* Port C write */ + }, + + /* B & C (lower) as input, A & C (upper) as output */ + { + DEVCB_NULL, /* Port A read */ + DEVCB_HANDLER(key_matrix_r),/* Port B read */ + DEVCB_HANDLER(input_mux_r), /* Port C read */ + DEVCB_HANDLER(sound_cmd_w), /* Port A write */ + DEVCB_NULL, /* Port B write */ + DEVCB_HANDLER(outport2_w) /* Port C write */ + } +}; + +static WRITE8_DEVICE_HANDLER( outportb_w ) +{ +// printf("%02x B\n",data); +} + + +static const ppi8255_interface ppi8255_1986_intf[2] = +{ + /* C as input, (all) as output */ + { + DEVCB_NULL, /* Port A read */ + DEVCB_INPUT_PORT("IN0"), /* Port B read */ + DEVCB_INPUT_PORT("IN1"), /* Port C read */ + DEVCB_HANDLER(sound_cmd_w), /* Port A write */ + DEVCB_HANDLER(outportb_w), /* Port B write */ + DEVCB_NULL /* Port C write */ + }, + + /* actually unused */ + { + DEVCB_NULL, /* Port A read */ + DEVCB_NULL, /* Port B read */ + DEVCB_NULL, /* Port C read */ + DEVCB_NULL, /* Port A write */ + DEVCB_NULL, /* Port B write */ + DEVCB_NULL /* Port C write */ + } +}; + +/************************************* + * + * Input Port Definitions + * + *************************************/ + +static INPUT_PORTS_START( kingdrby ) + /*this might be different.*/ + PORT_START("HPIO") // ppi0 (5000) + PORT_DIPNAME( 0x01, 0x01, "HPIO" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) //1p hopper i/o + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) //2p hopper i/o + + PORT_START("IN1") // ppi0 (5001) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VBLANK ) //? + PORT_DIPNAME( 0x02, 0x02, "IN1" ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME( "Analyzer" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("1P Coin") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_NAME("2P Coin") + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("KEY_1P") // ppi1 (6001) + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("1P 1-2") PORT_CODE(KEYCODE_Q) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("1P 1-3") PORT_CODE(KEYCODE_W) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("1P 1-4") PORT_CODE(KEYCODE_E) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("1P 1-5") PORT_CODE(KEYCODE_R) + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("1P 1-6") PORT_CODE(KEYCODE_T) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("1P 2-3") PORT_CODE(KEYCODE_A) + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("1P 2-4") PORT_CODE(KEYCODE_S) + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("1P 2-5") PORT_CODE(KEYCODE_D) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("1P 2-6") PORT_CODE(KEYCODE_F) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("1P 3-4") PORT_CODE(KEYCODE_G) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("1P 3-5") PORT_CODE(KEYCODE_H) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON12 ) PORT_NAME("1P 3-6") PORT_CODE(KEYCODE_Z) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON13 ) PORT_NAME("1P 4-5") PORT_CODE(KEYCODE_X) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON14 ) PORT_NAME("1P 4-6") PORT_CODE(KEYCODE_C) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON15 ) PORT_NAME("1P 5-6") PORT_CODE(KEYCODE_V) + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("KEY_2P") // ppi1 (6001) + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("2P 1-2") PORT_CODE(KEYCODE_Q) PORT_COCKTAIL + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("2P 1-3") PORT_CODE(KEYCODE_W) PORT_COCKTAIL + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("2P 1-4") PORT_CODE(KEYCODE_E) PORT_COCKTAIL + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("2P 1-5") PORT_CODE(KEYCODE_R) PORT_COCKTAIL + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("2P 1-6") PORT_CODE(KEYCODE_T) PORT_COCKTAIL + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("2P 2-3") PORT_CODE(KEYCODE_A) PORT_COCKTAIL + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("2P 2-4") PORT_CODE(KEYCODE_S) PORT_COCKTAIL + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("2P 2-5") PORT_CODE(KEYCODE_D) PORT_COCKTAIL + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("2P 2-6") PORT_CODE(KEYCODE_F) PORT_COCKTAIL + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("2P 3-4") PORT_CODE(KEYCODE_G) PORT_COCKTAIL + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("2P 3-5") PORT_CODE(KEYCODE_H) PORT_COCKTAIL + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON12 ) PORT_NAME("2P 3-6") PORT_CODE(KEYCODE_Z) PORT_COCKTAIL + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON13 ) PORT_NAME("2P 4-5") PORT_CODE(KEYCODE_X) PORT_COCKTAIL + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON14 ) PORT_NAME("2P 4-6") PORT_CODE(KEYCODE_C) PORT_COCKTAIL + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON15 ) PORT_NAME("2P 5-6") PORT_CODE(KEYCODE_V) PORT_COCKTAIL + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("MUX0") // ppi1 (6002) + PORT_DIPNAME( 0x01, 0x01, "SYSTEM" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("MUX1") + PORT_DIPNAME( 0x01, 0x01, "SYSTEM" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("DSW") + PORT_DIPNAME( 0x01, 0x01, "SYSTEM" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, "Game Type?" ) //enables two new msgs "advance" and "exchange" in analyzer mode + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, "POST Check" ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Reset Backup RAM" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( kingdrbb ) + /*this might be different.*/ + PORT_START("HPIO") // ppi0 (5000) + PORT_DIPNAME( 0x01, 0x01, "HPIO" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) //1p hopper i/o + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) //2p hopper i/o + + PORT_START("IN0") // ppi0 (5001) + PORT_DIPNAME( 0x01, 0x01, "IN0" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("IN1") // ppi0 (5001) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VBLANK ) //? + PORT_DIPNAME( 0x02, 0x02, "IN1" ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("SYSTEM") // ppi0 (5001) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_DIPNAME( 0x02, 0x02, "SYSTEM" ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) //causes "hopper overpay" msg + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("KEY0") // (7800) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("1P 1-2") PORT_CODE(KEYCODE_Q) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("1P 1-3") PORT_CODE(KEYCODE_W) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("1P 1-4") PORT_CODE(KEYCODE_E) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("1P 1-5") PORT_CODE(KEYCODE_R) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("KEY1") // (7801) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("1P 1-6") PORT_CODE(KEYCODE_T) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("1P 2-3") PORT_CODE(KEYCODE_A) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("1P 2-4") PORT_CODE(KEYCODE_S) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("1P 2-5") PORT_CODE(KEYCODE_D) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("KEY2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_NAME("1P 2-6") PORT_CODE(KEYCODE_F) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_NAME("1P 3-4") PORT_CODE(KEYCODE_G) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON11 ) PORT_NAME("1P 3-5") PORT_CODE(KEYCODE_H) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON12 ) PORT_NAME("1P 3-6") PORT_CODE(KEYCODE_Z) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("KEY3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON13 ) PORT_NAME("1P 4-5") PORT_CODE(KEYCODE_X) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON14 ) PORT_NAME("1P 4-6") PORT_CODE(KEYCODE_C) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON15 ) PORT_NAME("1P 5-6") PORT_CODE(KEYCODE_V) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("DSW") + PORT_DIPNAME( 0x01, 0x01, "SYSTEM" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, "Game Type?" ) //enables two new msgs "advance" and "exchange" in analyzer mode + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, "POST Check" ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Reset Backup RAM" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +/************************************* +* +* GFX decoding +* +*************************************/ + +static const gfx_layout layout8x8x2 = +{ + 8,8, + RGN_FRAC(1,2), + 2, + { + RGN_FRAC(1,2), + RGN_FRAC(0,2) + }, + { STEP8(0,1) }, + { STEP8(0,8) }, + 8*8 +}; + +static const gfx_layout layout16x16x2 = +{ + 16,16, + RGN_FRAC(1,2), + 2, + { + RGN_FRAC(1,2), + RGN_FRAC(0,2) + }, + { 0,1,2,3,4,5,6,7,16*8+0,16*8+1,16*8+2,16*8+3,16*8+4,16*8+5,16*8+6,16*8+7 }, + { 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8,8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8 }, + 16*16 +}; + +/* seems more suitable with 2bpp?*/ +static const gfx_layout cowrace_layout16x16x2 = +{ + 16,16, + RGN_FRAC(1,2), + 2, + { + RGN_FRAC(1,2), + RGN_FRAC(0,2), + }, + { 16*8+0,16*8+1,16*8+2,16*8+3,16*8+4,16*8+5,16*8+6,16*8+7,0,1,2,3,4,5,6,7 }, + { 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8,8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8 }, + 16*16 +}; + +static GFXDECODE_START( kingdrby ) + GFXDECODE_ENTRY( "gfx1", 0x0000, layout16x16x2, 0x080, 0x10 ) + GFXDECODE_ENTRY( "gfx2", 0x0000, layout8x8x2, 0x000, 0x80 ) +GFXDECODE_END + +static GFXDECODE_START( cowrace ) + GFXDECODE_ENTRY( "gfx1", 0x000000, cowrace_layout16x16x2, 0x080, 0x10 ) + GFXDECODE_ENTRY( "gfx2", 0x000000, layout8x8x2, 0x000, 0x80 ) +GFXDECODE_END + +/********************************************************************************************************** +* +* MC6845 interface +* +* screen size: 384x272 registers 00 & 04. (value-1) +* visible area: 256x224 registers 01 & 06. +* +* the clocks are a guess, but is the only logical combination I found to get a reasonable vertical of ~53Hz. +* +***********************************************************************************************************/ + +static const mc6845_interface mc6845_intf = +{ + "screen", /* screen we are acting on */ + 8, /* number of pixels per video memory address */ + NULL, /* before pixel update callback */ + NULL, /* row update callback */ + NULL, /* after pixel update callback */ + DEVCB_NULL, /* callback for display state changes */ + DEVCB_NULL, /* callback for cursor state changes */ + DEVCB_NULL, /* HSYNC callback */ + DEVCB_NULL, /* VSYNC callback */ + NULL /* update address callback */ +}; + +/************************************* + * + * Sound HW Config + * + *************************************/ + +static const ay8910_interface ay8910_config = +{ + AY8910_LEGACY_OUTPUT, + AY8910_DEFAULT_LOADS, + DEVCB_HANDLER(sound_cmd_r), + DEVCB_NULL, /* discrete read? */ + DEVCB_NULL, + DEVCB_NULL /* discrete write? */ +}; + +static const ym2203_interface cowrace_ym2203_interface = +{ + { + AY8910_LEGACY_OUTPUT, + AY8910_DEFAULT_LOADS, + DEVCB_HANDLER(sound_cmd_r), // read A + DEVCB_DEVICE_MEMBER("oki", okim6295_device, read), // read B + DEVCB_NULL, // write A + DEVCB_DEVICE_MEMBER("oki", okim6295_device, write) // write B + }, + NULL +}; + +static PALETTE_INIT(kingdrby) +{ + int bit0, bit1, bit2 , r, g, b; + int i; + + for (i = 0; i < 0x200; ++i) + { + bit0 = 0; + bit1 = (color_prom[0] >> 1) & 0x01; + bit2 = (color_prom[0] >> 0) & 0x01; + b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (color_prom[0] >> 4) & 0x01; + bit1 = (color_prom[0] >> 3) & 0x01; + bit2 = (color_prom[0] >> 2) & 0x01; + g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (color_prom[0] >> 7) & 0x01; + bit1 = (color_prom[0] >> 6) & 0x01; + bit2 = (color_prom[0] >> 5) & 0x01; + r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + + palette_set_color(machine, i, MAKE_RGB(r, g, b)); + color_prom++; + } +} + +static PALETTE_INIT(kingdrbb) +{ + UINT8 *raw_prom = machine.region("raw_prom")->base(); + UINT8 *prom = machine.region("proms")->base(); + int bit0, bit1, bit2 , r, g, b; + int i; + + for(i = 0; i < 0x200; i++) + { + /* this set has an extra address line shuffle applied on the prom */ + prom[i] = raw_prom[BITSWAP16(i, 15,14,13,12,11,10,9,8,7,6,5,0,1,2,3,4)+0x1000]; + } + + for(i = 0; i < 0x200; i++) + { + bit0 = 0; + bit1 = (prom[i] >> 1) & 0x01; + bit2 = (prom[i] >> 0) & 0x01; + b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (prom[i] >> 4) & 0x01; + bit1 = (prom[i] >> 3) & 0x01; + bit2 = (prom[i] >> 2) & 0x01; + g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (prom[i] >> 7) & 0x01; + bit1 = (prom[i] >> 6) & 0x01; + bit2 = (prom[i] >> 5) & 0x01; + r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + + palette_set_color(machine, i, MAKE_RGB(r, g, b)); + } +} + +static MACHINE_CONFIG_START( kingdrby, kingdrby_state ) + MCFG_CPU_ADD("master", Z80, CLK_2) + MCFG_CPU_PROGRAM_MAP(master_map) + MCFG_CPU_IO_MAP(master_io_map) + MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + + MCFG_CPU_ADD("slave", Z80, CLK_2) + MCFG_CPU_PROGRAM_MAP(slave_map) + MCFG_CPU_IO_MAP(slave_io_map) + MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + + MCFG_CPU_ADD("soundcpu", Z80, CLK_2) + MCFG_CPU_PROGRAM_MAP(sound_map) + MCFG_CPU_IO_MAP(sound_io_map) + MCFG_CPU_PERIODIC_INT(irq0_line_hold,1000) /* guess, controls ay8910 tempo.*/ + + MCFG_QUANTUM_PERFECT_CPU("master") + + MCFG_NVRAM_ADD_0FILL("nvram") + + MCFG_PPI8255_ADD( "ppi8255_0", ppi8255_intf[0] ) + MCFG_PPI8255_ADD( "ppi8255_1", ppi8255_intf[1] ) + + MCFG_GFXDECODE(kingdrby) + MCFG_PALETTE_LENGTH(0x200) + MCFG_PALETTE_INIT(kingdrby) + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ + MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_SIZE(256, 256) + MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 224-1) /* controlled by CRTC */ + MCFG_SCREEN_UPDATE(kingdrby) + + MCFG_VIDEO_START(kingdrby) + + MCFG_MC6845_ADD("crtc", MC6845, CLK_1/32, mc6845_intf) /* 53.333 Hz. guess */ + + MCFG_SPEAKER_STANDARD_MONO("mono") + + MCFG_SOUND_ADD("aysnd", AY8910, CLK_1/8) /* guess */ + MCFG_SOUND_CONFIG(ay8910_config) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( kingdrbb, kingdrby ) + + MCFG_CPU_MODIFY("slave") + MCFG_CPU_PROGRAM_MAP(slave_1986_map) + + MCFG_PALETTE_INIT(kingdrbb) + + MCFG_PPI8255_RECONFIG( "ppi8255_0", ppi8255_1986_intf[0] ) + MCFG_PPI8255_RECONFIG( "ppi8255_1", ppi8255_1986_intf[1] ) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( cowrace, kingdrbb ) + + MCFG_CPU_MODIFY("soundcpu") + MCFG_CPU_PROGRAM_MAP(cowrace_sound_map) + MCFG_CPU_IO_MAP(cowrace_sound_io) + + MCFG_GFXDECODE(cowrace) + MCFG_PALETTE_INIT(kingdrby) + + MCFG_OKIM6295_ADD("oki", 1056000, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) + + MCFG_SOUND_REPLACE("aysnd", YM2203, 3000000) + MCFG_SOUND_CONFIG(cowrace_ym2203_interface) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) +MACHINE_CONFIG_END + +ROM_START( kingdrby ) + ROM_REGION( 0x3000, "master", 0 ) + ROM_LOAD( "im4_d.d6", 0x0000, 0x1000, CRC(20f2d999) SHA1(91db46059f32b4791460df3330260f4e60f016a5) ) + ROM_LOAD( "im5_d.c6", 0x1000, 0x1000, CRC(c192cecc) SHA1(63436bf3d9c1e34f6549830c8164295b7758d666) ) + ROM_LOAD( "im6_d.b6", 0x2000, 0x1000, CRC(257f4e0d) SHA1(cd61f3cf70c536aa207ebfdd28be54ac586b5249) ) + + ROM_REGION( 0x1000, "soundcpu", 0 ) + ROM_LOAD( "sg1_b.e1", 0x0000, 0x1000, CRC(92ef3c13) SHA1(1bf1e4106b37aadfc02822184510740e18a54d5c) ) + + ROM_REGION( 0x4000, "slave", 0 ) + ROM_LOAD( "im1_yk.g1", 0x0000, 0x1000, CRC(1921605d) SHA1(0aa6f7195ea59d0080620ab02a737e5c319dd3e7) ) + ROM_LOAD( "im2_yk.f1", 0x1000, 0x1000, CRC(8504314e) SHA1(309645e17fb3149dce57ae6844cc58652a1eeb35) ) + ROM_LOAD( "im3_yk.e1", 0x2000, 0x1000, CRC(b0e473ec) SHA1(234598548b2a2a8f53d40bc07c3b1759074b7d93) ) + ROM_COPY( "soundcpu", 0x0000, 0x3000, 0x1000 ) + + /* sprites gfxs */ + ROM_REGION( 0x8000, "gfx1", 0 ) + ROM_LOAD( "s1.d1", 0x0000, 0x1000, CRC(26974007) SHA1(5079daf9ad7d84f935c256458060db9497daef91) ) + ROM_LOAD( "s2.e1", 0x1000, 0x1000, CRC(bedebfa7) SHA1(5a2116ed4af6bc4b72199017515980e4a937236c) ) + ROM_LOAD( "s3.f1", 0x2000, 0x1000, CRC(0aa59571) SHA1(5005ffdd0030e4d4c1d8033fd3c78177c0fbd1b0) ) + ROM_LOAD( "s4.g1", 0x3000, 0x1000, CRC(ccd5fb0e) SHA1(3ee4377d15e7731586b7a3457dbae52edaed72d3) ) + ROM_LOAD( "s5.d2", 0x4000, 0x1000, CRC(32613df3) SHA1(21ce057c416e6f1d0a3e112d640b1cf52ba69206) ) + ROM_LOAD( "s6.e2", 0x5000, 0x1000, CRC(a151c422) SHA1(354efaee64c8cc457f96cba4722f6a0df66e14d3) ) + ROM_LOAD( "s7.f2", 0x6000, 0x1000, CRC(7cfcee55) SHA1(590ac02941e82371d56113d052eb4d4bcdbf83b0) ) + ROM_LOAD( "s8.g2", 0x7000, 0x1000, CRC(ad667c05) SHA1(d9bdf3a125eba2d40191b0659c2007ccbc6fd12b) ) + + /* tile gfxs */ + ROM_REGION( 0x2000, "gfx2", 0 ) + ROM_LOAD( "s9_a.k8", 0x0000, 0x1000, CRC(ca82cd81) SHA1(fdf47df7705c8d0ae70b5a0e29b35819f3d0749a) ) + ROM_LOAD( "s10_a.l8", 0x1000, 0x1000, CRC(37b2736f) SHA1(15ef3f563aebd1f5506135c7c01e9a1db30a9ccc) ) + + /* color proms */ + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "147.f8", 0x000, 0x200, CRC(9245c4af) SHA1(813d628ac55913542a4deabe6ac0a4f9db09cf19) ) +ROM_END + +// might be closer to the original than the cowrace bootleg even if it shares some roms with cowrace? +ROM_START( kingdrbb ) // has 'Made in Taiwan' on the PCB. + ROM_REGION( 0x8000, "master", 0 ) + ROM_LOAD( "kingdrbb_u3.bin", 0x0000, 0x4000, CRC(90a14686) SHA1(ce2ee8c0cbb4212aa8e71d7145b1eefb4f282590) ) + ROM_CONTINUE(0x0000,0x4000) + + ROM_REGION( 0x4000, "slave", 0 ) // slave z80? + ROM_LOAD( "kingdrbb_u30.bin", 0x0000, 0x4000, CRC(98717214) SHA1(70ca61c15f66642b85dd248b24638a95a8254bbb) ) + ROM_CONTINUE(0x0000,0x4000) + + ROM_REGION( 0x4000, "soundcpu", 0 ) // audio z80? + ROM_LOAD( "kingdrbb_u161.bin", 0x0000, 0x4000, CRC(7d84b577) SHA1(d230b49df19bf68793a561f4c07413d22fa8ff28) ) + + ROM_REGION( 0x8000, "gfx1", 0 ) + ROM_LOAD( "kingdrbb_u94.bin", 0x0000, 0x4000, CRC(ba59e4b8) SHA1(425dc4055d5ea400eeef33e26fcc73fa726f414d) ) + ROM_LOAD( "kingdrbb_u95.bin", 0x4000, 0x4000, CRC(fa97deb6) SHA1(1630281f0cac3fe3bfaf924e1c6316107200eb4a) ) + + ROM_REGION( 0x4000, "gfx2", 0 ) + ROM_LOAD( "kingdrbb_u39.bin", 0x0000, 0x2000, CRC(4a34cef0) SHA1(b54f1f2ccd3dd773e47bfb044c5aec15c11426c2) ) + ROM_LOAD( "kingdrbb_u140.bin", 0x2000, 0x2000, CRC(7e24b674) SHA1(c774efeb8e4e833e73c29007d5294c93df1abef4) ) + + ROM_REGION( 0x4000, "raw_prom", 0 ) + ROM_LOAD( "kingdrbb_u1.bin", 0x0000, 0x4000, CRC(97931952) SHA1(a0ef3be105f2ed7f744c73e92c583d25bb322e6a) ) // palette but in a normal rom? + + ROM_REGION( 0x200, "proms", ROMREGION_ERASE00 ) // address shuffled, decoded inside PALETTE_INIT +// ROM_COPY( "raw_prom", 0x1000, 0x000, 0x200 ) +// ROM_COPY( "raw_prom", 0x3000, 0x200, 0x200 ) //identical to 0x1000 bank + + ROM_REGION( 0x4000, "pals", 0 ) // all read protected + ROM_LOAD( "palce16v.u101.bin", 0x0000, 0x117, CRC(c89d2f52) SHA1(f9d52d9c42ef95b7b85bbf6d09888ebdeac11fd3) ) + ROM_LOAD( "palce16v.u113.bin", 0x0000, 0x117, CRC(c89d2f52) SHA1(f9d52d9c42ef95b7b85bbf6d09888ebdeac11fd3) ) + ROM_LOAD( "palce16v.u160.bin", 0x0000, 0x117, CRC(c89d2f52) SHA1(f9d52d9c42ef95b7b85bbf6d09888ebdeac11fd3) ) + ROM_LOAD( "palce16v.u2.bin", 0x0000, 0x117, CRC(c89d2f52) SHA1(f9d52d9c42ef95b7b85bbf6d09888ebdeac11fd3) ) + ROM_LOAD( "palce16v.u29.bin", 0x0000, 0x117, CRC(c89d2f52) SHA1(f9d52d9c42ef95b7b85bbf6d09888ebdeac11fd3) ) + ROM_LOAD( "palce16v.u4.bin", 0x0000, 0x117, CRC(c89d2f52) SHA1(f9d52d9c42ef95b7b85bbf6d09888ebdeac11fd3) ) + ROM_LOAD( "palce16v.u75.bin", 0x0000, 0x117, CRC(c89d2f52) SHA1(f9d52d9c42ef95b7b85bbf6d09888ebdeac11fd3) ) + // jedutil just complains these are invalid.. + ROM_LOAD( "palce16v8q.u53.jed", 0x0000, 0x892, CRC(123d539a) SHA1(cccf0cbae3175b091a998eedf4aa44a55b679400) ) + ROM_LOAD( "palce16v8q.u77.jed", 0x0000, 0x892, CRC(b7956421) SHA1(57db38b571adf6cf49d7c221cd65a068a9a3383a) ) + ROM_LOAD( "palce16v8q.u87.jed", 0x0000, 0x892, CRC(b7956421) SHA1(57db38b571adf6cf49d7c221cd65a068a9a3383a) ) +ROM_END + +ROM_START( cowrace ) + ROM_REGION( 0x8000, "master", 0 ) + ROM_LOAD( "u3.bin", 0x0000, 0x8000, CRC(c05c3bd3) SHA1(b7199a069ab45edd25e021589b79105cdfa5511a) ) + + ROM_REGION( 0x8000, "slave", ROMREGION_ERASEFF ) // slave z80? + /* I've tried the kingdrbb slave CPU rom ... game works until the auto race in attract mode. We need to locate and dump this on the PCB. */ + ROM_LOAD( "slave.bin", 0x0000, 0x8000, NO_DUMP ) + ROM_FILL( 0x0000, 0x8000, 0xff ) // <- to remove once that the above is dumped + + ROM_REGION( 0x2000, "soundcpu", 0 ) + ROM_LOAD( "u164.bin", 0x0000, 0x2000, CRC(9affa1c8) SHA1(bfc07693e8f749cbf20ab8cda33975b66f567962) ) + + ROM_REGION( 0x10000, "gfx1", 0 ) + ROM_LOAD( "u94.bin", 0x8000, 0x8000, CRC(945dc115) SHA1(bdd145234e6361c42ed20e8ca4cac64f07332748) ) + ROM_LOAD( "u95.bin", 0x0000, 0x8000, CRC(fc1fc006) SHA1(326a67c1ea0f487ecc8b7aef2d90124a01e6dee3) ) + + ROM_REGION( 0x4000, "gfx2", 0 ) + ROM_LOAD( "u139.bin", 0x2000, 0x2000, CRC(b746bb2f) SHA1(5f5f48752689079ed65fe7bb4a69512ada5db05d) ) + ROM_LOAD( "u140.bin", 0x0000, 0x2000, CRC(7e24b674) SHA1(c774efeb8e4e833e73c29007d5294c93df1abef4) ) + + ROM_REGION( 0x40000, "oki", 0 ) + ROM_LOAD( "u4.bin", 0x00000, 0x20000, CRC(f92a3ab5) SHA1(fc164492793597eadb8a50154410936edb74fa23) ) + + ROM_REGION( 0x20000, "proms", 0 ) + ROM_LOAD( "u149.bin", 0x00000, 0x200, CRC(f41a5eca) SHA1(797f2d95d4e00f96e5a99604935810e1add59689) ) +ROM_END + + +GAME( 1981, kingdrby, 0, kingdrby, kingdrby, 0, ROT0, "Tazmi", "King Derby (1981)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS| GAME_IMPERFECT_SOUND ) +GAME( 1986, kingdrbb, kingdrby, kingdrbb, kingdrbb, 0, ROT0, "bootleg (Casino Electronics)", "King Derby (Taiwan bootleg)", GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS ) +GAME( 2000, cowrace, kingdrby, cowrace, kingdrbb, 0, ROT0, "bootleg", "Cow Race (1986 King Derby hack)", GAME_NOT_WORKING | GAME_WRONG_COLORS ) |