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]
This commit is contained in:
Roberto Fresca 2023-12-09 01:30:01 +01:00
parent bd015da72d
commit cc0eae6904
2 changed files with 907 additions and 0 deletions

View File

@ -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 //

902
src/mame/misc/gi6809.cpp Normal file
View File

@ -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<cpu_device> m_maincpu;
required_device<cpu_device> m_slavecpu;
required_device_array<pia6821_device, 2> m_pia;
required_device<screen_device> m_screen;
required_device<gfxdecode_device> m_gfxdecode;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_colorram;
required_ioport_array<4> m_input;
required_device<ticket_dispenser_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 )