apple2gs: convert most bankdev banking to memory views. [R. Belmont]

This commit is contained in:
arbee 2021-12-06 20:00:54 -05:00
parent f33a4b5ec1
commit f394ff875c

View File

@ -247,10 +247,10 @@ private:
// required_device<apple2_host_device> m_a2host;
required_device<apple2_gameio_device> m_gameio;
required_device<speaker_sound_device> m_speaker;
required_device<address_map_bank_device> m_upperbank, m_upperaux, m_upper00, m_upper01;
memory_view m_upperbank, m_upperaux, m_upper00, m_upper01;
required_device<address_map_bank_device> m_c300bank;
required_device<address_map_bank_device> m_b0_0000bank, m_b0_0200bank, m_b0_0400bank, m_b0_0800bank, m_b0_2000bank, m_b0_4000bank;
required_device<address_map_bank_device> m_lcbank, m_lcaux, m_lc00, m_lc01, m_bank0_atc, m_bank1_atc;
memory_view m_b0_0000bank, m_b0_0200bank, m_b0_0400bank, m_b0_0800bank, m_b0_2000bank, m_b0_4000bank;
memory_view m_lcbank, m_lcaux, m_lc00, m_lc01, m_bank0_atc, m_bank1_atc;
required_device<z80scc_device> m_scc;
required_device<es5503_device> m_doc;
required_device<applefdintf_device> m_iwm;
@ -374,25 +374,8 @@ private:
void apple2gs_map(address_map &map);
void vectors_map(address_map &map);
void c300bank_map(address_map &map);
void inhbank_map(address_map &map);
void inhaux_map(address_map &map);
void inh00_map(address_map &map);
void inh01_map(address_map &map);
void lcbank_map(address_map &map);
void lcaux_map(address_map &map);
void lc00_map(address_map &map);
void lc01_map(address_map &map);
void bank0_iolc_map(address_map &map);
void bank1_lower48_map(address_map &map);
void bank1_iolc_map(address_map &map);
void rb0000bank_map(address_map &map);
void rb0200bank_map(address_map &map);
void rb0400bank_map(address_map &map);
void rb0800bank_map(address_map &map);
void rb2000bank_map(address_map &map);
void rb4000bank_map(address_map &map);
void a2gs_es5503_map(address_map &map);
void c300bank_map(address_map &map);
void phases_w(uint8_t phases);
void sel35_w(int sel35);
@ -739,10 +722,10 @@ WRITE_LINE_MEMBER(apple2gs_state::a2bus_inh_w)
{
if (m_inh_bank != 1)
{
m_upperbank->set_bank(1);
m_upperaux->set_bank(1);
m_upper00->set_bank(1);
m_upper01->set_bank(1);
m_upperbank.select(1);
m_upperaux.select(1);
m_upper00.select(1);
m_upper01.select(1);
m_inh_bank = 1;
}
}
@ -750,10 +733,10 @@ WRITE_LINE_MEMBER(apple2gs_state::a2bus_inh_w)
{
if (m_inh_bank != 0)
{
m_upperbank->set_bank(0);
m_upperaux->set_bank(0);
m_upper00->set_bank(0);
m_upper01->set_bank(0);
m_upperbank.select(0);
m_upperaux.select(0);
m_upper00.select(0);
m_upper01.select(0);
m_inh_bank = 0;
}
}
@ -767,10 +750,10 @@ WRITE_LINE_MEMBER(apple2gs_state::a2bus_inh_w)
// if no slots are inhibiting, make sure ROM is fully switched in
if ((m_inh_slot == -1) && (m_inh_bank != 0))
{
m_upperbank->set_bank(0);
m_upperaux->set_bank(0);
m_upper00->set_bank(0);
m_upper01->set_bank(0);
m_upperbank.select(0);
m_upperaux.select(0);
m_upper00.select(0);
m_upper01.select(0);
m_inh_bank = 0;
}
}
@ -1377,20 +1360,20 @@ void apple2gs_state::machine_start()
m_ram_size = m_ram->size();
m_speaker_state = 0;
m_speaker->level_w(m_speaker_state);
m_upperbank->set_bank(0);
m_upperaux->set_bank(0);
m_upper00->set_bank(0);
m_upper01->set_bank(0);
m_lcbank->set_bank(0);
m_lcaux->set_bank(0);
m_lc00->set_bank(0);
m_lc01->set_bank(0);
m_b0_0000bank->set_bank(0);
m_b0_0200bank->set_bank(0);
m_b0_0400bank->set_bank(0);
m_b0_0800bank->set_bank(0);
m_b0_2000bank->set_bank(0);
m_b0_4000bank->set_bank(0);
m_upperbank.select(0);
m_upperaux.select(0);
m_upper00.select(0);
m_upper01.select(0);
m_lcbank.select(0);
m_lcaux.select(0);
m_lc00.select(0);
m_lc01.select(0);
m_b0_0000bank.select(0);
m_b0_0200bank.select(0);
m_b0_0400bank.select(0);
m_b0_0800bank.select(0);
m_b0_2000bank.select(0);
m_b0_4000bank.select(0);
m_inh_bank = 0;
#if !RUN_ADB_MICRO
m_transchar = 0;
@ -1641,14 +1624,14 @@ void apple2gs_state::machine_reset()
m_maincpu_space = &m_maincpu->space(AS_PROGRAM);
m_b0_0000bank->set_bank(0);
m_b0_0200bank->set_bank(0);
m_b0_0400bank->set_bank(0);
m_b0_0800bank->set_bank(0);
m_b0_2000bank->set_bank(0);
m_b0_4000bank->set_bank(0);
m_bank0_atc->set_bank(1);
m_bank1_atc->set_bank(1);
m_b0_0000bank.select(0);
m_b0_0200bank.select(0);
m_b0_0400bank.select(0);
m_b0_0800bank.select(0);
m_b0_2000bank.select(0);
m_b0_4000bank.select(0);
m_bank0_atc.select(1);
m_bank1_atc.select(1);
// LC default state: read ROM, write enabled, Dxxx bank 2
m_lcram = false;
@ -1935,44 +1918,44 @@ void apple2gs_state::auxbank_update()
{
int ramwr = (m_ramrd ? 1 : 0) | (m_ramwrt ? 2 : 0);
m_b0_0000bank->set_bank(m_altzp ? 1 : 0);
m_b0_0200bank->set_bank(ramwr);
m_b0_0000bank.select(m_altzp ? 1 : 0);
m_b0_0200bank.select(ramwr);
if (m_80store)
{
if (m_page2)
{
m_b0_0400bank->set_bank(3);
m_b0_0400bank.select(3);
}
else
{
m_b0_0400bank->set_bank(0);
m_b0_0400bank.select(0);
}
}
else
{
m_b0_0400bank->set_bank(ramwr);
m_b0_0400bank.select(ramwr);
}
m_b0_0800bank->set_bank(ramwr);
m_b0_0800bank.select(ramwr);
if ((m_80store) && (m_video->m_hires))
{
if (m_page2)
{
m_b0_2000bank->set_bank(3);
m_b0_2000bank.select(3);
}
else
{
m_b0_2000bank->set_bank(0);
m_b0_2000bank.select(0);
}
}
else
{
m_b0_2000bank->set_bank(ramwr);
m_b0_2000bank.select(ramwr);
}
m_b0_4000bank->set_bank(ramwr);
m_b0_4000bank.select(ramwr);
}
void apple2gs_state::update_slotrom_banks()
@ -2048,17 +2031,17 @@ void apple2gs_state::lc_update(int offset, bool writing)
{
if (m_lcram)
{
m_lcbank->set_bank(1);
m_lcaux->set_bank(1);
m_lc00->set_bank(1 + (m_romswitch ? 2 : 0));
m_lc01->set_bank(1);
m_lcbank.select(1);
m_lcaux.select(1);
m_lc00.select(1 + (m_romswitch ? 2 : 0));
m_lc01.select(1);
}
else
{
m_lcbank->set_bank(0);
m_lcaux->set_bank(0);
m_lc00->set_bank(0 + (m_romswitch ? 2 : 0));
m_lc01->set_bank(0);
m_lcbank.select(0);
m_lcaux.select(0);
m_lc00.select(0 + (m_romswitch ? 2 : 0));
m_lc01.select(0);
}
}
@ -2101,11 +2084,11 @@ void apple2gs_state::do_io(int offset)
m_romswitch = !m_romswitch;
if (m_lcram)
{
m_lc00->set_bank(1 + (m_romswitch ? 2 : 0));
m_lc00.select(1 + (m_romswitch ? 2 : 0));
}
else
{
m_lc00->set_bank(0 + (m_romswitch ? 2 : 0));
m_lc00.select(0 + (m_romswitch ? 2 : 0));
}
}
break;
@ -2970,13 +2953,13 @@ void apple2gs_state::c000_w(offs_t offset, u8 data)
// handle I/O and language card inhibit bits here
if (m_shadow & SHAD_IOLC)
{
m_bank0_atc->set_bank(0);
m_bank1_atc->set_bank(0);
m_bank0_atc.select(0);
m_bank1_atc.select(0);
}
else
{
m_bank0_atc->set_bank(1);
m_bank1_atc->set_bank(1);
m_bank0_atc.select(1);
m_bank1_atc.select(1);
}
break;
@ -3134,17 +3117,17 @@ void apple2gs_state::c000_w(offs_t offset, u8 data)
// update LC state
if (m_lcram)
{
m_lcbank->set_bank(1);
m_lcaux->set_bank(1);
m_lc00->set_bank(1);
m_lc01->set_bank(1);
m_lcbank.select(1);
m_lcaux.select(1);
m_lc00.select(1);
m_lc01.select(1);
}
else
{
m_lcbank->set_bank(0);
m_lcaux->set_bank(0);
m_lc00->set_bank(0);
m_lc01->set_bank(0);
m_lcbank.select(0);
m_lcaux.select(0);
m_lc00.select(0);
m_lc01.select(0);
}
break;
@ -4050,15 +4033,75 @@ void apple2gs_state::apple2gs_map(address_map &map)
{
/* "fast side" - runs 2.8 MHz minus RAM refresh, banks 00 and 01 usually have writes shadowed to E0/E1 where I/O lives */
/* Banks 00 and 01 also have their own independent language cards which are NOT shadowed. */
map(0x000000, 0x0001ff).m(m_b0_0000bank, FUNC(address_map_bank_device::amap8));
map(0x000200, 0x0003ff).m(m_b0_0200bank, FUNC(address_map_bank_device::amap8));
map(0x000400, 0x0007ff).m(m_b0_0400bank, FUNC(address_map_bank_device::amap8));
map(0x000800, 0x001fff).m(m_b0_0800bank, FUNC(address_map_bank_device::amap8));
map(0x002000, 0x003fff).m(m_b0_2000bank, FUNC(address_map_bank_device::amap8));
map(0x004000, 0x00bfff).m(m_b0_4000bank, FUNC(address_map_bank_device::amap8));
map(0x00c000, 0x00ffff).m(m_bank0_atc, FUNC(address_map_bank_device::amap8));
map(0x000000, 0x0001ff).view(m_b0_0000bank);
m_b0_0000bank[0](0x0000, 0x01ff).rw(FUNC(apple2gs_state::b0ram0000_r), FUNC(apple2gs_state::b0ram0000_w));
m_b0_0000bank[1](0x0000, 0x01ff).rw(FUNC(apple2gs_state::b1ram0000_r), FUNC(apple2gs_state::b1ram0000_w));
map(0x000200, 0x0003ff).view(m_b0_0200bank);
m_b0_0200bank[0](0x0200, 0x03ff).rw(FUNC(apple2gs_state::b0ram0200_r), FUNC(apple2gs_state::b0ram0200_w)); // wr 0 rd 0
m_b0_0200bank[1](0x0200, 0x03ff).rw(FUNC(apple2gs_state::b1ram0200_r), FUNC(apple2gs_state::b0ram0200_w)); // wr 0 rd 1
m_b0_0200bank[2](0x0200, 0x03ff).rw(FUNC(apple2gs_state::b0ram0200_r), FUNC(apple2gs_state::b1ram0200_w)); // wr 1 rd 0
m_b0_0200bank[3](0x0200, 0x03ff).rw(FUNC(apple2gs_state::b1ram0200_r), FUNC(apple2gs_state::b1ram0200_w)); // wr 1 rd 1
map(0x000400, 0x0007ff).view(m_b0_0400bank);
m_b0_0400bank[0](0x0400, 0x07ff).rw(FUNC(apple2gs_state::b0ram0400_r), FUNC(apple2gs_state::b0ram0400_w)); // wr 0 rd 0
m_b0_0400bank[1](0x0400, 0x07ff).rw(FUNC(apple2gs_state::b1ram0400_r), FUNC(apple2gs_state::b0ram0400_w)); // wr 0 rd 1
m_b0_0400bank[2](0x0400, 0x07ff).rw(FUNC(apple2gs_state::b0ram0400_r), FUNC(apple2gs_state::b1ram0400_w)); // wr 1 rd 0
m_b0_0400bank[3](0x0400, 0x07ff).rw(FUNC(apple2gs_state::b1ram0400_r), FUNC(apple2gs_state::b1ram0400_w)); // wr 1 rd 1
map(0x000800, 0x001fff).view(m_b0_0800bank);
m_b0_0800bank[0](0x0800, 0x1fff).rw(FUNC(apple2gs_state::b0ram0800_r), FUNC(apple2gs_state::b0ram0800_w));
m_b0_0800bank[1](0x0800, 0x1fff).rw(FUNC(apple2gs_state::b1ram0800_r), FUNC(apple2gs_state::b0ram0800_w));
m_b0_0800bank[2](0x0800, 0x1fff).rw(FUNC(apple2gs_state::b0ram0800_r), FUNC(apple2gs_state::b1ram0800_w));
m_b0_0800bank[3](0x0800, 0x1fff).rw(FUNC(apple2gs_state::b1ram0800_r), FUNC(apple2gs_state::b1ram0800_w));
map(0x002000, 0x003fff).view(m_b0_2000bank);
m_b0_2000bank[0](0x2000, 0x3fff).rw(FUNC(apple2gs_state::b0ram2000_r), FUNC(apple2gs_state::b0ram2000_w));
m_b0_2000bank[1](0x2000, 0x3fff).rw(FUNC(apple2gs_state::b1ram2000_r), FUNC(apple2gs_state::b0ram2000_w));
m_b0_2000bank[2](0x2000, 0x3fff).rw(FUNC(apple2gs_state::b0ram2000_r), FUNC(apple2gs_state::b1ram2000_w));
m_b0_2000bank[3](0x2000, 0x3fff).rw(FUNC(apple2gs_state::b1ram2000_r), FUNC(apple2gs_state::b1ram2000_w));
map(0x004000, 0x00bfff).view(m_b0_4000bank);
m_b0_4000bank[0](0x4000, 0xbfff).rw(FUNC(apple2gs_state::b0ram4000_r), FUNC(apple2gs_state::b0ram4000_w));
m_b0_4000bank[1](0x4000, 0xbfff).rw(FUNC(apple2gs_state::b1ram4000_r), FUNC(apple2gs_state::b0ram4000_w));
m_b0_4000bank[2](0x4000, 0xbfff).rw(FUNC(apple2gs_state::b0ram4000_r), FUNC(apple2gs_state::b1ram4000_w));
m_b0_4000bank[3](0x4000, 0xbfff).rw(FUNC(apple2gs_state::b1ram4000_r), FUNC(apple2gs_state::b1ram4000_w));
map(0x00c000, 0x00ffff).view(m_bank0_atc);
m_bank0_atc[0](0xc000, 0xffff).rw(FUNC(apple2gs_state::bank0_c000_r), FUNC(apple2gs_state::bank0_c000_w));
m_bank0_atc[1](0xc000, 0xffff).rw(FUNC(apple2gs_state::c000_r), FUNC(apple2gs_state::c000_w));
m_bank0_atc[1](0xc080, 0xffff).rw(FUNC(apple2gs_state::c080_r), FUNC(apple2gs_state::c080_w));
m_bank0_atc[1](0xc100, 0xffff).rw(FUNC(apple2gs_state::c100_r), FUNC(apple2gs_state::c100_w));
m_bank0_atc[1](0xc300, 0xffff).m(m_c300bank, FUNC(address_map_bank_device::amap8));
m_bank0_atc[1](0xc400, 0xffff).rw(FUNC(apple2gs_state::c400_r), FUNC(apple2gs_state::c400_w));
m_bank0_atc[1](0xc800, 0xffff).rw(FUNC(apple2gs_state::c800_r), FUNC(apple2gs_state::c800_w));
m_bank0_atc[1](0xd000, 0xffff).view(m_upper00);
m_upper00[0](0xd000, 0xffff).view(m_lc00);
m_upper00[1](0xd000, 0xffff).rw(FUNC(apple2gs_state::inh_r), FUNC(apple2gs_state::inh_w));
m_lc00[0](0xd000, 0xffff).rom().region("maincpu", 0x3d000).w(FUNC(apple2gs_state::lc_00_w));
m_lc00[1](0xd000, 0xffff).rw(FUNC(apple2gs_state::lc_00_r), FUNC(apple2gs_state::lc_00_w));
m_lc00[2](0xd000, 0xffff).rom().region("maincpu", 0x39000).w(FUNC(apple2gs_state::lc_00_w));
m_lc00[3](0xd000, 0xffff).rw(FUNC(apple2gs_state::lc_00_r), FUNC(apple2gs_state::lc_00_w));
map(0x010000, 0x01bfff).rw(FUNC(apple2gs_state::bank1_0000_r), FUNC(apple2gs_state::bank1_0000_sh_w));
map(0x01c000, 0x01ffff).m(m_bank1_atc, FUNC(address_map_bank_device::amap8));
map(0x01c000, 0x01ffff).view(m_bank1_atc);
m_bank1_atc[0](0x1c000, 0x1ffff).rw(FUNC(apple2gs_state::bank1_c000_r), FUNC(apple2gs_state::bank1_c000_w));
m_bank1_atc[1](0x1c000, 0x1c07f).rw(FUNC(apple2gs_state::c000_r), FUNC(apple2gs_state::c000_w));
m_bank1_atc[1](0x1c080, 0x1c0ff).rw(FUNC(apple2gs_state::c080_r), FUNC(apple2gs_state::c080_w));
m_bank1_atc[1](0x1c100, 0x1c2ff).rw(FUNC(apple2gs_state::c100_r), FUNC(apple2gs_state::c100_w));
m_bank1_atc[1](0x1c300, 0x1c3ff).m(m_c300bank, FUNC(address_map_bank_device::amap8));
m_bank1_atc[1](0x1c400, 0x1c7ff).rw(FUNC(apple2gs_state::c400_r), FUNC(apple2gs_state::c400_w));
m_bank1_atc[1](0x1c800, 0x1cfff).rw(FUNC(apple2gs_state::c800_r), FUNC(apple2gs_state::c800_w));
m_bank1_atc[1](0x1d000, 0x1ffff).view(m_upper01);
m_upper01[0](0x1d000, 0x1ffff).view(m_lc01);
m_upper01[1](0x1d000, 0x1ffff).rw(FUNC(apple2gs_state::inh_r), FUNC(apple2gs_state::inh_w));
m_lc01[0](0x1d000, 0x1ffff).rom().region("maincpu", 0x3d000).w(FUNC(apple2gs_state::lc_01_w));
m_lc01[1](0x1d000, 0x1ffff).rw(FUNC(apple2gs_state::lc_01_r), FUNC(apple2gs_state::lc_01_w));
/* "Mega II side" - this is basically a 128K IIe on a chip that runs merrily at 1 MHz */
/* Unfortunately all I/O happens here, including new IIgs-specific stuff */
@ -4069,7 +4112,13 @@ void apple2gs_state::apple2gs_map(address_map &map)
map(0xe0c300, 0xe0c3ff).m(m_c300bank, FUNC(address_map_bank_device::amap8));
map(0xe0c400, 0xe0c7ff).rw(FUNC(apple2gs_state::c400_r), FUNC(apple2gs_state::c400_w));
map(0xe0c800, 0xe0cfff).rw(FUNC(apple2gs_state::c800_r), FUNC(apple2gs_state::c800_w));
map(0xe0d000, 0xe0ffff).m(A2GS_UPPERBANK_TAG, FUNC(address_map_bank_device::amap8));
map(0xe0d000, 0xe0ffff).view(m_upperbank);
m_upperbank[0](0xe0d000, 0xe0ffff).view(m_lcbank);
m_upperbank[1](0xe0d000, 0xe0ffff).rw(FUNC(apple2gs_state::inh_r), FUNC(apple2gs_state::inh_w));
m_lcbank[0](0xe0d000, 0xe0ffff).rom().region("maincpu", 0x3d000).w(FUNC(apple2gs_state::lc_w));
m_lcbank[1](0xe0d000, 0xe0ffff).rw(FUNC(apple2gs_state::lc_r), FUNC(apple2gs_state::lc_w));
map(0xe10000, 0xe1bfff).rw(FUNC(apple2gs_state::auxram0000_r), FUNC(apple2gs_state::auxram0000_w));
map(0xe1c000, 0xe1c07f).rw(FUNC(apple2gs_state::c000_r), FUNC(apple2gs_state::c000_w));
@ -4078,7 +4127,13 @@ void apple2gs_state::apple2gs_map(address_map &map)
map(0xe1c300, 0xe1c3ff).m(m_c300bank, FUNC(address_map_bank_device::amap8));
map(0xe1c400, 0xe1c7ff).rw(FUNC(apple2gs_state::c400_r), FUNC(apple2gs_state::c400_w));
map(0xe1c800, 0xe1cfff).rw(FUNC(apple2gs_state::c800_r), FUNC(apple2gs_state::c800_w));
map(0xe1d000, 0xe1ffff).m(m_upperaux, FUNC(address_map_bank_device::amap8));
map(0xe1d000, 0xe1ffff).view(m_upperaux);
m_upperaux[0](0xe1d000, 0xe1ffff).view(m_lcaux);
m_upperaux[1](0xe1d000, 0xe1ffff).rw(FUNC(apple2gs_state::inh_r), FUNC(apple2gs_state::inh_w));
m_lcaux[0](0xe1d000, 0xe1ffff).rom().region("maincpu", 0x3d000).w(FUNC(apple2gs_state::lc_aux_w));
m_lcaux[1](0xe1d000, 0xe1ffff).rw(FUNC(apple2gs_state::lc_aux_r), FUNC(apple2gs_state::lc_aux_w));
map(0xfc0000, 0xffffff).rom().region("maincpu", 0x00000);
}
@ -4094,126 +4149,6 @@ void apple2gs_state::c300bank_map(address_map &map)
map(0x0100, 0x01ff).r(FUNC(apple2gs_state::c300_int_r)).nopw();
}
void apple2gs_state::inhbank_map(address_map &map)
{
map(0x0000, 0x2fff).m(m_lcbank, FUNC(address_map_bank_device::amap8));
map(0x3000, 0x5fff).rw(FUNC(apple2gs_state::inh_r), FUNC(apple2gs_state::inh_w));
}
void apple2gs_state::inhaux_map(address_map &map)
{
map(0x0000, 0x2fff).m(m_lcaux, FUNC(address_map_bank_device::amap8));
map(0x3000, 0x5fff).rw(FUNC(apple2gs_state::inh_r), FUNC(apple2gs_state::inh_w));
}
void apple2gs_state::inh00_map(address_map &map)
{
map(0x0000, 0x2fff).m(m_lc00, FUNC(address_map_bank_device::amap8));
map(0x3000, 0x5fff).rw(FUNC(apple2gs_state::inh_r), FUNC(apple2gs_state::inh_w));
}
void apple2gs_state::inh01_map(address_map &map)
{
map(0x0000, 0x2fff).m(m_lc01, FUNC(address_map_bank_device::amap8));
map(0x3000, 0x5fff).rw(FUNC(apple2gs_state::inh_r), FUNC(apple2gs_state::inh_w));
}
void apple2gs_state::lcbank_map(address_map &map)
{
map(0x0000, 0x2fff).rom().region("maincpu", 0x3d000).w(FUNC(apple2gs_state::lc_w));
map(0x3000, 0x5fff).rw(FUNC(apple2gs_state::lc_r), FUNC(apple2gs_state::lc_w));
}
void apple2gs_state::lcaux_map(address_map &map)
{
map(0x0000, 0x2fff).rom().region("maincpu", 0x3d000).w(FUNC(apple2gs_state::lc_aux_w));
map(0x3000, 0x5fff).rw(FUNC(apple2gs_state::lc_aux_r), FUNC(apple2gs_state::lc_aux_w));
}
void apple2gs_state::lc00_map(address_map &map)
{
map(0x0000, 0x2fff).rom().region("maincpu", 0x3d000).w(FUNC(apple2gs_state::lc_00_w));
map(0x3000, 0x5fff).rw(FUNC(apple2gs_state::lc_00_r), FUNC(apple2gs_state::lc_00_w));
map(0x6000, 0x8fff).rom().region("maincpu", 0x39000).w(FUNC(apple2gs_state::lc_00_w));
map(0x9000, 0xbfff).rw(FUNC(apple2gs_state::lc_00_r), FUNC(apple2gs_state::lc_00_w));
}
void apple2gs_state::lc01_map(address_map &map)
{
map(0x0000, 0x2fff).rom().region("maincpu", 0x3d000).w(FUNC(apple2gs_state::lc_01_w));
map(0x3000, 0x5fff).rw(FUNC(apple2gs_state::lc_01_r), FUNC(apple2gs_state::lc_01_w));
}
void apple2gs_state::bank0_iolc_map(address_map &map)
{
map(0x0000, 0x3fff).rw(FUNC(apple2gs_state::bank0_c000_r), FUNC(apple2gs_state::bank0_c000_w));
map(0x4000, 0x407f).rw(FUNC(apple2gs_state::c000_r), FUNC(apple2gs_state::c000_w));
map(0x4080, 0x40ff).rw(FUNC(apple2gs_state::c080_r), FUNC(apple2gs_state::c080_w));
map(0x4100, 0x42ff).rw(FUNC(apple2gs_state::c100_r), FUNC(apple2gs_state::c100_w));
map(0x4300, 0x43ff).m(m_c300bank, FUNC(address_map_bank_device::amap8));
map(0x4400, 0x47ff).rw(FUNC(apple2gs_state::c400_r), FUNC(apple2gs_state::c400_w));
map(0x4800, 0x4fff).rw(FUNC(apple2gs_state::c800_r), FUNC(apple2gs_state::c800_w));
map(0x5000, 0x7fff).m(m_upper00, FUNC(address_map_bank_device::amap8));
}
void apple2gs_state::bank1_iolc_map(address_map &map)
{
map(0x0000, 0x3fff).rw(FUNC(apple2gs_state::bank1_c000_r), FUNC(apple2gs_state::bank1_c000_w));
map(0x4000, 0x407f).rw(FUNC(apple2gs_state::c000_r), FUNC(apple2gs_state::c000_w));
map(0x4080, 0x40ff).rw(FUNC(apple2gs_state::c080_r), FUNC(apple2gs_state::c080_w));
map(0x4100, 0x42ff).rw(FUNC(apple2gs_state::c100_r), FUNC(apple2gs_state::c100_w));
map(0x4300, 0x43ff).m(m_c300bank, FUNC(address_map_bank_device::amap8));
map(0x4400, 0x47ff).rw(FUNC(apple2gs_state::c400_r), FUNC(apple2gs_state::c400_w));
map(0x4800, 0x4fff).rw(FUNC(apple2gs_state::c800_r), FUNC(apple2gs_state::c800_w));
map(0x5000, 0x7fff).m(m_upper01, FUNC(address_map_bank_device::amap8));
}
void apple2gs_state::rb0000bank_map(address_map &map)
{
map(0x0000, 0x01ff).rw(FUNC(apple2gs_state::b0ram0000_r), FUNC(apple2gs_state::b0ram0000_w));
map(0x0200, 0x03ff).rw(FUNC(apple2gs_state::b1ram0000_r), FUNC(apple2gs_state::b1ram0000_w));
}
void apple2gs_state::rb0200bank_map(address_map &map)
{
map(0x0000, 0x01ff).rw(FUNC(apple2gs_state::b0ram0200_r), FUNC(apple2gs_state::b0ram0200_w)); // wr 0 rd 0
map(0x0200, 0x03ff).rw(FUNC(apple2gs_state::b1ram0200_r), FUNC(apple2gs_state::b0ram0200_w)); // wr 0 rd 1
map(0x0400, 0x05ff).rw(FUNC(apple2gs_state::b0ram0200_r), FUNC(apple2gs_state::b1ram0200_w)); // wr 1 rd 0
map(0x0600, 0x07ff).rw(FUNC(apple2gs_state::b1ram0200_r), FUNC(apple2gs_state::b1ram0200_w)); // wr 1 rd 1
}
void apple2gs_state::rb0400bank_map(address_map &map)
{
map(0x0000, 0x03ff).rw(FUNC(apple2gs_state::b0ram0400_r), FUNC(apple2gs_state::b0ram0400_w)); // wr 0 rd 0
map(0x0400, 0x07ff).rw(FUNC(apple2gs_state::b1ram0400_r), FUNC(apple2gs_state::b0ram0400_w)); // wr 0 rd 1
map(0x0800, 0x0bff).rw(FUNC(apple2gs_state::b0ram0400_r), FUNC(apple2gs_state::b1ram0400_w)); // wr 1 rd 0
map(0x0c00, 0x0fff).rw(FUNC(apple2gs_state::b1ram0400_r), FUNC(apple2gs_state::b1ram0400_w)); // wr 1 rd 1
}
void apple2gs_state::rb0800bank_map(address_map &map)
{
map(0x0000, 0x17ff).rw(FUNC(apple2gs_state::b0ram0800_r), FUNC(apple2gs_state::b0ram0800_w));
map(0x2000, 0x37ff).rw(FUNC(apple2gs_state::b1ram0800_r), FUNC(apple2gs_state::b0ram0800_w));
map(0x4000, 0x57ff).rw(FUNC(apple2gs_state::b0ram0800_r), FUNC(apple2gs_state::b1ram0800_w));
map(0x6000, 0x77ff).rw(FUNC(apple2gs_state::b1ram0800_r), FUNC(apple2gs_state::b1ram0800_w));
}
void apple2gs_state::rb2000bank_map(address_map &map)
{
map(0x0000, 0x1fff).rw(FUNC(apple2gs_state::b0ram2000_r), FUNC(apple2gs_state::b0ram2000_w));
map(0x2000, 0x3fff).rw(FUNC(apple2gs_state::b1ram2000_r), FUNC(apple2gs_state::b0ram2000_w));
map(0x4000, 0x5fff).rw(FUNC(apple2gs_state::b0ram2000_r), FUNC(apple2gs_state::b1ram2000_w));
map(0x6000, 0x7fff).rw(FUNC(apple2gs_state::b1ram2000_r), FUNC(apple2gs_state::b1ram2000_w));
}
void apple2gs_state::rb4000bank_map(address_map &map)
{
map(0x00000, 0x07fff).rw(FUNC(apple2gs_state::b0ram4000_r), FUNC(apple2gs_state::b0ram4000_w));
map(0x08000, 0x0ffff).rw(FUNC(apple2gs_state::b1ram4000_r), FUNC(apple2gs_state::b0ram4000_w));
map(0x10000, 0x17fff).rw(FUNC(apple2gs_state::b0ram4000_r), FUNC(apple2gs_state::b1ram4000_w));
map(0x18000, 0x1ffff).rw(FUNC(apple2gs_state::b1ram4000_r), FUNC(apple2gs_state::b1ram4000_w));
}
void apple2gs_state::a2gs_es5503_map(address_map &map)
{
map(0x00000, 0x0ffff).mirror(0x10000).readonly().share("docram"); // IIgs only has 64K, top bank mirrors lower bank
@ -4945,56 +4880,8 @@ void apple2gs_state::apple2gs(machine_config &config)
/* C300 banking */
ADDRESS_MAP_BANK(config, A2GS_C300_TAG).set_map(&apple2gs_state::c300bank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x100);
/* built-in language card emulation */
ADDRESS_MAP_BANK(config, A2GS_LCBANK_TAG).set_map(&apple2gs_state::lcbank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x3000);
/* aux bank language card emulation */
ADDRESS_MAP_BANK(config, A2GS_LCAUX_TAG).set_map(&apple2gs_state::lcaux_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x3000);
/* bank 00 language card emulation */
ADDRESS_MAP_BANK(config, A2GS_LC00_TAG).set_map(&apple2gs_state::lc00_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x3000);
/* bank 01 language card emulation */
ADDRESS_MAP_BANK(config, A2GS_LC01_TAG).set_map(&apple2gs_state::lc01_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x3000);
/* /INH banking */
ADDRESS_MAP_BANK(config, A2GS_UPPERBANK_TAG).set_map(&apple2gs_state::inhbank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x3000);
/* /INH banking - aux bank */
ADDRESS_MAP_BANK(config, A2GS_AUXUPPER_TAG).set_map(&apple2gs_state::inhaux_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x3000);
/* /INH banking - bank 00 */
ADDRESS_MAP_BANK(config, A2GS_00UPPER_TAG).set_map(&apple2gs_state::inh00_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x3000);
/* /INH banking - bank 01 */
ADDRESS_MAP_BANK(config, A2GS_01UPPER_TAG).set_map(&apple2gs_state::inh01_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x3000);
/* Bank 0 - I/O and LC area */
ADDRESS_MAP_BANK(config, A2GS_B0CXXX_TAG).set_map(&apple2gs_state::bank0_iolc_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
/* Bank 1 - I/O and LC area */
ADDRESS_MAP_BANK(config, A2GS_B1CXXX_TAG).set_map(&apple2gs_state::bank1_iolc_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
/* Bank 0 0000 banking */
ADDRESS_MAP_BANK(config, A2GS_B00000_TAG).set_map(&apple2gs_state::rb0000bank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x200);
/* Bank 0 0200 banking */
ADDRESS_MAP_BANK(config, A2GS_B00200_TAG).set_map(&apple2gs_state::rb0200bank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x200);
/* Bank 0 0400 banking */
ADDRESS_MAP_BANK(config, A2GS_B00400_TAG).set_map(&apple2gs_state::rb0400bank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x400);
/* Bank 0 0800 banking */
ADDRESS_MAP_BANK(config, A2GS_B00800_TAG).set_map(&apple2gs_state::rb0800bank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x2000);
/* Bank 0 2000 banking */
ADDRESS_MAP_BANK(config, A2GS_B02000_TAG).set_map(&apple2gs_state::rb2000bank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x2000);
/* Bank 0 4000 banking */
ADDRESS_MAP_BANK(config, A2GS_B04000_TAG).set_map(&apple2gs_state::rb4000bank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x8000);
/* serial */
SCC85C30(config, m_scc, A2GS_14M/2);
SCC85C30(config, m_scc, A2GS_14M / 2);
m_scc->configure_channels(3'686'400, 3'686'400, 3'686'400, 3'686'400);
m_scc->out_int_callback().set(FUNC(apple2gs_state::scc_irq_w));
m_scc->out_txda_callback().set("printer", FUNC(rs232_port_device::write_txd));