diff options
-rw-r--r-- | src/devices/machine/i8279.cpp | 148 | ||||
-rw-r--r-- | src/devices/machine/i8279.h | 38 |
2 files changed, 102 insertions, 84 deletions
diff --git a/src/devices/machine/i8279.cpp b/src/devices/machine/i8279.cpp index 6e20cb291a4..ccff02478fd 100644 --- a/src/devices/machine/i8279.cpp +++ b/src/devices/machine/i8279.cpp @@ -17,7 +17,6 @@ ToDo: - Interrupts - BD pin - Sensor ram stuff -- save state What has been done: @@ -91,7 +90,7 @@ DEFINE_DEVICE_TYPE(I8279, i8279_device, "i8279", "Intel 8279 KDC") // i8279_device - constructor //------------------------------------------------- -i8279_device::i8279_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) +i8279_device::i8279_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : device_t(mconfig, I8279, tag, owner, clock), m_out_irq_cb(*this), m_out_sl_cb(*this), @@ -117,8 +116,23 @@ void i8279_device::device_start() m_in_rl_cb.resolve(); m_in_shift_cb.resolve(); m_in_ctrl_cb.resolve(); - m_clock = clock(); + m_scanclock = clock(); m_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(i8279_device::timerproc_callback), this)); + + // save state + save_item(NAME(m_d_ram)); + save_item(NAME(m_d_ram_ptr)); + save_item(NAME(m_s_ram)); + save_item(NAME(m_s_ram_ptr)); + save_item(NAME(m_fifo)); + save_item(NAME(m_cmd)); + save_item(NAME(m_status)); + save_item(NAME(m_scanclock)); + save_item(NAME(m_scanner)); + save_item(NAME(m_autoinc)); + save_item(NAME(m_read_flag)); + save_item(NAME(m_ctrl_key)); + save_item(NAME(m_key_down)); } @@ -128,13 +142,11 @@ void i8279_device::device_start() void i8279_device::device_reset() { - uint8_t i; - // startup values are unknown: setting to 0 - for (i = 2; i < 8; i++) m_cmd[i] = 0; - for (i = 0; i < 8; i++) m_fifo[i] = 0; - for (i = 0; i < 8; i++) m_s_ram[i] = 0; - for (i = 0; i < 16; i++) m_d_ram[i] = 0; + for (u8 i = 2; i < 8; i++) m_cmd[i] = 0; + for (u8 i = 0; i < 8; i++) m_fifo[i] = 0; + for (u8 i = 0; i < 8; i++) m_s_ram[i] = 0; + for (u8 i = 0; i < 16; i++) m_d_ram[i] = 0; m_status = 0; m_autoinc = true; m_d_ram_ptr = 0; @@ -159,17 +171,17 @@ void i8279_device::timer_adjust() // If this is too long, the sensor mode doesn't work correctly. #if 0 - uint8_t divider = (m_cmd[1]) ? m_cmd[1] : 1; - uint32_t new_clock = clock() / divider; + u8 divider = (m_cmd[1]) ? m_cmd[1] : 1; + u32 new_clock = clock() / divider; #else - uint32_t new_clock = 2000; + u32 new_clock = 2000; #endif - if (m_clock != new_clock) + if (m_scanclock != new_clock) { m_timer->adjust(attotime::from_hz(new_clock), 0, attotime::from_hz(new_clock)); - m_clock = new_clock; + m_scanclock = new_clock; } } @@ -177,8 +189,8 @@ void i8279_device::timer_adjust() void i8279_device::clear_display() { // clear all digits - uint8_t i,patterns[4] = { 0, 0, 0x20, 0xff }; - uint8_t data = patterns[(m_cmd[6] & 12) >> 2]; + u8 i,patterns[4] = { 0, 0, 0x20, 0xff }; + u8 data = patterns[(m_cmd[6] & 12) >> 2]; // The CD high bit (also done by CA) if (m_cmd[6] & 0x11) @@ -205,9 +217,9 @@ void i8279_device::set_irq(bool state) } -void i8279_device::new_key(uint8_t data, bool skey, bool ckey) +void i8279_device::new_key(u8 data, bool skey, bool ckey) { - uint8_t i, rl, sl; + u8 i, rl, sl; for (i = 0; BIT(data, i); i++) {}; rl = i; if (BIT(m_cmd[0], 0)) @@ -222,7 +234,7 @@ void i8279_device::new_key(uint8_t data, bool skey, bool ckey) } -void i8279_device::new_fifo(uint8_t data) +void i8279_device::new_fifo(u8 data) { // see if already overrun if (BIT(m_status, 5)) @@ -238,7 +250,7 @@ void i8279_device::new_fifo(uint8_t data) m_fifo[m_status & 7] = data; // bump fifo size & turn off underrun - uint8_t fifo_size = m_status & 7; + u8 fifo_size = m_status & 7; if ((fifo_size)==7) m_status |= 8; // full else @@ -263,9 +275,9 @@ void i8279_device::timer_mainloop() // bit 3 - number of digits to display // bit 4 - left or right entry - uint8_t scanner_mask = BIT(m_cmd[0], 0) ? 15 : BIT(m_cmd[0], 3) ? 15 : 7; + u8 scanner_mask = BIT(m_cmd[0], 0) ? 15 : BIT(m_cmd[0], 3) ? 15 : 7; bool decoded = BIT(m_cmd[0], 0); - uint8_t kbd_type = (m_cmd[0] & 6) >> 1; + u8 kbd_type = (m_cmd[0] & 6) >> 1; bool shift_key = 1; bool ctrl_key = 1; bool strobe_pulse = 0; @@ -292,10 +304,10 @@ void i8279_device::timer_mainloop() if ( !m_in_rl_cb.isnull() ) { - uint8_t rl = m_in_rl_cb(0); + u8 rl = m_in_rl_cb(0); // see if key still down from last time - uint16_t key_down = (m_scanner << 8) | rl; + u16 key_down = (m_scanner << 8) | rl; if (key_down == m_key_down) rl = 0xff; else @@ -314,7 +326,7 @@ void i8279_device::timer_mainloop() break; case 2: { - uint8_t addr = m_scanner &7; + u8 addr = m_scanner &7; if (decoded) for (addr=0; !BIT(m_scanner, addr); addr++) {}; @@ -360,29 +372,29 @@ void i8279_device::timer_mainloop() } -READ8_MEMBER(i8279_device::read) +u8 i8279_device::read(offs_t offset) { // A0 = control/data select - return (offset & 1) ? status_r(space, 0) : data_r(space, 0); + return (offset & 1) ? status_r() : data_r(); } -READ8_MEMBER( i8279_device::status_r ) +u8 i8279_device::status_r() { return m_status; } -READ8_MEMBER( i8279_device::data_r ) +u8 i8279_device::data_r() { - uint8_t i; + u8 i; bool sensor_mode = ((m_cmd[0] & 6)==4); - uint8_t data; + u8 data; if (m_read_flag) { // read the display ram data = m_d_ram[m_d_ram_ptr]; - if (m_autoinc) + if (m_autoinc && !machine().side_effects_disabled()) { m_d_ram_ptr++; } @@ -393,44 +405,50 @@ READ8_MEMBER( i8279_device::data_r ) // read sensor ram assert(m_s_ram_ptr < ARRAY_LENGTH(m_s_ram)); data = m_s_ram[m_s_ram_ptr]; - if (m_autoinc) - { - m_s_ram_ptr++; - } - else + if (!machine().side_effects_disabled()) { - set_irq(0); + if (m_autoinc) + { + m_s_ram_ptr++; + } + else + { + set_irq(0); + } } } else { // read a key from fifo data = m_fifo[0]; - uint8_t fifo_size = m_status & 7; - switch (m_status & 0x38) + u8 fifo_size = m_status & 7; + if (!machine().side_effects_disabled()) { - case 0x00: // no errors - if (!fifo_size) - m_status |= 0x10; // underrun - else - { + switch (m_status & 0x38) + { + case 0x00: // no errors + if (!fifo_size) + m_status |= 0x10; // underrun + else + { + for (i = 1; i < 8; i++) + m_fifo[i-1] = m_fifo[i]; + fifo_size--; + if (!fifo_size) + set_irq(0); + } + break; + case 0x28: // overrun + case 0x08: // fifo full for (i = 1; i < 8; i++) m_fifo[i-1] = m_fifo[i]; - fifo_size--; - if (!fifo_size) - set_irq(0); - } - break; - case 0x28: // overrun - case 0x08: // fifo full - for (i = 1; i < 8; i++) - m_fifo[i-1] = m_fifo[i]; - break; - case 0x10: // underrun - if (!fifo_size) break; - default: - printf("Invalid status: %X\n", m_status); + case 0x10: // underrun + if (!fifo_size) + break; + default: + printf("Invalid status: %X\n", m_status); + } } m_status = (m_status & 0xd0) | fifo_size; // turn off overrun & full } @@ -441,19 +459,19 @@ READ8_MEMBER( i8279_device::data_r ) } -WRITE8_MEMBER(i8279_device::write) +void i8279_device::write(offs_t offset, u8 data) { // A0 = control/data select if (offset & 1) - cmd_w(space, 0, data); + cmd_w(data); else - data_w(space, 0, data); + data_w(data); } -WRITE8_MEMBER( i8279_device::cmd_w ) +void i8279_device::cmd_w(u8 data) {//printf("Command: %X=%X ",data>>5,data&31); - uint8_t cmd = data >> 5; + u8 cmd = data >> 5; data &= 0x1f; m_cmd[cmd] = data; switch (cmd) @@ -494,7 +512,7 @@ WRITE8_MEMBER( i8279_device::cmd_w ) } -WRITE8_MEMBER( i8279_device::data_w ) +void i8279_device::data_w(u8 data) {//printf("Data: %X ",data); if (BIT(m_cmd[0], 4) && m_autoinc) { diff --git a/src/devices/machine/i8279.h b/src/devices/machine/i8279.h index 6deac956cfc..ec1763d0e02 100644 --- a/src/devices/machine/i8279.h +++ b/src/devices/machine/i8279.h @@ -39,7 +39,7 @@ class i8279_device : public device_t { public: // construction/destruction - i8279_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + i8279_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); auto out_irq_callback() { return m_out_irq_cb.bind(); } auto out_sl_callback() { return m_out_sl_cb.bind(); } @@ -50,12 +50,12 @@ public: auto in_ctrl_callback() { return m_in_ctrl_cb.bind(); } // read & write handlers - DECLARE_READ8_MEMBER(read); - DECLARE_READ8_MEMBER(status_r); - DECLARE_READ8_MEMBER(data_r); - DECLARE_WRITE8_MEMBER(write); - DECLARE_WRITE8_MEMBER(cmd_w); - DECLARE_WRITE8_MEMBER(data_w); + u8 read(offs_t offset); + u8 status_r(); + u8 data_r(); + void write(offs_t offset, u8 data); + void cmd_w(u8 data); + void data_w(u8 data); void timer_mainloop(); protected: @@ -71,8 +71,8 @@ private: void timer_adjust(); void clear_display(); - void new_key(uint8_t data, bool skey, bool ckey); - void new_fifo(uint8_t data); + void new_key(u8 data, bool skey, bool ckey); + void new_fifo(u8 data); void set_irq(bool state); devcb_write_line m_out_irq_cb; // IRQ @@ -85,20 +85,20 @@ private: emu_timer *m_timer; - uint8_t m_d_ram[16]; // display ram - uint8_t m_d_ram_ptr; - uint8_t m_s_ram[8]; // might be same as fifo ram - uint8_t m_s_ram_ptr; - uint8_t m_fifo[8]; // queued keystrokes - uint8_t m_cmd[8]; // Device settings - uint8_t m_status; // Returned via status_r - uint32_t m_clock; // Internal scan clock - uint8_t m_scanner; // next output on SL lines + u8 m_d_ram[16]; // display ram + u8 m_d_ram_ptr; + u8 m_s_ram[8]; // might be same as fifo ram + u8 m_s_ram_ptr; + u8 m_fifo[8]; // queued keystrokes + u8 m_cmd[8]; // Device settings + u8 m_status; // Returned via status_r + u32 m_scanclock; // Internal scan clock + u8 m_scanner; // next output on SL lines bool m_autoinc; // auto-increment flag bool m_read_flag; // read from where bool m_ctrl_key; // previous state of strobe input - uint16_t m_key_down; + u16 m_key_down; }; |