From cc0eae6904965fd21a883b500e67839e7be83f30 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Sat, 9 Dec 2023 01:30:01 +0100 Subject: New systems marked not working ------------------------------ Cast Away (dual 6809 GI Australasia PCB) [Roberto Fresca, Grull Osgo] Jester Chance (dual 6809 GI Australasia PCB) [Roberto Fresca, Grull Osgo] Good Luck! (dual 6809 GI Australasia PCB) [Roberto Fresca, Grull Osgo] --- src/mame/mame.lst | 5 + src/mame/misc/gi6809.cpp | 902 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 907 insertions(+) create mode 100644 src/mame/misc/gi6809.cpp diff --git a/src/mame/mame.lst b/src/mame/mame.lst index d845fc9a25f..01338aedbc6 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -29990,6 +29990,11 @@ suprpokrb // (c) 1986 Grayhound Electronics @source:misc/gfamily.cpp gmfamily // +@source:misc/gi6809.cpp +castawayt // (c) 1987 Tranex Australia Pty Ltd. +jesterch // (c) 1987 Tranex Australia Pty Ltd. +glck6809 // (c) 198? General Instrument? + @source:misc/globalfr.cpp gl_coc // Carry On Clubbin' (Global) gl_coc29 // diff --git a/src/mame/misc/gi6809.cpp b/src/mame/misc/gi6809.cpp new file mode 100644 index 00000000000..378bdd60b5d --- /dev/null +++ b/src/mame/misc/gi6809.cpp @@ -0,0 +1,902 @@ +// license:BSD-3-Clause +// copyright-holders: Roberto Fresca, Grull Osgo +/**************************************************************************************** + + GI (General Instrument) dual 6809 hardware. + Driver by Roberto Fresca & Grull Osgo. + + Games running on this hardware: + + * Cast Away (dual 6809 GI Australasia PCB), 1987, Tranex Australia Pty Ltd. + * Jester Chance (dual 6809 GI Australasia PCB), 1987, Tranex Australia Pty Ltd. + * Good Luck! (dual 6809 GI Australasia PCB), 198?, unknown. + + +***************************************************************************************** + + Hardware Notes: + + Specs: + + PCB etched: + GENERAL INSTRUMENT + AUSTRALASIA PTY LTD. + + 2x Hitachi HD6809EP CPUs. + 2x Hitachi HD46821P PIAs. + 1x Hitachi HD46505SP CRTC. + + 1x 2732 ROM (charset) @ U5. + 3x 2732 ROM (tileset) @ U2, U3, U4. + + 2x 74S287N Bipolar PROM (256 Bit x 4, 3-state) Cross reference: 82S129, @ U31 & U35. + + 1x Xtal 10.000 MHz. + + ----------------------------------------------------------- + + This hardware is composed of two 6809 microprocessors. + One manages the game. The second manages the Accounting System. + + Both processors share RAM memory through an unknown method. + This hardware has a sophisticated and unknown design to manage processor's interrupts via PIAs 6821. + Coin-In system has two sensors and a complex way to validate via IRQs system. + glk6809 has different hardware from castawayt and jesterch. + glk6809 has an unknown device at 4000h that provides a Serial Number. + + + * Game glck6809: + + Payout is enabled with at least 30 Credits and it's only Hand Paid. + Game has a lot of Statistics but a it hasn't any Test Mode. + Game hasn't any active lamp for user buttons. + Game hasn't hopper device. + Game has a lack of sound effects (Bet action, Hold Action, Winning action, Prize pay action , etc). + Game has a lack of gaming stages messages. + Game hasn't DSW Settings or Menu Driven Settings. (Pay tables, Jack or Better, Auto Hold, etc). + + + * Game Jester Chance: + + Incomplete due to a lack of hardware info and a pre-loaded NVRAM. + System runs partially. + Driver hasn't Coin-In system hooked up. + Unknown NMI source on Master CPU. + + +**************************************************************************************** + + To Do: + ------ + + - Discover the proper way to tie PIA's signals to Microprocessor's IRQs. + - Coin In device support. + - Discrete sound. + + +****************************************************************************************/ + +// Debug Notes: +// good luck credits vars 6Bh - 1ABh - 501Bh(nvram) - bin +// jester ch credits vars 34h - 179h - 5018h(nvram) - bin +// castaway credits vars 1Eh - 14Ah - 5025h(nvram) - bin + +#include "emu.h" +#include "emupal.h" +#include "screen.h" +#include "speaker.h" +#include "tilemap.h" + +#include "cpu/m6809/m6809.h" +#include "machine/6821pia.h" +#include "machine/nvram.h" +#include "machine/ticket.h" +#include "video/mc6845.h" + +namespace { + +#define MASTER_CLOCK XTAL(10'000'000) +#define CPU_CLOCK_GL (MASTER_CLOCK / 16) +#define CPU_CLOCK (MASTER_CLOCK / 2) +#define PIXEL_CLOCK (MASTER_CLOCK / 16) + + +class gi6809_state : public driver_device +{ +public: + gi6809_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_slavecpu(*this, "slavecpu"), + m_pia(*this, "pia%u", 0U), + m_screen(*this, "screen"), + m_gfxdecode(*this, "gfxdecode"), + m_videoram(*this, "videoram"), + m_colorram(*this, "colorram"), + m_input(*this, "IN0-%u", 0U), + m_hopper(*this, "hopper"), + m_coin_key(*this, "CoinKey"), + m_lamps(*this, "lamp%u", 0U) + { } + + void castawayt(machine_config &config); + void glck6809(machine_config &config); + void jesterch(machine_config &config); + void init_cast(); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + void gi6809_base(machine_config &config); + +private: + // Address Maps + void glckmain_map(address_map &map); + void glckslave_map(address_map &map); + void castmain_map(address_map &map); + void castslave_map(address_map &map); + void jestmain_map(address_map &map); + void jestslave_map(address_map &map); + + // Devices + required_device m_maincpu; + required_device m_slavecpu; + required_device_array m_pia; + required_device m_screen; + required_device m_gfxdecode; + required_shared_ptr m_videoram; + required_shared_ptr m_colorram; + required_ioport_array<4> m_input; + required_device m_hopper; + optional_ioport m_coin_key; + output_finder<8> m_lamps; + + // Video Hardware + + TILE_GET_INFO_MEMBER(get_bg_tile_info); + void gi6809_videoram_w(offs_t offset, uint8_t data); + void gi6809_colorram_w(offs_t offset, uint8_t data); + void gi6809_palette(palette_device &palette) const; + void castawayt_palette(palette_device &palette) const; + uint32_t screen_update_gi6809(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + // Input ports + uint8_t gi6809_mux_port_r(); + uint8_t cast_mux_port_r(); + + // Output ports + void lamps3_w(uint8_t data); + void lamps3h_w(uint8_t data); + void lamps5_w(uint8_t data); + void lamps8_w(uint8_t data); + void snd_mux_w(uint8_t data); + + // Input-Output lines + int pia0_ca1_r(); + int ret_vsync_r(); + + void crtc_vs_gl_w(int state); + void crtc_vs_ca_w(int state); + void crtc_vs_je_w(int state); + + // internal + uint8_t sn_read1_r() { return m_sernum1[(m_ser_ptr++) & 0x0f]; } + uint8_t sn_read2_r() { return m_sernum2[(m_ser_ptr++) & 0x0f]; } + uint8_t cast_sens_r() { return 0xff; } + + tilemap_t *m_bg_tilemap; + + // Latches + uint8_t m_mux_data = 0xff; + + // states + bool m_vsync = 0; + + // internal + uint8_t m_ser_ptr = 0; + uint8_t m_sernum1[0x10] = { 3, 0, 3, 4, 4, 1, 4, 1, 0, 0, 0, 0, 0, 0, 2, 6 }; + uint8_t m_sernum2[0x10] = { 4, 7, 4, 9, 2, 13, 4, 3, 0, 0, 0, 0, 0, 0, 0, 1 }; + +}; + + +void gi6809_state::machine_start() +{ + m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gi6809_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + m_lamps.resolve(); +} + + +/******************************** +* Interrupt Control * +********************************/ + +void gi6809_state::crtc_vs_gl_w(int state) +{ + m_vsync = state; +} + + +void gi6809_state::crtc_vs_ca_w(int state) +{ + m_vsync = state; +} + + +void gi6809_state::crtc_vs_je_w(int state) +{ + m_vsync = state; + m_pia[1]->cb1_w(state); // IRQB-> IRQ Master + m_pia[1]->ca1_w(!state); // IRQA-> FIRQ Master + m_pia[0]->ca1_w(state); // IRQA-> IRQ Slave +} + + +int gi6809_state::ret_vsync_r() +{ + return m_vsync; +} + + +int gi6809_state::pia0_ca1_r() +{ + m_pia[1]->read(1); + return m_vsync; +} + + +/********************************************* +* Video Hardware * +*********************************************/ + +void gi6809_state::gi6809_videoram_w(offs_t offset, uint8_t data) +{ + m_videoram[offset] = data; + m_bg_tilemap->mark_tile_dirty(offset); +} + +void gi6809_state::gi6809_colorram_w(offs_t offset, uint8_t data) +{ + m_colorram[offset] = data; + m_bg_tilemap->mark_tile_dirty(offset); +} + + +TILE_GET_INFO_MEMBER(gi6809_state::get_bg_tile_info) +{ +/* - bits - + 7654 3210 + --xx xx-- tiles color. + ---- --x- tiles bank. + ---- ---x tiles extended address (MSB). + xx-- ---- unused. +*/ + + int attr = m_colorram[tile_index]; + int code = ((attr & 1) << 8) | m_videoram[tile_index]; + int bank = (attr & 0x02) >> 1; // bit 1 switch the gfx banks + int color = (attr & 0x3c) >> 2; // bits 2-3-4-5 for color + + tileinfo.set(bank, code, color, 0); +} + + +uint32_t gi6809_state::screen_update_gi6809(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + return 0; +} + + +void gi6809_state::gi6809_palette(palette_device &palette) const +{ +/* + This hardware has a feature called BLUE KILLER. + Using the original intensity line, the PCB has a bridge + that allows (as default) to turn the background black. + + All games running on this hardware + were designed with black background. + + 7654 3210 + ---- ---x red component. + ---- --x- green component. + ---- -x-- blue component. + ---- x--- blue killer. + xxxx ---- unused. +*/ + + // 0000KBGR + uint8_t const *const color_prom = memregion("proms")->base(); + if (!color_prom) + return; + + for (int i = 0; i < palette.entries(); i++) + { + // blue killer (from schematics) + int const bk = BIT(color_prom[i], 3); + + // red component + int const r = BIT(color_prom[i], 0) * 0xff; + + // green component + int const g = BIT(color_prom[i], 1) * 0xff; + + // blue component + int const b = bk * BIT(color_prom[i], 2) * 0xff; + + palette.set_pen_color(i, rgb_t(r, g, b)); + } +} + + +/******************************************* +* Read Handlers * +*******************************************/ + +uint8_t gi6809_state::gi6809_mux_port_r() +{ + uint8_t data = 0xff; + + for (int i = 0; i < 4 ; i++) + if (BIT(~m_mux_data, i + 4)) + { + data &= m_input[i]->read(); +/* + ToDo: three stages coin in system +*/ + } + return data; +} + + +uint8_t gi6809_state::cast_mux_port_r() +{ + uint8_t data = 0xff; + + for (int i = 0; i < 4 ; i++) + if (BIT(~m_mux_data, i + 4)) + { + data &= m_input[i]->read(); + } + return data; +} + + +/******************************************* +* Write Handlers * +*******************************************/ + +void gi6809_state::lamps3_w(uint8_t data) +{ + // glck6809 - No lamps action + data = data ^ 0xff; + + m_lamps[5] = BIT(data, 5); // lamp 5 Coin lockout + m_lamps[6] = BIT(data, 6); // lamp 6 Hopper Motor + m_lamps[7] = BIT(data, 7); // lamp 7 Attendant Lamp +} + + +void gi6809_state::lamps3h_w(uint8_t data) +{ + data = data ^ 0xff; + + m_lamps[5] = BIT(data, 5); // lamp 5 Coin lockout + m_lamps[6] = BIT(data, 6); // lamp 6 Hopper Motor + m_lamps[7] = BIT(data, 7); // lamp 7 Attendant Lamp + m_hopper->motor_w(BIT(data, 6)); +} + + +void gi6809_state::lamps5_w(uint8_t data) +{ + // glck6809 - No lamps action + data = data ^ 0xff; + + m_lamps[0] = BIT(data, 0); + m_lamps[1] = BIT(data, 1); + m_lamps[2] = BIT(data, 2); + m_lamps[3] = BIT(data, 3); + m_lamps[4] = BIT(data, 4); +} + + +void gi6809_state::lamps8_w(uint8_t data) +{ + data = data ^ 0xff; + + m_lamps[0] = BIT(data, 0); + m_lamps[1] = BIT(data, 1); + m_lamps[2] = BIT(data, 2); + m_lamps[3] = BIT(data, 3); + m_lamps[4] = BIT(data, 4); + m_lamps[5] = BIT(data, 5); + m_lamps[6] = BIT(data, 6); + m_lamps[7] = BIT(data, 7); +} + + +void gi6809_state::snd_mux_w(uint8_t data) +{ + m_mux_data = data; +} + + +/********************************************* +* Memory Map Information * +*********************************************/ + +void gi6809_state::glckmain_map(address_map &map) +{ + map(0x0000, 0x03ff).ram().share("ram"); + map(0x1000, 0x13ff).ram().w(FUNC(gi6809_state::gi6809_videoram_w)).share("videoram"); + map(0x2000, 0x23ff).ram().w(FUNC(gi6809_state::gi6809_colorram_w)).share("colorram"); + map(0x3000, 0x3000).w("crtc", FUNC(mc6845_device::address_w)); + map(0x3001, 0x3001).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); + map(0x4000, 0x4003).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + map(0x5000, 0x5fff).ram().share("nvram"); + map(0x8000, 0xffff).rom(); +} + +void gi6809_state::glckslave_map(address_map &map) +{ + map(0x0000, 0x03ff).ram().share("ram"); + map(0x1004, 0x1007).rw("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + map(0x4000, 0x400f).r(FUNC(gi6809_state::sn_read1_r)); // unknown device + map(0x5000, 0x5fff).ram().share("nvram"); + map(0xe000, 0xffff).rom(); +} + +void gi6809_state::castmain_map(address_map &map) +{ + map(0x0000, 0x00ff).ram().share("ram"); + map(0x0100, 0x07ff).ram(); + map(0x1000, 0x13ff).ram().w(FUNC(gi6809_state::gi6809_videoram_w)).share("videoram"); + map(0x2000, 0x23ff).ram().w(FUNC(gi6809_state::gi6809_colorram_w)).share("colorram"); + map(0x3000, 0x3000).w("crtc", FUNC(mc6845_device::address_w)); + map(0x3001, 0x3001).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); + map(0x4000, 0x4003).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + map(0x5000, 0x5fff).ram().share("nvram"); + map(0x7000, 0x7000).r(FUNC(gi6809_state::cast_sens_r)); + map(0x8000, 0xffff).rom(); +} + +void gi6809_state::castslave_map(address_map &map) +{ + map(0x0000, 0x00ff).ram().share("ram"); + map(0x0100, 0x07ff).ram(); + map(0x1004, 0x1007).rw("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + map(0x4000, 0x400f).noprw(); + map(0x5000, 0x5fff).ram().share("nvram"); + map(0xe000, 0xffff).rom(); +} + +void gi6809_state::jestmain_map(address_map &map) +{ + map(0x0000, 0x00ff).ram().share("ram"); + map(0x0100, 0x07ff).ram(); + map(0x1000, 0x13ff).ram().w(FUNC(gi6809_state::gi6809_videoram_w)).share("videoram"); + map(0x2000, 0x23ff).ram().w(FUNC(gi6809_state::gi6809_colorram_w)).share("colorram"); + map(0x3000, 0x3000).w("crtc", FUNC(mc6845_device::address_w)); + map(0x3001, 0x3001).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); + map(0x4000, 0x4003).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + map(0x5000, 0x5000).portr("SENSB").w(FUNC(gi6809_state::lamps8_w)); + map(0x5001, 0x5003).noprw(); // unknown device + map(0x8000, 0xffff).rom(); +} + +void gi6809_state::jestslave_map(address_map &map) +{ + map(0x0000, 0x00ff).ram().share("ram"); + map(0x0100, 0x07ff).ram(); + map(0x1004, 0x1007).rw("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + map(0x4000, 0x400f).nopw().r(FUNC(gi6809_state::sn_read2_r)); // unknown device + map(0x5000, 0x5fff).ram().share("nvram"); + map(0xe000, 0xffff).rom(); +} + + +/********************************************* +* Input Ports * +*********************************************/ + +/* Notes about inputs duplication... + + Even when there are duplications (holds buttons, services, and others, + they have different behaviours/fuctions and should be named accordingly. + If we factor them out, just will need to dupe the common ones due to + the above explanation, and all the scheme will looks odd and confusing. + Will see later when we have all the games working, if could do something + about. + Cleaned some duplications using port modify. +*/ + +static INPUT_PORTS_START( glck6809 ) + // Multiplexed - 4x5bits + PORT_START("IN0-0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Supervisor Key") PORT_TOGGLE // Full Menu. + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Attendant Key") PORT_TOGGLE // Partial Menu. + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Reserve Machine") PORT_CODE(KEYCODE_8) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_GAMBLE_DOOR ) PORT_NAME("Door - Att Menu") PORT_TOGGLE + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN0-1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_D_UP ) PORT_NAME("D-UP - Menu Back") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) // Coin Upper Sensor, polled from matrix scan. + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_CANCEL ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) // Coin Lower Sensor, polled from matrix scan. + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN0-2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH ) PORT_NAME("Big - Menu Up") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_LOW ) PORT_NAME("Small - Menu Down") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE ) PORT_NAME("Take - Menu Set") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN0-3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("PIA0_A") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) // Meter Sensor 1 (PIA0_A 01) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) // Meter Sensor 2 (PIA0_A 02) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) // Meter Sensor 3 (PIA0_A 04) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) // Meter Sensor 4 (PIA0_A 08) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) // Meter Sensor 5 (PIA0_A 10) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("CoinKey") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) + +INPUT_PORTS_END + + +static INPUT_PORTS_START( castawayt ) + + PORT_INCLUDE( glck6809 ) + + PORT_MODIFY("IN0-0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Accountancy Key") PORT_TOGGLE + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Reserve / Test Menu (Accountancy) / Back (Test Menu)") PORT_CODE(KEYCODE_8) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_GAMBLE_DOOR ) PORT_NAME("Door - Test Menu") PORT_TOGGLE + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN0-1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("hopper", ticket_dispenser_device, line_r) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Hopper Weight") PORT_CODE(KEYCODE_T) + + PORT_MODIFY("IN0-2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) PORT_NAME("Collect / Payout / Select (Test Menu)") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN0-3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("1 Coin Start / Up (Test Menu)") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("2 Coin Start / Down (Test Menu)") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("5 Coin Start") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("4 Coin Start") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("3 Coin Start") + +INPUT_PORTS_END + + +static INPUT_PORTS_START( jesterch ) + + PORT_INCLUDE( glck6809 ) + + PORT_MODIFY("IN0-0") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Reserve / Test Menu (Accountancy) / Back (Test Menu)") PORT_CODE(KEYCODE_8) + + PORT_MODIFY("IN0-1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL ) PORT_NAME("Spin / Deal / Play") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Hopper Out") PORT_CODE(KEYCODE_E) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Hopper Weight") PORT_CODE(KEYCODE_T) + + PORT_MODIFY("IN0-2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) PORT_NAME("Collect / Payout / Select (Test Menu)") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN0-3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("1 Coin Start / Up (Test Menu)") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("2 Coin Start / Down (Test Menu)") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("5 Coin Start") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("4 Coin Start") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("3 Coin Start") + + PORT_START("SENSB") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Coin Mech") PORT_CODE(KEYCODE_H) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Hopper Sensor") PORT_CODE(KEYCODE_J) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Cashbox Switch") PORT_CODE(KEYCODE_K) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) + +INPUT_PORTS_END + + +/********************************************* +* Graphics Layouts * +*********************************************/ + +static const gfx_layout tilelayout = +{ + 8, 8, + RGN_FRAC(1,3), + 3, + { 0, RGN_FRAC(1,3), RGN_FRAC(2,3) }, + { 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 +}; + + +/************************************************** +* Graphics Decode Information * +**************************************************/ + +static GFXDECODE_START( gfx_gi6809 ) + GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 16 ) + GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 16 ) +GFXDECODE_END + + +/********************************************* +* Machine Reset * +*********************************************/ + +void gi6809_state::machine_reset() +{ + m_ser_ptr = 0; +} + + +/********************************************* +* Machine Drivers * +*********************************************/ + +void gi6809_state::gi6809_base(machine_config &config) +{ + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + // video hardware + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(60); + m_screen->set_screen_update(FUNC(gi6809_state::screen_update_gi6809)); + + GFXDECODE(config, m_gfxdecode, "palette", gfx_gi6809); + PALETTE(config, "palette", FUNC(gi6809_state::gi6809_palette), 512); + + // sound hardware + SPEAKER(config, "mono").front_center(); + + TICKET_DISPENSER(config, m_hopper, attotime::from_msec(50), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH); +} + + +void gi6809_state::glck6809(machine_config &config) +{ + gi6809_base(config); + + MC6809E(config, m_maincpu, CPU_CLOCK_GL); + m_maincpu->set_addrmap(AS_PROGRAM, &gi6809_state::glckmain_map); + + MC6809E(config, m_slavecpu, CPU_CLOCK_GL); + m_slavecpu->set_addrmap(AS_PROGRAM, &gi6809_state::glckslave_map); + + mc6845_device &crtc(MC6845(config, "crtc", PIXEL_CLOCK)); + crtc.set_screen("screen"); + crtc.set_show_border_area(false); + crtc.set_char_width(8); + crtc.out_vsync_callback().set(FUNC(gi6809_state::crtc_vs_gl_w)); + + PIA6821(config, m_pia[0], 0); // controlled by slave + m_pia[0]->readpa_handler().set_ioport("PIA0_A"); + m_pia[0]->writepb_handler().set(FUNC(gi6809_state::lamps5_w)); + + PIA6821(config, m_pia[1], 0); // controlled by master + m_pia[1]->writepa_handler().set(FUNC(gi6809_state::snd_mux_w)); + m_pia[1]->readpb_handler().set(FUNC(gi6809_state::gi6809_mux_port_r)); + m_pia[1]->writepb_handler().set(FUNC(gi6809_state::lamps3_w)); + m_pia[1]->readcb1_handler().set(FUNC(gi6809_state::ret_vsync_r)); + m_pia[1]->irqb_handler().set_inputline(m_maincpu, M6809_IRQ_LINE); +} + + +void gi6809_state::castawayt(machine_config &config) +{ + gi6809_base(config); + + MC6809(config, m_maincpu, CPU_CLOCK); + m_maincpu->set_addrmap(AS_PROGRAM, &gi6809_state::castmain_map); + + MC6809(config, m_slavecpu, CPU_CLOCK); + m_slavecpu->set_addrmap(AS_PROGRAM, &gi6809_state::castslave_map); + + mc6845_device &crtc(MC6845(config, "crtc", PIXEL_CLOCK)); + crtc.set_screen("screen"); + crtc.set_show_border_area(false); + crtc.set_char_width(8); + crtc.out_vsync_callback().set(FUNC(gi6809_state::crtc_vs_ca_w)); + + PIA6821(config, m_pia[0], 0); // DDRA:00 (All In) - DDRB:FF (All Out) + m_pia[0]->readpa_handler().set_ioport("PIA0_A"); + m_pia[0]->writepb_handler().set(FUNC(gi6809_state::lamps8_w)); + m_pia[0]->readca1_handler().set(FUNC(gi6809_state::pia0_ca1_r)); + m_pia[0]->ca2_handler().set([](bool state) {}); + + PIA6821(config, m_pia[1], 0); // DDRA:FF (All Out) - DDRB:EO (OOOI-IIII) + m_pia[1]->writepa_handler().set(FUNC(gi6809_state::snd_mux_w)); + m_pia[1]->readpb_handler().set(FUNC(gi6809_state::cast_mux_port_r)); + m_pia[1]->writepb_handler().set(FUNC(gi6809_state::lamps3h_w)); + m_pia[1]->readcb1_handler().set(FUNC(gi6809_state::ret_vsync_r)); + m_pia[1]->cb2_handler().set([](bool state) {}); + m_pia[1]->irqa_handler().set_inputline(m_maincpu, M6809_FIRQ_LINE); + m_pia[1]->irqb_handler().set_inputline(m_maincpu, M6809_IRQ_LINE); +} + + +void gi6809_state::jesterch(machine_config &config) +{ + gi6809_base(config); + + MC6809E(config, m_maincpu, CPU_CLOCK/2); + m_maincpu->set_addrmap(AS_PROGRAM, &gi6809_state::jestmain_map); + + MC6809E(config, m_slavecpu, CPU_CLOCK/2); + m_slavecpu->set_addrmap(AS_PROGRAM, &gi6809_state::jestslave_map); + + mc6845_device &crtc(MC6845(config, "crtc", PIXEL_CLOCK)); + crtc.set_screen("screen"); + crtc.set_show_border_area(false); + crtc.set_char_width(8); + crtc.out_vsync_callback().set(FUNC(gi6809_state::crtc_vs_je_w)); + + PIA6821(config, m_pia[0], 0); // DDRA:00 (All In) - DDRB:1F (IIIO-OOOO) + m_pia[0]->readpa_handler().set_ioport("PIA0_A"); + m_pia[0]->writepb_handler().set(FUNC(gi6809_state::lamps5_w)); + m_pia[0]->irqa_handler().set_inputline(m_slavecpu, M6809_IRQ_LINE); + m_pia[0]->ca2_handler().set([](bool state) {}); + m_pia[0]->cb2_handler().set([](bool state) {}); + + PIA6821(config, m_pia[1], 0); // DDRA:FF (All Out) - DDRB:EO (OOOI-IIII) + m_pia[1]->writepa_handler().set(FUNC(gi6809_state::snd_mux_w)); + m_pia[1]->readpb_handler().set(FUNC(gi6809_state::cast_mux_port_r)); + m_pia[1]->writepb_handler().set(FUNC(gi6809_state::lamps3_w)); + m_pia[1]->ca2_handler().set([](bool state) {}); + m_pia[1]->cb2_handler().set([](bool state) {}); + m_pia[1]->irqb_handler().set_inputline(m_maincpu, M6809_IRQ_LINE); + m_pia[1]->irqa_handler().set_inputline(m_maincpu, M6809_FIRQ_LINE); +} + + +/********************************************* +* Rom Load * +*********************************************/ + +ROM_START( castawayt ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ca_5.bin", 0x8000, 0x8000, CRC(cd7aeb7c) SHA1(2d8ad18d2537db9684c0fd753e970ca6255eb1e5) ) + + ROM_REGION( 0x10000, "slavecpu", 0 ) + ROM_LOAD( "ca_6.bin", 0xe000, 0x2000, CRC(74ac5034) SHA1(2169be6a563938e87328dcadc05c4c06cc4fa45c) ) + + ROM_REGION( 0x3000, "gfx1", 0 ) + ROM_FILL( 0x0000, 0x2000, 0x0000 ) // filling the R-G bitplanes + ROM_LOAD( "ca_4.bin", 0x2000, 0x1000, CRC(1f76fc30) SHA1(7164f9de8ced1831c15eaef522272ee5acea80cc) ) + + ROM_REGION( 0x3000, "gfx2", 0 ) + ROM_LOAD( "ca_1.bin", 0x0000, 0x1000, CRC(61b05a25) SHA1(5a9cec1c8c4d5d94fe30cceec109b5d0d0fd3eca) ) + ROM_LOAD( "ca_2.bin", 0x1000, 0x1000, CRC(6e278ac0) SHA1(93b3b1c296c1c502db265fbbca6116f44ae92fa1) ) + ROM_LOAD( "ca_3.bin", 0x2000, 0x1000, CRC(8ccbf10c) SHA1(409498eb47437b36cead5ea38593a1bf87d7e4df) ) + + ROM_REGION( 0x0200, "proms", 0 ) + ROM_LOAD( "ca_bp.u35", 0x0000, 0x0100, CRC(9d9a0aae) SHA1(d2ccf8576164da34e2d9b7d1c5c76cba82bc012c) ) + ROM_LOAD( "ca_bp.u31", 0x0100, 0x0100, CRC(4d233808) SHA1(ac864bc5fe23e76786c78119b052eb68fa923ad4) ) +ROM_END + + +ROM_START( jesterch ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "27512.u8", 0x0000, 0x10000, CRC(64045d54) SHA1(6a48e868f854153dad2e28043ceeabf3e028cc6b) ) + + ROM_REGION( 0x10000, "slavecpu", 0 ) + ROM_LOAD( "2764.u52", 0xe000, 0x2000, CRC(a23cf64d) SHA1(8bcceb87a63e32812a354f064d81bdc5245cc8b9) ) + + ROM_REGION( 0x3000, "gfx1", 0 ) + ROM_FILL( 0x0000, 0x2000, 0x0000 ) // filling the R-G bitplanes + ROM_LOAD( "2732.u5", 0x2000, 0x1000, CRC(1f76fc30) SHA1(7164f9de8ced1831c15eaef522272ee5acea80cc) ) // same castawayt charset. + + ROM_REGION( 0x3000, "gfx2", 0 ) + ROM_LOAD( "2732.u2", 0x0000, 0x1000, CRC(e7243596) SHA1(120261604815b03cf230894828280c3a5b05bf2e) ) + ROM_LOAD( "2732.u3", 0x1000, 0x1000, CRC(f4dfea60) SHA1(c4708cae3f3ecb0daee8d917743eb6e91f0a1119) ) + ROM_LOAD( "2732.u4", 0x2000, 0x1000, CRC(fb8fb3c4) SHA1(de0b6c4d8ca40f6c548d199eb55e1135d317f954) ) + + ROM_REGION( 0x0200, "proms", 0 ) + ROM_LOAD( "jc_bp.u35", 0x0000, 0x0100, CRC(9d9a0aae) SHA1(d2ccf8576164da34e2d9b7d1c5c76cba82bc012c) ) + ROM_LOAD( "jc_bp.u31", 0x0100, 0x0100, CRC(4d233808) SHA1(ac864bc5fe23e76786c78119b052eb68fa923ad4) ) // from CA +ROM_END + + +ROM_START( glck6809 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "27c128.u8", 0xc000, 0x4000, CRC(867d84c2) SHA1(44c2f94559aa5d11b42363d0a9b2fb7612b945c3) ) + + ROM_REGION( 0x10000, "slavecpu", 0 ) + ROM_LOAD( "27c64.u52", 0xe000, 0x2000, CRC(90cebc12) SHA1(f913817f2a066d97fd369519a73a6cd18f7f9ea1) ) + + ROM_REGION( 0x3000, "gfx1", 0 ) + ROM_FILL( 0x0000, 0x2000, 0x0000 ) // filling the R-G bitplanes + ROM_LOAD( "2732.u5", 0x2000, 0x1000, CRC(d4ffe249) SHA1(22207a11d8f5c59a8719f0bca79effd13901f969) ) + + ROM_REGION( 0x3000, "gfx2", 0 ) + ROM_LOAD( "2732.u2", 0x0000, 0x1000, CRC(2fe35edd) SHA1(a92cd59b6471d249c54d5b94df781dfed7b1764d) ) + ROM_LOAD( "2732.u3", 0x1000, 0x1000, CRC(2deeb3d9) SHA1(2fdb7666ebff2b7caf52e5c81959066a3762235c) ) + ROM_LOAD( "2732.u4", 0x2000, 0x1000, CRC(0d3ac3d5) SHA1(57c6c4b0ae6099cdb7efe5b4b3a4cb31e7df8634) ) + + ROM_REGION( 0x0200, "proms", 0 ) + ROM_LOAD( "gl_bp.u35", 0x0000, 0x0100, CRC(e82e2364) SHA1(e71268e91248015c20d1359f866bf53bc355d181) ) + ROM_LOAD( "gl_bp.u31", 0x0100, 0x0100, CRC(dc4b003c) SHA1(09708d620c2f20028eae3b2c060dc30b649d2215) ) +ROM_END + + +/********************************************* +* Driver Init * +*********************************************/ + +void gi6809_state::init_cast() +{ + uint8_t *ROM = memregion("maincpu")->base(); + + ROM[0x9676] = 0x12; // fix hangs on Bonus Game - NOP 19Ch flag check 1/2 + ROM[0x9677] = 0x12; // fix hangs on Bonus Game - NOP 19Ch flag check 2/2 + ROM[0x837f] = 0x00; // fix checksum + + + uint8_t *ROM2 = memregion("slavecpu")->base(); + + ROM2[0xf529] = 0x05; // Max Bet - This value should come from non-existent NVRAM +} + +} // anonymous namespace + + +/********************************************* +* Game Drivers * +*********************************************/ + +// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS +GAME( 1987, castawayt, 0, castawayt, castawayt, gi6809_state, init_cast, ROT0, "Tranex Australia Pty Ltd.", "Cast Away (dual 6809 GI Australasia PCB)", MACHINE_NOT_WORKING ) +GAME( 1987, jesterch, 0, jesterch, jesterch, gi6809_state, empty_init, ROT0, "Tranex Australia Pty Ltd.", "Jester Chance (dual 6809 GI Australasia PCB)", MACHINE_NOT_WORKING ) +GAME( 198?, glck6809, 0, glck6809, glck6809, gi6809_state, empty_init, ROT0, "General Instrument?", "Good Luck! (dual 6809 GI Australasia PCB)", MACHINE_NOT_WORKING ) -- cgit v1.2.3