Merge pull request #1755 from ajrhacker/amusco_coins

amusco.cpp: Coin-related improvements
This commit is contained in:
R. Belmont 2016-11-21 13:58:53 -05:00 committed by GitHub
commit b5b46f74c7

View File

@ -39,11 +39,10 @@
CPU socket. Some of the other chips on this board were replaced with clones (e.g. CPU socket. Some of the other chips on this board were replaced with clones (e.g.
AMD P8253, SY6545-1). AMD P8253, SY6545-1).
The program code reads from and writes to what must be a line printer and a RTC The program code reads from and writes to a 40-column line printer and a RTC
(probably a MSM5832), though neither is present on the main board. The I/O write (probably a MSM5832), though neither is present on the main board. The I/O write
patterns also suggest that each or both of these devices are accessed through an patterns also suggest that each or both of these devices are accessed through an
Intel 8155 or compatible interface chip. The printer appears to use non-Epson Intel 8155 or compatible interface chip. The printer uses NCR-style control codes.
control codes: ETB, DLE, DC4, DC2, SO, EM, DC1 and STX.
***************************************************************************************** *****************************************************************************************
@ -66,7 +65,8 @@
- Make the 6845 transparent videoram addressing actually transparent. - Make the 6845 transparent videoram addressing actually transparent.
(IRQ1 changes the 6845 address twice but neither reads nor writes data?) (IRQ1 changes the 6845 address twice but neither reads nor writes data?)
- Add NVRAM in a way that won't trigger POST error message (needs NMI on shutdown?) - Add NVRAM in a way that won't trigger POST error message (needs NMI on shutdown?)
- Identify remaining outputs from first PPI (button lamps and coin counter are identified and implemented) - Identify remaining outputs from first PPI (button lamps are identified and implemented)
- Draw 88 Poker fails POST memory test for some weird reason (IRQ interference?)
*******************************************************************************/ *******************************************************************************/
@ -80,6 +80,8 @@
#define PIT_CLOCK0 SECOND_CLOCK / 8 /* guess */ #define PIT_CLOCK0 SECOND_CLOCK / 8 /* guess */
#define PIT_CLOCK1 SECOND_CLOCK / 8 /* guess */ #define PIT_CLOCK1 SECOND_CLOCK / 8 /* guess */
#define COIN_IMPULSE 3
#include "emu.h" #include "emu.h"
#include "cpu/i86/i86.h" #include "cpu/i86/i86.h"
#include "video/mc6845.h" #include "video/mc6845.h"
@ -111,9 +113,7 @@ public:
TILE_GET_INFO_MEMBER(get_bg_tile_info); TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void video_start() override; virtual void video_start() override;
virtual void machine_start() override; virtual void machine_start() override;
DECLARE_READ8_MEMBER(hack_coin1_r); DECLARE_WRITE_LINE_MEMBER(coin_irq);
DECLARE_READ8_MEMBER(hack_coin2_r);
DECLARE_READ8_MEMBER(hack_bill_r);
DECLARE_READ8_MEMBER(mc6845_r); DECLARE_READ8_MEMBER(mc6845_r);
DECLARE_WRITE8_MEMBER(mc6845_w); DECLARE_WRITE8_MEMBER(mc6845_w);
DECLARE_WRITE8_MEMBER(output_a_w); DECLARE_WRITE8_MEMBER(output_a_w);
@ -174,44 +174,11 @@ void amusco_state::machine_start()
} }
/**************************
* Read / Write Handlers *
**************************/
READ8_MEMBER(amusco_state::hack_coin1_r)
{
// actually set by IRQ4
return BIT(ioport("IN2")->read(), 1) ? 1 : 0;
}
READ8_MEMBER(amusco_state::hack_coin2_r)
{
// actually set by IRQ4
return BIT(ioport("IN2")->read(), 2) ? 1 : 0;
}
READ8_MEMBER(amusco_state::hack_bill_r)
{
// actually set by IRQ4
return BIT(ioport("IN1")->read(), 2) ? 0 : 1;
}
/************************* /*************************
* Memory Map Information * * Memory Map Information *
*************************/ *************************/
static ADDRESS_MAP_START( amusco_mem_map, AS_PROGRAM, 8, amusco_state ) static ADDRESS_MAP_START( amusco_mem_map, AS_PROGRAM, 8, amusco_state )
AM_RANGE(0x006a6, 0x006a6) AM_READ(hack_coin1_r)
AM_RANGE(0x006a8, 0x006a8) AM_READ(hack_coin2_r)
AM_RANGE(0x00000, 0x0ffff) AM_RAM
AM_RANGE(0xec000, 0xecfff) AM_RAM AM_SHARE("videoram") // placeholder
AM_RANGE(0xf8000, 0xfffff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START( draw88pkr_mem_map, AS_PROGRAM, 8, amusco_state )
AM_RANGE(0x006ae, 0x006ae) AM_READ(hack_coin1_r)
AM_RANGE(0x006b0, 0x006b0) AM_READ(hack_coin2_r)
AM_RANGE(0x0069a, 0x0069a) AM_READ(hack_bill_r)
AM_RANGE(0x00000, 0x0ffff) AM_RAM AM_RANGE(0x00000, 0x0ffff) AM_RAM
AM_RANGE(0xec000, 0xecfff) AM_RAM AM_SHARE("videoram") // placeholder AM_RANGE(0xec000, 0xecfff) AM_RAM AM_SHARE("videoram") // placeholder
AM_RANGE(0xf8000, 0xfffff) AM_ROM AM_RANGE(0xf8000, 0xfffff) AM_ROM
@ -273,14 +240,16 @@ WRITE8_MEMBER(amusco_state::output_b_w)
7654 3210 7654 3210
---- --x- Unknown lamp (lits when all holds/disc are ON. Could be a Cancel lamp in an inverted Hold system). ---- --x- Unknown lamp (lits when all holds/disc are ON. Could be a Cancel lamp in an inverted Hold system).
---- -x-- Start/Draw lamp. ---- -x-- Start/Draw lamp.
---x ---- Coin counter. ---x ---- Low when sound data queued.
xxx- x--x Unknown. --x- ---- Safe to shutdown?
-x-- ---- Allow NMI?
x--- x--x Unknown.
*/ */
output().set_lamp_value(6, (data >> 2) & 1); // Lamp 6 (Start/Draw) output().set_lamp_value(6, (data >> 2) & 1); // Lamp 6 (Start/Draw)
output().set_lamp_value(7, (data >> 1) & 1); // Lamp 7 (Unknown) output().set_lamp_value(7, (data >> 1) & 1); // Lamp 7 (Unknown)
machine().bookkeeping().coin_counter_w(0, ~data & 0x10); // Coin counter //machine().bookkeeping().coin_counter_w(0, ~data & 0x10); // Probably not coin-related
// logerror("Writing %02Xh to PPI output B\n", data); // logerror("Writing %02Xh to PPI output B\n", data);
} }
@ -308,7 +277,39 @@ READ8_MEMBER(amusco_state::lpt_status_r)
WRITE8_MEMBER(amusco_state::lpt_data_w) WRITE8_MEMBER(amusco_state::lpt_data_w)
{ {
logerror("Writing %02Xh to printer\n", data); switch (data)
{
case 0x10: // NCR: Clear all printer and interface functions
logerror("Writing DLE to printer\n");
break;
case 0x11:
logerror("Writing DC1 to printer\n");
break;
case 0x12: // NCR: Select double-wide characters for one line
logerror("Writing DC2 to printer\n");
break;
case 0x14: // NCR: Feed n print lines (where n is following byte)
logerror("Writing DC4 to printer\n");
break;
case 0x17: // NCR: Print buffer contents; advance one line
logerror("Writing ETB to printer\n");
break;
case 0x19: // NCR: Perform full knife cut
logerror("Writing EM to printer\n");
break;
default:
if (data >= 0x20 && data < 0x7f)
logerror("Writing '%c' to printer\n", data);
else
logerror("Writing %02Xh to printer\n", data);
break;
}
} }
WRITE8_MEMBER(amusco_state::rtc_control_w) WRITE8_MEMBER(amusco_state::rtc_control_w)
@ -369,21 +370,26 @@ static INPUT_PORTS_START( amusco )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) // move down in service mode PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) // move down in service mode
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) // move up in service mode PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) // move up in service mode
PORT_START("IN2") // TO DO: enabling IRQ4 produces COIN ERROR message PORT_START("IN2")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 ) //PORT_WRITE_LINE_DEVICE_MEMBER("pic8259", pic8259_device, ir4_w) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(COIN_IMPULSE) PORT_WRITE_LINE_DEVICE_MEMBER(":", amusco_state, coin_irq)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) //PORT_WRITE_LINE_DEVICE_MEMBER("pic8259", pic8259_device, ir4_w) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(COIN_IMPULSE) PORT_WRITE_LINE_DEVICE_MEMBER(":", amusco_state, coin_irq)
PORT_BIT( 0xf9, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0xf9, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END INPUT_PORTS_END
static INPUT_PORTS_START( draw88pkr ) static INPUT_PORTS_START( draw88pkr )
PORT_INCLUDE( amusco ) PORT_INCLUDE( amusco )
PORT_MODIFY("IN1") PORT_MODIFY("IN1") // Doors probably still exist, though code does nothing with them
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BILL1 ) //PORT_WRITE_LINE_DEVICE_MEMBER("pic8259", pic8259_device, ir4_w) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BILL1 ) PORT_IMPULSE(COIN_IMPULSE) PORT_WRITE_LINE_DEVICE_MEMBER(":", amusco_state, coin_irq)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END INPUT_PORTS_END
WRITE_LINE_MEMBER(amusco_state::coin_irq)
{
m_pic->ir4_w(state ? CLEAR_LINE : HOLD_LINE);
}
/************************* /*************************
@ -495,8 +501,7 @@ static MACHINE_CONFIG_START( amusco, amusco_state )
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( draw88pkr, amusco ) static MACHINE_CONFIG_DERIVED( draw88pkr, amusco )
MCFG_CPU_MODIFY("maincpu") //MCFG_DEVICE_MODIFY("ppi_outputs") // Some bits are definitely different
MCFG_CPU_PROGRAM_MAP(draw88pkr_mem_map)
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -549,4 +554,4 @@ ROM_END
/* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS LAYOUT */ /* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS LAYOUT */
GAMEL( 1987, amusco, 0, amusco, amusco, driver_device, 0, ROT0, "Amusco", "American Music Poker (V1.4)", MACHINE_IMPERFECT_COLORS | MACHINE_NODEVICE_PRINTER, layout_amusco ) // palette totally wrong GAMEL( 1987, amusco, 0, amusco, amusco, driver_device, 0, ROT0, "Amusco", "American Music Poker (V1.4)", MACHINE_IMPERFECT_COLORS | MACHINE_NODEVICE_PRINTER, layout_amusco ) // palette totally wrong
GAMEL( 1988, draw88pkr, 0, draw88pkr,draw88pkr,driver_device, 0, ROT0, "BTE, Inc.", "Draw 88 Poker (V2.0)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_COLORS | MACHINE_NODEVICE_PRINTER, layout_amusco ) GAMEL( 1988, draw88pkr, 0, draw88pkr,draw88pkr,driver_device, 0, ROT0, "BTE, Inc.", "Draw 88 Poker (V2.0)", MACHINE_IMPERFECT_COLORS | MACHINE_NODEVICE_PRINTER, layout_amusco ) // palette totally wrong