summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/kas89.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/kas89.cpp')
-rw-r--r--src/mame/drivers/kas89.cpp872
1 files changed, 0 insertions, 872 deletions
diff --git a/src/mame/drivers/kas89.cpp b/src/mame/drivers/kas89.cpp
deleted file mode 100644
index 440568b8ac1..00000000000
--- a/src/mame/drivers/kas89.cpp
+++ /dev/null
@@ -1,872 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Roberto Fresca
-// thanks-to:Iris Falbala,Rob Ragon
-/*************************************************************************************
-
- /\/\<< Kasino '89 >>/\/\
-
- 6-players electronic roulette.
- Video field + physical LEDs roulette.
-
- Driver by Roberto Fresca.
-
-
- Running in this hardware:
-
- Kasino '89, SFC SRL, 1989.
- Osel '93, SFC SRL, 1993.
-
-
- Special thanks to Rob Ragon and Tomasz Slanina for their invaluable help.
- Also big thanks to Iris Falbala and Sofia Kiara for the beta-testing stage.
-
- For better results, use the associated artwork. Will allow you to see
- the roulette with all the working LEDs and lamps...
-
-
-**************************************************************************************
-
- Hardware specs:
-
- Seems to be a MSX2 system on steroids...
-
- 1x Potted CPU box (1x Z80 @ 3.578 MHz. + encrypted program ROM inside).
- 1x Z80 (audio) @ 3.578 MHz.
- AY-3-8910 @ 1789 kHz.
-
- 1x Unknown metallic brick (Yamaha MSX2 VDP inside).
-
- 1x 8 DIP switches bank.
-
- 1x Xtal: 21.477 MHz.
-
- 1x Plastic roulette with 37 LEDs
-
-
- NOTES:
-
- - Addressing and data lines are fully scrambled inside the epoxy CPU box.
- Also there are PLDs connected between them.
-
- - Another board has both Z80's running at 3.336 MHz., but we strongly think
- that they tied a 20MHz crystal due to lack of 21.477MHz ones stock.
-
- - You can see the scrambling stuff inside the CPU box through a X-RAY picture,
- and other reverse-engineering steps here: http://www.robertofresca.com/
-
-
-**************************************************************************************
-
- Tech Notes...
-
- - NMI of main Z80 is connected to a 138Hz. oscillator AND bit6 of port $82.
- That means NMI should be triggered each 138Hz. *only* if bit6 of port $82
- remains active.
-
- - NMI of second Z80 is connected directly to a 138Hz. oscillator.
-
- - INT of second Z80 is coming from 2 places:
- The HOLD/ASSERT (flanco descendente) is done by the main Z80 through IO port &85,
- and the CLEAR part (flanco ascendente) is autogenerated using the IO port $00.
-
- - The AY-8910 is clocked 1789 kHz, and has nothing connected at simple sight.
-
-
-**************************************************************************************
-
- Roulette's LEDs Support.
- -----------------------
-
- Ports $83/$84 handle the roulette's LEDs in a multiplexed way...
- Port $84 is the selector, while port $83 carry the LEDs set.
-
- Checks:
-
- 00: OK 40-02 10: OK 08-10 20: OK 10-08 30: OK 40-10
- 01: OK 20-08 11: OK 01-01 21: OK 02-02 31: OK 04-08
- 02: OK 01-02 12: OK 04-04 22: OK 01-08 32: OK 20-02
- 03: OK 01-04 13: OK 04-01 23: OK 10-10 33: OK 40-08
- 04: OK 04-02 14: OK 08-08 24: OK 02-10 34: OK 20-01
- 05: OK 04-10 15: OK 10-02 25: OK 80-01 35: OK 02-04
- 06: OK 10-01 16: OK 01-10 26: OK 80-02 36: OK 02-01
- 07: OK 10-04 17: OK 40-01 27: OK 08-01
- 08: OK 20-10 18: OK 40-04 28: OK 08-04
- 09: OK 02-08 19: OK 08-02 29: OK 20-04
-
- .------------------++----+----+----+----+----+----+----+----.
- | Set \ Writes... || 80 | 40 | 20 | 10 | 08 | 04 | 02 | 01 |
- +------------------++----+----+----+----+----+----+----+----+
- +------------------++----+----+----+----+----+----+----+----+
- | Set 01 numbers || 25 | 17 | 34 | 06 | 27 | 13 | 36 | 11 |
- +------------------++----+----+----+----+----+----+----+----+
- | Set 02 numbers || 26 | 00 | 32 | 15 | 19 | 04 | 21 | 02 |
- +------------------++----+----+----+----+----+----+----+----+
- | Set 04 numbers || -- | 18 | 29 | 07 | 28 | 12 | 35 | 03 |
- +------------------++----+----+----+----+----+----+----+----+
- | Set 08 numbers || -- | 33 | 01 | 20 | 14 | 31 | 09 | 22 |
- +------------------++----+----+----+----+----+----+----+----+
- | Set 10 numbers || -- | 30 | 08 | 23 | 10 | 05 | 24 | 16 |
- '------------------++----+----+----+----+----+----+----+----'
-
-
-**************************************************************************************
-
- Inputs...
-
- Scanned BUS:
- .-.
- | |-D0--- BET Button.
- | |-D1--- DOWN Button.
- | |-D2--- RIGHT Button.
- | |-D3--- LEFT Button.
- | |-D4--- UP Button.
- | |-D5--- OUT Credits.
- | |-D6--- IN Credits.
- | |-D7--- Audit/Test.
- '-'
-
- Whilst in Audit/Test mode, pressing the ADVANCE button, you can enter into
- screen and inputs test mode.
-
- This ADVANCE button, is routed into a latch with D0, sharing with BET button.
-
-
-**************************************************************************************
-
- Game Notes:
- -----------
-
- You have 3 controls for operators.
- The Operator/Habilitation Key, the Audit/Test Mode switch and the Advance button.
-
- To enter the game, you should turn the Audit/Test switch ON, then OFF, otherwise
- a louder and annoying alarm will warn you about.
-
- Once in game, you need to turn ON the Operator/Habilitation Key to allow credit IN
- and OUT all 6 players. If the key is OFF, the IN/OUT credit system will not work,
- getting the game only in attract mode.
-
-
- * Audit/Test Mode
-
- There are 2 controls inside the cab:
- 1x Audit/Test Switch.
- 1x Avance Pantalla (Advance) button.
-
- In the disclaimer, turn the Audit/Test Switch ON.
- You can see a screen with all the bookkeepings.
-
- While in Audit mode, you need to press the ADVANCE button to enter the first test.
-
- Black screen. All roulette LEDs ON.
-
- then...
-
- White screen. Test all sequenced LEDs in both ways, when pressing the CREDIT IN/OUT
- buttons. You need the Habilitation key ON to do this test.
-
- Press ADVANCE again, and you'll see the color palette screen.
-
- Press ADVANCE again, and you'll see the grid pattern screen.
-
- Press ADVANCE again, and you'll enter the input test mode. All control buttons from
- each player, including Credits IN/OUT will be shown here.
-
- Press ADVANCE again, and you'll arrive to the Audit screen again.
-
- To exit the Audit/Test mode, turn OFF the Audit/Test switch. you'll enter the game.
-
-
-**************************************************************************************
-
- TODO:
-
- - Check why some sound events are louder than others (volume balance?).
- - Fix NVRAM.
- - PCB layout.
-
-
-*************************************************************************************/
-
-
-#include "emu.h"
-#include "cpu/z80/z80.h"
-#include "machine/gen_latch.h"
-#include "machine/nvram.h"
-#include "machine/timer.h"
-#include "sound/ay8910.h"
-#include "video/v9938.h"
-#include "speaker.h"
-
-#include "kas89.lh"
-
-
-#define MASTER_CLOCK XTAL(21'477'272)
-#define VDP_MEM 0x40000
-
-
-class kas89_state : public driver_device
-{
-public:
- kas89_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_audiocpu(*this, "audiocpu"),
- m_soundlatch(*this, "soundlatch"),
- m_pl(*this, "PL%u", 1),
- m_svc(*this, "SVC"),
- m_dsw(*this, "DSW"),
- m_unk(*this, "UNK"),
- m_lamps(*this, "lamp%u", 0U)
- { }
-
- void kas89(machine_config &config);
-
- void init_kas89();
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
-private:
- void mux_w(uint8_t data);
- uint8_t mux_r();
- void control_w(uint8_t data);
- void sound_comm_w(uint8_t data);
- void int_ack_w(uint8_t data);
- void led_mux_data_w(uint8_t data);
- void led_mux_select_w(uint8_t data);
- TIMER_DEVICE_CALLBACK_MEMBER(nmi_cb);
- TIMER_DEVICE_CALLBACK_MEMBER(sound_nmi_cb);
- void audio_io(address_map &map);
- void audio_map(address_map &map);
- void kas89_io(address_map &map);
- void kas89_map(address_map &map);
-
- uint8_t m_mux_data;
- uint8_t m_main_nmi_enable;
-
- uint8_t m_leds_mux_selector;
- uint8_t m_leds_mux_data;
- uint8_t m_outdata; // Muxed with the sound latch. Output to a sign?
-
- required_device<cpu_device> m_maincpu;
- required_device<cpu_device> m_audiocpu;
- required_device<generic_latch_8_device> m_soundlatch;
- required_ioport_array<6> m_pl;
- required_ioport m_svc;
- required_ioport m_dsw;
- required_ioport m_unk;
- output_finder<38> m_lamps;
-};
-
-
-/*************************************
-* Machine Start & Reset *
-*************************************/
-
-void kas89_state::machine_start()
-{
- m_lamps.resolve();
- m_lamps[37] = 0; // turning off the operator led
-
- save_item(NAME(m_mux_data));
- save_item(NAME(m_main_nmi_enable));
- save_item(NAME(m_leds_mux_selector));
- save_item(NAME(m_leds_mux_data));
- save_item(NAME(m_outdata));
-}
-
-void kas89_state::machine_reset()
-{
- m_main_nmi_enable = 0;
-}
-
-
-/****************************************
-* Input Ports Demux & Common Routines *
-****************************************/
-
-void kas89_state::mux_w(uint8_t data)
-{
-/* - bits -
- 7654 3210
- xxxx xxxx Input selector.
-
- Writes: 1-2-4-8-10-20-40-3f. Only 80 (for DSW) at very beginning...
-*/
-
- m_mux_data = data;
-}
-
-uint8_t kas89_state::mux_r()
-{
- switch(m_mux_data)
- {
- case 0x01: return m_pl[0]->read();
- case 0x02: return m_pl[1]->read();
- case 0x04: return m_pl[2]->read();
- case 0x08: return m_pl[3]->read();
- case 0x10: return m_pl[4]->read();
- case 0x20: return m_pl[5]->read();
- case 0x40:
- {
- m_lamps[37] = BIT(~m_svc->read(), 5); // Operator Key LAMP
- return m_svc->read();
- }
- case 0x80: return m_dsw->read(); // Polled at $162a through NMI routine
- case 0x3f: return m_unk->read();
- }
-
- logerror("Mux_data %02X\n", m_mux_data);
- return m_mux_data;
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(kas89_state::nmi_cb)
-{
- if (m_main_nmi_enable)
- m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(kas89_state::sound_nmi_cb)
-{
- m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
-}
-
-
-void kas89_state::control_w(uint8_t data)
-{
-/* - bits -
- 7654 3210
- ---- ---x Credits In counter (x10). Active low.
- ---- --x- Credits Out counter (x1). Active low.
- ---- -x-- Unknown. Active low.
- -x-- ---- NMI enable. Active high.
- x-xx x--- Unused.
-*/
-
- m_main_nmi_enable = data & 0x40;
-
- machine().bookkeeping().coin_counter_w(0, (data ^ 0xff) & 0x01); // Credits In counter
- machine().bookkeeping().coin_counter_w(1, (data ^ 0xff) & 0x02); // Credits Out counter
-}
-
-void kas89_state::sound_comm_w(uint8_t data)
-{
-/* This port is used mainly for sound latch, but bit6 activates a
- sort of output port (maybe for a sign?)
-
- bit6 = 0 ; sound latch.
- bit6 = 1 ; outport data.
-
- Once the ball is landed, the outport writes the winner number
- 14 times (as an intermittent way).
-
- When the attract starts, just before the game title appear, $3f
- is written to the outport... (maybe to clear the possible sign).
-
-*/
-
-
- if (data & 0x40)
- {
- m_outdata = (data ^ 0x40); // Pure data. Without the activator bit
-
- if (m_outdata == 0x3f)
- {
- uint8_t i;
- for ( i = 0; i < 37; i++ )
- {
- m_lamps[i] = 0; // All roulette LEDs OFF
- }
- }
-
- logerror("Outdata: Write %02x\n", m_outdata);
- }
-
- else
- {
- m_soundlatch->write(data);
- m_audiocpu->set_input_line(0, ASSERT_LINE);
- }
-}
-
-void kas89_state::int_ack_w(uint8_t data)
-{
- m_audiocpu->set_input_line(0, CLEAR_LINE);
-}
-
-
-/****************************************
-* Output Ports Demux & LEDs Support *
-****************************************/
-
-void kas89_state::led_mux_data_w(uint8_t data)
-{
-/* - bits -
- 7654 3210
- xxxx xxxx LEDs data.
-*/
-
- m_leds_mux_data = data;
-}
-
-void kas89_state::led_mux_select_w(uint8_t data)
-{
-/* - bits -
- 7654 3210
- ---x xxxx LEDs Set selector.
-*/
-
- m_leds_mux_selector = data;
-
- uint8_t i;
- for ( uint8_t i = 0; i < 37; i++ )
- {
- m_lamps[i] = 0; // All LEDs OFF
- }
-
- switch(data)
- {
- case 0x00:
- {
- for ( i = 0; i < 37; i++ )
- {
- m_lamps[i] = 0; // All LEDs OFF
- }
- }
-
- case 0x01:
- {
- m_lamps[11] = BIT(m_leds_mux_data, 0); // Number 11 LED
- m_lamps[36] = BIT(m_leds_mux_data, 1); // Number 36 LED
- m_lamps[13] = BIT(m_leds_mux_data, 2); // Number 13 LED
- m_lamps[27] = BIT(m_leds_mux_data, 3); // Number 27 LED
- m_lamps[06] = BIT(m_leds_mux_data, 4); // Number 6 LED
- m_lamps[34] = BIT(m_leds_mux_data, 5); // Number 34 LED
- m_lamps[17] = BIT(m_leds_mux_data, 6); // Number 17 LED
- m_lamps[25] = BIT(m_leds_mux_data, 7); // Number 25 LED
- break;
- }
-
- case 0x02:
- {
- m_lamps[ 2] = BIT(m_leds_mux_data, 0); // Number 2 LED
- m_lamps[21] = BIT(m_leds_mux_data, 1); // Number 21 LED
- m_lamps[ 4] = BIT(m_leds_mux_data, 2); // Number 4 LED
- m_lamps[19] = BIT(m_leds_mux_data, 3); // Number 19 LED
- m_lamps[15] = BIT(m_leds_mux_data, 4); // Number 15 LED
- m_lamps[32] = BIT(m_leds_mux_data, 5); // Number 32 LED
- m_lamps[ 0] = BIT(m_leds_mux_data, 6); // Number 0 LED
- m_lamps[26] = BIT(m_leds_mux_data, 7); // Number 26 LED
- break;
- }
-
- case 0x04:
- {
- m_lamps[ 3] = BIT(m_leds_mux_data, 0); // Number 3 LED
- m_lamps[35] = BIT(m_leds_mux_data, 1); // Number 35 LED
- m_lamps[12] = BIT(m_leds_mux_data, 2); // Number 12 LED
- m_lamps[28] = BIT(m_leds_mux_data, 3); // Number 28 LED
- m_lamps[ 7] = BIT(m_leds_mux_data, 4); // Number 7 LED
- m_lamps[29] = BIT(m_leds_mux_data, 5); // Number 29 LED
- m_lamps[18] = BIT(m_leds_mux_data, 6); // Number 18 LED
- break;
- }
-
- case 0x08:
- {
- m_lamps[22] = BIT(m_leds_mux_data, 0); // Number 22 LED
- m_lamps[ 9] = BIT(m_leds_mux_data, 1); // Number 9 LED
- m_lamps[31] = BIT(m_leds_mux_data, 2); // Number 31 LED
- m_lamps[14] = BIT(m_leds_mux_data, 3); // Number 14 LED
- m_lamps[20] = BIT(m_leds_mux_data, 4); // Number 20 LED
- m_lamps[ 1] = BIT(m_leds_mux_data, 5); // Number 1 LED
- m_lamps[33] = BIT(m_leds_mux_data, 6); // Number 33 LED
- break;
- }
-
- case 0x10:
- {
- m_lamps[16] = BIT(m_leds_mux_data, 0); // Number 16 LED
- m_lamps[24] = BIT(m_leds_mux_data, 1); // Number 24 LED
- m_lamps[ 5] = BIT(m_leds_mux_data, 2); // Number 5 LED
- m_lamps[10] = BIT(m_leds_mux_data, 3); // Number 10 LED
- m_lamps[23] = BIT(m_leds_mux_data, 4); // Number 23 LED
- m_lamps[ 8] = BIT(m_leds_mux_data, 5); // Number 8 LED
- m_lamps[30] = BIT(m_leds_mux_data, 6); // Number 30 LED
- break;
- }
-
- case 0xff:
- {
- for ( i = 0; i < 37; i++ )
- {
- m_lamps[i] = 1; // All LEDs ON
- }
- }
- }
-}
-
-
-/**************************************
-* Memory Map *
-**************************************/
-
-void kas89_state::kas89_map(address_map &map)
-{
- map(0x0000, 0x7fff).rom();
- map(0x0037, 0x0037).nopw(); // WTF?
- map(0x8000, 0x81ff).ram(); // empty
- map(0x8200, 0x83ff).ram(); // 8200-83ff (PL1)
- map(0x8400, 0x85ff).ram(); // 8400-85ff (PL2)
- map(0x8600, 0x87ff).ram(); // 8600-87ff (PL3)
- map(0x8800, 0x89ff).ram(); // 8800-89ff (PL4)
- map(0x8a00, 0x8bff).ram(); // 8a00-8bff (PL5)
- map(0x8c00, 0x8dff).ram(); // 8c00-8dff (PL6)
- map(0x8e00, 0x8fff).ram(); // empty
- map(0x9000, 0x97ff).ram();
- map(0x9800, 0x9fff).ram().share("nvram");
-}
-
-void kas89_state::kas89_io(address_map &map)
-{
- map.global_mask(0xff);
- map(0x40, 0x43).rw("v9938", FUNC(v9938_device::read), FUNC(v9938_device::write));
- map(0x80, 0x80).w(FUNC(kas89_state::mux_w));
- map(0x81, 0x81).r(FUNC(kas89_state::mux_r));
- map(0x82, 0x82).w(FUNC(kas89_state::control_w)); // Bit6 trigger the 138Hz osc. tied to main Z80's NMI.
- map(0x83, 0x83).w(FUNC(kas89_state::led_mux_data_w));
- map(0x84, 0x84).w(FUNC(kas89_state::led_mux_select_w));
- map(0x85, 0x85).w(FUNC(kas89_state::sound_comm_w));
-}
-
-/*
- 900d --- (RAM) NMI stores the read from / write to port $82
-
- Write to $82 -> 07 ; Disable main CPU NMI
- Write to $82 -> 47 ; Enable main CPU NMI
- Write to $83 -> 02 ; LEDs data
- Write to $84 -> 01 ; LEDs selector
- Write to $85 -> 64 ; Write winner number (+ bit6 active)
- Write to $85 -> 04 ; Write to audio CPU.
- Write to $82 -> 07 ; Disable main CPU NMI
-
- Write to $82 -> 07 ; Disable main CPU NMI
- Write to $82 -> 47 ; Enable main CPU NMI
- Write to $83 -> 00 ; LEDs data
- Write to $84 -> 00 ; LEDs selector
- Write to $85 -> 64 ; Write winner number (+ bit6 active)
- Write to $85 -> 03 ; Write to audio CPU.
- Write to $82 -> 07 ; Disable main CPU NMI
-
- NMI enable/disable:
-
- 4a88 : push af
- 4a89 : ld a,($900d)
- 4a8c : set 6,a
- 4a8e : ld ($900d),a
- 4a91 : out ($82),a
- 4a93 : pop af
- 4a94 : ret
-
- 4a95 : push af
- 4a96 : ld a,($900d)
- 4a99 : res 6,a
- 4a9b : ld ($900d),a
- 4a9e : out ($82),a
- 4aa0 : pop af
- 4aa1 : ret
-*/
-
-void kas89_state::audio_map(address_map &map)
-{
- map(0x0000, 0x0fff).rom();
- map(0xc000, 0xc7ff).ram();
-}
-
-void kas89_state::audio_io(address_map &map)
-{
- map.global_mask(0xff);
- map(0x00, 0x00).w(FUNC(kas89_state::int_ack_w)); // comm out (1st Z80). seems to write here the value previously read through soundlatch (port 0x02).
- map(0x02, 0x02).r(m_soundlatch, FUNC(generic_latch_8_device::read));
- map(0x04, 0x04).r("aysnd", FUNC(ay8910_device::data_r));
- map(0x04, 0x05).w("aysnd", FUNC(ay8910_device::data_address_w));
-}
-
-
-/**************************************
-* Input Ports *
-**************************************/
-
-static INPUT_PORTS_START( kas89 )
-
- PORT_START("PL1")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_LCONTROL) PORT_NAME("Player 1 - Bet")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Player 1 - Down")
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Player 1 - Left")
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Player 1 - Right")
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_UP) PORT_NAME("Player 1 - Up")
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_NAME("Player 1 - Credits OUT")
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_1) PORT_NAME("Player 1 - Credits IN")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_LALT) PORT_NAME("Player 1 - Unknown")
-
- PORT_START("PL2")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Player 2 - Bet")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Player 2 - Down")
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Player 2 - Left")
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Player 2 - Right")
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Player 2 - Up")
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X) PORT_NAME("Player 2 - Credits OUT")
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_2) PORT_NAME("Player 2 - Credits IN")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Player 2 - Unknown")
-
- PORT_START("PL3")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Q) PORT_NAME("Player 3 - Bet")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_S) PORT_NAME("Player 3 - Down")
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_A) PORT_NAME("Player 3 - Left")
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_D) PORT_NAME("Player 3 - Right")
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_W) PORT_NAME("Player 3 - Up")
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_C) PORT_NAME("Player 3 - Credits OUT")
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_3) PORT_NAME("Player 3 - Credits IN")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_E) PORT_NAME("Player 3 - Unknown")
-
- PORT_START("PL4")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_R) PORT_NAME("Player 4 - Bet")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_T) PORT_NAME("Player 4 - Up")
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_H) PORT_NAME("Player 4 - Right")
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_F) PORT_NAME("Player 4 - Left")
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_G) PORT_NAME("Player 4 - Down")
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_V) PORT_NAME("Player 4 - Credits OUT")
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_4) PORT_NAME("Player 4 - Credits IN")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Y) PORT_NAME("Player 4 - Unknown")
-
- PORT_START("PL5")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_U) PORT_NAME("Player 5 - Bet")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_I) PORT_NAME("Player 5 - Up")
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_L) PORT_NAME("Player 5 - Right")
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_J) PORT_NAME("Player 5 - Left")
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_K) PORT_NAME("Player 5 - Down")
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_B) PORT_NAME("Player 5 - Credits OUT")
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_5) PORT_NAME("Player 5 - Credits IN")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_O) PORT_NAME("Player 5 - Unknown")
-
- PORT_START("PL6")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Player 6 - Bet")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_HOME) PORT_NAME("Player 6 - Up")
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Player 6 - Right")
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Player 6 - Left")
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_END) PORT_NAME("Player 6 - Down")
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_N) PORT_NAME("Player 6 - Credits OUT")
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_6) PORT_NAME("Player 6 - Credits IN")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Player 6 - Unknown")
-
- PORT_START("SVC")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_0) PORT_NAME("Avance Pantalla (Advance)")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Blank the screen. Disclaimer isn't shown.
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Otherwise hang the game when insert credits.
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_8) PORT_TOGGLE PORT_NAME("Operator/Habilitation Key")
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_9) PORT_TOGGLE PORT_NAME("Audit/Test Mode Switch")
-
-
- PORT_START("DSW")
-/*
- .-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----.
- | DIP Switches | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Translation
- +-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ -----------
- +-------------------------------+-----+-----+-----------------------------------+ [Game Mode]
- | Modo de Juego Facil | OFF | OFF | | Easy
- | Normal | ON | OFF | | Normal
- | Dura | OFF | ON | | Hard
- | Muy Dura | ON | ON | | Very Hard
- +-------------------------------+-----+-----+-----+-----+-----------------------+ [Heart Appearance]
- | Aparicion No | | OFF | OFF | | No
- | del Poco | | ON | OFF | | Few
- | Corazon (n/c) | | OFF | ON | | n/c
- | Mucho | | ON | ON | | Often
- +-------------------------------+-----------+-----+-----+-----+-----------------+ [RAM Clear]
- | Borrado de RAM No | | OFF | | No
- | Si | | ON | | Yes
- +-------------------------------+-----------------------+-----+-----+-----------+ [Leveling]
- | Nivelacion Creditos IN/OUT| | OFF | | Credits IN/OUT
- | Pagos/Apuestas | | ON | | Payments/Bets
- +-------------------------------+-----------------------------+-----+-----+-----+ [Jackpot Limit]
- | Limite del Pozo Alto | | OFF | OFF | High
- | Normal | | ON | OFF | Normal
- | Bajo | | OFF | ON | Low
- | Muy Bajo | | ON | ON | Very Low
- '-------------------------------+-----------------------------------+-----+-----'
-
- .------------------------+---+---+---+---+---+---+---+---.
- | Suggested DIP Switches | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
- +------------------------+---+---+---+---+---+---+---+---+
- | ON | * | | | | | | * | |
- +------------------------+---+---+---+---+---+---+---+---+
- | OFF | | * | * | * | * | * | | * |
- '------------------------+---+---+---+---+---+---+---+---'
-
- DSW Routing...
-
- BIT0 = DSW1-3
- BIT1 = DSW1-6
- BIT2 = DSW1-5
- BIT3 = DSW1-1
- BIT4 = DSW1-8
- BIT5 = DSW1-4
- BIT6 = DSW1-7
- BIT7 = DSW1-2
-
-*/
- PORT_DIPNAME( 0x88, 0x80, "Modo de Juego (Game Mode)" ) PORT_DIPLOCATION("DSW1:1,2")
- PORT_DIPSETTING( 0x88, "Facil (easy)" )
- PORT_DIPSETTING( 0x80, "Normal (Normal)" )
- PORT_DIPSETTING( 0x08, "Dura (Hard)" )
- PORT_DIPSETTING( 0x00, "Muy Dura (Very Hard)" )
-
- PORT_DIPNAME( 0x21, 0x21, "Aparicion del Corazon (Heart Appearance)" ) PORT_DIPLOCATION("DSW1:3,4")
- PORT_DIPSETTING( 0x01, "n/c" )
- PORT_DIPSETTING( 0x21, "No (No)" )
- PORT_DIPSETTING( 0x20, "Poco (Few)" )
- PORT_DIPSETTING( 0x00, "Mucho (Often)" )
-
- PORT_DIPNAME( 0x04, 0x04, "Borrado de RAM (RAM Clear)" ) PORT_DIPLOCATION("DSW1:5")
- PORT_DIPSETTING( 0x04, DEF_STR( No ) )
- PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
-
- PORT_DIPNAME( 0x02, 0x02, "Nivelacion (Leveling)" ) PORT_DIPLOCATION("DSW1:6")
- PORT_DIPSETTING( 0x02, "Creditos IN/OUT (Credits IN/OUT)" )
- PORT_DIPSETTING( 0x00, "Pagos/Apuestas (Payments/Bets)" )
-
- PORT_DIPNAME( 0x50, 0x10, "Limite del Pozo (Jackpot Limit)" ) PORT_DIPLOCATION("DSW1:8,7")
- PORT_DIPSETTING( 0x00, "Muy Bajo (Very Low)" )
- PORT_DIPSETTING( 0x40, "Bajo (Low)" )
- PORT_DIPSETTING( 0x10, "Normal (Normal)" )
- PORT_DIPSETTING( 0x50, "Alto (High)" )
-
-
- PORT_START("UNK") // Unknown input set
- 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_UNKNOWN )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Should be active for Audit/Test Mode, also for boot...
-
-INPUT_PORTS_END
-
-
-/**************************************
-* Machine Driver *
-**************************************/
-
-void kas89_state::kas89(machine_config &config)
-{
- // basic machine hardware
- Z80(config, m_maincpu, MASTER_CLOCK/6); // Confirmed
- m_maincpu->set_addrmap(AS_PROGRAM, &kas89_state::kas89_map);
- m_maincpu->set_addrmap(AS_IO, &kas89_state::kas89_io);
- TIMER(config, "kas89_nmi").configure_periodic(FUNC(kas89_state::nmi_cb), attotime::from_hz(138));
-
- Z80(config, m_audiocpu, MASTER_CLOCK/6); // Confirmed
- m_audiocpu->set_addrmap(AS_PROGRAM, &kas89_state::audio_map);
- m_audiocpu->set_addrmap(AS_IO, &kas89_state::audio_io);
- TIMER(config, "kas89_snmi").configure_periodic(FUNC(kas89_state::sound_nmi_cb), attotime::from_hz(138));
-
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-
- // video hardware
- v9938_device &v9938(V9938(config, "v9938", MASTER_CLOCK));
- v9938.set_screen_ntsc("screen");
- v9938.set_vram_size(VDP_MEM);
- v9938.int_cb().set_inputline("maincpu", 0);
- SCREEN(config, "screen", SCREEN_TYPE_RASTER);
-
- // sound hardware
- SPEAKER(config, "mono").front_center();
-
- GENERIC_LATCH_8(config, m_soundlatch);
-
- AY8910(config, "aysnd", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 1.0); // Confirmed
-}
-
-
-/**************************************
-* ROM Load *
-**************************************/
-
-ROM_START( kas89 )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "k89_original_program.bin", 0x0000, 0x8000, CRC(a02b3063) SHA1(f6b05f7c99da2c6719c21687521f841d357d0eb4) )
-
- ROM_REGION( 0x10000, "audiocpu", 0 )
- ROM_LOAD( "k89_27256_son_2a58.bin", 0x0000, 0x8000, CRC(26636631) SHA1(95fad6a047bb9145d679841aa3ab4d013895b1f7) )
-ROM_END
-
-
-/**************************************
-* Driver Init *
-**************************************/
-
-/* This reflect how was connected the bus to the EPROM
- inside the epoxy CPU block. They used ultra-thin wires,
- just to melt down with the epoxy in case someone try to
- use a heat gun for epoxy removal purposes...
-
- Bus / Eprom
-
- D0-> D5
- D1-> D6
- D2-> D0
- D3-> D7
- D4-> D2
- D5-> D4
- D6-> D3
- D7-> D1
-
- A00-> A10
- A01-> A08
- A02-> A01
- A03-> A11
- A04-> A05
- A05-> A13
- A06-> A12
- A07-> A04
- A08-> A02
- A09-> A07
- A10-> A03
- A11-> A00
- A12-> A09
- A13-> A06
- A14-> A14
-*/
-void kas89_state::init_kas89()
-{
- uint8_t *mem = memregion("maincpu")->base();
- int memsize = memregion("maincpu")->bytes();
- std::vector<uint8_t> buf;
-
- // Unscrambling data lines
- for (int i = 0; i < memsize; i++)
- {
- buf.push_back(bitswap<8>(mem[i], 3, 1, 0, 5, 6, 4, 7, 2));
- }
-
- // Unscrambling address lines
- for (int i = 0; i < memsize; i++)
- {
- mem[bitswap<16>(i, 15, 14, 5, 6, 3, 0, 12, 1, 9, 13, 4, 7, 10, 8, 2, 11)] = buf[i];
- }
-}
-
-
-/**************************************
-* Game Driver(s) *
-**************************************/
-
-// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS LAYOUT
-GAMEL( 1989, kas89, 0, kas89, kas89, kas89_state, init_kas89, ROT90, "SFC S.R.L.", "Kasino '89", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_kas89 )