just a little more cleanup (nw)

This commit is contained in:
Vas Crabb 2018-03-02 21:45:23 +11:00
parent 9663775fba
commit 54701050f7
5 changed files with 318 additions and 282 deletions

View File

@ -22,16 +22,55 @@ Inputs and Dip Switches by Stephh
class acefruit_state : public driver_device
{
public:
acefruit_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
enum
{
TIMER_ACEFRUIT_REFRESH
};
acefruit_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
m_spriteram(*this, "spriteram"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette") { }
m_palette(*this, "palette"),
m_port_payout(*this, "PAYOUT"),
m_port_coinage(*this, "COINAGE"),
m_lamps(*this, "lamp%u", 0U),
m_solenoids(*this, "solenoid%u", 0U),
m_refresh_timer(nullptr)
{ }
DECLARE_DRIVER_INIT(sidewndr);
DECLARE_CUSTOM_INPUT_MEMBER(sidewndr_payout_r);
DECLARE_CUSTOM_INPUT_MEMBER(starspnr_coinage_r);
DECLARE_CUSTOM_INPUT_MEMBER(starspnr_payout_r);
void acefruit(machine_config &config);
protected:
DECLARE_WRITE8_MEMBER(acefruit_colorram_w);
DECLARE_WRITE8_MEMBER(acefruit_coin_w);
DECLARE_WRITE8_MEMBER(acefruit_sound_w);
DECLARE_WRITE8_MEMBER(acefruit_lamp_w);
DECLARE_WRITE8_MEMBER(acefruit_solenoid_w);
virtual void machine_start() override;
virtual void video_start() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
DECLARE_PALETTE_INIT(acefruit);
uint32_t screen_update_acefruit(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(acefruit_vblank);
void acefruit_update_irq(int vpos);
void acefruit_io(address_map &map);
void acefruit_map(address_map &map);
private:
required_device<cpu_device> m_maincpu;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_colorram;
@ -39,32 +78,11 @@ public:
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
optional_ioport m_port_payout;
optional_ioport m_port_coinage;
output_finder<16> m_lamps;
output_finder<8> m_solenoids;
emu_timer *m_refresh_timer;
DECLARE_WRITE8_MEMBER(acefruit_colorram_w);
DECLARE_WRITE8_MEMBER(acefruit_coin_w);
DECLARE_WRITE8_MEMBER(acefruit_sound_w);
DECLARE_WRITE8_MEMBER(acefruit_lamp_w);
DECLARE_WRITE8_MEMBER(acefruit_solenoid_w);
DECLARE_CUSTOM_INPUT_MEMBER(sidewndr_payout_r);
DECLARE_CUSTOM_INPUT_MEMBER(starspnr_coinage_r);
DECLARE_CUSTOM_INPUT_MEMBER(starspnr_payout_r);
DECLARE_DRIVER_INIT(sidewndr);
virtual void video_start() override;
DECLARE_PALETTE_INIT(acefruit);
uint32_t screen_update_acefruit(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(acefruit_vblank);
void acefruit_update_irq(int vpos);
enum
{
TIMER_ACEFRUIT_REFRESH
};
void acefruit(machine_config &config);
void acefruit_io(address_map &map);
void acefruit_map(address_map &map);
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
};
@ -109,6 +127,12 @@ void acefruit_state::device_timer(emu_timer &timer, device_timer_id id, int para
}
}
void acefruit_state::machine_start()
{
m_lamps.resolve();
m_solenoids.resolve();
}
void acefruit_state::video_start()
{
m_refresh_timer = timer_alloc(TIMER_ACEFRUIT_REFRESH);
@ -211,9 +235,9 @@ CUSTOM_INPUT_MEMBER(acefruit_state::sidewndr_payout_r)
switch (bit_mask)
{
case 0x01:
return ((ioport("PAYOUT")->read() & bit_mask) >> 0);
return ((m_port_payout->read() & bit_mask) >> 0);
case 0x02:
return ((ioport("PAYOUT")->read() & bit_mask) >> 1);
return ((m_port_payout->read() & bit_mask) >> 1);
default:
logerror("sidewndr_payout_r : invalid %02X bit_mask\n",bit_mask);
return 0;
@ -227,13 +251,13 @@ CUSTOM_INPUT_MEMBER(acefruit_state::starspnr_coinage_r)
switch (bit_mask)
{
case 0x01:
return ((ioport("COINAGE")->read() & bit_mask) >> 0);
return ((m_port_coinage->read() & bit_mask) >> 0);
case 0x02:
return ((ioport("COINAGE")->read() & bit_mask) >> 1);
return ((m_port_coinage->read() & bit_mask) >> 1);
case 0x04:
return ((ioport("COINAGE")->read() & bit_mask) >> 2);
return ((m_port_coinage->read() & bit_mask) >> 2);
case 0x08:
return ((ioport("COINAGE")->read() & bit_mask) >> 3);
return ((m_port_coinage->read() & bit_mask) >> 3);
default:
logerror("starspnr_coinage_r : invalid %02X bit_mask\n",bit_mask);
return 0;
@ -247,11 +271,11 @@ CUSTOM_INPUT_MEMBER(acefruit_state::starspnr_payout_r)
switch (bit_mask)
{
case 0x01:
return ((ioport("PAYOUT")->read() & bit_mask) >> 0);
return ((m_port_payout->read() & bit_mask) >> 0);
case 0x02:
return ((ioport("PAYOUT")->read() & bit_mask) >> 1);
return ((m_port_payout->read() & bit_mask) >> 1);
case 0x04:
return ((ioport("PAYOUT")->read() & bit_mask) >> 2);
return ((m_port_payout->read() & bit_mask) >> 2);
default:
logerror("starspnr_payout_r : invalid %02X bit_mask\n",bit_mask);
return 0;
@ -275,22 +299,14 @@ WRITE8_MEMBER(acefruit_state::acefruit_sound_w)
WRITE8_MEMBER(acefruit_state::acefruit_lamp_w)
{
int i;
for( i = 0; i < 8; i++ )
{
output().set_lamp_value( ( offset * 8 ) + i, ( data >> i ) & 1 );
}
for (int i = 0; i < 8; i++)
m_lamps[(offset << 3) | i] = BIT(data, i);
}
WRITE8_MEMBER(acefruit_state::acefruit_solenoid_w)
{
int i;
for( i = 0; i < 8; i++ )
{
output().set_indexed_value( "solenoid", i, ( data >> i ) & 1 );
}
for (int i = 0; i < 8; i++)
m_solenoids[i] = BIT(data, i);
}
PALETTE_INIT_MEMBER(acefruit_state, acefruit)

View File

@ -59,8 +59,13 @@ public:
, m_maincpu(*this, "maincpu")
, m_beep(*this, "beeper")
, m_keyboard(*this, "LINE.%u", 0)
{ }
{ }
void glasgow(machine_config &config);
void amsterd(machine_config &config);
void dallas32(machine_config &config);
protected:
DECLARE_WRITE16_MEMBER(glasgow_lcd_w);
DECLARE_WRITE16_MEMBER(glasgow_lcd_flag_w);
DECLARE_READ16_MEMBER(glasgow_keys_r);
@ -88,12 +93,10 @@ public:
DECLARE_MACHINE_START(glasgow);
DECLARE_MACHINE_RESET(glasgow);
void glasgow(machine_config &config);
void dallas32(machine_config &config);
void amsterd(machine_config &config);
void amsterd_mem(address_map &map);
void dallas32_mem(address_map &map);
void glasgow_mem(address_map &map);
private:
uint8_t m_lcd_shift_counter;
uint8_t m_led7;
@ -117,15 +120,15 @@ private:
required_ioport_array<8> m_keyboard;
};
typedef struct
{
struct BOARD_FIELD // FIXME: global structure
{
uint8_t field;
uint8_t piece;
} BOARD_FIELD;
} BOARD_FIELD;
BOARD_FIELD l_board[8][8];
BOARD_FIELD l_board[8][8]; // FIXME: mutable global state
/* starts at bottom left corner */
/* starts at bottom left corner */
const BOARD_FIELD l_start_board[8][8] =
{
{ {7,10}, {6,8}, {5,9}, {4,11}, {3,12}, {2,9}, {1,8}, {0,10} },
@ -730,6 +733,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(glasgow_state::amsterd)
glasgow(config);
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(amsterd_mem)
@ -737,10 +741,11 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(glasgow_state::dallas32)
glasgow(config);
/* basic machine hardware */
MCFG_CPU_REPLACE("maincpu", M68020, 14000000)
MCFG_CPU_PROGRAM_MAP(dallas32_mem)
MCFG_MACHINE_START_OVERRIDE(glasgow_state, dallas32 )
MCFG_MACHINE_START_OVERRIDE(glasgow_state, dallas32)
MCFG_DEVICE_REMOVE("nmi_timer")
MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", glasgow_state, update_nmi32, attotime::from_hz(50))

View File

@ -75,12 +75,8 @@ ToDo:
#include "gts1.lh"
#define VERBOSE 1
#include "logmacro.h"
#if VERBOSE
#define LOG(x) logerror x
#else
#define LOG(x)
#endif
class gts1_state : public genpin_class
{
@ -88,11 +84,15 @@ public:
gts1_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_dips(*this, "DSW%u", 0)
, m_switches(*this, "X.%u", 0)
{ }
DECLARE_DRIVER_INIT(gts1);
void gts1(machine_config &config);
protected:
DECLARE_READ8_MEMBER (gts1_solenoid_r);
DECLARE_WRITE8_MEMBER(gts1_solenoid_w);
DECLARE_READ8_MEMBER (gts1_switches_r);
@ -106,13 +106,16 @@ public:
DECLARE_WRITE8_MEMBER(gts1_io_w);
DECLARE_READ8_MEMBER (gts1_pa_r);
DECLARE_WRITE8_MEMBER(gts1_do_w);
void gts1(machine_config &config);
virtual void machine_reset() override;
void gts1_map(address_map &map);
void gts1_data(address_map &map);
void gts1_io(address_map &map);
void gts1_map(address_map &map);
private:
virtual void machine_reset() override;
required_device<cpu_device> m_maincpu;
required_ioport_array<3> m_dips;
required_ioport_array<5> m_switches;
uint8_t m_strobe; //!< switches strobe lines (5 lower bits used)
uint8_t m_nvram_addr; //!< NVRAM address
@ -346,7 +349,7 @@ DRIVER_INIT_MEMBER(gts1_state,gts1)
READ8_MEMBER (gts1_state::gts1_solenoid_r)
{
uint8_t data = 0;
LOG(("%s: solenoid[%02x] -> %x\n", __FUNCTION__, offset, data));
LOG("%s: solenoid[%02x] -> %x\n", __FUNCTION__, offset, data);
return data;
}
@ -355,45 +358,45 @@ WRITE8_MEMBER(gts1_state::gts1_solenoid_w)
switch (offset)
{
case 0:
LOG(("%s: outhole <- %x\n", __FUNCTION__, data));
LOG("%s: outhole <- %x\n", __FUNCTION__, data);
break;
case 1:
LOG(("%s: knocker <- %x\n", __FUNCTION__, data));
LOG("%s: knocker <- %x\n", __FUNCTION__, data);
break;
case 2:
LOG(("%s: tens chime <- %x\n", __FUNCTION__, data));
LOG("%s: tens chime <- %x\n", __FUNCTION__, data);
break;
case 3:
LOG(("%s: hundreds chime <- %x\n", __FUNCTION__, data));
LOG("%s: hundreds chime <- %x\n", __FUNCTION__, data);
break;
case 4:
LOG(("%s: thousands chime <- %x\n", __FUNCTION__, data));
LOG("%s: thousands chime <- %x\n", __FUNCTION__, data);
break;
case 5:
LOG(("%s: no. 6 <- %x\n", __FUNCTION__, data));
LOG("%s: no. 6 <- %x\n", __FUNCTION__, data);
break;
case 6:
LOG(("%s: no. 7 <- %x\n", __FUNCTION__, data));
LOG("%s: no. 7 <- %x\n", __FUNCTION__, data);
break;
case 7:
LOG(("%s: no. 8 <- %x\n", __FUNCTION__, data));
LOG("%s: no. 8 <- %x\n", __FUNCTION__, data);
break;
case 8: case 9: case 10: case 11:
LOG(("%s: not used [%x] <- %x\n", __FUNCTION__, offset, data));
LOG("%s: not used [%x] <- %x\n", __FUNCTION__, offset, data);
break;
case 12: // spare
LOG(("%s: spare [%x] <- %x\n", __FUNCTION__, offset, data));
LOG("%s: spare [%x] <- %x\n", __FUNCTION__, offset, data);
break;
case 13: // RAM control E2
LOG(("%s: RAM control E2 <- %x\n", __FUNCTION__, data));
LOG("%s: RAM control E2 <- %x\n", __FUNCTION__, data);
m_nvram_e2 = (data & 1) ? true : false;
break;
case 14: // RAM control W/R
LOG(("%s: RAM control W/R <- %x\n", __FUNCTION__, data));
LOG("%s: RAM control W/R <- %x\n", __FUNCTION__, data);
m_nvram_wr = (data & 1) ? true : false;
break;
case 15: // spare
LOG(("%s: spare [%x] <- %x\n", __FUNCTION__, offset, data));
LOG("%s: spare [%x] <- %x\n", __FUNCTION__, offset, data);
break;
}
}
@ -409,13 +412,13 @@ READ8_MEMBER (gts1_state::gts1_switches_r)
}
}
}
LOG(("%s: switches[%x,%x] -> %x\n", __FUNCTION__, m_strobe, offset, data));
LOG("%s: switches[%x,%x] -> %x\n", __FUNCTION__, m_strobe, offset, data);
return data;
}
WRITE8_MEMBER(gts1_state::gts1_switches_w)
{
LOG(("%s: switches[%x] <- %x\n", __FUNCTION__, offset, data));
LOG("%s: switches[%x] <- %x\n", __FUNCTION__, offset, data);
if (offset < 5) {
// outputs O-0 to O-4 are the 5 strobe lines
m_strobe = (m_strobe & ~(1 << offset)) | ((data & 1) << offset);
@ -462,7 +465,7 @@ WRITE8_MEMBER(gts1_state::gts1_display_w)
};
uint8_t a = ttl7448_mod[(data >> 0) & 15];
uint8_t b = ttl7448_mod[(data >> 4) & 15];
// LOG(("%s: offset:%d data:%02x a:%02x b:%02x\n", __FUNCTION__, offset, data, a, b));
// LOG("%s: offset:%d data:%02x a:%02x b:%02x\n", __FUNCTION__, offset, data, a, b);
if ((offset % 8) < 7) {
output().set_indexed_value("digit8_", offset, a);
output().set_indexed_value("digit8_", offset + 16, b);
@ -505,7 +508,7 @@ READ8_MEMBER (gts1_state::gts1_nvram_r)
uint8_t* nvram = memregion("nvram")->base();
assert(nvram != nullptr);
data = nvram[m_nvram_addr];
LOG(("%s: nvram[%02x] -> %x\n", __FUNCTION__, m_nvram_addr, data));
LOG("%s: nvram[%02x] -> %x\n", __FUNCTION__, m_nvram_addr, data);
}
break;
case 1: // group B
@ -533,7 +536,7 @@ WRITE8_MEMBER(gts1_state::gts1_nvram_w)
break;
case 2: // group C - data bits 3:0 of NVRAM
if (m_nvram_wr && m_nvram_e2) {
LOG(("%s: nvram[%02x] <- %x\n", __FUNCTION__, m_nvram_addr, data & 15));
LOG("%s: nvram[%02x] <- %x\n", __FUNCTION__, m_nvram_addr, data & 15);
uint8_t* nvram = memregion("nvram")->base();
assert(nvram != nullptr);
nvram[m_nvram_addr] = data & 15;
@ -553,7 +556,7 @@ READ8_MEMBER (gts1_state::gts1_lamp_apm_r)
switch (offset) {
case 0: // group A switches S01-S04, S09-S12, S17-S20
if (m_z30_out & 1) {
uint8_t dsw0 = ioport("DSW0")->read();
uint8_t dsw0 = m_dips[0]->read();
if (0 == BIT(dsw0,0)) // S01
data &= ~(1 << 3);
if (0 == BIT(dsw0,1)) // S02
@ -564,7 +567,7 @@ READ8_MEMBER (gts1_state::gts1_lamp_apm_r)
data &= ~(1 << 0);
}
if (m_z30_out & 2) {
uint8_t dsw1 = ioport("DSW1")->read();
uint8_t dsw1 = m_dips[1]->read();
if (0 == BIT(dsw1,0)) // S09
data &= ~(1 << 0);
if (0 == BIT(dsw1,1)) // S10
@ -575,7 +578,7 @@ READ8_MEMBER (gts1_state::gts1_lamp_apm_r)
data &= ~(1 << 3);
}
if (m_z30_out & 4) {
uint8_t dsw2 = ioport("DSW2")->read();
uint8_t dsw2 = m_dips[2]->read();
if (0 == BIT(dsw2,0)) // S17
data &= ~(1 << 0);
if (0 == BIT(dsw2,1)) // S18
@ -588,7 +591,7 @@ READ8_MEMBER (gts1_state::gts1_lamp_apm_r)
break;
case 1: // group B switches S05-S08, S09-S12, S17-S20
if (m_z30_out & 1) {
uint8_t dsw0 = ioport("DSW0")->read();
uint8_t dsw0 = m_dips[0]->read();
if (0 == BIT(dsw0,4)) // S05
data &= ~(1 << 3);
if (0 == BIT(dsw0,5)) // S06
@ -599,7 +602,7 @@ READ8_MEMBER (gts1_state::gts1_lamp_apm_r)
data &= ~(1 << 0);
}
if (m_z30_out & 2) {
uint8_t dsw1 = ioport("DSW1")->read();
uint8_t dsw1 = m_dips[1]->read();
if (0 == BIT(dsw1,4)) // S13
data &= ~(1 << 0);
if (0 == BIT(dsw1,5)) // S14
@ -610,7 +613,7 @@ READ8_MEMBER (gts1_state::gts1_lamp_apm_r)
data &= ~(1 << 3);
}
if (m_z30_out & 4) {
uint8_t dsw2 = ioport("DSW2")->read();
uint8_t dsw2 = m_dips[2]->read();
if (0 == BIT(dsw2,4)) // S21
data &= ~(1 << 0);
if (0 == BIT(dsw2,5)) // S22
@ -654,13 +657,13 @@ WRITE8_MEMBER(gts1_state::gts1_lamp_apm_w)
READ8_MEMBER (gts1_state::gts1_io_r)
{
const uint8_t data = 0x0f;
LOG(("%s: unmapped io[%02x] -> %x\n", __FUNCTION__, offset, data));
LOG("%s: unmapped io[%02x] -> %x\n", __FUNCTION__, offset, data);
return data;
}
WRITE8_MEMBER(gts1_state::gts1_io_w)
{
LOG(("%s: unmapped io[%02x] <- %x\n", __FUNCTION__, offset, data));
LOG("%s: unmapped io[%02x] <- %x\n", __FUNCTION__, offset, data);
}
READ8_MEMBER (gts1_state::gts1_pa_r)
@ -668,7 +671,7 @@ READ8_MEMBER (gts1_state::gts1_pa_r)
// return ROM nibble
uint8_t *ROM = memregion("maincpu")->base();
uint8_t data = ROM[0x2000 + m_6351_addr] & 0x0f;
LOG(("%s: ROM[%03x]:%02x\n", __FUNCTION__, m_6351_addr, data));
LOG("%s: ROM[%03x]:%02x\n", __FUNCTION__, m_6351_addr, data);
return data;
}
@ -676,7 +679,7 @@ WRITE8_MEMBER(gts1_state::gts1_do_w)
{
// write address lines (DO1-4 to A0-3, DIO1-4 to A4-7)
m_6351_addr = (m_6351_addr & 0x300) | data;
LOG(("%s: ROM addr:%02x\n", __FUNCTION__, m_6351_addr));
LOG("%s: ROM addr:%02x\n", __FUNCTION__, m_6351_addr);
}

View File

@ -68,12 +68,12 @@ enum int_levels
*
*************************************/
WRITE_LINE_MEMBER(jpmsys5_state::generate_tms34061_interrupt)
WRITE_LINE_MEMBER(jpmsys5v_state::generate_tms34061_interrupt)
{
m_maincpu->set_input_line(INT_TMS34061, state);
}
WRITE16_MEMBER(jpmsys5_state::sys5_tms34061_w)
WRITE16_MEMBER(jpmsys5v_state::sys5_tms34061_w)
{
int func = (offset >> 19) & 3;
int row = (offset >> 7) & 0x1ff;
@ -96,7 +96,7 @@ WRITE16_MEMBER(jpmsys5_state::sys5_tms34061_w)
m_tms34061->write(space, col | 1, row, func, data & 0xff);
}
READ16_MEMBER(jpmsys5_state::sys5_tms34061_r)
READ16_MEMBER(jpmsys5v_state::sys5_tms34061_r)
{
uint16_t data = 0;
int func = (offset >> 19) & 3;
@ -122,7 +122,7 @@ READ16_MEMBER(jpmsys5_state::sys5_tms34061_r)
return data;
}
WRITE16_MEMBER(jpmsys5_state::ramdac_w)
WRITE16_MEMBER(jpmsys5v_state::ramdac_w)
{
if (offset == 0)
{
@ -147,7 +147,7 @@ WRITE16_MEMBER(jpmsys5_state::ramdac_w)
}
}
uint32_t jpmsys5_state::screen_update_jpmsys5v(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
uint32_t jpmsys5v_state::screen_update_jpmsys5v(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int x, y;
@ -179,12 +179,11 @@ uint32_t jpmsys5_state::screen_update_jpmsys5v(screen_device &screen, bitmap_rgb
void jpmsys5_state::sys5_draw_lamps()
{
int i;
for (i = 0; i <8; i++)
for (int i = 0; i < 8; i++)
{
output().set_lamp_value( (16*m_lamp_strobe)+i, (m_muxram[(4*m_lamp_strobe)] & (1 << i)) !=0);
output().set_lamp_value((16*m_lamp_strobe)+i+8, (m_muxram[(4*m_lamp_strobe) +1 ] & (1 << i)) !=0);
output().set_indexed_value("sys5led",(8*m_lamp_strobe)+i,(m_muxram[(4*m_lamp_strobe) +2 ] & (1 << i)) !=0);
m_lamps [(m_lamp_strobe << 4) | i] = BIT(m_muxram[(m_lamp_strobe << 2) | 0], i);
m_lamps [(m_lamp_strobe << 4) | i | 8] = BIT(m_muxram[(m_lamp_strobe << 2) | 1], i);
m_sys5leds[(m_lamp_strobe << 3) | i] = BIT(m_muxram[(m_lamp_strobe << 2) | 2], i);
}
}
@ -194,11 +193,9 @@ void jpmsys5_state::sys5_draw_lamps()
*
****************************************/
WRITE16_MEMBER(jpmsys5_state::rombank_w)
WRITE16_MEMBER(jpmsys5v_state::rombank_w)
{
uint8_t *rom = memregion("maincpu")->base();
data &= 0x1f;
membank("bank1")->set_base(&rom[0x20000 + 0x20000 * data]);
m_rombank->set_entry(data & 0x1f);
}
READ16_MEMBER(jpmsys5_state::coins_r)
@ -304,7 +301,7 @@ ADDRESS_MAP_START(jpmsys5_state::m68000_awp_map_saa)
AM_RANGE(0x04c100, 0x04c105) AM_READWRITE(jpm_upd7759_r, jpm_upd7759_w) // do the SAA boards have the UPD?
ADDRESS_MAP_END
ADDRESS_MAP_START(jpmsys5_state::m68000_map)
ADDRESS_MAP_START(jpmsys5v_state::m68000_map)
AM_IMPORT_FROM(jpm_sys5_common_map)
AM_RANGE(0x01fffe, 0x01ffff) AM_WRITE(rombank_w) // extra on video system (rom board?) (although regular games do write here?)
AM_RANGE(0x020000, 0x03ffff) AM_ROMBANK("bank1") // extra on video system (rom board?)
@ -318,63 +315,56 @@ ADDRESS_MAP_END
/*************************************
*
* Touchscreen controller simulation
*
*************************************/
/*************************************
*
* Touchscreen controller simulation
*
*************************************/
/* Serial bit transmission callback */
TIMER_CALLBACK_MEMBER(jpmsys5_state::touch_cb)
TIMER_CALLBACK_MEMBER(jpmsys5v_state::touch_cb)
{
switch (m_touch_state)
{
case IDLE:
{
break;
}
case START:
{
m_touch_shift_cnt = 0;
m_acia6850_2->write_rxd(0);
m_touch_state = DATA;
break;
}
case DATA:
{
m_acia6850_2->write_rxd((m_touch_data[m_touch_data_count] >> (m_touch_shift_cnt)) & 1);
case IDLE:
break;
if (++m_touch_shift_cnt == 8)
m_touch_state = STOP1;
case START:
m_touch_shift_cnt = 0;
m_acia6850[2]->write_rxd(0);
m_touch_state = DATA;
break;
break;
}
case STOP1:
case DATA:
m_acia6850[2]->write_rxd((m_touch_data[m_touch_data_count] >> (m_touch_shift_cnt)) & 1);
if (++m_touch_shift_cnt == 8)
m_touch_state = STOP1;
break;
case STOP1:
m_acia6850[2]->write_rxd(1);
m_touch_state = STOP2;
break;
case STOP2:
m_acia6850[2]->write_rxd(1);
if (++m_touch_data_count == 3)
{
m_acia6850_2->write_rxd(1);
m_touch_state = STOP2;
break;
m_touch_timer->reset();
m_touch_state = IDLE;
}
case STOP2:
else
{
m_acia6850_2->write_rxd(1);
if (++m_touch_data_count == 3)
{
m_touch_timer->reset();
m_touch_state = IDLE;
}
else
{
m_touch_state = START;
}
break;
m_touch_state = START;
}
break;
}
}
INPUT_CHANGED_MEMBER(jpmsys5_state::touchscreen_press)
INPUT_CHANGED_MEMBER(jpmsys5v_state::touchscreen_press)
{
if (newval == 0)
{
@ -382,8 +372,8 @@ INPUT_CHANGED_MEMBER(jpmsys5_state::touchscreen_press)
/* Each touch screen packet is 3 bytes */
m_touch_data[0] = 0x2a;
m_touch_data[1] = 0x7 - (ioport("TOUCH_Y")->read() >> 5) + 0x30;
m_touch_data[2] = (ioport("TOUCH_X")->read() >> 5) + 0x30;
m_touch_data[1] = 0x7 - (m_touch_axes[1]->read() >> 5) + 0x30;
m_touch_data[2] = (m_touch_axes[0]->read() >> 5) + 0x30;
/* Start sending the data to the 68000 serially */
m_touch_data_count = 0;
@ -453,7 +443,7 @@ static INPUT_PORTS_START( monopoly )
PORT_BIT( 0xc3, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("TOUCH_PUSH")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, jpmsys5_state,touchscreen_press, nullptr)
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, jpmsys5v_state,touchscreen_press, nullptr)
PORT_START("TOUCH_X")
PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(45) PORT_KEYDELTA(15)
@ -476,37 +466,26 @@ READ8_MEMBER(jpmsys5_state::u29_porta_r)
{
int meter_bit =0;
if (m_meters != nullptr)
if (m_meters)
{
int combined_meter = m_meters->GetActivity(0) | m_meters->GetActivity(1) |
m_meters->GetActivity(2) | m_meters->GetActivity(3) |
m_meters->GetActivity(4) | m_meters->GetActivity(5) |
m_meters->GetActivity(6) | m_meters->GetActivity(7);
if(combined_meter)
{
if (combined_meter)
meter_bit = 0x80;
}
else
{
meter_bit = 0x00;
}
return m_direct_port->read() | meter_bit;
}
else
return m_direct_port->read() | meter_bit;
return m_direct_port->read() | meter_bit;
}
WRITE8_MEMBER(jpmsys5_state::u29_portb_w)
{
if (m_meters != nullptr)
if (m_meters)
{
for (int meter = 0; meter < 8; meter ++)
{
for (int meter = 0; meter < 8; meter++)
m_meters->update(meter, (data & (1 << meter)));
}
}
}
@ -539,11 +518,8 @@ WRITE_LINE_MEMBER(jpmsys5_state::u26_o1_callback)
{
if (!state) //falling edge
{
m_lamp_strobe++;
if (m_lamp_strobe >15)
{
m_lamp_strobe =0;
}
if (++m_lamp_strobe > 15)
m_lamp_strobe = 0;
}
sys5_draw_lamps();
}
@ -577,36 +553,27 @@ WRITE_LINE_MEMBER(jpmsys5_state::a2_tx_w)
m_a2_data_out = state;
}
WRITE_LINE_MEMBER(jpmsys5_state::write_acia_clock)
{
m_acia6850_0->write_txc(state);
m_acia6850_0->write_rxc(state);
m_acia6850_1->write_txc(state);
m_acia6850_1->write_rxc(state);
m_acia6850_2->write_txc(state);
m_acia6850_2->write_rxc(state);
}
/*************************************
*
* Initialisation
*
*************************************/
MACHINE_START_MEMBER(jpmsys5_state,jpmsys5v)
void jpmsys5v_state::machine_start()
{
membank("bank1")->set_base(memregion("maincpu")->base()+0x20000);
m_touch_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(jpmsys5_state::touch_cb),this));
jpmsys5_state::machine_start();
m_rombank->configure_entries(0, 32, memregion("maincpu")->base() + 0x20000, 0x20000);
m_rombank->set_entry(0);
m_touch_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(jpmsys5v_state::touch_cb),this));
}
MACHINE_RESET_MEMBER(jpmsys5_state,jpmsys5v)
void jpmsys5v_state::machine_reset()
{
jpmsys5_state::machine_reset();
m_touch_timer->reset();
m_touch_state = IDLE;
m_acia6850_2->write_rxd(1);
m_acia6850_2->write_dcd(0);
m_vfd->reset();
}
@ -616,40 +583,42 @@ MACHINE_RESET_MEMBER(jpmsys5_state,jpmsys5v)
*
*************************************/
MACHINE_CONFIG_START(jpmsys5_state::jpmsys5v)
MACHINE_CONFIG_START(jpmsys5v_state::jpmsys5v)
MCFG_CPU_ADD("maincpu", M68000, XTAL(8'000'000))
MCFG_CPU_PROGRAM_MAP(m68000_map)
MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a0_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5v_state, a0_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5v_state, acia_irq))
MCFG_DEVICE_ADD("acia6850_1", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a1_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5v_state, a1_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5v_state, acia_irq))
MCFG_DEVICE_ADD("acia6850_2", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a2_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5v_state, a2_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5v_state, acia_irq))
MCFG_DEVICE_ADD("acia_clock", CLOCK, 10000) // What are the correct ACIA clocks ?
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(jpmsys5_state, write_acia_clock))
MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("acia6850_0", acia6850_device, write_txc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_0", acia6850_device, write_rxc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_1", acia6850_device, write_txc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_1", acia6850_device, write_rxc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_2", acia6850_device, write_txc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_2", acia6850_device, write_rxc))
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_S16LF01_ADD("vfd",0)//for debug ports
MCFG_MACHINE_START_OVERRIDE(jpmsys5_state,jpmsys5v)
MCFG_MACHINE_RESET_OVERRIDE(jpmsys5_state,jpmsys5v)
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL(40'000'000) / 4, 676, 20*4, 147*4, 256, 0, 254)
MCFG_SCREEN_UPDATE_DRIVER(jpmsys5_state, screen_update_jpmsys5v)
MCFG_SCREEN_UPDATE_DRIVER(jpmsys5v_state, screen_update_jpmsys5v)
MCFG_DEVICE_ADD("tms34061", TMS34061, 0)
MCFG_TMS34061_ROWSHIFT(8) /* VRAM address is (row << rowshift) | col */
MCFG_TMS34061_VRAM_SIZE(0x40000) /* size of video RAM */
MCFG_TMS34061_INTERRUPT_CB(WRITELINE(jpmsys5_state, generate_tms34061_interrupt)) /* interrupt gen callback */
MCFG_TMS34061_INTERRUPT_CB(WRITELINE(jpmsys5v_state, generate_tms34061_interrupt)) /* interrupt gen callback */
MCFG_PALETTE_ADD("palette", 16)
@ -663,18 +632,18 @@ MACHINE_CONFIG_START(jpmsys5_state::jpmsys5v)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MCFG_DEVICE_ADD("6821pia", PIA6821, 0)
MCFG_PIA_READPA_HANDLER(READ8(jpmsys5_state, u29_porta_r))
MCFG_PIA_WRITEPB_HANDLER(WRITE8(jpmsys5_state, u29_portb_w))
MCFG_PIA_CA2_HANDLER(WRITELINE(jpmsys5_state, u29_ca2_w))
MCFG_PIA_CB2_HANDLER(WRITELINE(jpmsys5_state, u29_cb2_w))
MCFG_PIA_IRQA_HANDLER(WRITELINE(jpmsys5_state, pia_irq))
MCFG_PIA_IRQB_HANDLER(WRITELINE(jpmsys5_state, pia_irq))
MCFG_PIA_READPA_HANDLER(READ8(jpmsys5v_state, u29_porta_r))
MCFG_PIA_WRITEPB_HANDLER(WRITE8(jpmsys5v_state, u29_portb_w))
MCFG_PIA_CA2_HANDLER(WRITELINE(jpmsys5v_state, u29_ca2_w))
MCFG_PIA_CB2_HANDLER(WRITELINE(jpmsys5v_state, u29_cb2_w))
MCFG_PIA_IRQA_HANDLER(WRITELINE(jpmsys5v_state, pia_irq))
MCFG_PIA_IRQB_HANDLER(WRITELINE(jpmsys5v_state, pia_irq))
/* 6840 PTM */
MCFG_DEVICE_ADD("6840ptm", PTM6840, 1000000)
MCFG_PTM6840_EXTERNAL_CLOCKS(0, 0, 0)
MCFG_PTM6840_O1_CB(WRITELINE(jpmsys5_state, u26_o1_callback))
MCFG_PTM6840_IRQ_CB(WRITELINE(jpmsys5_state, ptm_irq))
MCFG_PTM6840_O1_CB(WRITELINE(jpmsys5v_state, u26_o1_callback))
MCFG_PTM6840_IRQ_CB(WRITELINE(jpmsys5v_state, ptm_irq))
MACHINE_CONFIG_END
READ16_MEMBER(jpmsys5_state::mux_awp_r)
@ -812,15 +781,16 @@ INPUT_PORTS_END
*
*************************************/
MACHINE_START_MEMBER(jpmsys5_state,jpmsys5)
void jpmsys5_state::machine_start()
{
// membank("bank1")->set_base(memregion("maincpu")->base()+0x20000);
m_lamps.resolve();
m_sys5leds.resolve();
}
MACHINE_RESET_MEMBER(jpmsys5_state,jpmsys5)
void jpmsys5_state::machine_reset()
{
m_acia6850_2->write_rxd(1);
m_acia6850_2->write_dcd(0);
m_acia6850[2]->write_rxd(1);
m_acia6850[2]->write_dcd(0);
m_vfd->reset();
}
@ -850,13 +820,16 @@ MACHINE_CONFIG_START(jpmsys5_state::jpmsys5_ym)
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_DEVICE_ADD("acia_clock", CLOCK, 10000) // What are the correct ACIA clocks ?
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(jpmsys5_state, write_acia_clock))
MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("acia6850_0", acia6850_device, write_txc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_0", acia6850_device, write_rxc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_1", acia6850_device, write_txc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_1", acia6850_device, write_rxc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_2", acia6850_device, write_txc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_2", acia6850_device, write_rxc))
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_S16LF01_ADD("vfd",0)
MCFG_MACHINE_START_OVERRIDE(jpmsys5_state,jpmsys5)
MCFG_MACHINE_RESET_OVERRIDE(jpmsys5_state,jpmsys5)
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("upd7759", UPD7759, UPD7759_STANDARD_CLOCK)
@ -903,13 +876,16 @@ MACHINE_CONFIG_START(jpmsys5_state::jpmsys5)
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_DEVICE_ADD("acia_clock", CLOCK, 10000) // What are the correct ACIA clocks ?
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(jpmsys5_state, write_acia_clock))
MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("acia6850_0", acia6850_device, write_txc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_0", acia6850_device, write_rxc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_1", acia6850_device, write_txc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_1", acia6850_device, write_rxc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_2", acia6850_device, write_txc))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia6850_2", acia6850_device, write_rxc))
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_S16LF01_ADD("vfd",0)
MCFG_MACHINE_START_OVERRIDE(jpmsys5_state,jpmsys5)
MCFG_MACHINE_RESET_OVERRIDE(jpmsys5_state,jpmsys5)
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("upd7759", UPD7759, UPD7759_STANDARD_CLOCK)
@ -1036,8 +1012,8 @@ ROM_END
/* Video based titles */
GAME( 1994, monopoly , 0 , jpmsys5v, monopoly, jpmsys5_state, 0, ROT0, "JPM", "Monopoly (JPM) (SYSTEM5 VIDEO, set 1)", 0 )
GAME( 1994, monopolya , monopoly , jpmsys5v, monopoly, jpmsys5_state, 0, ROT0, "JPM", "Monopoly (JPM) (SYSTEM5 VIDEO, set 2)", 0 )
GAME( 1995, monoplcl , monopoly , jpmsys5v, monopoly, jpmsys5_state, 0, ROT0, "JPM", "Monopoly Classic (JPM) (SYSTEM5 VIDEO)", 0 )
GAME( 1995, monopldx , 0 , jpmsys5v, monopoly, jpmsys5_state, 0, ROT0, "JPM", "Monopoly Deluxe (JPM) (SYSTEM5 VIDEO)", 0 )
GAME( 199?, cashcade , 0 , jpmsys5v, monopoly, jpmsys5_state, 0, ROT0, "JPM", "Cashcade (JPM) (SYSTEM5 VIDEO)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) // shows a loading error.. is the set incomplete?
GAME( 1994, monopoly , 0 , jpmsys5v, monopoly, jpmsys5v_state, 0, ROT0, "JPM", "Monopoly (JPM) (SYSTEM5 VIDEO, set 1)", 0 )
GAME( 1994, monopolya , monopoly , jpmsys5v, monopoly, jpmsys5v_state, 0, ROT0, "JPM", "Monopoly (JPM) (SYSTEM5 VIDEO, set 2)", 0 )
GAME( 1995, monoplcl , monopoly , jpmsys5v, monopoly, jpmsys5v_state, 0, ROT0, "JPM", "Monopoly Classic (JPM) (SYSTEM5 VIDEO)", 0 )
GAME( 1995, monopldx , 0 , jpmsys5v, monopoly, jpmsys5v_state, 0, ROT0, "JPM", "Monopoly Deluxe (JPM) (SYSTEM5 VIDEO)", 0 )
GAME( 199?, cashcade , 0 , jpmsys5v, monopoly, jpmsys5v_state, 0, ROT0, "JPM", "Cashcade (JPM) (SYSTEM5 VIDEO)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) // shows a loading error.. is the set incomplete?

View File

@ -1,5 +1,9 @@
// license:BSD-3-Clause
// copyright-holders:Philip Bennett, James Wallace, David Haywood
#ifndef MAME_INCLUDES_JPMSYS5_H
#define MAME_INCLUDES_JPMSYS5_H
#pragma once
#include "cpu/m68000/m68000.h"
#include "machine/6821pia.h"
@ -20,54 +24,27 @@ public:
jpmsys5_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_acia6850_0(*this, "acia6850_0"),
m_acia6850_1(*this, "acia6850_1"),
m_acia6850_2(*this, "acia6850_2"),
m_acia6850(*this, "acia6850_%u", 0U),
m_upd7759(*this, "upd7759"),
m_tms34061(*this, "tms34061"),
m_vfd(*this, "vfd"),
m_direct_port(*this, "DIRECT"),
m_palette(*this, "palette"),
m_meters(*this, "meters") { }
m_meters(*this, "meters"),
m_lamps(*this, "lamp%u", 0U),
m_sys5leds(*this, "sys5led%u", 0U)
{ }
required_device<cpu_device> m_maincpu;
required_device<acia6850_device> m_acia6850_0;
required_device<acia6850_device> m_acia6850_1;
required_device<acia6850_device> m_acia6850_2;
required_device<upd7759_device> m_upd7759;
optional_device<tms34061_device> m_tms34061;
optional_device<s16lf01_device> m_vfd;
required_ioport m_direct_port;
optional_device<palette_device> m_palette;
optional_device<meters_device> m_meters; //jpmsys5v doesn't use this
void jpmsys5(machine_config &config);
void jpmsys5_ym(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
uint8_t m_palette_val[16][3];
int m_pal_addr;
int m_pal_idx;
int m_touch_state;
emu_timer *m_touch_timer;
int m_touch_data_count;
int m_touch_data[3];
int m_touch_shift_cnt;
int m_lamp_strobe;
int m_mpxclk;
int m_muxram[255];
int m_alpha_clock;
int m_chop;
uint8_t m_a0_data_out;
uint8_t m_a1_data_out;
uint8_t m_a2_data_out;
DECLARE_WRITE_LINE_MEMBER(generate_tms34061_interrupt);
DECLARE_WRITE16_MEMBER(sys5_tms34061_w);
DECLARE_READ16_MEMBER(sys5_tms34061_r);
DECLARE_WRITE16_MEMBER(ramdac_w);
DECLARE_WRITE16_MEMBER(rombank_w);
DECLARE_READ16_MEMBER(coins_r);
DECLARE_WRITE16_MEMBER(coins_w);
DECLARE_READ16_MEMBER(unk_r);
DECLARE_WRITE16_MEMBER(mux_w);
DECLARE_READ16_MEMBER(mux_r);
DECLARE_INPUT_CHANGED_MEMBER(touchscreen_press);
DECLARE_WRITE16_MEMBER(jpm_upd7759_w);
DECLARE_READ16_MEMBER(jpm_upd7759_r);
DECLARE_WRITE_LINE_MEMBER(ptm_irq);
@ -81,21 +58,80 @@ public:
DECLARE_WRITE_LINE_MEMBER(a0_tx_w);
DECLARE_WRITE_LINE_MEMBER(a1_tx_w);
DECLARE_WRITE_LINE_MEMBER(a2_tx_w);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
DECLARE_READ16_MEMBER(mux_awp_r);
DECLARE_READ16_MEMBER(coins_awp_r);
void sys5_draw_lamps();
DECLARE_MACHINE_START(jpmsys5v);
DECLARE_MACHINE_RESET(jpmsys5v);
DECLARE_MACHINE_START(jpmsys5);
DECLARE_MACHINE_RESET(jpmsys5);
uint32_t screen_update_jpmsys5v(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(touch_cb);
void jpmsys5(machine_config &config);
void jpmsys5_ym(machine_config &config);
void jpmsys5v(machine_config &config);
void jpm_sys5_common_map(address_map &map);
void m68000_awp_map(address_map &map);
void m68000_awp_map_saa(address_map &map);
void m68000_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_device_array<acia6850_device, 3> m_acia6850;
private:
required_device<upd7759_device> m_upd7759;
optional_device<s16lf01_device> m_vfd;
required_ioport m_direct_port;
optional_device<meters_device> m_meters; //jpmsys5v doesn't use this
output_finder<16 * 16> m_lamps;
output_finder<16 * 8> m_sys5leds;
int m_lamp_strobe;
int m_mpxclk;
int m_muxram[255];
int m_alpha_clock;
int m_chop;
uint8_t m_a0_data_out;
uint8_t m_a1_data_out;
uint8_t m_a2_data_out;
};
class jpmsys5v_state : public jpmsys5_state
{
public:
jpmsys5v_state(const machine_config &mconfig, device_type type, const char *tag) :
jpmsys5_state(mconfig, type, tag),
m_tms34061(*this, "tms34061"),
m_palette(*this, "palette"),
m_rombank(*this, "bank1"),
m_touch_axes(*this, { "TOUCH_X", "TOUCH_Y" }),
m_touch_timer(nullptr)
{ }
DECLARE_INPUT_CHANGED_MEMBER(touchscreen_press);
void jpmsys5v(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
DECLARE_WRITE_LINE_MEMBER(generate_tms34061_interrupt);
DECLARE_WRITE16_MEMBER(sys5_tms34061_w);
DECLARE_READ16_MEMBER(sys5_tms34061_r);
DECLARE_WRITE16_MEMBER(ramdac_w);
DECLARE_WRITE16_MEMBER(rombank_w);
uint32_t screen_update_jpmsys5v(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(touch_cb);
void m68000_map(address_map &map);
private:
required_device<tms34061_device> m_tms34061;
required_device<palette_device> m_palette;
required_memory_bank m_rombank;
required_ioport_array<2> m_touch_axes;
uint8_t m_palette_val[16][3];
int m_pal_addr;
int m_pal_idx;
int m_touch_state;
emu_timer *m_touch_timer;
int m_touch_data_count;
int m_touch_data[3];
int m_touch_shift_cnt;
};
#endif // MAME_INCLUDES_JPMSYS5_H