diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/machine/ds1386.cpp | 594 | ||||
-rw-r--r-- | src/devices/machine/ds1386.h | 210 | ||||
-rw-r--r-- | src/devices/machine/mm58167.cpp | 22 | ||||
-rw-r--r-- | src/devices/machine/pit8253.cpp | 28 | ||||
-rw-r--r-- | src/devices/machine/timehelp.h | 51 | ||||
-rw-r--r-- | src/devices/machine/timekpr.cpp | 71 | ||||
-rw-r--r-- | src/devices/video/mc6845.cpp | 6 | ||||
-rw-r--r-- | src/devices/video/mc6845.h | 1 | ||||
-rw-r--r-- | src/mame/drivers/amusco.cpp | 132 | ||||
-rw-r--r-- | src/mame/drivers/chihiro.cpp | 7 | ||||
-rw-r--r-- | src/mame/drivers/dynax.cpp | 4 | ||||
-rw-r--r-- | src/mame/drivers/indy_indigo2.cpp | 802 | ||||
-rw-r--r-- | src/tools/imgtool/imgtool.h | 35 |
13 files changed, 1236 insertions, 727 deletions
diff --git a/src/devices/machine/ds1386.cpp b/src/devices/machine/ds1386.cpp new file mode 100644 index 00000000000..91a6e2f9c06 --- /dev/null +++ b/src/devices/machine/ds1386.cpp @@ -0,0 +1,594 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/********************************************************************** + + Dallas DS1386/DS1386P RAMified Watchdog Timekeeper + + Note: Largely untested. + +**********************************************************************/ + +#include "ds1386.h" +#include "machine/timehelp.h" + +#define DISABLE_OSC (0x80) +#define DISABLE_SQW (0x40) + +#define COMMAND_TE (0x80) +#define COMMAND_IPSW (0x40) +#define COMMAND_IBH_LO (0x20) +#define COMMAND_PU_LVL (0x10) +#define COMMAND_WAM (0x08) +#define COMMAND_TDM (0x04) +#define COMMAND_WAF (0x02) +#define COMMAND_TDF (0x01) + +#define HOURS_12_24 (0x40) +#define HOURS_AM_PM (0x20) + +const device_type DS1386_8K = &device_creator<ds1386_8k_device>; +const device_type DS1386_32K = &device_creator<ds1386_32k_device>; + +ds1386_device::ds1386_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, size_t size) + : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__) + , device_nvram_interface(mconfig, *this) + , m_tod_alarm(0) + , m_watchdog_alarm(0) + , m_square(1) + , m_inta_cb(*this) + , m_intb_cb(*this) + , m_sqw_cb(*this) + , m_clock_timer(nullptr) + , m_square_timer(nullptr) + , m_watchdog_timer(nullptr) + , m_inta_timer(nullptr) + , m_intb_timer(nullptr) + , m_default_data(*this, DEVICE_SELF, size) + , m_hundredths(0) + , m_seconds(0) + , m_minutes(0) + , m_minutes_alarm(0) + , m_hours(0) + , m_hours_alarm(0) + , m_days(0) + , m_days_alarm(0) + , m_date(0) + , m_months_enables(0) + , m_years(0) + , m_ram_size(size) +{ +} + +ds1386_8k_device::ds1386_8k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : ds1386_device(mconfig, DS1386_8K, "DS1386-8K", tag, owner, clock, "ds1386_8k", 8192) +{ +} + +ds1386_32k_device::ds1386_32k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : ds1386_device(mconfig, DS1386_32K, "DS1386-32K", tag, owner, clock, "ds1386_32k", 32768) +{ +} + +void ds1386_device::safe_inta_cb(int state) +{ + if (!m_inta_cb.isnull()) + m_inta_cb(state); +} + +void ds1386_device::safe_intb_cb(int state) +{ + if (!m_intb_cb.isnull()) + m_intb_cb(state); +} + +void ds1386_device::safe_sqw_cb(int state) +{ + if (!m_sqw_cb.isnull()) + m_sqw_cb(state); +} + +void ds1386_device::device_start() +{ + m_inta_cb.resolve(); + m_intb_cb.resolve(); + m_sqw_cb.resolve(); + + m_tod_alarm = 0; + m_watchdog_alarm = 0; + m_square = 1; + + safe_inta_cb(0); + safe_intb_cb(0); + safe_sqw_cb(1); + + // allocate timers + m_clock_timer = timer_alloc(CLOCK_TIMER); + m_clock_timer->adjust(attotime::from_hz(100), 0, attotime::from_hz(100)); + m_square_timer = timer_alloc(SQUAREWAVE_TIMER); + m_square_timer->adjust(attotime::never); + m_watchdog_timer = timer_alloc(WATCHDOG_TIMER); + m_watchdog_timer->adjust(attotime::never); + m_inta_timer= timer_alloc(INTA_TIMER); + m_inta_timer->adjust(attotime::never); + m_intb_timer= timer_alloc(INTB_TIMER); + m_intb_timer->adjust(attotime::never); + + set_current_time(); + + // state saving + save_item(NAME(m_tod_alarm)); + save_item(NAME(m_watchdog_alarm)); + save_item(NAME(m_square)); + + m_ram = std::make_unique<UINT8[]>(m_ram_size); + memset(&m_ram[0], 0, m_ram_size); +} + +void ds1386_device::device_reset() +{ + m_tod_alarm = 0; + m_watchdog_alarm = 0; + m_square = 1; + + safe_inta_cb(0); + safe_intb_cb(0); + safe_sqw_cb(1); + + m_clock_timer->adjust(attotime::from_hz(100), 0, attotime::from_hz(100)); + m_square_timer->adjust(attotime::never); + m_watchdog_timer->adjust(attotime::never); + + set_current_time(); +} + + +void ds1386_device::set_current_time() +{ + system_time systime; + machine().base_datetime(systime); + + m_hundredths = 0; + m_seconds = time_helper::make_bcd(systime.local_time.second); + m_minutes = time_helper::make_bcd(systime.local_time.minute); + m_hours = time_helper::make_bcd(systime.local_time.hour); + m_days = time_helper::make_bcd(systime.local_time.weekday + 1); + m_date = time_helper::make_bcd(systime.local_time.mday); + m_months_enables = time_helper::make_bcd(systime.local_time.month + 1); + m_years = time_helper::make_bcd(systime.local_time.year % 100); +} + +void ds1386_device::time_of_day_alarm() +{ + m_ram[REGISTER_COMMAND] |= COMMAND_TDF; + m_tod_alarm = 1; + + if (m_ram[REGISTER_COMMAND] & COMMAND_IPSW) + { + safe_inta_cb(m_tod_alarm); + if (m_ram[REGISTER_COMMAND] & COMMAND_PU_LVL) + { + m_inta_timer->adjust(attotime::from_msec(3)); + } + } + else + { + safe_intb_cb(m_tod_alarm); + if (m_ram[REGISTER_COMMAND] & COMMAND_PU_LVL) + { + m_intb_timer->adjust(attotime::from_msec(3)); + } + } +} + +void ds1386_device::watchdog_alarm() +{ + m_ram[REGISTER_COMMAND] |= COMMAND_WAF; + m_watchdog_alarm = 1; + + if (m_ram[REGISTER_COMMAND] & COMMAND_IPSW) + { + safe_intb_cb(m_watchdog_alarm); + if (m_ram[REGISTER_COMMAND] & COMMAND_PU_LVL) + { + m_intb_timer->adjust(attotime::from_msec(3)); + } + } + else + { + safe_inta_cb(m_watchdog_alarm); + if (m_ram[REGISTER_COMMAND] & COMMAND_PU_LVL) + { + m_inta_timer->adjust(attotime::from_msec(3)); + } + } +} + +void ds1386_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case CLOCK_TIMER: + advance_hundredths(); + break; + + case SQUAREWAVE_TIMER: + m_square = ((m_square == 0) ? 1 : 0); + safe_sqw_cb(m_square); + break; + + case WATCHDOG_TIMER: + if ((m_ram[REGISTER_COMMAND] & COMMAND_WAF) == 0) + watchdog_alarm(); + break; + + case INTA_TIMER: + if (m_ram[REGISTER_COMMAND] & COMMAND_IPSW) + { + m_tod_alarm = 0; + } + else + { + m_watchdog_alarm = 0; + } + safe_inta_cb(0); + break; + + case INTB_TIMER: + if (m_ram[REGISTER_COMMAND] & COMMAND_IPSW) + { + m_watchdog_alarm = 0; + } + else + { + m_tod_alarm = 0; + } + safe_intb_cb(0); + break; + } +} + +void ds1386_device::advance_hundredths() +{ + if ((m_ram[REGISTER_COMMAND] & COMMAND_TE) != 0) + { + copy_ram_to_registers(); + } + + int carry = time_helper::inc_bcd(&m_hundredths, 0xff, 0x00, 0x99); + if (carry) + { + carry = time_helper::inc_bcd(&m_seconds, 0x7f, 0x00, 0x59); + } + if (carry) + { + carry = time_helper::inc_bcd(&m_minutes, 0x7f, 0x00, 0x59); + } + if (carry) + { + UINT8 value = 0; + UINT8 min_value = 0; + UINT8 max_value = 0; + if (m_hours & HOURS_12_24) + { + value = m_hours & 0x1f; + min_value = 0x01; + max_value = 0x12; + } + else + { + value = m_hours & 0x3f; + min_value = 0x00; + max_value = 0x23; + } + carry = time_helper::inc_bcd(&value, 0x1f, min_value, max_value); + + m_hours &= ~0x1f; + if (carry) + { + if (m_hours & HOURS_12_24) + { + if (m_hours & HOURS_AM_PM) + carry = 1; + else + carry = 0; + + m_hours = m_hours ^ HOURS_AM_PM; + } + else + { + m_hours &= ~0x3f; + } + } + else + { + if ((m_hours & HOURS_12_24) == 0) + m_hours &= ~0x3f; + } + m_hours |= value; + } + + if (carry) + { + UINT8 maxdays; + static const UINT8 daysinmonth[] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 }; + + time_helper::inc_bcd(&m_days, 0x07, 0x01, 0x07); + + UINT8 month = time_helper::from_bcd(m_months_enables); + UINT8 year = time_helper::from_bcd(m_years); + + if (month == 2 && (year % 4) == 0) + { + maxdays = 0x29; + } + else if (month >= 1 && month <= 12) + { + maxdays = daysinmonth[month - 1]; + } + else + { + maxdays = 0x31; + } + + carry = time_helper::inc_bcd(&m_date, 0x3f, 0x01, maxdays); + } + if (carry) + { + UINT8 enables = m_months_enables & 0xc0; + carry = time_helper::inc_bcd(&m_months_enables, 0x1f, 0x01, 0x12); + m_months_enables &= 0x3f; + m_months_enables |= enables; + } + if (carry) + { + carry = time_helper::inc_bcd(&m_years, 0xff, 0x00, 0x99); + } + + if ((m_ram[REGISTER_COMMAND] & COMMAND_TE) != 0) + { + copy_registers_to_ram(); + } + + check_tod_alarm(); +} + +void ds1386_device::copy_ram_to_registers() +{ + m_hundredths = m_ram[REGISTER_HUNDREDTHS]; + m_seconds = m_ram[REGISTER_SECONDS]; + m_minutes = m_ram[REGISTER_MINUTES]; + m_hours = m_ram[REGISTER_HOURS]; + m_days = m_ram[REGISTER_DAYS]; + m_date = m_ram[REGISTER_DATE]; + m_months_enables = m_ram[REGISTER_MONTHS]; + m_years = m_ram[REGISTER_YEARS]; +} + +void ds1386_device::copy_registers_to_ram() +{ + m_ram[REGISTER_HUNDREDTHS] = m_hundredths; + m_ram[REGISTER_SECONDS] = m_seconds; + m_ram[REGISTER_MINUTES] = m_minutes; + m_ram[REGISTER_HOURS] = m_hours; + m_ram[REGISTER_DAYS] = m_days; + m_ram[REGISTER_DATE] = m_date; + m_ram[REGISTER_MONTHS] = m_months_enables; + m_ram[REGISTER_YEARS] = m_years; +} + +void ds1386_device::check_tod_alarm() +{ + UINT8 mode = BIT(m_days_alarm, 7) | (BIT(m_hours_alarm, 5) << 1) | (BIT(m_minutes_alarm, 3) << 2); + bool zeroes = (m_hundredths == 0 && m_seconds == 0); + if (zeroes && (m_ram[REGISTER_COMMAND] & COMMAND_TDF) == 0) + { + bool minutes_match = (m_minutes & 0x7f) == (m_minutes_alarm & 0x7f); + bool hours_match = (m_hours & 0x7f) == (m_hours_alarm & 0x7f); + bool days_match = (m_days & 0x7) == (m_days_alarm & 0x07); + bool alarm_match = false; + switch (mode) + { + case ALARM_PER_MINUTE: + alarm_match = true; + break; + case ALARM_MINUTES_MATCH: + alarm_match = minutes_match; + break; + case ALARM_HOURS_MATCH: + alarm_match = hours_match; + break; + case ALARM_DAYS_MATCH: + alarm_match = days_match; + break; + default: + break; + } + if (alarm_match) + { + time_of_day_alarm(); + } + } +} + +void ds1386_device::nvram_default() +{ + memset(&m_ram[0], 0, m_ram_size); +} + +void ds1386_device::nvram_read(emu_file &file) +{ + file.read(&m_ram[0], m_ram_size); +} + +void ds1386_device::nvram_write(emu_file &file) +{ + file.write(&m_ram[0], m_ram_size); +} + +WRITE8_MEMBER( ds1386_device::data_w ) +{ + if (offset >= m_ram_size) + return; + + if (offset >= 0xe) + { + m_ram[offset] = data; + } + else + { + switch (offset) + { + case 0x00: // hundredths + case 0x03: // minutes alarm + case 0x05: // horus alarm + case 0x0a: // years + m_ram[offset] = data; + break; + + case 0x01: // seconds + case 0x02: // minutes + case 0x04: // hours + m_ram[offset] = data & 0x7f; + break; + + case 0x06: // days + m_ram[offset] = data & 0x07; + break; + + case 0x07: // days alarm + m_ram[offset] = data & 0x87; + break; + + case 0x08: // date + m_ram[offset] = data & 0x3f; + break; + + case 0x09: // months + { + UINT8 old_value = m_ram[offset]; + m_ram[offset] = data & 0xdf; + UINT8 changed = old_value ^ data; + if (changed & DISABLE_SQW) + { + if (m_ram[offset] & DISABLE_SQW) + { + m_square_timer->adjust(attotime::never); + } + else + { + m_square_timer->adjust(attotime::from_hz(2048)); + } + } + if (changed & DISABLE_OSC) + { + if (m_ram[offset] & DISABLE_OSC) + { + m_clock_timer->adjust(attotime::never); + } + else + { + m_clock_timer->adjust(attotime::from_hz(100)); + } + } + break; + } + + case 0x0c: // watchdog hundredths + case 0x0d: // watchdog seconds + { + if ((m_ram[REGISTER_COMMAND] & COMMAND_WAF) != 0 && (m_ram[REGISTER_COMMAND] & COMMAND_WAM) == 0) + { + m_ram[REGISTER_COMMAND] &= ~COMMAND_WAF; + m_watchdog_alarm = 0; + if (m_ram[REGISTER_COMMAND] & COMMAND_IPSW) + safe_intb_cb(0); + else + safe_inta_cb(0); + } + m_ram[offset] = data; + UINT8 wd_hundredths = m_ram[REGISTER_WATCHDOG_HUNDREDTHS]; + UINT8 wd_seconds = m_ram[REGISTER_WATCHDOG_SECONDS]; + int total_hundredths = (wd_hundredths & 0xf) + ((wd_hundredths >> 4) & 0xf) * 10 + (wd_seconds & 0xf) * 100 + ((wd_seconds >> 4) & 0xf) * 1000; + m_watchdog_timer->adjust(attotime::from_msec(total_hundredths * 10)); + break; + } + + case 0x0b: // command + { + UINT8 old = m_ram[offset]; + m_ram[offset] = data & 0xfc; + UINT8 changed = old ^ m_ram[offset]; + if (changed & COMMAND_IPSW) + { + int old_a = (old & COMMAND_IPSW) ? m_tod_alarm : m_watchdog_alarm; + int old_b = (old & COMMAND_IPSW) ? m_watchdog_alarm : m_tod_alarm; + int new_a = old_b; + int new_b = old_a; + + bool a_changed = old_a != new_a; + bool b_changed = old_b != new_b; + + std::swap(m_tod_alarm, m_watchdog_alarm); + + if (a_changed) + { + if (m_ram[offset] & COMMAND_IPSW) + safe_inta_cb(m_tod_alarm); + else + safe_inta_cb(m_watchdog_alarm); + } + if (b_changed) + { + if (m_ram[offset] & COMMAND_IPSW) + safe_intb_cb(m_watchdog_alarm); + else + safe_intb_cb(m_tod_alarm); + } + } + if (changed & COMMAND_WAM) + { + if (m_ram[offset] & COMMAND_WAF) + { + if (m_ram[offset] & COMMAND_IPSW) + safe_intb_cb(0); + else + safe_inta_cb(0); + } + else if (m_watchdog_alarm) + { + if (m_ram[offset] & COMMAND_IPSW) + safe_intb_cb(m_watchdog_alarm); + else + safe_inta_cb(m_watchdog_alarm); + } + } + if (changed & COMMAND_TDM) + { + if (m_ram[offset] & COMMAND_TDF) + { + if (m_ram[offset] & COMMAND_IPSW) + safe_inta_cb(0); + else + safe_intb_cb(0); + } + else if (m_tod_alarm) + { + if (m_ram[offset] & COMMAND_IPSW) + safe_inta_cb(m_tod_alarm); + else + safe_intb_cb(m_tod_alarm); + } + } + break; + } + } + } +} + +READ8_MEMBER( ds1386_device::data_r ) +{ + if (offset >= m_ram_size) + return 0; + + return m_ram[offset]; +} diff --git a/src/devices/machine/ds1386.h b/src/devices/machine/ds1386.h new file mode 100644 index 00000000000..1146416b923 --- /dev/null +++ b/src/devices/machine/ds1386.h @@ -0,0 +1,210 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/********************************************************************** + + Dallas DS1386/DS1386P RAMified Watchdog Timekeeper + +*********************************************************************** + _____________ + /INTA 1 | | 32 Vcc + /INTB 2 | | 31 SQW + NC/A14 3 | | 30 Vcc + A12 4 | | 29 /WE + A7 5 | | 28 NC/A13 + A6 6 | | 27 A8 + A5 7 | | 26 A9 + A4 8 | | 25 A11 + A3 9 | | 24 /OE + A2 10 | | 23 A10 + A1 11 | | 22 /CE + A0 12 | | 21 DQ7 + DQ0 13 | | 20 DQ6 + DQ1 14 | | 19 DQ5 + DQ2 15 | | 18 DQ4 + GND 16 |_____________| 17 DQ3 + + DS1386 8k/32k x 8 + + __________________________________ + / | + / | + /INTB | 1 34 | /INTA + NC | 2 33 | SQW + NC | 3 32 | NC/A13 + /PFO | 4 31 | NC/A14 + Vcc | 5 30 | A12 + /WE | 6 29 | A11 + /OE | 7 28 | A10 + /CE | 8 27 | A9 + DQ7 | 9 26 | A8 + DQ6 | 10 25 | A7 + DQ5 | 11 24 | A6 + DQ4 | 12 23 | A5 + DQ3 | 13 22 | A4 + DQ2 | 14 X1 GND Vbat X2 21 | A3 + DQ1 | 15 ____ ____ ____ ____ 20 | A2 + DQ0 | 16 | | | | | | | | 19 | A1 + GND | 17 |____| |____| |____| |____| 18 | A0 + |____________________________________| + + DS1386 8k/32k x 8, 34-Pin PowerCap Module Board + +**********************************************************************/ + +#pragma once + +#ifndef DS1386_H +#define DS1386_H + +#include "emu.h" + +// handlers + +#define MCFG_DS1386_INTA_HANDLER(_devcb) \ + devcb = &ds1386_device::set_inta_cb(*device, DEVCB_##_devcb); + +#define MCFG_DS1386_INTB_HANDLER(_devcb) \ + devcb = &ds1386_device::set_inta_cb(*device, DEVCB_##_devcb); + +#define MCFG_DS1386_SQW_HANDLER(_devcb) \ + devcb = &ds1386_device::set_sqw_cb(*device, DEVCB_##_devcb); + +// devices + +#define MCFG_DS1386_8K_ADD(_tag, _clock) \ + MCFG_DEVICE_ADD(_tag, DS1386_8K, _clock) + +#define MCFG_DS1386_32K_ADD(_tag, _clock) \ + MCFG_DEVICE_ADD(_tag, DS1386_32K, _clock) + +class ds1386_device : public device_t, + public device_nvram_interface +{ +public: + ds1386_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, size_t size); + + DECLARE_WRITE8_MEMBER( data_w ); + DECLARE_READ8_MEMBER( data_r ); + + DECLARE_WRITE_LINE_MEMBER( ce_w ); + DECLARE_WRITE_LINE_MEMBER( oe_w ); + DECLARE_WRITE_LINE_MEMBER( we_w ); + + template<class _Object> static devcb_base &set_inta_cb(device_t &device, _Object object) { return downcast<ds1386_device &>(device).m_inta_cb.set_callback(object); } + template<class _Object> static devcb_base &set_intb_cb(device_t &device, _Object object) { return downcast<ds1386_device &>(device).m_intb_cb.set_callback(object); } + template<class _Object> static devcb_base &set_sqw_cb(device_t &device, _Object object) { return downcast<ds1386_device &>(device).m_sqw_cb.set_callback(object); } + +protected: + enum + { + REGISTER_HUNDREDTHS = 0, + REGISTER_SECONDS, + REGISTER_MINUTES, + REGISTER_MINUTE_ALARM, + REGISTER_HOURS, + REGISTER_HOUR_ALARM, + REGISTER_DAYS, + REGISTER_DAY_ALARM, + REGISTER_DATE, + REGISTER_MONTHS, + REGISTER_EN_OUTS = REGISTER_MONTHS, + REGISTER_YEARS, + REGISTER_COMMAND, + REGISTER_WATCHDOG_HUNDREDTHS, + REGISTER_WATCHDOG_SECONDS, + REGISTER_USER = 0xE, + }; + + enum + { + ALARM_DAYS_MATCH = 0x0, + ALARM_HOURS_MATCH = 0x1, + ALARM_MINUTES_MATCH = 0x3, + ALARM_PER_MINUTE = 0x7 + }; + + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + + // device_nvram_interface overrides + virtual void nvram_default() override; + virtual void nvram_read(emu_file &file) override; + virtual void nvram_write(emu_file &file) override; + + static const device_timer_id CLOCK_TIMER = 0; + static const device_timer_id SQUAREWAVE_TIMER = 1; + static const device_timer_id WATCHDOG_TIMER = 2; + static const device_timer_id INTA_TIMER = 3; + static const device_timer_id INTB_TIMER = 4; + +protected: + void safe_inta_cb(int state); + void safe_intb_cb(int state); + void safe_sqw_cb(int state); + + void set_current_time(); + + void check_tod_alarm(); + void time_of_day_alarm(); + void watchdog_alarm(); + + void advance_hundredths(); + + void copy_ram_to_registers(); + void copy_registers_to_ram(); + + int m_tod_alarm; + int m_watchdog_alarm; + int m_square; + + // interfacing with other devices + devcb_write_line m_inta_cb; + devcb_write_line m_intb_cb; + devcb_write_line m_sqw_cb; + + // timers + emu_timer *m_clock_timer; + emu_timer *m_square_timer; + emu_timer *m_watchdog_timer; + emu_timer *m_inta_timer; + emu_timer *m_intb_timer; + + std::unique_ptr<UINT8[]> m_ram; + optional_region_ptr<UINT8> m_default_data; + + UINT8 m_hundredths; + UINT8 m_seconds; + UINT8 m_minutes; + UINT8 m_minutes_alarm; + UINT8 m_hours; + UINT8 m_hours_alarm; + UINT8 m_days; + UINT8 m_days_alarm; + UINT8 m_date; + UINT8 m_months_enables; + UINT8 m_years; + + const size_t m_ram_size; +}; + +class ds1386_8k_device : public ds1386_device +{ +public: + // construction/destruction + ds1386_8k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class ds1386_32k_device : public ds1386_device +{ +public: + // construction/destruction + ds1386_32k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +// device type definition +extern const device_type DS1386_8K; +extern const device_type DS1386_32K; + +#endif diff --git a/src/devices/machine/mm58167.cpp b/src/devices/machine/mm58167.cpp index 75e9e799004..148d97260e8 100644 --- a/src/devices/machine/mm58167.cpp +++ b/src/devices/machine/mm58167.cpp @@ -9,6 +9,7 @@ **********************************************************************/ #include "mm58167.h" +#include "machine/timehelp.h" //************************************************************************** // LIVE DEVICE @@ -91,11 +92,6 @@ void mm58167_device::device_reset() } -static inline UINT8 make_bcd(UINT8 data) -{ - return ((data / 10) << 4) | (data % 10); -} - //------------------------------------------------- // device_timer - handler timer events //------------------------------------------------- @@ -124,8 +120,8 @@ void mm58167_device::device_timer(emu_timer &timer, device_timer_id id, int para if ((m_regs[R_CTL_IRQCONTROL] & 0x80) && m_regs[R_CNT_MONTH] != old_month) set_irq(7); // every month } - m_regs[R_CNT_MILLISECONDS] = make_bcd(m_milliseconds % 10); - m_regs[R_CNT_HUNDTENTHS] = make_bcd(m_milliseconds / 10); + m_regs[R_CNT_MILLISECONDS] = time_helper::make_bcd(m_milliseconds % 10); + m_regs[R_CNT_HUNDTENTHS] = time_helper::make_bcd(m_milliseconds / 10); // 10Hz IRQ if ((m_regs[R_CTL_IRQCONTROL] & 0x02) && (m_milliseconds % 100) == 0) @@ -158,12 +154,12 @@ void mm58167_device::device_timer(emu_timer &timer, device_timer_id id, int para void mm58167_device::rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second) { - m_regs[R_CNT_SECONDS] = make_bcd(second); // seconds (BCD) - m_regs[R_CNT_MINUTES] = make_bcd(minute); // minutes (BCD) - m_regs[R_CNT_HOURS] = make_bcd(hour); // hour (BCD) - m_regs[R_CNT_DAYOFWEEK] = make_bcd(day_of_week); // day of the week (BCD) - m_regs[R_CNT_DAYOFMONTH] = make_bcd(day); // day of the month (BCD) - m_regs[R_CNT_MONTH] = make_bcd(month); // month (BCD) + m_regs[R_CNT_SECONDS] = time_helper::make_bcd(second); // seconds (BCD) + m_regs[R_CNT_MINUTES] = time_helper::make_bcd(minute); // minutes (BCD) + m_regs[R_CNT_HOURS] = time_helper::make_bcd(hour); // hour (BCD) + m_regs[R_CNT_DAYOFWEEK] = time_helper::make_bcd(day_of_week); // day of the week (BCD) + m_regs[R_CNT_DAYOFMONTH] = time_helper::make_bcd(day); // day of the month (BCD) + m_regs[R_CNT_MONTH] = time_helper::make_bcd(month); // month (BCD) } void mm58167_device::set_irq(int bit) diff --git a/src/devices/machine/pit8253.cpp b/src/devices/machine/pit8253.cpp index f542f3753b8..978cb6a50b5 100644 --- a/src/devices/machine/pit8253.cpp +++ b/src/devices/machine/pit8253.cpp @@ -317,7 +317,7 @@ void pit8253_device::simulate2(pit8253_timer *timer, INT64 elapsed_cycles) static const UINT32 CYCLES_NEVER = (0xffffffff); UINT32 cycles_to_output = 0; - LOG2(("pit8253: simulate2(): simulating %d cycles for %d in mode %d, bcd = %d, phase = %d, gate = %d, output %d, value = 0x%04x\n", + LOG2(("simulate2(): simulating %d cycles for %d in mode %d, bcd = %d, phase = %d, gate = %d, output %d, value = 0x%04x\n", (int)elapsed_cycles, timer->index, mode, bcd, timer->phase, timer->gate, timer->output, timer->value)); switch (mode) @@ -698,7 +698,7 @@ void pit8253_device::simulate2(pit8253_timer *timer, INT64 elapsed_cycles) timer->updatetimer->adjust(next_fire_time - machine().time(), timer->index); } - LOG2(("pit8253: simulate2(): simulating %d cycles for %d in mode %d, bcd = %d, phase = %d, gate = %d, output %d, value = 0x%04x, cycles_to_output = %04x\n", + LOG2(("simulate2(): simulating %d cycles for %d in mode %d, bcd = %d, phase = %d, gate = %d, output %d, value = 0x%04x, cycles_to_output = %04x\n", (int)elapsed_cycles, timer->index, mode, bcd, timer->phase, timer->gate, timer->output, timer->value, cycles_to_output)); } @@ -723,7 +723,7 @@ void pit8253_device::update(pit8253_timer *timer) attotime elapsed_time = now - timer->last_updated; INT64 elapsed_cycles = elapsed_time.as_double() * timer->clockin; - LOG1(("pit8253: update(): timer %d, %d elapsed_cycles\n", timer->index, elapsed_cycles)); + LOG1(("update(): timer %d, %d elapsed_cycles\n", timer->index, elapsed_cycles)); if (timer->clockin) timer->last_updated += elapsed_cycles * attotime::from_hz(timer->clockin); @@ -739,7 +739,7 @@ void pit8253_device::update(pit8253_timer *timer) mask this bit off. */ UINT16 pit8253_device::masked_value(pit8253_timer *timer) { - LOG2(("pit8253: masked_value\n")); + LOG2(("masked_value\n")); if (CTRL_MODE(timer->control) == 3) return timer->value & 0xfffe; return timer->value; @@ -756,7 +756,7 @@ READ8_MEMBER( pit8253_device::read ) UINT8 data; UINT16 value; - LOG2(("pit8253_r(): offset %d\n", offset)); + LOG2(("read(): offset %d\n", offset)); if (timer == nullptr) { @@ -816,7 +816,7 @@ READ8_MEMBER( pit8253_device::read ) } } - LOG2(("pit8253: read(): offset=%d data=0x%02x\n", offset, data)); + LOG2(("read(): offset=%d data=0x%02x\n", offset, data)); return data; } @@ -825,7 +825,7 @@ READ8_MEMBER( pit8253_device::read ) void pit8253_device::load_count(pit8253_timer *timer, UINT16 newcount) { int mode = CTRL_MODE(timer->control); - LOG1(("pit8253: load_count(): %04x\n", newcount)); + LOG1(("load_count(): %04x\n", newcount)); if (newcount == 1) { @@ -912,7 +912,7 @@ void pit8253_device::readback_command(UINT8 data) void pit8254_device::readback_command(UINT8 data) { - LOG1(("pit8253: write(): readback %02x\n", data & 0x3f)); + LOG1(("write(): readback %02x\n", data & 0x3f)); /* Bit 0 of data must be 0. Todo: find out what the hardware does if it isn't. */ int read_command = (data >> 4) & 3; @@ -933,7 +933,7 @@ WRITE8_MEMBER( pit8253_device::write ) { pit8253_timer *timer = get_timer(offset); - LOG2(("pit8253: write(): offset=%d data=0x%02x\n", offset, data)); + LOG2(("write(): offset=%d data=0x%02x\n", offset, data)); if (timer == nullptr) { @@ -949,7 +949,7 @@ WRITE8_MEMBER( pit8253_device::write ) if (CTRL_ACCESS(data) == 0) { - LOG1(("pit8253: write(): timer=%d readback\n", (data >> 6) & 3)); + LOG1(("write(): timer=%d readback\n", (data >> 6) & 3)); /* Latch current timer value */ /* Experimentally verified: this command does not affect the mode control register */ @@ -957,7 +957,7 @@ WRITE8_MEMBER( pit8253_device::write ) } else { - LOG1(("pit8253: write(): timer=%d bytes=%d mode=%d bcd=%d\n", (data >> 6) & 3, (data >> 4) & 3, (data >> 1) & 7, data & 1)); + LOG1(("write(): timer=%d bytes=%d mode=%d bcd=%d\n", (data >> 6) & 3, (data >> 4) & 3, (data >> 1) & 7, data & 1)); timer->control = (data & 0x3f); timer->null_count = 1; @@ -1045,7 +1045,7 @@ void pit8253_device::gate_w(int gate, int state) if (timer == nullptr) return; - LOG2(("pit8253 : gate_w(): gate=%d state=%d\n", gate, state)); + LOG2(("gate_w(): gate=%d state=%d\n", gate, state)); if (state != timer->gate) { @@ -1084,7 +1084,7 @@ void pit8253_device::set_clockin(int timerno, double new_clockin) pit8253_timer *timer = get_timer(timerno); assert(timer != nullptr); - LOG2(("pit8253_set_clockin(): PIT timer=%d, clockin = %f\n", timerno, new_clockin)); + LOG2(("set_clockin(): PIT timer=%d, clockin = %f\n", timerno, new_clockin)); update(timer); timer->clockin = new_clockin; @@ -1097,7 +1097,7 @@ void pit8253_device::set_clock_signal(int timerno, int state) pit8253_timer *timer = get_timer(timerno); assert(timer != nullptr); - LOG2(("pit8253_set_clock_signal(): PIT timer=%d, state = %d\n", timerno, state)); + LOG2(("set_clock_signal(): PIT timer=%d, state = %d\n", timerno, state)); /* Trigger on low to high transition */ if (!timer->clock && state) diff --git a/src/devices/machine/timehelp.h b/src/devices/machine/timehelp.h new file mode 100644 index 00000000000..38adfdee502 --- /dev/null +++ b/src/devices/machine/timehelp.h @@ -0,0 +1,51 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles,smf +/*************************************************************************** + + timehelp.h + + Assorted shared functionality between timekeeping chips and RTCs. + +***************************************************************************/ + +#pragma once + +#ifndef SRC_DEVICES_MACHINE_TIMEHELP_H +#define SRC_DEVICES_MACHINE_TIMEHELP_H + +class time_helper +{ +public: + static inline UINT8 make_bcd(UINT8 data) + { + return (((data / 10) % 10) << 4) + (data % 10); + } + + static inline UINT8 from_bcd(UINT8 data) + { + return (((data >> 4) & 15) * 10) + (data & 15); + } + + static int inc_bcd(UINT8 *data, int mask, int min, int max) + { + int bcd = (*data + 1) & mask; + int carry = 0; + + if ((bcd & 0x0f) > 9) + { + bcd &= 0xf0; + bcd += 0x10; + if (bcd > max) + { + bcd = min; + carry = 1; + } + } + + *data = (*data & ~mask) | (bcd & mask); + return carry; + } + +}; + +#endif // SRC_DEVICES_MACHINE_TIMEHELP_H
\ No newline at end of file diff --git a/src/devices/machine/timekpr.cpp b/src/devices/machine/timekpr.cpp index 4b87d43ff69..e11cd089b1c 100644 --- a/src/devices/machine/timekpr.cpp +++ b/src/devices/machine/timekpr.cpp @@ -16,7 +16,7 @@ #include "emu.h" #include "machine/timekpr.h" - +#include "machine/timehelp.h" // device type definition const device_type M48T02 = &device_creator<m48t02_device>; @@ -63,39 +63,6 @@ const device_type MK48T12 = &device_creator<mk48t12_device>; INLINE FUNCTIONS ***************************************************************************/ -static inline UINT8 make_bcd(UINT8 data) -{ - return ( ( ( data / 10 ) % 10 ) << 4 ) + ( data % 10 ); -} - -static inline UINT8 from_bcd( UINT8 data ) -{ - return ( ( ( data >> 4 ) & 15 ) * 10 ) + ( data & 15 ); -} - -static int inc_bcd( UINT8 *data, int mask, int min, int max ) -{ - int bcd; - int carry; - - bcd = ( *( data ) + 1 ) & mask; - carry = 0; - - if( ( bcd & 0x0f ) > 9 ) - { - bcd &= 0xf0; - bcd += 0x10; - if( bcd > max ) - { - bcd = min; - carry = 1; - } - } - - *( data ) = ( *( data ) & ~mask ) | ( bcd & mask ); - return carry; -} - static void counter_to_ram( UINT8 *data, int offset, int counter ) { if( offset >= 0 ) @@ -233,14 +200,14 @@ void timekeeper_device::device_start() machine().base_datetime(systime); m_control = 0; - m_seconds = make_bcd( systime.local_time.second ); - m_minutes = make_bcd( systime.local_time.minute ); - m_hours = make_bcd( systime.local_time.hour ); - m_day = make_bcd( systime.local_time.weekday + 1 ); - m_date = make_bcd( systime.local_time.mday ); - m_month = make_bcd( systime.local_time.month + 1 ); - m_year = make_bcd( systime.local_time.year % 100 ); - m_century = make_bcd( systime.local_time.year / 100 ); + m_seconds = time_helper::make_bcd( systime.local_time.second ); + m_minutes = time_helper::make_bcd( systime.local_time.minute ); + m_hours = time_helper::make_bcd( systime.local_time.hour ); + m_day = time_helper::make_bcd( systime.local_time.weekday + 1 ); + m_date = time_helper::make_bcd( systime.local_time.mday ); + m_month = time_helper::make_bcd( systime.local_time.month + 1 ); + m_year = time_helper::make_bcd( systime.local_time.year % 100 ); + m_century = time_helper::make_bcd( systime.local_time.year / 100 ); m_data.resize( m_size ); save_item( NAME(m_control) ); @@ -298,14 +265,14 @@ void timekeeper_device::device_timer(emu_timer &timer, device_timer_id id, int p return; } - int carry = inc_bcd( &m_seconds, MASK_SECONDS, 0x00, 0x59 ); + int carry = time_helper::inc_bcd( &m_seconds, MASK_SECONDS, 0x00, 0x59 ); if( carry ) { - carry = inc_bcd( &m_minutes, MASK_MINUTES, 0x00, 0x59 ); + carry = time_helper::inc_bcd( &m_minutes, MASK_MINUTES, 0x00, 0x59 ); } if( carry ) { - carry = inc_bcd( &m_hours, MASK_HOURS, 0x00, 0x23 ); + carry = time_helper::inc_bcd( &m_hours, MASK_HOURS, 0x00, 0x23 ); } if( carry ) @@ -313,10 +280,10 @@ void timekeeper_device::device_timer(emu_timer &timer, device_timer_id id, int p UINT8 maxdays; static const UINT8 daysinmonth[] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 }; - inc_bcd( &m_day, MASK_DAY, 0x01, 0x07 ); + time_helper::inc_bcd( &m_day, MASK_DAY, 0x01, 0x07 ); - UINT8 month = from_bcd( m_month ); - UINT8 year = from_bcd( m_year ); + UINT8 month = time_helper::from_bcd( m_month ); + UINT8 year = time_helper::from_bcd( m_year ); if( month == 2 && ( year % 4 ) == 0 ) { @@ -331,19 +298,19 @@ void timekeeper_device::device_timer(emu_timer &timer, device_timer_id id, int p maxdays = 0x31; } - carry = inc_bcd( &m_date, MASK_DATE, 0x01, maxdays ); + carry = time_helper::inc_bcd( &m_date, MASK_DATE, 0x01, maxdays ); } if( carry ) { - carry = inc_bcd( &m_month, MASK_MONTH, 0x01, 0x12 ); + carry = time_helper::inc_bcd( &m_month, MASK_MONTH, 0x01, 0x12 ); } if( carry ) { - carry = inc_bcd( &m_year, MASK_YEAR, 0x00, 0x99 ); + carry = time_helper::inc_bcd( &m_year, MASK_YEAR, 0x00, 0x99 ); } if( carry ) { - carry = inc_bcd( &m_century, MASK_CENTURY, 0x00, 0x99 ); + carry = time_helper::inc_bcd( &m_century, MASK_CENTURY, 0x00, 0x99 ); if( type() == M48T35 || type() == M48T58 ) diff --git a/src/devices/video/mc6845.cpp b/src/devices/video/mc6845.cpp index 04e7c967869..fb52c855ecc 100644 --- a/src/devices/video/mc6845.cpp +++ b/src/devices/video/mc6845.cpp @@ -441,6 +441,12 @@ READ_LINE_MEMBER( mc6845_device::cursor_r ) } +READ_LINE_MEMBER( mc6845_device::cursor_state_r ) +{ + return m_cursor_state; +} + + READ_LINE_MEMBER( mc6845_device::hsync_r ) { return m_hsync; diff --git a/src/devices/video/mc6845.h b/src/devices/video/mc6845.h index 9bad2348640..f530485b886 100644 --- a/src/devices/video/mc6845.h +++ b/src/devices/video/mc6845.h @@ -141,6 +141,7 @@ public: // read cursor line state DECLARE_READ_LINE_MEMBER( cursor_r ); + DECLARE_READ_LINE_MEMBER( cursor_state_r ); // read horizontal sync line state DECLARE_READ_LINE_MEMBER( hsync_r ); diff --git a/src/mame/drivers/amusco.cpp b/src/mame/drivers/amusco.cpp index a300b1cc485..ec0aeda20cf 100644 --- a/src/mame/drivers/amusco.cpp +++ b/src/mame/drivers/amusco.cpp @@ -7,12 +7,6 @@ Preliminary driver by Roberto Fresca. - TODO: - - i8259 and irqs - - understand how videoram works (tied to port $70?) - - inputs - - everything else; - ******************************************************************************* Hardware Notes: @@ -48,7 +42,8 @@ The program code reads from and writes to what must be a line printer and a RTC (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 - unknown interface chip or gate array (not i8255-compatible). + unknown interface chip or gate array (not i8255-compatible). The printer appears to + use non-Epson control codes: ETB, DLE, DC4, DC2, SO, EM, DC1 and STX. ***************************************************************************************** @@ -67,8 +62,11 @@ TODO: - Proper tile colors. - - Hook PPI8255 devices. - - I/O. + - Determine PIT clocks for proper IRQ timing. + - Make the 6845 transparent videoram addressing actually transparent. + (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?) + - Identify outputs from first PPI (these include button lamps?) *******************************************************************************/ @@ -100,13 +98,17 @@ public: m_gfxdecode(*this, "gfxdecode"), m_pic(*this, "pic8259"), m_rtc(*this, "rtc"), - m_crtc(*this, "crtc") + m_crtc(*this, "crtc"), + m_screen(*this, "screen") { } required_shared_ptr<UINT8> m_videoram; tilemap_t *m_bg_tilemap; TILE_GET_INFO_MEMBER(get_bg_tile_info); virtual void video_start() override; + DECLARE_READ8_MEMBER(hack_coin1_r); + DECLARE_READ8_MEMBER(hack_coin2_r); + DECLARE_READ8_MEMBER(hack_908_r); DECLARE_READ8_MEMBER(mc6845_r); DECLARE_WRITE8_MEMBER(mc6845_w); DECLARE_WRITE8_MEMBER(output_a_w); @@ -118,13 +120,14 @@ public: DECLARE_READ8_MEMBER(rtc_r); DECLARE_WRITE8_MEMBER(rtc_w); MC6845_ON_UPDATE_ADDR_CHANGED(crtc_addr); + MC6845_UPDATE_ROW(update_row); - UINT32 screen_update_amusco(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); required_device<cpu_device> m_maincpu; required_device<gfxdecode_device> m_gfxdecode; required_device<pic8259_device> m_pic; required_device<msm5832_device> m_rtc; required_device<mc6845_device> m_crtc; + required_device<screen_device> m_screen; UINT8 m_mc6845_address; UINT16 m_video_update_address; }; @@ -143,11 +146,16 @@ TILE_GET_INFO_MEMBER(amusco_state::get_bg_tile_info) ---- ---- seems unused. */ int code = m_videoram[tile_index * 2] | (m_videoram[tile_index * 2 + 1] << 8); + int color = (code & 0x7000) >> 12; + + // 6845 cursor is only used for its blink state + if (BIT(code, 15) && !m_crtc->cursor_state_r()) + code = 0; SET_TILE_INFO_MEMBER( 0 /* bank */, code & 0x3ff, - 0 /* color */, + color, 0 ); } @@ -157,23 +165,37 @@ void amusco_state::video_start() m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(amusco_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, 8, 10, 74, 24); } -UINT32 amusco_state::screen_update_amusco(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); - return 0; -} - /************************** * 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_908_r) +{ + // IRQ4 and other routines wait for bits of this to be set by IRQ2 + return 0xff; +} /************************* * Memory Map Information * *************************/ 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(0x00908, 0x00908) AM_READ(hack_908_r) AM_RANGE(0x00000, 0x0ffff) AM_RAM AM_RANGE(0xec000, 0xecfff) AM_RAM AM_SHARE("videoram") // placeholder AM_RANGE(0xf8000, 0xfffff) AM_ROM @@ -228,8 +250,19 @@ WRITE8_MEMBER(amusco_state::vram_w) READ8_MEMBER(amusco_state::lpt_r) { - logerror("Reading from printer port 28%dh\n", offset); - return 0; + switch (offset) + { + case 2: + // Bit 0 = busy + // Bit 1 = paper jam (inverted) + // Bit 3 = out of paper + // Bit 4 = low paper + return 2; + + default: + logerror("Reading from printer port 28%dh\n", offset); + return 0; + } } WRITE8_MEMBER(amusco_state::lpt_w) @@ -301,34 +334,29 @@ ADDRESS_MAP_END static INPUT_PORTS_START( amusco ) PORT_START("IN0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_1) PORT_NAME("IN0-1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_2) PORT_NAME("IN0-2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_3) PORT_NAME("IN0-3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) PORT_CODE(KEYCODE_4) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_5) PORT_NAME("IN0-5") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_6) PORT_NAME("IN0-6") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_7) PORT_NAME("IN0-7") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_8) PORT_NAME("IN0-8") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) PORT_NAME("Play Credit") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) // actual name uncertain; next screen in service mode + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) // decrement in service mode + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL ) PORT_NAME("Draw") // previous screen in service mode + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_STAND ) // actual name uncertain; increment in service mode + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) // move left in service mode + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) // move right in service mode PORT_START("IN1") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Q) PORT_NAME("Cash Door") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_SERVICE ) PORT_CODE(KEYCODE_W) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_E) PORT_NAME("IN1-3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_R) PORT_NAME("IN1-4") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_SERVICE ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_T) PORT_NAME("Logic Door") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Y) PORT_NAME("IN1-6") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_U) PORT_NAME("IN1-7") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_I) PORT_NAME("IN1-8") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) + 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_START("IN2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_A) PORT_NAME("IN2-1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_S) PORT_NAME("IN2-2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_D) PORT_NAME("IN2-3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_F) PORT_NAME("IN2-4") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_G) PORT_NAME("IN2-5") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_H) PORT_NAME("IN2-6") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_J) PORT_NAME("IN2-7") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_K) PORT_NAME("IN2-8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 ) //PORT_WRITE_LINE_DEVICE_MEMBER("pic8259", pic8259_device, ir4_w) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) //PORT_WRITE_LINE_DEVICE_MEMBER("pic8259", pic8259_device, ir4_w) + PORT_BIT( 0xf9, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END @@ -353,7 +381,7 @@ static const gfx_layout charlayout = ******************************/ static GFXDECODE_START( amusco ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 8 ) + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, /*8*/ 1 ) // current palette has only 8 colors... GFXDECODE_END @@ -366,6 +394,13 @@ MC6845_ON_UPDATE_ADDR_CHANGED(amusco_state::crtc_addr) // m_video_update_address = address; } +MC6845_UPDATE_ROW(amusco_state::update_row) +{ + const rectangle rowrect(0, 8 * x_count - 1, y, y); + m_bg_tilemap->mark_all_dirty(); + m_bg_tilemap->draw(*m_screen, bitmap, rowrect, 0, 0); +} + /************************* * Machine Drivers * *************************/ @@ -381,6 +416,10 @@ static MACHINE_CONFIG_START( amusco, amusco_state ) MCFG_PIC8259_ADD("pic8259", INPUTLINE("maincpu", 0), VCC, NOOP) MCFG_DEVICE_ADD("pit8253", PIT8253, 0) + //MCFG_PIT8253_CLK0(nnn) + //MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir0_w)) + //MCFG_PIT8253_CLK1(nnn) + //MCFG_PIT8253_OUT1_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir2_w)) MCFG_DEVICE_ADD("ppi_outputs", I8255, 0) MCFG_I8255_OUT_PORTA_CB(WRITE8(amusco_state, output_a_w)) @@ -400,10 +439,10 @@ static MACHINE_CONFIG_START( amusco, amusco_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(88*8, 27*10) // screen size: 88*8 27*10 MCFG_SCREEN_VISIBLE_AREA(0*8, 74*8-1, 0*10, 24*10-1) // visible scr: 74*8 24*10 - MCFG_SCREEN_UPDATE_DRIVER(amusco_state, screen_update_amusco) + MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) - MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", amusco) + MCFG_PALETTE_ADD_3BIT_GBR("palette") MCFG_MC6845_ADD("crtc", R6545_1, "screen", CRTC_CLOCK) /* guess */ @@ -412,6 +451,7 @@ static MACHINE_CONFIG_START( amusco, amusco_state ) MCFG_MC6845_ADDR_CHANGED_CB(amusco_state, crtc_addr) MCFG_MC6845_OUT_DE_CB(DEVWRITELINE("pic8259", pic8259_device, ir1_w)) // IRQ1 sets 0x918 bit 3 MCFG_MC6845_OUT_VSYNC_CB(DEVWRITELINE("pic8259", pic8259_device, ir0_w)) // IRQ0 sets 0x665 to 0xff + MCFG_MC6845_UPDATE_ROW_CB(amusco_state, update_row) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -449,4 +489,4 @@ ROM_END *************************/ /* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */ -GAME( 1987, amusco, 0, amusco, amusco, driver_device, 0, ROT0, "Amusco", "American Music Poker (V1.4)", MACHINE_NOT_WORKING ) +GAME( 1987, amusco, 0, amusco, amusco, driver_device, 0, ROT0, "Amusco", "American Music Poker (V1.4)", MACHINE_IMPERFECT_COLORS ) // runs much too fast; palette totally wrong diff --git a/src/mame/drivers/chihiro.cpp b/src/mame/drivers/chihiro.cpp index a2632d922fc..a1934dd93e4 100644 --- a/src/mame/drivers/chihiro.cpp +++ b/src/mame/drivers/chihiro.cpp @@ -260,7 +260,7 @@ Notes: CN5 - USB connector joining to JVS I/O board with standard USB cable CN8 - A/V input connector (from XBox board via short A/V cable) CN9 - VGA output connector - CN10 - 14 pin connector (purpose unknown but appears to be unused) + CN10 - 14 pin connector (purpose unknown, maybe another video connector) CN11 - 16-pin flat cable connector joining to LPC connector on XBox board CN12 - 40-pin IDE flat cable connector joining to IDE connector on XBox board CN14S - 7-pin power output connector joining to XBox board @@ -869,9 +869,10 @@ int ohci_hlean2131qc_device::handle_nonstandard_request(int endpoint, USBSetupPa sense = 3; else sense = 0; // need to check - // PINSA register, bits 4-1 special value, must be 10 xor 15, but bit 3 is ignored since its used as the CS pin of the chip + // PINSA register, bits 0-2 connected do dip switches 1-3 on filter board, bit 4 to dip switch 4, bit 5 to dip switch 5, bits 6-7 to buttons 1-2 on filter board + // bits 4-1 value must be 10 xor 15, and bit 3 is ignored since its used as the CS pin of the chip endpoints[endpoint].buffer[1] = 0x4b; - // PINSB register, bit 4 connected to re/de pins of max485, bits 2-3 used as uart pins, bit 0-1 is the sense pin of the jvs connector + // PINSB register, bits 5-7 connected to 3 leds not mounted on pcb, bit 4 connected to re/de pins of max485, bits 2-3 used as uart pins, bit 0-1 give the status of the sense pin of the jvs connector // if bits 0-1 are 11, the not all the connected jvs devices have been assigned an address yet endpoints[endpoint].buffer[2] = 0x52 | sense; // OUTB register diff --git a/src/mame/drivers/dynax.cpp b/src/mame/drivers/dynax.cpp index d83f0854ad7..7f1c156e4f0 100644 --- a/src/mame/drivers/dynax.cpp +++ b/src/mame/drivers/dynax.cpp @@ -3782,6 +3782,9 @@ static INPUT_PORTS_START( majxtal7 ) PORT_DIPNAME( 0xff, 0xff, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0xff, DEF_STR( On ) ) + + /* the following are needed to make happy the read handlers shared with mjelctrn */ + PORT_START("SW1") INPUT_PORTS_END static INPUT_PORTS_START( neruton ) @@ -3849,6 +3852,7 @@ static INPUT_PORTS_START( neruton ) PORT_INCLUDE( MAHJONG_KEYS ) /* 2008-06 FP: the following are needed to make happy the read handlers shared with mjelctrn */ + PORT_START("SW1") PORT_START("DSW2") PORT_START("DSW3") PORT_START("FAKE") diff --git a/src/mame/drivers/indy_indigo2.cpp b/src/mame/drivers/indy_indigo2.cpp index 2631d9f66fb..e913ee22045 100644 --- a/src/mame/drivers/indy_indigo2.cpp +++ b/src/mame/drivers/indy_indigo2.cpp @@ -50,43 +50,87 @@ #include "machine/pit8253.h" #include "video/newport.h" #include "sound/dac.h" -#include "machine/nvram.h" #include "bus/scsi/scsi.h" #include "bus/scsi/scsicd.h" #include "bus/scsi/scsihd.h" #include "machine/wd33c93.h" +#include "machine/ds1386.h" -struct RTC_t +#define MCFG_IOC2_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, SGI_IOC2, 0) + +class ioc2_device : public device_t { - UINT8 nRegs[0x80]; - UINT8 nUserRAM[0x200]; - UINT8 nRAM[0x800]; +public: + ioc2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + ioc2_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + + DECLARE_WRITE32_MEMBER( int3_write ); + DECLARE_READ32_MEMBER( int3_read ); + + void lower_local0_irq(UINT8 source_mask); + void raise_local0_irq(UINT8 source_mask); + void lower_local1_irq(UINT8 source_mask); + void raise_local1_irq(UINT8 source_mask); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + + required_device<mips3_device> m_maincpu; + + UINT32 m_regs[0x40]; + UINT32 m_par_read_cnt; + UINT32 m_par_cntl; }; -struct HPC3_t +const device_type SGI_IOC2 = &device_creator<ioc2_device>; + +ioc2_device::ioc2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, SGI_IOC2, "SGI IOC2 I/O Controller", tag, owner, clock, "ioc2", __FILE__) + , m_maincpu(*this, "^maincpu") +{ +} + +void ioc2_device::device_start() +{ +} + +void ioc2_device::device_reset() +{ + m_par_read_cnt = 0; + m_par_cntl = 0; + memset(m_regs, 0, sizeof(UINT32) * 0x40); +} + +#define KBDC_TAG "kbdc" +#define IOC2_TAG "ioc2" +#define RTC_TAG "ds1386" + +struct hpc3_t { - UINT32 nenetr_nbdp; - UINT32 nenetr_cbp; - UINT32 nunk0; - UINT32 nunk1; - UINT32 nIC_Unk0; - UINT32 nSCSI0Descriptor; - UINT32 nSCSI0DMACtrl; + UINT32 m_enetr_nbdp; + UINT32 m_enetr_cbp; + UINT32 m_unk0; + UINT32 m_unk1; + UINT32 m_ic_unk0; + UINT32 m_scsi0_desc; + UINT32 m_scsi0_dma_ctrl; }; -struct HAL2_t +struct m_hal2 { - UINT32 nIAR; - UINT32 nIDR[4]; + UINT32 m_iar; + UINT32 m_idr[4]; }; -struct PBUS_DMA_t +struct pbus_dma_t { - UINT8 nActive; - UINT32 nCurPtr; - UINT32 nDescPtr; - UINT32 nNextPtr; - UINT32 nWordsLeft; + UINT8 m_active; + UINT32 m_cur_ptr; + UINT32 m_desc_ptr; + UINT32 m_next_ptr; + UINT32 m_words_left; }; class ip22_state : public driver_device @@ -94,45 +138,29 @@ class ip22_state : public driver_device public: enum { - TIMER_IP22_DMA, - TIMER_IP22_MSEC + TIMER_IP22_DMA }; - ip22_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_wd33c93(*this, "wd33c93"), - m_unkpbus0(*this, "unkpbus0"), - m_mainram(*this, "mainram"), - m_lpt0(*this, "lpt_0"), - m_pit(*this, "pit8254"), - m_sgi_mc(*this, "sgi_mc"), - m_newport(*this, "newport"), - m_dac(*this, "dac"), - m_kbdc8042(*this, "kbdc") + ip22_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_wd33c93(*this, "wd33c93") + , m_unkpbus0(*this, "unkpbus0") + , m_mainram(*this, "mainram") + , m_lpt0(*this, "lpt_0") + , m_pit(*this, "pit8254") + , m_sgi_mc(*this, "sgi_mc") + , m_newport(*this, "newport") + , m_dac(*this, "dac") + , m_kbdc8042(*this, KBDC_TAG) + , m_ioc2(*this, IOC2_TAG) + , m_rtc(*this, RTC_TAG) { } - required_device<mips3_device> m_maincpu; - required_device<wd33c93_device> m_wd33c93; - required_shared_ptr<UINT32> m_unkpbus0; - required_shared_ptr<UINT32> m_mainram; - required_device<pc_lpt_device> m_lpt0; - required_device<pit8254_device> m_pit; - required_device<sgi_mc_device> m_sgi_mc; - required_device<newport_video_device> m_newport; - required_device<dac_device> m_dac; - required_device<kbdc8042_device> m_kbdc8042; + virtual void machine_start() override; + virtual void machine_reset() override; - RTC_t m_RTC; - UINT32 m_int3_regs[64]; - UINT32 m_nIOC_ParReadCnt; - /*UINT8 m_nIOC_ParCntl;*/ - HPC3_t m_HPC3; - HAL2_t m_HAL2; - PBUS_DMA_t m_PBUS_DMA; - UINT32 m_nIntCounter; - UINT8 m_dma_buffer[4096]; DECLARE_READ32_MEMBER(hpc3_pbus6_r); DECLARE_WRITE32_MEMBER(hpc3_pbus6_w); DECLARE_READ32_MEMBER(hpc3_hd_enet_r); @@ -141,30 +169,48 @@ public: DECLARE_WRITE32_MEMBER(hpc3_hd0_w); DECLARE_READ32_MEMBER(hpc3_pbus4_r); DECLARE_WRITE32_MEMBER(hpc3_pbus4_w); - DECLARE_READ32_MEMBER(rtc_r); - DECLARE_WRITE32_MEMBER(rtc_w); - DECLARE_WRITE32_MEMBER(ip22_write_ram); - DECLARE_READ32_MEMBER(hal2_r); - DECLARE_WRITE32_MEMBER(hal2_w); DECLARE_READ32_MEMBER(hpc3_pbusdma_r); DECLARE_WRITE32_MEMBER(hpc3_pbusdma_w); DECLARE_READ32_MEMBER(hpc3_unkpbus0_r); DECLARE_WRITE32_MEMBER(hpc3_unkpbus0_w); + + DECLARE_WRITE32_MEMBER(ip22_write_ram); + + DECLARE_READ32_MEMBER(hal2_r); + DECLARE_WRITE32_MEMBER(hal2_w); + DECLARE_WRITE_LINE_MEMBER(scsi_irq); + DECLARE_DRIVER_INIT(ip225015); - virtual void machine_start() override; - virtual void machine_reset() override; - INTERRUPT_GEN_MEMBER(ip22_vbl); + TIMER_CALLBACK_MEMBER(ip22_dma); - TIMER_CALLBACK_MEMBER(ip22_timer); - inline void ATTR_PRINTF(3,4) verboselog(int n_level, const char *s_fmt, ... ); - void int3_raise_local0_irq(UINT8 source_mask); - void int3_lower_local0_irq(UINT8 source_mask); - void dump_chain(address_space &space, UINT32 ch_base); - void rtc_update(); protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + + required_device<mips3_device> m_maincpu; + required_device<wd33c93_device> m_wd33c93; + required_shared_ptr<UINT32> m_unkpbus0; + required_shared_ptr<UINT32> m_mainram; + required_device<pc_lpt_device> m_lpt0; + required_device<pit8254_device> m_pit; + required_device<sgi_mc_device> m_sgi_mc; + required_device<newport_video_device> m_newport; + required_device<dac_device> m_dac; + required_device<kbdc8042_device> m_kbdc8042; + required_device<ioc2_device> m_ioc2; + required_device<ds1386_device> m_rtc; + + void dump_chain(address_space &space, UINT32 ch_base); + + hpc3_t m_hpc3; + + m_hal2 m_hal2; + + pbus_dma_t m_pbus_dma; + UINT8 m_dma_buffer[4096]; + + inline void ATTR_PRINTF(3,4) verboselog(int n_level, const char *s_fmt, ... ); }; @@ -185,12 +231,6 @@ inline void ATTR_PRINTF(3,4) ip22_state::verboselog(int n_level, const char *s_f } -#define RTC_DAY m_RTC.nRAM[0x09] -#define RTC_HOUR m_RTC.nRAM[0x08] -#define RTC_MINUTE m_RTC.nRAM[0x07] -#define RTC_SECOND m_RTC.nRAM[0x06] -#define RTC_HUNDREDTH m_RTC.nRAM[0x05] - // interrupt sources handled by INT3 #define INT3_LOCAL0_FIFO (0x01) #define INT3_LOCAL0_SCSI0 (0x02) @@ -210,41 +250,50 @@ inline void ATTR_PRINTF(3,4) ip22_state::verboselog(int n_level, const char *s_f #define INT3_LOCAL1_VSYNC (0x40) #define INT3_LOCAL1_RETRACE (0x80) -// raise a local0 interrupt -void ip22_state::int3_raise_local0_irq(UINT8 source_mask) +void ioc2_device::raise_local0_irq(UINT8 source_mask) { // signal the interrupt is pending - m_int3_regs[0] |= source_mask; + m_regs[0] |= source_mask; // if it's not masked, also assert it now at the CPU - if (m_int3_regs[1] & source_mask) + if (m_regs[1] & source_mask) m_maincpu->set_input_line(MIPS3_IRQ0, ASSERT_LINE); } -// lower a local0 interrupt -void ip22_state::int3_lower_local0_irq(UINT8 source_mask) +void ioc2_device::lower_local0_irq(UINT8 source_mask) { - m_int3_regs[0] &= ~source_mask; + m_regs[0] &= ~source_mask; } -#ifdef UNUSED_FUNCTION -// raise a local1 interrupt -void ip22_state::int3_raise_local1_irq(UINT8 source_mask) +void ioc2_device::raise_local1_irq(UINT8 source_mask) { // signal the interrupt is pending - m_int3_regs[2] |= source_mask; + m_regs[2] |= source_mask; // if it's not masked, also assert it now at the CPU - if (m_int3_regs[2] & source_mask) + if (m_regs[3] & source_mask) m_maincpu->set_input_line(MIPS3_IRQ1, ASSERT_LINE); } -// lower a local1 interrupt -void ip22_state::int3_lower_local1_irq(UINT8 source_mask) +void ioc2_device::lower_local1_irq(UINT8 source_mask) { - m_int3_regs[2] &= ~source_mask; + m_regs[2] &= ~source_mask; +} + +READ32_MEMBER( ioc2_device::int3_read ) +{ + return m_regs[offset]; +} + +WRITE32_MEMBER( ioc2_device::int3_write ) +{ + m_regs[offset] = data; + + for (int line = 0; line < 2; line++) + { + m_maincpu->set_input_line(MIPS3_IRQ0 + line, (m_regs[line*2] & m_regs[line*2+1]) != 0 ? ASSERT_LINE : CLEAR_LINE); + } } -#endif READ32_MEMBER(ip22_state::hpc3_pbus6_r) { @@ -293,8 +342,7 @@ READ32_MEMBER(ip22_state::hpc3_pbus6_r) case 0xa4/4: case 0xa8/4: case 0xac/4: -// osd_printf_info("INT3: r @ %x mask %08x (PC=%x)\n", offset*4, mem_mask, activecpu_get_pc()); - return m_int3_regs[offset-0x80/4]; + return m_ioc2->int3_read(space, offset-0x80/4, ~0); case 0xb0/4: ret8 = m_pit->read(space, 0); //verboselog(0, "HPC PBUS6 IOC4 Timer Counter 0 Register Read: 0x%02x (%08x)\n", ret8, mem_mask ); @@ -326,7 +374,7 @@ WRITE32_MEMBER(ip22_state::hpc3_pbus6_w) case 0x004/4: //verboselog(0, "Parallel Control Write: %08x\n", data ); m_lpt0->control_w(space, 0, data ^ 0x0d); - //m_nIOC_ParCntl = data; + //m_ioc_par_cntl = data; break; case 0x030/4: if( ( data & 0x000000ff ) >= 0x20 ) @@ -374,21 +422,7 @@ WRITE32_MEMBER(ip22_state::hpc3_pbus6_w) case 0x9c/4: case 0xa0/4: case 0xa4/4: -// osd_printf_info("INT3: w %x to %x (reg %d) mask %08x (PC=%x)\n", data, offset*4, offset-0x80/4, mem_mask, activecpu_get_pc()); - m_int3_regs[offset-0x80/4] = data; - - // if no local0 interrupts now, clear the input to the CPU - if ((m_int3_regs[0] & m_int3_regs[1]) == 0) - m_maincpu->set_input_line(MIPS3_IRQ0, CLEAR_LINE); - else - m_maincpu->set_input_line(MIPS3_IRQ0, ASSERT_LINE); - - // if no local1 interrupts now, clear the input to the CPU - if ((m_int3_regs[2] & m_int3_regs[3]) == 0) - m_maincpu->set_input_line(MIPS3_IRQ1, CLEAR_LINE); - else - m_maincpu->set_input_line(MIPS3_IRQ1, ASSERT_LINE); - + m_ioc2->int3_write(space, offset - 0x80/4, data, ~0); break; case 0xb0/4: //verboselog(0, "HPC PBUS6 IOC4 Timer Counter 0 Register Write: 0x%08x (%08x)\n", data, mem_mask ); @@ -417,17 +451,17 @@ READ32_MEMBER(ip22_state::hpc3_hd_enet_r) switch( offset ) { case 0x0004/4: - //verboselog((machine, 0, "HPC3 SCSI0DESC Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, m_HPC3.nSCSI0Descriptor ); - return m_HPC3.nSCSI0Descriptor; + //verboselog((machine, 0, "HPC3 SCSI0DESC Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, m_hpc3.m_scsi0_desc ); + return m_hpc3.m_scsi0_desc; case 0x1004/4: - //verboselog((machine, 0, "HPC3 SCSI0DMACTRL Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, m_HPC3.nSCSI0DMACtrl ); - return m_HPC3.nSCSI0DMACtrl; + //verboselog((machine, 0, "HPC3 SCSI0DMACTRL Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, m_hpc3.m_scsi0_dma_ctrl ); + return m_hpc3.m_scsi0_dma_ctrl; case 0x4000/4: - //verboselog((machine, 2, "HPC3 ENETR CBP Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, m_HPC3.nenetr_nbdp ); - return m_HPC3.nenetr_cbp; + //verboselog((machine, 2, "HPC3 ENETR CBP Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, m_hpc3.m_enetr_nbdp ); + return m_hpc3.m_enetr_cbp; case 0x4004/4: - //verboselog((machine, 2, "HPC3 ENETR NBDP Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, m_HPC3.nenetr_nbdp ); - return m_HPC3.nenetr_nbdp; + //verboselog((machine, 2, "HPC3 ENETR NBDP Read: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2), mem_mask, m_hpc3.m_enetr_nbdp ); + return m_hpc3.m_enetr_nbdp; default: //verboselog((machine, 0, "Unknown HPC3 ENET/HDx Read: %08x (%08x)\n", 0x1fb90000 + ( offset << 2 ), mem_mask ); return 0; @@ -440,19 +474,19 @@ WRITE32_MEMBER(ip22_state::hpc3_hd_enet_w) { case 0x0004/4: //verboselog((machine, 2, "HPC3 SCSI0DESC Write: %08x\n", data ); - m_HPC3.nSCSI0Descriptor = data; + m_hpc3.m_scsi0_desc = data; break; case 0x1004/4: //verboselog((machine, 2, "HPC3 SCSI0DMACTRL Write: %08x\n", data ); - m_HPC3.nSCSI0DMACtrl = data; + m_hpc3.m_scsi0_dma_ctrl = data; break; case 0x4000/4: //verboselog((machine, 2, "HPC3 ENETR CBP Write: %08x\n", data ); - m_HPC3.nenetr_cbp = data; + m_hpc3.m_enetr_cbp = data; break; case 0x4004/4: //verboselog((machine, 2, "HPC3 ENETR NBDP Write: %08x\n", data ); - m_HPC3.nenetr_nbdp = data; + m_hpc3.m_enetr_nbdp = data; break; default: //verboselog((machine, 0, "Unknown HPC3 ENET/HDx write: %08x (%08x): %08x\n", 0x1fb90000 + ( offset << 2 ), mem_mask, data ); @@ -524,14 +558,14 @@ READ32_MEMBER(ip22_state::hpc3_pbus4_r) switch( offset ) { case 0x0004/4: - //verboselog((machine, 2, "HPC3 PBUS4 Unknown 0 Read: (%08x): %08x\n", mem_mask, m_HPC3.nunk0 ); - return m_HPC3.nunk0; + //verboselog((machine, 2, "HPC3 PBUS4 Unknown 0 Read: (%08x): %08x\n", mem_mask, m_hpc3.m_unk0 ); + return m_hpc3.m_unk0; case 0x000c/4: - //verboselog((machine, 2, "Interrupt Controller(?) Read: (%08x): %08x\n", mem_mask, m_HPC3.nIC_Unk0 ); - return m_HPC3.nIC_Unk0; + //verboselog((machine, 2, "Interrupt Controller(?) Read: (%08x): %08x\n", mem_mask, m_hpc3.m_ic_unk0 ); + return m_hpc3.m_ic_unk0; case 0x0014/4: - //verboselog((machine, 2, "HPC3 PBUS4 Unknown 1 Read: (%08x): %08x\n", mem_mask, m_HPC3.nunk1 ); - return m_HPC3.nunk1; + //verboselog((machine, 2, "HPC3 PBUS4 Unknown 1 Read: (%08x): %08x\n", mem_mask, m_hpc3.m_unk1 ); + return m_hpc3.m_unk1; default: //verboselog((machine, 0, "Unknown HPC3 PBUS4 Read: %08x (%08x)\n", 0x1fbd9000 + ( offset << 2 ), mem_mask ); return 0; @@ -544,15 +578,15 @@ WRITE32_MEMBER(ip22_state::hpc3_pbus4_w) { case 0x0004/4: //verboselog((machine, 2, "HPC3 PBUS4 Unknown 0 Write: %08x (%08x)\n", data, mem_mask ); - m_HPC3.nunk0 = data; + m_hpc3.m_unk0 = data; break; case 0x000c/4: //verboselog((machine, 2, "Interrupt Controller(?) Write: (%08x): %08x\n", mem_mask, data ); - m_HPC3.nIC_Unk0 = data; + m_hpc3.m_ic_unk0 = data; break; case 0x0014/4: //verboselog((machine, 2, "HPC3 PBUS4 Unknown 1 Write: %08x (%08x)\n", data, mem_mask ); - m_HPC3.nunk1 = data; + m_hpc3.m_unk1 = data; break; default: //verboselog((machine, 0, "Unknown HPC3 PBUS4 Write: %08x (%08x): %08x\n", 0x1fbd9000 + ( offset << 2 ), mem_mask, data ); @@ -560,308 +594,6 @@ WRITE32_MEMBER(ip22_state::hpc3_pbus4_w) } } -#define RTC_SECONDS m_RTC.nRegs[0x00] -#define RTC_SECONDS_A m_RTC.nRegs[0x01] -#define RTC_MINUTES m_RTC.nRegs[0x02] -#define RTC_MINUTES_A m_RTC.nRegs[0x03] -#define RTC_HOURS m_RTC.nRegs[0x04] -#define RTC_HOURS_A m_RTC.nRegs[0x05] -#define RTC_DAYOFWEEK m_RTC.nRegs[0x06] -#define RTC_DAYOFMONTH m_RTC.nRegs[0x07] -#define RTC_MONTH m_RTC.nRegs[0x08] -#define RTC_YEAR m_RTC.nRegs[0x09] -#define RTC_REGISTERA m_RTC.nRegs[0x0a] -#define RTC_REGISTERB m_RTC.nRegs[0x0b] -#define RTC_REGISTERC m_RTC.nRegs[0x0c] -#define RTC_REGISTERD m_RTC.nRegs[0x0d] -#define RTC_MODELBYTE m_RTC.nRegs[0x40] -#define RTC_SERBYTE0 m_RTC.nRegs[0x41] -#define RTC_SERBYTE1 m_RTC.nRegs[0x42] -#define RTC_SERBYTE2 m_RTC.nRegs[0x43] -#define RTC_SERBYTE3 m_RTC.nRegs[0x44] -#define RTC_SERBYTE4 m_RTC.nRegs[0x45] -#define RTC_SERBYTE5 m_RTC.nRegs[0x46] -#define RTC_CRC m_RTC.nRegs[0x47] -#define RTC_CENTURY m_RTC.nRegs[0x48] -#define RTC_DAYOFMONTH_A m_RTC.nRegs[0x49] -#define RTC_EXTCTRL0 m_RTC.nRegs[0x4a] -#define RTC_EXTCTRL1 m_RTC.nRegs[0x4b] -#define RTC_RTCADDR2 m_RTC.nRegs[0x4e] -#define RTC_RTCADDR3 m_RTC.nRegs[0x4f] -#define RTC_RAMLSB m_RTC.nRegs[0x50] -#define RTC_RAMMSB m_RTC.nRegs[0x51] -#define RTC_WRITECNT m_RTC.nRegs[0x5e] - -READ32_MEMBER(ip22_state::rtc_r) -{ - if( offset <= 0x0d ) - { - switch( offset ) - { - case 0x0000: -// //verboselog((machine, 2, "RTC Seconds Read: %d \n", RTC_SECONDS ); - return RTC_SECONDS; - case 0x0001: -// //verboselog((machine, 2, "RTC Seconds Alarm Read: %d \n", RTC_SECONDS_A ); - return RTC_SECONDS_A; - case 0x0002: - //verboselog((machine, 3, "RTC Minutes Read: %d \n", RTC_MINUTES ); - return RTC_MINUTES; - case 0x0003: - //verboselog((machine, 3, "RTC Minutes Alarm Read: %d \n", RTC_MINUTES_A ); - return RTC_MINUTES_A; - case 0x0004: - //verboselog((machine, 3, "RTC Hours Read: %d \n", RTC_HOURS ); - return RTC_HOURS; - case 0x0005: - //verboselog((machine, 3, "RTC Hours Alarm Read: %d \n", RTC_HOURS_A ); - return RTC_HOURS_A; - case 0x0006: - //verboselog((machine, 3, "RTC Day of Week Read: %d \n", RTC_DAYOFWEEK ); - return RTC_DAYOFWEEK; - case 0x0007: - //verboselog((machine, 3, "RTC Day of Month Read: %d \n", RTC_DAYOFMONTH ); - return RTC_DAYOFMONTH; - case 0x0008: - //verboselog((machine, 3, "RTC Month Read: %d \n", RTC_MONTH ); - return RTC_MONTH; - case 0x0009: - //verboselog((machine, 3, "RTC Year Read: %d \n", RTC_YEAR ); - return RTC_YEAR; - case 0x000a: - //verboselog((machine, 3, "RTC Register A Read: %02x \n", RTC_REGISTERA ); - return RTC_REGISTERA; - case 0x000b: - //verboselog((machine, 3, "RTC Register B Read: %02x \n", RTC_REGISTERB ); - return RTC_REGISTERB; - case 0x000c: - //verboselog((machine, 3, "RTC Register C Read: %02x \n", RTC_REGISTERC ); - return RTC_REGISTERC; - case 0x000d: - //verboselog((machine, 3, "RTC Register D Read: %02x \n", RTC_REGISTERD ); - return RTC_REGISTERD; - default: - //verboselog((machine, 3, "Unknown RTC Read: %08x (%08x)\n", 0x1fbe0000 + ( offset << 2 ), mem_mask ); - return 0; - } - } - - if( offset >= 0x0e && offset < 0x40 ) - return m_RTC.nRegs[offset]; - - if( offset >= 0x40 && offset < 0x80 && !( RTC_REGISTERA & 0x10 ) ) - return m_RTC.nUserRAM[offset - 0x40]; - - if( offset >= 0x40 && offset < 0x80 && ( RTC_REGISTERA & 0x10 ) ) - { - switch( offset ) - { - case 0x0040: - //verboselog((machine, 3, "RTC Model Byte Read: %02x\n", RTC_MODELBYTE ); - return RTC_MODELBYTE; - case 0x0041: - //verboselog((machine, 3, "RTC Serial Byte 0 Read: %02x\n", RTC_SERBYTE0 ); - return RTC_SERBYTE0; - case 0x0042: - //verboselog((machine, 3, "RTC Serial Byte 1 Read: %02x\n", RTC_SERBYTE1 ); - return RTC_SERBYTE1; - case 0x0043: - //verboselog((machine, 3, "RTC Serial Byte 2 Read: %02x\n", RTC_SERBYTE2 ); - return RTC_SERBYTE2; - case 0x0044: - //verboselog((machine, 3, "RTC Serial Byte 3 Read: %02x\n", RTC_SERBYTE3 ); - return RTC_SERBYTE3; - case 0x0045: - //verboselog((machine, 3, "RTC Serial Byte 4 Read: %02x\n", RTC_SERBYTE4 ); - return RTC_SERBYTE4; - case 0x0046: - //verboselog((machine, 3, "RTC Serial Byte 5 Read: %02x\n", RTC_SERBYTE5 ); - return RTC_SERBYTE5; - case 0x0047: - //verboselog((machine, 3, "RTC CRC Read: %02x\n", RTC_CRC ); - return RTC_CRC; - case 0x0048: - //verboselog((machine, 3, "RTC Century Read: %02x\n", RTC_CENTURY ); - return RTC_CENTURY; - case 0x0049: - //verboselog((machine, 3, "RTC Day of Month Alarm Read: %02x \n", RTC_DAYOFMONTH_A ); - return RTC_DAYOFMONTH_A; - case 0x004a: - //verboselog((machine, 3, "RTC Extended Control 0 Read: %02x \n", RTC_EXTCTRL0 ); - return RTC_EXTCTRL0; - case 0x004b: - //verboselog((machine, 3, "RTC Extended Control 1 Read: %02x \n", RTC_EXTCTRL1 ); - return RTC_EXTCTRL1; - case 0x004e: - //verboselog((machine, 3, "RTC SMI Recovery Address 2 Read: %02x \n", RTC_RTCADDR2 ); - return RTC_RTCADDR2; - case 0x004f: - //verboselog((machine, 3, "RTC SMI Recovery Address 3 Read: %02x \n", RTC_RTCADDR3 ); - return RTC_RTCADDR3; - case 0x0050: - //verboselog((machine, 3, "RTC RAM LSB Read: %02x \n", RTC_RAMLSB ); - return RTC_RAMLSB; - case 0x0051: - //verboselog((machine, 3, "RTC RAM MSB Read: %02x \n", RTC_RAMMSB ); - return RTC_RAMMSB; - case 0x0053: - return m_RTC.nRAM[ (( RTC_RAMMSB << 8 ) | RTC_RAMLSB) & 0x7ff ]; - case 0x005e: - return RTC_WRITECNT; - default: - //verboselog((machine, 3, "Unknown RTC Ext. Reg. Read: %02x\n", offset ); - return 0; - } - } - - if( offset >= 0x80 ) - return m_RTC.nUserRAM[ offset - 0x80 ]; - - return 0; -} - -WRITE32_MEMBER(ip22_state::rtc_w) -{ - RTC_WRITECNT++; - -// osd_printf_info("RTC_W: offset %x => %x (PC=%x)\n", data, offset, space.device().safe_pc()); - - if( offset <= 0x0d ) - { - switch( offset ) - { - case 0x0000: - //verboselog((machine, 3, "RTC Seconds Write: %02x \n", data ); - RTC_SECONDS = data; - break; - case 0x0001: - //verboselog((machine, 3, "RTC Seconds Alarm Write: %02x \n", data ); - RTC_SECONDS_A = data; - break; - case 0x0002: - //verboselog((machine, 3, "RTC Minutes Write: %02x \n", data ); - RTC_MINUTES = data; - break; - case 0x0003: - //verboselog((machine, 3, "RTC Minutes Alarm Write: %02x \n", data ); - RTC_MINUTES_A = data; - break; - case 0x0004: - //verboselog((machine, 3, "RTC Hours Write: %02x \n", data ); - RTC_HOURS = data; - break; - case 0x0005: - //verboselog((machine, 3, "RTC Hours Alarm Write: %02x \n", data ); - RTC_HOURS_A = data; - break; - case 0x0006: - //verboselog((machine, 3, "RTC Day of Week Write: %02x \n", data ); - RTC_DAYOFWEEK = data; - break; - case 0x0007: - //verboselog((machine, 3, "RTC Day of Month Write: %02x \n", data ); - RTC_DAYOFMONTH = data; - break; - case 0x0008: - //verboselog((machine, 3, "RTC Month Write: %02x \n", data ); - RTC_MONTH = data; - break; - case 0x0009: - //verboselog((machine, 3, "RTC Year Write: %02x \n", data ); - RTC_YEAR = data; - break; - case 0x000a: - //verboselog((machine, 3, "RTC Register A Write (Bit 7 Ignored): %02x \n", data ); - RTC_REGISTERA = data & 0x0000007f; - break; - case 0x000b: - //verboselog((machine, 3, "RTC Register B Write: %02x \n", data ); - RTC_REGISTERB = data; - break; - case 0x000c: - //verboselog((machine, 3, "RTC Register C Write (Ignored): %02x \n", data ); - break; - case 0x000d: - //verboselog((machine, 3, "RTC Register D Write (Ignored): %02x \n", data ); - break; - default: - //verboselog((machine, 3, "Unknown RTC Write: %08x (%08x): %08x\n", 0x1fbe0000 + ( offset << 2 ), mem_mask, data ); - break; - } - } - if( offset >= 0x0e && offset < 0x40 ) - { - m_RTC.nRegs[offset] = data; - return; - } - if( offset >= 0x40 && offset < 0x80 && !( RTC_REGISTERA & 0x10 ) ) - { - m_RTC.nUserRAM[offset - 0x40] = data; - return; - } - if( offset >= 0x40 && offset < 0x80 && ( RTC_REGISTERA & 0x10 ) ) - { - switch( offset ) - { - case 0x0040: - case 0x0041: - case 0x0042: - case 0x0043: - case 0x0044: - case 0x0045: - case 0x0046: - //verboselog((machine, 3, "Invalid write to RTC serial number byte %d: %02x\n", offset - 0x0040, data ); - break; - case 0x0047: - //verboselog((machine, 3, "RTC Century Write: %02x \n", data ); - RTC_CENTURY = data; - break; - case 0x0048: - //verboselog((machine, 3, "RTC Century Write: %02x \n", data ); - RTC_CENTURY = data; - break; - case 0x0049: - //verboselog((machine, 3, "RTC Day of Month Alarm Write: %02x \n", data ); - RTC_DAYOFMONTH_A = data; - break; - case 0x004a: - //verboselog((machine, 3, "RTC Extended Control 0 Write: %02x \n", data ); - RTC_EXTCTRL0 = data; - break; - case 0x004b: - //verboselog((machine, 3, "RTC Extended Control 1 Write: %02x \n", data ); - RTC_EXTCTRL1 = data; - break; - case 0x004e: - //verboselog((machine, 3, "RTC SMI Recovery Address 2 Write: %02x \n", data ); - RTC_RTCADDR2 = data; - break; - case 0x004f: - //verboselog((machine, 3, "RTC SMI Recovery Address 3 Write: %02x \n", data ); - RTC_RTCADDR3 = data; - break; - case 0x0050: - //verboselog((machine, 3, "RTC RAM LSB Write: %02x \n", data ); - RTC_RAMLSB = data; - break; - case 0x0051: - //verboselog((machine, 3, "RTC RAM MSB Write: %02x \n", data ); - RTC_RAMMSB = data; - break; - case 0x0053: - m_RTC.nRAM[ (( RTC_RAMMSB << 8 ) | RTC_RAMLSB) & 0x7ff ] = data; - break; - default: - //verboselog((machine, 3, "Unknown RTC Ext. Reg. Write: %02x: %02x\n", offset, data ); - break; - } - } - if( offset >= 0x80 ) - { - m_RTC.nUserRAM[ offset - 0x80 ] = data; - } -} - // a bit hackish, but makes the memory detection work properly and allows a big cleanup of the mapping WRITE32_MEMBER(ip22_state::ip22_write_ram) { @@ -926,7 +658,7 @@ WRITE32_MEMBER(ip22_state::hal2_w) break; case 0x0030/4: //verboselog((machine, 0, "HAL2 Indirect Address Register Write: 0x%08x (%08x)\n", data, mem_mask ); - m_HAL2.nIAR = data; + m_hal2.m_iar = data; switch( data & H2_IAR_TYPE ) { case 0x1000: @@ -1003,19 +735,19 @@ WRITE32_MEMBER(ip22_state::hal2_w) //break; case 0x0040/4: //verboselog((machine, 0, "HAL2 Indirect Data Register 0 Write: 0x%08x (%08x)\n", data, mem_mask ); - m_HAL2.nIDR[0] = data; + m_hal2.m_idr[0] = data; return; case 0x0050/4: //verboselog((machine, 0, "HAL2 Indirect Data Register 1 Write: 0x%08x (%08x)\n", data, mem_mask ); - m_HAL2.nIDR[1] = data; + m_hal2.m_idr[1] = data; return; case 0x0060/4: //verboselog((machine, 0, "HAL2 Indirect Data Register 2 Write: 0x%08x (%08x)\n", data, mem_mask ); - m_HAL2.nIDR[2] = data; + m_hal2.m_idr[2] = data; return; case 0x0070/4: //verboselog((machine, 0, "HAL2 Indirect Data Register 3 Write: 0x%08x (%08x)\n", data, mem_mask ); - m_HAL2.nIDR[3] = data; + m_hal2.m_idr[3] = data; return; } //verboselog((machine, 0, "Unknown HAL2 write: 0x%08x: 0x%08x (%08x)\n", 0x1fbd8000 + offset*4, data, mem_mask ); @@ -1046,9 +778,6 @@ void ip22_state::device_timer(emu_timer &timer, device_timer_id id, int param, v case TIMER_IP22_DMA: ip22_dma(ptr, param); break; - case TIMER_IP22_MSEC: - ip22_timer(ptr, param); - break; default: assert_always(FALSE, "Unknown id in ip22_state::device_timer"); } @@ -1058,28 +787,28 @@ TIMER_CALLBACK_MEMBER(ip22_state::ip22_dma) { timer_set(attotime::never, TIMER_IP22_DMA); #if 0 - if( m_PBUS_DMA.nActive ) + if( m_pbus_dma.m_active ) { - UINT16 temp16 = ( m_mainram[(m_PBUS_DMA.nCurPtr - 0x08000000)/4] & 0xffff0000 ) >> 16; + UINT16 temp16 = ( m_mainram[(m_pbus_dma.m_cur_ptr - 0x08000000)/4] & 0xffff0000 ) >> 16; INT16 stemp16 = (INT16)((temp16 >> 8) | (temp16 << 8)); m_dac->write_signed16(stemp16 ^ 0x8000); - m_PBUS_DMA.nCurPtr += 4; + m_pbus_dma.m_cur_ptr += 4; - m_PBUS_DMA.nWordsLeft -= 4; - if( m_PBUS_DMA.nWordsLeft == 0 ) + m_pbus_dma.m_words_left -= 4; + if( m_pbus_dma.m_words_left == 0 ) { - if( m_PBUS_DMA.nNextPtr != 0 ) + if( m_pbus_dma.m_next_ptr != 0 ) { - m_PBUS_DMA.nDescPtr = m_PBUS_DMA.nNextPtr; - m_PBUS_DMA.nCurPtr = m_mainram[(m_PBUS_DMA.nDescPtr - 0x08000000)/4]; - m_PBUS_DMA.nWordsLeft = m_mainram[(m_PBUS_DMA.nDescPtr - 0x08000000)/4+1]; - m_PBUS_DMA.nNextPtr = m_mainram[(m_PBUS_DMA.nDescPtr - 0x08000000)/4+2]; + m_pbus_dma.m_desc_ptr = m_pbus_dma.m_next_ptr; + m_pbus_dma.m_cur_ptr = m_mainram[(m_pbus_dma.m_desc_ptr - 0x08000000)/4]; + m_pbus_dma.m_words_left = m_mainram[(m_pbus_dma.m_desc_ptr - 0x08000000)/4+1]; + m_pbus_dma.m_next_ptr = m_mainram[(m_pbus_dma.m_desc_ptr - 0x08000000)/4+2]; } else { - m_PBUS_DMA.nActive = 0; + m_pbus_dma.m_active = 0; return; } } @@ -1108,14 +837,14 @@ WRITE32_MEMBER(ip22_state::hpc3_pbusdma_w) //verboselog((machine, 0, "PBUS DMA Channel %d Descriptor Pointer Write: 0x%08x\n", channel, data ); if( channel == 1 ) { - m_PBUS_DMA.nDescPtr = data; - m_PBUS_DMA.nCurPtr = m_mainram[(m_PBUS_DMA.nDescPtr - 0x08000000)/4]; - m_PBUS_DMA.nWordsLeft = m_mainram[(m_PBUS_DMA.nDescPtr - 0x08000000)/4+1]; - m_PBUS_DMA.nNextPtr = m_mainram[(m_PBUS_DMA.nDescPtr - 0x08000000)/4+2]; - //verboselog((machine, 0, "nPBUS_DMA_DescPtr = %08x\n", m_PBUS_DMA.nDescPtr ); - //verboselog((machine, 0, "nPBUS_DMA_CurPtr = %08x\n", m_PBUS_DMA.nCurPtr ); - //verboselog((machine, 0, "nPBUS_DMA_WordsLeft = %08x\n", m_PBUS_DMA.nWordsLeft ); - //verboselog((machine, 0, "nPBUS_DMA_NextPtr = %08x\n", m_PBUS_DMA.nNextPtr ); + m_pbus_dma.m_desc_ptr = data; + m_pbus_dma.m_cur_ptr = m_mainram[(m_pbus_dma.m_desc_ptr - 0x08000000)/4]; + m_pbus_dma.m_words_left = m_mainram[(m_pbus_dma.m_desc_ptr - 0x08000000)/4+1]; + m_pbus_dma.m_next_ptr = m_mainram[(m_pbus_dma.m_desc_ptr - 0x08000000)/4+2]; + //verboselog((machine, 0, "nPBUS_DMA_DescPtr = %08x\n", m_pbus_dma.m_desc_ptr ); + //verboselog((machine, 0, "nPBUS_DMA_CurPtr = %08x\n", m_pbus_dma.m_cur_ptr ); + //verboselog((machine, 0, "nPBUS_DMA_WordsLeft = %08x\n", m_pbus_dma.m_words_left ); + //verboselog((machine, 0, "nPBUS_DMA_NextPtr = %08x\n", m_pbus_dma.m_next_ptr ); } return; case 0x1000/4: @@ -1154,7 +883,7 @@ WRITE32_MEMBER(ip22_state::hpc3_pbusdma_w) if( ( data & PBUS_CTRL_DMASTART ) || ( data & PBUS_CTRL_LOAD_EN ) ) { timer_set(attotime::from_hz(44100), TIMER_IP22_DMA); - m_PBUS_DMA.nActive = 1; + m_pbus_dma.m_active = 1; } return; } @@ -1190,31 +919,21 @@ static ADDRESS_MAP_START( ip225015_map, AS_PROGRAM, 32, ip22_state ) AM_RANGE( 0x1fbd9800, 0x1fbd9bff ) AM_READWRITE(hpc3_pbus6_r, hpc3_pbus6_w ) AM_RANGE( 0x1fbdc000, 0x1fbdc7ff ) AM_RAM AM_RANGE( 0x1fbdd000, 0x1fbdd3ff ) AM_RAM - AM_RANGE( 0x1fbe0000, 0x1fbe04ff ) AM_READWRITE(rtc_r, rtc_w ) + AM_RANGE( 0x1fbe0000, 0x1fbe04ff ) AM_DEVREADWRITE8(RTC_TAG, ds1386_device, data_r, data_w, 0x000000ff) AM_RANGE( 0x1fc00000, 0x1fc7ffff ) AM_ROM AM_REGION( "user1", 0 ) AM_RANGE( 0x20000000, 0x27ffffff ) AM_SHARE("mainram") AM_RAM_WRITE(ip22_write_ram) ADDRESS_MAP_END -TIMER_CALLBACK_MEMBER(ip22_state::ip22_timer) -{ - timer_set(attotime::from_msec(1), TIMER_IP22_MSEC); -} - void ip22_state::machine_reset() { - m_HPC3.nenetr_nbdp = 0x80000000; - m_HPC3.nenetr_cbp = 0x80000000; - m_nIntCounter = 0; - RTC_REGISTERB = 0x08; - RTC_REGISTERD = 0x80; - - timer_set(attotime::from_msec(1), TIMER_IP22_MSEC); + m_hpc3.m_enetr_nbdp = 0x80000000; + m_hpc3.m_enetr_cbp = 0x80000000; // set up low RAM mirror membank("bank1")->set_base(m_mainram); - m_PBUS_DMA.nActive = 0; + m_pbus_dma.m_active = 0; m_maincpu->mips3drc_set_options(MIPS3DRC_COMPATIBLE_OPTIONS | MIPS3DRC_CHECK_OVERFLOWS); } @@ -1245,13 +964,13 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) if (m_wd33c93->get_dma_count()) { printf("m_wd33c93->get_dma_count() is %d\n", m_wd33c93->get_dma_count() ); - if (m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_ENABLE) + if (m_hpc3.m_scsi0_dma_ctrl & HPC3_DMACTRL_ENABLE) { - if (m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_IRQ) logerror("IP22: Unhandled SCSI DMA IRQ\n"); + if (m_hpc3.m_scsi0_dma_ctrl & HPC3_DMACTRL_IRQ) logerror("IP22: Unhandled SCSI DMA IRQ\n"); } // HPC3 DMA: host to device - if ((m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_ENABLE) && (m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_DIR)) + if ((m_hpc3.m_scsi0_dma_ctrl & HPC3_DMACTRL_ENABLE) && (m_hpc3.m_scsi0_dma_ctrl & HPC3_DMACTRL_DIR)) { UINT32 wptr, tmpword; int words, dptr, twords; @@ -1259,13 +978,13 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) words = m_wd33c93->get_dma_count(); words /= 4; - wptr = space.read_dword(m_HPC3.nSCSI0Descriptor); - m_HPC3.nSCSI0Descriptor += words*4; + wptr = space.read_dword(m_hpc3.m_scsi0_desc); + m_hpc3.m_scsi0_desc += words*4; dptr = 0; printf("DMA to device: %d words @ %x\n", words, wptr); - dump_chain(space, m_HPC3.nSCSI0Descriptor); + dump_chain(space, m_hpc3.m_scsi0_desc); if (words <= (512/4)) { @@ -1276,7 +995,7 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) { tmpword = space.read_dword(wptr); - if (m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_ENDIAN) + if (m_hpc3.m_scsi0_dma_ctrl & HPC3_DMACTRL_ENDIAN) { m_dma_buffer[dptr+3] = (tmpword>>24)&0xff; m_dma_buffer[dptr+2] = (tmpword>>16)&0xff; @@ -1305,14 +1024,14 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) { //m_wd33c93->dma_read_data(512, m_dma_buffer); twords = 512/4; - m_HPC3.nSCSI0Descriptor += 512; + m_hpc3.m_scsi0_desc += 512; dptr = 0; while (twords) { tmpword = space.read_dword(wptr); - if (m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_ENDIAN) + if (m_hpc3.m_scsi0_dma_ctrl & HPC3_DMACTRL_ENDIAN) { m_dma_buffer[dptr+3] = (tmpword>>24)&0xff; m_dma_buffer[dptr+2] = (tmpword>>16)&0xff; @@ -1342,13 +1061,13 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) m_wd33c93->clear_dma(); #if 0 UINT32 dptr, tmpword; - UINT32 bc = space.read_dword(m_HPC3.nSCSI0Descriptor + 4); - UINT32 rptr = space.read_dword(m_HPC3.nSCSI0Descriptor); + UINT32 bc = space.read_dword(m_hpc3.m_scsi0_desc + 4); + UINT32 rptr = space.read_dword(m_hpc3.m_scsi0_desc); int length = bc & 0x3fff; int xie = (bc & 0x20000000) ? 1 : 0; int eox = (bc & 0x80000000) ? 1 : 0; - dump_chain(space, m_HPC3.nSCSI0Descriptor); + dump_chain(space, m_hpc3.m_scsi0_desc); printf("PC is %08x\n", machine.device("maincpu")->safe_pc()); printf("DMA to device: length %x xie %d eox %d\n", length, xie, eox); @@ -1359,7 +1078,7 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) while (length > 0) { tmpword = space.read_dword(rptr); - if (m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_ENDIAN) + if (m_hpc3.m_scsi0_dma_ctrl & HPC3_DMACTRL_ENDIAN) { m_dma_buffer[dptr+3] = (tmpword>>24)&0xff; m_dma_buffer[dptr+2] = (tmpword>>16)&0xff; @@ -1379,7 +1098,7 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) length -= 4; } - length = space.read_dword(m_HPC3.nSCSI0Descriptor+4) & 0x3fff; + length = space.read_dword(m_hpc3.m_scsi0_desc+4) & 0x3fff; m_wd33c93->write_data(length, m_dma_buffer); // clear DMA on the controller too @@ -1393,7 +1112,7 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) } // HPC3 DMA: device to host - if ((m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_ENABLE) && !(m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_DIR)) + if ((m_hpc3.m_scsi0_dma_ctrl & HPC3_DMACTRL_ENABLE) && !(m_hpc3.m_scsi0_dma_ctrl & HPC3_DMACTRL_DIR)) { UINT32 wptr, tmpword; int words, sptr, twords; @@ -1401,12 +1120,12 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) words = m_wd33c93->get_dma_count(); words /= 4; - wptr = space.read_dword(m_HPC3.nSCSI0Descriptor); + wptr = space.read_dword(m_hpc3.m_scsi0_desc); sptr = 0; // osd_printf_info("DMA from device: %d words @ %x\n", words, wptr); - dump_chain(space, m_HPC3.nSCSI0Descriptor); + dump_chain(space, m_hpc3.m_scsi0_desc); if (words <= (1024/4)) { @@ -1415,7 +1134,7 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) while (words) { - if (m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_ENDIAN) + if (m_hpc3.m_scsi0_dma_ctrl & HPC3_DMACTRL_ENDIAN) { tmpword = m_dma_buffer[sptr+3]<<24 | m_dma_buffer[sptr+2]<<16 | m_dma_buffer[sptr+1]<<8 | m_dma_buffer[sptr]; } @@ -1440,7 +1159,7 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) while (twords) { - if (m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_ENDIAN) + if (m_hpc3.m_scsi0_dma_ctrl & HPC3_DMACTRL_ENDIAN) { tmpword = m_dma_buffer[sptr+3]<<24 | m_dma_buffer[sptr+2]<<16 | m_dma_buffer[sptr+1]<<8 | m_dma_buffer[sptr]; } @@ -1465,29 +1184,25 @@ WRITE_LINE_MEMBER(ip22_state::scsi_irq) } // clear HPC3 DMA active flag - m_HPC3.nSCSI0DMACtrl &= ~HPC3_DMACTRL_ENABLE; + m_hpc3.m_scsi0_dma_ctrl &= ~HPC3_DMACTRL_ENABLE; // set the interrupt - int3_raise_local0_irq(INT3_LOCAL0_SCSI0); + m_ioc2->raise_local0_irq(INT3_LOCAL0_SCSI0); } else { - int3_lower_local0_irq(INT3_LOCAL0_SCSI0); + m_ioc2->lower_local0_irq(INT3_LOCAL0_SCSI0); } } void ip22_state::machine_start() { - // SCSI init - machine().device<nvram_device>("nvram_user")->set_base(m_RTC.nUserRAM, 0x200); - machine().device<nvram_device>("nvram")->set_base(m_RTC.nRAM, 0x200); } -DRIVER_INIT_MEMBER(ip22_state,ip225015) +DRIVER_INIT_MEMBER(ip22_state, ip225015) { // IP22 uses 2 pieces of PC-compatible hardware: the 8042 PS/2 keyboard/mouse // interface and the 8254 PIT. Both are licensed cores embedded in the IOC custom chip. - m_nIOC_ParReadCnt = 0; } static INPUT_PORTS_START( ip225015 ) @@ -1498,80 +1213,6 @@ static INPUT_PORTS_START( ip225015 ) PORT_INCLUDE( at_keyboard ) /* IN4 - IN11 */ INPUT_PORTS_END -void ip22_state::rtc_update() -{ - RTC_SECONDS++; - - switch( RTC_REGISTERB & 0x04 ) - { - case 0x00: /* Non-BCD */ - if( RTC_SECONDS == 60 ) - { - RTC_SECONDS = 0; - RTC_MINUTES++; - } - if( RTC_MINUTES == 60 ) - { - RTC_MINUTES = 0; - RTC_HOURS++; - } - if( RTC_HOURS == 24 ) - { - RTC_HOURS = 0; - RTC_DAYOFMONTH++; - } - RTC_SECONDS_A = RTC_SECONDS; - RTC_MINUTES_A = RTC_MINUTES; - RTC_HOURS_A = RTC_HOURS; - break; - case 0x04: /* BCD */ - if( ( RTC_SECONDS & 0x0f ) == 0x0a ) - { - RTC_SECONDS -= 0x0a; - RTC_SECONDS += 0x10; - } - if( ( RTC_SECONDS & 0xf0 ) == 0x60 ) - { - RTC_SECONDS -= 0x60; - RTC_MINUTES++; - } - if( ( RTC_MINUTES & 0x0f ) == 0x0a ) - { - RTC_MINUTES -= 0x0a; - RTC_MINUTES += 0x10; - } - if( ( RTC_MINUTES & 0xf0 ) == 0x60 ) - { - RTC_MINUTES -= 0x60; - RTC_HOURS++; - } - if( ( RTC_HOURS & 0x0f ) == 0x0a ) - { - RTC_HOURS -= 0x0a; - RTC_HOURS += 0x10; - } - if( RTC_HOURS == 0x24 ) - { - RTC_HOURS = 0; - RTC_DAYOFMONTH++; - } - RTC_SECONDS_A = RTC_SECONDS; - RTC_MINUTES_A = RTC_MINUTES; - RTC_HOURS_A = RTC_HOURS; - break; - } -} - -INTERRUPT_GEN_MEMBER(ip22_state::ip22_vbl) -{ - m_nIntCounter++; -// if( m_nIntCounter == 60 ) - { - m_nIntCounter = 0; - rtc_update(); - } -} - static MACHINE_CONFIG_FRAGMENT( cdrom_config ) MCFG_DEVICE_MODIFY( "cdda" ) MCFG_SOUND_ROUTE( 0, "^^^^lspeaker", 1.0 ) @@ -1583,11 +1224,6 @@ static MACHINE_CONFIG_START( ip225015, ip22_state ) //MCFG_MIPS3_ICACHE_SIZE(32768) //MCFG_MIPS3_DCACHE_SIZE(32768) MCFG_CPU_PROGRAM_MAP( ip225015_map) - MCFG_CPU_VBLANK_INT_DRIVER("screen", ip22_state, ip22_vbl) - - - MCFG_NVRAM_ADD_0FILL("nvram") - MCFG_NVRAM_ADD_0FILL("nvram_user") MCFG_DEVICE_ADD("pit8254", PIT8254, 0) MCFG_PIT8253_CLK0(1000000) @@ -1628,6 +1264,10 @@ static MACHINE_CONFIG_START( ip225015, ip22_state ) MCFG_DEVICE_ADD("kbdc", KBDC8042, 0) MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_STANDARD) MCFG_KBDC8042_SYSTEM_RESET_CB(INPUTLINE("maincpu", INPUT_LINE_RESET)) + + MCFG_IOC2_ADD(IOC2_TAG) + + MCFG_DS1386_8K_ADD(RTC_TAG, 32768) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( ip224613, ip225015 ) @@ -1635,7 +1275,6 @@ static MACHINE_CONFIG_DERIVED( ip224613, ip225015 ) //MCFG_MIPS3_ICACHE_SIZE(32768) //MCFG_MIPS3_DCACHE_SIZE(32768) MCFG_CPU_PROGRAM_MAP( ip225015_map) - MCFG_CPU_VBLANK_INT_DRIVER("screen", ip22_state, ip22_vbl) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( ip244415, ip225015 ) @@ -1643,7 +1282,6 @@ static MACHINE_CONFIG_DERIVED( ip244415, ip225015 ) //MCFG_MIPS3_ICACHE_SIZE(32768) //MCFG_MIPS3_DCACHE_SIZE(32768) MCFG_CPU_PROGRAM_MAP( ip225015_map) - MCFG_CPU_VBLANK_INT_DRIVER("screen", ip22_state, ip22_vbl) MACHINE_CONFIG_END ROM_START( ip225015 ) diff --git a/src/tools/imgtool/imgtool.h b/src/tools/imgtool/imgtool.h index db51ea75e16..809fdd5b187 100644 --- a/src/tools/imgtool/imgtool.h +++ b/src/tools/imgtool/imgtool.h @@ -14,6 +14,7 @@ #include <stdlib.h> #include <stdio.h> #include <assert.h> +#include <functional> #include "corestr.h" #include "formats/flopimg.h" @@ -202,23 +203,23 @@ namespace imgtool unsigned int m_supports_lastmodified_time : 1; unsigned int m_supports_bootblock : 1; /* this module supports loading/storing the boot block */ - imgtoolerr_t(*m_begin_enum) (imgtool::directory *enumeration, const char *path); - imgtoolerr_t(*m_next_enum) (imgtool::directory *enumeration, imgtool_dirent *ent); - void(*m_close_enum) (imgtool::directory *enumeration); - imgtoolerr_t(*m_free_space) (imgtool::partition *partition, UINT64 *size); - imgtoolerr_t(*m_read_file) (imgtool::partition *partition, const char *filename, const char *fork, imgtool::stream &destf); - imgtoolerr_t(*m_write_file) (imgtool::partition *partition, const char *filename, const char *fork, imgtool::stream &sourcef, util::option_resolution *opts); - imgtoolerr_t(*m_delete_file) (imgtool::partition *partition, const char *filename); - imgtoolerr_t(*m_list_forks) (imgtool::partition *partition, const char *path, imgtool_forkent *ents, size_t len); - imgtoolerr_t(*m_create_dir) (imgtool::partition *partition, const char *path); - imgtoolerr_t(*m_delete_dir) (imgtool::partition *partition, const char *path); - imgtoolerr_t(*m_list_attrs) (imgtool::partition *partition, const char *path, UINT32 *attrs, size_t len); - imgtoolerr_t(*m_get_attrs) (imgtool::partition *partition, const char *path, const UINT32 *attrs, imgtool_attribute *values); - imgtoolerr_t(*m_set_attrs) (imgtool::partition *partition, const char *path, const UINT32 *attrs, const imgtool_attribute *values); - imgtoolerr_t(*m_attr_name) (UINT32 attribute, const imgtool_attribute *attr, char *buffer, size_t buffer_len); - imgtoolerr_t(*m_get_iconinfo) (imgtool::partition *partition, const char *path, imgtool_iconinfo *iconinfo); - imgtoolerr_t(*m_suggest_transfer)(imgtool::partition *partition, const char *path, imgtool_transfer_suggestion *suggestions, size_t suggestions_length); - imgtoolerr_t(*m_get_chain) (imgtool::partition *partition, const char *path, imgtool_chainent *chain, size_t chain_size); + std::function<imgtoolerr_t(imgtool::directory *enumeration, const char *path)> m_begin_enum; + std::function<imgtoolerr_t(imgtool::directory *enumeration, imgtool_dirent *ent)> m_next_enum; + std::function<void(imgtool::directory *enumeration)> m_close_enum; + std::function<imgtoolerr_t(imgtool::partition *partition, UINT64 *size)> m_free_space; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *filename, const char *fork, imgtool::stream &destf)> m_read_file; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *filename, const char *fork, imgtool::stream &sourcef, util::option_resolution *opts)> m_write_file; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *filename)> m_delete_file; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *path, imgtool_forkent *ents, size_t len)> m_list_forks; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *path)> m_create_dir; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *path)> m_delete_dir; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *path, UINT32 *attrs, size_t len)> m_list_attrs; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *path, const UINT32 *attrs, imgtool_attribute *values)> m_get_attrs; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *path, const UINT32 *attrs, const imgtool_attribute *values)> m_set_attrs; + std::function<imgtoolerr_t(UINT32 attribute, const imgtool_attribute *attr, char *buffer, size_t buffer_len)> m_attr_name; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *path, imgtool_iconinfo *iconinfo)> m_get_iconinfo; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *path, imgtool_transfer_suggestion *suggestions, size_t suggestions_length)> m_suggest_transfer; + std::function<imgtoolerr_t(imgtool::partition *partition, const char *path, imgtool_chainent *chain, size_t chain_size)> m_get_chain; const util::option_guide *m_writefile_optguide; std::string m_writefile_optspec; |