summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/apple/dafb.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/apple/dafb.h')
-rw-r--r--src/mame/apple/dafb.h196
1 files changed, 196 insertions, 0 deletions
diff --git a/src/mame/apple/dafb.h b/src/mame/apple/dafb.h
new file mode 100644
index 00000000000..8caa339bb5e
--- /dev/null
+++ b/src/mame/apple/dafb.h
@@ -0,0 +1,196 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+
+#ifndef MAME_APPLE_DAFB_H
+#define MAME_APPLE_DAFB_H
+
+#pragma once
+
+#include "cpu/m68000/m68040.h"
+#include "machine/ncr53c90.h"
+
+#include "emupal.h"
+#include "screen.h"
+
+class dafb_base : public device_t
+{
+public:
+ dafb_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+ virtual ~dafb_base() = default;
+
+ void map(address_map &map) ATTR_COLD;
+
+ u32 vram_r(offs_t offset);
+ void vram_w(offs_t offset, u32 data, u32 mem_mask);
+
+ auto dafb_irq() { return m_irq.bind(); }
+
+ u32 dafb_r(offs_t offset);
+ void dafb_w(offs_t offset, u32 data);
+ u32 swatch_r(offs_t offset);
+ void swatch_w(offs_t offset, u32 data);
+ virtual u32 ramdac_r(offs_t offset);
+ virtual void ramdac_w(offs_t offset, u32 data);
+ virtual u8 clockgen_r(offs_t offset);
+ virtual void clockgen_w(offs_t offset, u8 data);
+
+protected:
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+ virtual ioport_constructor device_input_ports() const override ATTR_COLD;
+
+ void recalc_ints();
+ void recalc_mode();
+
+ u16 m_scsi_ctrl[2];
+ int m_drq[2];
+ int m_scsi_read_cycles[2], m_scsi_write_cycles[2], m_scsi_dma_read_cycles[2], m_scsi_dma_write_cycles[2];
+ u32 m_vram_size;
+ int m_dafb_version;
+ u32 m_pixel_clock;
+
+ u8 m_pal_address, m_pal_idx, m_ac842_pbctrl, m_mode;
+
+private:
+ required_device<screen_device> m_screen;
+ required_device<palette_device> m_palette;
+ required_ioport m_monitor_config;
+ devcb_write_line m_irq;
+
+ enum
+ {
+ HSERR = 0,
+ HLFLN,
+ HEQ,
+ HSP,
+ HBWAY,
+ HBRST,
+ HBP,
+ HAL,
+ HFP,
+ HPIX
+ };
+
+ enum
+ {
+ VHLINE = 0,
+ VSYNC,
+ VBPEQ,
+ VBP,
+ VAL,
+ VFP,
+ VFPEQ
+ };
+
+ std::unique_ptr<u32[]> m_vram;
+ emu_timer *m_vbl_timer, *m_cursor_timer;
+ u32 m_vram_offset;
+ u8 m_timing_control, m_monitor_id;
+ u32 m_base, m_stride, m_test;
+ u32 m_horizontal_params[10], m_vertical_params[7];
+ u8 m_swatch_mode;
+ u16 m_cursor_line, m_anim_line;
+ s32 m_int_status;
+ u8 m_dp8531_regs[16];
+ u32 m_hres, m_vres, m_htotal, m_vtotal, m_config, m_block_control, m_swatch_test;
+
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ TIMER_CALLBACK_MEMBER(vbl_tick);
+ TIMER_CALLBACK_MEMBER(cursor_tick);
+};
+
+// Discrete DAFB II: Quadra 950, includes "TurboSCSI"
+class dafb_device: public dafb_base
+{
+public:
+ dafb_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+ template <typename... T> void set_maincpu_tag(T &&... args) { m_maincpu.set_tag(std::forward<T>(args)...); }
+
+ void set_turboscsi1_device(ncr53c94_device *device) { m_ncr[0] = device; }
+ void set_turboscsi2_device(ncr53c94_device *device) { m_ncr[1] = device; }
+
+ template <int bus> void turboscsi_drq_w(int state);
+
+ template <int bus> u8 turboscsi_r(offs_t offset);
+ template <int bus> void turboscsi_w(offs_t offset, u8 data);
+ template <int bus> u16 turboscsi_dma_r(offs_t offset, u16 mem_mask);
+ template <int bus> void turboscsi_dma_w(offs_t offset, u16 data, u16 mem_mask);
+
+protected:
+ dafb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ virtual void device_start() override ATTR_COLD;
+
+private:
+ required_device<m68000_musashi_device> m_maincpu;
+ ncr53c94_device *m_ncr[2];
+};
+
+class dafb_q950_device : public dafb_device
+{
+public:
+ dafb_q950_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+protected:
+ virtual void device_start() override ATTR_COLD;
+ virtual ioport_constructor device_input_ports() const override ATTR_COLD;
+
+ virtual u32 ramdac_r(offs_t offset) override;
+ virtual void ramdac_w(offs_t offset, u32 data) override;
+
+private:
+ u8 m_pcbr1;
+};
+
+class dafb_memc_device: public dafb_base
+{
+public:
+ dafb_memc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+protected:
+ virtual void device_start() override ATTR_COLD;
+ virtual ioport_constructor device_input_ports() const override ATTR_COLD;
+
+ virtual u8 clockgen_r(offs_t offset) override;
+ virtual void clockgen_w(offs_t offset, u8 data) override;
+ virtual u32 ramdac_r(offs_t offset) override;
+ virtual void ramdac_w(offs_t offset, u32 data) override;
+
+private:
+ u8 m_pcbr1;
+ u64 m_clock_shift;
+ u64 m_clock_params;
+};
+
+class dafb_memcjr_device: public dafb_base
+{
+public:
+ dafb_memcjr_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+protected:
+ virtual void device_start() override ATTR_COLD;
+ virtual ioport_constructor device_input_ports() const override ATTR_COLD;
+
+ virtual u8 clockgen_r(offs_t offset) override;
+ virtual void clockgen_w(offs_t offset, u8 data) override;
+ virtual u32 ramdac_r(offs_t offset) override;
+ virtual void ramdac_w(offs_t offset, u32 data) override;
+
+private:
+ u8 m_pcbr1;
+ u8 m_last_clock;
+ u32 m_clock_shift;
+ s32 m_bit_clock;
+ u8 m_M, m_N, m_P;
+ u32 m_mclk, m_pclk;
+};
+
+DECLARE_DEVICE_TYPE(DAFB, dafb_device)
+DECLARE_DEVICE_TYPE(DAFB_Q950, dafb_q950_device)
+DECLARE_DEVICE_TYPE(DAFB_MEMC, dafb_memc_device)
+DECLARE_DEVICE_TYPE(DAFB_MEMCJR, dafb_memcjr_device)
+
+#endif /* MAME_APPLE_DAFB_H */