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 void nubus_device::install_device(offs_t start, offs_t end, R rhandler, W whandler, uint32_t mask) +template +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 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(offs_t start, offs_t end, read32sm_delegate rhandler, write32sm_delegate whandler, uint32_t mask); template void nubus_device::install_device(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 +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(offs_t start, offs_t end, read8_delegate rhandler, uint32_t mask); +template void nubus_device::install_readonly_device(offs_t start, offs_t end, read8s_delegate rhandler, uint32_t mask); +template void nubus_device::install_readonly_device(offs_t start, offs_t end, read8sm_delegate rhandler, uint32_t mask); +template void nubus_device::install_readonly_device(offs_t start, offs_t end, read8smo_delegate rhandler, uint32_t mask); +template void nubus_device::install_readonly_device(offs_t start, offs_t end, read16_delegate rhandler, uint32_t mask); +template void nubus_device::install_readonly_device(offs_t start, offs_t end, read16s_delegate rhandler, uint32_t mask); +template void nubus_device::install_readonly_device(offs_t start, offs_t end, read16sm_delegate rhandler, uint32_t mask); +template void nubus_device::install_readonly_device(offs_t start, offs_t end, read16smo_delegate rhandler, uint32_t mask); +template void nubus_device::install_readonly_device(offs_t start, offs_t end, read32_delegate rhandler, uint32_t mask); +template void nubus_device::install_readonly_device(offs_t start, offs_t end, read32s_delegate rhandler, uint32_t mask); +template void nubus_device::install_readonly_device(offs_t start, offs_t end, read32sm_delegate rhandler, uint32_t mask); +template void nubus_device::install_readonly_device(offs_t start, offs_t end, read32smo_delegate rhandler, uint32_t mask); + +template +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(offs_t start, offs_t end, write8_delegate whandler, uint32_t mask); +template void nubus_device::install_writeonly_device(offs_t start, offs_t end, write8s_delegate whandler, uint32_t mask); +template void nubus_device::install_writeonly_device(offs_t start, offs_t end, write8sm_delegate whandler, uint32_t mask); +template void nubus_device::install_writeonly_device(offs_t start, offs_t end, write8smo_delegate whandler, uint32_t mask); +template void nubus_device::install_writeonly_device(offs_t start, offs_t end, write16_delegate whandler, uint32_t mask); +template void nubus_device::install_writeonly_device(offs_t start, offs_t end, write16s_delegate whandler, uint32_t mask); +template void nubus_device::install_writeonly_device(offs_t start, offs_t end, write16sm_delegate whandler, uint32_t mask); +template void nubus_device::install_writeonly_device(offs_t start, offs_t end, write16smo_delegate whandler, uint32_t mask); +template void nubus_device::install_writeonly_device(offs_t start, offs_t end, write32_delegate whandler, uint32_t mask); +template void nubus_device::install_writeonly_device(offs_t start, offs_t end, write32s_delegate whandler, uint32_t mask); +template void nubus_device::install_writeonly_device(offs_t start, offs_t end, write32sm_delegate whandler, uint32_t mask); +template void nubus_device::install_writeonly_device(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 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 void install_device(offs_t start, offs_t end, R rhandler, W whandler, uint32_t mask=0xffffffff); + template void install_readonly_device(offs_t start, offs_t end, R rhandler, uint32_t mask=0xffffffff); + template 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 { -static INPUT_PORTS_START( 48gc ) +//************************************************************************** +// 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 m_vram; + uint32_t m_vbl_disable, m_toggle; + 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: + // 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(&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; } + } - case 0x1c0/4: + 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); + + 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,95 +598,133 @@ 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) + case 0x48/4: // write here to clear interrupt + lower_slot_irq(); + break; + } +} + +void jmfb_device::ramdac_w(offs_t offset, uint32_t data, uint32_t mem_mask) +{ + switch (offset) + { + 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 0x04/4: // CLUT data + m_colors[m_count++] = data & 0xff; + if (m_count == 3) { - lower_slot_irq(); + 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 0x300/4: - case 0x304/4: - case 0x308/4: - case 0x30c/4: + 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; + } +} + +void jmfb_device::clkgen_w(offs_t offset, uint32_t data, uint32_t mem_mask) +{ + switch (offset) + { + 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 0x310/4: - case 0x314/4: - case 0x318/4: + 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); @@ -624,88 +732,14 @@ void jmfb_device::jmfb_w(offs_t offset, uint32_t data, uint32_t mem_mask) update_crtc(); break; - case 0x324/4: + case 0x24/4: LOG("%s: 1<<%d to pixel cell divider\n", machine().describe_context(), data); m_pdiv = data & 0x0f; update_crtc(); break; - - default: - break; } } -void nubus_48gc_device::mac_48gc_w(offs_t offset, uint32_t data, uint32_t mem_mask) -{ - switch (offset) - { - case 0x200/4: // DAC control - dac_ctrl_w(data >> 24); - break; - - case 0x204/4: // DAC data - dac_data_w(data >> 24); - break; - - case 0x208/4: // mode control - mode_w(data, !((data >> 5) & 0x3)); - 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) -{ - switch (offset) - { - case 0x200/4: // DAC control - dac_ctrl_w(data & 0xff); - break; - - case 0x204/4: // DAC data - dac_data_w(data & 0xff); - break; - - case 0x208/4: // mode control - mode_w(data, BIT(data, 1)); - 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(&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 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 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 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 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 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 "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/ncr5390.h" -#include "sound/asc.h" -#include "formats/ap_dsk35.h" #include "bus/nscsi/devices.h" - +#include "bus/nubus/cards.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 "cpu/m68000/m68000.h" +#include "machine/6522via.h" +#include "machine/applefdintf.h" +#include "machine/dp83932c.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 "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 */