-dpb_storeaddr: Translated more of the schematic into code, nw

This commit is contained in:
mooglyguy 2019-06-22 03:29:37 +02:00
parent 7f5db61ed8
commit 8f197619a9
2 changed files with 571 additions and 11 deletions

View File

@ -5,6 +5,12 @@
dpb_storeaddr.cpp dpb_storeaddr.cpp
DPB-7000/1 - Store Address Card DPB-7000/1 - Store Address Card
TODO:
- Code is currently a more or less direct translation of the board
schematic. It is highly inefficient, but accurate. An equally-
accurate, but faster, version can be made once better understanding
of the overall DPB-7000 system is had.
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
@ -29,21 +35,31 @@ dpb7000_storeaddr_card_device::dpb7000_storeaddr_card_device(const machine_confi
, m_bd_base(nullptr) , m_bd_base(nullptr)
, m_protx_base(nullptr) , m_protx_base(nullptr)
, m_proty_base(nullptr) , m_proty_base(nullptr)
, m_blanking_base(nullptr)
, m_bb_out(0) , m_bb_out(0)
, m_bc_out(0) , m_bc_out(0)
, m_bd_out(0) , m_bd_out(0)
, m_protx(false) , m_protx(false)
, m_proty(false) , m_proty(false)
, m_df_out(0)
, m_ee_out(0)
, m_addr(0)
, m_rhscr(0) , m_rhscr(0)
, m_rvscr(0) , m_rvscr(0)
, m_rzoom(0) , m_rzoom(0)
, m_fld_sel(0) , m_fld_sel(0)
, m_hzoom_count(0)
, m_vzoom_count(0)
, m_orig_cx_stripe_addr(0) , m_orig_cx_stripe_addr(0)
, m_orig_cx_stripe_num(0) , m_orig_cx_stripe_num(0)
, m_orig_cy_addr(0) , m_orig_cy_addr(0)
, m_cx_stripe_addr(0) , m_cx_stripe_addr(0)
, m_cx_stripe_num(0) , m_cx_stripe_num(0)
, m_cy_addr(0) , m_cy_addr(0)
, m_rhscr_stripe_addr(0)
, m_rhscr_stripe_num(0)
, m_rvscr_counter(0)
, m_rvscr_with_v0(0)
, m_s_type(0) , m_s_type(0)
, m_cen(false) , m_cen(false)
, m_cxd(false) , m_cxd(false)
@ -64,6 +80,33 @@ dpb7000_storeaddr_card_device::dpb7000_storeaddr_card_device(const machine_confi
, m_cread(false) , m_cread(false)
, m_prot_a(false) , m_prot_a(false)
, m_prot_b(false) , m_prot_b(false)
, m_rvl(false)
, m_rhr(false)
, m_plt(false)
, m_zb(false)
, m_rppck(false)
, m_rb(false)
, m_pflag(false)
, m_mxr(false)
, m_rc_sel(false)
, m_window_enable(false)
, m_b26(false)
, m_blank_d(false)
, m_blank_a(false)
, m_blank_b(false)
, m_blank_q(0)
, m_crc(false)
, m_ipen(false)
, m_ipsel(false)
, m_rck(false)
, m_ra(0)
, m_opra(false)
, m_ipsel_out(*this)
, m_rck_out(*this)
, m_ra_out(*this)
, m_opra_out(*this)
, m_blk_out(*this)
, m_addr_out(*this)
, m_x_prom(*this, "x_prom") , m_x_prom(*this, "x_prom")
, m_protx_prom(*this, "protx_prom") , m_protx_prom(*this, "protx_prom")
, m_proty_prom(*this, "proty_prom") , m_proty_prom(*this, "proty_prom")
@ -100,10 +143,24 @@ void dpb7000_storeaddr_card_device::device_start()
save_item(NAME(m_protx)); save_item(NAME(m_protx));
save_item(NAME(m_proty)); save_item(NAME(m_proty));
save_item(NAME(m_df_in));
save_item(NAME(m_df_out));
save_item(NAME(m_ee_in));
save_item(NAME(m_ee_out));
save_item(NAME(m_dg_in));
save_item(NAME(m_eg_in));
save_item(NAME(m_fg_in));
save_item(NAME(m_gg_in));
save_item(NAME(m_rhscr)); save_item(NAME(m_rhscr));
save_item(NAME(m_rvscr)); save_item(NAME(m_rvscr));
save_item(NAME(m_rzoom)); save_item(NAME(m_rzoom));
save_item(NAME(m_fld_sel)); save_item(NAME(m_fld_sel));
save_item(NAME(m_hzoom_count));
save_item(NAME(m_vzoom_count));
save_item(NAME(m_orig_cx_stripe_addr)); save_item(NAME(m_orig_cx_stripe_addr));
save_item(NAME(m_orig_cx_stripe_num)); save_item(NAME(m_orig_cx_stripe_num));
save_item(NAME(m_orig_cy_addr)); save_item(NAME(m_orig_cy_addr));
@ -111,6 +168,12 @@ void dpb7000_storeaddr_card_device::device_start()
save_item(NAME(m_cx_stripe_num)); save_item(NAME(m_cx_stripe_num));
save_item(NAME(m_cy_addr)); save_item(NAME(m_cy_addr));
save_item(NAME(m_rhscr_stripe_addr));
save_item(NAME(m_rhscr_stripe_num));
save_item(NAME(m_rvscr_counter));
save_item(NAME(m_rvscr_with_v0));
save_item(NAME(m_s_type)); save_item(NAME(m_s_type));
save_item(NAME(m_cen)); save_item(NAME(m_cen));
@ -133,14 +196,75 @@ void dpb7000_storeaddr_card_device::device_start()
save_item(NAME(m_selvideo)); save_item(NAME(m_selvideo));
save_item(NAME(m_creq)); save_item(NAME(m_creq));
save_item(NAME(m_cread)); save_item(NAME(m_cread));
save_item(NAME(m_prot_a));
save_item(NAME(m_prot_b));
save_item(NAME(m_rvl));
save_item(NAME(m_rhr));
save_item(NAME(m_plt));
save_item(NAME(m_zb));
save_item(NAME(m_rppck));
save_item(NAME(m_rb));
save_item(NAME(m_pflag));
save_item(NAME(m_mxr));
save_item(NAME(m_rc_sel));
save_item(NAME(m_window_enable));
save_item(NAME(m_b26));
save_item(NAME(m_blank_d));
save_item(NAME(m_blank_a));
save_item(NAME(m_blank_b));
save_item(NAME(m_blank_q));
save_item(NAME(m_crc));
save_item(NAME(m_ipen));
save_item(NAME(m_ipsel));
save_item(NAME(m_rck));
save_item(NAME(m_ra));
save_item(NAME(m_opra));
m_ipsel_out.resolve_safe();
m_rck_out.resolve_safe();
m_ra_out.resolve_safe();
m_opra_out.resolve_safe();
m_blk_out.resolve_safe();
m_addr_out.resolve_safe();
} }
void dpb7000_storeaddr_card_device::device_reset() void dpb7000_storeaddr_card_device::device_reset()
{ {
m_bb_out = 0;
m_bc_out = 0;
m_bd_out = 0;
m_protx = false;
m_proty = false;
memset(m_df_in, 0, 2);
m_df_in[1] = 0xc;
m_df_out = 0;
memset(m_ee_in, 0, 2);
m_ee_in[1] = 0xc;
m_ee_out = 0;
memset(m_dg_in, 0, 2);
memset(m_eg_in, 0, 2);
memset(m_fg_in, 0, 2);
memset(m_gg_in, 0, 2);
m_addr = 0;
m_rhscr = 0; m_rhscr = 0;
m_rvscr = 0; m_rvscr = 0;
m_rzoom = 0; m_rzoom = 0;
m_fld_sel = 0; m_fld_sel = 0;
m_hzoom_count = 0;
m_vzoom_count = 0;
m_orig_cx_stripe_addr = 0; m_orig_cx_stripe_addr = 0;
m_orig_cx_stripe_num = 0; m_orig_cx_stripe_num = 0;
m_orig_cy_addr = 0; m_orig_cy_addr = 0;
@ -148,6 +272,12 @@ void dpb7000_storeaddr_card_device::device_reset()
m_cx_stripe_num = 0; m_cx_stripe_num = 0;
m_cy_addr = 0; m_cy_addr = 0;
m_rhscr_stripe_addr = 0;
m_rhscr_stripe_num = 0;
m_rvscr_counter = 0;
m_rvscr_with_v0 = 0;
m_s_type = 0; m_s_type = 0;
m_cen = false; m_cen = false;
@ -171,17 +301,42 @@ void dpb7000_storeaddr_card_device::device_reset()
m_creq = false; m_creq = false;
m_cread = false; m_cread = false;
m_prot_a = false;
m_prot_b = false;
m_rvl = false;
m_rhr = false;
m_plt = false;
m_zb = false;
m_rppck = false;
m_rb = false;
m_pflag = false;
m_mxr = false;
m_rc_sel = false;
m_window_enable = false;
m_b26 = false;
m_blank_d = false;
m_blank_a = false;
m_blank_b = false;
m_blank_q = 0;
m_crc = false;
m_ipen = false;
m_ipsel = false;
m_rck = false;
m_ra = 0;
m_opra = false;
m_bb_base = m_x_prom->base() + 0x000; m_bb_base = m_x_prom->base() + 0x000;
m_bc_base = m_x_prom->base() + 0x400; m_bc_base = m_x_prom->base() + 0x400;
m_bd_base = m_x_prom->base() + 0x800; m_bd_base = m_x_prom->base() + 0x800;
m_protx_base = m_protx_prom->base(); m_protx_base = m_protx_prom->base();
m_proty_base = m_proty_prom->base(); m_proty_base = m_proty_prom->base();
m_blanking_base = m_blanking_pal->base();
m_bb_out = 0;
m_bc_out = 0;
m_bd_out = 0;
m_protx = false;
m_proty = false;
} }
void dpb7000_storeaddr_card_device::reg_w(uint16_t data) void dpb7000_storeaddr_card_device::reg_w(uint16_t data)
@ -189,20 +344,36 @@ void dpb7000_storeaddr_card_device::reg_w(uint16_t data)
switch ((data >> 12) & 7) switch ((data >> 12) & 7)
{ {
case 0: case 0:
{
LOG("%s: Store Address Card %d, set RHSCR: %03x\n", machine().describe_context(), m_s_type, data & 0xfff); LOG("%s: Store Address Card %d, set RHSCR: %03x\n", machine().describe_context(), m_s_type, data & 0xfff);
const uint16_t old = m_rhscr;
m_rhscr = data & 0xfff; m_rhscr = data & 0xfff;
if (BIT(old, 0) != BIT(m_rhscr, 0))
{
update_rck();
}
break; break;
}
case 1: case 1:
LOG("%s: Store Address Card %d, set RVSCR: %03x\n", machine().describe_context(), m_s_type, data & 0xfff); LOG("%s: Store Address Card %d, set RVSCR: %03x\n", machine().describe_context(), m_s_type, data & 0xfff);
m_rvscr = data & 0xfff; m_rvscr = data & 0xfff;
break; break;
case 2: case 2:
{
LOG("%s: Store Address Card %d, set R ZOOM: %03x\n", machine().describe_context(), m_s_type, data & 0xfff); LOG("%s: Store Address Card %d, set R ZOOM: %03x\n", machine().describe_context(), m_s_type, data & 0xfff);
m_rzoom = data & 0xfff; const uint8_t old = m_rzoom;
m_rzoom = data & 0xf;
if (BIT(old, 0) != BIT(m_rzoom, 0))
{
update_rck();
}
break; break;
}
case 3: case 3:
LOG("%s: Store Address Card %d, set FLDSEL: %03x\n", machine().describe_context(), m_s_type, data & 0xfff); LOG("%s: Store Address Card %d, set FLDSEL: %03x\n", machine().describe_context(), m_s_type, data & 0xfff);
m_fld_sel = data & 0xfff; m_fld_sel = data & 0xf;
m_window_enable = BIT(m_fld_sel, 2);
m_blank_b = !(m_window_enable && m_b26);
break; break;
case 4: case 4:
LOG("%s: Store Address Card %d, set CXPOS: %03x\n", machine().describe_context(), m_s_type, data & 0xfff); LOG("%s: Store Address Card %d, set CXPOS: %03x\n", machine().describe_context(), m_s_type, data & 0xfff);
@ -270,6 +441,9 @@ void dpb7000_storeaddr_card_device::tick_cxck()
} }
else if (!m_cen && !m_cxen) else if (!m_cen && !m_cxen)
{ {
const int8_t old_ca = m_cx_stripe_addr;
const int16_t old_cn = m_cx_stripe_num;
if (m_cxd) if (m_cxd)
{ {
m_cx_stripe_addr--; m_cx_stripe_addr--;
@ -277,8 +451,13 @@ void dpb7000_storeaddr_card_device::tick_cxck()
{ {
m_cx_stripe_addr = 9; m_cx_stripe_addr = 9;
m_cx_stripe_num--; m_cx_stripe_num--;
m_crc = true;
update_prot_proms(); update_prot_proms();
} }
else
{
m_crc = false;
}
} }
else else
{ {
@ -287,11 +466,31 @@ void dpb7000_storeaddr_card_device::tick_cxck()
{ {
m_cx_stripe_addr = 0; m_cx_stripe_addr = 0;
m_cx_stripe_num++; m_cx_stripe_num++;
m_crc = true;
update_prot_proms(); update_prot_proms();
} }
else
{
m_crc = false;
} }
} }
if ((old_ca & 0x0e) != (m_cx_stripe_addr & 0x0e) && !m_rck)
{
m_ra &= 1;
m_ra |= m_cx_stripe_addr & 0x0e;
m_ra_out(m_ra);
}
const int16_t changed = old_cn ^ m_cx_stripe_num;
if (changed & 0x30)
update_addr_mux_inputs();
else if (changed & 0x40)
update_addr_mux_outputs();
else
update_addr_select_inputs();
}
if (!m_cen && !m_cxoen) if (!m_cen && !m_cxoen)
{ {
if (m_cxod) if (m_cxod)
@ -356,6 +555,7 @@ void dpb7000_storeaddr_card_device::tick_cyck()
} }
else if (!m_cen && !m_cyen) else if (!m_cen && !m_cyen)
{ {
const int16_t old_cy = m_cy_addr;
if (m_cyd) if (m_cyd)
{ {
m_cy_addr--; m_cy_addr--;
@ -364,6 +564,13 @@ void dpb7000_storeaddr_card_device::tick_cyck()
{ {
m_cy_addr++; m_cy_addr++;
} }
const int16_t changed = old_cy ^ m_cy_addr;
if (changed & 0x300)
update_addr_mux_inputs();
else
update_addr_select_inputs();
update_prot_proms(); update_prot_proms();
} }
@ -429,3 +636,277 @@ void dpb7000_storeaddr_card_device::update_prot_proms()
m_protx = BIT(m_protx_base[m_x_addr], 0); m_protx = BIT(m_protx_base[m_x_addr], 0);
m_proty = BIT(m_proty_base[m_y_addr], 0); m_proty = BIT(m_proty_base[m_y_addr], 0);
} }
void dpb7000_storeaddr_card_device::rvl_w(int state)
{
m_rvl = (bool)state;
}
void dpb7000_storeaddr_card_device::rhr_w(int state)
{
const bool old = m_rhr;
m_rhr = (bool)state;
if (old && !m_rhr)
{
if (!m_plt && !m_rhr)
{
m_rvscr_counter = 0;
}
const uint8_t old_vzoom = m_vzoom_count;
if (!m_rvl || m_vzoom_count == 15)
{
m_vzoom_count = ~m_rzoom & 15;
}
else
{
m_vzoom_count++;
}
if (!m_rvl)
{
m_rvscr_counter = m_rvscr;
}
else if (m_zb || old_vzoom == 15)
{
const uint16_t old_counter = m_rvscr_counter;
m_rvscr_counter++;
if (((old_counter ^ m_rvscr_counter) & 0x3fc) != 0)
update_blanking_pal();
const int16_t changed = old_counter ^ m_rvscr_counter;
if (changed & 0x300)
update_addr_mux_inputs();
else
update_addr_select_inputs();
}
update_v0();
}
}
void dpb7000_storeaddr_card_device::plt_w(int state)
{
m_plt = (bool)state;
update_rck();
}
void dpb7000_storeaddr_card_device::zb_w(int state)
{
m_zb = (bool)state;
}
void dpb7000_storeaddr_card_device::rppck_w(int state)
{
const bool old = m_rppck;
m_rppck = (bool)state;
if (old && !m_rppck)
{
if (!m_plt && !m_rppck)
{
m_rvscr_counter = 0;
}
const uint8_t old_hzoom = m_hzoom_count;
if (!m_rhr || m_hzoom_count == 15)
{
m_hzoom_count = ~m_rzoom & 15;
}
m_blank_q <<= 1;
if (m_blank_a && m_blank_b)
{
m_blank_q |= 1;
}
m_blk_out(BIT(m_blank_q, 7));
if (m_zb || old_hzoom == 15)
{
const uint8_t old_addr = m_rhscr_stripe_addr;
m_rhscr_stripe_addr++;
if ((old_addr & 0x08) != (m_rhscr_stripe_addr & 0x08))
{
m_blank_a = !m_blank_d;
}
if (m_rhscr_stripe_addr == 10)
{
m_rhscr_stripe_addr = 0;
const uint8_t old_stripe_num = m_rhscr_stripe_num;
m_rhscr_stripe_num++;
update_blanking_pal();
if ((old_stripe_num & 1) != (m_rhscr_stripe_num & 1) && m_rck)
{
m_opra = BIT(m_rhscr_stripe_num, 0);
m_opra_out(m_opra);
}
const int16_t changed = old_stripe_num ^ m_rhscr_stripe_num;
if (changed & 0x30)
update_addr_mux_inputs();
else if (changed & 0x40)
update_addr_mux_outputs();
else
update_addr_select_inputs();
}
const uint8_t old_ra = m_ra;
if (m_rck)
{
m_ra = m_rhscr_stripe_addr;
}
else
{
m_ra &= ~1;
m_ra |= BIT(m_rhscr_stripe_addr, 0);
}
if (old_ra != m_ra)
m_ra_out(m_ra);
}
}
}
void dpb7000_storeaddr_card_device::rb_w(int state)
{
m_rb = (bool)state;
}
void dpb7000_storeaddr_card_device::pflag_w(int state)
{
const bool old = m_pflag;
m_pflag = (bool)state;
if (old != m_pflag)
update_rck();
}
void dpb7000_storeaddr_card_device::b26_w(int state)
{
m_b26 = (bool)state;
m_blank_b = !(m_window_enable && m_b26);
}
void dpb7000_storeaddr_card_device::ipen_w(int state)
{
const bool old_en = m_ipen;
m_ipen = (bool)state;
if (!old_en && m_ipen)
{
const bool old_sel = m_ipsel;
m_ipsel = ((!m_crc || m_selvideo) != m_ipsel);
if (old_sel != m_ipsel)
m_ipsel_out(m_ipsel);
}
}
void dpb7000_storeaddr_card_device::update_rck()
{
const bool scroll0 = BIT(m_rhscr, 0);
const bool zoom0 = BIT(m_rzoom, 0);
const bool old_rck = m_rck;
m_rck = (scroll0 && m_plt && !zoom0) != m_pflag;
if (old_rck != m_rck)
{
m_rck_out(m_rck);
const uint8_t old_ra = m_ra;
const bool old_opra = m_opra;
const bool ah_sel = !m_rck;
m_ra = (m_rhscr_stripe_addr & 1);
if (ah_sel)
{
m_ra |= m_cx_stripe_addr & 0x0e;
m_opra = false;
}
else
{
m_ra |= m_rhscr_stripe_addr & 0x0e;
m_opra = BIT(m_rhscr_stripe_num, 0);
}
if (old_ra != m_ra)
m_ra_out(m_ra);
if (old_opra != m_opra)
m_opra_out(m_opra);
}
}
void dpb7000_storeaddr_card_device::update_v0()
{
// FLDSEL1 VLSB NAND1 FLDSEL0 V0
// 0 0 1 0 1
// 0 1 1 0 1
// 1 0 1 0 1
// 1 1 0 0 1
// 0 0 1 1 0
// 0 1 1 1 0
// 1 0 1 1 0
// 1 1 0 1 1
const bool v0 = !BIT(m_fld_sel, 0) || (BIT(m_fld_sel, 1) && BIT(m_rvscr_counter, 0));
m_rvscr_with_v0 = (m_rvscr_counter &~ 1) | (v0 ? 1 : 0);
}
void dpb7000_storeaddr_card_device::update_blanking_pal()
{
uint16_t addr = (m_rhscr_stripe_num >> 4);
addr |= (m_rvscr_counter & 0xfc) << 2;
addr |= BIT(m_rhscr_stripe_num, 0) << 10;
addr |= (m_rvscr_counter & 0x300) << 3;
addr |= (m_rhscr_stripe_num & 0x0e) << 12;
const uint8_t blanking = m_blanking_base[addr];
m_blank_d = !(BIT(blanking, 0) && BIT(blanking, 1));
}
void dpb7000_storeaddr_card_device::update_addr_mux_inputs()
{
m_df_in[0] = (m_cx_stripe_num & 0x30) >> 4;
const uint8_t cy_df_bits = (m_cy_addr & 0x300) >> 8;
m_df_in[0] |= cy_df_bits << 2;
m_df_in[1] = cy_df_bits | 0xc;
m_ee_in[0] = (m_rhscr_stripe_num & 0x30) >> 4;
const uint8_t ry_ee_bits = (m_rvscr_counter & 0x300) >> 8;
m_ee_in[0] |= ry_ee_bits << 2;
m_ee_in[1] = ry_ee_bits | 0xc;
update_addr_mux_outputs();
}
void dpb7000_storeaddr_card_device::update_addr_mux_outputs()
{
m_df_out = m_df_in[BIT(m_cx_stripe_num, 6)];
m_ee_out = m_ee_in[BIT(m_rhscr_stripe_num, 6)];
update_addr_select_inputs();
}
void dpb7000_storeaddr_card_device::update_addr_select_inputs()
{
m_dg_in[0] = BIT(m_rhscr_stripe_num, 0) | (BIT(m_ee_out, 0) << 1) | (BIT(m_cx_stripe_num, 0) << 2) | (BIT(m_df_out, 0) << 3);
m_dg_in[1] = BIT(m_rhscr_stripe_num, 1) | (BIT(m_ee_out, 1) << 1) | (BIT(m_cx_stripe_num, 1) << 2) | (BIT(m_df_out, 1) << 3);
m_eg_in[0] = BIT(m_rhscr_stripe_num, 2) | (BIT(m_rvscr_with_v0, 5) << 1) | (BIT(m_cx_stripe_num, 2) << 2) | (BIT(m_cy_addr, 5) << 3);
m_eg_in[1] = BIT(m_rhscr_stripe_num, 3) | (BIT(m_rvscr_with_v0, 6) << 1) | (BIT(m_cx_stripe_num, 3) << 2) | (BIT(m_cy_addr, 6) << 3);
m_fg_in[0] = BIT(m_rvscr_with_v0, 1) | (BIT(m_rvscr_with_v0, 7) << 1) | (BIT(m_cy_addr, 1) << 2) | (BIT(m_cy_addr, 7) << 3);
m_fg_in[1] = BIT(m_rvscr_with_v0, 2) | (BIT(m_ee_out, 2) << 1) | (BIT(m_cy_addr, 2) << 2) | (BIT(m_df_out, 2) << 3);
m_gg_in[0] = BIT(m_rvscr_with_v0, 3) | (BIT(m_ee_out, 3) << 1) | (BIT(m_cy_addr, 3) << 2) | (BIT(m_df_out, 3) << 3);
m_gg_in[1] = BIT(m_rvscr_with_v0, 4) | (BIT(m_rvscr_with_v0, 0) << 1) | (BIT(m_cy_addr, 4) << 2) | (BIT(m_cy_addr, 0) << 3);
update_addr_select_outputs();
}
void dpb7000_storeaddr_card_device::update_addr_select_outputs()
{
const uint8_t sel = (m_mxr ? 1 : 0) | (m_rc_sel ? 2 : 0);
const uint8_t old = m_addr;
m_addr = BIT(m_dg_in[0], sel);
m_addr |= BIT(m_dg_in[1], sel) << 1;
m_addr |= BIT(m_eg_in[0], sel) << 2;
m_addr |= BIT(m_eg_in[1], sel) << 3;
m_addr |= BIT(m_fg_in[0], sel) << 4;
m_addr |= BIT(m_fg_in[1], sel) << 5;
m_addr |= BIT(m_gg_in[0], sel) << 6;
m_addr |= BIT(m_gg_in[1], sel) << 7;
if (old != m_addr)
m_addr_out(m_addr);
}

