/* Super Free Kick / Spinkick by HEC (Haesung Enterprise Co.) driver by Tomasz Slanina Hacked MSX2 home computer hardware. Romset contains modifed ( (c) strings removed and patched boot sequence) MSX2 bios. Yamaha VDP v9938 is hidden in huge epoxy block. There's also an additional Z80 to drive sound. 1 2 3 4 5 6 7 +----------------------------------------------------------------+ | | | C1182 Y3014B YM2203C Z80A a7 | A | | | 1UP GL324 | B | c7 | | 2UP c5 | C | | +-+ DSW1 74139 6116 d7 | D | 21.47727 MHz | +-+ 74241 CN1 74244 | E | | | DSW2 74373 | G | | | 74241 4464 4464 7404 74139 h7 | H | J CN2 | | A 74157 4464 4464 7400 74670 | J | M j7 | | M 40106 74169 7404 7432 74670 | K | A | | 74241 74169 74138 7432 7402 l7 | L | | +-+ 74241 74153 74139 74138 74138 6264 | M | | +-+ 74241 82C55 Z80A 6264 | N | | +----------------------------------------------------------------+ Board # CBK1029 CN1: 40 PIN Connector (Epoxy Block ) CN2: 8 PIN Connector (Epoxy Block) 1UP: 4 PIN Connector (Analog Controls ?) 2UP: 4 PIN Connector (Analog Controls ?) Z8400A (x2) UM82C55A-PC YM2203C */ #include "emu.h" #include "cpu/z80/z80.h" #include "video/v9938.h" #include "machine/8255ppi.h" #include "sound/2203intf.h" #include "deprecat.h" class sfkick_state : public driver_device { public: sfkick_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } UINT8 *m_main_mem; int m_bank_cfg; int m_bank[8]; int m_input_mux; }; #define MSX2_XBORDER_PIXELS 16 #define MSX2_YBORDER_PIXELS 28 #define MSX2_TOTAL_XRES_PIXELS 256 * 2 + (MSX2_XBORDER_PIXELS * 2) #define MSX2_TOTAL_YRES_PIXELS 212 * 2 + (MSX2_YBORDER_PIXELS * 2) #define MSX2_VISIBLE_XBORDER_PIXELS 8 * 2 #define MSX2_VISIBLE_YBORDER_PIXELS 14 * 2 #define MASTER_CLOCK XTAL_21_4772MHz static READ8_DEVICE_HANDLER( ppi_port_b_r ) { sfkick_state *state = device->machine().driver_data(); switch(state->m_input_mux&0x0f) { case 0: return input_port_read(device->machine(), "IN0"); case 1: return input_port_read(device->machine(), "IN1"); case 2: return BITSWAP8(input_port_read(device->machine(), "DIAL"),4,5,6,7,3,2,1,0); case 3: return input_port_read(device->machine(), "DSW2"); case 4: return input_port_read(device->machine(), "DSW1"); } return 0xff; } static void sfkick_remap_banks(running_machine &machine) { sfkick_state *state = machine.driver_data(); /* 0000-3ffff */ switch(state->m_bank_cfg&3) { case 0: /* bios */ { UINT8 *mem = machine.region("bios")->base(); memory_set_bankptr(machine,"bank1", mem); memory_set_bankptr(machine,"bank2", mem+0x2000); } break; case 1: /* ext rom */ { UINT8 *mem = machine.region("extrom")->base(); memory_set_bankptr(machine,"bank1", mem+0x4000); memory_set_bankptr(machine,"bank2", mem+0x6000); } break; case 2: /* banked */ { UINT8 *mem = machine.region("banked")->base(); memory_set_bankptr(machine,"bank1", mem+0x2000*state->m_bank[0]); memory_set_bankptr(machine,"bank2", mem+0x2000*state->m_bank[1]); } break; case 3: /* unknown */ { UINT8 *mem = machine.region("banked")->base(); memory_set_bankptr(machine,"bank1", mem+0x18000); memory_set_bankptr(machine,"bank2", mem+0x18000); } break; } /* 4000-7ffff */ switch((state->m_bank_cfg>>2)&3) { case 0: /* bios - upper part */ { UINT8 *mem = machine.region("bios")->base(); memory_set_bankptr(machine,"bank3", mem+0x4000); memory_set_bankptr(machine,"bank4", mem+0x6000); } break; case 1: /* unknown */ case 3: { UINT8 *mem = machine.region("banked")->base(); memory_set_bankptr(machine,"bank3", mem+0x18000); memory_set_bankptr(machine,"bank4", mem+0x18000); } break; case 2: /* banked */ { UINT8 *mem = machine.region("banked")->base(); memory_set_bankptr(machine,"bank3", mem+0x2000*state->m_bank[2]); memory_set_bankptr(machine,"bank4", mem+0x2000*state->m_bank[3]); } break; } /* 8000-bffff */ switch((state->m_bank_cfg>>4)&3) { case 0: /* cartridge */ { UINT8 *mem = machine.region("cartridge")->base(); memory_set_bankptr(machine,"bank5", mem+0x4000); memory_set_bankptr(machine,"bank6", mem+0x6000); } break; case 1: /* unknown */ case 3: { UINT8 *mem = machine.region("banked")->base(); memory_set_bankptr(machine,"bank5", mem+0x18000); memory_set_bankptr(machine,"bank6", mem+0x18000); } break; case 2: /* banked */ { UINT8 *mem = machine.region("banked")->base(); memory_set_bankptr(machine,"bank5", mem+0x2000*state->m_bank[4]); memory_set_bankptr(machine,"bank6", mem+0x2000*state->m_bank[5]); } break; } /* c000-fffff */ switch((state->m_bank_cfg>>6)&3) { case 0: /* unknown */ case 1: { UINT8 *mem = machine.region("banked")->base(); memory_set_bankptr(machine,"bank7", mem+0x18000); memory_set_bankptr(machine,"bank8", mem+0x18000); } break; case 2: /* banked */ { UINT8 *mem = machine.region("banked")->base(); memory_set_bankptr(machine,"bank7", mem+0x2000*state->m_bank[6]); memory_set_bankptr(machine,"bank8", mem+0x2000*state->m_bank[7]); } break; case 3: /* RAM */ { memory_set_bankptr(machine,"bank7", state->m_main_mem); memory_set_bankptr(machine,"bank8", state->m_main_mem+0x2000); } break; } } static WRITE8_DEVICE_HANDLER ( ppi_port_a_w ) { sfkick_state *state = device->machine().driver_data(); state->m_bank_cfg=data; sfkick_remap_banks(device->machine()); } static void sfkick_bank_set(running_machine &machine,int num, int data) { sfkick_state *state = machine.driver_data(); /* ignore bit 1 */ data&=0xf; num&=5; state->m_bank[num]=data; num|=2; state->m_bank[num]=data; sfkick_remap_banks(machine); } static WRITE8_HANDLER(page0_w) { sfkick_state *state = space->machine().driver_data(); if((state->m_bank_cfg&3)==2) { if(offset<0x2000) { sfkick_bank_set(space->machine(),0,data); } else { sfkick_bank_set(space->machine(),1,data); } } } static WRITE8_HANDLER(page1_w) { sfkick_state *state = space->machine().driver_data(); if(((state->m_bank_cfg>>2)&3)==2) { if(offset<0x2000) { sfkick_bank_set(space->machine(),2,data); } else { sfkick_bank_set(space->machine(),3,data); } } } static WRITE8_HANDLER(page2_w) { sfkick_state *state = space->machine().driver_data(); if(((state->m_bank_cfg>>4)&3)==2) { if(offset<0x2000) { sfkick_bank_set(space->machine(),4,data); } else { sfkick_bank_set(space->machine(),5,data); } } } static WRITE8_HANDLER(page3_w) { sfkick_state *state = space->machine().driver_data(); if(((state->m_bank_cfg>>6)&3)==2) { if(offset<0x2000) { sfkick_bank_set(space->machine(),6,data); } else { sfkick_bank_set(space->machine(),7,data); } } else { if(((state->m_bank_cfg>>6)&3)==3) { state->m_main_mem[offset]=data; } } } static ADDRESS_MAP_START( sfkick_map, AS_PROGRAM, 8) AM_RANGE( 0x0000, 0x1fff) AM_ROMBANK("bank1") AM_RANGE( 0x2000, 0x3fff) AM_ROMBANK("bank2") AM_RANGE( 0x4000, 0x5fff) AM_ROMBANK("bank3") AM_RANGE( 0x6000, 0x7fff) AM_ROMBANK("bank4") AM_RANGE( 0x8000, 0x9fff) AM_ROMBANK("bank5") AM_RANGE( 0xa000, 0xbfff) AM_ROMBANK("bank6") AM_RANGE( 0xc000, 0xdfff) AM_ROMBANK("bank7") AM_RANGE( 0xe000, 0xffff) AM_ROMBANK("bank8") AM_RANGE( 0x0000, 0x3fff) AM_WRITE( page0_w ) AM_RANGE( 0x4000, 0x7fff) AM_WRITE( page1_w ) AM_RANGE( 0x8000, 0xbfff) AM_WRITE( page2_w ) AM_RANGE( 0xc000, 0xffff) AM_WRITE( page3_w ) ADDRESS_MAP_END static ADDRESS_MAP_START( sfkick_io_map, AS_IO, 8) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE( 0xa0, 0xa7) AM_WRITE( soundlatch_w ) AM_RANGE( 0x98, 0x98) AM_READWRITE( v9938_0_vram_r , v9938_0_vram_w) AM_RANGE( 0x99, 0x99) AM_READWRITE( v9938_0_status_r, v9938_0_command_w ) AM_RANGE( 0x9a, 0x9a) AM_WRITE( v9938_0_palette_w ) AM_RANGE( 0x9b, 0x9b) AM_WRITE( v9938_0_register_w ) AM_RANGE( 0xa8, 0xab) AM_DEVREADWRITE("ppi8255", ppi8255_r, ppi8255_w) AM_RANGE( 0xb4, 0xb5) AM_RAM /* loopback ? req by sfkicka (MSX Bios leftover)*/ ADDRESS_MAP_END static ADDRESS_MAP_START( sfkick_sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0xc000, 0xc7ff) AM_RAM ADDRESS_MAP_END static ADDRESS_MAP_START( sfkick_sound_io_map, AS_IO, 8) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READ(soundlatch_r) AM_RANGE(0x04, 0x05) AM_DEVREADWRITE("ym1", ym2203_r, ym2203_w) ADDRESS_MAP_END static WRITE8_DEVICE_HANDLER ( ppi_port_c_w ) { sfkick_state *state = device->machine().driver_data(); state->m_input_mux=data; } static const ppi8255_interface ppi8255_intf = { DEVCB_NULL, DEVCB_HANDLER(ppi_port_b_r), DEVCB_NULL, DEVCB_HANDLER(ppi_port_a_w), DEVCB_NULL, DEVCB_HANDLER(ppi_port_c_w) }; static INPUT_PORTS_START( sfkick ) PORT_START("IN0") PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNUSED ) /* unused ? */ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_START("IN1") PORT_BIT( 0x71, IP_ACTIVE_LOW, IPT_UNUSED ) /* unused ? */ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_START("DIAL") PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(-20) PORT_START("DSW1") /* bitswapped at read! 76543210 -> 45673210 */ PORT_DIPNAME( 0x82, 0x02, DEF_STR( Unknown ) ) /* unknown, code @ $98a8 */ PORT_DIPSETTING( 0x00, "3" ) PORT_DIPSETTING( 0x02, "2" ) PORT_DIPSETTING( 0x80, "1" ) PORT_DIPSETTING( 0x82, "0" ) PORT_DIPNAME( 0x0c, 0x08, DEF_STR( Difficulty ) ) /* not sure, code @ $9877 */ PORT_DIPSETTING( 0x0c, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x08, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x04, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) /* unused ? */ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) PORT_DIPNAME( 0x41, 0x01, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x00, "5" ) PORT_DIPSETTING( 0x01, "3" ) PORT_DIPSETTING( 0x40, "2" ) PORT_DIPSETTING( 0x41, "1" ) PORT_START("DSW2") /* bitswapped at read! 76543210 -> 45673210 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) /* unused ? */ PORT_DIPNAME( 0x02, 0x02, "Test Mode" ) PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x10, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) PORT_DIPNAME( 0x20, 0x20, "Freeze" ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x40, 0x00, DEF_STR( Allow_Continue ) ) PORT_DIPSETTING( 0x40, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_DIPNAME( 0x8c, 0x8c, DEF_STR( Coinage ) ) PORT_DIPSETTING( 0x04, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x84, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 3C_2C ) ) PORT_DIPSETTING( 0x8c, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x80, DEF_STR( 2C_3C ) ) PORT_DIPSETTING( 0x88, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x0c, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 1C_5C ) ) INPUT_PORTS_END static void sfkick_vdp_interrupt(running_machine &machine, int i) { cputag_set_input_line (machine, "maincpu", 0, (i ? HOLD_LINE : CLEAR_LINE)); } static VIDEO_START( sfkick ) { VIDEO_START_CALL(generic_bitmapped); v9938_init (machine, 0, *machine.primary_screen, machine.generic.tmpbitmap, MODEL_V9938, 0x80000, sfkick_vdp_interrupt); v9938_reset(0); } static MACHINE_RESET(sfkick) { sfkick_state *state = machine.driver_data(); v9938_reset(0); state->m_bank_cfg=0; state->m_bank[0]=0; state->m_bank[1]=0; state->m_bank[2]=0; state->m_bank[3]=0; state->m_bank[4]=0; state->m_bank[5]=0; state->m_bank[6]=0; state->m_bank[7]=0; sfkick_remap_banks(machine); } static INTERRUPT_GEN( sfkick_interrupt ) { v9938_interrupt(device->machine(), 0); } static void irqhandler(device_t *device, int irq) { cputag_set_input_line_and_vector(device->machine(), "soundcpu", 0, irq ? ASSERT_LINE : CLEAR_LINE, 0xff); } static const ym2203_interface ym2203_config = { { AY8910_LEGACY_OUTPUT, AY8910_DEFAULT_LOADS, DEVCB_NULL,DEVCB_NULL,DEVCB_NULL,DEVCB_NULL, }, irqhandler }; static MACHINE_CONFIG_START( sfkick, sfkick_state ) MCFG_CPU_ADD("maincpu",Z80,MASTER_CLOCK/6) MCFG_CPU_PROGRAM_MAP(sfkick_map) MCFG_CPU_IO_MAP(sfkick_io_map) MCFG_CPU_VBLANK_INT_HACK(sfkick_interrupt,262) MCFG_QUANTUM_TIME(attotime::from_hz(60000)) MCFG_CPU_ADD("soundcpu",Z80,MASTER_CLOCK/6) MCFG_CPU_PROGRAM_MAP(sfkick_sound_map) MCFG_CPU_IO_MAP(sfkick_sound_io_map) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, MSX2_TOTAL_YRES_PIXELS) MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1) MCFG_SCREEN_UPDATE(generic_bitmapped) MCFG_PALETTE_LENGTH(512) MCFG_PPI8255_ADD( "ppi8255", ppi8255_intf ) MCFG_MACHINE_RESET(sfkick) MCFG_PALETTE_INIT( v9938 ) MCFG_VIDEO_START(sfkick) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("ym1", YM2203, MASTER_CLOCK/6) MCFG_SOUND_CONFIG(ym2203_config) MCFG_SOUND_ROUTE(0, "mono", 0.25) MCFG_SOUND_ROUTE(1, "mono", 0.25) MCFG_SOUND_ROUTE(2, "mono", 0.25) MCFG_SOUND_ROUTE(3, "mono", 0.50) MACHINE_CONFIG_END static DRIVER_INIT(sfkick) { sfkick_state *state = machine.driver_data(); state->m_main_mem=auto_alloc_array(machine, UINT8, 0x4000); } ROM_START( sfkick ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) ROM_REGION(0x20000, "banked", ROMREGION_ERASEFF) ROM_LOAD( "sfkick2.a7", 0x00000, 0x8000, CRC(1dcaec5e) SHA1(7e063d46fb6606df2d772866cc55f207035b98c4) ) ROM_LOAD( "sfkick3.c7", 0x08000, 0x8000, CRC(639d3cf2) SHA1(950fd28058d32e4532eb6e99454dcaef092a955e) ) ROM_LOAD( "sfkick4.d7", 0x10000, 0x8000, CRC(ee1b344e) SHA1(d33fbad017cc4838192e9c540621537edb7e8dc4) ) /* 0x18000-0x1ffff = empty */ ROM_REGION(0x8000, "extrom", 0) ROM_LOAD( "sfkick5.h7", 0x00000, 0x8000, CRC(8e8bd9cf) SHA1(f493de40147fdd67a48d4c90b01170fbd6ea074e) ) ROM_REGION(0x8000, "cartridge", 0) ROM_LOAD( "sfkick6.j7", 0x0000, 0x8000, CRC(7a91ac4b) SHA1(afc5e2c2fe0cd108235ac6ae2775cc9a0b1c9f76) ) ROM_REGION(0x8000, "bios", 0) ROM_LOAD( "sfkick7.l7", 0x00000, 0x8000, CRC(8cd94c63) SHA1(e6dba66c8716593b8ab88f79f7205211938d1598) ) ROM_REGION(0x10000, "soundcpu", 0) ROM_LOAD( "sfkick1.c5", 0x00000, 0x8000, CRC(2f5e3b7a) SHA1(d2ff566b415ab10c0681fa1eb221a56e3c137ecf) ) ROM_END ROM_START( sfkicka ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) ROM_REGION(0x20000, "banked", ROMREGION_ERASEFF) ROM_LOAD( "c145.bin", 0x00000, 0x8000, CRC(1dcaec5e) SHA1(7e063d46fb6606df2d772866cc55f207035b98c4) ) ROM_LOAD( "c146.bin", 0x08000, 0x8000, CRC(57afc4c6) SHA1(ee28b3f74e3175c22f542855b09f1673d048b1fa) ) ROM_LOAD( "c147.bin", 0x10000, 0x8000, CRC(ee1b344e) SHA1(d33fbad017cc4838192e9c540621537edb7e8dc4) ) /* 0x18000-0x1ffff = empty */ ROM_REGION(0x8000, "extrom", 0) ROM_LOAD( "c149.bin", 0x00000, 0x8000, CRC(2edbf61f) SHA1(23dcff43faf222a4b69001312ce4b1c920e2f4c2) ) ROM_REGION(0x8000, "cartridge", 0) ROM_LOAD( "c150.bin", 0x0000, 0x8000, CRC(20412918) SHA1(b0fefa957b20373ffb84d9ff97a2e84a9a3af56c) ) ROM_REGION(0x8000, "bios", 0) ROM_LOAD( "c151.bin", 0x00000, 0x8000, CRC(8cd94c63) SHA1(e6dba66c8716593b8ab88f79f7205211938d1598) ) ROM_REGION(0x10000, "soundcpu", 0) ROM_LOAD( "c130.bin", 0x00000, 0x8000, CRC(2f5e3b7a) SHA1(d2ff566b415ab10c0681fa1eb221a56e3c137ecf) ) ROM_END ROM_START( spinkick ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) ROM_REGION(0x20000, "banked", ROMREGION_ERASEFF) ROM_LOAD( "spinkick.r2", 0x00000, 0x8000, CRC(1dcaec5e) SHA1(7e063d46fb6606df2d772866cc55f207035b98c4) ) ROM_LOAD( "spinkick.r3", 0x08000, 0x8000, CRC(e86a194a) SHA1(19a02375ec463e795770403c3e948d754919458b) ) ROM_LOAD( "spinkick.r4", 0x10000, 0x8000, CRC(ee1b344e) SHA1(d33fbad017cc4838192e9c540621537edb7e8dc4) ) /* 0x18000-0x1ffff = empty */ ROM_REGION(0x8000, "extrom", 0) ROM_LOAD( "spinkick.r5", 0x00000, 0x8000, CRC(8e8bd9cf) SHA1(f493de40147fdd67a48d4c90b01170fbd6ea074e) ) ROM_REGION(0x8000, "cartridge", 0) ROM_LOAD( "spinkick.r6", 0x0000, 0x8000, CRC(7a91ac4b) SHA1(afc5e2c2fe0cd108235ac6ae2775cc9a0b1c9f76) ) ROM_REGION(0x8000, "bios", 0) ROM_LOAD( "spinkick.r7", 0x00000, 0x8000, CRC(8cd94c63) SHA1(e6dba66c8716593b8ab88f79f7205211938d1598) ) ROM_REGION(0x10000, "soundcpu", 0) ROM_LOAD( "spinkick.r1", 0x00000, 0x8000, CRC(2f5e3b7a) SHA1(d2ff566b415ab10c0681fa1eb221a56e3c137ecf) ) ROM_END GAME( 1988, sfkick, 0, sfkick, sfkick, sfkick, ROT90, "Haesung/HJ Corp", "Super Free Kick (set 1)", 0 ) GAME( 198?, sfkicka, sfkick, sfkick, sfkick, sfkick, ROT90, "Haesung", "Super Free Kick (set 2)", 0 ) GAME( 1988, spinkick, sfkick, sfkick, sfkick, sfkick, ROT90, "Haesung/Seojin", "Hec's Spinkick", 0 )