From a5bec0491f188fdb0b9e2be0f7dbbbfde23cc8bc Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Sat, 29 Sep 2018 02:17:17 +0200 Subject: [PATCH] -sun4c: Added savestate support. [Ryan Holtz] -sun4c: SPARCstation IPX, SLC, 1+ and 2 now boot, but get angry to varying degrees for varying reasons. [Ryan Holtz] --- src/devices/bus/sbus/bwtwo.cpp | 2 +- src/devices/bus/sbus/cgsix.cpp | 122 +++++++++++++++++++++++++ src/devices/bus/sbus/cgsix.h | 4 +- src/devices/bus/sbus/cgthree.cpp | 1 + src/devices/bus/sbus/sbus.h | 4 +- src/devices/cpu/sparc/mb86901.cpp | 31 +++++++ src/devices/cpu/sparc/sparc.h | 1 + src/devices/machine/sun4c_mmu.cpp | 31 +++++++ src/devices/machine/sun4c_mmu.h | 7 +- src/mame/drivers/sun4.cpp | 147 ++++++++++++++++++++++-------- 10 files changed, 303 insertions(+), 47 deletions(-) diff --git a/src/devices/bus/sbus/bwtwo.cpp b/src/devices/bus/sbus/bwtwo.cpp index e287848675e..65f40df715c 100644 --- a/src/devices/bus/sbus/bwtwo.cpp +++ b/src/devices/bus/sbus/bwtwo.cpp @@ -47,7 +47,6 @@ sbus_bwtwo_device::sbus_bwtwo_device(const machine_config &mconfig, const char * : device_t(mconfig, SBUS_BWTWO, tag, owner, clock) , device_sbus_card_interface(mconfig, *this) , m_rom(*this, "prom") - //, m_vram(*this, "vram") , m_screen(*this, "screen") { } @@ -55,6 +54,7 @@ sbus_bwtwo_device::sbus_bwtwo_device(const machine_config &mconfig, const char * void sbus_bwtwo_device::device_start() { m_vram = std::make_unique(0x100000); + save_pointer(NAME(m_vram), 0x100000); for (int i = 0; i < 0x100; i++) { diff --git a/src/devices/bus/sbus/cgsix.cpp b/src/devices/bus/sbus/cgsix.cpp index e27437601f6..982aa091349 100644 --- a/src/devices/bus/sbus/cgsix.cpp +++ b/src/devices/bus/sbus/cgsix.cpp @@ -36,6 +36,128 @@ sbus_cgsix_device::sbus_cgsix_device(const machine_config &mconfig, device_type void sbus_cgsix_device::device_start() { m_vram = std::make_unique(m_vram_size / 4); + + save_pointer(NAME(m_vram), m_vram_size / 4); + save_item(NAME(m_vram_size)); + + save_item(NAME(m_fbc.m_clip_check)); + save_item(NAME(m_fbc.m_status)); + save_item(NAME(m_fbc.m_draw_status)); + save_item(NAME(m_fbc.m_blit_status)); + save_item(NAME(m_fbc.m_font)); + + save_item(NAME(m_fbc.m_x0)); + save_item(NAME(m_fbc.m_y0)); + save_item(NAME(m_fbc.m_z0)); + save_item(NAME(m_fbc.m_color0)); + save_item(NAME(m_fbc.m_x1)); + save_item(NAME(m_fbc.m_y1)); + save_item(NAME(m_fbc.m_z1)); + save_item(NAME(m_fbc.m_color1)); + save_item(NAME(m_fbc.m_x2)); + save_item(NAME(m_fbc.m_y2)); + save_item(NAME(m_fbc.m_z2)); + save_item(NAME(m_fbc.m_color2)); + save_item(NAME(m_fbc.m_x3)); + save_item(NAME(m_fbc.m_y3)); + save_item(NAME(m_fbc.m_z3)); + save_item(NAME(m_fbc.m_color3)); + + save_item(NAME(m_fbc.m_raster_offx)); + save_item(NAME(m_fbc.m_raster_offy)); + + save_item(NAME(m_fbc.m_autoincx)); + save_item(NAME(m_fbc.m_autoincy)); + + save_item(NAME(m_fbc.m_clip_minx)); + save_item(NAME(m_fbc.m_clip_miny)); + + save_item(NAME(m_fbc.m_clip_maxx)); + save_item(NAME(m_fbc.m_clip_maxy)); + + save_item(NAME(m_fbc.m_fcolor)); + save_item(NAME(m_fbc.m_bcolor)); + + save_item(NAME(m_fbc.m_rasterop)); + + save_item(NAME(m_fbc.m_plane_mask)); + save_item(NAME(m_fbc.m_pixel_mask)); + + save_item(NAME(m_fbc.m_patt_align)); + save_item(NAME(m_fbc.m_pattern[8])); + + save_item(NAME(m_fbc.m_ipoint_absx)); + save_item(NAME(m_fbc.m_ipoint_absy)); + save_item(NAME(m_fbc.m_ipoint_absz)); + save_item(NAME(m_fbc.m_ipoint_relx)); + save_item(NAME(m_fbc.m_ipoint_rely)); + save_item(NAME(m_fbc.m_ipoint_relz)); + save_item(NAME(m_fbc.m_ipoint_r)); + save_item(NAME(m_fbc.m_ipoint_g)); + save_item(NAME(m_fbc.m_ipoint_b)); + save_item(NAME(m_fbc.m_ipoint_a)); + + save_item(NAME(m_fbc.m_iline_absx)); + save_item(NAME(m_fbc.m_iline_absy)); + save_item(NAME(m_fbc.m_iline_absz)); + save_item(NAME(m_fbc.m_iline_relx)); + save_item(NAME(m_fbc.m_iline_rely)); + save_item(NAME(m_fbc.m_iline_relz)); + save_item(NAME(m_fbc.m_iline_r)); + save_item(NAME(m_fbc.m_iline_g)); + save_item(NAME(m_fbc.m_iline_b)); + save_item(NAME(m_fbc.m_iline_a)); + + save_item(NAME(m_fbc.m_itri_absx)); + save_item(NAME(m_fbc.m_itri_absy)); + save_item(NAME(m_fbc.m_itri_absz)); + save_item(NAME(m_fbc.m_itri_relx)); + save_item(NAME(m_fbc.m_itri_rely)); + save_item(NAME(m_fbc.m_itri_relz)); + save_item(NAME(m_fbc.m_itri_r)); + save_item(NAME(m_fbc.m_itri_g)); + save_item(NAME(m_fbc.m_itri_b)); + save_item(NAME(m_fbc.m_itri_a)); + + save_item(NAME(m_fbc.m_iquad_absx)); + save_item(NAME(m_fbc.m_iquad_absy)); + save_item(NAME(m_fbc.m_iquad_absz)); + save_item(NAME(m_fbc.m_iquad_relx)); + save_item(NAME(m_fbc.m_iquad_rely)); + save_item(NAME(m_fbc.m_iquad_relz)); + save_item(NAME(m_fbc.m_iquad_r)); + save_item(NAME(m_fbc.m_iquad_g)); + save_item(NAME(m_fbc.m_iquad_b)); + save_item(NAME(m_fbc.m_iquad_a)); + + save_item(NAME(m_fbc.m_irect_absx)); + save_item(NAME(m_fbc.m_irect_absy)); + save_item(NAME(m_fbc.m_irect_absz)); + save_item(NAME(m_fbc.m_irect_relx)); + save_item(NAME(m_fbc.m_irect_rely)); + save_item(NAME(m_fbc.m_irect_relz)); + save_item(NAME(m_fbc.m_irect_r)); + save_item(NAME(m_fbc.m_irect_g)); + save_item(NAME(m_fbc.m_irect_b)); + save_item(NAME(m_fbc.m_irect_a)); + + save_item(NAME(m_fbc.m_vertex_count)); + + for (int i = 0; i < 0x1000; i++) + { + save_item(NAME(m_fbc.m_prim_buf[i].m_absx), i); + save_item(NAME(m_fbc.m_prim_buf[i].m_absy), i); + save_item(NAME(m_fbc.m_prim_buf[i].m_absz), i); + save_item(NAME(m_fbc.m_prim_buf[i].m_relx), i); + save_item(NAME(m_fbc.m_prim_buf[i].m_rely), i); + save_item(NAME(m_fbc.m_prim_buf[i].m_relz), i); + save_item(NAME(m_fbc.m_prim_buf[i].m_r), i); + save_item(NAME(m_fbc.m_prim_buf[i].m_g), i); + save_item(NAME(m_fbc.m_prim_buf[i].m_b), i); + save_item(NAME(m_fbc.m_prim_buf[i].m_a), i); + } + + save_item(NAME(m_fbc.m_curr_prim_type)); } void sbus_cgsix_device::device_reset() diff --git a/src/devices/bus/sbus/cgsix.h b/src/devices/bus/sbus/cgsix.h index 98f82fcd458..4e3302799c1 100644 --- a/src/devices/bus/sbus/cgsix.h +++ b/src/devices/bus/sbus/cgsix.h @@ -345,7 +345,7 @@ protected: uint32_t m_a; }; - enum prim_type + enum prim_type : uint32_t { PRIM_POINT = 0, PRIM_LINE, @@ -462,7 +462,7 @@ protected: vertex_t m_prim_buf[0x1000]; // unknown size uint32_t m_vertex_count; - prim_type m_curr_prim_type; + uint32_t m_curr_prim_type; }; required_memory_region m_rom; diff --git a/src/devices/bus/sbus/cgthree.cpp b/src/devices/bus/sbus/cgthree.cpp index f4582c2d862..02ddaba688f 100644 --- a/src/devices/bus/sbus/cgthree.cpp +++ b/src/devices/bus/sbus/cgthree.cpp @@ -55,6 +55,7 @@ sbus_cgthree_device::sbus_cgthree_device(const machine_config &mconfig, const ch void sbus_cgthree_device::device_start() { m_vram = std::make_unique(0x100000/4); + save_pointer(NAME(m_vram), 0x100000/4); } void sbus_cgthree_device::device_reset() diff --git a/src/devices/bus/sbus/sbus.h b/src/devices/bus/sbus/sbus.h index 30acb273213..5349c2c8e42 100644 --- a/src/devices/bus/sbus/sbus.h +++ b/src/devices/bus/sbus/sbus.h @@ -21,13 +21,13 @@ class sbus_slot_device : public device_t, public device_slot_interface public: // construction/destruction template - sbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&sbus_tag, U &&opts, const char *dflt) + sbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&sbus_tag, U &&opts, const char *dflt, bool fixed = false) : sbus_slot_device(mconfig, tag, owner, clock) { option_reset(); opts(*this); set_default_option(dflt); - set_fixed(false); + set_fixed(fixed); m_sbus.set_tag(std::forward(sbus_tag)); } sbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); diff --git a/src/devices/cpu/sparc/mb86901.cpp b/src/devices/cpu/sparc/mb86901.cpp index 8b0777d847d..2d40cb7ce97 100644 --- a/src/devices/cpu/sparc/mb86901.cpp +++ b/src/devices/cpu/sparc/mb86901.cpp @@ -343,8 +343,10 @@ void mb86901_device::device_start() save_item(NAME(m_bp_irl)); save_item(NAME(m_bp_fpu_present)); save_item(NAME(m_bp_cp_present)); + save_item(NAME(m_pb_error)); save_item(NAME(m_pb_block_ldst_byte)); save_item(NAME(m_pb_block_ldst_word)); + save_item(NAME(m_irq_state)); save_item(NAME(m_trap)); save_item(NAME(m_tt)); save_item(NAME(m_ticc_trap_type)); @@ -384,9 +386,27 @@ void mb86901_device::device_start() save_item(NAME(m_ps)); save_item(NAME(m_et)); save_item(NAME(m_cwp)); + save_item(NAME(m_alu_op3_assigned)); + save_item(NAME(m_ldst_op3_assigned)); + save_item(NAME(m_alu_setcc)); + save_item(NAME(m_privileged_asr)); + save_item(NAME(m_illegal_instruction_asr)); save_item(NAME(m_mae)); save_item(NAME(m_no_annul)); save_item(NAME(m_hold_bus)); + save_item(NAME(m_icount)); + save_item(NAME(m_stashed_icount)); + save_item(NAME(m_insn_space)); + save_item(NAME(m_data_space)); + +#if LOG_FCODES + save_item(NAME(m_ss1_next_pc)); + save_item(NAME(m_ss1_next_opcode)); + save_item(NAME(m_ss1_next_handler_base)); + save_item(NAME(m_ss1_next_entry_point)); + save_item(NAME(m_ss1_next_stack)); + save_item(NAME(m_log_fcodes)); +#endif // set our instruction counter set_icountptr(m_icount); @@ -462,6 +482,17 @@ void mb86901_device::device_reset() } +//------------------------------------------------- +// device_post_load - update register pointers +// after loading a savestate +//------------------------------------------------- + +void mb86901_device::device_post_load() +{ + update_gpr_pointers(); +} + + //------------------------------------------------- // memory_space_config - return the configuration // of the specified address space, or nullptr if diff --git a/src/devices/cpu/sparc/sparc.h b/src/devices/cpu/sparc/sparc.h index 1a3351c57fe..ff337da962c 100644 --- a/src/devices/cpu/sparc/sparc.h +++ b/src/devices/cpu/sparc/sparc.h @@ -34,6 +34,7 @@ public: virtual void device_start() override; virtual void device_reset() override; virtual void device_stop() override; + virtual void device_post_load() override; virtual void device_resolve_objects() override; // device_execute_interface overrides diff --git a/src/devices/machine/sun4c_mmu.cpp b/src/devices/machine/sun4c_mmu.cpp index eabc5c073b4..146610044cc 100644 --- a/src/devices/machine/sun4c_mmu.cpp +++ b/src/devices/machine/sun4c_mmu.cpp @@ -42,6 +42,37 @@ void sun4c_mmu_device::device_start() // allocate timer for system reset m_reset_timer = timer_alloc(TIMER_RESET); m_reset_timer->adjust(attotime::never); + + for (int i = 0; i < 16; i++) + { + save_item(NAME(m_segmap[i]), i); + save_item(NAME(m_segmap_masked[i]), i); + } + + for (int i = 0; i < 16384; i++) + { + save_item(NAME(m_pagemap[i].valid), i); + save_item(NAME(m_pagemap[i].writable), i); + save_item(NAME(m_pagemap[i].supervisor), i); + save_item(NAME(m_pagemap[i].uncached), i); + save_item(NAME(m_pagemap[i].accessed), i); + save_item(NAME(m_pagemap[i].modified), i); + save_item(NAME(m_pagemap[i].page), i); + save_item(NAME(m_pagemap[i].type), i); + } + + save_item(NAME(m_cachetags)); + save_item(NAME(m_cachedata)); + save_item(NAME(m_ram_size)); + save_item(NAME(m_ram_size_words)); + save_item(NAME(m_context)); + save_item(NAME(m_context_masked)); + save_item(NAME(m_system_enable)); + save_item(NAME(m_fetch_bootrom)); + save_item(NAME(m_buserr)); + save_item(NAME(m_page_valid)); + save_item(NAME(m_ctx_mask)); + save_item(NAME(m_pmeg_mask)); } void sun4c_mmu_device::device_reset() diff --git a/src/devices/machine/sun4c_mmu.h b/src/devices/machine/sun4c_mmu.h index b31d7fcc56c..a220f221c11 100644 --- a/src/devices/machine/sun4c_mmu.h +++ b/src/devices/machine/sun4c_mmu.h @@ -21,8 +21,8 @@ public: sun4c_mmu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, uint8_t ctx_mask, uint8_t pmeg_mask) : sun4c_mmu_device(mconfig, tag, owner, clock) { - m_ctx_mask = ctx_mask; - m_pmeg_mask = pmeg_mask; + set_ctx_mask(ctx_mask); + set_pmeg_mask(pmeg_mask); } sun4c_mmu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -35,6 +35,9 @@ public: auto type1_r() { return m_type1_r.bind(); } auto type1_w() { return m_type1_w.bind(); } + void set_ctx_mask(uint8_t ctx_mask) { m_ctx_mask = ctx_mask; } + void set_pmeg_mask(uint8_t pmeg_mask) { m_pmeg_mask = pmeg_mask; } + enum insn_data_mode { USER_INSN, diff --git a/src/mame/drivers/sun4.cpp b/src/mame/drivers/sun4.cpp index d1091525de2..4962b5d58a7 100644 --- a/src/mame/drivers/sun4.cpp +++ b/src/mame/drivers/sun4.cpp @@ -541,6 +541,7 @@ public: , m_scsibus(*this, "scsibus") , m_scsi(*this, "scsibus:7:ncr53c90a") , m_sbus(*this, "sbus") + , m_sbus_slot(*this, "slot%u", 1U) , m_type0space(*this, "type0") , m_type1space(*this, "type1") , m_ram(*this, RAM_TAG) @@ -550,14 +551,16 @@ public: } void sun4c(machine_config &config); + void sun4_20(machine_config &config); void sun4_40(machine_config &config); + void sun4_50(machine_config &config); void sun4_60(machine_config &config); + void sun4_65(machine_config &config); void sun4_75(machine_config &config); void sun4(machine_config &config); void init_sun4(); void init_sun4c(); - void init_ss2(); private: virtual void machine_reset() override; @@ -680,6 +683,7 @@ private: required_device m_scsi; optional_device m_sbus; + optional_device_array m_sbus_slot; optional_device m_type0space; optional_device m_type1space; memory_access_cache<2, 0, ENDIANNESS_BIG> *m_type1_cache; @@ -1209,6 +1213,50 @@ void sun4_state::machine_start() // allocate timer for system reset m_reset_timer = timer_alloc(TIMER_RESET); m_reset_timer->adjust(attotime::never); + + for (int i = 0; i < 16; i++) + { + save_item(NAME(m_segmap[i]), i); + save_item(NAME(m_segmap_masked[i]), i); + } + + for (int i = 0; i < 16384; i++) + { + save_item(NAME(m_pagemap[i].valid), i); + save_item(NAME(m_pagemap[i].writable), i); + save_item(NAME(m_pagemap[i].supervisor), i); + save_item(NAME(m_pagemap[i].uncached), i); + save_item(NAME(m_pagemap[i].accessed), i); + save_item(NAME(m_pagemap[i].modified), i); + save_item(NAME(m_pagemap[i].page), i); + save_item(NAME(m_pagemap[i].type), i); + } + + save_item(NAME(m_cachetags)); + save_item(NAME(m_cachedata)); + save_item(NAME(m_ram_size)); + save_item(NAME(m_ram_size_words)); + save_item(NAME(m_context)); + save_item(NAME(m_context_masked)); + save_item(NAME(m_system_enable)); + save_item(NAME(m_fetch_bootrom)); + save_item(NAME(m_buserr)); + save_item(NAME(m_page_valid)); + + save_item(NAME(m_auxio)); + save_item(NAME(m_counter)); + save_item(NAME(m_dma)); + save_item(NAME(m_dma_irq)); + save_item(NAME(m_dma_tc_read)); + save_item(NAME(m_dma_pack_register)); + save_item(NAME(m_scsi_irq)); + save_item(NAME(m_fdc_irq)); + + save_item(NAME(m_irq_reg)); + save_item(NAME(m_scc1_int)); + save_item(NAME(m_scc2_int)); + save_item(NAME(m_diag)); + save_item(NAME(m_arch)); } READ32_MEMBER( sun4_state::ram_r ) @@ -1888,11 +1936,11 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(sun4_state::sun4c) /* basic machine hardware */ - MCFG_DEVICE_ADD(m_maincpu, MB86901, 16'670'000) + MCFG_DEVICE_ADD(m_maincpu, MB86901, 20'000'000) MCFG_SPARC_ADD_ASI_DESC(sun4c_asi_desc) m_maincpu->set_addrmap(0, &sun4_state::sun4c_debugger_map); - SUN4C_MMU(config, m_mmu, 16'670'000, 7, 0x7f); + SUN4C_MMU(config, m_mmu, 20'000'000, 7, 0x7f); m_mmu->type1_r().set(m_type1space, FUNC(address_map_bank_device::read32)); m_mmu->type1_w().set(m_type1space, FUNC(address_map_bank_device::write32)); m_mmu->set_cpu(m_maincpu); @@ -1914,7 +1962,7 @@ MACHINE_CONFIG_START(sun4_state::sun4c) ADDRESS_MAP_BANK(config, m_type0space).set_map(&sun4_state::type0space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); // MMU Type 1 device space - ADDRESS_MAP_BANK(config, m_type1space).set_map(&sun4_state::type1space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); + ADDRESS_MAP_BANK(config, m_type1space).set_map(&sun4_state::type1space_sbus_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); // Ethernet AM79C90(config, m_lance, 10'000'000); // clock is a guess @@ -1956,57 +2004,81 @@ MACHINE_CONFIG_START(sun4_state::sun4c) MCFG_NSCSI_ADD("scsibus:6", sun_scsi_devices, nullptr, false) MCFG_NSCSI_ADD("scsibus:7", sun_scsi_devices, "ncr53c90a", true) MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr53c90a", [this] (device_t *device) { ncr53c90a(device); }) + + // SBus + SBUS(config, m_sbus, 20'000'000, "maincpu", "type1"); + SBUS_SLOT(config, m_sbus_slot[0], 20'000'000, m_sbus, sbus_cards, nullptr); + SBUS_SLOT(config, m_sbus_slot[1], 20'000'000, m_sbus, sbus_cards, nullptr); + SBUS_SLOT(config, m_sbus_slot[2], 20'000'000, m_sbus, sbus_cards, nullptr); MACHINE_CONFIG_END +void sun4_state::sun4_20(machine_config &config) +{ + sun4c(config); + + m_sbus_slot[0]->set_fixed(true); + m_sbus_slot[1]->set_fixed(true); + m_sbus_slot[2]->set_default_option("bwtwo"); + m_sbus_slot[2]->set_fixed(true); +} + void sun4_state::sun4_40(machine_config &config) { sun4c(config); m_mmu->set_clock(25'000'000); m_maincpu->set_clock(25'000'000); - m_maincpu->set_mmu(m_mmu); - m_type1space->set_map(&sun4_state::type1space_sbus_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); + m_sbus->set_clock(25'000'000); + m_sbus_slot[0]->set_clock(25'000'000); + m_sbus_slot[1]->set_clock(25'000'000); + m_sbus_slot[2]->set_clock(25'000'000); + m_sbus_slot[2]->set_default_option("bwtwo"); + m_sbus_slot[2]->set_fixed(true); +} - // SBus - SBUS(config, m_sbus, 25'000'000, "maincpu", "type1"); - SBUS_SLOT(config, "slot1", 25'000'000, m_sbus, sbus_cards, nullptr); - SBUS_SLOT(config, "slot2", 25'000'000, m_sbus, sbus_cards, nullptr); - SBUS_SLOT(config, "slot3", 25'000'000, m_sbus, sbus_cards, "bwtwo"); +void sun4_state::sun4_50(machine_config &config) +{ + sun4c(config); + + m_mmu->set_clock(40'000'000); + m_maincpu->set_clock(40'000'000); + + m_sbus->set_clock(20'000'000); + m_sbus_slot[0]->set_clock(20'000'000); + m_sbus_slot[1]->set_clock(20'000'000); + m_sbus_slot[2]->set_clock(20'000'000); + m_sbus_slot[2]->set_default_option("turbogx"); // not accurate, should be gxp, not turbogx + m_sbus_slot[2]->set_fixed(true); } void sun4_state::sun4_60(machine_config &config) { sun4c(config); +} - m_mmu->set_clock(20'000'000); - m_maincpu->set_clock(20'000'000); - m_maincpu->set_mmu(m_mmu); +void sun4_state::sun4_65(machine_config &config) +{ + sun4c(config); - m_type1space->set_map(&sun4_state::type1space_sbus_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); + m_mmu->set_clock(25'000'000); + m_maincpu->set_clock(25'000'000); - // SBus - SBUS(config, m_sbus, 20'000'000, "maincpu", "type1"); - SBUS_SLOT(config, "slot1", 20'000'000, m_sbus, sbus_cards, nullptr); - SBUS_SLOT(config, "slot2", 20'000'000, m_sbus, sbus_cards, nullptr); - SBUS_SLOT(config, "slot3", 20'000'000, m_sbus, sbus_cards, nullptr); + m_sbus->set_clock(25'000'000); + m_sbus_slot[0]->set_clock(25'000'000); + m_sbus_slot[1]->set_clock(25'000'000); + m_sbus_slot[2]->set_clock(25'000'000); } void sun4_state::sun4_75(machine_config &config) { sun4c(config); + m_mmu->set_ctx_mask(0xf); + m_mmu->set_pmeg_mask(0xff); + m_mmu->set_clock(40'000'000); m_maincpu->set_clock(40'000'000); - m_maincpu->set_mmu(m_mmu); - - m_type1space->set_map(&sun4_state::type1space_sbus_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); - - // SBus - SBUS(config, m_sbus, 20'000'000, "maincpu", "type1"); - SBUS_SLOT(config, "slot1", 20'000'000, m_sbus, sbus_cards, nullptr); - SBUS_SLOT(config, "slot2", 20'000'000, m_sbus, sbus_cards, nullptr); - SBUS_SLOT(config, "slot3", 20'000'000, m_sbus, sbus_cards, nullptr); } /* @@ -2258,11 +2330,6 @@ void sun4_state::init_sun4c() m_arch = ARCH_SUN4C; } -void sun4_state::init_ss2() -{ - m_arch = ARCH_SUN4C; -} - /* Drivers */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS @@ -2272,12 +2339,12 @@ COMP( 1987, sun4_300, 0, 0, sun4, sun4, sun4_state, init_sun4, COMP( 198?, sun4_400, 0, 0, sun4, sun4, sun4_state, init_sun4, "Sun Microsystems", "Sun 4/4x0", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // sun4c -COMP( 1990, sun4_40, sun4_300, 0, sun4_40, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation IPC (Sun 4/40)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -COMP( 1991, sun4_50, sun4_300, 0, sun4c, sun4, sun4_state, init_ss2, "Sun Microsystems", "SPARCstation IPX (Sun 4/50)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -COMP( 199?, sun4_20, sun4_300, 0, sun4c, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation SLC (Sun 4/20)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -COMP( 1989, sun4_60, sun4_300, 0, sun4_60, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation 1 (Sun 4/60)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -COMP( 1990, sun4_65, sun4_300, 0, sun4c, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation 1+ (Sun 4/65)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -COMP( 1990, sun4_75, sun4_300, 0, sun4_75, sun4, sun4_state, init_ss2, "Sun Microsystems", "SPARCstation 2 (Sun 4/75)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +COMP( 1990, sun4_40, sun4_300, 0, sun4_40, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation IPC (Sun 4/40)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) +COMP( 1991, sun4_50, sun4_300, 0, sun4_50, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation IPX (Sun 4/50)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +COMP( 199?, sun4_20, sun4_300, 0, sun4_20, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation SLC (Sun 4/20)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +COMP( 1989, sun4_60, sun4_300, 0, sun4_60, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation 1 (Sun 4/60)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) +COMP( 1990, sun4_65, sun4_300, 0, sun4_65, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation 1+ (Sun 4/65)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +COMP( 1990, sun4_75, sun4_300, 0, sun4_75, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation 2 (Sun 4/75)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // sun4m (using the SPARC "reference MMU", probably will go to a separate driver) COMP( 1992, sun_s10, sun4_300, 0, sun4c, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation 10 (Sun S10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )