From 74ad75e5e4c097352d830ec2930fd1db821244a4 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Tue, 20 Aug 2019 23:59:20 +0200 Subject: -sec: Converted Barcrest/Bell Fruit Serial ELectronic Counter (SEC) to a proper MAME device. [Ryan Holtz] --- src/mame/drivers/bfm_sc4.cpp | 34 +++---- src/mame/drivers/mpu5.cpp | 17 ++-- src/mame/includes/bfm_sc4.h | 7 +- src/mame/machine/sec.cpp | 211 +++++++++++++++++++++++++------------------ src/mame/machine/sec.h | 169 +++++++++++++++++----------------- 5 files changed, 246 insertions(+), 192 deletions(-) diff --git a/src/mame/drivers/bfm_sc4.cpp b/src/mame/drivers/bfm_sc4.cpp index b7e39d7c19f..3a9e31743f4 100644 --- a/src/mame/drivers/bfm_sc4.cpp +++ b/src/mame/drivers/bfm_sc4.cpp @@ -343,14 +343,14 @@ READ16_MEMBER(sc4_state::sc4_mem_r) end2 = base2 + 0x10000 / 2; - if ((offset>=base) && (offset= base) && (offset < end)) { - offset-=base; - return(m_mainram[offset]); + offset -= base; + return m_mainram[offset]; } - else if ((offset>=base2) && (offset= base2) && (offset < end2)) { - offset-=base2; + offset -= base2; logerror("%08x maincpu read access offset %08x mem_mask %04x cs %d\n", pc, offset*2, mem_mask, cs); int addr = (offset<<1); @@ -375,10 +375,10 @@ READ16_MEMBER(sc4_state::sc4_mem_r) case 0x0240: retvalue = 0x00ff; - if (mem_mask&0xff00) + if (ACCESSING_BITS_8_15) { - retvalue |= (sec.read_data_line() << (6+8)); - retvalue |= ioport("IN-COIN")->read() << 8; // coin? + retvalue |= (m_sec->data_r() << 14); + retvalue |= m_in_coin->read() << 8; // coin? //printf("%08x maincpu read access offset %08x mem_mask %04x cs %d (LAMPS etc.)\n", pc, offset*2, mem_mask, cs); } return retvalue; @@ -387,19 +387,19 @@ READ16_MEMBER(sc4_state::sc4_mem_r) return 0x0080; // status of something? case 0x1000: - return ioport("IN-16")->read(); + return m_in[16]->read(); case 0x1010: - return ioport("IN-17")->read(); + return m_in[17]->read(); case 0x1020: - return ioport("IN-18")->read(); + return m_in[18]->read(); case 0x1030: - return ioport("IN-19")->read(); + return m_in[19]->read(); case 0x1040: // door switch, test switch etc. - return ioport("IN-20")->read(); + return m_in[20]->read(); case 0x1244: return m_ymz->read(0); @@ -559,7 +559,7 @@ WRITE16_MEMBER(sc4_state::sc4_mem_w) case 0x0330: logerror("%08x meter write %04x\n",pc, data); //m_meterstatus = (m_meterstatus&0xc0) | (data & 0x3f); - sec.write_clock_line(~data&0x20); + m_sec->clk_w(~data&0x20); break; case 0x1248: @@ -573,7 +573,7 @@ WRITE16_MEMBER(sc4_state::sc4_mem_w) case 0x1330: bfm_sc4_reel4_w(space,0,data&0xf); //m_meterstatus = (m_meterstatus&0x3f) | ((data & 0x30) << 2); - sec.write_data_line(~data&0x10); + m_sec->data_w(~data&0x10); break; default: @@ -811,8 +811,6 @@ void sc4_state::machine_reset() bfm_sc45_state::machine_reset(); m_dochk41 = true; - - sec.reset(); } @@ -921,6 +919,8 @@ void sc4_state::sc4_common(machine_config &config) YMZ280B(config, m_ymz, 16000000); // ?? Mhz m_ymz->add_route(ALL_OUTPUTS, "mono", 1.0); + + SEC(config, m_sec); } //Standard 6 reels all connected diff --git a/src/mame/drivers/mpu5.cpp b/src/mame/drivers/mpu5.cpp index f842a36ecf7..c2c4badb570 100644 --- a/src/mame/drivers/mpu5.cpp +++ b/src/mame/drivers/mpu5.cpp @@ -296,9 +296,10 @@ Switches Aux-RS232 Aux Port Alpha Vend-Bus class mpu5_state : public driver_device { public: - mpu5_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu") + mpu5_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_sec(*this, "sec") { } void mpu5(machine_config &config); @@ -320,7 +321,6 @@ private: uint32_t* m_cpuregion; std::unique_ptr m_mainram; - SEC sec; uint8_t m_led_strobe_temp; uint8_t m_led_strobe; @@ -335,6 +335,7 @@ private: // devices required_device m_maincpu; + required_device m_sec; }; READ8_MEMBER(mpu5_state::asic_r8) @@ -476,9 +477,9 @@ WRITE8_MEMBER(mpu5_state::asic_w8) case 0x09: { //Assume SEC fitted for now - sec.write_data_line(~data&0x01); - sec.write_clock_line(~data&0x02); - sec.write_cs_line(~data&0x04); + m_sec->data_w(~data&0x01); + m_sec->clk_w(~data&0x02); + m_sec->cs_w(~data&0x04); } case 0x0b: { @@ -645,6 +646,8 @@ void mpu5_state::mpu5(machine_config &config) M68340(config, m_maincpu, 16000000); // ? m_maincpu->set_addrmap(AS_PROGRAM, &mpu5_state::mpu5_map); + SEC(config, m_sec); + config.set_default_layout(layout_mpu5); SPEAKER(config, "lspeaker").front_left(); diff --git a/src/mame/includes/bfm_sc4.h b/src/mame/includes/bfm_sc4.h index 8c8d045691d..e1d63b729bc 100644 --- a/src/mame/includes/bfm_sc4.h +++ b/src/mame/includes/bfm_sc4.h @@ -137,6 +137,9 @@ public: , m_maincpu(*this, "maincpu") , m_cpuregion(*this, "maincpu") , m_nvram(*this, "nvram") + , m_sec(*this, "sec") + , m_in(*this, "IN-%u", 0U) + , m_in_coin(*this, "IN-COIN") , m_reel(*this, "reel%u", 1U) , m_io_ports(*this, "IN-%u", 0) { @@ -148,6 +151,9 @@ public: required_memory_region m_cpuregion; // devices required_device m_nvram; + required_device m_sec; + optional_ioport_array<21> m_in; + required_ioport m_in_coin; optional_device_array m_reel; int m_reel12_latch; @@ -156,7 +162,6 @@ public: int m_reel56_latch; int m_optic_pattern; template DECLARE_WRITE_LINE_MEMBER(reel_optic_cb) { if (state) m_optic_pattern |= (1 << N); else m_optic_pattern &= ~(1 << N); } - SEC sec; int m_meterstatus; diff --git a/src/mame/machine/sec.cpp b/src/mame/machine/sec.cpp index 4f4b66097b7..6fbb69c2b1d 100644 --- a/src/mame/machine/sec.cpp +++ b/src/mame/machine/sec.cpp @@ -5,144 +5,183 @@ #include "emu.h" #include "sec.h" +DEFINE_DEVICE_TYPE(SEC, sec_device, "sec", "Barcrest/Bell Fruit Serial Electronic Counter (SEC)") +sec_device::sec_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, SEC, tag, owner, clock) +{ +} + +void sec_device::device_start() +{ + save_item(NAME(m_counters)); + save_item(NAME(m_strings)); + save_item(NAME(m_market)); + save_item(NAME(m_nocnt)); + save_item(NAME(m_last)); + + save_item(NAME(m_curbyte)); + save_item(NAME(m_data)); + + save_item(NAME(m_clk)); + save_item(NAME(m_clks)); + save_item(NAME(m_rxpos)); + save_item(NAME(m_rxclk)); + save_item(NAME(m_rxdat)); + save_item(NAME(m_rxlen)); + save_item(NAME(m_chars_left)); + + save_item(NAME(m_reqpos)); -void SEC::reset(void) + save_item(NAME(m_request)); + save_item(NAME(m_reply)); + + save_item(NAME(m_enabled)); +} + +void sec_device::device_reset() { m_clk = 1; - m_curbyte = m_clks = n_reqpos = m_rxclk = m_rxlen = m_rxpos = 0; + m_curbyte = 0; + m_clks = 0; + m_reqpos = 0; + m_rxclk = 0; + m_rxlen = 0; + m_rxpos = 0; } -void SEC::write_cs_line(uint8_t bit) +WRITE_LINE_MEMBER(sec_device::cs_w) { - if ( bit ) + if (state) { - if ( !enabled ) + if (!m_enabled) { - enabled = true; + m_enabled = true; m_rxdat = 0; } } else { - if ( enabled ) + if (m_enabled) { m_rxdat = 1; } - enabled = false; + m_enabled = false; reset(); } } -void SEC::write_data_line(uint8_t bit) +WRITE_LINE_MEMBER(sec_device::data_w) { - m_data = bit ? 1 : 0; + m_data = (uint8_t)state; } -uint8_t SEC::read_data_line(void) +int sec_device::data_r(void) { return m_rxdat; } -void SEC::write_clock_line(uint8_t bit) +WRITE_LINE_MEMBER(sec_device::clk_w) { - bit = bit ? 1 : 0; + state = state ? 1 : 0; - if ( (m_clk ^ bit) & 1 ) + if (m_clk ^ state) { - if ( !bit ) + if (!state) { - m_curbyte = ( m_curbyte << 1 ) | m_data; - if ( m_rxclk == 8 ) + m_curbyte = (m_curbyte << 1) | m_data; + if (m_rxclk == 8) { m_rxclk = 0; m_rxpos++; m_rxlen--; } - if ( m_rxlen ) - m_rxdat = (m_reply[m_rxpos] & 0x80) >> 7; + if (m_rxlen) + m_rxdat = BIT(m_reply[m_rxpos], 7); else - m_rxdat = enabled ? 0 : 1; + m_rxdat = m_enabled ? 0 : 1; } else { m_clks++; - if ( m_rxlen ) + if (m_rxlen) { m_reply[m_rxpos] <<= 1; m_rxclk++; } - if ( m_clks == 8 ) + if (m_clks == 8) { m_clks = 0; - if ( !m_rxlen ) + if (!m_rxlen) { - m_request[n_reqpos++] = m_curbyte; - if ( chars_left ) + m_request[m_reqpos++] = m_curbyte; + if (m_chars_left) { - chars_left--; - if ( !chars_left ) + m_chars_left--; + if (!m_chars_left) { - n_reqpos--; - Do_Command(); - n_reqpos = 0; + m_reqpos--; + do_command(); + m_reqpos = 0; } } - if ( n_reqpos == 3 ) - chars_left = m_curbyte + 1; + if (m_reqpos == 3) + { + m_chars_left = m_curbyte + 1; + } } } } - m_clk = bit; + m_clk = state; } } -void SEC::Do_Command(void) +void sec_device::do_command(void) { m_last = m_request[1]; - switch ( m_request[0] ) + switch (m_request[0]) { - case SEC_REQUEST_VERSION: Cmd_Get_Ver(); break; - case SEC_REQUEST_STATUS: Cmd_Get_Sta(); break; - case SEC_REQUEST_MARKET: Cmd_Get_Mrk(); break; - case SEC_REQEUST_LAST_ERROR: Cmd_Get_Err(); break; - case SEC_REQUEST_FINGERPRNT: Cmd_Get_Fpr(); break; - case SEC_REQUEST_LAST_CMD: Cmd_Get_Lst(); break; - case SEC_REQUEST_COUNT_VAL: Cmd_Get_Cnt(); break; - case SEC_SET_NUM_COUNTERS: Cmd_Set_Ncn(); break; - case SEC_SET_MARKET: Cmd_Set_Mrk(); break; - case SEC_SET_COUNTER_TXT: Cmd_Set_Txt(); break; - case SEC_COUNT_INC_SMALL: Cmd_Inc_Sml(); break; - case SEC_COUNT_INC_MED: Cmd_Inc_Med(); break; - case SEC_COUNT_INC_LARGE: Cmd_Inc_Lrg(); break; + case SEC_REQUEST_VERSION: cmd_get_ver(); break; + case SEC_REQUEST_STATUS: cmd_get_sta(); break; + case SEC_REQUEST_MARKET: cmd_get_mrk(); break; + case SEC_REQEUST_LAST_ERROR: cmd_get_err(); break; + case SEC_REQUEST_FINGERPRNT: cmd_get_fpr(); break; + case SEC_REQUEST_LAST_CMD: cmd_get_lst(); break; + case SEC_REQUEST_COUNT_VAL: cmd_get_cnt(); break; + case SEC_SET_NUM_COUNTERS: cmd_set_ncn(); break; + case SEC_SET_MARKET: cmd_set_mrk(); break; + case SEC_SET_COUNTER_TXT: cmd_set_txt(); break; + case SEC_COUNT_INC_SMALL: cmd_inc_sml(); break; + case SEC_COUNT_INC_MED: cmd_inc_med(); break; + case SEC_COUNT_INC_LARGE: cmd_inc_lrg(); break; /* acknowledge these without doing anything */ - case SEC_SHOW_TEXT: Cmd_NOP(); break; - case SEC_SHOW_COUNTER_VAL: Cmd_NOP(); break; - case SEC_SHOW_COUNTER_TXT: Cmd_NOP(); break; - case SEC_SHOW_BITPATTERN: Cmd_NOP(); break; - case SEC_COUNT_CYCLE_DISP: Cmd_NOP(); break; - case SEC_STOP_CYCLE: Cmd_NOP(); break; - case SEC_SELF_TEST: Cmd_NOP(); break; + case SEC_SHOW_TEXT: cmd_nop(); break; + case SEC_SHOW_COUNTER_VAL: cmd_nop(); break; + case SEC_SHOW_COUNTER_TXT: cmd_nop(); break; + case SEC_SHOW_BITPATTERN: cmd_nop(); break; + case SEC_COUNT_CYCLE_DISP: cmd_nop(); break; + case SEC_STOP_CYCLE: cmd_nop(); break; + case SEC_SELF_TEST: cmd_nop(); break; } } -uint8_t SEC::CalcByteSum(int length) +uint8_t sec_device::calc_byte_sum(int length) { uint8_t csum = 0; - for ( int i = 0; i < 3 + length; i++ ) + for (int i = 0; i < 3 + length; i++) { csum += m_reply[i]; } return csum; } -void SEC::Cmd_Get_Err(void) +void sec_device::cmd_get_err(void) { m_reply[0] = SEC_DAT; m_reply[1] = m_last; @@ -150,14 +189,14 @@ void SEC::Cmd_Get_Err(void) m_reply[3] = 0; // Last Error - m_reply[4] = CalcByteSum(1); + m_reply[4] = calc_byte_sum(1); m_rxpos = 0; m_rxclk = 0; m_rxlen = 5; } -void SEC::Cmd_Get_Fpr(void) +void sec_device::cmd_get_fpr(void) { m_reply[0] = SEC_DAT; m_reply[1] = m_last; @@ -169,14 +208,14 @@ void SEC::Cmd_Get_Fpr(void) m_reply[5] = 0x00; m_reply[6] = 0x00; - m_reply[7] = CalcByteSum(4); + m_reply[7] = calc_byte_sum(4); m_rxpos = 0; m_rxclk = 0; m_rxlen = 8; } -void SEC::Cmd_Get_Lst(void) +void sec_device::cmd_get_lst(void) { m_reply[0] = SEC_DAT; m_reply[1] = m_last; @@ -188,14 +227,14 @@ void SEC::Cmd_Get_Lst(void) m_reply[5] = 0x00; m_reply[6] = 0x00; - m_reply[7] = CalcByteSum(4); + m_reply[7] = calc_byte_sum(4); m_rxpos = 0; m_rxclk = 0; m_rxlen = 8; } -void SEC::Cmd_Get_Ver(void) +void sec_device::cmd_get_ver(void) { m_reply[0] = SEC_DAT; m_reply[1] = m_last; @@ -206,14 +245,14 @@ void SEC::Cmd_Get_Ver(void) m_reply[4] = '2'; m_reply[5] = 'E'; - m_reply[6] = CalcByteSum(3); + m_reply[6] = calc_byte_sum(3); m_rxpos = 0; m_rxclk = 0; m_rxlen = 7; } -void SEC::Cmd_Get_Cnt(void) +void sec_device::cmd_get_cnt(void) { char temp[10]; @@ -228,14 +267,14 @@ void SEC::Cmd_Get_Cnt(void) m_reply[5] = ((temp[4] - 0x30) << 4) + (temp[5] - 0x30); m_reply[6] = ((temp[6] - 0x30) << 4) + (temp[7] - 0x30); - m_reply[7] = CalcByteSum(4); + m_reply[7] = calc_byte_sum(4); m_rxpos = 0; m_rxclk = 0; m_rxlen = 8; } -void SEC::Cmd_Get_Sta(void) +void sec_device::cmd_get_sta(void) { m_reply[0] = SEC_DAT; m_reply[1] = m_last; @@ -243,14 +282,14 @@ void SEC::Cmd_Get_Sta(void) m_reply[3] = 0x20; // Status - m_reply[4] = CalcByteSum(1); + m_reply[4] = calc_byte_sum(1); m_rxpos = 0; m_rxclk = 0; m_rxlen = 5; } -void SEC::Cmd_Get_Mrk(void) +void sec_device::cmd_get_mrk(void) { m_reply[0] = SEC_DAT; m_reply[1] = m_last; @@ -258,58 +297,58 @@ void SEC::Cmd_Get_Mrk(void) m_reply[3] = m_market; - m_reply[4] = CalcByteSum(1); + m_reply[4] = calc_byte_sum(1); m_rxpos = 0; m_rxclk = 0; m_rxlen = 5; } -void SEC::Cmd_Set_Ncn(void) +void sec_device::cmd_set_ncn(void) { m_nocnt = m_request[3]; m_reply[0] = SEC_ACK; m_reply[1] = m_last; m_reply[2] = 0; - m_reply[3] = CalcByteSum(0); + m_reply[3] = calc_byte_sum(0); m_rxpos = 0; m_rxclk = 0; m_rxlen = 4; } -void SEC::Cmd_Set_Mrk(void) +void sec_device::cmd_set_mrk(void) { m_market = m_request[3]; m_reply[0] = SEC_ACK; m_reply[1] = m_last; m_reply[2] = 0; - m_reply[3] = CalcByteSum(0); + m_reply[3] = calc_byte_sum(0); m_rxpos = 0; m_rxclk = 0; m_rxlen = 4; } -void SEC::Cmd_Set_Txt(void) +void sec_device::cmd_set_txt(void) { char valbuf[8]; uint8_t meter = m_request[3]; - memcpy( valbuf, &m_request[4], 7); + memcpy(valbuf, &m_request[4], 7); valbuf[7] = 0; strcpy(m_strings[meter], valbuf); m_reply[0] = SEC_ACK; m_reply[1] = m_last; m_reply[2] = 0; - m_reply[3] = CalcByteSum(0); + m_reply[3] = calc_byte_sum(0); m_rxpos = 0; m_rxclk = 0; m_rxlen = 4; } -void SEC::Cmd_Inc_Sml(void) +void sec_device::cmd_inc_sml(void) { uint8_t meter = m_request[3]; uint8_t value = m_request[4] & 0xf; @@ -318,13 +357,13 @@ void SEC::Cmd_Inc_Sml(void) m_reply[0] = SEC_ACK; m_reply[1] = m_last; m_reply[2] = 0; - m_reply[3] = CalcByteSum(0); + m_reply[3] = calc_byte_sum(0); m_rxpos = 0; m_rxclk = 0; m_rxlen = 4; } -void SEC::Cmd_Inc_Med(void) +void sec_device::cmd_inc_med(void) { uint8_t meter = m_request[3]; uint8_t value = m_request[4]; @@ -333,13 +372,13 @@ void SEC::Cmd_Inc_Med(void) m_reply[0] = SEC_ACK; m_reply[1] = m_last; m_reply[2] = 0; - m_reply[3] = CalcByteSum(0); + m_reply[3] = calc_byte_sum(0); m_rxpos = 0; m_rxclk = 0; m_rxlen = 4; } -void SEC::Cmd_Inc_Lrg(void) +void sec_device::cmd_inc_lrg(void) { uint8_t meter = m_request[3]; uint8_t value = m_request[4] + 256 * m_request[5]; @@ -348,18 +387,18 @@ void SEC::Cmd_Inc_Lrg(void) m_reply[0] = SEC_ACK; m_reply[1] = m_last; m_reply[2] = 0; - m_reply[3] = CalcByteSum(0); + m_reply[3] = calc_byte_sum(0); m_rxpos = 0; m_rxclk = 0; m_rxlen = 4; } -void SEC::Cmd_NOP(void) +void sec_device::cmd_nop(void) { m_reply[0] = SEC_ACK; m_reply[1] = m_last; m_reply[2] = 0; - m_reply[3] = CalcByteSum(0); + m_reply[3] = calc_byte_sum(0); m_rxpos = 0; m_rxclk = 0; m_rxlen = 4; diff --git a/src/mame/machine/sec.h b/src/mame/machine/sec.h index c324925ac20..27542643b5d 100644 --- a/src/mame/machine/sec.h +++ b/src/mame/machine/sec.h @@ -1,108 +1,115 @@ // license:BSD-3-Clause // copyright-holders:David Haywood -/* commands */ - -#ifdef __sun -#undef SEC -#endif - -#define SEC_REQUEST_STATUS (0x20) -#define SEC_REQUEST_MARKET (0x21) -#define SEC_REQEUST_LAST_ERROR (0x22) -#define SEC_REQUEST_VERSION (0x23) -#define SEC_REQUEST_COUNT_VAL (0x24) -#define SEC_REQUEST_LAST_CMD (0x25) -#define SEC_REQUEST_FINGERPRNT (0x26) - -#define SEC_SET_NUM_COUNTERS (0x30) -#define SEC_SET_MARKET (0x31) -#define SEC_SET_COUNTER_TXT (0x32) +#ifndef MAME_MACHINE_SEC_H +#define MAME_MACHINE_SEC_H -#define SEC_SHOW_TEXT (0x40) -#define SEC_SHOW_COUNTER_VAL (0x41) -#define SEC_SHOW_COUNTER_TXT (0x42) -#define SEC_SHOW_BITPATTERN (0x43) +#pragma once -#define SEC_COUNT_INC_SMALL (0x50) -#define SEC_COUNT_INC_MED (0x51) -#define SEC_COUNT_INC_LARGE (0x52) +#include "emu.h" -#define SEC_COUNT_CYCLE_DISP (0x54) -#define SEC_STOP_CYCLE (0x55) - -#define SEC_SELF_TEST (0x5c) - -#define MAX_COUNTERS (32) +/* commands */ -#define SEC_DAT (0x60) -#define SEC_ACK (0x61) +enum +{ + SEC_REQUEST_STATUS = 0x20, + SEC_REQUEST_MARKET = 0x21, + SEC_REQEUST_LAST_ERROR = 0x22, + SEC_REQUEST_VERSION = 0x23, + SEC_REQUEST_COUNT_VAL = 0x24, + SEC_REQUEST_LAST_CMD = 0x25, + SEC_REQUEST_FINGERPRNT = 0x26, + + SEC_SET_NUM_COUNTERS = 0x30, + SEC_SET_MARKET = 0x31, + SEC_SET_COUNTER_TXT = 0x32, + + SEC_SHOW_TEXT = 0x40, + SEC_SHOW_COUNTER_VAL = 0x41, + SEC_SHOW_COUNTER_TXT = 0x42, + SEC_SHOW_BITPATTERN = 0x43, + + SEC_COUNT_INC_SMALL = 0x50, + SEC_COUNT_INC_MED = 0x51, + SEC_COUNT_INC_LARGE = 0x52, + + SEC_COUNT_CYCLE_DISP = 0x54, + SEC_STOP_CYCLE = 0x55, + + SEC_SELF_TEST = 0x5c, + + SEC_DAT = 0x60, + SEC_ACK = 0x61 +}; -class SEC +class sec_device : public device_t { public: - SEC() - { - reset(); - } + // construction/destruction + sec_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + /* serial interface */ + DECLARE_WRITE_LINE_MEMBER(clk_w); + DECLARE_WRITE_LINE_MEMBER(data_w); + DECLARE_WRITE_LINE_MEMBER(cs_w); + + int data_r(); -// Internal registers +protected: + virtual void device_start() override; + virtual void device_reset() override; private: + static const size_t MAX_COUNTERS = 32; // stuff the SEC stores - int m_counters[MAX_COUNTERS]; - char m_strings[MAX_COUNTERS][8]; - uint8_t m_market; - uint8_t m_nocnt; - uint8_t m_last; + int m_counters[MAX_COUNTERS]; + char m_strings[MAX_COUNTERS][8]; + uint8_t m_market; + uint8_t m_nocnt; + uint8_t m_last; // serial comms - uint8_t m_curbyte; - uint8_t m_data; + uint8_t m_curbyte; + uint8_t m_data; - uint8_t m_clk; - uint8_t m_clks; - uint8_t m_rxpos; - uint8_t m_rxclk; - uint8_t m_rxdat; - uint8_t m_rxlen; - uint8_t chars_left; + uint8_t m_clk; + uint8_t m_clks; + uint8_t m_rxpos; + uint8_t m_rxclk; + uint8_t m_rxdat; + uint8_t m_rxlen; + uint8_t m_chars_left; - uint8_t n_reqpos; + uint8_t m_reqpos; // communication buffer - uint8_t m_request[12]; - uint8_t m_reply[8]; + uint8_t m_request[12]; + uint8_t m_reply[8]; - bool enabled; + bool m_enabled; // execute command - void Do_Command(void); + void do_command(void); // command handlers - void Cmd_NOP(void); - void Cmd_Set_Txt(void); - void Cmd_Inc_Sml(void); - void Cmd_Inc_Med(void); - void Cmd_Inc_Lrg(void); - void Cmd_Set_Ncn(void); - void Cmd_Set_Mrk(void); - void Cmd_Get_Sta(void); - void Cmd_Get_Mrk(void); - void Cmd_Get_Err(void); - void Cmd_Get_Fpr(void); - void Cmd_Get_Lst(void); - void Cmd_Get_Ver(void); - void Cmd_Get_Cnt(void); - - uint8_t CalcByteSum(int length); + void cmd_nop(void); + void cmd_set_txt(void); + void cmd_inc_sml(void); + void cmd_inc_med(void); + void cmd_inc_lrg(void); + void cmd_set_ncn(void); + void cmd_set_mrk(void); + void cmd_get_sta(void); + void cmd_get_mrk(void); + void cmd_get_err(void); + void cmd_get_fpr(void); + void cmd_get_lst(void); + void cmd_get_ver(void); + void cmd_get_cnt(void); + + uint8_t calc_byte_sum(int length); +}; -public: - void reset(void); +DECLARE_DEVICE_TYPE(SEC, sec_device) - /* serial interface */ - void write_clock_line(uint8_t bit); - void write_data_line(uint8_t bit); - void write_cs_line(uint8_t bit); - uint8_t read_data_line(void); -}; +#endif // MAME_MACHINE_SEC_H \ No newline at end of file -- cgit v1.2.3