diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index 6b03fc9468d..b69f860f813 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -3746,6 +3746,13 @@ end --@src/devices/cpu/vax/vax.h,CPUS["VAX"] = true -------------------------------------------------- +if CPUS["VAX"] then + files { + MAME_DIR .. "src/devices/cpu/vax/vax.cpp", + MAME_DIR .. "src/devices/cpu/vax/vax.h", + } +end + if opt_tool(CPUS, "VAX") then table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/vax/vaxdasm.cpp") table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/vax/vaxdasm.h") diff --git a/src/devices/cpu/vax/vax.cpp b/src/devices/cpu/vax/vax.cpp new file mode 100644 index 00000000000..b2930a55021 --- /dev/null +++ b/src/devices/cpu/vax/vax.cpp @@ -0,0 +1,100 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/*************************************************************************** + + DEC VAX CPUs + + Currently these devices are just stubs with no actual execution core. + +***************************************************************************/ + +#include "emu.h" +#include "vax.h" +#include "vaxdasm.h" + +// device type definitions +DEFINE_DEVICE_TYPE(KD32A, kd32a_device, "kd32a", "DEC KD32-A MicroVAX I CPU") +DEFINE_DEVICE_TYPE(DC333, dc333_device, "dc333", "DEC DC333 MicroVAX II CPU") +DEFINE_DEVICE_TYPE(DC341, dc341_device, "dc341", "DEC DC341 CVAX CPU") + + +vax_cpu_device::vax_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int addrwidth) + : cpu_device(mconfig, type, tag, owner, clock) + , m_program_config("program", ENDIANNESS_LITTLE, 32, addrwidth, 0, 32, 9) + , m_psl(0) + , m_icount(0) +{ +} + +kd32a_device::kd32a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : vax_cpu_device(mconfig, KD32A, tag, owner, clock, 30) +{ +} + +dc333_device::dc333_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : vax_cpu_device(mconfig, DC333, tag, owner, clock, 32) +{ +} + +dc341_device::dc341_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : vax_cpu_device(mconfig, DC341, tag, owner, clock, 32) +{ +} + +std::unique_ptr vax_cpu_device::create_disassembler() +{ + return std::make_unique(); +} + +device_memory_interface::space_config_vector vax_cpu_device::memory_space_config() const +{ + return space_config_vector { + std::make_pair(AS_PROGRAM, &m_program_config), + }; +} + + +void vax_cpu_device::device_start() +{ + address_space &space = this->space(AS_PROGRAM); + space.specific(m_program_space); + space.cache(m_cache); + + std::fill_n(&m_gpr[0], 16, 0); + + set_icountptr(m_icount); + + state_add(STATE_GENPC, "GENPC", m_gpr[15]).noshow(); + state_add(STATE_GENPCBASE, "CURPC", m_gpr[15]).noshow(); + for (int i = 0; i < 12; i++) + state_add(VAX_R0 + i, util::string_format("R%d", i).c_str(), m_gpr[i]); + state_add(VAX_AP, "AP", m_gpr[12]); + state_add(VAX_FP, "FP", m_gpr[13]); + state_add(VAX_SP, "SP", m_gpr[14]); + state_add(VAX_PC, "PC", m_gpr[15]); + state_add(VAX_PSL, "PSL", m_psl); + + save_item(NAME(m_gpr)); + save_item(NAME(m_psl)); +} + +void vax_cpu_device::device_reset() +{ + m_gpr[15] = 0; + m_psl = 0x041f0000; +} + +void dc341_device::device_reset() +{ + vax_cpu_device::device_reset(); + + m_gpr[15] = 0x20040000; // 0x20060000 in run mode +} + + +void vax_cpu_device::execute_run() +{ + debugger_instruction_hook(m_gpr[15]); + + m_icount = 0; +} diff --git a/src/devices/cpu/vax/vax.h b/src/devices/cpu/vax/vax.h new file mode 100644 index 00000000000..1d2745e97fa --- /dev/null +++ b/src/devices/cpu/vax/vax.h @@ -0,0 +1,82 @@ +// license:BSD-3-Clause +// copyright-holders:AJR + +#ifndef MAME_CPU_VAX_VAX_H +#define MAME_CPU_VAX_VAX_H + +#pragma once + + +class vax_cpu_device : public cpu_device +{ +public: + enum + { + VAX_R0, VAX_R1, VAX_R2, VAX_R3, + VAX_R4, VAX_R5, VAX_R6, VAX_R7, + VAX_R8, VAX_R9, VAX_R10, VAX_R11, + VAX_AP, VAX_FP, VAX_SP, VAX_PC, + VAX_PSL + }; + +protected: + // construction/destruction + vax_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int addrwidth); + + // device-level overrides + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + + // device_disasm_interface overrides + virtual std::unique_ptr create_disassembler() override; + + // device_execute_interface overrides + virtual void execute_run() override; + + // device_memory_interface overrides + virtual space_config_vector memory_space_config() const override; + + // address space + address_space_config m_program_config; + memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_program_space; + memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_cache; + + // internal state + u32 m_gpr[16]; + u32 m_psl; + + // execution sequencing + s32 m_icount; +}; + +class kd32a_device : public vax_cpu_device +{ +public: + // construction/destruction + kd32a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class dc333_device : public vax_cpu_device +{ +public: + // construction/destruction + dc333_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class dc341_device : public vax_cpu_device +{ +public: + // construction/destruction + dc341_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // device-level overrides + virtual void device_reset() override ATTR_COLD; +}; + + +// device type declarations +DECLARE_DEVICE_TYPE(KD32A, kd32a_device) +DECLARE_DEVICE_TYPE(DC333, dc333_device) +DECLARE_DEVICE_TYPE(DC341, dc341_device) + +#endif // MAME_CPU_VAX_VAX_H diff --git a/src/mame/dec/uvax1.cpp b/src/mame/dec/uvax1.cpp new file mode 100644 index 00000000000..a801e27e83a --- /dev/null +++ b/src/mame/dec/uvax1.cpp @@ -0,0 +1,88 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/******************************************************************************* + + Skeleton driver for DEC MicroVAX I ("Seahorse"). + + The MicroVAX I processor occupies two interconnected PCBs: the M7135 data + path module (DAP) and the M7136 memory controller (MCT). The LSI data path + chip, developed by DEC in conjunction with Silicon Compilers, Inc., is not + really a single-chip VAX CPU, since it relies on a PROM microcode store and + numerous PLDs and support logic ICs. Though the memory controller module + contains TLB/cache SRAMs and a few register files, main memory is provided + separately on the 16-bit Q22 bus in the form of MSV11-P modules. + + There were two versions of the processor: one supporting only F_floating + and D_floating types, the other supporting only F_floating and G_floating. + + Q-bus I/O options used in the MicroVAX I include DLVJ1, DZV11, DEQNA and + RQDX1. + +*******************************************************************************/ + +#include "emu.h" + +//#include "bus/qbus/qbus.h" +#include "cpu/vax/vax.h" +#include "machine/scn_pci.h" + +namespace { + +class uvax1_state : public driver_device +{ +public: + uvax1_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { + } + + void uvax1(machine_config &config) ATTR_COLD; + +private: + void mem_map(address_map &map) ATTR_COLD; + + required_device m_maincpu; +}; + +void uvax1_state::mem_map(address_map &map) +{ + map(0x00000000, 0x00001fff).rom().region("bootrom", 0); +} + +static INPUT_PORTS_START(uvax1) +INPUT_PORTS_END + +void uvax1_state::uvax1(machine_config &config) +{ + KD32A(config, m_maincpu, 64_MHz_XTAL / 16); // cycle time is 250 ns + m_maincpu->set_addrmap(AS_PROGRAM, &uvax1_state::mem_map); + + SCN2661C(config, "conuart", 5.0688_MHz_XTAL); +} + +ROM_START(uvax1) + ROM_REGION32_LE(0x2000, "bootrom", 0) + ROM_LOAD("m7135_microvax_i_e78_2764.bin", 0x0000, 0x2000, CRC(8c6f01f0) SHA1(c3effa180faa7767b267b047d724871592466788)) + + ROM_REGION64_LE(0x10000, "dap_proms", ROMREGION_ERASE00) // MB7144H or equivalent + ROM_LOAD64_BYTE("dap0.bin", 0x0000, 0x2000, NO_DUMP) + ROM_LOAD64_BYTE("dap1.bin", 0x0001, 0x2000, NO_DUMP) + ROM_LOAD64_BYTE("dap2.bin", 0x0002, 0x2000, NO_DUMP) + ROM_LOAD64_BYTE("dap3.bin", 0x0003, 0x2000, NO_DUMP) + ROM_LOAD64_BYTE("dap4.bin", 0x0004, 0x2000, NO_DUMP) + + ROM_REGION64_LE(0x2000, "mct_proms", 0) // Am27S35DC + ROM_LOAD64_BYTE("mct0.bin", 0x0000, 0x0400, NO_DUMP) + ROM_LOAD64_BYTE("mct1.bin", 0x0001, 0x0400, NO_DUMP) + ROM_LOAD64_BYTE("mct2.bin", 0x0002, 0x0400, NO_DUMP) + ROM_LOAD64_BYTE("mct3.bin", 0x0003, 0x0400, NO_DUMP) + ROM_LOAD64_BYTE("mct4.bin", 0x0004, 0x0400, NO_DUMP) + ROM_LOAD64_BYTE("mct5.bin", 0x0005, 0x0400, NO_DUMP) + ROM_LOAD64_BYTE("mct6.bin", 0x0006, 0x0400, NO_DUMP) + ROM_LOAD64_BYTE("mct7.bin", 0x0007, 0x0400, NO_DUMP) +ROM_END + +} // anonymous namespace + +COMP(1984, uvax1, 0, 0, uvax1, uvax1, uvax1_state, empty_init, "Digital Equipment Corporation", "MicroVAX I", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW) diff --git a/src/mame/dec/uvax2.cpp b/src/mame/dec/uvax2.cpp new file mode 100644 index 00000000000..1714f59b3ac --- /dev/null +++ b/src/mame/dec/uvax2.cpp @@ -0,0 +1,65 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/******************************************************************************* + + Skeleton driver for DEC MicroVAX II ("Mayflower"). + +*******************************************************************************/ + +#include "emu.h" + +//#include "bus/qbus/qbus.h" +#include "cpu/vax/vax.h" +//#include "machine/dc319.h" +#include "machine/mc146818.h" + +namespace { + +class uvax2_state : public driver_device +{ +public: + uvax2_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { + } + + void uvax2(machine_config &config) ATTR_COLD; + +private: + void mem_map(address_map &map) ATTR_COLD; + + required_device m_maincpu; +}; + +void uvax2_state::mem_map(address_map &map) +{ + map(0x00000000, 0x0000ffff).rom().region("bootrom", 0); +} + +static INPUT_PORTS_START(uvax2) +INPUT_PORTS_END + +void uvax2_state::uvax2(machine_config &config) +{ + DC333(config, m_maincpu, 40_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &uvax2_state::mem_map); + + //DC319(config, "dlart", 614.4_MHz_XTAL); + + MC146818(config, "toyclock", 32.768_kHz_XTAL); +} + +ROM_START(uvax2) + ROM_REGION32_LE(0x10000, "bootrom", 0) + ROM_SYSTEM_BIOS(0, "ef", "Rev. EF") // Rev. AF is identical? + ROMX_LOAD("m7606_a1_rev_ef_lm8725_110e6_am27256.bin", 0x0000, 0x8000, CRC(b44e8cab) SHA1(8b74031231248241109b78baa4819659533e1312), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("m7606_a1_rev_ef_lm8729_111e6_am27256.bin", 0x0001, 0x8000, CRC(44ebb04d) SHA1(031c271ead78cae4c3dfc1125b0ab515843e1911), ROM_SKIP(1) | ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "ah", "Rev. AH") + ROMX_LOAD("m7606_ah_062_110e6_d27256.bin", 0x0000, 0x8000, CRC(653646fa) SHA1(1f900fe5e998d0f8ed4ae63557f1e63c839991c0), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("m7606_ah_062_111e6_d27256.bin", 0x0001, 0x8000, CRC(725dc43e) SHA1(630a908f7d630a33099ae9c3c3c08df478de941c), ROM_SKIP(1) | ROM_BIOS(1)) +ROM_END + +} // anonymous namespace + +COMP(1984, uvax2, 0, 0, uvax2, uvax2, uvax2_state, empty_init, "Digital Equipment Corporation", "MicroVAX II", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW) diff --git a/src/mame/dec/uvax3.cpp b/src/mame/dec/uvax3.cpp new file mode 100644 index 00000000000..d296a4b093c --- /dev/null +++ b/src/mame/dec/uvax3.cpp @@ -0,0 +1,66 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/******************************************************************************* + + Skeleton driver for DEC third-generation MicroVAX models ("Mayfair"). + +*******************************************************************************/ + +#include "emu.h" + +//#include "bus/dssi/dssi.h" +//#include "bus/qbus/qbus.h" +#include "cpu/vax/vax.h" +//#include "machine/am79c90.h" + +namespace { + +class uvax3_state : public driver_device +{ +public: + uvax3_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { + } + + void mv3400(machine_config &config) ATTR_COLD; + +private: + void mem_map(address_map &map) ATTR_COLD; + + required_device m_maincpu; +}; + +void uvax3_state::mem_map(address_map &map) +{ + map(0x20040000, 0x2005ffff).mirror(0x20000).rom().region("firmware", 0); +} + +static INPUT_PORTS_START(mv3400) +INPUT_PORTS_END + +void uvax3_state::mv3400(machine_config &config) +{ + DC341(config, m_maincpu, 40_MHz_XTAL / 2); + m_maincpu->set_addrmap(AS_PROGRAM, &uvax3_state::mem_map); + + //AM7990(config, "lance", ?); +} + +ROM_START(mv3400) + ROM_REGION32_LE(0x20000, "firmware", 0) + ROM_LOAD16_BYTE("m7624_dec88_lm8914_152e7_d27512.bin", 0x00000, 0x10000, CRC(eb61f8d0) SHA1(17d56f59120881df2b6522097998b4a9e4bac77e)) + ROM_LOAD16_BYTE("m7624_dec88_lm8914_153e7_d27512.bin", 0x00001, 0x10000, CRC(6727bff2) SHA1(4f566e82a8fa8490056d62b3e44c070ba5ab1754)) +ROM_END + +ROM_START(mv3500) + ROM_REGION32_LE(0x20000, "firmware", 0) + ROM_LOAD16_BYTE("ka650-a-v5.3-vmb2.7_192e7.bin", 0x00000, 0x10000, CRC(a3ec59a6) SHA1(6d0121d7e232c841484a328340c828a4f0fdf903)) + ROM_LOAD16_BYTE("ka650-a-v5.3-vmb2.7_193e7.bin", 0x00001, 0x10000, CRC(873ee8bd) SHA1(b0abfebda60e9394e1045644634a8845b5573d04)) +ROM_END + +} // anonymous namespace + +COMP(1988, mv3400, 0, 0, mv3400, mv3400, uvax3_state, empty_init, "Digital Equipment Corporation", "MicroVAX 3400", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW) +COMP(1988, mv3500, 0, 0, mv3400, mv3400, uvax3_state, empty_init, "Digital Equipment Corporation", "MicroVAX 3500", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index d5783fdc68d..3b5b3d34629 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -17488,6 +17488,16 @@ rainbow rainbow100a rainbow190 +@source:dec/uvax1.cpp +uvax1 + +@source:dec/uvax2.cpp +uvax2 + +@source:dec/uvax3.cpp +mv3400 +mv3500 + @source:dec/vax11.cpp vax785