diff options
Diffstat (limited to 'src/devices/bus/bbc/tube/tube_6502.cpp')
-rw-r--r-- | src/devices/bus/bbc/tube/tube_6502.cpp | 203 |
1 files changed, 177 insertions, 26 deletions
diff --git a/src/devices/bus/bbc/tube/tube_6502.cpp b/src/devices/bus/bbc/tube/tube_6502.cpp index 5571975a9f2..8cb22337e40 100644 --- a/src/devices/bus/bbc/tube/tube_6502.cpp +++ b/src/devices/bus/bbc/tube/tube_6502.cpp @@ -6,6 +6,18 @@ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ANC01_65022ndproc.html + Acorn 6502 2nd Processor (pre-production) + Pre-production Iss.C and Iss.F boards have been seen running earlier versions + of the Tube OS. The boards are different in that they map the Tube ULA at + &FF78-&FF7F instead of the usual &FEF8-&FEFF. They also require an earlier + version of the Tube Host which can be found in NFS 3.34, the usual DNFS 1.20 + will hang at the Tube startup banner. + + Acorn Extended 6502 2nd Processor (non-commercial) + Used internally at Acorn, it extends the addressing of indexed indirect Y instructions + to address 256K RAM. Only two applications were created to make use of this, which + were turboMASM and turboBASIC. + Acorn ADC06 65C102 Co-processor http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ADC06_65C102CoPro.html @@ -23,6 +35,8 @@ //************************************************************************** DEFINE_DEVICE_TYPE(BBC_TUBE_6502, bbc_tube_6502_device, "bbc_tube_6502", "Acorn 6502 2nd Processor") +DEFINE_DEVICE_TYPE(BBC_TUBE_6502P, bbc_tube_6502p_device, "bbc_tube_6502p", "Acorn 6502 2nd Processor (pre-production)") +DEFINE_DEVICE_TYPE(BBC_TUBE_6502E, bbc_tube_6502e_device, "bbc_tube_6502e", "Acorn Extended 6502 2nd Processor") DEFINE_DEVICE_TYPE(BBC_TUBE_65C102, bbc_tube_65c102_device, "bbc_tube_65c102", "Acorn 65C102 Co-Processor") @@ -32,19 +46,38 @@ DEFINE_DEVICE_TYPE(BBC_TUBE_65C102, bbc_tube_65c102_device, "bbc_tube_65c102", void bbc_tube_6502_device::tube_6502_mem(address_map &map) { - map(0x0000, 0xffff).m(m_bankdev, FUNC(address_map_bank_device::amap8)); - map(0xfef0, 0xfeff).rw(FUNC(bbc_tube_6502_device::tube_r), FUNC(bbc_tube_6502_device::tube_w)); + map(0x0000, 0xffff).view(m_view); + // ROM enabled + m_view[0](0x0000, 0xffff).ram().share("ram"); + m_view[0](0xf000, 0xffff).rom().region("rom", 0); + // ROM disabled + m_view[1](0x0000, 0xffff).ram().share("ram"); + map(0xfef8, 0xfeff).rw(FUNC(bbc_tube_6502_device::tube_r), FUNC(bbc_tube_6502_device::tube_w)); +} + +void bbc_tube_6502p_device::tube_6502p_mem(address_map &map) +{ + map(0x0000, 0xffff).view(m_view); + // ROM enabled + m_view[0](0x0000, 0xffff).ram().share("ram"); + m_view[0](0xf000, 0xffff).rom().region("rom", 0); + // ROM disabled + m_view[1](0x0000, 0xffff).ram().share("ram"); + map(0xff78, 0xff7f).rw(FUNC(bbc_tube_6502p_device::tube_r), FUNC(bbc_tube_6502p_device::tube_w)); } -void bbc_tube_6502_device::tube_6502_bank(address_map &map) +void bbc_tube_6502e_device::tube_6502e_mem(address_map &map) { + map(0x0000, 0xffff).view(m_view); // ROM enabled - map(0x00000, 0x0ffff).ram().share("ram"); - map(0x0f000, 0x0ffff).rom().region("rom", 0); + m_view[0](0x0000, 0xffff).rw(FUNC(bbc_tube_6502e_device::ram_r), FUNC(bbc_tube_6502e_device::ram_w)); + m_view[0](0xf000, 0xffff).rom().region("rom", 0); // ROM disabled - map(0x10000, 0x1ffff).ram().share("ram"); + m_view[1](0x0000, 0xffff).rw(FUNC(bbc_tube_6502e_device::ram_r), FUNC(bbc_tube_6502e_device::ram_w)); + map(0xfef8, 0xfeff).rw(FUNC(bbc_tube_6502e_device::tube_r), FUNC(bbc_tube_6502e_device::tube_w)); } + //------------------------------------------------- // ROM( tube_6502 ) //------------------------------------------------- @@ -53,53 +86,87 @@ ROM_START( tube_6502 ) ROM_REGION(0x1000, "rom", 0) ROM_DEFAULT_BIOS("110") ROM_SYSTEM_BIOS(0, "110", "Tube 1.10") - ROMX_LOAD("6502tube.rom", 0x0000, 0x1000, CRC(98b5fe42) SHA1(338269d03cf6bfa28e09d1651c273ea53394323b), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "121", "Tube 1.21 (ReCo6502)") - ROMX_LOAD("reco6502tube.rom", 0x0000, 0x1000, CRC(75b2a466) SHA1(9ecef24de58a48c3fbe01b12888c3f6a5d24f57f), ROM_BIOS(1)) + ROMX_LOAD("6502tube_110.rom", 0x0000, 0x1000, CRC(98b5fe42) SHA1(338269d03cf6bfa28e09d1651c273ea53394323b), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "120", "Tube 1.20") // built from source, not an actual dump + ROMX_LOAD("6502tube_120.rom", 0x0000, 0x1000, CRC(50c36da5) SHA1(80e5f1c03a00cf728917242522befc17b264413f), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "121", "Tube 1.21 (ReCo6502)") + ROMX_LOAD("reco6502tube.rom", 0x0000, 0x1000, CRC(75b2a466) SHA1(9ecef24de58a48c3fbe01b12888c3f6a5d24f57f), ROM_BIOS(2)) +ROM_END + +ROM_START( tube_6502p ) + ROM_REGION(0x1000, "rom", 0) + ROM_SYSTEM_BIOS(0, "006", "Tube 0.06") // Iss.A + ROMX_LOAD("6502tube_006.rom", 0x0000, 0x1000, CRC(1f8d2f60) SHA1(dee529f502d24174186269ba7728c023133b92de), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "005", "Tube 0.05") // Iss.F + ROMX_LOAD("6502tube_005.rom", 0x0000, 0x1000, CRC(0d4cd088) SHA1(f68a74f2529e2719193f81032af298e606792ce8), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(2, "004", "Tube 0.04") + ROMX_LOAD("6502tube_004.rom", 0x0000, 0x1000, CRC(64698ffa) SHA1(b7d47ac65291a7d7bd03b6b82ee08cff291c8609), ROM_BIOS(3)) + ROM_SYSTEM_BIOS(3, "001", "Tube 0.01") // Iss.C + ROMX_LOAD("6502tube_001.rom", 0x0000, 0x1000, CRC(83bee05d) SHA1(4a00d4d3deec0ab43dc6647ac591bd71f4b24a51), ROM_BIOS(3)) +ROM_END + +ROM_START( tube_6502e ) + ROM_REGION(0x1000, "rom", 0) + ROM_DEFAULT_BIOS("120") + ROM_SYSTEM_BIOS(0, "120", "Tube 1.20") // built from source, not an actual dump + ROMX_LOAD("6502tube256_120.rom", 0x0000, 0x1000, BAD_DUMP CRC(967ee712) SHA1(ebca4bb471cd18608882668edda811ed88b4cee5), ROM_BIOS(0)) ROM_END ROM_START( tube_65c102 ) ROM_REGION(0x1000, "rom", 0) ROM_DEFAULT_BIOS("110") ROM_SYSTEM_BIOS(0, "110", "Tube 1.10") - ROMX_LOAD("65c102_boot_110.rom", 0x0000, 0x1000, CRC(ad5b70cc) SHA1(0ac9a1c70e55a79e2c81e102afae1d016af229fa), ROM_BIOS(0)) // 2201,243-02 - ROM_SYSTEM_BIOS(1, "121", "Tube 1.21 (ReCo6502)") - ROMX_LOAD("reco6502tube.rom", 0x0000, 0x1000, CRC(75b2a466) SHA1(9ecef24de58a48c3fbe01b12888c3f6a5d24f57f), ROM_BIOS(1)) + ROMX_LOAD("65c102_boot_110.rom", 0x0000, 0x1000, CRC(ad5b70cc) SHA1(0ac9a1c70e55a79e2c81e102afae1d016af229fa), ROM_BIOS(0)) // 2201,243-01 + ROM_SYSTEM_BIOS(1, "120", "Tube 1.20") + ROMX_LOAD("65c102_boot_120.rom", 0x0000, 0x1000, CRC(1462f0f7) SHA1(7dc03d3c4862159baefebf1662de7e05987ddf7b), ROM_BIOS(1)) // 2201,243-02 + ROM_SYSTEM_BIOS(2, "121", "Tube 1.21 (ReCo6502)") + ROMX_LOAD("reco6502tube.rom", 0x0000, 0x1000, CRC(75b2a466) SHA1(9ecef24de58a48c3fbe01b12888c3f6a5d24f57f), ROM_BIOS(2)) ROM_END + //------------------------------------------------- // device_add_mconfig - add device configuration //------------------------------------------------- -void bbc_tube_6502_device::add_common_devices(machine_config &config) +void bbc_tube_6502_device::device_add_mconfig(machine_config &config) { - ADDRESS_MAP_BANK(config, m_bankdev).set_map(&bbc_tube_6502_device::tube_6502_bank).set_options(ENDIANNESS_LITTLE, 8, 17, 0x10000); + M65SC02(config, m_maincpu, 12_MHz_XTAL / 4); // G65SC02 + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_tube_6502_device::tube_6502_mem); TUBE(config, m_ula); m_ula->pnmi_handler().set_inputline(m_maincpu, M65C02_NMI_LINE); m_ula->pirq_handler().set_inputline(m_maincpu, M65C02_IRQ_LINE); + m_ula->prst_handler().set(FUNC(bbc_tube_6502_device::prst_w)); - /* internal ram */ RAM(config, m_ram).set_default_size("64K").set_default_value(0); - /* software lists */ SOFTWARE_LIST(config, "flop_ls_6502").set_original("bbc_flop_6502"); } -void bbc_tube_6502_device::device_add_mconfig(machine_config &config) +void bbc_tube_6502p_device::device_add_mconfig(machine_config &config) { - M65C02(config, m_maincpu, 12_MHz_XTAL / 4); - m_maincpu->set_addrmap(AS_PROGRAM, &bbc_tube_6502_device::tube_6502_mem); + bbc_tube_6502_device::device_add_mconfig(config); + + M6502(config.replace(), m_maincpu, 12_MHz_XTAL / 4); // SY6502C + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_tube_6502p_device::tube_6502p_mem); +} + +void bbc_tube_6502e_device::device_add_mconfig(machine_config &config) +{ + bbc_tube_6502_device::device_add_mconfig(config); + + M65SC02(config.replace(), m_maincpu, 12_MHz_XTAL / 4); // G65SC02 + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_tube_6502e_device::tube_6502e_mem); - add_common_devices(config); + m_ram->set_default_size("256K").set_default_value(0); } void bbc_tube_65c102_device::device_add_mconfig(machine_config &config) { - M65C02(config, m_maincpu, 16_MHz_XTAL / 4); - m_maincpu->set_addrmap(AS_PROGRAM, &bbc_tube_65c102_device::tube_6502_mem); + bbc_tube_6502_device::device_add_mconfig(config); - add_common_devices(config); + R65C02(config.replace(), m_maincpu, 16_MHz_XTAL / 4); // R65C102 + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_tube_65c102_device::tube_6502_mem); } //------------------------------------------------- @@ -111,6 +178,16 @@ const tiny_rom_entry *bbc_tube_6502_device::device_rom_region() const return ROM_NAME( tube_6502 ); } +const tiny_rom_entry *bbc_tube_6502p_device::device_rom_region() const +{ + return ROM_NAME( tube_6502p ); +} + +const tiny_rom_entry *bbc_tube_6502e_device::device_rom_region() const +{ + return ROM_NAME( tube_6502e ); +} + const tiny_rom_entry *bbc_tube_65c102_device::device_rom_region() const { return ROM_NAME( tube_65c102 ); @@ -128,7 +205,7 @@ bbc_tube_6502_device::bbc_tube_6502_device(const machine_config &mconfig, device : device_t(mconfig, type, tag, owner, clock) , device_bbc_tube_interface(mconfig, *this) , m_maincpu(*this, "maincpu") - , m_bankdev(*this, "bankdev") + , m_view(*this, "view") , m_ula(*this, "ula") , m_ram(*this, "ram") , m_rom(*this, "rom") @@ -140,6 +217,19 @@ bbc_tube_6502_device::bbc_tube_6502_device(const machine_config &mconfig, const { } +bbc_tube_6502p_device::bbc_tube_6502p_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : bbc_tube_6502_device(mconfig, BBC_TUBE_6502P, tag, owner, clock) +{ +} + +bbc_tube_6502e_device::bbc_tube_6502e_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : bbc_tube_6502_device(mconfig, BBC_TUBE_6502E, tag, owner, clock) + , m_opcode_ind_y(false) + , m_page(0) + , m_cycles(0) +{ +} + bbc_tube_65c102_device::bbc_tube_65c102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : bbc_tube_6502_device(mconfig, BBC_TUBE_65C102, tag, owner, clock) { @@ -153,13 +243,20 @@ void bbc_tube_6502_device::device_start() { } +void bbc_tube_6502e_device::device_start() +{ + save_item(NAME(m_opcode_ind_y)); + save_item(NAME(m_page)); + save_item(NAME(m_cycles)); +} + //------------------------------------------------- // device_reset - device-specific reset //------------------------------------------------- void bbc_tube_6502_device::device_reset() { - m_bankdev->set_bank(0); + m_view.select(0); } @@ -167,6 +264,13 @@ void bbc_tube_6502_device::device_reset() // IMPLEMENTATION //************************************************************************** +void bbc_tube_6502_device::prst_w(int state) +{ + device_reset(); + + m_maincpu->set_input_line(INPUT_LINE_RESET, state); +} + uint8_t bbc_tube_6502_device::host_r(offs_t offset) { return m_ula->host_r(offset); @@ -182,7 +286,7 @@ uint8_t bbc_tube_6502_device::tube_r(offs_t offset) { // Disable ROM on first access if (!machine().side_effects_disabled()) - m_bankdev->set_bank(1); + m_view.select(1); return m_ula->parasite_r(offset); } @@ -191,3 +295,50 @@ void bbc_tube_6502_device::tube_w(offs_t offset, uint8_t data) { m_ula->parasite_w(offset, data); } + + +uint8_t bbc_tube_6502e_device::ram_r(offs_t offset) +{ + uint8_t data = m_ram->pointer()[offset]; + + if (!machine().side_effects_disabled()) + { + /* opcode fetch */ + if (m_maincpu->get_sync()) + { + /* indexed indirect Y addressing */ + m_opcode_ind_y = ((data & 0x1f) == 0x11 || (data & 0x1f) == 0x12) ? true : false; + + m_cycles = m_maincpu->total_cycles(); + } + + if (m_opcode_ind_y) + { + if (m_maincpu->total_cycles() - m_cycles == 1) + { + /* fetch extra byte from &3xx where xx is low byte of ZP address */ + m_page = m_ram->pointer()[0x301 + data] & 0x03; + } + else if (m_maincpu->total_cycles() - m_cycles > 3) + { + /* read data from extended address */ + data = m_ram->pointer()[m_page << 16 | offset]; + } + } + } + + return data; +} + +void bbc_tube_6502e_device::ram_w(offs_t offset, uint8_t data) +{ + if (m_opcode_ind_y) + { + /* write data to extended address */ + m_ram->pointer()[m_page << 16 | offset] = data; + } + else + { + m_ram->pointer()[offset] = data; + } +} |