View File

@ -51,6 +51,20 @@ public:
void prot_a_w(int state); void prot_a_w(int state);
void prot_b_w(int state); void prot_b_w(int state);
void rvl_w(int state);
void rhr_w(int state);
void plt_w(int state);
void zb_w(int state);
void rppck_w(int state);
void rb_w(int state);
void pflag_w(int state);
void b26_w(int state);
void ipen_w(int state);
auto ipsel() { return m_ipsel_out.bind(); }
auto rck() { return m_rck_out.bind(); }
protected: protected:
// device-level overrides // device-level overrides
virtual void device_start() override; virtual void device_start() override;
@ -62,13 +76,22 @@ protected:
void tick_cxck(); void tick_cxck();
void tick_cyck(); void tick_cyck();
void update_blanking_pal();
void update_prot_proms(); void update_prot_proms();
void update_rck();
void update_v0();
void update_addr_mux_inputs();
void update_addr_mux_outputs();
void update_addr_select_inputs();
void update_addr_select_outputs();
uint8_t *m_bb_base; uint8_t *m_bb_base;
uint8_t *m_bc_base; uint8_t *m_bc_base;
uint8_t *m_bd_base; uint8_t *m_bd_base;
uint8_t *m_protx_base; uint8_t *m_protx_base;
uint8_t *m_proty_base; uint8_t *m_proty_base;
uint8_t *m_blanking_base;
uint8_t m_bb_out; uint8_t m_bb_out;
uint8_t m_bc_out; uint8_t m_bc_out;
@ -76,11 +99,24 @@ protected:
bool m_protx; bool m_protx;
bool m_proty; bool m_proty;
uint8_t m_df_in[2];
uint8_t m_df_out;
uint8_t m_ee_in[2];
uint8_t m_ee_out;
uint8_t m_dg_in[2];
uint8_t m_eg_in[2];
uint8_t m_fg_in[2];
uint8_t m_gg_in[2];
uint8_t m_addr;
uint16_t m_rhscr; uint16_t m_rhscr;
uint16_t m_rvscr; uint16_t m_rvscr;
uint16_t m_rzoom; uint8_t m_rzoom;
uint16_t m_fld_sel; uint8_t m_fld_sel;
uint16_t m_cypos;
uint8_t m_hzoom_count;
uint8_t m_vzoom_count;
int8_t m_orig_cx_stripe_addr; int8_t m_orig_cx_stripe_addr;
int16_t m_orig_cx_stripe_num; int16_t m_orig_cx_stripe_num;
@ -89,6 +125,12 @@ protected:
int16_t m_cx_stripe_num; int16_t m_cx_stripe_num;
int16_t m_cy_addr; int16_t m_cy_addr;
uint8_t m_rhscr_stripe_addr;
uint8_t m_rhscr_stripe_num;
uint16_t m_rvscr_counter;
uint16_t m_rvscr_with_v0;
int m_s_type; int m_s_type;
bool m_cen; bool m_cen;
@ -115,6 +157,43 @@ protected:
bool m_prot_a; bool m_prot_a;
bool m_prot_b; bool m_prot_b;
bool m_rvl;
bool m_rhr;
bool m_plt;
bool m_zb;
bool m_rppck;
bool m_rb;
bool m_pflag;
bool m_mxr;
bool m_rc_sel;
bool m_window_enable;
bool m_b26;
bool m_blank_d;
bool m_blank_a;
bool m_blank_b;
uint8_t m_blank_q;
bool m_crc;
bool m_ipen;
// Output Signals
bool m_ipsel;
bool m_rck;
uint8_t m_ra;
bool m_opra;
// Output Handlers
devcb_write_line m_ipsel_out;
devcb_write_line m_rck_out;
devcb_write8 m_ra_out;
devcb_write_line m_opra_out;
devcb_write_line m_blk_out;
devcb_write8 m_addr_out;
// Devices
required_memory_region m_x_prom; required_memory_region m_x_prom;
required_memory_region m_protx_prom; required_memory_region m_protx_prom;
required_memory_region m_proty_prom; required_memory_region m_proty_prom;