diff options
Diffstat (limited to 'src/mess/drivers/px4.c')
-rw-r--r-- | src/mess/drivers/px4.c | 238 |
1 files changed, 155 insertions, 83 deletions
diff --git a/src/mess/drivers/px4.c b/src/mess/drivers/px4.c index 404b7776831..b6fe5eb48a8 100644 --- a/src/mess/drivers/px4.c +++ b/src/mess/drivers/px4.c @@ -21,6 +21,7 @@ #include "sound/speaker.h" #include "bus/generic/slot.h" #include "bus/generic/carts.h" +#include "coreutil.h" #include "px4.lh" @@ -70,6 +71,7 @@ public: m_swr(0), m_one_sec_int_enabled(true), m_alarm_int_enabled(true), m_key_int_enabled(true), m_key_status(0), m_interrupt_status(0), + m_time(), m_clock_state(0), m_ear_last_state(0), m_sio_pin(0), m_serial_rx(0), m_rs232_dcd(0), m_rs232_cts(0), m_centronics_busy(0), m_centronics_perror(0) @@ -230,6 +232,9 @@ private: UINT8 m_key_status; UINT8 m_interrupt_status; + system_time m_time; + int m_clock_state; + // external cassette/barcode reader int m_ear_last_state; @@ -553,6 +558,26 @@ READ8_MEMBER( px4_state::sior_r ) if (0) logerror("%s: sior_r 0x%02x\n", machine().describe_context(), m_sior); + // reading clock? + if (m_clock_state > 0) + { + switch (m_clock_state++) + { + case 1: m_sior = (dec_2_bcd(m_time.local_time.year) >> 4) & 0xf; break; + case 2: m_sior = dec_2_bcd(m_time.local_time.year) & 0xf; break; + case 3: m_sior = dec_2_bcd(m_time.local_time.month + 1); break; + case 4: m_sior = dec_2_bcd(m_time.local_time.mday); break; + case 5: m_sior = dec_2_bcd(m_time.local_time.hour); break; + case 6: m_sior = dec_2_bcd(m_time.local_time.minute); break; + case 7: m_sior = dec_2_bcd(m_time.local_time.second); break; + case 8: m_sior = dec_2_bcd(m_time.local_time.weekday); break; + } + + // done? + if (m_clock_state == 9) + m_clock_state = 0; + } + return m_sior; } @@ -562,122 +587,163 @@ WRITE8_MEMBER( px4_state::sior_w ) if (0) logerror("%s: sior_w (0x%02x)\n", machine().describe_context(), data); - m_sior = data; - - switch (data) + // writing clock? + if (m_clock_state > 0) { - case 0x01: - - if (VERBOSE) - logerror("7508 cmd: Power OFF\n"); + struct tm *t = localtime(&m_time.time); - break; + switch (m_clock_state++) + { + case 1: + { + int year = dec_2_bcd(m_time.local_time.year); + year = (year & 0xff0f) | ((data & 0xf) << 4); + t->tm_year = bcd_2_dec(year) - 1900; + } + break; + case 2: + { + int year = dec_2_bcd(m_time.local_time.year); + year = (year & 0xfff0) | (data & 0xf); + t->tm_year = bcd_2_dec(year) - 1900; + } + break; + case 3: t->tm_mon = bcd_2_dec(data & 0x7f) - 1; break; + case 4: t->tm_mday = bcd_2_dec(data & 0x7f); break; + case 5: t->tm_hour = bcd_2_dec(data & 0x7f); break; + case 6: t->tm_min = bcd_2_dec(data & 0x7f); break; + case 7: t->tm_sec = bcd_2_dec(data & 0x7f); break; + case 8: t->tm_wday = bcd_2_dec(data & 0x7f); break; + } - case 0x02: + // update + m_time.set(mktime(t)); - if (VERBOSE) - logerror("7508 cmd: Read Status\n"); + // done? + if (m_clock_state == 9) + m_clock_state = 0; + } + else + { + m_sior = data; - if (m_interrupt_status != 0) + switch (data) { + case 0x01: if (VERBOSE) - logerror("> 7508 has interrupts pending: 0x%02x\n", m_interrupt_status); + logerror("7508 cmd: Power OFF\n"); - // signal the interrupt(s) - m_sior = 0xc1 | m_interrupt_status; - m_interrupt_status = 0x00; - } - else if (m_key_status != 0xff) - { - m_sior = m_key_status; - m_key_status = 0xff; - } - else - { - // nothing happened - m_sior = 0xbf; - } - - break; + break; - case 0x03: if (VERBOSE) logerror("7508 cmd: KB Reset\n"); break; - case 0x04: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 1 Set\n"); break; - case 0x14: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 2 Set\n"); break; - case 0x24: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 1 Read\n"); break; - case 0x34: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 2 Read\n"); break; - case 0x05: if (VERBOSE) logerror("7508 cmd: KB Repeat OFF\n"); break; - case 0x15: if (VERBOSE) logerror("7508 cmd: KB Repeat ON\n"); break; + case 0x02: + if (VERBOSE) + logerror("7508 cmd: Read Status\n"); - case 0x06: + if (m_interrupt_status != 0) + { + if (VERBOSE) + logerror("> 7508 has interrupts pending: 0x%02x\n", m_interrupt_status); - if (VERBOSE) - logerror("7508 cmd: KB Interrupt OFF\n"); + // signal the interrupt(s) + m_sior = 0xc1 | m_interrupt_status; + m_interrupt_status = 0x00; + } + else if (m_key_status != 0xff) + { + m_sior = m_key_status; + m_key_status = 0xff; + } + else + { + // nothing happened + m_sior = 0xbf; + } - m_key_int_enabled = false; - break; + break; - case 0x16: + case 0x03: if (VERBOSE) logerror("7508 cmd: KB Reset\n"); break; + case 0x04: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 1 Set\n"); break; + case 0x14: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 2 Set\n"); break; + case 0x24: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 1 Read\n"); break; + case 0x34: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 2 Read\n"); break; + case 0x05: if (VERBOSE) logerror("7508 cmd: KB Repeat OFF\n"); break; + case 0x15: if (VERBOSE) logerror("7508 cmd: KB Repeat ON\n"); break; - if (VERBOSE) - logerror("7508 cmd: KB Interrupt ON\n"); + case 0x06: + if (VERBOSE) + logerror("7508 cmd: KB Interrupt OFF\n"); - m_key_int_enabled = true; - break; + m_key_int_enabled = false; + break; - case 0x07: if (VERBOSE) logerror("7508 cmd: Clock Read\n"); break; - case 0x17: if (VERBOSE) logerror("7508 cmd: Clock Write\n"); break; + case 0x16: + if (VERBOSE) + logerror("7508 cmd: KB Interrupt ON\n"); - case 0x08: + m_key_int_enabled = true; + break; - if (VERBOSE) - logerror("7508 cmd: Power Switch Read\n"); + case 0x07: + if (VERBOSE) + logerror("7508 cmd: Clock Read\n"); - // indicate that the power switch is in the "ON" position - m_sior = 0x01; - break; + m_clock_state = 1; + break; - case 0x09: if (VERBOSE) logerror("7508 cmd: Alarm Read\n"); break; - case 0x19: if (VERBOSE) logerror("7508 cmd: Alarm Set\n"); break; - case 0x29: if (VERBOSE) logerror("7508 cmd: Alarm OFF\n"); break; - case 0x39: if (VERBOSE) logerror("7508 cmd: Alarm ON\n"); break; + case 0x17: + if (VERBOSE) + logerror("7508 cmd: Clock Write\n"); - case 0x0a: + m_clock_state = 1; + break; - if (VERBOSE) - logerror("7508 cmd: DIP Switch Read\n"); - m_sior = ioport("dips")->read(); - break; + case 0x08: + if (VERBOSE) + logerror("7508 cmd: Power Switch Read\n"); - case 0x0b: if (VERBOSE) logerror("7508 cmd: Stop Key Interrupt disable\n"); break; - case 0x1b: if (VERBOSE) logerror("7508 cmd: Stop Key Interrupt enable\n"); break; - case 0x0c: if (VERBOSE) logerror("7508 cmd: 7 chr. Buffer\n"); break; - case 0x1c: if (VERBOSE) logerror("7508 cmd: 1 chr. Buffer\n"); break; + // indicate that the power switch is in the "ON" position + m_sior = 0x01; + break; - case 0x0d: + case 0x09: if (VERBOSE) logerror("7508 cmd: Alarm Read\n"); break; + case 0x19: if (VERBOSE) logerror("7508 cmd: Alarm Set\n"); break; + case 0x29: if (VERBOSE) logerror("7508 cmd: Alarm OFF\n"); break; + case 0x39: if (VERBOSE) logerror("7508 cmd: Alarm ON\n"); break; - if (VERBOSE) - logerror("7508 cmd: 1 sec. Interrupt OFF\n"); + case 0x0a: + if (VERBOSE) + logerror("7508 cmd: DIP Switch Read\n"); + m_sior = ioport("dips")->read(); + break; - m_one_sec_int_enabled = false; - break; + case 0x0b: if (VERBOSE) logerror("7508 cmd: Stop Key Interrupt disable\n"); break; + case 0x1b: if (VERBOSE) logerror("7508 cmd: Stop Key Interrupt enable\n"); break; + case 0x0c: if (VERBOSE) logerror("7508 cmd: 7 chr. Buffer\n"); break; + case 0x1c: if (VERBOSE) logerror("7508 cmd: 1 chr. Buffer\n"); break; - case 0x1d: + case 0x0d: + if (VERBOSE) + logerror("7508 cmd: 1 sec. Interrupt OFF\n"); - if (VERBOSE) - logerror("7508 cmd: 1 sec. Interrupt ON\n"); + m_one_sec_int_enabled = false; + break; - m_one_sec_int_enabled = true; - break; + case 0x1d: + if (VERBOSE) + logerror("7508 cmd: 1 sec. Interrupt ON\n"); - case 0x0e: + m_one_sec_int_enabled = true; + break; - if (VERBOSE) - logerror("7508 cmd: KB Clear\n"); + case 0x0e: + if (VERBOSE) + logerror("7508 cmd: KB Clear\n"); - m_sior = 0xbf; - break; + m_sior = 0xbf; + break; - case 0x0f: if (VERBOSE) logerror("7508 cmd: System Reset\n"); break; + case 0x0f: if (VERBOSE) logerror("7508 cmd: System Reset\n"); break; + } } } @@ -1000,6 +1066,9 @@ TIMER_DEVICE_CALLBACK_MEMBER( px4_state::upd7508_1sec_callback ) m_isr |= INT0_7508; gapnit_interrupt(); } + + // update clock + m_time.set(m_time.time + 1); } INPUT_CHANGED_MEMBER( px4_state::key_callback ) @@ -1163,6 +1232,9 @@ void px4_state::machine_start() m_caps2_rom = memregion(region_tag.cpy(m_caps2->tag()).cat(GENERIC_ROM_REGION_TAG)); m_nvram->set_base(m_ram->pointer(), 0x10000); + + // initialize clock + machine().base_datetime(m_time); } void px4_state::machine_reset() |