summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/video/bt459.h
blob: 03f7d35a405141bde490be0478d57e6189b90a0e (plain) (tree)


















                                                                                                      

































































































































































                                                                    
                                   
 











                                                                                                                                
                                                                                  
 








                                            
































                                                    

                          




                                        
// license:BSD-3-Clause
// copyright-holders:Patrick Mackinlay
#ifndef MAME_VIDEO_BT459_H
#define MAME_VIDEO_BT459_H

#pragma once

class bt459_device : public device_t, public device_palette_interface
{
public:
	bt459_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	static const u8 BT459_ID  = 0x4a; // magic number found in the id register
	static const u8 BT459_REV = 0xb0; // device revision B found in revision register

	static const int BT459_PIXEL_COLORS   = 256;
	static const int BT459_OVERLAY_COLORS = 16;
	static const int BT459_CURSOR_COLORS  = 3;

	enum address_mask
	{
		REG_OVERLAY_COLOR_0    = 0x0100,
		REG_OVERLAY_COLOR_1    = 0x0101,
		REG_OVERLAY_COLOR_2    = 0x0102,
		REG_OVERLAY_COLOR_3    = 0x0103,
		REG_OVERLAY_COLOR_4    = 0x0104,
		REG_OVERLAY_COLOR_5    = 0x0105,
		REG_OVERLAY_COLOR_6    = 0x0106,
		REG_OVERLAY_COLOR_7    = 0x0107,
		REG_OVERLAY_COLOR_8    = 0x0108,
		REG_OVERLAY_COLOR_9    = 0x0109,
		REG_OVERLAY_COLOR_10   = 0x010a,
		REG_OVERLAY_COLOR_11   = 0x010b,
		REG_OVERLAY_COLOR_12   = 0x010c,
		REG_OVERLAY_COLOR_13   = 0x010d,
		REG_OVERLAY_COLOR_14   = 0x010e,
		REG_OVERLAY_COLOR_15   = 0x010f,

		REG_CURSOR_COLOR_1     = 0x0181,
		REG_CURSOR_COLOR_2     = 0x0182,
		REG_CURSOR_COLOR_3     = 0x0183,

		REG_ID                 = 0x0200,
		REG_COMMAND_0          = 0x0201,
		REG_COMMAND_1          = 0x0202,
		REG_COMMAND_2          = 0x0203,
		REG_PIXEL_READ_MASK    = 0x0204,

		REG_PIXEL_BLINK_MASK   = 0x0206,

		REG_OVERLAY_READ_MASK  = 0x0208,
		REG_OVERLAY_BLINK_MASK = 0x0209,
		REG_INTERLEAVE         = 0x020a,
		REG_TEST               = 0x020b,
		REG_RED_SIGNATURE      = 0x020c,
		REG_GREEN_SIGNATURE    = 0x020d,
		REG_BLUE_SIGNATURE     = 0x020e,

		REG_REVISION           = 0x0220,

		REG_CURSOR_COMMAND     = 0x0300,
		REG_CURSOR_X_LO        = 0x0301,
		REG_CURSOR_X_HI        = 0x0302,
		REG_CURSOR_Y_LO        = 0x0303,
		REG_CURSOR_Y_HI        = 0x0304,
		REG_WINDOW_X_LO        = 0x0305,
		REG_WINDOW_X_HI        = 0x0306,
		REG_WINDOW_Y_LO        = 0x0307,
		REG_WINDOW_Y_HI        = 0x0308,
		REG_WINDOW_W_LO        = 0x0309,
		REG_WINDOW_W_HI        = 0x030a,
		REG_WINDOW_H_LO        = 0x030b,
		REG_WINDOW_H_HI        = 0x030c,

		CURSOR_RAM_START       = 0x0400,
		CURSOR_RAM_END         = 0x07ff,
		CURSOR_RAM_MASK        = 0x03ff,

		ADDRESS_LSB            = 0x00ff,
		ADDRESS_MSB            = 0x0f00,
		ADDRESS_MASK           = 0x0fff
	};

	enum command_0_mask
	{
		CR0706 = 0xc0, // multiplex select
		CR05   = 0x20, // overlay 0 enable
		CR04   = 0x10, // reserved
		CR0302 = 0x0c, // blink rate selection
		CR0100 = 0x03  // block mode
	};
	enum cr0706_mask
	{
		CR0706_51MPX    = 0xc0, // 5:1 multiplex
		CR0706_11MPX    = 0x80, // 1:1 multiplex
		CR0706_41MPX    = 0x40, // 4:1 multiplex
		CR0706_RESERVED = 0x00  // reserved
	};
	enum cr0302_mask
	{
		CR0302_6464 = 0x0c, // 64 on 64 off, 50/50
		CR0302_3232 = 0x08, // 32 on 32 off, 50/50
		CR0302_1616 = 0x04, // 16 on 16 off, 50/50
		CR0302_1648 = 0x00  // 16 on 48 off, 25/75
	};
	enum cr0100_mask
	{
		CR0100_1BPP = 0x03, // 1 bit per pixel
		CR0100_2BPP = 0x02, // 2 bits per pixel
		CR0100_4BPP = 0x01, // 4 bits per pixel
		CR0100_8BPP = 0x00  // 8 bits per pixel
	};

