summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2022-06-25 10:25:22 +1000
committer Vas Crabb <vas@vastheman.com>2022-06-25 10:27:36 +1000
commit38fed2ff786018664868b0d8ec260e944e4ddad6 (patch)
tree4f84729013a1551ccf2dc91c61cc06c7c46ced04
parenta8b6bdfcacdc349bf0d6498540e83a99f79eeb48 (diff)
bus/nubus: Got rid of CRTC hacks in Macintosh Display Card emulation.
* Changed name of cards for slot selection to "mdc48" and "mdc824" as they're unrelated to the later 8*24 GC card. * Also cleaned up code substantially and got rid of artificial differences between Display Card 4*8 and 8*24. * Moved lists of NuBus and SE/30 PDS cards to a common place. * Got some class declarations out of headers to reduce recompiles.
-rw-r--r--scripts/src/bus.lua2
-rw-r--r--src/devices/bus/a2bus/cards.cpp118
-rw-r--r--src/devices/bus/a2bus/cards.h2
-rw-r--r--src/devices/bus/nubus/cards.cpp62
-rw-r--r--src/devices/bus/nubus/cards.h17
-rw-r--r--src/devices/bus/nubus/nubus.cpp41
-rw-r--r--src/devices/bus/nubus/nubus.h6
-rw-r--r--src/devices/bus/nubus/nubus_48gc.cpp408
-rw-r--r--src/devices/bus/nubus/nubus_48gc.h102
-rw-r--r--src/devices/bus/nubus/nubus_spec8.cpp83
-rw-r--r--src/devices/bus/nubus/nubus_spec8.h65
-rw-r--r--src/devices/bus/nubus/nubus_specpdq.cpp91
-rw-r--r--src/devices/bus/nubus/nubus_specpdq.h74
-rw-r--r--src/mame/drivers/mac.cpp52
-rw-r--r--src/mame/drivers/macquadra700.cpp58
15 files changed, 581 insertions, 600 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index 29ac16ff758..348eb598223 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -2775,6 +2775,8 @@ end
if (BUSES["NUBUS"]~=null) then
files {
+ MAME_DIR .. "src/devices/bus/nubus/cards.cpp",
+ MAME_DIR .. "src/devices/bus/nubus/cards.h",
MAME_DIR .. "src/devices/bus/nubus/nubus.cpp",
MAME_DIR .. "src/devices/bus/nubus/nubus.h",
MAME_DIR .. "src/devices/bus/nubus/nubus_48gc.cpp",
diff --git a/src/devices/bus/a2bus/cards.cpp b/src/devices/bus/a2bus/cards.cpp
index cae512a0b05..e6d59172184 100644
--- a/src/devices/bus/a2bus/cards.cpp
+++ b/src/devices/bus/a2bus/cards.cpp
@@ -10,66 +10,66 @@
***************************************************************************/
#include "emu.h"
-#include "bus/a2bus/cards.h"
+#include "cards.h"
-#include "bus/a2bus/4play.h"
-#include "bus/a2bus/a2alfam2.h"
-#include "bus/a2bus/a2applicard.h"
-#include "bus/a2bus/a2arcadebd.h"
-#include "bus/a2bus/a2cffa.h"
-#include "bus/a2bus/a2corvus.h"
-#include "bus/a2bus/a2diskii.h"
-#include "bus/a2bus/a2diskiing.h"
-#include "bus/a2bus/a2dx1.h"
-#include "bus/a2bus/a2echoii.h"
-#include "bus/a2bus/a2iwm.h"
-#include "bus/a2bus/a2mcms.h"
-#include "bus/a2bus/a2memexp.h"
-#include "bus/a2bus/a2midi.h"
-#include "bus/a2bus/a2mockingboard.h"
-#include "bus/a2bus/a2parprn.h"
-#include "bus/a2bus/a2pic.h"
-#include "bus/a2bus/a2sam.h"
-#include "bus/a2bus/a2scsi.h"
-#include "bus/a2bus/a2softcard.h"
-#include "bus/a2bus/a2ssc.h"
-#include "bus/a2bus/a2superdrive.h"
-#include "bus/a2bus/a2swyft.h"
-#include "bus/a2bus/a2themill.h"
-#include "bus/a2bus/a2thunderclock.h"
-#include "bus/a2bus/a2ultraterm.h"
-#include "bus/a2bus/a2videoterm.h"
-#include "bus/a2bus/a2zipdrive.h"
-#include "bus/a2bus/byte8251.h"
-#include "bus/a2bus/computereyes2.h"
-#include "bus/a2bus/ccs7710.h"
-#include "bus/a2bus/excel9.h"
-#include "bus/a2bus/ezcgi.h"
-#include "bus/a2bus/grafex.h"
-#include "bus/a2bus/grappler.h"
-#include "bus/a2bus/laser128.h"
-#include "bus/a2bus/mouse.h"
-#include "bus/a2bus/prodosromdrive.h"
-#include "bus/a2bus/ramcard128k.h"
-#include "bus/a2bus/ramcard16k.h"
-#include "bus/a2bus/ssbapple.h"
-#include "bus/a2bus/ssprite.h"
-#include "bus/a2bus/suprterminal.h"
-#include "bus/a2bus/timemasterho.h"
-#include "bus/a2bus/transwarp.h"
-#include "bus/a2bus/uniprint.h"
-#include "bus/a2bus/booti.h"
-#include "bus/a2bus/q68.h"
-#include "bus/a2bus/pc_xporter.h"
-#include "bus/a2bus/cmsscsi.h"
-#include "bus/a2bus/a2vulcan.h"
-#include "bus/a2bus/uthernet.h"
-#include "bus/a2bus/a2hsscsi.h"
-#include "bus/a2bus/a2sd.h"
-#include "bus/a2bus/sider.h"
-#include "bus/a2bus/lancegs.h"
-#include "bus/a2bus/titan3plus2.h"
-#include "bus/a2bus/softcard3.h"
+#include "4play.h"
+#include "a2alfam2.h"
+#include "a2applicard.h"
+#include "a2arcadebd.h"
+#include "a2cffa.h"
+#include "a2corvus.h"
+#include "a2diskii.h"
+#include "a2diskiing.h"
+#include "a2dx1.h"
+#include "a2echoii.h"
+#include "a2iwm.h"
+#include "a2mcms.h"
+#include "a2memexp.h"
+#include "a2midi.h"
+#include "a2mockingboard.h"
+#include "a2parprn.h"
+#include "a2pic.h"
+#include "a2sam.h"
+#include "a2scsi.h"
+#include "a2softcard.h"
+#include "a2ssc.h"
+#include "a2superdrive.h"
+#include "a2swyft.h"
+#include "a2themill.h"
+#include "a2thunderclock.h"
+#include "a2ultraterm.h"
+#include "a2videoterm.h"
+#include "a2zipdrive.h"
+#include "byte8251.h"
+#include "computereyes2.h"
+#include "ccs7710.h"
+#include "excel9.h"
+#include "ezcgi.h"
+#include "grafex.h"
+#include "grappler.h"
+#include "laser128.h"
+#include "mouse.h"
+#include "prodosromdrive.h"
+#include "ramcard128k.h"
+#include "ramcard16k.h"
+#include "ssbapple.h"
+#include "ssprite.h"
+#include "suprterminal.h"
+#include "timemasterho.h"
+#include "transwarp.h"
+#include "uniprint.h"
+#include "booti.h"
+#include "q68.h"
+#include "pc_xporter.h"
+#include "cmsscsi.h"
+#include "a2vulcan.h"
+#include "uthernet.h"
+#include "a2hsscsi.h"
+#include "a2sd.h"
+#include "sider.h"
+#include "lancegs.h"
+#include "titan3plus2.h"
+#include "softcard3.h"
void apple2_slot0_cards(device_slot_interface &device)
diff --git a/src/devices/bus/a2bus/cards.h b/src/devices/bus/a2bus/cards.h
index 89524aa4d8f..8bbdc71c33a 100644
--- a/src/devices/bus/a2bus/cards.h
+++ b/src/devices/bus/a2bus/cards.h
@@ -12,7 +12,7 @@
#ifndef MAME_BUS_A2BUS_CARDS_H
#define MAME_BUS_A2BUS_CARDS_H
-#include "bus/a2bus/a2bus.h"
+#pragma once
void apple2_slot0_cards(device_slot_interface &device) ATTR_COLD;
void apple2_cards(device_slot_interface &device) ATTR_COLD;
diff --git a/src/devices/bus/nubus/cards.cpp b/src/devices/bus/nubus/cards.cpp
new file mode 100644
index 00000000000..4501754bc21
--- /dev/null
+++ b/src/devices/bus/nubus/cards.cpp
@@ -0,0 +1,62 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/***************************************************************************
+
+ NuBus and SE/30 PDS slot cards
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cards.h"
+
+#include "bootbug.h"
+#include "laserview.h"
+#include "nubus_48gc.h"
+#include "nubus_asntmc3b.h"
+#include "nubus_cb264.h"
+#include "nubus_image.h"
+#include "nubus_m2hires.h"
+#include "nubus_m2video.h"
+#include "nubus_radiustpd.h"
+#include "nubus_spec8.h"
+#include "nubus_specpdq.h"
+#include "nubus_vikbw.h"
+#include "nubus_wsportrait.h"
+#include "pds30_30hr.h"
+#include "pds30_cb264.h"
+#include "pds30_mc30.h"
+#include "pds30_procolor816.h"
+#include "pds30_sigmalview.h"
+#include "quadralink.h"
+
+
+void mac_nubus_cards(device_slot_interface &device)
+{
+ device.option_add("m2video", NUBUS_M2VIDEO); // Apple Macintosh II Video Card
+ device.option_add("mdc48", NUBUS_MDC48); // Apple Macintosh Display Card 4•8
+ device.option_add("mdc824", NUBUS_MDC824); // Apple Macintosh Display Card 8•24
+ device.option_add("cb264", NUBUS_CB264); // RasterOps ColorBoard 264
+ device.option_add("vikbw", NUBUS_VIKBW); // Moniterm Viking board
+ device.option_add("image", NUBUS_IMAGE); // Disk Image Pseudo-Card
+ device.option_add("specpdq", NUBUS_SPECPDQ); // SuperMac Spectrum PDQ
+ device.option_add("m2hires", NUBUS_M2HIRES); // Apple Macintosh II Hi-Resolution Card
+ device.option_add("spec8s3", NUBUS_SPEC8S3); // SuperMac Spectrum/8 Series III
+// device.option_add("thundergx", NUBUS_THUNDERGX); // Radius Thunder GX (not yet)
+ device.option_add("radiustpd", NUBUS_RADIUSTPD); // Radius Two Page Display
+ device.option_add("asmc3nb", NUBUS_ASNTMC3NB); // Asante MC3NB Ethernet card
+ device.option_add("portrait", NUBUS_WSPORTRAIT); // Apple Macintosh II Portrait video card
+ device.option_add("enetnb", NUBUS_APPLEENET); // Apple NuBus Ethernet
+ device.option_add("bootbug", NUBUS_BOOTBUG); // Brigent BootBug debugger card
+ device.option_add("quadralink", NUBUS_QUADRALINK); // AE Quadralink serial card
+ device.option_add("laserview", NUBUS_LASERVIEW); // Sigma Designs LaserView monochrome video card
+}
+
+
+void mac_pds030_cards(device_slot_interface &device)
+{
+ device.option_add("cb264", PDS030_CB264SE30); // RasterOps Colorboard 264/SE30
+ device.option_add("pc816", PDS030_PROCOLOR816); // Lapis ProColor Server 8*16 PDS
+ device.option_add("lview", PDS030_LVIEW); // Sigma Designs L-View
+ device.option_add("30hr", PDS030_XCEED30HR); // Micron/XCEED Technology Color 30HR
+ device.option_add("mc30", PDS030_XCEEDMC30); // Micron/XCEED Technology MacroColor 30
+}
diff --git a/src/devices/bus/nubus/cards.h b/src/devices/bus/nubus/cards.h
new file mode 100644
index 00000000000..3b484be3cdc
--- /dev/null
+++ b/src/devices/bus/nubus/cards.h
@@ -0,0 +1,17 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/***************************************************************************
+
+ NuBus and SE/30 PDS slot cards
+
+***************************************************************************/
+
+#ifndef MAME_BUS_NUBUS_CARDS_H
+#define MAME_BUS_NUBUS_CARDS_H
+
+#pragma once
+
+void mac_nubus_cards(device_slot_interface &device) ATTR_COLD;
+void mac_pds030_cards(device_slot_interface &device) ATTR_COLD;
+
+#endif // MAME_BUS_NUBUS_CARDS_H
diff --git a/src/devices/bus/nubus/nubus.cpp b/src/devices/bus/nubus/nubus.cpp
index 4f712861714..8ac4ea719b9 100644
--- a/src/devices/bus/nubus/nubus.cpp
+++ b/src/devices/bus/nubus/nubus.cpp
@@ -126,7 +126,8 @@ void nubus_device::add_nubus_card(device_nubus_card_interface *card)
m_device_list.append(*card);
}
-template<typename R, typename W> void nubus_device::install_device(offs_t start, offs_t end, R rhandler, W whandler, uint32_t mask)
+template <typename R, typename W>
+void nubus_device::install_device(offs_t start, offs_t end, R rhandler, W whandler, uint32_t mask)
{
int buswidth = m_space->data_width();
switch(buswidth)
@@ -135,7 +136,7 @@ template<typename R, typename W> void nubus_device::install_device(offs_t start,
m_space->install_readwrite_handler(start, end, rhandler, whandler, mask);
break;
case 64:
- m_space->install_readwrite_handler(start, end, rhandler, whandler, ((uint64_t)mask<<32)|mask);
+ m_space->install_readwrite_handler(start, end, rhandler, whandler, (uint64_t(mask) << 32) | mask);
break;
default:
fatalerror("NUBUS: Bus width %d not supported\n", buswidth);
@@ -155,7 +156,8 @@ template void nubus_device::install_device<read32s_delegate, write32s_delegate
template void nubus_device::install_device<read32sm_delegate, write32sm_delegate >(offs_t start, offs_t end, read32sm_delegate rhandler, write32sm_delegate whandler, uint32_t mask);
template void nubus_device::install_device<read32smo_delegate, write32smo_delegate>(offs_t start, offs_t end, read32smo_delegate rhandler, write32smo_delegate whandler, uint32_t mask);
-void nubus_device::install_readonly_device(offs_t start, offs_t end, read32_delegate rhandler, uint32_t mask)
+template <typename R>
+void nubus_device::install_readonly_device(offs_t start, offs_t end, R rhandler, uint32_t mask)
{
int buswidth = m_space->data_width();
switch(buswidth)
@@ -164,14 +166,28 @@ void nubus_device::install_readonly_device(offs_t start, offs_t end, read32_dele
m_space->install_read_handler(start, end, rhandler, mask);
break;
case 64:
- m_space->install_read_handler(start, end, rhandler, ((uint64_t)mask<<32)|mask);
+ m_space->install_read_handler(start, end, rhandler, (uint64_t(mask) << 32) | mask);
break;
default:
fatalerror("NUBUS: Bus width %d not supported\n", buswidth);
}
}
-void nubus_device::install_writeonly_device(offs_t start, offs_t end, write32_delegate whandler, uint32_t mask)
+template void nubus_device::install_readonly_device<read8_delegate >(offs_t start, offs_t end, read8_delegate rhandler, uint32_t mask);
+template void nubus_device::install_readonly_device<read8s_delegate >(offs_t start, offs_t end, read8s_delegate rhandler, uint32_t mask);
+template void nubus_device::install_readonly_device<read8sm_delegate >(offs_t start, offs_t end, read8sm_delegate rhandler, uint32_t mask);
+template void nubus_device::install_readonly_device<read8smo_delegate >(offs_t start, offs_t end, read8smo_delegate rhandler, uint32_t mask);
+template void nubus_device::install_readonly_device<read16_delegate >(offs_t start, offs_t end, read16_delegate rhandler, uint32_t mask);
+template void nubus_device::install_readonly_device<read16s_delegate >(offs_t start, offs_t end, read16s_delegate rhandler, uint32_t mask);
+template void nubus_device::install_readonly_device<read16sm_delegate >(offs_t start, offs_t end, read16sm_delegate rhandler, uint32_t mask);
+template void nubus_device::install_readonly_device<read16smo_delegate>(offs_t start, offs_t end, read16smo_delegate rhandler, uint32_t mask);
+template void nubus_device::install_readonly_device<read32_delegate >(offs_t start, offs_t end, read32_delegate rhandler, uint32_t mask);
+template void nubus_device::install_readonly_device<read32s_delegate >(offs_t start, offs_t end, read32s_delegate rhandler, uint32_t mask);
+template void nubus_device::install_readonly_device<read32sm_delegate >(offs_t start, offs_t end, read32sm_delegate rhandler, uint32_t mask);
+template void nubus_device::install_readonly_device<read32smo_delegate>(offs_t start, offs_t end, read32smo_delegate rhandler, uint32_t mask);
+
+template <typename W>
+void nubus_device::install_writeonly_device(offs_t start, offs_t end, W whandler, uint32_t mask)
{
int buswidth = m_space->data_width();
switch(buswidth)
@@ -180,13 +196,26 @@ void nubus_device::install_writeonly_device(offs_t start, offs_t end, write32_de
m_space->install_write_handler(start, end, whandler, mask);
break;
case 64:
- m_space->install_write_handler(start, end, whandler, ((uint64_t)mask<<32)|mask);
+ m_space->install_write_handler(start, end, whandler, (uint64_t(mask) << 32) | mask);
break;
default:
fatalerror("NUBUS: Bus width %d not supported\n", buswidth);
}
}
+template void nubus_device::install_writeonly_device<write8_delegate >(offs_t start, offs_t end, write8_delegate whandler, uint32_t mask);
+template void nubus_device::install_writeonly_device<write8s_delegate >(offs_t start, offs_t end, write8s_delegate whandler, uint32_t mask);
+template void nubus_device::install_writeonly_device<write8sm_delegate >(offs_t start, offs_t end, write8sm_delegate whandler, uint32_t mask);
+template void nubus_device::install_writeonly_device<write8smo_delegate >(offs_t start, offs_t end, write8smo_delegate whandler, uint32_t mask);
+template void nubus_device::install_writeonly_device<write16_delegate >(offs_t start, offs_t end, write16_delegate whandler, uint32_t mask);
+template void nubus_device::install_writeonly_device<write16s_delegate >(offs_t start, offs_t end, write16s_delegate whandler, uint32_t mask);
+template void nubus_device::install_writeonly_device<write16sm_delegate >(offs_t start, offs_t end, write16sm_delegate whandler, uint32_t mask);
+template void nubus_device::install_writeonly_device<write16smo_delegate>(offs_t start, offs_t end, write16smo_delegate whandler, uint32_t mask);
+template void nubus_device::install_writeonly_device<write32_delegate >(offs_t start, offs_t end, write32_delegate whandler, uint32_t mask);
+template void nubus_device::install_writeonly_device<write32s_delegate >(offs_t start, offs_t end, write32s_delegate whandler, uint32_t mask);
+template void nubus_device::install_writeonly_device<write32sm_delegate >(offs_t start, offs_t end, write32sm_delegate whandler, uint32_t mask);
+template void nubus_device::install_writeonly_device<write32smo_delegate>(offs_t start, offs_t end, write32smo_delegate whandler, uint32_t mask);
+
void nubus_device::install_bank(offs_t start, offs_t end, void *data)
{
// printf("install_bank: %s @ %x->%x\n", tag, start, end);
diff --git a/src/devices/bus/nubus/nubus.h b/src/devices/bus/nubus/nubus.h
index 198f5b115eb..c99f25b33d6 100644
--- a/src/devices/bus/nubus/nubus.h
+++ b/src/devices/bus/nubus/nubus.h
@@ -123,9 +123,9 @@ public:
auto out_irqe_callback() { return m_out_irqe_cb.bind(); }
void add_nubus_card(device_nubus_card_interface *card);
- template<typename R, typename W> void install_device(offs_t start, offs_t end, R rhandler, W whandler, uint32_t mask=0xffffffff);
- void install_readonly_device(offs_t start, offs_t end, read32_delegate rhandler, uint32_t mask=0xffffffff);
- void install_writeonly_device(offs_t start, offs_t end, write32_delegate whandler, uint32_t mask=0xffffffff);
+ template <typename R, typename W> void install_device(offs_t start, offs_t end, R rhandler, W whandler, uint32_t mask=0xffffffff);
+ template <typename R> void install_readonly_device(offs_t start, offs_t end, R rhandler, uint32_t mask=0xffffffff);
+ template <typename W> void install_writeonly_device(offs_t start, offs_t end, W whandler, uint32_t mask=0xffffffff);
void install_bank(offs_t start, offs_t end, void *data);
void install_view(offs_t start, offs_t end, memory_view &view);
void set_irq_line(int slot, int state);
diff --git a/src/devices/bus/nubus/nubus_48gc.cpp b/src/devices/bus/nubus/nubus_48gc.cpp
index 41dfeb56d6f..98cec4cd568 100644
--- a/src/devices/bus/nubus/nubus_48gc.cpp
+++ b/src/devices/bus/nubus/nubus_48gc.cpp
@@ -5,8 +5,12 @@
Apple Macitosh Display Card 4•8 (model 630-0400)
Apple Macitosh Display Card 8•24
- Cards have the same framebuffer, CRTC and clock synthesizers, but use
- different RAMDACs and ROMs.
+ Cards have the same framebuffer, CRTC, clock synthesizer, and RAMDAC,
+ but use different ROMs and support different monitor profiles.
+
+ The 4•8 shipped with less RAM by default, and as supplied it could not
+ support higher bit depths. We always emulate it as though it has been
+ upgraded to maximum supported RAM.
Monitor type changes take effect on had reset. The 8•24 defaults to the
“Page-White Gamma” profile for the 21" and 16" color monitors, which
@@ -14,9 +18,7 @@
“Uncorrected Gamma” profile if you don’t like it.
TODO:
- * Work out why some monitors need magic multiply or divide by two to
- get the right RAMDAC/CRTC clocks - inferring it from the reference
- clock modulus is definitely wrong.
+ * RAM size configuration.
* Interlaced modes.
***************************************************************************/
@@ -38,8 +40,98 @@
#define GC48_SCREEN_NAME "screen"
#define GC48_ROM_REGION "48gc_rom"
+namespace {
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> jmfb_device
+
+class jmfb_device :
+ public device_t,
+ public device_nubus_card_interface,
+ public device_video_interface,
+ public device_palette_interface
+{
+protected:
+ // construction/destruction
+ jmfb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ // palette implementation
+ uint32_t palette_entries() const override;
+
+private:
+ TIMER_CALLBACK_MEMBER(vbl_tick);
+
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void update_crtc();
+
+ uint32_t jmfb_r(offs_t offset, uint32_t mem_mask = ~0);
+ uint32_t crtc_r(offs_t offset, uint32_t mem_mask = ~0);
+ void jmfb_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+ void crtc_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+ void ramdac_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+ void clkgen_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+
+ uint32_t rgb_unpack(offs_t offset, uint32_t mem_mask = ~0);
+ void rgb_pack(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+
+ required_ioport m_monitor;
+ memory_view m_vram_view;
+ emu_timer *m_timer;
+
+ uint8_t m_monitor_type;
+
+ std::vector<uint32_t> m_vram;
+ uint32_t m_vbl_disable, m_toggle;
+ uint8_t m_sense;
+ uint16_t m_preload;
+ uint32_t m_base, m_stride;
-static INPUT_PORTS_START( 48gc )
+ uint8_t m_colors[3], m_count, m_clutoffs, m_mode;
+
+ uint16_t m_hactive, m_hbporch, m_hsync, m_hfporch;
+ uint16_t m_vactive, m_vbporch, m_vsync, m_vfporch;
+ uint16_t m_multiplier;
+ uint16_t m_modulus;
+ uint8_t m_pdiv;
+};
+
+class nubus_48gc_device : public jmfb_device
+{
+public:
+ nubus_48gc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // optional information overrides
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual ioport_constructor device_input_ports() const override;
+
+private:
+ void mac_48gc_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+};
+
+class nubus_824gc_device : public jmfb_device
+{
+public:
+ nubus_824gc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // optional information overrides
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual ioport_constructor device_input_ports() const override;
+};
+
+
+INPUT_PORTS_START( 48gc )
PORT_START("MONITOR")
PORT_CONFNAME(0x0f, 0x06, u8"Attached monitor")
PORT_CONFSETTING( 0x00, u8"Macintosh Two-Page Monitor (1152\u00d7870)")
@@ -52,7 +144,7 @@ static INPUT_PORTS_START( 48gc )
INPUT_PORTS_END
-static INPUT_PORTS_START( 824gc )
+INPUT_PORTS_START( 824gc )
PORT_START("MONITOR")
PORT_CONFNAME(0x0f, 0x06, u8"Attached monitor")
PORT_CONFSETTING( 0x00, u8"Mac 21\" Color Display (1152\u00d7870)")
@@ -75,17 +167,10 @@ ROM_START( gc824 )
ROM_LOAD( "3410868.bin", 0x000000, 0x008000, CRC(57f925fa) SHA1(4d3c0632711b7b31c8e0c5cfdd7ec1904f178336) ) /* Label: "341-0868 // (C)APPLE COMPUTER // INC. 1986-1991 // ALL RIGHTS // RESERVED W5" */
ROM_END
-//**************************************************************************
-// GLOBAL VARIABLES
-//**************************************************************************
-
-DEFINE_DEVICE_TYPE(NUBUS_48GC, nubus_48gc_device, "nb_48gc", "Apple Macintosh Display Card 4*8")
-DEFINE_DEVICE_TYPE(NUBUS_824GC, nubus_824gc_device, "nb_824gc", "Apple Macintosh Display Card 8*24")
-
// TODO: find a better place for this table to live
struct mac_monitor_info { bool mono; unsigned sense[4]; };
-static mac_monitor_info const f_monitors[] = {
+mac_monitor_info const f_monitors[] = {
{ false, { 0, 0, 0, 0 } }, // 0: RGB 21"
{ true, { 1, 1, 1, 0 } }, // 1: Full-Page (B&W 15")
{ false, { 2, 2, 0, 2 } }, // 2: RGB 12"
@@ -180,12 +265,12 @@ jmfb_device::jmfb_device(const machine_config &mconfig, device_type type, const
}
nubus_48gc_device::nubus_48gc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- jmfb_device(mconfig, NUBUS_48GC, tag, owner, clock)
+ jmfb_device(mconfig, NUBUS_MDC48, tag, owner, clock)
{
}
nubus_824gc_device::nubus_824gc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- jmfb_device(mconfig, NUBUS_824GC, tag, owner, clock)
+ jmfb_device(mconfig, NUBUS_MDC824, tag, owner, clock)
{
}
@@ -213,6 +298,19 @@ void jmfb_device::device_start()
read32s_delegate(*this, FUNC(jmfb_device::rgb_unpack)), write32s_delegate(*this, FUNC(jmfb_device::rgb_pack)));
m_vram_view.select(0);
+ nubus().install_device(
+ slotspace + 0x200000, slotspace + 0x20000f,
+ read32s_delegate(*this, FUNC(jmfb_device::jmfb_r)), write32s_delegate(*this, FUNC(jmfb_device::jmfb_w)));
+ nubus().install_device(
+ slotspace + 0x200100, slotspace + 0x2001ff,
+ read32s_delegate(*this, FUNC(jmfb_device::crtc_r)), write32s_delegate(*this, FUNC(jmfb_device::crtc_w)));
+ nubus().install_writeonly_device(
+ slotspace + 0x200200, slotspace + 0x20020f,
+ write32s_delegate(*this, FUNC(jmfb_device::ramdac_w)));
+ nubus().install_writeonly_device(
+ slotspace + 0x200300, slotspace + 0x20033f,
+ write32s_delegate(*this, FUNC(jmfb_device::clkgen_w)));
+
m_timer = timer_alloc(FUNC(jmfb_device::vbl_tick), this);
m_monitor_type = 0;
@@ -222,7 +320,6 @@ void jmfb_device::device_start()
save_item(NAME(m_vram));
save_item(NAME(m_vbl_disable));
save_item(NAME(m_toggle));
- save_item(NAME(m_registers));
save_item(NAME(m_sense));
save_item(NAME(m_preload));
save_item(NAME(m_base));
@@ -244,26 +341,6 @@ void jmfb_device::device_start()
save_item(NAME(m_pdiv));
}
-void nubus_48gc_device::device_start()
-{
- jmfb_device::device_start();
-
- uint32_t const slotspace = get_slotspace();
- nubus().install_device(
- slotspace + 0x200000, slotspace + 0x2003ff,
- read32s_delegate(*this, FUNC(nubus_48gc_device::jmfb_r)), write32s_delegate(*this, FUNC(nubus_48gc_device::mac_48gc_w)));
-}
-
-void nubus_824gc_device::device_start()
-{
- jmfb_device::device_start();
-
- uint32_t const slotspace = get_slotspace();
- nubus().install_device(
- slotspace + 0x200000, slotspace + 0x2003ff,
- read32s_delegate(*this, FUNC(nubus_824gc_device::jmfb_r)), write32s_delegate(*this, FUNC(nubus_824gc_device::mac_824gc_w)));
-}
-
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
@@ -275,7 +352,7 @@ void jmfb_device::device_reset()
m_monitor_type = m_monitor->read();
if (m_monitor_type > std::size(f_monitors))
{
- throw emu_fatalerror("%s: Invalid monitor selection %x\n", m_monitor_type);
+ throw emu_fatalerror("%s: Invalid monitor selection %d\n", tag(), m_monitor_type);
}
std::fill(m_vram.begin(), m_vram.end(), 0);
@@ -333,7 +410,7 @@ uint32_t jmfb_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
switch (m_mode)
{
- case 0: // 1bpp
+ case 0x0: // 1bpp
for (int y = cliprect.top(); y <= cliprect.bottom(); y++)
{
auto const rowbase = screenbase + (y * m_stride * 4);
@@ -354,7 +431,7 @@ uint32_t jmfb_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
}
break;
- case 1: // 2bpp
+ case 0x4: // 2bpp
for (int y = cliprect.top(); y <= cliprect.bottom(); y++)
{
auto const rowbase = screenbase + (y * m_stride * 4);
@@ -371,7 +448,7 @@ uint32_t jmfb_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
}
break;
- case 2: // 4 bpp
+ case 0x8: // 4 bpp
for (int y = cliprect.top(); y <= cliprect.bottom(); y++)
{
auto const rowbase = screenbase + (y * m_stride * 4);
@@ -386,7 +463,7 @@ uint32_t jmfb_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
}
break;
- case 3: // 8 bpp
+ case 0xc: // 8 bpp
for (int y = cliprect.top(); y <= cliprect.bottom(); y++)
{
auto const rowbase = screenbase + (y * m_stride * 4);
@@ -398,7 +475,7 @@ uint32_t jmfb_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
}
break;
- case 4: // 24 bpp
+ case 0xd: // 24 bpp
for (int y = cliprect.top(); y <= cliprect.bottom(); y++)
{
auto source = util::big_endian_cast<uint8_t const>(&m_vram[0]) + (m_base << 6) + (y * m_stride * 8);
@@ -413,6 +490,9 @@ uint32_t jmfb_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
}
}
break;
+
+ default:
+ throw emu_fatalerror("%s: Unsupported RAMDAC mode %d\n", tag(), m_mode);
}
return 0;
@@ -432,55 +512,37 @@ void jmfb_device::update_crtc()
LOG("reference clock %d VCO output %d pixel clock %d RAMDAC clock %d\n",
refclk.value(), vcoout.value(), pixclk.value(), dacclk.value());
- int htotal = m_hactive + m_hbporch + m_hsync + m_hfporch + 8;
- int width = m_hactive + 2;
- LOG("horizontal total %d active %d\n", htotal, width);
+ int const htotal = (m_hactive + m_hbporch + m_hsync + m_hfporch + 8) * 32 / divider;
+ int const hactive = (m_hactive + 2) * 32 / divider;
- // FIXME: where does this multiply/divide by 2 come from?
- // This is obviously not correct by any definition.
int scale = 0;
- switch (m_modulus)
- {
- case 15:
- scale = -1;
- break;
- case 21:
- scale = 0;
- break;
- case 19:
- case 22:
- scale = 1;
- break;
- default:
- throw emu_fatalerror("%s: Unknown clock modulus %d\n", tag(), m_modulus);
- }
- htotal = ((m_hactive + m_hbporch + m_hsync + m_hfporch + 8) << (m_pdiv + scale)) / divider;
- width = ((m_hactive + 2) << (m_pdiv + scale)) / divider;
switch (m_mode)
{
- case 0: // 1bpp:
- htotal <<= 3;
- width <<= 3;
+ case 0x0: // 1bpp:
+ scale = 0;
break;
- case 1: // 2bpp:
- htotal <<= 2;
- width <<= 2;
+ case 0x4: // 2bpp:
+ scale = 1;
break;
- case 2: // 4bpp:
- htotal <<= 1;
- width <<= 1;
+ case 0x8: // 4bpp:
+ scale = 2;
break;
- case 3: // 8bpp:
+ case 0xc: // 8bpp:
+ scale = 3;
break;
- case 4: // 24bpp:
- htotal >>= 2;
- width >>= 2;
+ case 0xd: // 24bpp:
+ scale = 5;
break;
}
+ int const hpixels = htotal >> scale;
+ int const width = hactive >> scale;
+ LOG("horizontal total %d active %d (mode %x %d/%d)\n",
+ htotal, hactive, m_mode, width, hpixels);
+
screen().configure(
- htotal, vtotal,
+ hpixels, vtotal,
rectangle(0, width - 1, 0, height - 1),
- attotime::from_ticks(htotal * vtotal, pixclk).attoseconds());
+ attotime::from_ticks(hpixels * vtotal, pixclk).attoseconds());
// TODO: determine correct timing for vertical blanking interrupt
m_timer->adjust(screen().time_until_pos(height - 1, 0));
@@ -489,11 +551,11 @@ void jmfb_device::update_crtc()
uint32_t jmfb_device::jmfb_r(offs_t offset, uint32_t mem_mask)
{
-// printf("%s 48gc_r: @ %x, mask %08x\n", machine().describe_context().c_str(), offset, mem_mask);
+// printf("%s jmfb_r: @ %x, mask %08x\n", machine().describe_context().c_str(), offset, mem_mask);
switch (offset)
{
- case 0x000/4:
+ case 0x00/4:
{
uint32_t result = f_monitors[m_monitor_type].sense[0];
if (BIT(m_sense, 2))
@@ -504,8 +566,18 @@ uint32_t jmfb_device::jmfb_r(offs_t offset, uint32_t mem_mask)
result &= f_monitors[m_monitor_type].sense[3];
return result << 9;
}
+ }
+
+ return 0;
+}
+
+uint32_t jmfb_device::crtc_r(offs_t offset, uint32_t mem_mask)
+{
+// printf("%s crtc_r: @ %x, mask %08x\n", machine().describe_context().c_str(), offset, mem_mask);
- case 0x1c0/4:
+ switch (offset)
+ {
+ case 0xc0/4:
m_toggle ^= 0xffffffff;
return m_toggle;
}
@@ -515,11 +587,9 @@ uint32_t jmfb_device::jmfb_r(offs_t offset, uint32_t mem_mask)
void jmfb_device::jmfb_w(offs_t offset, uint32_t data, uint32_t mem_mask)
{
- COMBINE_DATA(&m_registers[offset & 0xff]);
-
switch (offset)
{
- case 0x000/4: // control
+ case 0x00/4: // control
LOG("%s: %04x to control\n", machine().describe_context(), data);
if (BIT(data, 7))
{
@@ -528,184 +598,148 @@ void jmfb_device::jmfb_w(offs_t offset, uint32_t data, uint32_t mem_mask)
m_sense = (data >> 9) & 0x07;
break;
- case 0x004/4:
+ case 0x04/4:
LOG("%s: %02x to preload\n", machine().describe_context(), data);
m_preload = data & 0xff;
update_crtc();
break;
- case 0x008/4: // base
+ case 0x08/4: // base
LOG("%s: %x to base\n", machine().describe_context(), data);
m_base = data & 0xffff;
break;
- case 0x00c/4: // stride
+ case 0x0c/4: // stride
LOG("%s: %x to stride\n", machine().describe_context(), data);
// this value is in DWORDs for 1-8 bpp and, uhh, strange for 24bpp
m_stride = data & 0xffff;
break;
+ }
+}
- case 0x10c/4: // active pixel cells - 2
+void jmfb_device::crtc_w(offs_t offset, uint32_t data, uint32_t mem_mask)
+{
+ switch (offset)
+ {
+ case 0x0c/4: // active pixel cells - 2
LOG("%s: %d-2 to active cells\n", machine().describe_context(), data + 2);
m_hactive = data;
update_crtc();
break;
- case 0x110/4: // horizontal back porch
+ case 0x10/4: // horizontal back porch
LOG("%s: %d to horizontal back porch\n", machine().describe_context(), data + 2);
m_hbporch = data;
update_crtc();
break;
- case 0x114/4: // horizontal sync pulse
+ case 0x14/4: // horizontal sync pulse
LOG("%s: %d-2 to horizontal sync pulse\n", machine().describe_context(), data + 2);
m_hsync = data;
update_crtc();
break;
- case 0x118/4: // horizontal front porch
+ case 0x18/4: // horizontal front porch
LOG("%s: %d-2 to horizontal front porch\n", machine().describe_context(), data + 2);
m_hfporch = data;
update_crtc();
break;
- case 0x124/4: // active lines * 2
+ case 0x24/4: // active lines * 2
LOG("%s: %d*2 to active lines\n", machine().describe_context(), data / 2);
m_vactive = data;
update_crtc();
break;
- case 0x128/4: // vertical back porch * 2
+ case 0x28/4: // vertical back porch * 2
LOG("%s: %d*2 to vertical back porch\n", machine().describe_context(), data / 2);
m_vbporch = data;
update_crtc();
break;
- case 0x12c/4: // vertical sync width * 2
+ case 0x2c/4: // vertical sync width * 2
LOG("%s: %d*2 to vertical sync pulse width\n", machine().describe_context(), data / 2);
m_vsync = data;
update_crtc();
break;
- case 0x130/4: // vertical front porch * 2
+ case 0x30/4: // vertical front porch * 2
LOG("%s: %d*2 to vertical front porch\n", machine().describe_context(), data / 2);
m_vfporch = data;
update_crtc();
break;
- case 0x13c/4: // bit 1 = VBL disable (1=no interrupts)
+ case 0x3c/4: // bit 1 = VBL disable (1=no interrupts)
m_vbl_disable = (data & 2) ? 1 : 0;
break;
- case 0x148/4: // write 1 here to clear interrupt
- if (data == 1)
- {
- lower_slot_irq();
- }
- break;
-
- case 0x300/4:
- case 0x304/4:
- case 0x308/4:
- case 0x30c/4:
- m_multiplier &= ~(0x0f << ((offset & 3) * 4));
- m_multiplier |= (data & 0x0f) << ((offset & 3) * 4);
- LOG("%s: %d to multiplier\n", machine().describe_context(), m_multiplier);
- update_crtc();
- break;
-
- case 0x310/4:
- case 0x314/4:
- case 0x318/4:
- m_modulus &= ~(0x0f << ((offset & 3) * 4));
- m_modulus |= (data & 0x0f) << ((offset & 3) * 4);
- LOG("%s: %d to modulus\n", machine().describe_context(), m_modulus);
- if (offset == 0x318/4) // avoid bad intermediate values
- update_crtc();
- break;
-
- case 0x324/4:
- LOG("%s: 1<<%d to pixel cell divider\n", machine().describe_context(), data);
- m_pdiv = data & 0x0f;
- update_crtc();
- break;
-
- default:
+ case 0x48/4: // write here to clear interrupt
+ lower_slot_irq();
break;
}
}
-void nubus_48gc_device::mac_48gc_w(offs_t offset, uint32_t data, uint32_t mem_mask)
+void jmfb_device::ramdac_w(offs_t offset, uint32_t data, uint32_t mem_mask)
{
switch (offset)
{
- case 0x200/4: // DAC control
- dac_ctrl_w(data >> 24);
+ case 0x00/4: // CLUT address
+ LOG("%s: %02x to CLUT address\n", machine().describe_context(), data & 0xff);
+ m_clutoffs = data;
+ m_count = 0;
break;
- case 0x204/4: // DAC data
- dac_data_w(data >> 24);
+ case 0x04/4: // CLUT data
+ m_colors[m_count++] = data & 0xff;
+ if (m_count == 3)
+ {
+ LOG("%s: RAMDAC: color %d = %02x %02x %02x\n", machine().describe_context(), m_clutoffs, m_colors[0], m_colors[1], m_colors[2]);
+ set_pen_color(m_clutoffs, rgb_t(m_colors[0], m_colors[1], m_colors[2]));
+ m_clutoffs++;
+ m_count = 0;
+ }
break;
- case 0x208/4: // mode control
- mode_w(data, !((data >> 5) & 0x3));
+ case 0x08/4: // mode control
+ m_mode = (data >> 1) & 0xf;
+ LOG("%s: %02x to RAMDAC mode (mode = %x)\n", machine().describe_context(), data, m_mode);
+ update_crtc();
break;
-
- default:
- jmfb_w(offset, data, mem_mask);
}
}
-void nubus_824gc_device::mac_824gc_w(offs_t offset, uint32_t data, uint32_t mem_mask)
+void jmfb_device::clkgen_w(offs_t offset, uint32_t data, uint32_t mem_mask)
{
switch (offset)
{
- case 0x200/4: // DAC control
- dac_ctrl_w(data & 0xff);
+ case 0x00/4:
+ case 0x04/4:
+ case 0x08/4:
+ case 0x0c/4:
+ m_multiplier &= ~(0x0f << ((offset & 3) * 4));
+ m_multiplier |= (data & 0x0f) << ((offset & 3) * 4);
+ LOG("%s: %d to multiplier\n", machine().describe_context(), m_multiplier);
+ update_crtc();
break;
- case 0x204/4: // DAC data
- dac_data_w(data & 0xff);
+ case 0x10/4:
+ case 0x14/4:
+ case 0x18/4:
+ m_modulus &= ~(0x0f << ((offset & 3) * 4));
+ m_modulus |= (data & 0x0f) << ((offset & 3) * 4);
+ LOG("%s: %d to modulus\n", machine().describe_context(), m_modulus);
+ if (offset == 0x318/4) // avoid bad intermediate values
+ update_crtc();
break;
- case 0x208/4: // mode control
- mode_w(data, BIT(data, 1));
+ case 0x24/4:
+ LOG("%s: 1<<%d to pixel cell divider\n", machine().describe_context(), data);
+ m_pdiv = data & 0x0f;
+ update_crtc();
break;
-
- default:
- jmfb_w(offset, data, mem_mask);
- }
-}
-
-void jmfb_device::dac_ctrl_w(uint8_t data)
-{
- LOG("%s: %02x to DAC control\n", machine().describe_context(), data);
- m_clutoffs = data;
- m_count = 0;
-}
-
-void jmfb_device::dac_data_w(uint8_t data)
-{
- m_colors[m_count++] = data;
-
- if (m_count == 3)
- {
- LOG("%s: RAMDAC: color %d = %02x %02x %02x\n", machine().describe_context(), m_clutoffs, m_colors[0], m_colors[1], m_colors[2]);
- set_pen_color(m_clutoffs, rgb_t(m_colors[0], m_colors[1], m_colors[2]));
- m_clutoffs++;
- m_count = 0;
}
}
-void jmfb_device::mode_w(uint32_t data, bool rgb)
-{
- m_mode = (data >> 3) & 0x3;
- if ((m_mode == 3) & rgb) // mode 3 can be 8 or 24 bpp
- m_mode = 4;
- LOG("%s: %02x to mode (m_mode = %d)\n", machine().describe_context(), data, m_mode);
- update_crtc();
-}
-
uint32_t jmfb_device::rgb_unpack(offs_t offset, uint32_t mem_mask)
{
auto const color = util::big_endian_cast<uint8_t const>(&m_vram[0]) + (offset * 3);
@@ -722,3 +756,13 @@ void jmfb_device::rgb_pack(offs_t offset, uint32_t data, uint32_t mem_mask)
if (ACCESSING_BITS_0_7)
color[2] = uint8_t(data);
}
+
+} // anonymous namespace
+
+
+//**************************************************************************
+// DEVICE TYPE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE_PRIVATE(NUBUS_MDC48, device_nubus_card_interface, nubus_48gc_device, "nb_mdc48", "Apple Macintosh Display Card 4*8")
+DEFINE_DEVICE_TYPE_PRIVATE(NUBUS_MDC824, device_nubus_card_interface, nubus_824gc_device, "nb_mdc824", "Apple Macintosh Display Card 8*24")
diff --git a/src/devices/bus/nubus/nubus_48gc.h b/src/devices/bus/nubus/nubus_48gc.h
index 50abdc9f679..4603150077b 100644
--- a/src/devices/bus/nubus/nubus_48gc.h
+++ b/src/devices/bus/nubus/nubus_48gc.h
@@ -7,106 +7,8 @@
#include "nubus.h"
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-// ======================> jmfb_device
-
-class jmfb_device :
- public device_t,
- public device_nubus_card_interface,
- public device_video_interface,
- public device_palette_interface
-{
-protected:
- // construction/destruction
- jmfb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
-
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
-
- // optional information overrides
- virtual void device_add_mconfig(machine_config &config) override;
-
- // palette implementation
- uint32_t palette_entries() const override;
-
- TIMER_CALLBACK_MEMBER(vbl_tick);
-
- uint32_t jmfb_r(offs_t offset, uint32_t mem_mask = ~0);
- void jmfb_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
-
- void dac_ctrl_w(uint8_t data);
- void dac_data_w(uint8_t data);
- void mode_w(uint32_t data, bool rgb);
-
-private:
- uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- void update_crtc();
-
- uint32_t rgb_unpack(offs_t offset, uint32_t mem_mask = ~0);
- void rgb_pack(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
-
- required_ioport m_monitor;
- memory_view m_vram_view;
- emu_timer *m_timer;
-
- uint8_t m_monitor_type;
-
- std::vector<uint32_t> m_vram;
- uint32_t m_vbl_disable, m_toggle;
- uint32_t m_registers[0x100];
- uint8_t m_sense;
- uint16_t m_preload;
- uint32_t m_base, m_stride;
-
- uint8_t m_colors[3], m_count, m_clutoffs, m_mode;
-
- uint16_t m_hactive, m_hbporch, m_hsync, m_hfporch;
- uint16_t m_vactive, m_vbporch, m_vsync, m_vfporch;
- uint16_t m_multiplier;
- uint16_t m_modulus;
- uint8_t m_pdiv;
-};
-
-class nubus_48gc_device : public jmfb_device
-{
-public:
- nubus_48gc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
-protected:
- // device-level overrides
- virtual void device_start() override;
-
- // optional information overrides
- virtual const tiny_rom_entry *device_rom_region() const override;
- virtual ioport_constructor device_input_ports() const override;
-
-private:
- void mac_48gc_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
-};
-
-class nubus_824gc_device : public jmfb_device
-{
-public:
- nubus_824gc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
-protected:
- // device-level overrides
- virtual void device_start() override;
-
- // optional information overrides
- virtual const tiny_rom_entry *device_rom_region() const override;
- virtual ioport_constructor device_input_ports() const override;
-
-private:
- void mac_824gc_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
-};
-
// device type definition
-DECLARE_DEVICE_TYPE(NUBUS_48GC, nubus_48gc_device)
-DECLARE_DEVICE_TYPE(NUBUS_824GC, nubus_824gc_device)
+DECLARE_DEVICE_TYPE(NUBUS_MDC48, device_nubus_card_interface)
+DECLARE_DEVICE_TYPE(NUBUS_MDC824, device_nubus_card_interface)
#endif /// MAME_BUS_NUBUS_NUBUS_48GC_H
diff --git a/src/devices/bus/nubus/nubus_spec8.cpp b/src/devices/bus/nubus/nubus_spec8.cpp
index ee3549a2572..1e55c907928 100644
--- a/src/devices/bus/nubus/nubus_spec8.cpp
+++ b/src/devices/bus/nubus/nubus_spec8.cpp
@@ -48,6 +48,8 @@
#include "emu.h"
#include "nubus_spec8.h"
+#include "supermac.h"
+
#include "layout/generic.h"
#include "screen.h"
@@ -63,7 +65,70 @@
#define VRAM_SIZE (0x10'0000) // 1M of VRAM for 1024x768 @ 8 bit
-static INPUT_PORTS_START( spec8s3 )
+namespace {
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class nubus_spec8s3_device :
+ public device_t,
+ public device_nubus_card_interface,
+ public device_video_interface,
+ public device_palette_interface
+{
+public:
+ // construction/destruction
+ nubus_spec8s3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ nubus_spec8s3_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual ioport_constructor device_input_ports() const override;
+
+ // palette implementation
+ virtual uint32_t palette_entries() const override;
+
+ TIMER_CALLBACK_MEMBER(vbl_tick);
+
+private:
+ uint32_t spec8s3_r(offs_t offset, uint32_t mem_mask = ~0);
+ void spec8s3_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+ uint32_t vram_r(offs_t offset, uint32_t mem_mask = ~0);
+ void vram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+
+ void update_crtc();
+
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ required_ioport m_userosc;
+ emu_timer *m_timer;
+
+ supermac_spec_crtc m_crtc;
+ supermac_spec_shift_reg m_shiftreg;
+
+ std::vector<uint32_t> m_vram;
+ uint32_t m_mode, m_vbl_disable;
+ uint32_t m_colors[3], m_count, m_clutoffs;
+
+ uint8_t m_osc;
+ bool m_interlace;
+
+ uint16_t m_hpan, m_vpan;
+ uint8_t m_zoom;
+
+ bool m_vbl_pending;
+};
+
+
+INPUT_PORTS_START( spec8s3 )
PORT_START("USEROSC")
PORT_CONFNAME(0x07, 0x01, "Oscillator Y1")
PORT_CONFSETTING( 0x00, "14.32 MHz (NTSC Underscan)")
@@ -83,13 +148,6 @@ ROM_START( spec8s3 )
ROM_END
-//**************************************************************************
-// GLOBAL VARIABLES
-//**************************************************************************
-
-DEFINE_DEVICE_TYPE(NUBUS_SPEC8S3, nubus_spec8s3_device, "nb_sp8s3", "SuperMac Spectrum/8 Series III video card")
-
-
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
@@ -565,3 +623,12 @@ uint32_t nubus_spec8s3_device::vram_r(offs_t offset, uint32_t mem_mask)
{
return m_vram[offset] ^ 0xffffffff;
}
+
+} // anonymous namespace
+
+
+//**************************************************************************
+// DEVICE TYPE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE_PRIVATE(NUBUS_SPEC8S3, device_nubus_card_interface, nubus_spec8s3_device, "nb_sp8s3", "SuperMac Spectrum/8 Series III video card")
diff --git a/src/devices/bus/nubus/nubus_spec8.h b/src/devices/bus/nubus/nubus_spec8.h
index bf6fd253fcb..4e776d90e33 100644
--- a/src/devices/bus/nubus/nubus_spec8.h
+++ b/src/devices/bus/nubus/nubus_spec8.h
@@ -6,71 +6,8 @@
#pragma once
#include "nubus.h"
-#include "supermac.h"
-
-
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-class nubus_spec8s3_device :
- public device_t,
- public device_nubus_card_interface,
- public device_video_interface,
- public device_palette_interface
-{
-public:
- // construction/destruction
- nubus_spec8s3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
-protected:
- nubus_spec8s3_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
-
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
-
- // optional information overrides
- virtual void device_add_mconfig(machine_config &config) override;
- virtual const tiny_rom_entry *device_rom_region() const override;
- virtual ioport_constructor device_input_ports() const override;
-
- // palette implementation
- virtual uint32_t palette_entries() const override;
-
- TIMER_CALLBACK_MEMBER(vbl_tick);
-
-private:
- uint32_t spec8s3_r(offs_t offset, uint32_t mem_mask = ~0);
- void spec8s3_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
- uint32_t vram_r(offs_t offset, uint32_t mem_mask = ~0);
- void vram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
-
- void update_crtc();
-
- uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
-
- required_ioport m_userosc;
- emu_timer *m_timer;
-
- supermac_spec_crtc m_crtc;
- supermac_spec_shift_reg m_shiftreg;
-
- std::vector<uint32_t> m_vram;
- uint32_t m_mode, m_vbl_disable;
- uint32_t m_colors[3], m_count, m_clutoffs;
-
- uint8_t m_osc;
- bool m_interlace;
-
- uint16_t m_hpan, m_vpan;
- uint8_t m_zoom;
-
- bool m_vbl_pending;
-};
-
// device type definition
-DECLARE_DEVICE_TYPE(NUBUS_SPEC8S3, nubus_spec8s3_device)
+DECLARE_DEVICE_TYPE(NUBUS_SPEC8S3, device_nubus_card_interface)
#endif // MAME_BUS_NUBUS_NUBUS_SPEC8_H
diff --git a/src/devices/bus/nubus/nubus_specpdq.cpp b/src/devices/bus/nubus/nubus_specpdq.cpp
index 33a3c5a3e42..b98dd941318 100644
--- a/src/devices/bus/nubus/nubus_specpdq.cpp
+++ b/src/devices/bus/nubus/nubus_specpdq.cpp
@@ -32,6 +32,8 @@
#include "emu.h"
#include "nubus_specpdq.h"
+#include "supermac.h"
+
#include "layout/generic.h"
#include "screen.h"
@@ -47,7 +49,79 @@
#define VRAM_SIZE (0x40'0000)
-static INPUT_PORTS_START( specpdq )
+namespace {
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class nubus_specpdq_device :
+ public device_t,
+ public device_nubus_card_interface,
+ public device_video_interface,
+ public device_palette_interface
+{
+public:
+ // construction/destruction
+ nubus_specpdq_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ nubus_specpdq_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual ioport_constructor device_input_ports() const override;
+
+ // palette implementation
+ virtual uint32_t palette_entries() const override;
+
+ TIMER_CALLBACK_MEMBER(vbl_tick);
+
+private:
+ uint32_t specpdq_r(offs_t offset, uint32_t mem_mask = ~0);
+ void specpdq_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+ uint32_t vram_r(offs_t offset, uint32_t mem_mask = ~0);
+ void vram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+
+ void blitter_pattern_fill();
+ void blitter_copy_forward();
+ void blitter_copy_backward();
+
+ void update_crtc();
+
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ required_ioport m_userosc;
+ emu_timer *m_timer;
+
+ supermac_spec_crtc m_crtc;
+ supermac_spec_shift_reg m_shiftreg;
+
+ std::vector<uint32_t> m_vram;
+ uint32_t m_mode, m_vbl_disable;
+ uint32_t m_colors[3], m_count, m_clutoffs;
+
+ uint16_t m_stride;
+ uint16_t m_vint;
+ uint8_t m_hdelay;
+ uint8_t m_osc;
+
+ uint16_t m_blit_stride;
+ uint32_t m_blit_src, m_blit_dst;
+ uint32_t m_blit_width, m_blit_height;
+ uint8_t m_blit_patoffs;
+ uint32_t m_blit_pat[64];
+
+ uint32_t m_7xxxxx_regs[0x100000 / 4];
+};
+
+
+INPUT_PORTS_START( specpdq )
PORT_START("USEROSC")
PORT_CONFNAME(0x07, 0x00, "Alternate oscillator")
PORT_CONFSETTING( 0x00, "55.00 MHz (SuperMac 16\")")
@@ -60,12 +134,6 @@ ROM_START( specpdq )
ROM_LOAD( "specpdq.bin", 0x000000, 0x010000, CRC(82a35f78) SHA1(9511c2df47140f4279196d3b8836b53429879dd9) )
ROM_END
-//**************************************************************************
-// GLOBAL VARIABLES
-//**************************************************************************
-
-DEFINE_DEVICE_TYPE(NUBUS_SPECPDQ, nubus_specpdq_device, "nb_spdq", "SuperMac Spectrum PDQ video card")
-
//-------------------------------------------------
// device_add_mconfig - add device configuration
@@ -663,3 +731,12 @@ void nubus_specpdq_device::blitter_copy_backward()
}
}
}
+
+} // anonymous namespace
+
+
+//**************************************************************************
+// DEVICE TYPE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE_PRIVATE(NUBUS_SPECPDQ, device_nubus_card_interface, nubus_specpdq_device, "nb_spdq", "SuperMac Spectrum PDQ video card")
diff --git a/src/devices/bus/nubus/nubus_specpdq.h b/src/devices/bus/nubus/nubus_specpdq.h
index 62b24c062b5..01472da292e 100644
--- a/src/devices/bus/nubus/nubus_specpdq.h
+++ b/src/devices/bus/nubus/nubus_specpdq.h
@@ -6,80 +6,8 @@
#pragma once
#include "nubus.h"
-#include "supermac.h"
-
-
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-class nubus_specpdq_device :
- public device_t,
- public device_nubus_card_interface,
- public device_video_interface,
- public device_palette_interface
-{
-public:
- // construction/destruction
- nubus_specpdq_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
-protected:
- nubus_specpdq_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
-
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
-
- // optional information overrides
- virtual void device_add_mconfig(machine_config &config) override;
- virtual const tiny_rom_entry *device_rom_region() const override;
- virtual ioport_constructor device_input_ports() const override;
-
- // palette implementation
- virtual uint32_t palette_entries() const override;
-
- TIMER_CALLBACK_MEMBER(vbl_tick);
-
-private:
- uint32_t specpdq_r(offs_t offset, uint32_t mem_mask = ~0);
- void specpdq_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
- uint32_t vram_r(offs_t offset, uint32_t mem_mask = ~0);
- void vram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
-
- void blitter_pattern_fill();
- void blitter_copy_forward();
- void blitter_copy_backward();
-
- void update_crtc();
-
- uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
-
- required_ioport m_userosc;
- emu_timer *m_timer;
-
- supermac_spec_crtc m_crtc;
- supermac_spec_shift_reg m_shiftreg;
-
- std::vector<uint32_t> m_vram;
- uint32_t m_mode, m_vbl_disable;
- uint32_t m_colors[3], m_count, m_clutoffs;
-
- uint16_t m_stride;
- uint16_t m_vint;
- uint8_t m_hdelay;
- uint8_t m_osc;
-
- uint16_t m_blit_stride;
- uint32_t m_blit_src, m_blit_dst;
- uint32_t m_blit_width, m_blit_height;
- uint8_t m_blit_patoffs;
- uint32_t m_blit_pat[64];
-
- uint32_t m_7xxxxx_regs[0x100000 / 4];
-};
-
// device type definition
-DECLARE_DEVICE_TYPE(NUBUS_SPECPDQ, nubus_specpdq_device)
+DECLARE_DEVICE_TYPE(NUBUS_SPECPDQ, device_nubus_card_interface)
#endif // MAME_BUS_NUBUS_NUBUS_SPECPDQ_H
diff --git a/src/mame/drivers/mac.cpp b/src/mame/drivers/mac.cpp
index e22f94a3105..18d6a0198fa 100644
--- a/src/mame/drivers/mac.cpp
+++ b/src/mame/drivers/mac.cpp
@@ -17,6 +17,7 @@
#include "machine/macadb.h"
#include "bus/nscsi/devices.h"
+#include "bus/nubus/cards.h"
#include "cpu/m68000/m68000.h"
#include "cpu/m6805/m6805.h"
#include "machine/applepic.h"
@@ -24,27 +25,6 @@
#include "machine/swim1.h"
#include "machine/swim2.h"
-// NuBus and 030/040 PDS cards
-#include "bus/nubus/nubus_48gc.h"
-#include "bus/nubus/nubus_cb264.h"
-#include "bus/nubus/nubus_vikbw.h"
-#include "bus/nubus/nubus_specpdq.h"
-#include "bus/nubus/nubus_m2hires.h"
-#include "bus/nubus/nubus_spec8.h"
-#include "bus/nubus/nubus_radiustpd.h"
-#include "bus/nubus/nubus_wsportrait.h"
-#include "bus/nubus/nubus_asntmc3b.h"
-#include "bus/nubus/nubus_image.h"
-#include "bus/nubus/nubus_m2video.h"
-#include "bus/nubus/bootbug.h"
-#include "bus/nubus/quadralink.h"
-#include "bus/nubus/laserview.h"
-#include "bus/nubus/pds30_cb264.h"
-#include "bus/nubus/pds30_procolor816.h"
-#include "bus/nubus/pds30_sigmalview.h"
-#include "bus/nubus/pds30_30hr.h"
-#include "bus/nubus/pds30_mc30.h"
-
#include "layout/generic.h"
#include "softlist_dev.h"
#include "speaker.h"
@@ -596,36 +576,6 @@ void mac_state::maciifx_map(address_map &map)
DEVICE CONFIG
***************************************************************************/
-static void mac_nubus_cards(device_slot_interface &device)
-{
- device.option_add("m2video", NUBUS_M2VIDEO); /* Apple Macintosh II Video Card */
- device.option_add("48gc", NUBUS_48GC); /* Apple 4*8 Graphics Card */
- device.option_add("824gc", NUBUS_824GC); /* Apple 8*24 Graphics Card */
- device.option_add("cb264", NUBUS_CB264); /* RasterOps ColorBoard 264 */
- device.option_add("vikbw", NUBUS_VIKBW); /* Moniterm Viking board */
- device.option_add("image", NUBUS_IMAGE); /* Disk Image Pseudo-Card */
- device.option_add("specpdq", NUBUS_SPECPDQ); /* SuperMac Spectrum PDQ */
- device.option_add("m2hires", NUBUS_M2HIRES); /* Apple Macintosh II Hi-Resolution Card */
- device.option_add("spec8s3", NUBUS_SPEC8S3); /* SuperMac Spectrum/8 Series III */
-// device.option_add("thundergx", NUBUS_THUNDERGX); /* Radius Thunder GX (not yet) */
- device.option_add("radiustpd", NUBUS_RADIUSTPD); /* Radius Two Page Display */
- device.option_add("asmc3nb", NUBUS_ASNTMC3NB); /* Asante MC3NB Ethernet card */
- device.option_add("portrait", NUBUS_WSPORTRAIT); /* Apple Macintosh II Portrait video card */
- device.option_add("enetnb", NUBUS_APPLEENET); /* Apple NuBus Ethernet */
- device.option_add("bootbug", NUBUS_BOOTBUG); /* Brigent BootBug debugger card */
- device.option_add("quadralink", NUBUS_QUADRALINK); /* AE Quadralink serial card */
- device.option_add("laserview", NUBUS_LASERVIEW); /* Sigma Designs LaserView monochrome video card */
-}
-
-static void mac_pds030_cards(device_slot_interface &device)
-{
- device.option_add("cb264", PDS030_CB264SE30); // RasterOps Colorboard 264/SE30
- device.option_add("pc816", PDS030_PROCOLOR816); // Lapis ProColor Server 8*16 PDS
- device.option_add("lview", PDS030_LVIEW); // Sigma Designs L-View
- device.option_add("30hr", PDS030_XCEED30HR); // Micron/XCEED Technology Color 30HR
- device.option_add("mc30", PDS030_XCEEDMC30); // Micron/XCEED Technology MacroColor 30
-}
-
static void mac_lcpds_cards(device_slot_interface &device)
{
}
diff --git a/src/mame/drivers/macquadra700.cpp b/src/mame/drivers/macquadra700.cpp
index 84d2c23e2d2..41a2185aaa7 100644
--- a/src/mame/drivers/macquadra700.cpp
+++ b/src/mame/drivers/macquadra700.cpp
@@ -12,43 +12,30 @@
#include "emu.h"
#include "machine/macrtc.h"
+
+#include "bus/nscsi/devices.h"
+#include "bus/nubus/cards.h"
+#include "bus/nubus/nubus.h"
#include "cpu/m68000/m68000.h"
#include "machine/6522via.h"
-#include "machine/ram.h"
-#include "machine/timer.h"
-#include "machine/z80scc.h"
-#include "machine/macadb.h"
#include "machine/applefdintf.h"
-#include "machine/swim1.h"
#include "machine/dp83932c.h"
-#include "machine/nscsi_bus.h"
+#include "machine/macadb.h"
#include "machine/ncr5390.h"
+#include "machine/nscsi_bus.h"
+#include "machine/ram.h"
+#include "machine/swim1.h"
+#include "machine/timer.h"
+#include "machine/z80scc.h"
#include "sound/asc.h"
-#include "formats/ap_dsk35.h"
-
-#include "bus/nscsi/devices.h"
-
-#include "bus/nubus/nubus.h"
-#include "bus/nubus/nubus_48gc.h"
-#include "bus/nubus/nubus_cb264.h"
-#include "bus/nubus/nubus_vikbw.h"
-#include "bus/nubus/nubus_specpdq.h"
-#include "bus/nubus/nubus_m2hires.h"
-#include "bus/nubus/nubus_spec8.h"
-#include "bus/nubus/nubus_radiustpd.h"
-#include "bus/nubus/nubus_wsportrait.h"
-#include "bus/nubus/nubus_asntmc3b.h"
-#include "bus/nubus/nubus_image.h"
-#include "bus/nubus/nubus_m2video.h"
-#include "bus/nubus/bootbug.h"
-#include "bus/nubus/quadralink.h"
-#include "bus/nubus/laserview.h"
#include "emupal.h"
#include "screen.h"
#include "softlist_dev.h"
#include "speaker.h"
+#include "formats/ap_dsk35.h"
+
#define C7M (7833600)
#define C15M (C7M*2)
#define C32M (C15M*2)
@@ -934,27 +921,6 @@ INPUT_PORTS_END
MACHINE DRIVERS
***************************************************************************/
-static void mac_nubus_cards(device_slot_interface &device)
-{
- device.option_add("m2video", NUBUS_M2VIDEO); /* Apple Macintosh II Video Card */
- device.option_add("48gc", NUBUS_48GC); /* Apple 4*8 Graphics Card */
- device.option_add("824gc", NUBUS_824GC); /* Apple 8*24 Graphics Card */
- device.option_add("cb264", NUBUS_CB264); /* RasterOps ColorBoard 264 */
- device.option_add("vikbw", NUBUS_VIKBW); /* Moniterm Viking board */
- device.option_add("image", NUBUS_IMAGE); /* Disk Image Pseudo-Card */
- device.option_add("specpdq", NUBUS_SPECPDQ); /* SuperMac Spectrum PDQ */
- device.option_add("m2hires", NUBUS_M2HIRES); /* Apple Macintosh II Hi-Resolution Card */
- device.option_add("spec8s3", NUBUS_SPEC8S3); /* SuperMac Spectrum/8 Series III */
-// device.option_add("thundergx", NUBUS_THUNDERGX); /* Radius Thunder GX (not yet) */
- device.option_add("radiustpd", NUBUS_RADIUSTPD); /* Radius Two Page Display */
- device.option_add("asmc3nb", NUBUS_ASNTMC3NB); /* Asante MC3NB Ethernet card */
- device.option_add("portrait", NUBUS_WSPORTRAIT); /* Apple Macintosh II Portrait video card */
- device.option_add("enetnb", NUBUS_APPLEENET); /* Apple NuBus Ethernet */
- device.option_add("bootbug", NUBUS_BOOTBUG); /* Brigent BootBug debugger card */
- device.option_add("quadralink", NUBUS_QUADRALINK); /* AE Quadralink serial card */
- device.option_add("laserview", NUBUS_LASERVIEW); /* Sigma Designs LaserView monochrome video card */
-}
-
void macquadra_state::macqd700(machine_config &config)
{
/* basic machine hardware */