diff options
Diffstat (limited to 'src/devices/machine/ds1994.cpp')
-rw-r--r-- | src/devices/machine/ds1994.cpp | 597 |
1 files changed, 313 insertions, 284 deletions
diff --git a/src/devices/machine/ds1994.cpp b/src/devices/machine/ds1994.cpp index c63fdd0da15..544bc20d050 100644 --- a/src/devices/machine/ds1994.cpp +++ b/src/devices/machine/ds1994.cpp @@ -9,28 +9,26 @@ * */ -// FIXME: convert to device_rtc_interface and remove time.h -// FIXME: convert logging to use logmacro.h +// FIXME: convert to device_rtc_interface and remove <ctime> #include "emu.h" -#include "machine/ds1994.h" +#include "ds1994.h" #include <ctime> +#include <tuple> -#define VERBOSE_LEVEL 0 -inline void ds1994_device::verboselog(int n_level, const char *s_fmt, ...) -{ - if (VERBOSE_LEVEL >= n_level) - { - va_list v; - char buf[32768]; - va_start(v, s_fmt); - vsprintf(buf, s_fmt, v); - va_end(v); - logerror("ds1994 %s: %s", machine().describe_context(), buf); - } -} +#define LOG_ERRORS (1U << 1) +#define LOG_1WIRE (1U << 2) +#define LOG_ROM_COMMANDS (1U << 3) +#define LOG_COMMANDS (1U << 4) +#define LOG_STATES (1U << 5) +#define LOG_RESETS (1U << 6) +#define LOG_WRITES (1U << 7) +#define LOG_READS (1U << 8) + +#define VERBOSE (0) +#include "logmacro.h" // device type definition DEFINE_DEVICE_TYPE(DS1994, ds1994_device, "ds1994", "DS1994 iButton 4Kb Memory Plus Time") @@ -115,9 +113,9 @@ void ds1994_device::device_start() elem = STATE_IDLE; // timers - m_timer_main = timer_alloc(TIMER_MAIN); - m_timer_reset = timer_alloc(TIMER_RESET); - m_timer_clock = timer_alloc(TIMER_CLOCK); + m_timer_main = timer_alloc(FUNC(ds1994_device::main_tick), this); + m_timer_reset = timer_alloc(FUNC(ds1994_device::reset_tick), this); + m_timer_clock = timer_alloc(FUNC(ds1994_device::clock_tick), this); m_timer_clock->adjust(attotime::from_hz(256), 0, attotime::from_hz(256)); } @@ -144,11 +142,11 @@ void ds1994_device::device_reset() memcpy(m_regs, region->base() + ROM_SIZE + SPD_SIZE + DATA_SIZE + RTC_SIZE, REGS_SIZE); return; } - verboselog(0, "ds1994 %s: Wrong region length for data, expected 0x%x, got 0x%x\n", tag(), ROM_SIZE + SPD_SIZE + DATA_SIZE + RTC_SIZE + REGS_SIZE, region->bytes()); + LOGMASKED(LOG_ERRORS, "ds1994 %s: Wrong region length for data, expected 0x%x, got 0x%x\n", tag(), ROM_SIZE + SPD_SIZE + DATA_SIZE + RTC_SIZE + REGS_SIZE, region->bytes()); } else { - verboselog(0, "ds1994 %s: Warning, no id provided, answer will be all zeroes.\n", tag()); + LOGMASKED(LOG_ERRORS, "ds1994 %s: Warning, no id provided, answer will be all zeroes.\n", tag()); memset(m_rom, 0, ROM_SIZE); memset(m_ram, 0, SPD_SIZE); memset(m_sram, 0, DATA_SIZE); @@ -168,11 +166,11 @@ bool ds1994_device::one_wire_tx_bit(uint8_t value) if (!m_bit) { m_shift = value; - verboselog(1, "one_wire_tx_bit: Byte to send %02x\n", m_shift); + LOGMASKED(LOG_1WIRE, "one_wire_tx_bit: Byte to send %02x\n", m_shift); } m_tx = m_shift & 1; m_shift >>= 1; - verboselog(1, "one_wire_tx_bit: State %d\n", m_tx); + LOGMASKED(LOG_1WIRE, "one_wire_tx_bit: State %d\n", m_tx); m_bit++; if (m_bit == 8) return true; else @@ -186,11 +184,11 @@ bool ds1994_device::one_wire_rx_bit(void) { m_shift |= 0x80; } - verboselog(1, "one_wire_rx_bit: State %d\n", m_rx); + LOGMASKED(LOG_1WIRE, "one_wire_rx_bit: State %d\n", m_rx); m_bit++; if (m_bit == 8) { - verboselog(1, "one_wire_rx_bit: Byte Received %02x\n", m_shift); + LOGMASKED(LOG_1WIRE, "one_wire_rx_bit: Byte Received %02x\n", m_shift); return true; } else @@ -203,29 +201,29 @@ bool ds1994_device::one_wire_rx_bit(void) /* */ /********************************************/ -void ds1994_device::ds1994_rom_cmd(void) +void ds1994_device::handle_rom_cmd(void) { - verboselog(2, "timer_main state_rom_command\n"); + LOGMASKED(LOG_ROM_COMMANDS, "rom_cmd\n"); if (one_wire_rx_bit()) { switch (m_shift) { case ROMCMD_READROM: - verboselog(1, "timer_main rom_cmd readrom\n"); + LOGMASKED(LOG_ROM_COMMANDS, "rom_cmd readrom\n"); m_bit = 0; m_byte = 0; m_state[0] = STATE_READROM; m_state_ptr = 0; break; case ROMCMD_SKIPROM: - verboselog(1, "timer_main rom_cmd skiprom\n"); + LOGMASKED(LOG_ROM_COMMANDS, "rom_cmd skiprom\n"); m_bit = 0; m_byte = 0; m_state[0] = STATE_COMMAND; m_state_ptr = 0; break; case ROMCMD_MATCHROM: - verboselog(1, "timer_main rom_cmd matchrom\n"); + LOGMASKED(LOG_ROM_COMMANDS, "rom_cmd matchrom\n"); m_bit = 0; m_byte = 0; m_state[0] = STATE_MATCHROM; @@ -233,11 +231,11 @@ void ds1994_device::ds1994_rom_cmd(void) break; case ROMCMD_SEARCHROM: case ROMCMD_SEARCHINT: - verboselog(0, "timer_main rom_command not implemented %02x\n", m_shift); + LOGMASKED(LOG_ERRORS, "rom_command not implemented %02x\n", m_shift); m_state[m_state_ptr] = STATE_COMMAND; break; default: - verboselog(0, "timer_main rom_command not found %02x\n", m_shift); + LOGMASKED(LOG_ERRORS, "rom_command not found %02x\n", m_shift); m_state[m_state_ptr] = STATE_IDLE; break; } @@ -250,15 +248,15 @@ void ds1994_device::ds1994_rom_cmd(void) /* */ /********************************************/ -void ds1994_device::ds1994_cmd(void) +void ds1994_device::handle_cmd(void) { - verboselog(2, "timer_main state_command\n"); + LOGMASKED(LOG_COMMANDS, "state_command\n"); if (one_wire_rx_bit()) { switch (m_shift) { case COMMAND_READ_MEMORY: - verboselog(1, "timer_main cmd read_memory\n"); + LOGMASKED(LOG_COMMANDS, "cmd read_memory\n"); m_bit = 0; m_byte = 0; m_state[0] = STATE_ADDRESS1; @@ -268,7 +266,7 @@ void ds1994_device::ds1994_cmd(void) m_state_ptr = 0; break; case COMMAND_WRITE_SCRATCHPAD: - verboselog(1, "timer_main cmd write_scratchpad\n"); + LOGMASKED(LOG_COMMANDS, "cmd write_scratchpad\n"); m_bit = 0; m_byte = 0; m_offs_ro = false; @@ -279,7 +277,7 @@ void ds1994_device::ds1994_cmd(void) m_state_ptr = 0; break; case COMMAND_READ_SCRATCHPAD: - verboselog(1, "timer_main cmd read_scratchpad\n"); + LOGMASKED(LOG_COMMANDS, "cmd read_scratchpad\n"); m_bit = 0; m_byte = 0; m_state[0] = STATE_TXADDRESS1; @@ -290,7 +288,7 @@ void ds1994_device::ds1994_cmd(void) m_state_ptr = 0; break; case COMMAND_COPY_SCRATCHPAD: - verboselog(1, "timer_main cmd copy_scratchpad\n"); + LOGMASKED(LOG_COMMANDS, "cmd copy_scratchpad\n"); m_bit = 0; m_byte = 0; m_offs_ro = true; @@ -303,7 +301,7 @@ void ds1994_device::ds1994_cmd(void) m_state_ptr = 0; break; default: - verboselog(0, "timer_main command not handled %02x\n", m_shift); + LOGMASKED(LOG_COMMANDS, "command not handled %02x\n", m_shift); m_state[m_state_ptr] = STATE_IDLE; break; } @@ -316,7 +314,7 @@ void ds1994_device::ds1994_cmd(void) /* */ /********************************************/ -uint8_t ds1994_device::ds1994_readmem() +uint8_t ds1994_device::readmem() { if (m_address < 0x200) { @@ -332,7 +330,7 @@ uint8_t ds1994_device::ds1994_readmem() return 0; } -void ds1994_device::ds1994_writemem(uint8_t value) +void ds1994_device::writemem(uint8_t value) { if (m_address < 0x200) { @@ -353,231 +351,232 @@ void ds1994_device::ds1994_writemem(uint8_t value) /* */ /*************************************************/ -void ds1994_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +TIMER_CALLBACK_MEMBER(ds1994_device::main_tick) { - switch (id) + switch (m_state[m_state_ptr]) { - case TIMER_CLOCK: - for (auto & elem : m_rtc) + case STATE_RESET1: + LOGMASKED(LOG_STATES, "timer_main state_reset1 %d\n", m_rx); + m_tx = false; + m_state[m_state_ptr] = STATE_RESET2; + m_timer_main->adjust(t_pdl); + break; + case STATE_RESET2: + LOGMASKED(LOG_STATES, "timer_main state_reset2 %d\n", m_rx); + m_tx = true; + m_bit = 0; + m_shift = 0; + m_state[m_state_ptr] = STATE_ROMCMD; + break; + case STATE_ROMCMD: + handle_rom_cmd(); + break; + case STATE_COMMAND: + handle_cmd(); + break; + case STATE_MATCHROM: + LOGMASKED(LOG_STATES, "timer_main state_matchrom - Data to match: <- %d\n", m_rx); + if (one_wire_rx_bit()) { - elem++; - if (elem != 0) + if (m_rom[7- m_byte] == m_shift) { - break; + m_byte++; + m_bit = 0; + LOGMASKED(LOG_STATES, "timer_main state_matchrom: datamatch %x - byte=%d\n", m_shift, m_byte); + } + else + { + m_state[m_state_ptr] = STATE_IDLE; + LOGMASKED(LOG_STATES, "timer_main state_matchrom: no match rx=%x <> mem=%x - byte:%d\n", m_shift, m_rom[7 - m_byte], m_byte); } } + if (m_byte == ROM_SIZE) + { + LOGMASKED(LOG_STATES, "timer_main matchrom finished\n"); + m_state[m_state_ptr] = STATE_COMMAND; + } break; - case TIMER_RESET: - verboselog(1, "timer_reset\n"); - m_state[m_state_ptr] = STATE_RESET; - m_timer_reset->adjust(attotime::never); + case STATE_ADDRESS1: + LOGMASKED(LOG_STATES, "timer_main state_address1\n"); + if (one_wire_rx_bit()) + { + m_bit = 0; + if (m_offs_ro) + { + if (m_a1 != m_shift) m_auth = false; + LOGMASKED(LOG_STATES, "timer_main state_address1 - TA1=%02x - Auth_Code 1=%02x\n", m_a1, m_shift); + } + else + { + m_a1 = m_shift & 0xff; + LOGMASKED(LOG_STATES, "timer_main state_address1 - Address1=%02x\n", m_a1); + } + m_state_ptr++; + } break; - case TIMER_MAIN: - switch (m_state[m_state_ptr]) + case STATE_ADDRESS2: + LOGMASKED(LOG_STATES, "timer_main state_address2\n"); + if (one_wire_rx_bit()) { - case STATE_RESET1: - verboselog(2, "timer_main state_reset1 %d\n", m_rx); - m_tx = false; - m_state[m_state_ptr] = STATE_RESET2; - m_timer_main->adjust(t_pdl); - break; - case STATE_RESET2: - verboselog(2, "timer_main state_reset2 %d\n", m_rx); - m_tx = true; - m_bit = 0; - m_shift = 0; - m_state[m_state_ptr] = STATE_ROMCMD; - break; - case STATE_ROMCMD: - ds1994_rom_cmd(); - break; - case STATE_COMMAND: - ds1994_cmd(); - break; - case STATE_MATCHROM: - verboselog(2, "timer_main state_matchrom - Data to match: <- %d\n", m_rx); - if (one_wire_rx_bit()) - { - if (m_rom[7- m_byte] == m_shift) - { - m_byte++; - m_bit = 0; - verboselog(2, "timer_main state_matchrom: datamatch %x - byte=%d\n", m_shift, m_byte); - } - else - { - m_state[m_state_ptr] = STATE_IDLE; - verboselog(1, "timer_main state_matchrom: no match rx=%x <> mem=%x - byte:%d\n", m_shift, m_rom[7 - m_byte], m_byte); - } - } - if (m_byte == ROM_SIZE) - { - verboselog(2, "timer_main matchrom finished\n"); - m_state[m_state_ptr] = STATE_COMMAND; - } - break; - case STATE_ADDRESS1: - verboselog(2, "timer_main state_address1\n"); - if (one_wire_rx_bit()) - { - m_bit = 0; - if (m_offs_ro) - { - if (m_a1 != m_shift) m_auth = false; - verboselog(1, "timer_main state_address1 - TA1=%02x - Auth_Code 1=%02x\n", m_a1, m_shift); - } - else - { - m_a1 = m_shift & 0xff; - verboselog(2, "timer_main state_address1 - Address1=%02x\n", m_a1); - } - m_state_ptr++; - } - break; - case STATE_ADDRESS2: - verboselog(2, "timer_main state_address2\n"); - if (one_wire_rx_bit()) - { - m_bit = 0; - if (m_offs_ro) - { - if ( m_a2 != m_shift ) - m_auth = false; - verboselog(1, "timer_main state_address1 - TA2=%02x - Auth_Code 2=%02x\n", m_a1, m_shift); - } - else - { - m_a2 = m_shift & 0xff; - verboselog(2, "timer_main state_address2 - Address2=%02x\n", m_a2); - } - m_state_ptr++; - } - break; - case STATE_OFFSET: - verboselog(2, "timer_main state_offset\n"); - if (one_wire_rx_bit()) - { - m_bit = 0; - if (m_offs_ro) - { - if (m_a2 != m_shift) - m_auth = false; - verboselog(1, "timer_main state_address1 - OFS_ES=%02x - Auth_Code 3=%02x\n", m_offset, m_shift); - } - else - { - m_offset = m_shift & 0x1f; - verboselog(2, "timer_main state_address2 - Offset=%02x\n", m_offset); - } - m_state_ptr++; - } - break; - case STATE_WRITE_SCRATCHPAD: - verboselog(2, "timer_main state_write_scratchpad\n"); - if (one_wire_rx_bit()) - { - m_bit = 0; - m_ram[m_offset & 0x1f] = m_shift & 0xff; - m_offset++; - } - verboselog(2, "timer_main state_write_scratchpad %d Offs=%02x\n", m_rx, m_offset); - break; - case STATE_READROM: - m_tx = true; - if (m_byte == ROM_SIZE) - { - verboselog(1, "timer_main readrom finished\n"); - m_state[m_state_ptr] = STATE_COMMAND; - } - else - verboselog(2, "timer_main readrom window closed\n"); - break; - case STATE_TXADDRESS1: - m_tx = true; - if (m_byte == 1) - { - verboselog(1, "timer_main txaddress1 finished m_byte=%d\n", m_byte); - m_byte = 0; - m_state_ptr++; - } - else - verboselog(2, "timer_main txaddress1 window closed\n"); - break; - case STATE_TXADDRESS2: - m_tx = true; - if (m_byte == 1) - { - verboselog(1, "timer_main txaddress2 finished m_byte=%d\n", m_byte); - m_byte = 0; - m_state_ptr++; - } - else - verboselog(2, "timer_main txaddress2 window closed\n"); - break; - case STATE_TXOFFSET: - m_tx = true; - if (m_byte == 1) - { - verboselog(1, "timer_main txoffset finished - m_byte=%d\n", m_byte); - m_byte = 0; - m_state_ptr++; - } - else - verboselog(2, "timer_main txoffset window closed\n"); - break; - case STATE_READ_MEMORY: - verboselog(2, "timer_main state_readmemory\n"); - break; - case STATE_COPY_SCRATCHPAD: - verboselog(2, "timer_main state_copy_scratchpad\n"); - break; - case STATE_READ_SCRATCHPAD: - verboselog(2, "timer_main state_read_scratchpad\n"); - break; - default: - verboselog(0, "timer_main state not handled: %d\n", m_state[m_state_ptr]); - break; + m_bit = 0; + if (m_offs_ro) + { + if ( m_a2 != m_shift ) + m_auth = false; + LOGMASKED(LOG_STATES, "timer_main state_address1 - TA2=%02x - Auth_Code 2=%02x\n", m_a1, m_shift); + } + else + { + m_a2 = m_shift & 0xff; + LOGMASKED(LOG_STATES, "timer_main state_address2 - Address2=%02x\n", m_a2); + } + m_state_ptr++; } - if (m_state[m_state_ptr] == STATE_INIT_COMMAND) + break; + case STATE_OFFSET: + LOGMASKED(LOG_STATES, "timer_main state_offset\n"); + if (one_wire_rx_bit()) { - switch (m_state[m_state_ptr + 1]) + m_bit = 0; + if (m_offs_ro) { - case STATE_IDLE: - case STATE_COMMAND: - case STATE_ADDRESS1: - case STATE_ADDRESS2: - case STATE_OFFSET: - break; - case STATE_READ_MEMORY: - verboselog(2, "timer_main (init_cmd) -> state_read_memory - set address\n"); - m_address = (m_a2 << 8) | m_a1; - break; - case STATE_WRITE_SCRATCHPAD: - verboselog(2, "timer_main (init_cmd) -> state_write_scratchpad - set address\n"); - m_offs_ro = false; - m_offset = 0; - break; - case STATE_READ_SCRATCHPAD: - verboselog(2, "timer_main (init_cmd) -> state_read_scratchpad - set address\n"); - m_address = 0; - break; - case STATE_COPY_SCRATCHPAD: - verboselog(2, "timer_main (init_cmd) -> state_copy_scratchpad - do copy\n"); - if (m_auth) - { - m_address = (m_a2 << 8) | m_a1; - for (int i = 0; i <= m_offset; i++) - { - ds1994_writemem(m_ram[i]); - m_address++; - } - } - else - verboselog(1, "timer_main (init_cmd) -> state_copy_scratchpad - Auth-Rejected\n"); - break; + if (m_a2 != m_shift) + m_auth = false; + LOGMASKED(LOG_STATES, "timer_main state_address1 - OFS_ES=%02x - Auth_Code 3=%02x\n", m_offset, m_shift); + } + else + { + m_offset = m_shift & 0x1f; + LOGMASKED(LOG_STATES, "timer_main state_address2 - Offset=%02x\n", m_offset); } m_state_ptr++; } + break; + case STATE_WRITE_SCRATCHPAD: + LOGMASKED(LOG_STATES, "timer_main state_write_scratchpad\n"); + if (one_wire_rx_bit()) + { + m_bit = 0; + m_ram[m_offset & 0x1f] = m_shift & 0xff; + m_offset++; + } + LOGMASKED(LOG_STATES, "timer_main state_write_scratchpad %d Offs=%02x\n", m_rx, m_offset); + break; + case STATE_READROM: + m_tx = true; + if (m_byte == ROM_SIZE) + { + LOGMASKED(LOG_STATES, "timer_main readrom finished\n"); + m_state[m_state_ptr] = STATE_COMMAND; + } + else + LOGMASKED(LOG_STATES, "timer_main readrom window closed\n"); + break; + case STATE_TXADDRESS1: + m_tx = true; + if (m_byte == 1) + { + LOGMASKED(LOG_STATES, "timer_main txaddress1 finished m_byte=%d\n", m_byte); + m_byte = 0; + m_state_ptr++; + } + else + LOGMASKED(LOG_STATES, "timer_main txaddress1 window closed\n"); + break; + case STATE_TXADDRESS2: + m_tx = true; + if (m_byte == 1) + { + LOGMASKED(LOG_STATES, "timer_main txaddress2 finished m_byte=%d\n", m_byte); + m_byte = 0; + m_state_ptr++; + } + else + LOGMASKED(LOG_STATES, "timer_main txaddress2 window closed\n"); + break; + case STATE_TXOFFSET: + m_tx = true; + if (m_byte == 1) + { + LOGMASKED(LOG_STATES, "timer_main txoffset finished - m_byte=%d\n", m_byte); + m_byte = 0; + m_state_ptr++; + } + else + LOGMASKED(LOG_STATES, "timer_main txoffset window closed\n"); + break; + case STATE_READ_MEMORY: + LOGMASKED(LOG_STATES, "timer_main state_readmemory\n"); + break; + case STATE_COPY_SCRATCHPAD: + LOGMASKED(LOG_STATES, "timer_main state_copy_scratchpad\n"); + break; + case STATE_READ_SCRATCHPAD: + LOGMASKED(LOG_STATES, "timer_main state_read_scratchpad\n"); + break; + default: + LOGMASKED(LOG_ERRORS, "timer_main state not handled: %d\n", m_state[m_state_ptr]); + break; + } + + if (m_state[m_state_ptr] == STATE_INIT_COMMAND) + { + switch (m_state[m_state_ptr + 1]) + { + case STATE_IDLE: + case STATE_COMMAND: + case STATE_ADDRESS1: + case STATE_ADDRESS2: + case STATE_OFFSET: + break; + case STATE_READ_MEMORY: + LOGMASKED(LOG_STATES, "timer_main (init_cmd) -> state_read_memory - set address\n"); + m_address = (m_a2 << 8) | m_a1; + break; + case STATE_WRITE_SCRATCHPAD: + LOGMASKED(LOG_STATES, "timer_main (init_cmd) -> state_write_scratchpad - set address\n"); + m_offs_ro = false; + m_offset = 0; + break; + case STATE_READ_SCRATCHPAD: + LOGMASKED(LOG_STATES, "timer_main (init_cmd) -> state_read_scratchpad - set address\n"); + m_address = 0; + break; + case STATE_COPY_SCRATCHPAD: + LOGMASKED(LOG_STATES, "timer_main (init_cmd) -> state_copy_scratchpad - do copy\n"); + if (m_auth) + { + m_address = (m_a2 << 8) | m_a1; + for (int i = 0; i <= m_offset; i++) + { + writemem(m_ram[i]); + m_address++; + } + } + else + LOGMASKED(LOG_STATES, "timer_main (init_cmd) -> state_copy_scratchpad - Auth-Rejected\n"); + break; + } + m_state_ptr++; + } +} + +TIMER_CALLBACK_MEMBER(ds1994_device::reset_tick) +{ + LOGMASKED(LOG_RESETS, "timer_reset\n"); + m_state[m_state_ptr] = STATE_RESET; + m_timer_reset->adjust(attotime::never); +} + +TIMER_CALLBACK_MEMBER(ds1994_device::clock_tick) +{ + for (uint8_t &elem : m_rtc) + { + elem++; + if (elem != 0) + { + break; + } } } @@ -587,9 +586,9 @@ void ds1994_device::device_timer(emu_timer &timer, device_timer_id id, int param /* */ /*********************/ -WRITE_LINE_MEMBER(ds1994_device::write) +void ds1994_device::write(int state) { - verboselog(1, "write(%d)\n", state); + LOGMASKED(LOG_WRITES, "write(%d)\n", state); if (!state && m_rx) { switch (m_state[m_state_ptr]) @@ -598,27 +597,27 @@ WRITE_LINE_MEMBER(ds1994_device::write) case STATE_INIT_COMMAND: break; case STATE_ROMCMD: - verboselog(2, "state_romcommand\n"); + LOGMASKED(LOG_WRITES, "state_romcommand\n"); m_timer_main->adjust(t_samp); break; case STATE_COMMAND: - verboselog(2, "state_command\n"); + LOGMASKED(LOG_WRITES, "state_command\n"); m_timer_main->adjust(t_samp); break; case STATE_ADDRESS1: - verboselog(2, "state_address1\n"); + LOGMASKED(LOG_WRITES, "state_address1\n"); m_timer_main->adjust(t_samp); break; case STATE_ADDRESS2: - verboselog(2, "state_address2\n"); + LOGMASKED(LOG_WRITES, "state_address2\n"); m_timer_main->adjust(t_samp); break; case STATE_OFFSET: - verboselog(2, "state_offset\n"); + LOGMASKED(LOG_WRITES, "state_offset\n"); m_timer_main->adjust(t_samp); break; case STATE_TXADDRESS1: - verboselog(2, "state_txaddress1\n"); + LOGMASKED(LOG_WRITES, "state_txaddress1\n"); if (one_wire_tx_bit(m_a1)) { m_bit = 0; @@ -627,7 +626,7 @@ WRITE_LINE_MEMBER(ds1994_device::write) m_timer_main->adjust(t_rdv); break; case STATE_TXADDRESS2: - verboselog(2, "state_txaddress2\n"); + LOGMASKED(LOG_WRITES, "state_txaddress2\n"); if (one_wire_tx_bit(m_a2)) { m_bit = 0; @@ -636,7 +635,7 @@ WRITE_LINE_MEMBER(ds1994_device::write) m_timer_main->adjust(t_rdv); break; case STATE_TXOFFSET: - verboselog(2, "state_txoffset\n"); + LOGMASKED(LOG_WRITES, "state_txoffset\n"); if (one_wire_tx_bit(m_offset)) { m_bit = 0; @@ -645,7 +644,7 @@ WRITE_LINE_MEMBER(ds1994_device::write) m_timer_main->adjust(t_rdv); break; case STATE_READROM: - verboselog(2, "state_readrom\n"); + LOGMASKED(LOG_WRITES, "state_readrom\n"); if (one_wire_tx_bit(m_rom[7 - m_byte])) { m_bit = 0; @@ -654,8 +653,8 @@ WRITE_LINE_MEMBER(ds1994_device::write) m_timer_main->adjust(t_rdv); break; case STATE_READ_MEMORY: - verboselog(2, "state_read_memory\n"); - if (one_wire_tx_bit(ds1994_readmem())) + LOGMASKED(LOG_WRITES, "state_read_memory\n"); + if (one_wire_tx_bit(readmem())) { m_bit = 0; if (m_address < DATA_SIZE + RTC_SIZE + REGS_SIZE) @@ -666,29 +665,29 @@ WRITE_LINE_MEMBER(ds1994_device::write) m_timer_main->adjust(t_rdv); break; case STATE_MATCHROM: - verboselog(2, "state_matchrom\n"); + LOGMASKED(LOG_WRITES, "state_matchrom\n"); m_timer_main->adjust(t_rdv); break; case STATE_COPY_SCRATCHPAD: if (m_auth) { - verboselog(2, "state_copy_scratchpad Auth_Code Match: %d\n", m_tx); + LOGMASKED(LOG_WRITES, "state_copy_scratchpad Auth_Code Match: %d\n", m_tx); m_tx = true; m_auth = false; } else { m_tx = false; - verboselog(1, "state_copy_scratchpad Auth_Code No Match: %d\n", m_tx); + LOGMASKED(LOG_WRITES, "state_copy_scratchpad Auth_Code No Match: %d\n", m_tx); } m_timer_main->adjust(t_rdv); break; case STATE_WRITE_SCRATCHPAD: - verboselog(2, "state_write_scratchpad\n"); + LOGMASKED(LOG_WRITES, "state_write_scratchpad\n"); m_timer_main->adjust(t_samp); break; case STATE_READ_SCRATCHPAD: - verboselog(2, "state_read_scratchpad\n"); + LOGMASKED(LOG_WRITES, "state_read_scratchpad\n"); if (one_wire_tx_bit(m_ram[m_address])) { m_bit = 0; @@ -700,7 +699,7 @@ WRITE_LINE_MEMBER(ds1994_device::write) m_timer_main->adjust(t_rdv); break; default: - verboselog(0, "state not handled: %d\n", m_state[m_state_ptr]); + LOGMASKED(LOG_ERRORS | LOG_WRITES, "state not handled: %d\n", m_state[m_state_ptr]); break; } m_timer_reset->adjust(t_rstl); @@ -726,9 +725,9 @@ WRITE_LINE_MEMBER(ds1994_device::write) /* */ /*********************/ -READ_LINE_MEMBER(ds1994_device::read) +int ds1994_device::read() { - verboselog(2, "read %d\n", m_tx && m_rx); + LOGMASKED(LOG_READS, "read %d\n", m_tx && m_rx); return m_tx && m_rx; } @@ -751,13 +750,28 @@ void ds1994_device::nvram_default() // .nv file //------------------------------------------------- -void ds1994_device::nvram_read(emu_file &file) +bool ds1994_device::nvram_read(util::read_stream &file) { - file.read(m_rom, ROM_SIZE); - file.read(m_ram, SPD_SIZE); - file.read(m_sram, DATA_SIZE); - file.read(m_rtc, RTC_SIZE); - file.read(m_regs, REGS_SIZE); + std::error_condition err; + size_t actual; + + std::tie(err, actual) = util::read(file, m_rom, ROM_SIZE); + if (err || (ROM_SIZE != actual)) + return false; + std::tie(err, actual) = util::read(file, m_ram, SPD_SIZE); + if (err || (SPD_SIZE != actual)) + return false; + std::tie(err, actual) = util::read(file, m_sram, DATA_SIZE); + if (err || (DATA_SIZE != actual)) + return false; + std::tie(err, actual) = util::read(file, m_rtc, RTC_SIZE); + if (err || (RTC_SIZE != actual)) + return false; + std::tie(err, actual) = util::read(file, m_regs, REGS_SIZE); + if (err || (REGS_SIZE != actual)) + return false; + + return true; } //------------------------------------------------- @@ -765,11 +779,26 @@ void ds1994_device::nvram_read(emu_file &file) // .nv file //------------------------------------------------- -void ds1994_device::nvram_write(emu_file &file) +bool ds1994_device::nvram_write(util::write_stream &file) { - file.write(m_rom, ROM_SIZE); - file.write(m_ram, SPD_SIZE); - file.write(m_sram, DATA_SIZE); - file.write(m_rtc, RTC_SIZE); - file.write(m_regs, REGS_SIZE); + std::error_condition err; + size_t actual; + + std::tie(err, actual) = util::write(file, m_rom, ROM_SIZE); + if (err) + return false; + std::tie(err, actual) = util::write(file, m_ram, SPD_SIZE); + if (err) + return false; + std::tie(err, actual) = util::write(file, m_sram, DATA_SIZE); + if (err) + return false; + std::tie(err, actual) = util::write(file, m_rtc, RTC_SIZE); + if (err) + return false; + std::tie(err, actual) = util::write(file, m_regs, REGS_SIZE); + if (err) + return false; + + return true; } |