mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
abc800: Cleanup. (nw)
This commit is contained in:
parent
f3d19e977c
commit
0298e45fcf
@ -142,6 +142,7 @@ Notes:
|
||||
TODO:
|
||||
|
||||
- abc802 video is all black
|
||||
- abc850 is broken
|
||||
- cassette
|
||||
|
||||
*/
|
||||
@ -160,7 +161,8 @@ Notes:
|
||||
|
||||
static DISCRETE_SOUND_START( abc800_discrete )
|
||||
DISCRETE_INPUT_LOGIC(NODE_01)
|
||||
DISCRETE_OUTPUT(NODE_01, 5000)
|
||||
DISCRETE_LOGIC_JKFLIPFLOP(NODE_02, 1,1, NODE_01, 1, 1) // 74LS393 @ 7C (input _CP0, output Q0)
|
||||
DISCRETE_OUTPUT(NODE_02, 5000)
|
||||
DISCRETE_SOUND_END
|
||||
|
||||
|
||||
@ -170,9 +172,8 @@ DISCRETE_SOUND_END
|
||||
|
||||
READ8_MEMBER( abc800_state::pling_r )
|
||||
{
|
||||
m_pling = !m_pling;
|
||||
|
||||
m_discrete->write(space, NODE_01, m_pling);
|
||||
m_discrete->write(space, NODE_01, 0);
|
||||
m_discrete->write(space, NODE_01, 1);
|
||||
|
||||
return 0xff;
|
||||
}
|
||||
@ -233,7 +234,7 @@ void abc802_state::bankswitch()
|
||||
void abc806_state::bankswitch()
|
||||
{
|
||||
address_space &program = m_maincpu->space(AS_PROGRAM);
|
||||
uint32_t videoram_mask = m_ram->size() - (32 * 1024) - 1;
|
||||
uint32_t videoram_mask = m_ram->size() - 0x8000 - 1;
|
||||
int bank;
|
||||
char bank_name[10];
|
||||
|
||||
@ -371,7 +372,7 @@ READ8_MEMBER( abc800_state::m1_r )
|
||||
{
|
||||
if (!m_fetch_charram)
|
||||
{
|
||||
m_fetch_charram = 1;
|
||||
m_fetch_charram = true;
|
||||
bankswitch();
|
||||
}
|
||||
|
||||
@ -380,7 +381,7 @@ READ8_MEMBER( abc800_state::m1_r )
|
||||
|
||||
if (m_fetch_charram)
|
||||
{
|
||||
m_fetch_charram = 0;
|
||||
m_fetch_charram = false;
|
||||
bankswitch();
|
||||
}
|
||||
|
||||
@ -393,7 +394,7 @@ READ8_MEMBER( abc800c_state::m1_r )
|
||||
{
|
||||
if (!m_fetch_charram)
|
||||
{
|
||||
m_fetch_charram = 1;
|
||||
m_fetch_charram = true;
|
||||
bankswitch();
|
||||
}
|
||||
|
||||
@ -402,7 +403,7 @@ READ8_MEMBER( abc800c_state::m1_r )
|
||||
|
||||
if (m_fetch_charram)
|
||||
{
|
||||
m_fetch_charram = 0;
|
||||
m_fetch_charram = false;
|
||||
bankswitch();
|
||||
}
|
||||
|
||||
@ -511,7 +512,7 @@ void abc800_state::abc800c_io(address_map &map)
|
||||
map(0x06, 0x06).mirror(0x18).w(this, FUNC(abc800_state::hrs_w));
|
||||
map(0x07, 0x07).mirror(0x18).r(ABCBUS_TAG, FUNC(abcbus_slot_device::rst_r)).w(this, FUNC(abc800_state::hrc_w));
|
||||
map(0x20, 0x23).mirror(0x0c).rw(m_dart, FUNC(z80dart_device::ba_cd_r), FUNC(z80dart_device::ba_cd_w));
|
||||
map(0x40, 0x43).mirror(0x1c).rw(m_sio, FUNC(z80sio2_device::ba_cd_r), FUNC(z80sio2_device::ba_cd_w));
|
||||
map(0x40, 0x43).mirror(0x1c).rw(m_sio, FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w));
|
||||
map(0x60, 0x63).mirror(0x1c).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
|
||||
}
|
||||
|
||||
@ -576,7 +577,7 @@ void abc802_state::abc802_io(address_map &map)
|
||||
map(0x31, 0x31).mirror(0x06).r(m_crtc, FUNC(mc6845_device::register_r));
|
||||
map(0x38, 0x38).mirror(0x06).w(m_crtc, FUNC(mc6845_device::address_w));
|
||||
map(0x39, 0x39).mirror(0x06).w(m_crtc, FUNC(mc6845_device::register_w));
|
||||
map(0x40, 0x43).mirror(0x1c).rw(m_sio, FUNC(z80sio2_device::ba_cd_r), FUNC(z80sio2_device::ba_cd_w));
|
||||
map(0x40, 0x43).mirror(0x1c).rw(m_sio, FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w));
|
||||
map(0x60, 0x63).mirror(0x1c).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
|
||||
}
|
||||
|
||||
@ -631,7 +632,7 @@ void abc806_state::abc806_io(address_map &map)
|
||||
map(0x37, 0x37).select(0xff00).rw(this, FUNC(abc806_state::cli_r), FUNC(abc806_state::sso_w));
|
||||
map(0x38, 0x38).mirror(0xff00).w(m_crtc, FUNC(mc6845_device::address_w));
|
||||
map(0x39, 0x39).mirror(0xff00).w(m_crtc, FUNC(mc6845_device::register_w));
|
||||
map(0x40, 0x43).mirror(0xff1c).rw(m_sio, FUNC(z80sio2_device::ba_cd_r), FUNC(z80sio2_device::ba_cd_w));
|
||||
map(0x40, 0x43).mirror(0xff1c).rw(m_sio, FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w));
|
||||
map(0x60, 0x63).mirror(0xff1c).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
|
||||
}
|
||||
|
||||
@ -660,12 +661,7 @@ INPUT_PORTS_END
|
||||
//-------------------------------------------------
|
||||
|
||||
static INPUT_PORTS_START( abc802 )
|
||||
PORT_START("SB")
|
||||
PORT_DIPNAME( 0xff, 0xaa, "Serial Communications" ) PORT_DIPLOCATION("SB:1,2,3,4,5,6,7,8")
|
||||
PORT_DIPSETTING( 0xaa, "Asynchronous, Single Speed" )
|
||||
PORT_DIPSETTING( 0x2e, "Asynchronous, Split Speed" )
|
||||
PORT_DIPSETTING( 0x50, "Synchronous" )
|
||||
PORT_DIPSETTING( 0x8b, "ABC NET" )
|
||||
PORT_INCLUDE(abc800)
|
||||
|
||||
PORT_START("CONFIG")
|
||||
PORT_DIPNAME( 0x01, 0x00, "Clear Screen Time Out" ) PORT_DIPLOCATION("S1:1")
|
||||
@ -688,12 +684,7 @@ INPUT_PORTS_END
|
||||
//-------------------------------------------------
|
||||
|
||||
static INPUT_PORTS_START( abc806 )
|
||||
PORT_START("SB")
|
||||
PORT_DIPNAME( 0xff, 0xaa, "Serial Communications" ) PORT_DIPLOCATION("SB:1,2,3,4,5,6,7,8")
|
||||
PORT_DIPSETTING( 0xaa, "Asynchronous, Single Speed" )
|
||||
PORT_DIPSETTING( 0x2e, "Asynchronous, Split Speed" )
|
||||
PORT_DIPSETTING( 0x50, "Synchronous" )
|
||||
PORT_DIPSETTING( 0x8b, "ABC NET" )
|
||||
PORT_INCLUDE(abc800)
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
@ -703,39 +694,29 @@ INPUT_PORTS_END
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// Z80CTC
|
||||
// cassette
|
||||
//-------------------------------------------------
|
||||
|
||||
WRITE_LINE_MEMBER( abc800_state::ctc_z0_w )
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( abc800_state::cassette_input_tick )
|
||||
{
|
||||
if (BIT(m_sb, 2))
|
||||
if (m_cassette == nullptr) return;
|
||||
|
||||
int dfd_in = m_cassette->input() > 0;
|
||||
|
||||
if (m_dfd_in && !dfd_in)
|
||||
{
|
||||
m_sio->txca_w(state);
|
||||
m_ctc->trg3(state);
|
||||
m_sio->rxb_w(!(m_tape_ctr == 15));
|
||||
}
|
||||
|
||||
clock_cassette(state);
|
||||
if (!dfd_in && (m_tape_ctr == 15))
|
||||
{
|
||||
m_tape_ctr = 4;
|
||||
}
|
||||
|
||||
m_dfd_in = dfd_in;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( abc800_state::ctc_z1_w )
|
||||
{
|
||||
if (BIT(m_sb, 3))
|
||||
{
|
||||
m_sio->rxca_w(state);
|
||||
}
|
||||
|
||||
if (BIT(m_sb, 4))
|
||||
{
|
||||
m_sio->txca_w(state);
|
||||
m_ctc->trg3(state);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// Z80SIO
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc800_state::clock_cassette(int state)
|
||||
void abc800_state::cassette_output_tick(int state)
|
||||
{
|
||||
if (m_cassette == nullptr) return;
|
||||
|
||||
@ -761,6 +742,53 @@ void abc800_state::clock_cassette(int state)
|
||||
m_ctc_z0 = state;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// Z80CTC
|
||||
//-------------------------------------------------
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( abc800_state::ctc_tick )
|
||||
{
|
||||
m_ctc->trg0(1);
|
||||
m_ctc->trg0(0);
|
||||
|
||||
m_ctc->trg1(1);
|
||||
m_ctc->trg1(0);
|
||||
|
||||
m_ctc->trg2(1);
|
||||
m_ctc->trg2(0);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( abc800_state::ctc_z0_w )
|
||||
{
|
||||
if (BIT(m_sb, 2))
|
||||
{
|
||||
m_sio->txca_w(state);
|
||||
m_ctc->trg3(state);
|
||||
}
|
||||
|
||||
cassette_output_tick(state);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( abc800_state::ctc_z1_w )
|
||||
{
|
||||
if (BIT(m_sb, 3))
|
||||
{
|
||||
m_sio->rxca_w(state);
|
||||
}
|
||||
|
||||
if (BIT(m_sb, 4))
|
||||
{
|
||||
m_sio->txca_w(state);
|
||||
m_ctc->trg3(state);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// Z80SIO
|
||||
//-------------------------------------------------
|
||||
|
||||
WRITE_LINE_MEMBER( abc800_state::sio_txdb_w )
|
||||
{
|
||||
m_sio_txdb = state;
|
||||
@ -773,12 +801,10 @@ WRITE_LINE_MEMBER( abc800_state::sio_dtrb_w )
|
||||
if (state)
|
||||
{
|
||||
m_cassette->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
|
||||
m_cassette_timer->enable(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_cassette->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
|
||||
m_cassette_timer->enable(false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -794,6 +820,7 @@ WRITE_LINE_MEMBER( abc800_state::sio_rtsb_w )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// Z80DART abc802
|
||||
//-------------------------------------------------
|
||||
@ -810,6 +837,7 @@ WRITE_LINE_MEMBER( abc802_state::mux80_40_w )
|
||||
m_80_40_mux = state;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// Z80DART abc806
|
||||
//-------------------------------------------------
|
||||
@ -821,6 +849,7 @@ WRITE_LINE_MEMBER( abc806_state::keydtr_w )
|
||||
bankswitch();
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// z80_daisy_config abc800_daisy_chain
|
||||
//-------------------------------------------------
|
||||
@ -834,67 +863,19 @@ static const z80_daisy_config abc800_daisy_chain[] =
|
||||
};
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// MACHINE INITIALIZATION
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_timer - handler timer events
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc800_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case TIMER_ID_CTC:
|
||||
m_ctc->trg0(1);
|
||||
m_ctc->trg0(0);
|
||||
|
||||
m_ctc->trg1(1);
|
||||
m_ctc->trg1(0);
|
||||
|
||||
m_ctc->trg2(1);
|
||||
m_ctc->trg2(0);
|
||||
break;
|
||||
|
||||
case TIMER_ID_CASSETTE:
|
||||
{
|
||||
int dfd_in = m_cassette->input() > 0;
|
||||
|
||||
if (m_dfd_in && !dfd_in)
|
||||
{
|
||||
m_sio->rxb_w(!(m_tape_ctr == 15));
|
||||
}
|
||||
|
||||
if (!dfd_in && (m_tape_ctr == 15))
|
||||
{
|
||||
m_tape_ctr = 4;
|
||||
}
|
||||
|
||||
m_dfd_in = dfd_in;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// machine_start
|
||||
// abc800
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc800_state::machine_start()
|
||||
{
|
||||
// start timers
|
||||
m_ctc_timer = timer_alloc(TIMER_ID_CTC);
|
||||
m_ctc_timer->adjust(attotime::from_hz(ABC800_X01/2/2/2), 0, attotime::from_hz(ABC800_X01/2/2/2));
|
||||
|
||||
m_cassette_timer = timer_alloc(TIMER_ID_CASSETTE);
|
||||
m_cassette_timer->adjust(attotime::from_hz(44100), 0, attotime::from_hz(44100));
|
||||
m_cassette_timer->enable(false);
|
||||
|
||||
// register for state saving
|
||||
save_item(NAME(m_fetch_charram));
|
||||
save_item(NAME(m_pling));
|
||||
save_item(NAME(m_sb));
|
||||
save_item(NAME(m_ctc_z0));
|
||||
save_item(NAME(m_sio_txcb));
|
||||
@ -903,18 +884,15 @@ void abc800_state::machine_start()
|
||||
save_item(NAME(m_dfd_out));
|
||||
save_item(NAME(m_dfd_in));
|
||||
save_item(NAME(m_tape_ctr));
|
||||
save_item(NAME(m_hrs));
|
||||
save_item(NAME(m_fgctl));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// machine_reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc800_state::machine_reset()
|
||||
{
|
||||
m_sb = m_io_sb->read();
|
||||
|
||||
m_fetch_charram = 0;
|
||||
m_fetch_charram = false;
|
||||
bankswitch();
|
||||
|
||||
m_dart->ria_w(1);
|
||||
@ -927,20 +905,12 @@ void abc800_state::machine_reset()
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// machine_start
|
||||
// abc802
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc802_state::machine_start()
|
||||
{
|
||||
// start timers
|
||||
m_ctc_timer = timer_alloc(TIMER_ID_CTC);
|
||||
m_ctc_timer->adjust(attotime::from_hz(ABC800_X01/2/2/2), 0, attotime::from_hz(ABC800_X01/2/2/2));
|
||||
|
||||
m_cassette_timer = timer_alloc(TIMER_ID_CASSETTE);
|
||||
m_cassette_timer->adjust(attotime::from_hz(44100), 0, attotime::from_hz(44100));
|
||||
|
||||
// register for state saving
|
||||
save_item(NAME(m_pling));
|
||||
save_item(NAME(m_sb));
|
||||
save_item(NAME(m_ctc_z0));
|
||||
save_item(NAME(m_sio_txcb));
|
||||
@ -950,13 +920,11 @@ void abc802_state::machine_start()
|
||||
save_item(NAME(m_dfd_in));
|
||||
save_item(NAME(m_tape_ctr));
|
||||
save_item(NAME(m_lrs));
|
||||
save_item(NAME(m_flshclk_ctr));
|
||||
save_item(NAME(m_flshclk));
|
||||
save_item(NAME(m_80_40_mux));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// machine_reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc802_state::machine_reset()
|
||||
{
|
||||
uint8_t config = m_config->read();
|
||||
@ -983,34 +951,26 @@ void abc802_state::machine_reset()
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// machine_start
|
||||
// abc806
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc806_state::machine_start()
|
||||
{
|
||||
// start timers
|
||||
m_ctc_timer = timer_alloc(TIMER_ID_CTC);
|
||||
m_ctc_timer->adjust(attotime::from_hz(ABC800_X01/2/2/2), 0, attotime::from_hz(ABC800_X01/2/2/2));
|
||||
|
||||
// setup memory banking
|
||||
uint8_t *mem = m_rom->base();
|
||||
uint32_t videoram_size = m_ram->size() - (32 * 1024);
|
||||
int bank;
|
||||
char bank_name[10];
|
||||
|
||||
// allocate video RAM
|
||||
uint32_t videoram_size = m_ram->size() - 0x8000;
|
||||
m_video_ram.allocate(videoram_size);
|
||||
|
||||
for (bank = 1; bank <= 16; bank++)
|
||||
{
|
||||
// setup memory banks
|
||||
for (int bank = 1; bank <= 16; bank++) {
|
||||
char bank_name[10];
|
||||
sprintf(bank_name,"bank%d",bank);
|
||||
membank(bank_name)->configure_entry(0, mem + (0x1000 * (bank - 1)));
|
||||
|
||||
membank(bank_name)->configure_entry(0, m_rom->base() + (0x1000 * (bank - 1)));
|
||||
membank(bank_name)->configure_entry(1, m_video_ram);
|
||||
membank(bank_name)->set_entry(0);
|
||||
}
|
||||
|
||||
// register for state saving
|
||||
save_item(NAME(m_fetch_charram));
|
||||
save_item(NAME(m_pling));
|
||||
save_item(NAME(m_sb));
|
||||
save_item(NAME(m_ctc_z0));
|
||||
save_item(NAME(m_sio_txcb));
|
||||
@ -1022,47 +982,43 @@ void abc806_state::machine_start()
|
||||
save_item(NAME(m_keydtr));
|
||||
save_item(NAME(m_eme));
|
||||
save_item(NAME(m_map));
|
||||
save_item(NAME(m_txoff));
|
||||
save_item(NAME(m_40));
|
||||
save_item(NAME(m_flshclk_ctr));
|
||||
save_item(NAME(m_flshclk));
|
||||
save_item(NAME(m_attr_data));
|
||||
save_item(NAME(m_hrs));
|
||||
save_item(NAME(m_hrc));
|
||||
save_item(NAME(m_sync));
|
||||
save_item(NAME(m_v50_addr));
|
||||
save_item(NAME(m_hru2_a8));
|
||||
save_item(NAME(m_vsync_shift));
|
||||
save_item(NAME(m_vsync));
|
||||
save_item(NAME(m_d_vsync));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// machine_reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc806_state::machine_reset()
|
||||
{
|
||||
m_sb = m_io_sb->read();
|
||||
|
||||
// setup memory banking
|
||||
int bank;
|
||||
char bank_name[10];
|
||||
|
||||
for (bank = 1; bank <= 16; bank++)
|
||||
{
|
||||
// reset memory banks
|
||||
for (int bank = 1; bank <= 16; bank++) {
|
||||
char bank_name[10];
|
||||
sprintf(bank_name,"bank%d",bank);
|
||||
membank(bank_name)->set_entry(0);
|
||||
}
|
||||
|
||||
bankswitch();
|
||||
abc800_state::machine_reset();
|
||||
|
||||
// clear STO lines
|
||||
m_eme = 0;
|
||||
m_40 = 0;
|
||||
m_hru2_a8 = 0;
|
||||
m_txoff = 0;
|
||||
m_rtc->cs_w(1);
|
||||
m_rtc->clk_w(1);
|
||||
m_rtc->dio_w(1);
|
||||
|
||||
m_dart->ria_w(1);
|
||||
|
||||
// 50/60 Hz
|
||||
m_dart->ctsb_w(0); // 0 = 50Hz, 1 = 60Hz
|
||||
|
||||
m_dfd_in = 0;
|
||||
for (int i = 0; i < 8; i++) {
|
||||
sto_w(m_maincpu->space(AS_PROGRAM), 0, i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// bac quickload
|
||||
//-------------------------------------------------
|
||||
|
||||
QUICKLOAD_LOAD_MEMBER( abc800_state, bac )
|
||||
{
|
||||
address_space &space = m_maincpu->space(AS_PROGRAM);
|
||||
@ -1140,15 +1096,16 @@ MACHINE_CONFIG_START(abc800_state::common)
|
||||
MCFG_Z80CTC_ZC1_CB(WRITELINE(*this, abc800_state, ctc_z1_w))
|
||||
MCFG_Z80CTC_ZC2_CB(WRITELINE(Z80DART_TAG, z80dart_device, rxca_w))
|
||||
MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE(Z80DART_TAG, z80dart_device, txca_w))
|
||||
MCFG_TIMER_DRIVER_ADD_PERIODIC(TIMER_CTC_TAG, abc800_state, ctc_tick, attotime::from_hz(ABC800_X01/2/2/2))
|
||||
|
||||
MCFG_DEVICE_ADD(Z80SIO_TAG, Z80SIO2, ABC800_X01/2/2)
|
||||
MCFG_Z80DART_OUT_TXDA_CB(WRITELINE(RS232_B_TAG, rs232_port_device, write_txd))
|
||||
MCFG_Z80DART_OUT_DTRA_CB(WRITELINE(RS232_B_TAG, rs232_port_device, write_dtr))
|
||||
MCFG_Z80DART_OUT_RTSA_CB(WRITELINE(RS232_B_TAG, rs232_port_device, write_rts))
|
||||
MCFG_Z80DART_OUT_TXDB_CB(WRITELINE(*this, abc800_state, sio_txdb_w))
|
||||
MCFG_Z80DART_OUT_DTRB_CB(WRITELINE(*this, abc800_state, sio_txdb_w))
|
||||
MCFG_Z80DART_OUT_RTSB_CB(WRITELINE(*this, abc800_state, sio_txdb_w))
|
||||
MCFG_Z80DART_OUT_INT_CB(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0))
|
||||
MCFG_DEVICE_ADD(Z80SIO_TAG, Z80SIO, ABC800_X01/2/2)
|
||||
MCFG_Z80SIO_OUT_TXDA_CB(WRITELINE(RS232_B_TAG, rs232_port_device, write_txd))
|
||||
MCFG_Z80SIO_OUT_DTRA_CB(WRITELINE(RS232_B_TAG, rs232_port_device, write_dtr))
|
||||
MCFG_Z80SIO_OUT_RTSA_CB(WRITELINE(RS232_B_TAG, rs232_port_device, write_rts))
|
||||
MCFG_Z80SIO_OUT_TXDB_CB(WRITELINE(*this, abc800_state, sio_txdb_w))
|
||||
MCFG_Z80SIO_OUT_DTRB_CB(WRITELINE(*this, abc800_state, sio_dtrb_w))
|
||||
MCFG_Z80SIO_OUT_RTSB_CB(WRITELINE(*this, abc800_state, sio_rtsb_w))
|
||||
MCFG_Z80SIO_OUT_INT_CB(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0))
|
||||
|
||||
MCFG_DEVICE_ADD(Z80DART_TAG, Z80DART, ABC800_X01/2/2)
|
||||
MCFG_Z80DART_OUT_TXDA_CB(WRITELINE(RS232_A_TAG, rs232_port_device, write_txd))
|
||||
@ -1159,6 +1116,7 @@ MACHINE_CONFIG_START(abc800_state::common)
|
||||
|
||||
MCFG_CASSETTE_ADD(CASSETTE_TAG)
|
||||
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED)
|
||||
MCFG_TIMER_DRIVER_ADD_PERIODIC(TIMER_CASSETTE_TAG, abc800_state, cassette_input_tick, attotime::from_hz(44100))
|
||||
|
||||
MCFG_DEVICE_ADD(RS232_A_TAG, RS232_PORT, default_rs232_devices, nullptr)
|
||||
MCFG_RS232_RXD_HANDLER(WRITELINE(Z80DART_TAG, z80dart_device, rxa_w))
|
||||
@ -1166,9 +1124,9 @@ MACHINE_CONFIG_START(abc800_state::common)
|
||||
MCFG_RS232_CTS_HANDLER(WRITELINE(Z80DART_TAG, z80dart_device, ctsa_w))
|
||||
|
||||
MCFG_DEVICE_ADD(RS232_B_TAG, RS232_PORT, default_rs232_devices, nullptr)
|
||||
MCFG_RS232_RXD_HANDLER(WRITELINE(Z80SIO_TAG, z80dart_device, rxa_w))
|
||||
MCFG_RS232_DCD_HANDLER(WRITELINE(Z80SIO_TAG, z80dart_device, dcda_w))
|
||||
MCFG_RS232_CTS_HANDLER(WRITELINE(Z80SIO_TAG, z80dart_device, ctsa_w))
|
||||
MCFG_RS232_RXD_HANDLER(WRITELINE(Z80SIO_TAG, z80sio_device, rxa_w))
|
||||
MCFG_RS232_DCD_HANDLER(WRITELINE(Z80SIO_TAG, z80sio_device, dcda_w))
|
||||
MCFG_RS232_CTS_HANDLER(WRITELINE(Z80SIO_TAG, z80sio_device, ctsa_w))
|
||||
|
||||
MCFG_ABC_KEYBOARD_PORT_ADD(ABC_KEYBOARD_PORT_TAG, nullptr)
|
||||
MCFG_ABC_KEYBOARD_OUT_RX_HANDLER(WRITELINE(Z80DART_TAG, z80dart_device, rxb_w))
|
||||
|
@ -17,7 +17,9 @@
|
||||
#include "machine/e0516.h"
|
||||
#include "machine/z80ctc.h"
|
||||
#include "machine/z80dart.h"
|
||||
#include "machine/z80sio.h"
|
||||
#include "machine/ram.h"
|
||||
#include "machine/timer.h"
|
||||
#include "sound/discrete.h"
|
||||
#include "video/mc6845.h"
|
||||
#include "video/saa5050.h"
|
||||
@ -61,6 +63,9 @@
|
||||
#define RS232_A_TAG "rs232a"
|
||||
#define RS232_B_TAG "rs232b"
|
||||
#define ABC_KEYBOARD_PORT_TAG "kb"
|
||||
#define TIMER_CTC_TAG "timer_ctc"
|
||||
#define TIMER_CASSETTE_TAG "timer_cass"
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
@ -96,7 +101,7 @@ public:
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<z80ctc_device> m_ctc;
|
||||
required_device<z80dart_device> m_dart;
|
||||
required_device<z80sio2_device> m_sio;
|
||||
required_device<z80sio_device> m_sio;
|
||||
optional_device<discrete_sound_device> m_discrete;
|
||||
optional_device<cassette_image_device> m_cassette;
|
||||
required_device<ram_device> m_ram;
|
||||
@ -105,21 +110,11 @@ public:
|
||||
optional_shared_ptr<uint8_t> m_char_ram;
|
||||
required_ioport m_io_sb;
|
||||
|
||||
enum
|
||||
{
|
||||
TIMER_ID_CTC,
|
||||
TIMER_ID_CASSETTE
|
||||
};
|
||||
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
|
||||
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
|
||||
virtual void video_start() override;
|
||||
|
||||
void bankswitch();
|
||||
void clock_cassette(int state);
|
||||
void cassette_output_tick(int state);
|
||||
|
||||
virtual DECLARE_READ8_MEMBER( m1_r );
|
||||
DECLARE_READ8_MEMBER( pling_r );
|
||||
@ -130,16 +125,13 @@ public:
|
||||
DECLARE_WRITE_LINE_MEMBER( sio_txdb_w );
|
||||
DECLARE_WRITE_LINE_MEMBER( sio_dtrb_w );
|
||||
DECLARE_WRITE_LINE_MEMBER( sio_rtsb_w );
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( ctc_tick );
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( cassette_input_tick );
|
||||
|
||||
DECLARE_QUICKLOAD_LOAD_MEMBER( bac );
|
||||
|
||||
// memory state
|
||||
bool m_fetch_charram; // opcode fetched from character RAM region (0x7800-0x7fff)
|
||||
uint16_t m_char_ram_start;
|
||||
uint16_t m_char_ram_mask;
|
||||
|
||||
// sound state
|
||||
int m_pling;
|
||||
|
||||
// serial state
|
||||
uint8_t m_sb;
|
||||
@ -156,7 +148,6 @@ public:
|
||||
uint8_t m_fgctl; // HR foreground control
|
||||
|
||||
// timers
|
||||
emu_timer *m_ctc_timer;
|
||||
emu_timer *m_cassette_timer;
|
||||
void common(machine_config &config);
|
||||
void abc800_m1(address_map &map);
|
||||
@ -212,7 +203,6 @@ public:
|
||||
|
||||
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
|
||||
offs_t translate_trom_offset(offs_t offset);
|
||||
void hr_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
|
||||
DECLARE_READ8_MEMBER( m1_r ) override;
|
||||
@ -245,8 +235,6 @@ public:
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
|
||||
virtual void video_start() override;
|
||||
|
||||
void bankswitch();
|
||||
|
||||
DECLARE_READ8_MEMBER( m1_r ) override;
|
||||
|
@ -48,24 +48,6 @@ WRITE8_MEMBER( abc800_state::hrc_w )
|
||||
// ABC 800 COLOR
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// translate_trom_offset -
|
||||
//-------------------------------------------------
|
||||
|
||||
offs_t abc800c_state::translate_trom_offset(offs_t offset)
|
||||
{
|
||||
int row = offset / 40;
|
||||
int col = offset % 40;
|
||||
|
||||
offset = ((row & 0x07) * 0x80) + col;
|
||||
|
||||
if (row & 0x08) offset += 0x28;
|
||||
if (row & 0x10) offset += 0x50;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// hr_update - high resolution screen update
|
||||
//-------------------------------------------------
|
||||
@ -113,14 +95,6 @@ void abc800c_state::hr_update(bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
}
|
||||
|
||||
|
||||
void abc800_state::video_start()
|
||||
{
|
||||
// register for state saving
|
||||
save_item(NAME(m_hrs));
|
||||
save_item(NAME(m_fgctl));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// SCREEN_UPDATE( abc800c )
|
||||
//-------------------------------------------------
|
||||
@ -149,7 +123,15 @@ uint32_t abc800c_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma
|
||||
|
||||
READ8_MEMBER( abc800c_state::char_ram_r )
|
||||
{
|
||||
return m_char_ram[translate_trom_offset(offset)];
|
||||
int row = offset / 40;
|
||||
int col = offset % 40;
|
||||
|
||||
offset = ((row & 0x07) * 0x80) + col;
|
||||
|
||||
if (row & 0x08) offset += 0x28;
|
||||
if (row & 0x10) offset += 0x50;
|
||||
|
||||
return m_char_ram[offset];
|
||||
}
|
||||
|
||||
|
||||
@ -159,7 +141,7 @@ READ8_MEMBER( abc800c_state::char_ram_r )
|
||||
|
||||
PALETTE_INIT_MEMBER( abc800c_state, abc800c )
|
||||
{
|
||||
palette.set_pen_color(0, rgb_t(0x00, 0x00, 0x00)); // black
|
||||
palette.set_pen_color(0, rgb_t::black());
|
||||
palette.set_pen_color(1, rgb_t(0xff, 0x00, 0x00)); // red
|
||||
palette.set_pen_color(2, rgb_t(0x00, 0xff, 0x00)); // green
|
||||
palette.set_pen_color(3, rgb_t(0xff, 0xff, 0x00)); // yellow
|
||||
|
@ -177,15 +177,6 @@ WRITE_LINE_MEMBER( abc802_state::vs_w )
|
||||
}
|
||||
|
||||
|
||||
void abc802_state::video_start()
|
||||
{
|
||||
// register for state saving
|
||||
save_item(NAME(m_flshclk_ctr));
|
||||
save_item(NAME(m_flshclk));
|
||||
save_item(NAME(m_80_40_mux));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// MACHINE_CONFIG_START( abc802_video )
|
||||
//-------------------------------------------------
|
||||
|
@ -428,21 +428,6 @@ void abc806_state::video_start()
|
||||
// allocate memory
|
||||
m_char_ram.allocate(ABC806_CHAR_RAM_SIZE);
|
||||
m_attr_ram.allocate(ABC806_ATTR_RAM_SIZE);
|
||||
|
||||
// register for state saving
|
||||
save_item(NAME(m_txoff));
|
||||
save_item(NAME(m_40));
|
||||
save_item(NAME(m_flshclk_ctr));
|
||||
save_item(NAME(m_flshclk));
|
||||
save_item(NAME(m_attr_data));
|
||||
save_item(NAME(m_hrs));
|
||||
save_item(NAME(m_hrc));
|
||||
save_item(NAME(m_sync));
|
||||
save_item(NAME(m_v50_addr));
|
||||
save_item(NAME(m_hru2_a8));
|
||||
save_item(NAME(m_vsync_shift));
|
||||
save_item(NAME(m_vsync));
|
||||
save_item(NAME(m_d_vsync));
|
||||
}
|
||||
|
||||
|
||||
@ -474,7 +459,7 @@ uint32_t abc806_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap
|
||||
|
||||
PALETTE_INIT_MEMBER( abc806_state, abc806 )
|
||||
{
|
||||
palette.set_pen_color(0, rgb_t(0x00, 0x00, 0x00)); // black
|
||||
palette.set_pen_color(0, rgb_t::black());
|
||||
palette.set_pen_color(1, rgb_t(0xff, 0x00, 0x00)); // red
|
||||
palette.set_pen_color(2, rgb_t(0x00, 0xff, 0x00)); // green
|
||||
palette.set_pen_color(3, rgb_t(0xff, 0xff, 0x00)); // yellow
|
||||
|
Loading…
Reference in New Issue
Block a user