1 // license:BSD-3-Clause
2 // copyright-holders:Jean-Francois DEL NERO
3 /*********************************************************************
4 
5     ef9365.h
6 
7     Thomson EF9365/EF9366 video controller
8 
9 *********************************************************************/
10 
11 #ifndef MAME_VIDEO_EF9365_H
12 #define MAME_VIDEO_EF9365_H
13 
14 #pragma once
15 
16 #include "emupal.h"
17 
18 
19 //**************************************************************************
20 //  TYPE DEFINITIONS
21 //**************************************************************************
22 
23 // ======================> ef9365_device
24 
25 class ef9365_device :   public device_t,
26 						public device_memory_interface,
27 						public device_video_interface
28 {
29 public:
30 	static constexpr unsigned BITPLANE_MAX_SIZE = 0x8000;
31 	static constexpr unsigned MAX_BITPLANES = 8;
32 
33 	static constexpr int DISPLAY_MODE_256x256    = 0x00;
34 	static constexpr int DISPLAY_MODE_512x512    = 0x01;
35 	static constexpr int DISPLAY_MODE_512x256    = 0x02;
36 	static constexpr int DISPLAY_MODE_128x128    = 0x03;
37 	static constexpr int DISPLAY_MODE_64x64      = 0x04;
38 
39 	// construction/destruction
40 	ef9365_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
41 
42 	// configuration
set_palette_tag(T && tag)43 	template <typename T> void set_palette_tag(T &&tag) { m_palette.set_tag(std::forward<T>(tag)); }
44 	void set_nb_bitplanes(int nb_bitplanes );
45 	void set_display_mode(int display_mode );
irq_handler()46 	auto irq_handler() { return m_irq_handler.bind(); }
47 
48 	// device interface
49 	uint8_t data_r(offs_t offset);
50 	void data_w(offs_t offset, uint8_t data);
51 
52 	void update_scanline(uint16_t scanline);
53 	void set_color_filler( uint8_t color );
54 	void set_color_entry( int index, uint8_t r, uint8_t g, uint8_t b );
55 
56 	uint8_t get_last_readback_word(int bitplane_number, int * pixel_offset);
57 
58 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
59 
60 protected:
61 	// device-level overrides
62 	virtual void device_start() override;
63 	virtual void device_reset() override;
64 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
65 	virtual const tiny_rom_entry *device_rom_region() const override;
66 
67 	// device_config_memory_interface overrides
68 	virtual space_config_vector memory_space_config() const override;
69 
70 	// address space configurations
71 	const address_space_config      m_space_config;
72 
73 private:
74 	int get_char_pix( unsigned char c, int x, int y );
75 	void plot(int x_pos,int y_pos);
76 	int draw_character( unsigned char c, int block, int smallblock );
77 	int draw_vector(uint16_t start_x,uint16_t start_y,short delta_x,short delta_y);
78 	uint16_t get_x_reg();
79 	uint16_t get_y_reg();
80 	void set_x_reg(uint16_t x);
81 	void set_y_reg(uint16_t y);
82 	void screen_scanning( int force_clear );
83 	void set_busy_flag(int period);
84 	void set_video_mode(void);
85 	void draw_border(uint16_t line);
86 	void ef9365_exec(uint8_t cmd);
87 	int  cycles_to_us(int cycles);
88 	void dump_bitplanes_word();
89 	void update_interrupts();
90 
91 	void ef9365(address_map &map);
92 
93 	// internal state
94 	static constexpr device_timer_id BUSY_TIMER = 0;
95 
96 	required_region_ptr<uint8_t> m_charset;
97 	address_space *m_videoram;
98 
99 	uint8_t m_irq_state;
100 	uint8_t m_irq_vb;
101 	uint8_t m_irq_lb;
102 	uint8_t m_irq_rdy;
103 	uint8_t m_current_color;
104 	uint8_t m_bf;                             //busy flag
105 	uint8_t m_registers[0x10];                //registers
106 	uint8_t m_state;                          //status register
107 	uint8_t m_border[80];                     //border color
108 
109 	int   nb_of_bitplanes;
110 	int   nb_of_colors;
111 	int   bitplane_xres;
112 	int   bitplane_yres;
113 	uint16_t overflow_mask_x;
114 	uint16_t overflow_mask_y;
115 	int   vsync_scanline_pos;
116 
117 	uint8_t m_readback_latch[MAX_BITPLANES];   // Last DRAM Readback buffer (Filled after a Direct Memory Access Request command)
118 	int m_readback_latch_pix_offset;
119 
120 	uint32_t clock_freq;
121 	bitmap_rgb32 m_screen_out;
122 
123 	// timers
124 	emu_timer *m_busy_timer;
125 
126 	required_device<palette_device> m_palette;
127 	devcb_write_line m_irq_handler;
128 };
129 
130 // device type definition
131 DECLARE_DEVICE_TYPE(EF9365, ef9365_device)
132 
133 #endif // MAME_VIDEO_EF9365_H
134