trunk/src/mame/drivers/jpmmps.c
r25465 | r25466 | |
32 | 32 | #include "sound/sn76496.h" |
33 | 33 | #include "machine/i8255.h" |
34 | 34 | #include "machine/tms9902.h" |
| 35 | #include "machine/meters.h" |
| 36 | #include "jpmmps.lh" |
35 | 37 | |
36 | 38 | class jpmmps_state : public driver_device |
37 | 39 | { |
38 | 40 | public: |
39 | 41 | jpmmps_state(const machine_config &mconfig, device_type type, const char *tag) |
40 | 42 | : driver_device(mconfig, type, tag), |
41 | | m_maincpu(*this, "maincpu") |
| 43 | m_maincpu(*this, "maincpu"), |
| 44 | m_psg(*this, "sn") |
42 | 45 | { } |
43 | | |
| 46 | UINT8 m_sound_buffer; |
| 47 | UINT8 m_psg_latch; |
44 | 48 | protected: |
45 | 49 | |
46 | 50 | // devices |
47 | 51 | required_device<cpu_device> m_maincpu; |
| 52 | optional_device<sn76489_device> m_psg; |
48 | 53 | public: |
49 | 54 | DECLARE_DRIVER_INIT(jpmmps); |
| 55 | DECLARE_WRITE8_MEMBER(jpmmps_meters_w); |
| 56 | DECLARE_WRITE8_MEMBER(jpmmps_psg_buf_w); |
| 57 | DECLARE_WRITE8_MEMBER(jpmmps_ic22_portc_w); |
| 58 | DECLARE_MACHINE_START(jpmmps); |
50 | 59 | }; |
51 | 60 | |
52 | 61 | static ADDRESS_MAP_START( jpmmps_map, AS_PROGRAM, 8, jpmmps_state ) |
r25465 | r25466 | |
88 | 97 | static INPUT_PORTS_START( jpmmps ) |
89 | 98 | INPUT_PORTS_END |
90 | 99 | |
| 100 | WRITE8_MEMBER(jpmmps_state::jpmmps_meters_w) |
| 101 | { |
| 102 | int meter=0; |
| 103 | for (meter = 0; meter < 8; meter ++) |
| 104 | { |
| 105 | MechMtr_update(meter, (data & (1 << meter))); |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | |
91 | 110 | static I8255_INTERFACE (ppi8255_intf_ic26) |
92 | 111 | { |
93 | 112 | DEVCB_NULL, /* Port A read */ |
94 | 113 | DEVCB_NULL, /* Port A write */ |
95 | 114 | DEVCB_NULL, /* Port B read */ |
96 | | DEVCB_NULL, /* Port B write */ |
| 115 | DEVCB_NULL, /* Port B write (0 is coin lockout) */ |
97 | 116 | DEVCB_NULL, /* Port C read */ |
98 | | DEVCB_NULL /* Port C write */ |
| 117 | DEVCB_DRIVER_MEMBER(jpmmps_state,jpmmps_meters_w) /* Port C write meters */ |
99 | 118 | }; |
100 | 119 | |
101 | 120 | static I8255_INTERFACE (ppi8255_intf_ic21) |
r25465 | r25466 | |
108 | 127 | DEVCB_NULL /* Port C write */ |
109 | 128 | }; |
110 | 129 | |
| 130 | |
| 131 | WRITE8_MEMBER(jpmmps_state::jpmmps_psg_buf_w) |
| 132 | { |
| 133 | m_sound_buffer = data; |
| 134 | } |
| 135 | |
| 136 | WRITE8_MEMBER(jpmmps_state::jpmmps_ic22_portc_w) |
| 137 | { |
| 138 | //Handle PSG |
| 139 | |
| 140 | if (m_psg_latch != (data & 0x04)) |
| 141 | { |
| 142 | if (!m_psg_latch)//falling edge |
| 143 | { |
| 144 | m_psg->write(m_sound_buffer); |
| 145 | } |
| 146 | } |
| 147 | m_psg_latch = (data & 0x04); |
| 148 | |
| 149 | MechMtr_update(8, (data & 0x08)); |
| 150 | |
| 151 | } |
| 152 | |
111 | 153 | static I8255_INTERFACE (ppi8255_intf_ic22) |
112 | 154 | { |
113 | 155 | DEVCB_NULL, /* Port A read */ |
114 | 156 | DEVCB_NULL, /* Port A write */ |
115 | 157 | DEVCB_NULL, /* Port B read */ |
116 | | DEVCB_NULL, /* Port B write */ |
| 158 | DEVCB_DRIVER_MEMBER(jpmmps_state,jpmmps_psg_buf_w), /* Port B write (SN chip data)*/ |
117 | 159 | DEVCB_NULL, /* Port C read */ |
118 | | DEVCB_NULL /* Port C write */ |
| 160 | DEVCB_DRIVER_MEMBER(jpmmps_state,jpmmps_ic22_portc_w) /* Port C write (C3 is last meter, C2 latches in data) */ |
119 | 161 | }; |
120 | 162 | |
121 | 163 | static I8255_INTERFACE (ppi8255_intf_ic25) |
r25465 | r25466 | |
168 | 210 | DEVCB_NULL |
169 | 211 | }; |
170 | 212 | |
| 213 | MACHINE_START_MEMBER(jpmmps_state,jpmmps) |
| 214 | { |
| 215 | /* setup 9 mechanical meters */ |
| 216 | MechMtr_config(machine(),9); |
171 | 217 | |
| 218 | } |
| 219 | |
172 | 220 | static MACHINE_CONFIG_START( jpmmps, jpmmps_state ) |
173 | 221 | |
174 | 222 | /* basic machine hardware */ |
r25465 | r25466 | |
184 | 232 | MCFG_TMS9902_ADD("tms9902_ic10", tms9902_uart4_ic10_params, DUART_CLOCK) |
185 | 233 | MCFG_TMS9902_ADD("tms9902_ic5", tms9902_uart2_ic5_params, DUART_CLOCK) |
186 | 234 | |
| 235 | MCFG_MACHINE_START_OVERRIDE(jpmmps_state,jpmmps) |
187 | 236 | |
188 | 237 | MCFG_SPEAKER_STANDARD_MONO("mono") |
189 | 238 | |
190 | 239 | MCFG_SOUND_ADD("sn", SN76489, SOUND_CLOCK) |
191 | 240 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
192 | 241 | MCFG_SOUND_CONFIG(psg_intf) |
193 | | |
| 242 | MCFG_DEFAULT_LAYOUT(layout_jpmmps) |
194 | 243 | MACHINE_CONFIG_END |
195 | 244 | |
196 | 245 | DRIVER_INIT_MEMBER(jpmmps_state,jpmmps) |
trunk/src/mame/drivers/jpmsys5.c
r25465 | r25466 | |
6 | 6 | |
7 | 7 | driver by Phil Bennett |
8 | 8 | |
| 9 | AWP bits J.Wallace, D. Haywood |
| 10 | |
9 | 11 | Video System Games supported: |
10 | 12 | * Monopoly |
11 | 13 | * Monopoly Classic |
12 | 14 | * Monopoly Deluxe |
13 | 15 | |
14 | 16 | Known Issues: |
15 | | * Some features used by the AWP games such as reels and meters |
16 | | are not emulated. |
17 | | * Timing for reels, and other opto devices is controlled by the same clock |
18 | | as the lamps, in a weird daisychain setup. |
| 17 | * Some features used by the AWP games such as reels are not emulated. |
| 18 | * Timing for reels, and other opto devices is controlled by a generated clock |
| 19 | in a weird daisychain setup. |
19 | 20 | |
20 | 21 | AWP game notes: |
21 | 22 | The byte at 0x81 of the EVEN 68k rom appears to be some kind of |
r25465 | r25466 | |
290 | 291 | *************************************/ |
291 | 292 | |
292 | 293 | #define JPM_SYS5_COMMON_MAP \ |
| 294 | ADDRESS_MAP_UNMAP_HIGH \ |
293 | 295 | AM_RANGE(0x000000, 0x01ffff) AM_ROM \ |
294 | 296 | AM_RANGE(0x040000, 0x043fff) AM_RAM AM_SHARE("nvram") \ |
295 | 297 | AM_RANGE(0x046000, 0x046001) AM_WRITENOP \ |
296 | 298 | AM_RANGE(0x046020, 0x046021) AM_DEVREADWRITE8("acia6850_0", acia6850_device, status_read, control_write, 0xff) \ |
297 | 299 | AM_RANGE(0x046022, 0x046023) AM_DEVREADWRITE8("acia6850_0", acia6850_device, data_read, data_write, 0xff) \ |
298 | 300 | AM_RANGE(0x046040, 0x04604f) AM_DEVREADWRITE8("6840ptm", ptm6840_device, read, write, 0xff) \ |
299 | | AM_RANGE(0x046060, 0x046061) AM_READ_PORT("DIRECT") AM_WRITENOP \ |
300 | | AM_RANGE(0x046062, 0x046063) AM_WRITENOP \ |
301 | | AM_RANGE(0x046064, 0x046065) AM_WRITENOP \ |
302 | | AM_RANGE(0x046066, 0x046067) AM_WRITENOP \ |
| 301 | AM_RANGE(0x046060, 0x046067) AM_DEVREADWRITE8("6821pia", pia6821_device, read, write,0xff) \ |
303 | 302 | AM_RANGE(0x046080, 0x046081) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_read, control_write, 0xff) \ |
304 | 303 | AM_RANGE(0x046082, 0x046083) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_read, data_write, 0xff) \ |
305 | | AM_RANGE(0x046084, 0x046085) AM_READ(unk_r) /* PIA? */ \ |
306 | | AM_RANGE(0x046088, 0x046089) AM_READ(unk_r) /* PIA? */ \ |
307 | 304 | AM_RANGE(0x04608c, 0x04608d) AM_DEVREADWRITE8("acia6850_2", acia6850_device, status_read, control_write, 0xff) \ |
308 | 305 | AM_RANGE(0x04608e, 0x04608f) AM_DEVREADWRITE8("acia6850_2", acia6850_device, data_read, data_write, 0xff) \ |
309 | 306 | AM_RANGE(0x0460c0, 0x0460c1) AM_WRITENOP \ |
310 | 307 | AM_RANGE(0x048000, 0x04801f) AM_READWRITE(coins_r, coins_w) \ |
311 | 308 | AM_RANGE(0x04c000, 0x04c0ff) AM_READ(mux_r) AM_WRITE(mux_w) |
312 | | |
| 309 | |
313 | 310 | static ADDRESS_MAP_START( 68000_awp_map, AS_PROGRAM, 16, jpmsys5_state ) |
314 | 311 | JPM_SYS5_COMMON_MAP |
315 | 312 | AM_RANGE(0x0460a0, 0x0460a3) AM_DEVWRITE8("ym2413", ym2413_device, write, 0x00ff) |
r25465 | r25466 | |
481 | 478 | PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(45) PORT_KEYDELTA(15) |
482 | 479 | INPUT_PORTS_END |
483 | 480 | |
| 481 | /************************************* |
| 482 | * |
| 483 | * 6821 PIA |
| 484 | * |
| 485 | *************************************/ |
| 486 | WRITE_LINE_MEMBER(jpmsys5_state::pia_irq) |
| 487 | { |
| 488 | m_maincpu->set_input_line(INT_6821PIA, state ? ASSERT_LINE : CLEAR_LINE); |
| 489 | } |
484 | 490 | |
| 491 | READ8_MEMBER(jpmsys5_state::u29_porta_r) |
| 492 | { |
| 493 | |
| 494 | int combined_meter = MechMtr_GetActivity(0) | MechMtr_GetActivity(1) | |
| 495 | MechMtr_GetActivity(2) | MechMtr_GetActivity(3) | |
| 496 | MechMtr_GetActivity(4) | MechMtr_GetActivity(5) | |
| 497 | MechMtr_GetActivity(6) | MechMtr_GetActivity(7); |
| 498 | |
| 499 | int meter_bit =0; |
| 500 | if(combined_meter) |
| 501 | { |
| 502 | meter_bit = 0x80; |
| 503 | } |
| 504 | else |
| 505 | { |
| 506 | meter_bit = 0x00; |
| 507 | } |
| 508 | |
| 509 | return m_direct_port->read() | meter_bit; |
| 510 | } |
| 511 | |
| 512 | WRITE8_MEMBER(jpmsys5_state::u29_portb_w) |
| 513 | { |
| 514 | int meter =0; |
| 515 | for (meter = 0; meter < 8; meter ++) |
| 516 | { |
| 517 | MechMtr_update(meter, (data & (1 << meter))); |
| 518 | } |
| 519 | } |
| 520 | |
| 521 | WRITE_LINE_MEMBER(jpmsys5_state::u29_ca2_w) |
| 522 | { |
| 523 | //The 'CHOP' line controls power to the reel motors, without this the reels won't turn |
| 524 | m_chop = state; |
| 525 | } |
| 526 | |
| 527 | WRITE_LINE_MEMBER(jpmsys5_state::u29_cb2_w) |
| 528 | { |
| 529 | //On a cabinet, this overrides the volume, we don't emulate this yet |
| 530 | logerror("Alarm override enabled \n"); |
| 531 | } |
| 532 | |
| 533 | static const pia6821_interface pia_intf = |
| 534 | { |
| 535 | DEVCB_DRIVER_MEMBER(jpmsys5_state,u29_porta_r), /* port A in */ |
| 536 | DEVCB_NULL, /* port B in */ |
| 537 | DEVCB_NULL, /* line CA1 in */ |
| 538 | DEVCB_NULL, /* line CB1 in */ |
| 539 | DEVCB_NULL, /* line CA2 in */ |
| 540 | DEVCB_NULL, /* line CB2 in */ |
| 541 | DEVCB_NULL, /* port A out */ |
| 542 | DEVCB_DRIVER_MEMBER(jpmsys5_state,u29_portb_w), /* port B out */ |
| 543 | DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,u29_ca2_w), /* line CA2 out */ |
| 544 | DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,u29_cb2_w), /* port CB2 out */ |
| 545 | DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,pia_irq), /* IRQA */ |
| 546 | DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,pia_irq) /* IRQB */ |
| 547 | }; |
| 548 | |
485 | 549 | /************************************* |
486 | 550 | * |
487 | 551 | * 6840 PTM |
r25465 | r25466 | |
672 | 736 | MCFG_SOUND_ADD("upd7759", UPD7759, UPD7759_STANDARD_CLOCK) |
673 | 737 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) |
674 | 738 | |
675 | | /* Earlier revisions use an SAA1099 */ |
| 739 | /* Earlier revisions use an SAA1099, but no video card games seem to (?) */ |
676 | 740 | MCFG_SOUND_ADD("ym2413", YM2413, 4000000 ) /* Unconfirmed */ |
677 | 741 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
678 | 742 | |
| 743 | MCFG_PIA6821_ADD("6821pia", pia_intf) |
| 744 | |
679 | 745 | /* 6840 PTM */ |
680 | 746 | MCFG_PTM6840_ADD("6840ptm", ptm_intf) |
681 | 747 | MACHINE_CONFIG_END |
r25465 | r25466 | |
747 | 813 | PORT_START("DSW2") |
748 | 814 | PORT_BIT(0xFF, IP_ACTIVE_LOW, IPT_UNKNOWN) |
749 | 815 | |
750 | | PORT_START("ROTARY")//not everything has this hooked up, cna be used as a test switch internally |
| 816 | PORT_START("ROTARY")//not everything has this hooked up, can be used as a test switch internally |
751 | 817 | PORT_CONFNAME(0x0F, 0x0F, "Rotary Switch") |
752 | 818 | PORT_CONFSETTING( 0x0F, "0") |
753 | 819 | PORT_CONFSETTING( 0x0E, "1") |
r25465 | r25466 | |
782 | 848 | PORT_DIPNAME( 0x40, 0x40, "Reset" ) PORT_DIPLOCATION("SW1:1") |
783 | 849 | PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) |
784 | 850 | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
785 | | PORT_DIPNAME( 0x80, 0x00, DEF_STR ( Unknown ) ) |
786 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
787 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 851 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) |
788 | 852 | |
789 | 853 | PORT_START("COINS") |
790 | 854 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("10p") |
r25465 | r25466 | |
821 | 885 | MACHINE_START_MEMBER(jpmsys5_state,jpmsys5) |
822 | 886 | { |
823 | 887 | // membank("bank1")->set_base(memregion("maincpu")->base()+0x20000); |
| 888 | |
| 889 | /* setup 8 mechanical meters */ |
| 890 | MechMtr_config(machine(),8); |
| 891 | |
824 | 892 | } |
825 | 893 | |
826 | 894 | MACHINE_RESET_MEMBER(jpmsys5_state,jpmsys5) |
r25465 | r25466 | |
859 | 927 | MCFG_SOUND_ADD("ym2413", YM2413, 4000000 ) /* Unconfirmed */ |
860 | 928 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
861 | 929 | |
| 930 | MCFG_PIA6821_ADD("6821pia", pia_intf) |
| 931 | |
862 | 932 | /* 6840 PTM */ |
863 | 933 | MCFG_PTM6840_ADD("6840ptm", ptm_intf) |
864 | 934 | MCFG_DEFAULT_LAYOUT(layout_jpmsys5) |
r25465 | r25466 | |
886 | 956 | MCFG_SAA1099_ADD("saa", 4000000 /* guess */) |
887 | 957 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) |
888 | 958 | |
| 959 | MCFG_PIA6821_ADD("6821pia", pia_intf) |
| 960 | |
889 | 961 | /* 6840 PTM */ |
890 | 962 | MCFG_PTM6840_ADD("6840ptm", ptm_intf) |
891 | 963 | MCFG_DEFAULT_LAYOUT(layout_jpmsys5) |