summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/galgames.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/galgames.cpp')
-rw-r--r--src/mame/drivers/galgames.cpp1235
1 files changed, 0 insertions, 1235 deletions
diff --git a/src/mame/drivers/galgames.cpp b/src/mame/drivers/galgames.cpp
deleted file mode 100644
index 4f7a4e2f1d3..00000000000
--- a/src/mame/drivers/galgames.cpp
+++ /dev/null
@@ -1,1235 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Luca Elia
-/***************************************************************************
-
- -= Galaxy Games =-
-
- driver by Luca Elia (l.elia@tin.it)
-
-
-CPU: 68000
-Video: Blitter with two layers and double buffering (Xilinx FPGA)
-Sound: OKI M6295
-Input: Trackballs and buttons
-Other: EEPROM
-Carts: EEPROM + Flash + PIC
-
-To Do:
-
-- Coin optics
-
-Notes:
-
-- 4 known game carts where produced, these are:
-
- Star Pak 1: Seek the Peaks, 21 Thunder, Solar Solitaire, Prism Poker, Pharaoh's Tomb, Magic Black Jack,
- Twenty One Thunder Plus, Power Pairs, Prism Poker Plus & Have A Cow
- Star Pak 2: Pac-Man, Ms.Pac-Man, Pharaoh's Tomb, Solar Solitaire, Power Pairs, Seek The peeks & Have A Cow
- Star Pak 3: Centipede, Great Wall, Ker-Chunk, Diamond Derby, Word Sleuth, Pull!, Astro Blast & Sweeper
- Star Pak 4: Berzerk, Neon Nightmare, Battle Checkers, Orbit, Deep Sea Shadow, Star Tiger & Orbit Freefall
-
-- Allegedly there is a hard lock that SP1 and the PAC-MAN games (on SP2) cannot play together. Was a licensing issue with Namco.
- The system checks for cartridges on power up by querying the PIC parts. If the system sees SP1 & SP2 it disables SP2.
-
-- Early flyers show "Star Pak 1" titled as Cardmania!
-- Early flyers show "Star Pak 2" titled as Galaxy Games Volume 2
-- There is an early flyer showing a Cardmania! cartridge in front of a partialy blocked cartridge labeled Casino
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/m68000/m68000.h"
-#include "cpu/pic16c5x/pic16c5x.h"
-#include "machine/eepromser.h"
-#include "machine/timer.h"
-#include "machine/watchdog.h"
-#include "sound/okim6295.h"
-#include "video/cesblit.h"
-#include "emupal.h"
-#include "screen.h"
-#include "speaker.h"
-
-/***************************************************************************
-
- Galgames Cart Device
-
- Each cartridge contains a PIC, that provides, among other things, a 32-byte
- response starting with "CES1997", followed by the contents of the cart rom
- at some fixed addresses.
-
-***************************************************************************/
-
-DECLARE_DEVICE_TYPE(GALGAMES_CART, galgames_cart_device)
-DECLARE_DEVICE_TYPE(GALGAMES_BIOS_CART, galgames_bios_cart_device)
-DECLARE_DEVICE_TYPE(GALGAMES_STARPAK2_CART, galgames_starpak2_cart_device)
-DECLARE_DEVICE_TYPE(GALGAMES_STARPAK3_CART, galgames_starpak3_cart_device)
-DECLARE_DEVICE_TYPE(GALGAMES_SLOT, galgames_slot_device)
-
-// CART declaration
-
-class galgames_cart_device : public device_t, public device_rom_interface
-{
-public:
- // construction/destruction
-
- galgames_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, u8 cart)
- : galgames_cart_device(mconfig, GALGAMES_CART, tag, owner, (u32)0)
- {
- set_cart(cart);
- }
-
- // static configuration
- void set_cart(u8 cart) { m_cart = cart; }
- void set_pic_bits(int clk, int in, int out, int dis);
-
- // ROM
- u16 rom_r(offs_t offset) { return read_word(offset*2); }
-
- // EEPROM
- u8 eeprom_r();
- void eeprom_w(u8 data);
- DECLARE_WRITE_LINE_MEMBER(eeprom_cs_write);
-
- // PIC
- u8 pic_status_r();
- void pic_data_w(u8 data);
- u8 pic_data_r();
- void set_pic_reset_line(int state);
-
- u8 int_pic_data_r();
- void int_pic_data_w(u8 data);
- void int_pic_bank_w(u8 data);
-
-protected:
- galgames_cart_device(
- const machine_config &mconfig,
- device_type type,
- const char *tag,
- device_t *owner,
- u32 clock);
-
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual void rom_bank_updated() override { }
-
- bool is_selected();
-
- u8 m_cart;
-
- // SLOT
- required_device<galgames_slot_device> m_slot;
-
- // EEPROM
- optional_device<eeprom_serial_93cxx_device> m_eeprom;
-
- // PIC
- optional_device<pic16c5x_device> m_pic;
-
- u8 m_pic_iobits, m_pic_data, m_pic_data_rdy, m_pic_data_bit, m_pic_data_clk;
- u8 m_pic_clk_mask, m_pic_in_mask, m_pic_out_mask, m_pic_dis_mask;
-
- void log_cart_comm(const char *text, u8 data);
- void pic_comm_reset();
-};
-
-// device type definition
-DEFINE_DEVICE_TYPE(GALGAMES_CART, galgames_cart_device, "starpak_cart", "Galaxy Games StarPak Cartridge")
-
-
-// BIOS "cart"
-
-class galgames_bios_cart_device : public galgames_cart_device
-{
-public:
- // construction/destruction
- galgames_bios_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, u8 cart)
- : galgames_cart_device(mconfig, GALGAMES_BIOS_CART, tag, owner, (u32)0)
- {
- set_cart(cart);
- }
-
-protected:
- // device-level overrides
- virtual void device_add_mconfig(machine_config &config) override;
-};
-
-DEFINE_DEVICE_TYPE(GALGAMES_BIOS_CART, galgames_bios_cart_device, "galgames_bios_cart", "Galaxy Games BIOS Cartridge")
-
-void galgames_bios_cart_device::device_add_mconfig(machine_config &config)
-{
- EEPROM_93C76_8BIT(config, "eeprom");
-}
-
-
-// STARPAK2 cart
-
-class galgames_starpak2_cart_device : public galgames_cart_device
-{
-public:
- // construction/destruction
- galgames_starpak2_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, u8 cart)
- : galgames_cart_device(mconfig, GALGAMES_STARPAK2_CART, tag, owner, (u32)0)
- {
- set_cart(cart);
- set_pic_bits(5, 4, 2, 1);
- }
-
-protected:
- // device-level overrides
- virtual void device_add_mconfig(machine_config &config) override;
-};
-
-DEFINE_DEVICE_TYPE(GALGAMES_STARPAK2_CART, galgames_starpak2_cart_device, "starpak2_cart", "Galaxy Games StarPak 2 Cartridge")
-
-void galgames_starpak2_cart_device::device_add_mconfig(machine_config &config)
-{
- pic16c56_device &pic(PIC16C56(config, "pic", XTAL(4'000'000))); // !! PIC12C508 !! 4MHz internal RC oscillator (selected by the configuration word)
- pic.read_b().set(FUNC(galgames_cart_device::int_pic_data_r));
- pic.write_b().set(FUNC(galgames_cart_device::int_pic_data_w));
-
- EEPROM_93C76_8BIT(config, "eeprom");
-}
-
-
-// STARPAK3 cart
-
-class galgames_starpak3_cart_device : public galgames_cart_device
-{
-public:
- // construction/destruction
- galgames_starpak3_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, u8 cart)
- : galgames_cart_device(mconfig, GALGAMES_STARPAK3_CART, tag, owner, (u32)0)
- {
- set_cart(cart);
- set_pic_bits(0, 2, 3, 4);
- }
-
-protected:
- // device-level overrides
- virtual void device_add_mconfig(machine_config &config) override;
-};
-
-DEFINE_DEVICE_TYPE(GALGAMES_STARPAK3_CART, galgames_starpak3_cart_device, "starpak3_cart", "Galaxy Games StarPak 3 Cartridge")
-
-void galgames_starpak3_cart_device::device_add_mconfig(machine_config &config)
-{
- pic16c56_device &pic(PIC16C56(config, "pic", XTAL(4'000'000)));
- pic.write_a().set(FUNC(galgames_cart_device::int_pic_bank_w));
- pic.read_b().set(FUNC(galgames_cart_device::int_pic_data_r));
- pic.write_b().set(FUNC(galgames_cart_device::int_pic_data_w));
-
- EEPROM_93C76_8BIT(config, "eeprom");
-}
-
-
-/***************************************************************************
-
- Galgames Slot Device
-
-***************************************************************************/
-
-// SLOT declaration
-
-class galgames_slot_device : public device_t, public device_memory_interface
-{
-public:
- // construction/destruction
- galgames_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
-
- void slot_map(address_map &map);
-
- u16 read(offs_t offset, u16 mem_mask = ~0) { return m_space->read_word(offset * 2, mem_mask); }
- void write(offs_t offset, u16 data, u16 mem_mask = ~0) { m_space->write_word(offset * 2, data, mem_mask); }
-
- // SLOT
- void cart_sel_w(u8 data);
- void ram_sel_w(u8 data);
-
- // ROM
- u16 rom0_r(offs_t offset);
- u16 rom_r(offs_t offset);
- u16 rom0_or_ram_r(offs_t offset);
- u16 rom_or_ram_r(offs_t offset);
- void ram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
-
- // PIC
- u8 pic_status_r();
- void pic_data_w(u8 data);
- u8 pic_data_r();
- void set_pic_reset_line(int state);
-
- // EEPROM
- u8 eeprom_r();
- void eeprom_w(u8 data);
- DECLARE_WRITE_LINE_MEMBER(eeprom_cs_write);
-
- u8 get_cart() const { return m_cart; }
-
-protected:
-
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual space_config_vector memory_space_config() const override;
-
- address_space_config m_space_config;
- address_space *m_space;
-
- required_shared_ptr<u16> m_ram;
-
- required_device<galgames_cart_device> m_cart0;
-
- required_device<galgames_cart_device> m_cart1;
- required_device<galgames_cart_device> m_cart2;
- required_device<galgames_cart_device> m_cart3;
- required_device<galgames_cart_device> m_cart4;
-
- void set_cart(int cart);
- void reset_eeproms_except(int cart);
-
- galgames_cart_device *m_carts[1+4];
-
- u8 m_cart;
- bool m_is_ram_active;
-};
-
-device_memory_interface::space_config_vector galgames_slot_device::memory_space_config() const
-{
- return space_config_vector {
- std::make_pair(AS_PROGRAM, &m_space_config)
- };
-}
-
-// device type definition
-DEFINE_DEVICE_TYPE(GALGAMES_SLOT, galgames_slot_device, "starpak_slot", "Galaxy Games Slot")
-
-// CART implementation
-
-galgames_cart_device::galgames_cart_device(
- const machine_config &mconfig,
- device_type type,
- const char *tag,
- device_t *owner,
- u32 clock):
- device_t(mconfig, type, tag, owner, clock),
- device_rom_interface(mconfig, *this, 21, ENDIANNESS_BIG, 16),
- m_cart(0),
- m_slot(*this, "^slot"),
- m_eeprom(*this, "eeprom"),
- m_pic(*this, "pic")
-{
-}
-
-void galgames_cart_device::device_start()
-{
- save_item(NAME(m_cart));
- save_item(NAME(m_pic_iobits));
- save_item(NAME(m_pic_data));
- save_item(NAME(m_pic_data_rdy));
- save_item(NAME(m_pic_data_clk));
- save_item(NAME(m_pic_data_bit));
-}
-
-void galgames_cart_device::device_reset()
-{
- pic_comm_reset();
-}
-
-bool galgames_cart_device::is_selected()
-{
- return m_slot->get_cart() == m_cart;
-}
-
-void galgames_cart_device::set_pic_reset_line(int state)
-{
- if (!m_pic)
- return;
-
-// logerror("reset line = %x\n", state);
-
- if (!m_pic->input_state(INPUT_LINE_RESET) && state)
- pic_comm_reset();
-
- m_pic->set_input_line(INPUT_LINE_RESET, state);
-}
-
-void galgames_cart_device::log_cart_comm(const char *text, u8 data)
-{
-// logerror("%s: comm %-10s %02x - data:%02x bit:%02x rdy:%x clk:%02x\n", machine().describe_context(),
-// text, data, m_pic_data, m_pic_data_bit, m_pic_data_rdy, m_pic_data_clk );
-
-// logerror("%s: comm %-10s %02x\n", machine().describe_context(), text, data);
-}
-
-void galgames_cart_device::pic_comm_reset()
-{
- m_pic_iobits = m_pic_data = m_pic_data_rdy = m_pic_data_clk = 0;
- m_pic_data_bit = 0xff;
-// logerror("%s: comm reset\n", machine().describe_context());
-}
-
-// External PIC status and data interface
-
-u8 galgames_cart_device::pic_status_r()
-{
- // bit 7 = data from the cart PIC can be read
- return (is_selected() && (m_pic_data_rdy == 2)) ? 0x80 : 0;
-}
-
-u8 galgames_cart_device::pic_data_r()
-{
- if (is_selected())
- {
- if (!machine().side_effects_disabled())
- m_pic_data_rdy = 0;
- return m_pic_data;
- }
- return 0xff;
-}
-
-void galgames_cart_device::pic_data_w(u8 data)
-{
- if (is_selected())
- {
- m_pic_data = data;
- m_pic_data_rdy = 1;
- m_pic_data_bit = 0xff;
- m_pic_data_clk = 0;
- log_cart_comm("EXT WRITE", data);
- }
-}
-
-/*
-galgame2:
- bit 0 = cleared at boot (never touched again)
- bit 1 = PIC waits for it to become 0 before reading (or to become 1 when another byte is expected)
- bit 2 = data out
- bit 3 unused
- bit 4 = data in
- bit 5 = clock
- bit 6 n.c.
- bit 7 n.c.
-
-galgame3:
- bit 0 = clock
- bit 1 unused
- bit 2 = data in
- bit 3 = data out
- bit 4 = PIC waits for it to become 0 before reading (or to become 1 when another byte is expected)
- bit 5 = 0
- bit 6 = 1
- bit 7 unused
-*/
-void galgames_cart_device::set_pic_bits(int clk, int in, int out, int dis)
-{
- m_pic_clk_mask = 1 << clk;
- m_pic_in_mask = 1 << in;
- m_pic_out_mask = 1 << out;
- m_pic_dis_mask = 1 << dis;
-}
-
-u8 galgames_cart_device::int_pic_data_r()
-{
- if (!machine().side_effects_disabled())
- {
- // clock
- u8 clk0 = m_pic_data_clk & 0x80;
- m_pic_data_clk += 0x10;
- u8 clk1 = m_pic_data_clk & 0x80;
-
- m_pic_iobits = (m_pic_iobits & (~m_pic_clk_mask)) | (clk1 ? m_pic_clk_mask : 0);
-
- // disabled
- bool disabled = !is_selected();
- m_pic_iobits = (m_pic_iobits & (~m_pic_dis_mask)) | (disabled ? m_pic_dis_mask : 0);
-
- // The PIC waits for a falling edge before reading the new input bit.
- // It waits for a rising edge before setting the new output bit.
- // Hence we shift the data on the falling edge of the clock.
- if (clk0 && !clk1)
- {
- u8 bit_in = 0;
-
- if (m_pic_data_rdy == 1)
- {
- if (m_pic_data_bit == 0xff)
- {
- // first read bit must be 1 (sync)
- bit_in = 1;
- m_pic_data_bit = 7;
- }
- else
- {
- // read current bit and move to the next
- bit_in = BIT(m_pic_data, m_pic_data_bit);
- --m_pic_data_bit;
-
- if (m_pic_data_bit == 0xff)
- {
- m_pic_data_rdy = 0;
- log_cart_comm("PIC should have READ", m_pic_data);
- }
- }
- }
- else if (m_pic_data_rdy == 0)
- {
- u8 bit_out = m_pic_iobits & m_pic_out_mask;
-
- if (m_pic_data_bit == 0xff)
- {
- // first written bit must be 1 (sync)
- if (bit_out)
- m_pic_data_bit = 7;
- }
- else
- {
- // write current bit and move to the next
- u8 mask = 1 << m_pic_data_bit;
- m_pic_data = (m_pic_data & (~mask)) | (bit_out ? mask : 0);
- --m_pic_data_bit;
-
- if (m_pic_data_bit == 0xff)
- {
- m_pic_data_rdy = 2;
- log_cart_comm("PIC should have WRITTEN", m_pic_data);
- }
- }
- }
-
- m_pic_iobits = (m_pic_iobits & (~m_pic_in_mask)) | (bit_in ? m_pic_in_mask : 0);
- }
-
- // log_cart_comm("PIC READ", m_pic_iobits);
- }
- return m_pic_iobits;
-}
-
-void galgames_cart_device::int_pic_data_w(u8 data)
-{
- m_pic_iobits = (m_pic_iobits & (~m_pic_out_mask)) | (data & m_pic_out_mask);
-
-// log_cart_comm("PIC WRITE", data);
-}
-
-/*
-galgame3, port A:
- bit 2 = bank lsb
- bit 3 = bank msb
-*/
-void galgames_cart_device::int_pic_bank_w(u8 data)
-{
- set_rom_bank((data >> 2) & 3);
-}
-
-
-// External EEPROM interface
-
-u8 galgames_cart_device::eeprom_r()
-{
- return (m_eeprom && m_eeprom->do_read()) ? 0x80 : 0x00;
-}
-
-void galgames_cart_device::eeprom_w(u8 data)
-{
- if (!m_eeprom)
- return;
-
- if (data & ~0x03)
- logerror("Unknown EEPROM bit written %04X\n", data);
-
- // latch the bit
- m_eeprom->di_write(data & 0x01);
-
- // clock line asserted: write latch or select next bit to read
- m_eeprom->clk_write((data & 0x02) ? ASSERT_LINE : CLEAR_LINE);
-}
-
-WRITE_LINE_MEMBER(galgames_cart_device::eeprom_cs_write)
-{
- if (!m_eeprom)
- return;
-
- m_eeprom->cs_write(state);
-}
-
-
-// SLOT implementation
-
-void galgames_slot_device::slot_map(address_map &map)
-{
- map(0x000000, 0x1fffff).r(FUNC(galgames_slot_device::rom0_r));
- map(0x000000, 0x03ffff).rw(FUNC(galgames_slot_device::rom0_or_ram_r), FUNC(galgames_slot_device::ram_w)).share("ram");
- map(0x200000, 0x3fffff).r(FUNC(galgames_slot_device::rom_r));
- map(0x200000, 0x23ffff).rw(FUNC(galgames_slot_device::rom_or_ram_r), FUNC(galgames_slot_device::ram_w));
-}
-
-galgames_slot_device::galgames_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
- device_t(mconfig, GALGAMES_SLOT, tag, owner, clock),
- device_memory_interface(mconfig, *this),
- m_space_config("slot_space", ENDIANNESS_BIG, 16,22, 0, address_map_constructor(FUNC(galgames_slot_device::slot_map), this)),
- m_ram(*this, "ram"),
- m_cart0(*this, "^cart0"),
- m_cart1(*this, "^cart1"),
- m_cart2(*this, "^cart2"),
- m_cart3(*this, "^cart3"),
- m_cart4(*this, "^cart4")
-{
-}
-
-void galgames_slot_device::device_start()
-{
- m_space = &space(AS_PROGRAM);
-
- m_carts[0] = m_cart0;
- m_carts[1] = m_cart1;
- m_carts[2] = m_cart2;
- m_carts[3] = m_cart3;
- m_carts[4] = m_cart4;
-
- save_item(NAME(m_cart));
- save_item(NAME(m_is_ram_active));
-}
-
-void galgames_slot_device::device_reset()
-{
- m_is_ram_active = false;
-
- set_cart(0);
- reset_eeproms_except(-1);
-}
-
-void galgames_slot_device::set_cart(int cart)
-{
-// if (m_cart != cart)
-// logerror("%s: cart sel = %02x\n", machine().describe_context(), cart);
-
- m_cart = cart;
-}
-
-void galgames_slot_device::reset_eeproms_except(int cart)
-{
- // Reset all eeproms except the selected one
- for (int i = 0; i < 5; i++)
- m_carts[i]->eeprom_cs_write((cart == i) ? ASSERT_LINE : CLEAR_LINE);
-}
-
-void galgames_slot_device::cart_sel_w(u8 data)
-{
- // cart selection (0 1 2 3 4 7)
-
- switch (data)
- {
- case 0x07: // 7 resets all
- reset_eeproms_except(-1);
- break;
-
- case 0x00: // cart 0 (motherboard)
- case 0x01: // cart 1
- case 0x02: // cart 2
- case 0x03: // cart 3
- case 0x04: // cart 4
- set_cart(data);
- reset_eeproms_except(data);
- break;
-
- default:
- set_cart(0);
- reset_eeproms_except(0);
- logerror("%s: unknown cart sel = %02x\n", machine().describe_context(), data);
- break;
- }
-}
-
-// Select RAM, reset PIC
-
-void galgames_slot_device::ram_sel_w(u8 data)
-{
- // bit 3 = PIC reset (active low)
- set_pic_reset_line(BIT(data, 3) ? CLEAR_LINE : ASSERT_LINE);
-
- // ROM/RAM banking
- if ((data & 0xf7) == 0x05)
- {
- m_is_ram_active = true;
-// logerror("%s: romram bank = %02x\n", machine().describe_context(), data);
- }
-}
-
-// External ROM read
-
-u16 galgames_slot_device::rom0_r(offs_t offset)
-{
- return m_carts[0]->rom_r(offset);
-}
-u16 galgames_slot_device::rom_r(offs_t offset)
-{
- return m_carts[m_cart]->rom_r(offset);
-}
-
-u16 galgames_slot_device::rom0_or_ram_r(offs_t offset)
-{
- return m_is_ram_active ? m_ram[offset] : m_carts[0]->rom_r(offset);
-}
-u16 galgames_slot_device::rom_or_ram_r(offs_t offset)
-{
- return !m_is_ram_active ? m_ram[offset] : m_carts[m_cart]->rom_r(offset);
-}
-
-void galgames_slot_device::ram_w(offs_t offset, u16 data, u16 mem_mask)
-{
- COMBINE_DATA(m_ram + offset);
-}
-
-// External PIC status and data interface
-
-u8 galgames_slot_device::pic_status_r()
-{
- return m_carts[m_cart]->pic_status_r();
-}
-u8 galgames_slot_device::pic_data_r()
-{
- return m_carts[m_cart]->pic_data_r();
-}
-void galgames_slot_device::pic_data_w(u8 data)
-{
- m_carts[m_cart]->pic_data_w(data);
-}
-
-void galgames_slot_device::set_pic_reset_line(int state)
-{
- m_carts[m_cart]->set_pic_reset_line(state);
-}
-
-// External EEPROM interface
-
-u8 galgames_slot_device::eeprom_r()
-{
- return m_carts[m_cart]->eeprom_r();
-}
-void galgames_slot_device::eeprom_w(u8 data)
-{
- m_carts[m_cart]->eeprom_w(data);
-}
-WRITE_LINE_MEMBER(galgames_slot_device::eeprom_cs_write)
-{
- m_carts[m_cart]->eeprom_cs_write(state);
-}
-
-/***************************************************************************
-
- General
-
-***************************************************************************/
-
-class galgames_state : public driver_device
-{
-public:
- galgames_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_screen(*this, "screen"),
- m_palette(*this, "palette"),
- m_blitter(*this, "blitter"),
- m_oki(*this, "oki"),
- m_slot(*this, "slot"),
- m_okiram(*this, "okiram")
- { }
-
- DECLARE_WRITE_LINE_MEMBER(blitter_irq_callback);
-
- TIMER_DEVICE_CALLBACK_MEMBER(scanline_interrupt);
- u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
-
- void palette_offset_w(u8 data);
- void palette_data_w(u8 data);
-
- u8 okiram_r(offs_t offset);
- void okiram_w(offs_t offset, u8 data);
-
- u16 fpga_status_r();
- void outputs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
-
- void galgames_base(machine_config &config);
- void galgbios(machine_config &config);
- void galgame2(machine_config &config);
- void galgame3(machine_config &config);
- void blitter_map(address_map &map);
- void galgames_map(address_map &map);
- void oki_map(address_map &map);
-
-protected:
- virtual void video_start() override;
-
- required_device<cpu_device> m_maincpu;
- required_device<screen_device> m_screen;
- required_device<palette_device> m_palette;
- required_device<cesblit_device> m_blitter;
- required_device<okim6295_device> m_oki;
- required_device<galgames_slot_device> m_slot;
- required_shared_ptr<u8> m_okiram;
-
- u8 m_palette_offset;
- u8 m_palette_index;
- u8 m_palette_data[3];
-};
-
-WRITE_LINE_MEMBER(galgames_state::blitter_irq_callback)
-{
-// logerror("%s: Blitter IRQ callback state = %x\n", machine().describe_context(), state);
- m_maincpu->set_input_line(2, state);
-}
-
-/***************************************************************************
-
- Video
-
-***************************************************************************/
-
-u32 galgames_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- bitmap.fill(m_palette->black_pen(), cliprect);
- return m_blitter->screen_update(screen, bitmap, cliprect);
-}
-
-// BT481A Palette RAMDAC
-
-void galgames_state::palette_offset_w(u8 data)
-{
- m_palette_offset = data & 0xff;
- m_palette_index = 0;
-}
-
-void galgames_state::palette_data_w(u8 data)
-{
- m_palette_data[m_palette_index] = data & 0xff;
- if (++m_palette_index == 3)
- {
- for (int palette_base = 0; palette_base < 0x1000; palette_base += 0x100)
- m_palette->set_pen_color(m_palette_offset + palette_base, rgb_t(m_palette_data[0], m_palette_data[1], m_palette_data[2]));
- m_palette_index = 0;
- m_palette_offset++;
- }
-}
-
-void galgames_state::video_start()
-{
- save_item(NAME(m_palette_offset));
- save_item(NAME(m_palette_index));
- save_item(NAME(m_palette_data));
-}
-
-/***************************************************************************
-
- Sound
-
-***************************************************************************/
-
-u8 galgames_state::okiram_r(offs_t offset)
-{
- return m_okiram[offset];
-}
-
-void galgames_state::okiram_w(offs_t offset, u8 data)
-{
- m_okiram[offset] = data;
-}
-
-/***************************************************************************
-
- Memory Maps
-
-***************************************************************************/
-
-// Outputs
-
-void galgames_state::outputs_w(offs_t offset, u16 data, u16 mem_mask)
-{
- if (data & mem_mask & ~0x000f)
- logerror("%s: Unknown output bit written %04X\n", machine().describe_context(), data);
-
- if (ACCESSING_BITS_0_7)
- {
- // bit 0 & 1 : ? always on (may be trackball lights or coin lockouts)
- // bit 2 : coin counter
- // bit 3 : ? set after selecting a game (mostly off in-game)
- machine().bookkeeping().coin_counter_w(0, data & 0x0004);
- }
-
-// popmessage("OUT %02X", data & mem_mask);
-}
-
-// FPGA
-
-u16 galgames_state::fpga_status_r()
-{
- return 0x3; // Pass the check at PC = 0xfae & a later one
-}
-
-void galgames_state::galgames_map(address_map &map)
-{
- map(0x000000, 0x3fffff).rw(m_slot, FUNC(galgames_slot_device::read), FUNC(galgames_slot_device::write));
-
- map(0x400000, 0x400011).w(m_blitter, FUNC(cesblit_device::regs_w));
- map(0x400012, 0x400013).w(m_blitter, FUNC(cesblit_device::addr_hi_w));
- map(0x400014, 0x400015).w(m_blitter, FUNC(cesblit_device::color_w));
- map(0x400020, 0x400021).r(m_blitter, FUNC(cesblit_device::status_r));
-
- map(0x600000, 0x600001).r(FUNC(galgames_state::fpga_status_r));
- map(0x700000, 0x700001).r(FUNC(galgames_state::fpga_status_r)).nopw();
- map(0x800020, 0x80003f).noprw(); // ?
- map(0x900000, 0x900001).w("watchdog", FUNC(watchdog_timer_device::reset16_w));
-
- map(0xa00001, 0xa00001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
- map(0xb00000, 0xb7ffff).rw(FUNC(galgames_state::okiram_r), FUNC(galgames_state::okiram_w)).umask16(0x00ff); // (only low bytes tested) 4x N341024SJ-15
-
- map(0xc00001, 0xc00001).w(FUNC(galgames_state::palette_offset_w));
- map(0xc00003, 0xc00003).w(FUNC(galgames_state::palette_data_w));
-
- map(0xd00000, 0xd00001).portr("TRACKBALL_1_X");
- map(0xd00000, 0xd00001).nopw(); // bit 0: FPGA programming serial in (lsb first)
- map(0xd00002, 0xd00003).portr("TRACKBALL_1_Y");
- map(0xd00004, 0xd00005).portr("TRACKBALL_2_X");
- map(0xd00006, 0xd00007).portr("TRACKBALL_2_Y");
- map(0xd00008, 0xd00009).portr("P1");
- map(0xd0000a, 0xd0000b).portr("P2");
- map(0xd0000c, 0xd0000d).portr("SYSTEM").w(FUNC(galgames_state::outputs_w));
-
- map(0xd0000e, 0xd0000f).nopr();
- map(0xd0000f, 0xd0000f).w(m_slot, FUNC(galgames_slot_device::cart_sel_w));
- map(0xd00011, 0xd00011).rw(m_slot, FUNC(galgames_slot_device::eeprom_r), FUNC(galgames_slot_device::eeprom_w));
- map(0xd00013, 0xd00013).rw(m_slot, FUNC(galgames_slot_device::pic_data_r), FUNC(galgames_slot_device::pic_data_w));
- map(0xd00015, 0xd00015).rw(m_slot, FUNC(galgames_slot_device::pic_status_r), FUNC(galgames_slot_device::ram_sel_w));
-}
-
-void galgames_state::blitter_map(address_map &map)
-{
- map(0x000000, 0x1fffff).r(":slot", FUNC(galgames_slot_device::rom_r));
-}
-
-void galgames_state::oki_map(address_map &map)
-{
- map(0x00000, 0x3ffff).ram().share("okiram");
-}
-
-/***************************************************************************
-
- Input Ports
-
-***************************************************************************/
-
-static INPUT_PORTS_START(galgames)
- PORT_START("P1")
- PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1) // Button A (right)
- PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1) // Button B (left)
- PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN)
-
- PORT_START("P2")
- PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(2) // Button A (right)
- PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2) // Button B (left)
- PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_SERVICE1) // DBA (coin)
- PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN)
-
- PORT_START("SYSTEM")
- PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_COIN1) // CS 1 (coin)
- PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_COIN2) // CS 2 (coin)
- PORT_BIT(0x0004, IP_ACTIVE_HIGH,IPT_OTHER) PORT_CODE(KEYCODE_F2) PORT_NAME("Service Mode (Coin Door)") PORT_TOGGLE
- PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN)
- PORT_BIT(0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN)
-
- PORT_START("TRACKBALL_1_X")
- PORT_BIT(0xff, 0x00, IPT_TRACKBALL_X) PORT_SENSITIVITY(25) PORT_KEYDELTA(5) PORT_PLAYER(1) PORT_RESET
-
- PORT_START("TRACKBALL_1_Y")
- PORT_BIT(0xff, 0x00, IPT_TRACKBALL_Y) PORT_SENSITIVITY(25) PORT_KEYDELTA(5) PORT_PLAYER(1) PORT_RESET
-
- PORT_START("TRACKBALL_2_X")
- PORT_BIT(0xff, 0x00, IPT_TRACKBALL_X) PORT_SENSITIVITY(25) PORT_KEYDELTA(5) PORT_PLAYER(2) PORT_RESET
-
- PORT_START("TRACKBALL_2_Y")
- PORT_BIT(0xff, 0x00, IPT_TRACKBALL_Y) PORT_SENSITIVITY(25) PORT_KEYDELTA(5) PORT_PLAYER(2) PORT_RESET
-INPUT_PORTS_END
-
-/***************************************************************************
-
- Machine Drivers
-
-***************************************************************************/
-
-TIMER_DEVICE_CALLBACK_MEMBER(galgames_state::scanline_interrupt)
-{
- int scanline = param;
-
- if (scanline == 0) // vblank, FIXME
- m_maincpu->set_input_line(3, HOLD_LINE);
- else if ((scanline % 16) == 0)
- m_maincpu->set_input_line(1, HOLD_LINE);
-
- // lev 2 triggered at the end of the blit
-}
-
-int galgames_compute_addr(u16 reg_low, u16 reg_mid, u16 reg_high)
-{
- return reg_low | (reg_mid << 16);
-}
-
-void galgames_state::galgames_base(machine_config &config)
-{
- M68000(config, m_maincpu, XTAL(24'000'000) / 2);
- m_maincpu->set_addrmap(AS_PROGRAM, &galgames_state::galgames_map);
- TIMER(config, "scantimer").configure_scanline(FUNC(galgames_state::scanline_interrupt), "screen", 0, 1);
- WATCHDOG_TIMER(config, "watchdog");
-
- GALGAMES_SLOT(config, m_slot, 0);
- GALGAMES_BIOS_CART(config, "cart0", 0);
-
- // video hardware
- SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_refresh_hz(60);
- m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
- m_screen->set_size(400, 256);
- m_screen->set_visarea(0, 400-1, 0, 256-1);
- m_screen->set_screen_update(FUNC(galgames_state::screen_update));
- m_screen->set_palette(m_palette);
-
- CESBLIT(config, m_blitter, XTAL(24'000'000), m_screen);
- m_blitter->set_addrmap(AS_PROGRAM, &galgames_state::blitter_map);
- m_blitter->set_compute_addr(galgames_compute_addr);
- m_blitter->irq_callback().set(FUNC(galgames_state::blitter_irq_callback));
-
- PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x1000); // only 0x100 used
-
- // sound hardware
- SPEAKER(config, "mono").front_center();
- OKIM6295(config, m_oki, XTAL(24'000'000) / 16, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified (voices in galgame4 seem ok)
- m_oki->set_addrmap(0, &galgames_state::oki_map);
- m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
-}
-
-void galgames_state::galgbios(machine_config &config)
-{
- galgames_base(config);
- GALGAMES_CART(config, "cart1", 1);
- GALGAMES_CART(config, "cart2", 2);
- GALGAMES_CART(config, "cart3", 3);
- GALGAMES_CART(config, "cart4", 4);
-}
-
-void galgames_state::galgame2(machine_config &config)
-{
- galgames_base(config);
- GALGAMES_STARPAK2_CART(config, "cart1", 1);
- GALGAMES_CART(config, "cart2", 2);
- GALGAMES_CART(config, "cart3", 3);
- GALGAMES_CART(config, "cart4", 4);
-}
-
-void galgames_state::galgame3(machine_config &config)
-{
- galgames_base(config);
- GALGAMES_STARPAK3_CART(config, "cart1", 1);
- GALGAMES_CART(config, "cart2", 2);
- GALGAMES_CART(config, "cart3", 3);
- GALGAMES_CART(config, "cart4", 4);
-}
-
-/***************************************************************************
-
- ROMs Loading
-
-***************************************************************************/
-
-
-/***************************************************************************
-
-Galaxy Games BIOS
-
-This is a multi-game cocktail cabinet released in 1998. Namco and Atari
-licensed their IP for some cartridges for it.
-
-Trackball-based. 'BIOS' has 7 built-in games. There are two LEDs on the PCB.
-
-More information here : http://www.cesgames.com/museum/galaxy/index.html
-
-----
-
-Board silkscreened 237-0211-00
- REV.-D
-
-Cartridge based mother board
-Holds up to 4 cartridges
-Chips labeled
- GALAXY U1 V1.90 12/1/98
- GALAXY U2 V1.90 12/1/98
-
-Motorola MC68HC000FN12
-24 MHz oscillator
-Xilinx XC5206
-Xilinx XC5202
-BT481AKPJ110 (Palette RAMDAC)
-NKK N341024SJ-15 x8 (128kB RAM)
-OKI M6295 8092352-2
-
-PAL16V8H-15 @ U24 Blue dot on it
-PAL16V8H-15 @ U25 Yellow dot on it
-PAL16V8H-15 @ U26 Red dot on it
-PAL16V8H-15 @ U27 Green dot on it
-PAL16V8H-15 @ U45 Magenta dot on it
-
-Copyright notice in rom states: Creative Electronics & Software Written by Keith M. Kolmos May 29,1998
-
-***************************************************************************/
-
-#define ROM_LOAD16_BYTE_BIOS(bios,name,offset,length,hash) \
- ROMX_LOAD(name, offset, length, hash, ROM_SKIP(1) | ROM_BIOS(bios))
-
-#define GALGAMES_BIOS_ROMS \
- ROM_SYSTEM_BIOS(0, "1.90", "v1.90 12/01/98") \
- ROM_LOAD16_BYTE_BIOS(0, "galaxy_u2__v1.90_12-01-98.u2", 0x000000, 0x100000, CRC(e51ff184) SHA1(aaa795f2c15ec29b3ceeb5c917b643db0dbb7083)) \
- ROM_LOAD16_BYTE_BIOS(0, "galaxy_u1__v1.90_12-01-98.u1", 0x000001, 0x100000, CRC(c6d7bc6d) SHA1(93c032f9aa38cbbdda59a8a25ff9f38f7ad9c760)) \
- \
- ROM_SYSTEM_BIOS(1, "1.80", "v1.80 10/05/98") \
- ROM_LOAD16_BYTE_BIOS(1, "galaxy_u2__v1.80_10-15-98.u2", 0x000000, 0x100000, CRC(73cff284) SHA1(e6f7d92999cdb478c21c3b65a04eade84299ac12)) \
- ROM_LOAD16_BYTE_BIOS(1, "galaxy_u1__v1.80_10-15-98.u1", 0x000001, 0x100000, CRC(e3ae423c) SHA1(66d1964845a99a5ed4b19b4135b55cde6b5fe295))
-
-#define GALGAMES_MB_PALS \
- ROM_REGION(0xa00, "pals", 0) \
- ROM_LOAD("16v8h-blue.u24", 0x000, 0x117, NO_DUMP) \
- ROM_LOAD("16v8h-yellow.u25", 0x200, 0x117, NO_DUMP) \
- ROM_LOAD("16v8h-magenta.u26", 0x400, 0x117, NO_DUMP) \
- ROM_LOAD("16v8h-green.u27", 0x600, 0x117, NO_DUMP) \
- ROM_LOAD("16v8h-red.u45", 0x800, 0x117, NO_DUMP)
-
-ROM_START(galgbios)
- ROM_REGION16_BE(0x200000, "cart0", 0)
- GALGAMES_BIOS_ROMS
-
- ROM_REGION(0x200000, "cart1", ROMREGION_ERASEFF)
- ROM_REGION(0x200000, "cart2", ROMREGION_ERASEFF)
- ROM_REGION(0x200000, "cart3", ROMREGION_ERASEFF)
- ROM_REGION(0x200000, "cart4", ROMREGION_ERASEFF)
-
- GALGAMES_MB_PALS
-ROM_END
-
-/***************************************************************************
-
-Galaxy Games StarPak 2
-
-NAMCO 307 Cartridge, has surface mount Flash chips in it:
-
-.U1 AM29F800BB
-.U2 AM29F800BB
-.U3 93AA76/SN
-.U4 PIC 12C508
-.L1 Led
-
-Board silkscreened 237-0209-00
- REV.-C
-
-***************************************************************************/
-
-ROM_START(galgame2)
- ROM_REGION16_BE(0x200000, "cart0", 0)
- GALGAMES_BIOS_ROMS
-
- ROM_REGION(0x200000, "cart1", 0)
- ROM_LOAD16_BYTE("am29f800bb.u2", 0x000000, 0x100000, CRC(f43c0c54) SHA1(4a13946c3d173b0e4ab25b01849574fa3302b417))
- ROM_LOAD16_BYTE("am29f800bb.u1", 0x000001, 0x100000, CRC(b8c34a8b) SHA1(40d3b35f573d2bd2ae1c7d876c55fc436864fa3f))
-
- ROM_REGION(0x2000, "cart1:pic", 0)
- ROM_LOAD("pic12c508.u4", 0x0000, 0x2000, CRC(bb253913) SHA1(eace069344da6dda7c05673e422876d130ed5d48)) // includes config word at fff, hence size is 2*1000
-
- ROM_REGION(0x200000, "cart2", ROMREGION_ERASEFF)
- ROM_REGION(0x200000, "cart3", ROMREGION_ERASEFF)
- ROM_REGION(0x200000, "cart4", ROMREGION_ERASEFF)
-
- GALGAMES_MB_PALS
-ROM_END
-
-/***************************************************************************
-
-Galaxy Games StarPak 3
-
-Cartridge with 8 games, including Atari licensed Centipede.
-
-.U1 AM29F032B
-.U2 AM29F032B
-.U5 93AA76/SN
-.U6 PIC 16C56-XT/P
-.L1 Led
-
-Board silkscreened 237-0228-00
- REV.-B
-
-***************************************************************************/
-
-ROM_START(galgame3)
- ROM_REGION16_BE(0x200000, "cart0", 0)
- GALGAMES_BIOS_ROMS
-
- ROM_REGION(0x800000, "cart1", 0)
- ROM_LOAD16_BYTE("am29f032b.u2", 0x000000, 0x400000, CRC(a4ffc70a) SHA1(328c6ceef025af7ff5b7998df59a10d90c654d53))
- ROM_LOAD16_BYTE("am29f032b.u1", 0x000001, 0x400000, CRC(b0876751) SHA1(487f052989e4b2df2df2293b283e8e03ffc3ddf4))
-
- ROM_REGION(0x800, "cart1:pic", 0)
- ROM_LOAD("pic16c56.u6", 0x000, 0x800, CRC(cf901ed8) SHA1(ebb2da0f50ba82a038f315aab7e6b20b9a1af3a1))
-
- ROM_REGION(0x200000, "cart2", ROMREGION_ERASEFF)
- ROM_REGION(0x200000, "cart3", ROMREGION_ERASEFF)
- ROM_REGION(0x200000, "cart4", ROMREGION_ERASEFF)
-
- GALGAMES_MB_PALS
-ROM_END
-
-/***************************************************************************
-
-Galaxy Games StarPak 4
-(Cartridge not dumped, but files from a dev board provided by the developer)
-
-***************************************************************************/
-
-ROM_START(galgame4)
- ROM_REGION16_BE(0x200000, "cart0", 0)
- GALGAMES_BIOS_ROMS
-
- ROM_REGION(0x800000, "cart1", 0)
- ROM_LOAD16_BYTE("sp4.u2", 0x000000, 0x100000, CRC(e51bc5e1) SHA1(dacf6cefd792713b34382b827952b66e2cb5c2b4)) // JANUARY 12, 1998
- ROM_LOAD16_BYTE("sp4.u1", 0x000001, 0x100000, CRC(695ab775) SHA1(e88d5f982df19e70be6124e6fdf20830475641e0)) // ""
- ROM_LOAD16_BYTE("sp4.u6", 0x200000, 0x100000, CRC(7716895d) SHA1(8f86ffe2d94d3e756a3b7661d480e3a8c53cf178))
- ROM_LOAD16_BYTE("sp4.u5", 0x200001, 0x100000, CRC(6c699ba3) SHA1(f675997e1b808758f79a21b883161526242990b4))
- ROM_LOAD16_BYTE("sp4.u8", 0x400000, 0x100000, CRC(cdf45446) SHA1(da4e1667c7c47239e770018a7d3b8c1e4e2f4a63))
- ROM_LOAD16_BYTE("sp4.u7", 0x400001, 0x100000, CRC(813c46c8) SHA1(3fd4192ec7e8d5e6bfbc2a37d9b4bbebe6132b99))
- ROM_LOAD16_BYTE("sp4.u10", 0x600000, 0x100000, CRC(52dbf088) SHA1(da7c37366e884f40f1dea243d4aea0b2d2b314db))
- ROM_LOAD16_BYTE("sp4.u9", 0x600001, 0x100000, CRC(9ded1dc2) SHA1(5319edfccf47d02dfd3664cb3782cc2281c769c4))
-
- ROM_REGION(0x2000, "cart1:pic", 0)
- ROM_LOAD("sp4.pic", 0x000, 0x2000, CRC(008ef1ba) SHA1(4065fcf00922de3e629084f4f4815355f271c954))
-
- ROM_REGION(0x200000, "cart2", ROMREGION_ERASEFF)
- ROM_REGION(0x200000, "cart3", ROMREGION_ERASEFF)
- ROM_REGION(0x200000, "cart4", ROMREGION_ERASEFF)
-
- GALGAMES_MB_PALS
-ROM_END
-
-
-GAME(1998, galgbios, 0, galgbios, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software", "Galaxy Games BIOS", MACHINE_IS_BIOS_ROOT)
-GAME(1998, galgame2, galgbios, galgame2, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software / Namco", "Galaxy Games StarPak 2", 0)
-GAME(1998, galgame3, galgbios, galgame3, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software / Atari", "Galaxy Games StarPak 3", 0)
-GAME(1998, galgame4, galgbios, galgame3, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software", "Galaxy Games StarPak 4 (prototype)", MACHINE_IMPERFECT_GRAPHICS)