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.
This commit is contained in:
Vas Crabb 2022-06-25 10:25:22 +10:00
parent a8b6bdfcac
commit 38fed2ff78
15 changed files with 586 additions and 605 deletions

View File

@ -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",

View File

@ -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)

View File

@ -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;

View File

@ -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
}

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -5,8 +5,12 @@
Apple Macitosh Display Card 48 (model 630-0400)
Apple Macitosh Display Card 824
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 48 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 824 defaults to the
Page-White Gamma profile for the 21" and 16" color monitors, which
@ -14,9 +18,7 @@
Uncorrected Gamma profile if you dont 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<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;
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;
}
}
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<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")

View File

@ -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

View File

@ -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")

View File

@ -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

View File

@ -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")

View File

@ -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

View File

@ -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)
{
}

View File

@ -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 */