diff options
Diffstat (limited to 'trunk/src/mame/drivers/junofrst.c')
-rw-r--r-- | trunk/src/mame/drivers/junofrst.c | 513 |
1 files changed, 513 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/junofrst.c b/trunk/src/mame/drivers/junofrst.c new file mode 100644 index 00000000000..81332547418 --- /dev/null +++ b/trunk/src/mame/drivers/junofrst.c @@ -0,0 +1,513 @@ +/*************************************************************************** + +Juno First : memory map same as tutankham with some address changes +Chris Hardy (chrish@kcbbs.gen.nz) + +Thanks to Rob Jarret for the original Tutankham memory map on which both the +Juno First emu and the mame driver is based on. + + Juno First memory map by Chris Hardy + +Read/Write memory + +$0000-$7FFF = Screen RAM (only written to) +$8000-$800f = Palette RAM. BBGGGRRR (D7->D0) +$8100-$8FFF = Work RAM + +Write memory + +$8030 - interrupt control register D0 = interrupts on or off +$8031 - unknown +$8032 - unknown +$8033 - unknown +$8034 - flip screen x +$8035 - flip screen y + +$8040 - Sound CPU req/ack data +$8050 - Sound CPU command data +$8060 - Banked memory page select. +$8070/1 - Blitter source data word +$8072/3 - Blitter destination word. Write to $8073 triggers a blit + +Read memory + +$8010 - Dipswitch 2 +$801c - Watchdog +$8020 - Start/Credit IO + D2 = Credit 1 + D3 = Start 1 + D4 = Start 2 +$8024 - P1 IO + D0 = left + D1 = right + D2 = up + D3 = down + D4 = fire 2 + D5 = fire 1 + +$8028 - P2 IO - same as P1 IO +$802c - Dipswitch 1 + + + +$9000->$9FFF Banked Memory - see below +$A000->$BFFF "juno\\JFA_B9.BIN", +$C000->$DFFF "juno\\JFB_B10.BIN", +$E000->$FFFF "juno\\JFC_A10.BIN", + +Banked memory - Paged into $9000->$9FFF.. + +NOTE - In Tutankhm this only contains graphics, in Juno First it also contains code. (which + generally sets up the blitter) + + "juno\\JFC1_A4.BIN", $0000->$1FFF + "juno\\JFC2_A5.BIN", $2000->$3FFF + "juno\\JFC3_A6.BIN", $4000->$5FFF + "juno\\JFC4_A7.BIN", $6000->$7FFF + "juno\\JFC5_A8.BIN", $8000->$9FFF + "juno\\JFC6_A9.BIN", $A000->$bFFF + +Blitter source graphics + + "juno\\JFS3_C7.BIN", $C000->$DFFF + "juno\\JFS4_D7.BIN", $E000->$FFFF + "juno\\JFS5_E7.BIN", $10000->$11FFF + + +***************************************************************************/ + + +#include "emu.h" +#include "cpu/m6809/m6809.h" +#include "cpu/mcs48/mcs48.h" +#include "cpu/z80/z80.h" +#include "sound/ay8910.h" +#include "sound/dac.h" +#include "sound/flt_rc.h" +#include "machine/konami1.h" +#include "includes/konamipt.h" +#include "includes/tutankhm.h" + + +class junofrst_state : public tutankhm_state +{ +public: + junofrst_state(const machine_config &mconfig, device_type type, const char *tag) + : tutankhm_state(mconfig, type, tag) { } + + UINT8 m_blitterdata[4]; + int m_i8039_status; + int m_last_irq; + + cpu_device *m_soundcpu; + device_t *m_i8039; + + device_t *m_filter_0_0; + device_t *m_filter_0_1; + device_t *m_filter_0_2; +}; + + +/* Juno First Blitter Hardware emulation + + Juno First can blit a 16x16 graphics which comes from un-memory mapped graphics roms + + $8070->$8071 specifies the destination NIBBLE address + $8072->$8073 specifies the source NIBBLE address + + Depending on bit 0 of the source address either the source pixels will be copied to + the destination address, or a zero will be written. + + Only source pixels which aren't 0 are copied or cleared. + + This allows the game to quickly clear the sprites from the screen + + TODO: Does bit 1 of the source address mean something? + We have to mask it off otherwise the "Juno First" logo on the title screen is wrong. +*/ + +static WRITE8_HANDLER( junofrst_blitter_w ) +{ + junofrst_state *state = space->machine().driver_data<junofrst_state>(); + state->m_blitterdata[offset] = data; + + /* blitter is triggered by $8073 */ + if (offset == 3) + { + int i; + UINT8 *gfx_rom = space->machine().region("gfx1")->base(); + + offs_t src = ((state->m_blitterdata[2] << 8) | state->m_blitterdata[3]) & 0xfffc; + offs_t dest = (state->m_blitterdata[0] << 8) | state->m_blitterdata[1]; + + int copy = state->m_blitterdata[3] & 0x01; + + /* 16x16 graphics */ + for (i = 0; i < 16; i++) + { + int j; + + for (j = 0; j < 16; j++) + { + UINT8 data; + + if (src & 1) + data = gfx_rom[src >> 1] & 0x0f; + else + data = gfx_rom[src >> 1] >> 4; + + src += 1; + + /* if there is a source pixel either copy the pixel or clear the pixel depending on the copy flag */ + + if (data) + { + if (copy == 0) + data = 0; + + if (dest & 1) + state->m_videoram[dest >> 1] = (state->m_videoram[dest >> 1] & 0x0f) | (data << 4); + else + state->m_videoram[dest >> 1] = (state->m_videoram[dest >> 1] & 0xf0) | data; + } + + dest += 1; + } + + dest += 240; + } + } +} + + +static WRITE8_HANDLER( junofrst_bankselect_w ) +{ + memory_set_bank(space->machine(), "bank1", data & 0x0f); +} + + +static READ8_DEVICE_HANDLER( junofrst_portA_r ) +{ + junofrst_state *state = device->machine().driver_data<junofrst_state>(); + int timer; + + /* main xtal 14.318MHz, divided by 8 to get the CPU clock, further */ + /* divided by 1024 to get this timer */ + /* (divide by (1024/2), and not 1024, because the CPU cycle counter is */ + /* incremented every other state change of the clock) */ + timer = (state->m_soundcpu->total_cycles() / (1024 / 2)) & 0x0f; + + /* low three bits come from the 8039 */ + + return (timer << 4) | state->m_i8039_status; +} + + +static WRITE8_DEVICE_HANDLER( junofrst_portB_w ) +{ + junofrst_state *state = device->machine().driver_data<junofrst_state>(); + device_t *filter[3] = { state->m_filter_0_0, state->m_filter_0_1, state->m_filter_0_2 }; + int i; + + for (i = 0; i < 3; i++) + { + int C = 0; + + if (data & 1) + C += 47000; /* 47000pF = 0.047uF */ + if (data & 2) + C += 220000; /* 220000pF = 0.22uF */ + + data >>= 2; + filter_rc_set_RC(filter[i], FLT_RC_LOWPASS, 1000, 2200, 200, CAP_P(C)); + } +} + + +static WRITE8_HANDLER( junofrst_sh_irqtrigger_w ) +{ + junofrst_state *state = space->machine().driver_data<junofrst_state>(); + + if (state->m_last_irq == 0 && data == 1) + { + /* setting bit 0 low then high triggers IRQ on the sound CPU */ + device_set_input_line_and_vector(state->m_soundcpu, 0, HOLD_LINE, 0xff); + } + + state->m_last_irq = data; +} + + +static WRITE8_HANDLER( junofrst_i8039_irq_w ) +{ + junofrst_state *state = space->machine().driver_data<junofrst_state>(); + device_set_input_line(state->m_i8039, 0, ASSERT_LINE); +} + + +static WRITE8_HANDLER( i8039_irqen_and_status_w ) +{ + junofrst_state *state = space->machine().driver_data<junofrst_state>(); + + if ((data & 0x80) == 0) + device_set_input_line(state->m_i8039, 0, CLEAR_LINE); + state->m_i8039_status = (data & 0x70) >> 4; +} + + +static WRITE8_HANDLER( flip_screen_w ) +{ + tutankhm_flip_screen_x_w(space, 0, data); + tutankhm_flip_screen_y_w(space, 0, data); +} + + +static WRITE8_HANDLER( junofrst_coin_counter_w ) +{ + coin_counter_w(space->machine(), offset, data); +} + + + +static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_RAM AM_BASE_MEMBER(junofrst_state, m_videoram) + AM_RANGE(0x8000, 0x800f) AM_RAM AM_BASE_MEMBER(junofrst_state, m_paletteram) + AM_RANGE(0x8010, 0x8010) AM_READ_PORT("DSW2") + AM_RANGE(0x801c, 0x801c) AM_READ(watchdog_reset_r) + AM_RANGE(0x8020, 0x8020) AM_READ_PORT("SYSTEM") + AM_RANGE(0x8024, 0x8024) AM_READ_PORT("P1") + AM_RANGE(0x8028, 0x8028) AM_READ_PORT("P2") + AM_RANGE(0x802c, 0x802c) AM_READ_PORT("DSW1") + AM_RANGE(0x8030, 0x8030) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x8031, 0x8032) AM_WRITE(junofrst_coin_counter_w) + AM_RANGE(0x8033, 0x8033) AM_WRITEONLY AM_BASE_MEMBER(junofrst_state, m_scroll) /* not used in Juno */ + AM_RANGE(0x8034, 0x8035) AM_WRITE(flip_screen_w) + AM_RANGE(0x8040, 0x8040) AM_WRITE(junofrst_sh_irqtrigger_w) + AM_RANGE(0x8050, 0x8050) AM_WRITE(soundlatch_w) + AM_RANGE(0x8060, 0x8060) AM_WRITE(junofrst_bankselect_w) + AM_RANGE(0x8070, 0x8073) AM_WRITE(junofrst_blitter_w) + AM_RANGE(0x8100, 0x8fff) AM_RAM + AM_RANGE(0x9000, 0x9fff) AM_ROMBANK("bank1") + AM_RANGE(0xa000, 0xffff) AM_ROM +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( audio_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x0fff) AM_ROM + AM_RANGE(0x2000, 0x23ff) AM_RAM + AM_RANGE(0x3000, 0x3000) AM_READ(soundlatch_r) + AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("aysnd", ay8910_address_w) + AM_RANGE(0x4001, 0x4001) AM_DEVREAD("aysnd", ay8910_r) + AM_RANGE(0x4002, 0x4002) AM_DEVWRITE("aysnd", ay8910_data_w) + AM_RANGE(0x5000, 0x5000) AM_WRITE(soundlatch2_w) + AM_RANGE(0x6000, 0x6000) AM_WRITE(junofrst_i8039_irq_w) +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( mcu_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x0fff) AM_ROM +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( mcu_io_map, AS_IO, 8 ) + AM_RANGE(0x00, 0xff) AM_READ(soundlatch2_r) + AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_DEVWRITE("dac", dac_w) + AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(i8039_irqen_and_status_w) +ADDRESS_MAP_END + + +static INPUT_PORTS_START( junofrst ) + PORT_START("SYSTEM") + KONAMI8_SYSTEM_UNK + + PORT_START("P1") + KONAMI8_MONO_B213_UNK + + PORT_START("P2") + KONAMI8_COCKTAIL_B213_UNK + + PORT_START("DSW1") + KONAMI_COINAGE(DEF_STR( Free_Play ), "No Coin B") + /* "No Coin B" = coins produce sound, but no effect on coin counter */ + + PORT_START("DSW2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x03, "3" ) + PORT_DIPSETTING( 0x02, "4" ) + PORT_DIPSETTING( 0x01, "5" ) + PORT_DIPSETTING( 0x00, "256 (Cheat)") + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x70, 0x70, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x70, "1 (Easiest)" ) + PORT_DIPSETTING( 0x60, "2" ) + PORT_DIPSETTING( 0x50, "3" ) + PORT_DIPSETTING( 0x40, "4" ) + PORT_DIPSETTING( 0x30, "5" ) + PORT_DIPSETTING( 0x20, "6" ) + PORT_DIPSETTING( 0x10, "7" ) + PORT_DIPSETTING( 0x00, "8 (Hardest)" ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + + + +static const ay8910_interface ay8910_config = +{ + AY8910_LEGACY_OUTPUT, + AY8910_DEFAULT_LOADS, + DEVCB_HANDLER(junofrst_portA_r), + DEVCB_NULL, + DEVCB_NULL, + DEVCB_HANDLER(junofrst_portB_w) +}; + + +static MACHINE_START( junofrst ) +{ + junofrst_state *state = machine.driver_data<junofrst_state>(); + + state->m_maincpu = machine.device<cpu_device>("maincpu"); + state->m_i8039 = machine.device("mcu"); + state->m_soundcpu = machine.device<cpu_device>("audiocpu"); + state->m_filter_0_0 = machine.device("filter.0.0"); + state->m_filter_0_1 = machine.device("filter.0.1"); + state->m_filter_0_2 = machine.device("filter.0.2"); + + state->save_item(NAME(state->m_i8039_status)); + state->save_item(NAME(state->m_last_irq)); + state->save_item(NAME(state->m_flip_x)); + state->save_item(NAME(state->m_flip_y)); + state->save_item(NAME(state->m_blitterdata)); +} + +static MACHINE_RESET( junofrst ) +{ + junofrst_state *state = machine.driver_data<junofrst_state>(); + + state->m_i8039_status = 0; + state->m_last_irq = 0; + state->m_flip_x = 0; + state->m_flip_y = 0; + state->m_blitterdata[0] = 0; + state->m_blitterdata[1] = 0; + state->m_blitterdata[2] = 0; + state->m_blitterdata[3] = 0; +} + +static MACHINE_CONFIG_START( junofrst, junofrst_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", M6809, 1500000) /* 1.5 MHz ??? */ + MCFG_CPU_PROGRAM_MAP(main_map) + MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + + MCFG_CPU_ADD("audiocpu", Z80,14318000/8) /* 1.78975 MHz */ + MCFG_CPU_PROGRAM_MAP(audio_map) + + MCFG_CPU_ADD("mcu", I8039,8000000) /* 8MHz crystal */ + MCFG_CPU_PROGRAM_MAP(mcu_map) + MCFG_CPU_IO_MAP(mcu_io_map) + + MCFG_MACHINE_START(junofrst) + MCFG_MACHINE_RESET(junofrst) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(30) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) + MCFG_SCREEN_SIZE(32*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) /* not sure about the visible area */ + MCFG_SCREEN_UPDATE(tutankhm) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + + MCFG_SOUND_ADD("aysnd", AY8910, 14318000/8) + MCFG_SOUND_CONFIG(ay8910_config) + MCFG_SOUND_ROUTE(0, "filter.0.0", 0.30) + MCFG_SOUND_ROUTE(1, "filter.0.1", 0.30) + MCFG_SOUND_ROUTE(2, "filter.0.2", 0.30) + + MCFG_SOUND_ADD("dac", DAC, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + + MCFG_SOUND_ADD("filter.0.0", FILTER_RC, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + MCFG_SOUND_ADD("filter.0.1", FILTER_RC, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + MCFG_SOUND_ADD("filter.0.2", FILTER_RC, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) +MACHINE_CONFIG_END + + +ROM_START( junofrst ) + ROM_REGION( 0x1c000, "maincpu", 0 ) /* code + space for decrypted opcodes */ + ROM_LOAD( "jfa_b9.bin", 0x0a000, 0x2000, CRC(f5a7ab9d) SHA1(9603e797839290f8e1f93ccff9cc820604cc49ab) ) /* program ROMs */ + ROM_LOAD( "jfb_b10.bin", 0x0c000, 0x2000, CRC(f20626e0) SHA1(46f58bdc1a613124e2c148b61f774fcc6c232868) ) + ROM_LOAD( "jfc_a10.bin", 0x0e000, 0x2000, CRC(1e7744a7) SHA1(bee69833af886436016560295cddf0c8b4c5e771) ) + + ROM_LOAD( "jfc1_a4.bin", 0x10000, 0x2000, CRC(03ccbf1d) SHA1(02b45fe3c51bdc940919aac68136a121ed9bee18) ) /* graphic and code ROMs (banked) */ + ROM_LOAD( "jfc2_a5.bin", 0x12000, 0x2000, CRC(cb372372) SHA1(a48e7de08647cbece7787c287217eac7e7a7510b) ) + ROM_LOAD( "jfc3_a6.bin", 0x14000, 0x2000, CRC(879d194b) SHA1(3c7af8767c9ce908fa1761180c6e585823216d8a) ) + ROM_LOAD( "jfc4_a7.bin", 0x16000, 0x2000, CRC(f28af80b) SHA1(4d0e247e729365476dd3996c7d1f2a19fc83d773) ) + ROM_LOAD( "jfc5_a8.bin", 0x18000, 0x2000, CRC(0539f328) SHA1(c532aaed7f9e6f564e3df0dc6d8fdbee6ed721a2) ) + ROM_LOAD( "jfc6_a9.bin", 0x1a000, 0x2000, CRC(1da2ad6e) SHA1(de997d1b2ff6671088b57192bc9f1279359fad5d) ) + + ROM_REGION( 0x10000 , "audiocpu", 0 ) /* 64k for Z80 sound CPU code */ + ROM_LOAD( "jfs1_j3.bin", 0x0000, 0x1000, CRC(235a2893) SHA1(b90251c4971f7ba12e407f86c32723d513d6b4a0) ) + + ROM_REGION( 0x1000, "mcu", 0 ) /* 8039 */ + ROM_LOAD( "jfs2_p4.bin", 0x0000, 0x1000, CRC(d0fa5d5f) SHA1(9d0730d1d037bf96b0c933a32355602bf2d735dd) ) + + ROM_REGION( 0x6000, "gfx1", 0 ) /* BLTROM, used at runtime */ + ROM_LOAD( "jfs3_c7.bin", 0x00000, 0x2000, CRC(aeacf6db) SHA1(f99ef9f9153d7a83e1881d9181faac99cb8c8a57) ) + ROM_LOAD( "jfs4_d7.bin", 0x02000, 0x2000, CRC(206d954c) SHA1(65494766676f18d8b5ae9a54cee00790e7b1e67e) ) + ROM_LOAD( "jfs5_e7.bin", 0x04000, 0x2000, CRC(1eb87a6e) SHA1(f5471b9f6f1fa6d6e5d76300d89f71da3129516a) ) +ROM_END + +ROM_START( junofrstg ) + ROM_REGION( 0x1c000, "maincpu", 0 ) /* code + space for decrypted opcodes */ + ROM_LOAD( "jfg_a.9b", 0x0a000, 0x2000, CRC(8f77d1c5) SHA1(d47fcdbc47673c228661a3528fff0c691c76df9e) ) /* program ROMs */ + ROM_LOAD( "jfg_b.10b", 0x0c000, 0x2000, CRC(cd645673) SHA1(25994210a8a424bdf2eca3efa19e7eeffc097cec) ) + ROM_LOAD( "jfg_c.10a", 0x0e000, 0x2000, CRC(47852761) SHA1(eeef814b6ad681d4c2274f0a69d1ed9c5c1b9118) ) + + ROM_LOAD( "jfgc1.4a", 0x10000, 0x2000, CRC(90a05ae6) SHA1(0aa835e1d33ab0433189b329b791c952e69103c1) ) /* graphic and code ROMs (banked) */ + ROM_LOAD( "jfc2_a5.bin", 0x12000, 0x2000, CRC(cb372372) SHA1(a48e7de08647cbece7787c287217eac7e7a7510b) ) + ROM_LOAD( "jfc3_a6.bin", 0x14000, 0x2000, CRC(879d194b) SHA1(3c7af8767c9ce908fa1761180c6e585823216d8a) ) + ROM_LOAD( "jfgc4.7a", 0x16000, 0x2000, CRC(e8864a43) SHA1(52b04e69036622abeb6ec99ac3daeda6a2572994) ) + ROM_LOAD( "jfc5_a8.bin", 0x18000, 0x2000, CRC(0539f328) SHA1(c532aaed7f9e6f564e3df0dc6d8fdbee6ed721a2) ) + ROM_LOAD( "jfc6_a9.bin", 0x1a000, 0x2000, CRC(1da2ad6e) SHA1(de997d1b2ff6671088b57192bc9f1279359fad5d) ) + + ROM_REGION( 0x10000 , "audiocpu", 0 ) /* 64k for Z80 sound CPU code */ + ROM_LOAD( "jfs1_j3.bin", 0x0000, 0x1000, CRC(235a2893) SHA1(b90251c4971f7ba12e407f86c32723d513d6b4a0) ) + + ROM_REGION( 0x1000, "mcu", 0 ) /* 8039 */ + ROM_LOAD( "jfs2_p4.bin", 0x0000, 0x1000, CRC(d0fa5d5f) SHA1(9d0730d1d037bf96b0c933a32355602bf2d735dd) ) + + ROM_REGION( 0x6000, "gfx1", 0 ) /* BLTROM, used at runtime */ + ROM_LOAD( "jfs3_c7.bin", 0x00000, 0x2000, CRC(aeacf6db) SHA1(f99ef9f9153d7a83e1881d9181faac99cb8c8a57) ) + ROM_LOAD( "jfs4_d7.bin", 0x02000, 0x2000, CRC(206d954c) SHA1(65494766676f18d8b5ae9a54cee00790e7b1e67e) ) + ROM_LOAD( "jfs5_e7.bin", 0x04000, 0x2000, CRC(1eb87a6e) SHA1(f5471b9f6f1fa6d6e5d76300d89f71da3129516a) ) +ROM_END + + + +static DRIVER_INIT( junofrst ) +{ + UINT8 *decrypted = konami1_decode(machine, "maincpu"); + + memory_configure_bank(machine, "bank1", 0, 16, machine.region("maincpu")->base() + 0x10000, 0x1000); + memory_configure_bank_decrypted(machine, "bank1", 0, 16, decrypted + 0x10000, 0x1000); +} + + +GAME( 1983, junofrst, 0, junofrst, junofrst, junofrst, ROT90, "Konami", "Juno First", 0 ) +GAME( 1983, junofrstg,junofrst, junofrst, junofrst, junofrst, ROT90, "Konami (Gottlieb license)", "Juno First (Gottlieb)", 0 ) |