mirror of
https://github.com/holub/mame
synced 2025-10-05 08:41:31 +03:00
-sec: Converted Barcrest/Bell Fruit Serial ELectronic Counter (SEC) to a proper MAME device. [Ryan Holtz]
This commit is contained in:
parent
dd72115954
commit
74ad75e5e4
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user