mirror of
https://github.com/holub/mame
synced 2025-04-19 15:11:37 +03:00
hankin.cpp: WIP.
This commit is contained in:
parent
15f8b0f209
commit
5d1a567164
@ -2,16 +2,18 @@
|
||||
// copyright-holders:Robbbert
|
||||
/**********************************************************************************
|
||||
|
||||
PINBALL
|
||||
Hankin
|
||||
Based on Bally BY35
|
||||
Sound based on Atari System 1
|
||||
PINBALL
|
||||
Hankin
|
||||
Based on Bally BY35
|
||||
Sound based on Atari System 1
|
||||
|
||||
|
||||
Status:
|
||||
- All games are working
|
||||
|
||||
ToDo:
|
||||
- High score isn't saved or remembered
|
||||
- Sound needs to be verified with original
|
||||
- Mechanical
|
||||
- Lamp outputs
|
||||
|
||||
|
||||
***********************************************************************************/
|
||||
|
||||
@ -20,6 +22,8 @@ ToDo:
|
||||
|
||||
#include "cpu/m6800/m6800.h"
|
||||
#include "machine/6821pia.h"
|
||||
#include "machine/clock.h"
|
||||
#include "machine/input_merger.h"
|
||||
#include "machine/timer.h"
|
||||
#include "sound/dac.h"
|
||||
#include "speaker.h"
|
||||
@ -43,7 +47,8 @@ public:
|
||||
, m_dac(*this, "dac")
|
||||
, m_io_test(*this, "TEST")
|
||||
, m_io_x(*this, { "X0", "X1", "X2", "X3", "X4", "DSW0", "DSW1", "DSW2" })
|
||||
, m_display(*this, "digit%u%u", 0U, 0U)
|
||||
, m_digits(*this, "digit%u%u", 0U, 0U)
|
||||
, m_io_outputs(*this, "out%d", 0U)
|
||||
{ }
|
||||
|
||||
DECLARE_INPUT_CHANGED_MEMBER(self_test);
|
||||
@ -60,37 +65,37 @@ private:
|
||||
DECLARE_WRITE_LINE_MEMBER(ic11_cb2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(ic2_ca2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(ic2_cb2_w);
|
||||
void ic10_a_w(uint8_t data);
|
||||
void ic10_b_w(uint8_t data);
|
||||
void ic11_a_w(uint8_t data);
|
||||
void ic2_b_w(uint8_t data);
|
||||
void ic2_a_w(uint8_t data);
|
||||
uint8_t ic11_b_r();
|
||||
uint8_t ic2_a_r();
|
||||
DECLARE_WRITE_LINE_MEMBER(clock_w);
|
||||
void ic10_a_w(u8 data);
|
||||
void ic10_b_w(u8 data);
|
||||
void ic11_a_w(u8 data);
|
||||
void ic2_b_w(u8 data);
|
||||
void ic2_a_w(u8 data);
|
||||
u8 ic11_b_r();
|
||||
u8 ic2_a_r();
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(timer_s);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(timer_x);
|
||||
|
||||
void hankin_map(address_map &map);
|
||||
void hankin_sub_map(address_map &map);
|
||||
void main_map(address_map &map);
|
||||
void audio_map(address_map &map);
|
||||
|
||||
bool m_timer_x;
|
||||
bool m_timer_sb;
|
||||
uint8_t m_timer_s[3];
|
||||
uint8_t m_vol;
|
||||
uint8_t m_ic2a;
|
||||
uint8_t m_ic2b;
|
||||
uint8_t m_ic10a;
|
||||
uint8_t m_ic10b;
|
||||
uint8_t m_ic11a;
|
||||
bool m_ic11_ca2;
|
||||
bool m_ic10_cb2;
|
||||
bool m_ic2_ca2;
|
||||
bool m_ic2_cb2;
|
||||
uint8_t m_counter;
|
||||
uint8_t m_digit;
|
||||
uint8_t m_segment[5];
|
||||
bool m_timer_sb = 0;
|
||||
u8 m_timer_s[3]{};
|
||||
u8 m_vol = 0;
|
||||
u8 m_ic2a = 0;
|
||||
u8 m_ic2b = 0;
|
||||
u8 m_ic10a = 0;
|
||||
u8 m_ic10b = 0;
|
||||
u8 m_ic11a = 0;
|
||||
bool m_ic11_ca2 = 0;
|
||||
bool m_ic11_cb2 = 0;
|
||||
bool m_ic10_cb2 = 0;
|
||||
bool m_ic2_ca2 = 0;
|
||||
bool m_ic2_cb2 = 0;
|
||||
u8 m_counter = 0;
|
||||
u8 m_digit = 0;
|
||||
u8 m_segment[5]{};
|
||||
|
||||
required_region_ptr<uint8_t> m_p_prom;
|
||||
required_region_ptr<u8> m_p_prom;
|
||||
required_device<m6802_cpu_device> m_maincpu;
|
||||
required_device<m6802_cpu_device> m_audiocpu;
|
||||
required_device<pia6821_device> m_ic10;
|
||||
@ -99,11 +104,12 @@ private:
|
||||
required_device<dac_4bit_r2r_device> m_dac;
|
||||
required_ioport m_io_test;
|
||||
required_ioport_array<8> m_io_x;
|
||||
output_finder<5, 6> m_display;
|
||||
output_finder<5, 6> m_digits;
|
||||
output_finder<96> m_io_outputs; // 32 solenoids + 64 lamps
|
||||
};
|
||||
|
||||
|
||||
void hankin_state::hankin_map(address_map &map)
|
||||
void hankin_state::main_map(address_map &map)
|
||||
{
|
||||
map.global_mask(0x1fff);
|
||||
map(0x0088, 0x008b).rw(m_ic11, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
@ -112,7 +118,7 @@ void hankin_state::hankin_map(address_map &map)
|
||||
map(0x1000, 0x1fff).rom().region("maincpu", 0);
|
||||
}
|
||||
|
||||
void hankin_state::hankin_sub_map(address_map &map)
|
||||
void hankin_state::audio_map(address_map &map)
|
||||
{
|
||||
map.global_mask(0x1fff);
|
||||
map(0x0080, 0x0083).rw(m_ic2, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
@ -121,7 +127,7 @@ void hankin_state::hankin_sub_map(address_map &map)
|
||||
|
||||
static INPUT_PORTS_START( hankin )
|
||||
PORT_START("TEST")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Self Test") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, hankin_state, self_test, 0)
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Self Test") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, hankin_state, self_test, 0)
|
||||
|
||||
PORT_START("DSW0")
|
||||
PORT_DIPNAME( 0x07, 0x00, DEF_STR(Coinage))
|
||||
@ -139,7 +145,7 @@ static INPUT_PORTS_START( hankin )
|
||||
PORT_DIPNAME( 0x10, 0x10, "Match")
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ))
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( On ))
|
||||
PORT_DIPNAME( 0x60, 0x40, "Credits for exceeding high score")
|
||||
PORT_DIPNAME( 0x60, 0x00, "Credits for exceeding high score")
|
||||
PORT_DIPSETTING( 0x00, "0")
|
||||
PORT_DIPSETTING( 0x20, "1")
|
||||
PORT_DIPSETTING( 0x40, "2")
|
||||
@ -201,54 +207,54 @@ static INPUT_PORTS_START( hankin )
|
||||
|
||||
// Switches are numbered 8-1,16-9,24-17
|
||||
PORT_START("X0")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_SLASH)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_COLON)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_QUOTE)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSLASH)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSPACE)
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("INP08")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("INP07")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("INP06")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("INP05")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("INP04")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Z)
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Tilt")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("INP01")
|
||||
|
||||
PORT_START("X1")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_MINUS)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_EQUALS)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_L)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_OPENBRACE)
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_CLOSEBRACE)
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("Coin Door")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_TILT1 ) PORT_NAME("Slam Tilt")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("INP15")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("INP14")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("INP13")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("INP12")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("INP11")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Coin Door")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Slam Tilt")
|
||||
|
||||
PORT_START("X2")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_A)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_S)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_D)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_F)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_G)
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_H)
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_J)
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_K)
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("INP24")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("INP23")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("INP22")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("INP21")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("INP20")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("INP19")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("INP18")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("INP17")
|
||||
|
||||
PORT_START("X3")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Q)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_W)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_E)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_R)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Y)
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_U)
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_I)
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_O)
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("INP32")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("INP31")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("INP30")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("INP29")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("INP28")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("INP27")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("INP26")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("INP25")
|
||||
|
||||
PORT_START("X4")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Outhole") PORT_CODE(KEYCODE_X)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_C)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_V)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_B)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_N)
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_M)
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_COMMA)
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_STOP)
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Outhole")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("INP39")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("INP38")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("INP37")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP36")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("INP35")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("INP34")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("INP33")
|
||||
INPUT_PORTS_END
|
||||
|
||||
INPUT_CHANGED_MEMBER( hankin_state::self_test )
|
||||
@ -256,7 +262,7 @@ INPUT_CHANGED_MEMBER( hankin_state::self_test )
|
||||
m_ic11->ca1_w(newval);
|
||||
}
|
||||
|
||||
void hankin_state::ic10_a_w(uint8_t data)
|
||||
void hankin_state::ic10_a_w(u8 data)
|
||||
{
|
||||
m_ic10a = data;
|
||||
|
||||
@ -279,17 +285,18 @@ void hankin_state::ic10_a_w(uint8_t data)
|
||||
// use is to place the '1' digit in the centre segments.
|
||||
if (BIT(data, 0) && (m_counter > 8))
|
||||
{
|
||||
static constexpr uint8_t patterns[16] = { 0x3f,0x80,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0,0,0,0,0,0 }; // MC14543 with '1' adjusted
|
||||
for (unsigned i = 0U; i < 5U; ++i)
|
||||
m_display[i][m_digit] = bitswap<10>(uint16_t(patterns[m_segment[i]]), 7, 7, 6, 6, 5, 4, 3, 2, 1, 0);
|
||||
static constexpr u8 patterns[16] = { 0x3f,0x80,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0,0,0,0,0,0 }; // MC14543 with '1' adjusted
|
||||
for (u8 i = 0U; i < 5U; ++i)
|
||||
m_digits[i][m_digit] = bitswap<10>(uint16_t(patterns[m_segment[i]]), 7, 7, 6, 6, 5, 4, 3, 2, 1, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void hankin_state::ic10_b_w(uint8_t data)
|
||||
void hankin_state::ic10_b_w(u8 data)
|
||||
{
|
||||
m_ic10b = data;
|
||||
|
||||
// Solenoids
|
||||
if (!m_ic10_cb2)
|
||||
{
|
||||
switch (data & 15)
|
||||
@ -310,6 +317,8 @@ void hankin_state::ic10_b_w(uint8_t data)
|
||||
m_samples->start(0, 7);
|
||||
break;
|
||||
}
|
||||
for (u8 i = 0; i < 8; i++)
|
||||
m_io_outputs[i] = (data == i) ? 1 : 0;
|
||||
}
|
||||
// also sound data
|
||||
}
|
||||
@ -327,7 +336,7 @@ WRITE_LINE_MEMBER( hankin_state::ic10_cb2_w )
|
||||
m_ic10_cb2 = state;
|
||||
}
|
||||
|
||||
void hankin_state::ic11_a_w(uint8_t data)
|
||||
void hankin_state::ic11_a_w(u8 data)
|
||||
{
|
||||
m_ic11a = data;
|
||||
|
||||
@ -352,9 +361,9 @@ void hankin_state::ic11_a_w(uint8_t data)
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t hankin_state::ic11_b_r()
|
||||
u8 hankin_state::ic11_b_r()
|
||||
{
|
||||
uint8_t data = 0;
|
||||
u8 data = 0;
|
||||
|
||||
for (unsigned i = 0U; i < 8U; ++i)
|
||||
{
|
||||
@ -375,13 +384,21 @@ WRITE_LINE_MEMBER( hankin_state::ic11_ca2_w )
|
||||
// lamp strobe
|
||||
WRITE_LINE_MEMBER( hankin_state::ic11_cb2_w )
|
||||
{
|
||||
m_ic11_cb2 = state;
|
||||
// Todo: no lamps are ever activated at this moment, to fix
|
||||
if (state)
|
||||
{
|
||||
u8 addr = m_ic11a & 15;
|
||||
u8 data = m_ic11a >> 4;
|
||||
for (u8 i = 0; i < 4; i++)
|
||||
m_io_outputs[32+addr*4+i] = BIT(data, i);
|
||||
}
|
||||
}
|
||||
|
||||
// zero-cross detection
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( hankin_state::timer_x )
|
||||
WRITE_LINE_MEMBER( hankin_state::clock_w )
|
||||
{
|
||||
m_timer_x ^= 1;
|
||||
m_ic11->cb1_w(m_timer_x);
|
||||
m_ic11->cb1_w(state);
|
||||
}
|
||||
|
||||
// Sound
|
||||
@ -422,27 +439,49 @@ TIMER_DEVICE_CALLBACK_MEMBER( hankin_state::timer_s )
|
||||
|
||||
void hankin_state::machine_start()
|
||||
{
|
||||
m_display.resolve();
|
||||
genpin_class::machine_start();
|
||||
|
||||
m_digits.resolve();
|
||||
m_io_outputs.resolve();
|
||||
|
||||
save_item(NAME(m_timer_sb));
|
||||
save_item(NAME(m_timer_s));
|
||||
save_item(NAME(m_vol));
|
||||
save_item(NAME(m_ic2a));
|
||||
save_item(NAME(m_ic2b));
|
||||
save_item(NAME(m_ic10a));
|
||||
save_item(NAME(m_ic10b));
|
||||
save_item(NAME(m_ic11a));
|
||||
save_item(NAME(m_ic11_ca2));
|
||||
save_item(NAME(m_ic10_cb2));
|
||||
save_item(NAME(m_ic2_ca2));
|
||||
save_item(NAME(m_ic2_cb2));
|
||||
save_item(NAME(m_counter));
|
||||
save_item(NAME(m_digit));
|
||||
save_item(NAME(m_segment));
|
||||
|
||||
m_timer_x = false;
|
||||
m_timer_sb = false;
|
||||
m_ic10b = 0;
|
||||
}
|
||||
|
||||
void hankin_state::machine_reset()
|
||||
{
|
||||
genpin_class::machine_reset();
|
||||
for (u8 i = 0; i < m_io_outputs.size(); i++)
|
||||
m_io_outputs[i] = 0;
|
||||
|
||||
m_timer_sb = false;
|
||||
m_ic10b = 0;
|
||||
m_vol = 0;
|
||||
m_dac->set_output_gain(0, 0);
|
||||
}
|
||||
|
||||
// PA0-3 = sound data from main cpu
|
||||
uint8_t hankin_state::ic2_a_r()
|
||||
u8 hankin_state::ic2_a_r()
|
||||
{
|
||||
return m_ic10b;
|
||||
}
|
||||
|
||||
// PA4-7 = sound data to prom
|
||||
void hankin_state::ic2_a_w(uint8_t data)
|
||||
void hankin_state::ic2_a_w(u8 data)
|
||||
{
|
||||
m_ic2a = data >> 4;
|
||||
offs_t offs = (m_timer_s[2] & 31) | (m_ic2a << 5);
|
||||
@ -451,7 +490,7 @@ void hankin_state::ic2_a_w(uint8_t data)
|
||||
|
||||
// PB0-3 = preset on 74LS161
|
||||
// PB4-7 = volume
|
||||
void hankin_state::ic2_b_w(uint8_t data)
|
||||
void hankin_state::ic2_b_w(u8 data)
|
||||
{
|
||||
m_ic2b = data;
|
||||
|
||||
@ -481,10 +520,10 @@ void hankin_state::hankin(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M6802(config, m_maincpu, 3276800);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &hankin_state::hankin_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &hankin_state::main_map);
|
||||
|
||||
M6802(config, m_audiocpu, 3276800); // guess, xtal value not shown
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &hankin_state::hankin_sub_map);
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &hankin_state::audio_map);
|
||||
|
||||
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
|
||||
|
||||
@ -505,8 +544,8 @@ void hankin_state::hankin(machine_config &config)
|
||||
m_ic10->writepb_handler().set(FUNC(hankin_state::ic10_b_w));
|
||||
m_ic10->ca2_handler().set(FUNC(hankin_state::ic10_ca2_w));
|
||||
m_ic10->cb2_handler().set(FUNC(hankin_state::ic10_cb2_w));
|
||||
m_ic10->irqa_handler().set_inputline("maincpu", M6802_IRQ_LINE);
|
||||
m_ic10->irqb_handler().set_inputline("maincpu", M6802_IRQ_LINE);
|
||||
m_ic10->irqa_handler().set("mainirq", FUNC(input_merger_device::in_w<0>));
|
||||
m_ic10->irqb_handler().set("mainirq", FUNC(input_merger_device::in_w<1>));
|
||||
|
||||
PIA6821(config, m_ic11, 0);
|
||||
//m_ic11->readpa_handler().set(FUNC(hankin_state::ic11_a_r));
|
||||
@ -515,8 +554,8 @@ void hankin_state::hankin(machine_config &config)
|
||||
//m_ic11->writepb_handler().set(FUNC(hankin_state::ic11_b_w));
|
||||
m_ic11->ca2_handler().set(FUNC(hankin_state::ic11_ca2_w));
|
||||
m_ic11->cb2_handler().set(FUNC(hankin_state::ic11_cb2_w));
|
||||
m_ic11->irqa_handler().set_inputline("maincpu", M6802_IRQ_LINE);
|
||||
m_ic11->irqb_handler().set_inputline("maincpu", M6802_IRQ_LINE);
|
||||
m_ic11->irqa_handler().set("mainirq", FUNC(input_merger_device::in_w<2>));
|
||||
m_ic11->irqb_handler().set("mainirq", FUNC(input_merger_device::in_w<3>));
|
||||
|
||||
PIA6821(config, m_ic2, 0);
|
||||
m_ic2->readpa_handler().set(FUNC(hankin_state::ic2_a_r));
|
||||
@ -525,11 +564,16 @@ void hankin_state::hankin(machine_config &config)
|
||||
m_ic2->writepb_handler().set(FUNC(hankin_state::ic2_b_w));
|
||||
m_ic2->ca2_handler().set(FUNC(hankin_state::ic2_ca2_w));
|
||||
m_ic2->cb2_handler().set(FUNC(hankin_state::ic2_cb2_w));
|
||||
m_ic2->irqa_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
|
||||
m_ic2->irqb_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
|
||||
m_ic2->irqa_handler().set("audioirq", FUNC(input_merger_device::in_w<0>));
|
||||
m_ic2->irqb_handler().set("audioirq", FUNC(input_merger_device::in_w<1>));
|
||||
|
||||
clock_device &irqclock(CLOCK(config, "irqclock", 100));
|
||||
irqclock.signal_handler().set(FUNC(hankin_state::clock_w));
|
||||
|
||||
TIMER(config, "timer_x").configure_periodic(FUNC(hankin_state::timer_x), attotime::from_hz(120)); // mains freq*2
|
||||
TIMER(config, "timer_s").configure_periodic(FUNC(hankin_state::timer_s), attotime::from_hz(94000)); // 555 on sound board*2
|
||||
|
||||
INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, M6802_IRQ_LINE);
|
||||
INPUT_MERGER_ANY_HIGH(config, "audioirq").output_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE);
|
||||
}
|
||||
|
||||
/*--------------------------------
|
||||
@ -610,8 +654,8 @@ ROM_END
|
||||
} // Anonymous namespace
|
||||
|
||||
|
||||
GAME(1978, fjholden, 0, hankin, hankin, hankin_state, empty_init, ROT0, "Hankin", "FJ Holden", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
|
||||
GAME(1978, orbit1, 0, hankin, hankin, hankin_state, empty_init, ROT0, "Hankin", "Orbit 1", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
|
||||
GAME(1980, shark, 0, hankin, hankin, hankin_state, empty_init, ROT0, "Hankin", "Shark", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
|
||||
GAME(1980, howzat, 0, hankin, hankin, hankin_state, empty_init, ROT0, "Hankin", "Howzat!", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
|
||||
GAME(1981, empsback, 0, hankin, hankin, hankin_state, empty_init, ROT0, "Hankin", "The Empire Strike Back", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
|
||||
GAME(1978, fjholden, 0, hankin, hankin, hankin_state, empty_init, ROT0, "Hankin", "FJ Holden", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1978, orbit1, 0, hankin, hankin, hankin_state, empty_init, ROT0, "Hankin", "Orbit 1", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1980, shark, 0, hankin, hankin, hankin_state, empty_init, ROT0, "Hankin", "Shark", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1980, howzat, 0, hankin, hankin, hankin_state, empty_init, ROT0, "Hankin", "Howzat!", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1981, empsback, 0, hankin, hankin, hankin_state, empty_init, ROT0, "Hankin", "The Empire Strike Back", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
|
Loading…
Reference in New Issue
Block a user