	enum command_1_mask
	{
		CR1715 = 0xe0, // pan select
		CR14   = 0x10, // reserved
		CR1310 = 0x0f  // zoom factor
	};

	enum command_2_mask
	{
		CR27   = 0x80, // sync enable
		CR26   = 0x40, // pedestal enable
		CR2524 = 0x30, // load palette RAM select
		CR23   = 0x08, // PLL select
		CR22   = 0x04, // X Windows overlay select
		CR21   = 0x02, // X Windows cursor select
		CR20   = 0x01  // test mode select
	};
	enum cr2524_mask
	{
		CR2524_BLUE   = 0x30,
		CR2524_GREEN  = 0x20,
		CR2524_RED    = 0x10,
		CR2524_NORMAL = 0x00
	};

	enum interleave_mask
	{
		CR3735 = 0xe0, // interleave select
		CR3432 = 0x1c, // first pixel select
		CR31   = 0x02, // overlay interleave enable
		CR30   = 0x01  // underlay enable
	};
	enum cr3735_mask
	{
		CR3735_4PIX = 0x80, // 4 pixels
		CR3735_3PIX = 0x60, // 3 pixels
		CR3735_2PIX = 0x40, // 2 pixels
		CR3735_1PIX = 0x20, // 1 pixel
		CR3735_0PIX = 0x00  // 0 pixels
	};
	enum cr3432_mask
	{
		CR3432_PIX_E = 0x10, // pixel E
		CR3432_PIX_D = 0x0c, // pixel D
		CR3432_PIX_C = 0x08, // pixel C
		CR3432_PIX_B = 0x04, // pixel B
		CR3432_PIX_A = 0x00  // pixel A
	};

	enum cursor_command_mask
	{
		CR47   = 0x80, // 64x64 cursor plane 1 enable
		CR46   = 0x40, // 64x64 cursor plane 0 enable
		CR45   = 0x20, // cross hair plane 1 enable
		CR44   = 0x10, // cross hair plane 0 enable
		CR43   = 0x08, // cursor format
		CR4241 = 0x06, // cross hair thickness
		CR40   = 0x01  // cursor blink enable
	};

	enum cr4241_mask
	{
		CR4241_1PIX = 0x00, // cross hair thickness 1 pixel
		CR4241_3PIX = 0x02, // cross hair thickness 3 pixels
		CR4241_5PIX = 0x04, // cross hair thickness 5 pixels
		CR4241_7PIX = 0x06  // cross hair thickness 7 pixels
	};

	void map(address_map &map);

	void screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u8 *pixel_data);

protected:
	virtual void device_start() override;
	virtual void device_reset() override;

	virtual u32 palette_entries() const override { return BT459_PIXEL_COLORS + BT459_OVERLAY_COLORS + BT459_CURSOR_COLORS; }

private:
	// helper functions
	u8 get_component(rgb_t *arr, int index);
	void set_component(rgb_t *arr, int index, u8 data);
	u32 get_rgb(u8 data, u8 mask) const { return m_palette_ram[data & mask]; }

	DECLARE_READ8_MEMBER(address_lo_r);
	DECLARE_WRITE8_MEMBER(address_lo_w);
	DECLARE_READ8_MEMBER(address_hi_r);
	DECLARE_WRITE8_MEMBER(address_hi_w);
	DECLARE_READ8_MEMBER(register_r);
	DECLARE_WRITE8_MEMBER(register_w);
	DECLARE_READ8_MEMBER(palette_r);
	DECLARE_WRITE8_MEMBER(palette_w);

	// device state in memory map order
	u16 m_address;
	int m_address_rgb;

	rgb_t m_overlay_color[BT459_OVERLAY_COLORS];
	rgb_t m_cursor_color[BT459_CURSOR_COLORS];

	// registers
	const u8 m_id = BT459_ID;
	u8 m_command_0;
	u8 m_command_1;
	u8 m_command_2;
	u8 m_pixel_read_mask;
	u8 m_pixel_blink_mask;
	u8 m_overlay_read_mask;
	u8 m_overlay_blink_mask;
	u8 m_interleave;
	u8 m_test;
	u8 m_red_signature;
	u8 m_green_signature;
	u8 m_blue_signature;
	const u8 m_revision = BT459_REV;
	u8 m_cursor_command;

	u16 m_cursor_x;
	u16 m_cursor_y;
	u16 m_window_x;
	u16 m_window_y;
	u16 m_window_w;
	u16 m_window_h;

	u8 m_cursor_ram[1024];
	rgb_t m_palette_ram[BT459_PIXEL_COLORS];

	u64 m_blink_start;
};

DECLARE_DEVICE_TYPE(BT459, bt459_device)

#endif // MAME_VIDEO_BT459_H