Merge pull request #5487 from shattered/_f28f19e6fc

rt1715w: decode memory map a bit more (nw)
This commit is contained in:
R. Belmont 2019-08-15 16:14:05 -04:00 committed by GitHub
commit 4e267c5702
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -9,7 +9,8 @@
Notes: Notes:
- keyboard connected to sio channel a - keyboard connected to sio channel a
- sio channel a clock output connected to ctc trigger 0 - sio channel a clock output connected to ctc trigger 0
- rt1715w: SCP3 boot crashes in z80dma (Unknown base register XX) - memory map not 100% clear
- rt1715w: SCP3 boot loops while executing PROFILE.SUB
Docs: Docs:
- http://www.robotrontechnik.de/html/computer/pc1715w.htm - http://www.robotrontechnik.de/html/computer/pc1715w.htm
@ -88,6 +89,7 @@ private:
void rt1715w_io(address_map &map); void rt1715w_io(address_map &map);
void rt1715_mem(address_map &map); void rt1715_mem(address_map &map);
void rt1715w_mem(address_map &map); void rt1715w_mem(address_map &map);
void rt1715w_m1(address_map &map);
void rt1715w_banked_mem(address_map &map); void rt1715w_banked_mem(address_map &map);
DECLARE_MACHINE_START(rt1715); DECLARE_MACHINE_START(rt1715);
@ -97,7 +99,7 @@ private:
required_device<z80_device> m_maincpu; required_device<z80_device> m_maincpu;
required_device<ram_device> m_ram; required_device<ram_device> m_ram;
optional_device_array<address_map_bank_device, 2> m_bankdev; optional_device_array<address_map_bank_device, 3> m_bankdev;
required_device<z80sio_device> m_sio0; required_device<z80sio_device> m_sio0;
required_device<z80ctc_device> m_ctc0; required_device<z80ctc_device> m_ctc0;
optional_device<i8272a_device> m_fdc; optional_device<i8272a_device> m_fdc;
@ -114,6 +116,7 @@ private:
int m_led2_val; int m_led2_val;
u8 m_krfd; u8 m_krfd;
uint16_t m_dma_adr; uint16_t m_dma_adr;
int m_r, m_w;
}; };
@ -226,12 +229,15 @@ MACHINE_START_MEMBER(rt1715_state, rt1715w)
MACHINE_RESET_MEMBER(rt1715_state, rt1715w) MACHINE_RESET_MEMBER(rt1715_state, rt1715w)
{ {
m_bankdev[0]->set_bank(0);
m_bankdev[1]->set_bank(0);
m_dma->rdy_w(1); m_dma->rdy_w(1);
m_krfd = 0; m_krfd = 0;
m_dma_adr = 0; m_dma_adr = 0;
m_r = 0;
m_w = 0;
m_bankdev[0]->set_bank(m_r);
m_bankdev[1]->set_bank(m_w);
m_bankdev[2]->set_bank(m_r);
} }
/* /*
@ -249,22 +255,53 @@ WRITE8_MEMBER(rt1715_state::rt1715w_set_bank)
int r = data >> 4; int r = data >> 4;
int w = data & 15; int w = data & 15;
logerror("%s: rt1715w_set_bank target %x source %x%s\n", machine().describe_context(), r, w, r == w ? "" : " DIFF"); logerror("%s: rt1715w_set_bank target %x source %x%s\n", machine().describe_context(), w, r, r == w ? "" : " DIFF");
m_bankdev[0]->set_bank(r); m_bankdev[0]->set_bank(r);
m_bankdev[1]->set_bank(w); m_bankdev[1]->set_bank(w);
if (r < 2) m_bankdev[2]->set_bank(r);
m_r = r;
m_w = w;
} }
READ8_MEMBER(rt1715_state::memory_read_byte) READ8_MEMBER(rt1715_state::memory_read_byte)
{ {
address_space &prog_space = m_maincpu->space(AS_PROGRAM); uint8_t data = 0;
return prog_space.read_byte(offset);
switch (m_r)
{
case 0:
data = m_maincpu->space(AS_PROGRAM).read_byte(offset);
break;
case 1:
data = m_ram->pointer()[offset];
break;
case 2: case 3: case 4: case 5:
data = m_ram->pointer()[offset + (m_r - 2) * 0x10000];
break;
}
return data;
} }
WRITE8_MEMBER(rt1715_state::memory_write_byte) WRITE8_MEMBER(rt1715_state::memory_write_byte)
{ {
address_space &prog_space = m_maincpu->space(AS_PROGRAM); switch (m_w)
prog_space.write_byte(offset, data); {
case 0:
m_maincpu->space(AS_PROGRAM).write_byte(offset, data);
break;
case 1:
m_ram->pointer()[offset] = data;
break;
case 2: case 3: case 4: case 5:
m_ram->pointer()[offset + (m_w - 2) * 0x10000] = data;
break;
}
} }
READ8_MEMBER(rt1715_state::io_read_byte) READ8_MEMBER(rt1715_state::io_read_byte)
@ -282,7 +319,7 @@ WRITE8_MEMBER(rt1715_state::io_write_byte)
WRITE_LINE_MEMBER(rt1715_state::busreq_w) WRITE_LINE_MEMBER(rt1715_state::busreq_w)
{ {
// since our Z80 has no support for BUSACK, we assume it is granted immediately // since our Z80 has no support for BUSACK, we assume it is granted immediately
m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, state); m_maincpu->set_input_line(INPUT_LINE_HALT, state);
m_dma->bai_w(state); // tell dma that bus has been granted m_dma->bai_w(state); // tell dma that bus has been granted
} }
@ -387,13 +424,21 @@ void rt1715_state::rt1715w_mem(address_map &map)
map(0x0000, 0xffff).r(m_bankdev[0], FUNC(address_map_bank_device::read8)).w(m_bankdev[1], FUNC(address_map_bank_device::write8)); map(0x0000, 0xffff).r(m_bankdev[0], FUNC(address_map_bank_device::read8)).w(m_bankdev[1], FUNC(address_map_bank_device::write8));
} }
void rt1715_state::rt1715w_m1(address_map &map)
{
map(0x0000, 0xffff).r(m_bankdev[2], FUNC(address_map_bank_device::read8)).w(m_bankdev[2], FUNC(address_map_bank_device::write8));
}
void rt1715_state::rt1715w_banked_mem(address_map &map) void rt1715_state::rt1715w_banked_mem(address_map &map)
{ {
// map 0
map(0x00000, 0x007ff).rom().region("ipl", 0); map(0x00000, 0x007ff).rom().region("ipl", 0);
map(0x02000, 0x02fff).ram().region("gfx", 0); map(0x02000, 0x02fff).ram().region("gfx", 0);
map(0x03000, 0x03fff).ram().share("videoram"); map(0x03000, 0x03fff).ram().share("videoram");
map(0x04000, 0x0ffff).bankrw("bank2"); map(0x04000, 0x0ffff).bankrw("bank2");
map(0x10000, 0x4ffff).bankrw("bank3"); // maps 1-5
map(0x10000, 0x1ffff).bankrw("bank3");
map(0x20000, 0x5ffff).bankrw("bank3");
} }
// rt1715w -- decoders A13, A14, page C // rt1715w -- decoders A13, A14, page C
@ -436,9 +481,9 @@ void rt1715_state::k7658_io(address_map &map)
static INPUT_PORTS_START( rt1715w ) static INPUT_PORTS_START( rt1715w )
PORT_START("S8") PORT_START("S8")
PORT_DIPNAME( 0x01, 0x01, "UNK0" ) PORT_DIPNAME( 0x01, 0x01, "Floppy drive type" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, "5.25\"-FD" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x00, "8\"-FD" )
PORT_DIPNAME( 0x02, 0x02, "UNK1" ) PORT_DIPNAME( 0x02, 0x02, "UNK1" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@ -581,12 +626,13 @@ void rt1715_state::rt1715w(machine_config &config)
rt1715(config); rt1715(config);
m_maincpu->set_clock(15.9744_MHz_XTAL / 4); m_maincpu->set_clock(15.9744_MHz_XTAL / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &rt1715_state::rt1715w_mem); m_maincpu->set_addrmap(AS_PROGRAM, &rt1715_state::rt1715w_m1);
m_maincpu->set_addrmap(AS_IO, &rt1715_state::rt1715w_io); m_maincpu->set_addrmap(AS_IO, &rt1715_state::rt1715w_io);
m_maincpu->set_daisy_config(rt1715w_daisy_chain); m_maincpu->set_daisy_config(rt1715w_daisy_chain);
ADDRESS_MAP_BANK(config, "bankdev0").set_map(&rt1715_state::rt1715w_banked_mem).set_options(ENDIANNESS_BIG, 8, 19, 0x10000); ADDRESS_MAP_BANK(config, "bankdev0").set_map(&rt1715_state::rt1715w_banked_mem).set_options(ENDIANNESS_BIG, 8, 19, 0x10000);
ADDRESS_MAP_BANK(config, "bankdev1").set_map(&rt1715_state::rt1715w_banked_mem).set_options(ENDIANNESS_BIG, 8, 19, 0x10000); ADDRESS_MAP_BANK(config, "bankdev1").set_map(&rt1715_state::rt1715w_banked_mem).set_options(ENDIANNESS_BIG, 8, 19, 0x10000);
ADDRESS_MAP_BANK(config, "bankdev2").set_map(&rt1715_state::rt1715w_banked_mem).set_options(ENDIANNESS_BIG, 8, 19, 0x10000);
MCFG_MACHINE_START_OVERRIDE(rt1715_state, rt1715w) MCFG_MACHINE_START_OVERRIDE(rt1715_state, rt1715w)
MCFG_MACHINE_RESET_OVERRIDE(rt1715_state, rt1715w) MCFG_MACHINE_RESET_OVERRIDE(rt1715_state, rt1715w)