1 // license:BSD-3-Clause
2 // copyright-holders:Wilbert Pol
3 /**********************************************************************
4 
5     Hudson/NEC HuC6270 interface
6 
7 **********************************************************************/
8 
9 #ifndef MAME_VIDEO_HUC6270_H
10 #define MAME_VIDEO_HUC6270_H
11 
12 #pragma once
13 
14 
15 class huc6270_device : public device_t
16 {
17 public:
18 	// construction/destruction
19 	huc6270_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
20 
set_vram_size(uint32_t vram_size)21 	void set_vram_size(uint32_t vram_size) { m_vram_size = vram_size; }
irq()22 	auto irq() { return m_irq_changed_cb.bind(); }
23 
24 	u8 read(offs_t offset);
25 	void write(offs_t offset, u8 data);
26 	u16 next_pixel();
time_until_next_event()27 	inline u16 time_until_next_event()
28 	{
29 		return m_horz_to_go * 8 + m_horz_steps;
30 	}
31 
32 	DECLARE_WRITE_LINE_MEMBER( vsync_changed );
33 	DECLARE_WRITE_LINE_MEMBER( hsync_changed );
34 
35 	static const uint16_t HUC6270_SPRITE     = 0x0100;    // sprite colour information
36 	static const uint16_t HUC6270_BACKGROUND = 0x0000;    // background colour information
37 
38 protected:
39 	// device-level overrides
40 	virtual void device_start() override;
41 	virtual void device_reset() override;
42 
43 	inline void fetch_bat_tile_row();
44 	void add_sprite( int index, int x, int pattern, int line, int flip_x, int palette, int priority, int sat_lsb );
45 	void select_sprites();
46 	inline void handle_vblank();
47 	inline void next_vert_state();
48 	inline void next_horz_state();
49 	inline void handle_dma();
50 
51 private:
52 	enum class v_state : u8 {
53 		VSW,
54 		VDS,
55 		VDW,
56 		VCR
57 	};
58 
59 	enum class h_state : u8 {
60 		HDS,
61 		HDW,
62 		HDE,
63 		HSW
64 	};
65 
66 
67 	/* Size of Video ram (mandatory) */
68 	uint32_t m_vram_size;
69 
70 	/* Callback for when the irq line may have changed (mandatory) */
71 	devcb_write_line    m_irq_changed_cb;
72 
73 	uint8_t   m_register_index;
74 
75 	/* HuC6270 registers */
76 	uint16_t  m_mawr;
77 	uint16_t  m_marr;
78 	uint16_t  m_vrr;
79 	uint16_t  m_vwr;
80 	uint16_t  m_cr;
81 	uint16_t  m_rcr;
82 	uint16_t  m_bxr;
83 	uint16_t  m_byr;
84 	uint16_t  m_mwr;
85 	uint16_t  m_hsr;
86 	uint16_t  m_hdr;
87 	uint16_t  m_vpr;
88 	uint16_t  m_vdw;
89 	uint16_t  m_vcr;
90 	uint16_t  m_dcr;
91 	uint16_t  m_sour;
92 	uint16_t  m_desr;
93 	uint16_t  m_lenr;
94 	uint16_t  m_dvssr;
95 	uint8_t   m_status;
96 
97 	/* To keep track of external hsync and vsync signals */
98 	int m_hsync;
99 	int m_vsync;
100 
101 	/* internal variables */
102 	v_state m_vert_state;
103 	h_state m_horz_state;
104 	int m_vd_triggered;
105 	int m_vert_to_go;
106 	int m_horz_to_go;
107 	int m_horz_steps;
108 	int m_raster_count;
109 	int m_dvssr_written;
110 	int m_satb_countdown;
111 	int m_dma_enabled;
112 	uint16_t m_byr_latched;
113 	uint16_t m_bxr_latched;
114 	uint16_t m_bat_address;
115 	uint16_t m_bat_address_mask;
116 	uint16_t m_bat_row;
117 	uint16_t m_bat_column;
118 	uint8_t m_bat_tile_row[8];
119 	/* Internal sprite attribute table. SATB DMA is used to transfer data
120 	   from VRAM to this internal table.
121 	*/
122 	uint16_t m_sat[4*64];
123 	int m_sprites_this_line;
124 	int m_sprite_row_index;
125 	uint16_t  m_sprite_row[1024];
126 	std::unique_ptr<uint16_t[]>  m_vram;
127 	uint16_t  m_vram_mask;
128 
129 	static constexpr uint8_t vram_increments[4] = { 1, 32, 64, 128 };
130 };
131 
132 
133 DECLARE_DEVICE_TYPE(HUC6270, huc6270_device)
134 
135 #endif // MAME_VIDEO_HUC6270_H
136