blob: 233646d05babd1a2a940a9b74b437353cc7c6d03 (
plain) (
tree)
|
|
// license:BSD-3-Clause
// copyright-holders:Barry Rodewald,Carl
#ifndef MAME_VIDEO_X68K_CRTC_H
#define MAME_VIDEO_X68K_CRTC_H
class x68k_crtc_device : public device_t, public device_video_interface
{
public:
// device callback configuration
auto vdisp_cb() { return m_vdisp_callback.bind(); }
auto rint_cb() { return m_rint_callback.bind(); }
auto hsync_cb() { return m_hsync_callback.bind(); }
auto tvram_read_cb() { return m_tvram_read_callback.bind(); }
auto tvram_write_cb() { return m_tvram_write_callback.bind(); }
auto gvram_read_cb() { return m_gvram_read_callback.bind(); }
auto gvram_write_cb() { return m_gvram_write_callback.bind(); }
// clock configuration
void set_clock_69m(uint32_t clock) { m_clock_69m = clock; }
void set_clock_69m(const XTAL &xtal) { set_clock_69m(xtal.value()); }
void set_clock_50m(uint32_t clock) { m_clock_50m = clock; }
void set_clock_50m(const XTAL &xtal) { set_clock_50m(xtal.value()); }
u32 clock_39m() const { return clock(); }
u32 clock_69m() const { return m_clock_69m; }
u32 clock_50m() const { return m_clock_50m; }
DECLARE_WRITE16_MEMBER(crtc_w);
DECLARE_READ16_MEMBER(crtc_r);
DECLARE_WRITE16_MEMBER(gvram_w);
DECLARE_READ16_MEMBER(gvram_r);
DECLARE_WRITE16_MEMBER(tvram_w);
DECLARE_READ16_MEMBER(tvram_r);
// getters
u16 xscr_text() const { return m_reg[10]; }
u16 yscr_text() const { return m_reg[11]; }
u16 xscr_gfx(int page) const { return m_reg[12 + page * 2]; }
u16 yscr_gfx(int page) const { return m_reg[13 + page * 2]; }
u8 vfactor() const { return (m_reg[20] & 0x0c) >> 2; }
bool is_1024x1024() const { return BIT(m_reg[20], 10); }
bool gfx_layer_buffer() const { return BIT(m_reg[20], 11); }
bool text_layer_buffer() const { return BIT(m_reg[20], 12); }
u16 hbegin() const { return m_hbegin; }
u16 vbegin() const { return m_vbegin; }
u16 hend() const { return m_hend; }
u16 vend() const { return m_vend; }
u16 visible_height() const { return m_visible_height; }
u16 visible_width() const { return m_visible_width; }
u16 hshift() const { return m_hshift; }
u16 vshift() const { return m_vshift; }
protected:
// base constructor
x68k_crtc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
// device-specific overrides
virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
private:
// internal helpers
void text_copy(unsigned src, unsigned dest, u8 planes);
TIMER_CALLBACK_MEMBER(operation_end);
void refresh_mode();
TIMER_CALLBACK_MEMBER(hsync);
TIMER_CALLBACK_MEMBER(raster_end);
TIMER_CALLBACK_MEMBER(raster_irq);
TIMER_CALLBACK_MEMBER(vblank_irq);
// device callbacks
devcb_write_line m_vdisp_callback;
devcb_write_line m_rint_callback;
devcb_write_line m_hsync_callback;
devcb_read16 m_tvram_read_callback;
devcb_read16 m_gvram_read_callback;
devcb_write16 m_tvram_write_callback;
devcb_write16 m_gvram_write_callback;
// software-selectable oscillators
u32 m_clock_69m;
u32 m_clock_50m;
// internal state
u16 m_reg[24]; // registers
u8 m_operation; // operation port (0xe80481)
bool m_vblank; // true if in VBlank
bool m_hblank; // true if in HBlank
u16 m_htotal; // Horizontal Total (in characters)
u16 m_vtotal; // Vertical Total
u16 m_hbegin; // Horizontal Begin
u16 m_vbegin; // Vertical Begin
u16 m_hend; // Horizontal End
u16 m_vend; // Vertical End
u16 m_hsync_end; // Horizontal Sync End
u16 m_vsync_end; // Vertical Sync End
u16 m_hsyncadjust; // Horizontal Sync Adjustment
//float m_hmultiple; // Horizontal pixel multiplier
float m_vmultiple; // Vertical scanline multiplier (x2 for doublescan modes)
u16 m_height;
u16 m_width;
u16 m_visible_height;
u16 m_visible_width;
u16 m_hshift;
u16 m_vshift;
//u16 m_video_width; // horizontal total (in pixels)
//u16 m_video_height; // vertical total
bool m_interlace; // 1024 vertical resolution is interlaced
//u16 m_scanline;
bool m_oddscanline;
emu_timer *m_scanline_timer;
emu_timer *m_raster_irq_timer;
emu_timer *m_vblank_irq_timer;
emu_timer *m_raster_end_timer;
emu_timer *m_operation_end_timer;
};
class vinas_device : public x68k_crtc_device
{
public:
vinas_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class vicon_device : public x68k_crtc_device
{
public:
vicon_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
// device type definitions
DECLARE_DEVICE_TYPE(VINAS, vinas_device)
DECLARE_DEVICE_TYPE(VICON, vicon_device)
#endif // MAME_VIDEO_X68K_CRTC_H
|