Previous 199869 Revisions Next

r31688 Monday 18th August, 2014 at 05:36:20 UTC by Robbbert
hankin.c : Added sound. All 5 games marked as working.
[src/mame/drivers]hankin.c

trunk/src/mame/drivers/hankin.c
r31687r31688
77
88ToDo:
99- High score isn't saved or remembered
10- Sound
10- Sound needs to be verified with original
1111- Mechanical
1212
1313***********************************************************************************/
r31687r31688
1515#include "machine/genpin.h"
1616#include "cpu/m6800/m6800.h"
1717#include "machine/6821pia.h"
18#include "sound/dac.h"
1819#include "hankin.lh"
1920
2021class hankin_state : public genpin_class
r31687r31688
2728      , m_ic10(*this, "ic10")
2829      , m_ic11(*this, "ic11")
2930      , m_ic2(*this, "ic2")
31      , m_dac(*this, "dac")
3032      , m_io_test(*this, "TEST")
3133      , m_io_dsw0(*this, "DSW0")
3234      , m_io_dsw1(*this, "DSW1")
r31687r31688
3840      , m_io_x4(*this, "X4")
3941   { }
4042
41   DECLARE_DRIVER_INIT(hankin);
4243   DECLARE_WRITE_LINE_MEMBER(ic10_ca2_w);
4344   DECLARE_WRITE_LINE_MEMBER(ic10_cb2_w);
4445   DECLARE_WRITE_LINE_MEMBER(ic11_ca2_w);
4546   DECLARE_WRITE_LINE_MEMBER(ic11_cb2_w);
47   DECLARE_WRITE_LINE_MEMBER(ic2_ca2_w);
48   DECLARE_WRITE_LINE_MEMBER(ic2_cb2_w);
4649   DECLARE_WRITE8_MEMBER(ic10_a_w);
4750   DECLARE_WRITE8_MEMBER(ic10_b_w);
4851   DECLARE_WRITE8_MEMBER(ic11_a_w);
52   DECLARE_WRITE8_MEMBER(ic2_b_w);
53   DECLARE_WRITE8_MEMBER(ic2_a_w);
4954   DECLARE_READ8_MEMBER(ic11_b_r);
55   DECLARE_READ8_MEMBER(ic2_a_r);
5056   DECLARE_INPUT_CHANGED_MEMBER(self_test);
57   TIMER_DEVICE_CALLBACK_MEMBER(timer_s);
5158   TIMER_DEVICE_CALLBACK_MEMBER(timer_x);
5259private:
5360   bool m_timer_x;
61   bool m_timer_sb;
62   UINT8 m_timer_s[3];
63   UINT8 m_vol;
64   UINT8 m_ic2a;
65   UINT8 m_ic2b;
5466   UINT8 m_ic10a;
67   UINT8 m_ic10b;
5568   UINT8 m_ic11a;
5669   bool m_ic11_ca2;
5770   bool m_ic10_cb2;
71   bool m_ic2_ca2;
72   bool m_ic2_cb2;
5873   UINT8 m_counter;
5974   UINT8 m_digit;
6075   UINT8 m_segment[5];
76   UINT8 *m_p_prom;
6177   virtual void machine_reset();
6278   required_device<m6802_cpu_device> m_maincpu;
6379   required_device<m6802_cpu_device> m_audiocpu;
6480   required_device<pia6821_device> m_ic10;
6581   required_device<pia6821_device> m_ic11;
6682   required_device<pia6821_device> m_ic2;
83   required_device<dac_device> m_dac;
6784   required_ioport m_io_test;
6885   required_ioport m_io_dsw0;
6986   required_ioport m_io_dsw1;
r31687r31688
117134   PORT_DIPSETTING(    0x20, "1")
118135   PORT_DIPSETTING(    0x40, "2")
119136   PORT_DIPSETTING(    0x60, "3")
120   PORT_DIPNAME( 0x80, 0x00, "Game Over Tune")
137   PORT_DIPNAME( 0x80, 0x80, "Game Over Tune")
121138   PORT_DIPSETTING(    0x00, DEF_STR( Off ))
122139   PORT_DIPSETTING(    0x80, DEF_STR( On ))
123140
r31687r31688
271288
272289WRITE8_MEMBER( hankin_state::ic10_b_w )
273290{
291   m_ic10b = data;
292
274293   if (!m_ic10_cb2)
275294   {
276295      switch (data & 15)
r31687r31688
299318{
300319   output_set_value("led0", !state);
301320   // also sound strobe
321   m_ic2->ca1_w(state);
302322}
303323
304324WRITE_LINE_MEMBER( hankin_state::ic10_cb2_w )
r31687r31688
382402   m_ic11->cb1_w(m_timer_x);
383403}
384404
405// Sound
406// 555 osc at 47kHz
407// Then optional divide by 2 controlled by CA2
408// Then presettable 74LS161 binary divider controlled by PB0-3
409// Then a pair of 7493 to generate 5 address lines, enabled by CB2
410// The address lines are merged with PA4-7 to form a lookup on the prom
411// Output of prom goes to a 4-bit DAC
412// Volume is controlled by PB4-7
413// Variables:
414// m_timer_s[0] inc each timer cycle, bit 0 = 47k, bit 1 = 23.5k
415// m_timer_s[1] count in 74LS161
416// m_timer_s[2] count in 7493s
417// m_timer_sb   wanted output of m_timer_s[0]
418TIMER_DEVICE_CALLBACK_MEMBER( hankin_state::timer_s )
419{
420   m_timer_s[0]++;
421   bool cs = (m_ic2_ca2) ? BIT(m_timer_s[0], 0) : BIT(m_timer_s[0], 1); // divide by 2 stage
422   if (cs != m_timer_sb)
423   {
424      m_timer_sb = cs;
425      m_timer_s[1]++;
426      if (m_timer_s[1] > 15)
427      {
428         m_timer_s[1] = m_ic2b & 15; // set to preset value
429         if (!m_ic2_cb2)
430         {
431            m_timer_s[2]++;
432            offs_t offs = (m_timer_s[2] & 31) | (m_ic2a << 5);
433            m_dac->write_unsigned8(m_p_prom[offs]<< m_vol);
434         }
435         else
436            m_timer_s[2] = 0;
437      }
438   }
439}
440
385441void hankin_state::machine_reset()
386442{
443   m_p_prom = memregion("roms")->base() + 0x1800;
387444}
388445
446// PA0-3 = sound data from main cpu
447READ8_MEMBER( hankin_state::ic2_a_r )
448{
449   return m_ic10b;
450}
451
452// PA4-7 = sound data to prom
453WRITE8_MEMBER( hankin_state::ic2_a_w )
454{
455   m_ic2a = data >> 4;
456   offs_t offs = (m_timer_s[2] & 31) | (m_ic2a << 5);
457   m_dac->write_unsigned8(m_p_prom[offs]<< m_vol);
458}
459
460// PB0-3 = preset on 74LS161
461// PB4-7 = volume
462WRITE8_MEMBER( hankin_state::ic2_b_w )
463{
464   m_ic2b = data;
465   m_vol = (m_ic2b & 0xf0) / 50; // 0 to 4
466}
467
468// low to divide 555 by 2
469WRITE_LINE_MEMBER( hankin_state::ic2_ca2_w )
470{
471   m_ic2_ca2 = state;
472}
473
474// low to enable 7493 dividers
475WRITE_LINE_MEMBER( hankin_state::ic2_cb2_w )
476{
477   m_ic2_cb2 = state;
478}
479
389480static MACHINE_CONFIG_START( hankin, hankin_state )
390481   /* basic machine hardware */
391482   MCFG_CPU_ADD("maincpu", M6802, 3276800)
r31687r31688
402493   /* Sound */
403494   MCFG_FRAGMENT_ADD( genpin_audio )
404495
496   MCFG_SPEAKER_STANDARD_MONO("mono")
497   MCFG_SOUND_ADD("dac", DAC, 0)
498   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
499
405500   /* Devices */
406501   MCFG_DEVICE_ADD("ic10", PIA6821, 0)
407502   //MCFG_PIA_READPA_HANDLER(READ8(hankin_state, ic10_a_r))
r31687r31688
424519   MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6802_cpu_device, irq_line))
425520
426521   MCFG_DEVICE_ADD("ic2", PIA6821, 0)
427   //MCFG_PIA_READPA_HANDLER(READ8(hankin_state, ic2_a_r))
428   //MCFG_PIA_WRITEPA_HANDLER(WRITE8(hankin_state, ic2_a_w))
522   MCFG_PIA_READPA_HANDLER(READ8(hankin_state, ic2_a_r))
523   MCFG_PIA_WRITEPA_HANDLER(WRITE8(hankin_state, ic2_a_w))
429524   //MCFG_PIA_READPB_HANDLER(READ8(hankin_state, ic2_b_r))
430   //MCFG_PIA_WRITEPB_HANDLER(WRITE8(hankin_state, ic2_b_w))
431   //MCFG_PIA_CA2_HANDLER(WRITELINE(hankin_state, ic2_ca2_w))
432   //MCFG_PIA_CB2_HANDLER(WRITELINE(hankin_state, ic2_cb2_w))
525   MCFG_PIA_WRITEPB_HANDLER(WRITE8(hankin_state, ic2_b_w))
526   MCFG_PIA_CA2_HANDLER(WRITELINE(hankin_state, ic2_ca2_w))
527   MCFG_PIA_CB2_HANDLER(WRITELINE(hankin_state, ic2_cb2_w))
433528   MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("audiocpu", m6802_cpu_device, irq_line))
434529   MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("audiocpu", m6802_cpu_device, irq_line))
435530
436531   MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_x", hankin_state, timer_x, attotime::from_hz(120)) // mains freq*2
532   MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_s", hankin_state, timer_s, attotime::from_hz(94000)) // 555 on sound board*2
437533MACHINE_CONFIG_END
438534
439535/*--------------------------------
r31687r31688
492588ROM_END
493589
494590
495GAME(1978,  fjholden,  0,  hankin,  hankin, driver_device, 0,  ROT0,  "Hankin", "FJ Holden", GAME_MECHANICAL | GAME_NO_SOUND )
496GAME(1978,  orbit1,    0,  hankin,  hankin, driver_device, 0,  ROT0,  "Hankin", "Orbit 1", GAME_MECHANICAL | GAME_NO_SOUND )
497GAME(1980,  shark,     0,  hankin,  hankin, driver_device, 0,  ROT0,  "Hankin", "Shark", GAME_MECHANICAL | GAME_NO_SOUND )
498GAME(1980,  howzat,    0,  hankin,  hankin, driver_device, 0,  ROT0,  "Hankin", "Howzat!", GAME_MECHANICAL | GAME_NO_SOUND )
499GAME(1981,  empsback,  0,  hankin,  hankin, driver_device, 0,  ROT0,  "Hankin", "The Empire Strike Back", GAME_MECHANICAL | GAME_NO_SOUND )
591GAME(1978,  fjholden,  0,  hankin,  hankin, driver_device, 0,  ROT0,  "Hankin", "FJ Holden", GAME_MECHANICAL )
592GAME(1978,  orbit1,    0,  hankin,  hankin, driver_device, 0,  ROT0,  "Hankin", "Orbit 1", GAME_MECHANICAL )
593GAME(1980,  shark,     0,  hankin,  hankin, driver_device, 0,  ROT0,  "Hankin", "Shark", GAME_MECHANICAL )
594GAME(1980,  howzat,    0,  hankin,  hankin, driver_device, 0,  ROT0,  "Hankin", "Howzat!", GAME_MECHANICAL )
595GAME(1981,  empsback,  0,  hankin,  hankin, driver_device, 0,  ROT0,  "Hankin", "The Empire Strike Back", GAME_MECHANICAL )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team