-sec: Converted Barcrest/Bell Fruit Serial ELectronic Counter (SEC) to a proper MAME device. [Ryan Holtz]

This commit is contained in:
mooglyguy 2019-08-20 23:59:20 +02:00
parent dd72115954
commit 74ad75e5e4
5 changed files with 258 additions and 204 deletions

View File

@ -343,14 +343,14 @@ READ16_MEMBER(sc4_state::sc4_mem_r)
end2 = base2 + 0x10000 / 2;
if ((offset>=base) && (offset<end))
if ((offset >= base) && (offset < end))
{
offset-=base;
return(m_mainram[offset]);
offset -= base;
return m_mainram[offset];
}
else if ((offset>=base2) && (offset<end2))
else if ((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

View File

@ -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<uint32_t[]> m_mainram;
SEC sec;
uint8_t m_led_strobe_temp;
uint8_t m_led_strobe;
@ -335,6 +335,7 @@ private:
// devices
required_device<m68340_cpu_device> m_maincpu;
required_device<sec_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();

View File

@ -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<nvram_device> m_nvram;
required_device<sec_device> m_sec;
optional_ioport_array<21> m_in;
required_ioport m_in_coin;
optional_device_array<stepper_device, 6> m_reel;
int m_reel12_latch;
@ -156,7 +162,6 @@ public:
int m_reel56_latch;
int m_optic_pattern;
template <unsigned N> 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;

View File

@ -5,144 +5,183 @@
#include "emu.h"
#include "sec.h"
DEFINE_DEVICE_TYPE(SEC, sec_device, "sec", "Barcrest/Bell Fruit Serial Electronic Counter (SEC)")
void SEC::reset(void)
sec_device::sec_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, SEC, tag, owner, clock)
{
m_clk = 1;
m_curbyte = m_clks = n_reqpos = m_rxclk = m_rxlen = m_rxpos = 0;
}
void SEC::write_cs_line(uint8_t bit)
void sec_device::device_start()
{
if ( bit )
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));
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 = 0;
m_clks = 0;
m_reqpos = 0;
m_rxclk = 0;
m_rxlen = 0;
m_rxpos = 0;
}
WRITE_LINE_MEMBER(sec_device::cs_w)
{
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;

View File

@ -1,108 +1,115 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
#ifndef MAME_MACHINE_SEC_H
#define MAME_MACHINE_SEC_H
#pragma once
#include "emu.h"
/* commands */
#ifdef __sun
#undef SEC
#endif
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,
#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)
SEC_SET_NUM_COUNTERS = 0x30,
SEC_SET_MARKET = 0x31,
SEC_SET_COUNTER_TXT = 0x32,
#define SEC_SET_NUM_COUNTERS (0x30)
#define SEC_SET_MARKET (0x31)
#define SEC_SET_COUNTER_TXT (0x32)
SEC_SHOW_TEXT = 0x40,
SEC_SHOW_COUNTER_VAL = 0x41,
SEC_SHOW_COUNTER_TXT = 0x42,
SEC_SHOW_BITPATTERN = 0x43,
#define SEC_SHOW_TEXT (0x40)
#define SEC_SHOW_COUNTER_VAL (0x41)
#define SEC_SHOW_COUNTER_TXT (0x42)
#define SEC_SHOW_BITPATTERN (0x43)
SEC_COUNT_INC_SMALL = 0x50,
SEC_COUNT_INC_MED = 0x51,
SEC_COUNT_INC_LARGE = 0x52,
#define SEC_COUNT_INC_SMALL (0x50)
#define SEC_COUNT_INC_MED (0x51)
#define SEC_COUNT_INC_LARGE (0x52)
SEC_COUNT_CYCLE_DISP = 0x54,
SEC_STOP_CYCLE = 0x55,
#define SEC_COUNT_CYCLE_DISP (0x54)
#define SEC_STOP_CYCLE (0x55)
SEC_SELF_TEST = 0x5c,
#define SEC_SELF_TEST (0x5c)
SEC_DAT = 0x60,
SEC_ACK = 0x61
};
#define MAX_COUNTERS (32)
#define SEC_DAT (0x60)
#define SEC_ACK (0x61)
class SEC
class sec_device : public device_t
{
public:
SEC()
{
reset();
}
// Internal registers
private:
// 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;
// serial comms
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 n_reqpos;
// communication buffer
uint8_t m_request[12];
uint8_t m_reply[8];
bool enabled;
// execute command
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);
public:
void reset(void);
// construction/destruction
sec_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
/* 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);
DECLARE_WRITE_LINE_MEMBER(clk_w);
DECLARE_WRITE_LINE_MEMBER(data_w);
DECLARE_WRITE_LINE_MEMBER(cs_w);
int data_r();
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;
// serial comms
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 m_chars_left;
uint8_t m_reqpos;
// communication buffer
uint8_t m_request[12];
uint8_t m_reply[8];
bool m_enabled;
// execute command
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 calc_byte_sum(int length);
};
DECLARE_DEVICE_TYPE(SEC, sec_device)
#endif // MAME_MACHINE_SEC_H