1 // license:LGPL-2.1+
2 // copyright-holders:Angelo Salese, Barry Rodewald
3 /*****************************************************************************
4  *
5  * includes/x1.h
6  *
7  ****************************************************************************/
8 
9 #ifndef MAME_INCLUDES_X1_H
10 #define MAME_INCLUDES_X1_H
11 
12 #pragma once
13 
14 #include "bus/generic/carts.h"
15 #include "bus/generic/slot.h"
16 #include "cpu/z80/z80.h"
17 #include "machine/z80daisy.h"
18 #include "imagedev/cassette.h"
19 #include "imagedev/floppy.h"
20 #include "machine/bankdev.h"
21 #include "machine/i8255.h"
22 #include "machine/timer.h"
23 #include "machine/wd_fdc.h"
24 #include "machine/z80ctc.h"
25 #include "machine/z80dma.h"
26 #include "machine/z80sio.h"
27 #include "sound/ay8910.h"
28 #include "sound/ym2151.h"
29 #include "video/mc6845.h"
30 
31 #include "formats/x1_tap.h"
32 
33 #include "emupal.h"
34 #include "screen.h"
35 
36 
37 // ======================> x1_keyboard_device
38 
39 class x1_keyboard_device :  public device_t,
40 						public device_z80daisy_interface
41 {
42 public:
43 	// construction/destruction
44 	x1_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
45 
46 private:
47 	virtual void device_start() override;
48 	// z80daisy_interface overrides
49 	virtual int z80daisy_irq_state() override;
50 	virtual int z80daisy_irq_ack() override;
51 	virtual void z80daisy_irq_reti() override;
52 };
53 
54 class x1_state : public driver_device
55 {
56 public:
x1_state(const machine_config & mconfig,device_type type,const char * tag)57 	x1_state(const machine_config &mconfig, device_type type, const char *tag) :
58 		driver_device(mconfig, type, tag),
59 		m_maincpu(*this, "x1_cpu"),
60 		m_cassette(*this, "cassette"),
61 		m_cart(*this, "cartslot"),
62 		m_fdc(*this, "fdc"),
63 		m_floppy(*this, "fdc:%u", 0),
64 		m_crtc(*this, "crtc"),
65 		m_screen(*this, "screen"),
66 		m_gfxdecode(*this, "gfxdecode"),
67 		m_palette(*this, "palette"),
68 		m_dma(*this, "dma"),
69 		m_iobank(*this, "iobank"),
70 		m_ym(*this, "ym"),
71 		m_sound_sw(*this, "SOUND_SW"),
72 		m_tvram(*this, "tvram"),
73 		m_avram(*this, "avram"),
74 		m_kvram(*this, "kvram"),
75 		m_bitmapbank(*this, "bitmapbank"),
76 		m_ipl_rom(*this, "ipl"),
77 		m_cg_rom(*this, "cgrom"),
78 		m_kanji_rom(*this, "kanji")
79 	{ }
80 
81 	DECLARE_FLOPPY_FORMATS(floppy_formats);
82 
83 	required_device<z80_device> m_maincpu;
84 	required_device<cassette_image_device> m_cassette;
85 	required_device<generic_slot_device> m_cart;
86 	required_device<mb8877_device> m_fdc;
87 	required_device_array<floppy_connector, 4> m_floppy;
88 	required_device<mc6845_device> m_crtc;
89 	required_device<screen_device> m_screen;
90 
91 	uint8_t x1_mem_r(offs_t offset);
92 	void x1_mem_w(offs_t offset, uint8_t data);
93 	uint8_t x1_sub_io_r();
94 	void x1_sub_io_w(uint8_t data);
95 	uint8_t x1_rom_r();
96 	void x1_rom_w(offs_t offset, uint8_t data);
97 	void x1_rom_bank_0_w(uint8_t data);
98 	void x1_rom_bank_1_w(uint8_t data);
99 	uint8_t x1_fdc_r(offs_t offset);
100 	void x1_fdc_w(offs_t offset, uint8_t data);
101 	uint8_t x1_pcg_r(offs_t offset);
102 	void x1_pcg_w(offs_t offset, uint8_t data);
103 	void x1_pal_r_w(uint8_t data);
104 	void x1_pal_g_w(uint8_t data);
105 	void x1_pal_b_w(uint8_t data);
106 	uint8_t x1_ex_gfxram_r(offs_t offset);
107 	void x1_ex_gfxram_w(offs_t offset, uint8_t data);
108 	void x1_scrn_w(uint8_t data);
109 	void x1_pri_w(uint8_t data);
110 	void x1_6845_w(offs_t offset, uint8_t data);
111 	uint8_t x1_kanji_r(offs_t offset);
112 	void x1_kanji_w(offs_t offset, uint8_t data);
113 	uint8_t x1_emm_r(offs_t offset);
114 	void x1_emm_w(offs_t offset, uint8_t data);
115 	uint8_t x1turbo_pal_r();
116 	uint8_t x1turbo_txpal_r(offs_t offset);
117 	uint8_t x1turbo_txdisp_r();
118 	uint8_t x1turbo_gfxpal_r();
119 	void x1turbo_pal_w(uint8_t data);
120 	void x1turbo_txpal_w(offs_t offset, uint8_t data);
121 	void x1turbo_txdisp_w(uint8_t data);
122 	void x1turbo_gfxpal_w(uint8_t data);
123 	void x1turbo_blackclip_w(uint8_t data);
124 	uint8_t x1turbo_mem_r(offs_t offset);
125 	void x1turbo_mem_w(offs_t offset, uint8_t data);
126 	void x1turboz_4096_palette_w(offs_t offset, uint8_t data);
127 	uint8_t x1turboz_blackclip_r();
128 	uint8_t x1turbo_bank_r();
129 	void x1turbo_bank_w(uint8_t data);
130 	uint8_t x1_porta_r();
131 	uint8_t x1_portb_r();
132 	uint8_t x1_portc_r();
133 	void x1_porta_w(uint8_t data);
134 	void x1_portb_w(uint8_t data);
135 	void x1_portc_w(uint8_t data);
136 	void init_x1_kanji();
137 	virtual void machine_start() override;
138 	DECLARE_MACHINE_RESET(x1);
139 	virtual void video_start() override;
140 	DECLARE_MACHINE_RESET(x1turbo);
141 	uint32_t screen_update_x1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
142 	DECLARE_INPUT_CHANGED_MEMBER(ipl_reset);
143 	DECLARE_INPUT_CHANGED_MEMBER(nmi_reset);
144 	TIMER_CALLBACK_MEMBER(x1_rtc_increment);
145 	TIMER_DEVICE_CALLBACK_MEMBER(x1_cmt_wind_timer);
146 	TIMER_DEVICE_CALLBACK_MEMBER(x1_keyboard_callback);
147 	DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
148 	DECLARE_WRITE_LINE_MEMBER(hdl_w);
149 
150 	uint8_t memory_read_byte(offs_t offset);
151 	void memory_write_byte(offs_t offset, uint8_t data);
152 	uint8_t io_read_byte(offs_t offset);
153 	void io_write_byte(offs_t offset, uint8_t data);
154 	required_device<gfxdecode_device> m_gfxdecode;
155 	required_device<palette_device> m_palette;
156 	optional_device<z80dma_device> m_dma;
157 	void x1turbo(machine_config &config);
158 	void x1(machine_config &config);
159 
160 	uint8_t ym_r(offs_t offset);
161 	uint8_t color_board_r(address_space &space);
162 	void color_board_w(uint8_t data);
163 	uint8_t color_board_2_r(address_space &space);
164 	void color_board_2_w(uint8_t data);
165 	uint8_t stereo_board_r(address_space &space, offs_t offset);
166 	void stereo_board_w(offs_t offset, uint8_t data);
167 	uint8_t rs232_r(offs_t offset);
168 	void rs232_w(offs_t offset, uint8_t data);
169 	uint8_t sasi_r(address_space &space, offs_t offset);
170 	void sasi_w(offs_t offset, uint8_t data);
171 	uint8_t fdd8_r(address_space &space, offs_t offset);
172 	void fdd8_w(offs_t offset, uint8_t data);
173 	uint8_t ext_sio_ctc_r(address_space &space, offs_t offset);
174 	void ext_sio_ctc_w(offs_t offset, uint8_t data);
175 	void z_img_cap_w(uint8_t data);
176 	void z_mosaic_w(uint8_t data);
177 	void z_chroma_key_w(uint8_t data);
178 	void z_extra_scroll_w(uint8_t data);
179 
180 	uint8_t m_key_irq_flag;       /**< Keyboard IRQ pending. */
181 	uint8_t m_key_irq_vector;     /**< Keyboard IRQ vector. */
182 
183 	void x1_io(address_map &map);
184 	void x1_io_banks(address_map &map);
185 	void x1_io_banks_common(address_map &map);
186 	void x1_mem(address_map &map);
187 	void x1turbo_io_banks(address_map &map);
188 	void x1turbo_mem(address_map &map);
189 protected:
190 	struct scrn_reg_t
191 	{
192 		uint8_t disp_bank;
193 		uint8_t pcg_mode;
194 		uint8_t v400_mode;
195 		uint8_t ank_sel;
196 
197 		uint8_t pri;
198 		uint8_t blackclip; // x1 turbo specific
199 	};
200 
201 	struct turbo_reg_t
202 	{
203 		uint8_t pal;
204 		uint8_t gfx_pal;
205 		uint8_t txt_pal[8];
206 		uint8_t txt_disp;
207 	};
208 
209 	struct x1_rtc_t
210 	{
211 		uint8_t sec, min, hour, day, wday, month, year;
212 	};
213 
214 	void x1_draw_pixel(bitmap_rgb32 &bitmap,int y,int x,uint16_t pen,uint8_t width,uint8_t height);
215 	void draw_fgtilemap(bitmap_rgb32 &bitmap,const rectangle &cliprect);
216 	void draw_gfxbitmap(bitmap_rgb32 &bitmap,const rectangle &cliprect, int plane,int pri);
217 	uint8_t check_prev_height(int x,int y,int x_size);
218 	uint8_t check_line_valid_height(int y,int x_size,int height);
219 
220 	int priority_mixer_pri(int color);
221 	void cmt_command( uint8_t cmd );
222 	uint16_t jis_convert(int kanji_addr);
223 
224 	required_device<address_map_bank_device> m_iobank;
225 	optional_device<ym2151_device> m_ym; // turbo-only
226 	optional_ioport m_sound_sw; // turbo-only
227 	required_shared_ptr<uint8_t> m_tvram;   /**< Pointer for Text Video RAM */
228 	required_shared_ptr<uint8_t> m_avram;   /**< Pointer for Attribute Video RAM */
229 	optional_shared_ptr<uint8_t> m_kvram;   /**< Pointer for Extended Kanji Video RAM (X1 Turbo) */
230 	required_memory_bank m_bitmapbank;
231 	required_region_ptr<uint8_t> m_ipl_rom;       /**< Pointer for IPL ROM */
232 	std::unique_ptr<uint8_t[]> m_work_ram;      /**< Pointer for base work RAM */
233 	std::unique_ptr<uint8_t[]> m_emm_ram;       /**< Pointer for EMM RAM */
234 	std::unique_ptr<uint8_t[]> m_pcg_ram;       /**< Pointer for PCG GFX RAM */
235 	required_region_ptr<uint8_t> m_cg_rom;        /**< Pointer for GFX ROM */
236 	required_region_ptr<uint8_t> m_kanji_rom;     /**< Pointer for Kanji ROMs */
237 	int m_xstart,           /**< Start X offset for screen drawing. */
238 		m_ystart;           /**< Start Y offset for screen drawing. */
239 	uint8_t m_hres_320;       /**< Pixel clock divider setting: (1) 48 (0) 24 */
240 	uint8_t m_io_switch;      /**< Enable access for special bitmap RMW phase in isolated i/o. */
241 	uint8_t m_io_sys;         /**< Read-back for PPI port C */
242 	uint8_t m_vsync;          /**< Screen V-Sync bit, active low */
243 	uint8_t m_vdisp;          /**< Screen V-Disp bit, active high */
244 	std::unique_ptr<uint8_t[]> m_gfx_bitmap_ram;    /**< Pointer for bitmap layer RAM. */
245 	uint8_t m_pcg_reset;      /**< @todo Unused variable. */
246 	uint8_t m_sub_obf;        /**< MCU side: OBF flag active low, indicates that there are parameters in comm buffer. */
247 	uint8_t m_ctc_irq_flag;       /**< @todo Unused variable. */
248 	scrn_reg_t m_scrn_reg;      /**< Base Video Registers. */
249 	turbo_reg_t m_turbo_reg;    /**< Turbo Z Video Registers. */
250 	x1_rtc_t m_rtc;         /**< Struct for RTC related variables */
251 	emu_timer *m_rtc_timer;     /**< Pointer for RTC timer. */
252 	uint8_t m_pcg_write_addr;     /**< @todo Unused variable. */
253 	uint8_t m_sub_cmd;        /**< MCU side: current command issued from Main to Sub. */
254 	uint8_t m_sub_cmd_length;     /**< MCU side: number of parameters, in bytes. */
255 	uint8_t m_sub_val[8];     /**< MCU side: parameters buffer. */
256 	int m_sub_val_ptr;      /**< MCU side: index for parameter read-back */
257 	int m_key_i;            /**< MCU side: index for keyboard read-back during OBF phase. */
258 	uint8_t m_irq_vector;     /**< @todo Unused variable. */
259 	uint8_t m_cmt_current_cmd;    /**< MCU side: CMT command issued. */
260 	uint8_t m_cmt_test;       /**< MCU side: Tape BREAK status bit. */
261 	uint8_t m_rom_index[3];       /**< Current ROM address. */
262 	uint32_t m_kanji_offset;      /**< @todo Unused variable. */
263 	uint8_t m_bios_offset;        /**< @todo Unused variable. */
264 	uint8_t m_x_b;            /**< Palette Register for Blue Gun */
265 	uint8_t m_x_g;            /**< Palette Register for Green Gun */
266 	uint8_t m_x_r;            /**< Palette Register for Red Gun */
267 	uint16_t m_kanji_addr_latch;  /**< Internal Kanji ROM address. */
268 	uint32_t m_kanji_addr;        /**< Latched Kanji ROM address. */
269 	uint8_t m_kanji_eksel;        /**< Kanji ROM register bit for latch phase. */
270 	uint8_t m_pcg_reset_occurred; /**< @todo Unused variable. */
271 	uint32_t m_old_key1;      /**< Keyboard read buffer for i/o port "key1" */
272 	uint32_t m_old_key2;      /**< Keyboard read buffer for i/o port "key2" */
273 	uint32_t m_old_key3;      /**< Keyboard read buffer for i/o port "key3" */
274 	uint32_t m_old_key4;      /**< Keyboard read buffer for i/o port "tenkey" */
275 	uint32_t m_old_fkey;      /**< Keyboard read buffer for i/o port "f_keys" */
276 	uint32_t m_emm_addr;      /**< EMM RAM current address */
277 	std::unique_ptr<uint8_t[]> m_pal_4096;      /**< X1 Turbo Z: pointer for 4096 palette entries */
278 	uint8_t m_crtc_vreg[0x100],   /**< CRTC register buffer. */
279 			m_crtc_index;       /**< CRTC register index. */
280 	uint8_t m_is_turbo;       /**< Machine type: (0) X1 Vanilla, (1) X1 Turbo */
281 	uint8_t m_ex_bank;        /**< X1 Turbo Z: RAM bank register */
282 	uint8_t m_ram_bank;       /**< Regular RAM bank for 0x0000-0x7fff memory window: (0) ROM/IPL (1) RAM */
283 	/**
284 	@brief Refresh current bitmap palette.
285 	*/
286 	void set_current_palette();
287 	/**
288 	@brief Retrieves the current PCG address.
289 
290 	@param width Number of currently setted up CRTC characters
291 	@param y_char_size Number of scanlines per character.
292 	@return Destination PCG address.
293 	*/
294 	uint16_t get_pcg_addr(uint16_t width, uint8_t y_char_size);
295 	/**
296 	@brief X1 Turbo: Retrieves the current CHR ROM address in Hi-Speed Mode.
297 
298 	@return Destination CHR address.
299 	*/
300 	uint16_t check_chr_addr();
301 	/**
302 	@brief X1 Turbo: Retrieves the current PCG ROM address in Hi-Speed Mode.
303 
304 	@return Destination CHR address.
305 	*/
306 	uint16_t check_pcg_addr();
307 	/**
308 	@brief MCU side: retrieve keycode to game key conversion.
309 
310 	@param port Address to convert.
311 	@return The converted game key buffer
312 	*/
313 	uint8_t get_game_key(uint8_t port);
314 	/**
315 	@brief MCU side: retrieve keyboard special key register.
316 
317 	@return
318 	x--- ---- TEN: Numpad, Function key, special input key
319 	-x-- ---- KIN: Valid key
320 	--x- ---- REP: Key repeat
321 	---x ---- GRAPH key ON
322 	---- x--- CAPS lock ON
323 	---- -x-- KANA lock ON
324 	---- --x- SHIFT ON
325 	---- ---x CTRL ON
326 	*/
327 	uint8_t check_keyboard_shift();
328 	/**
329 	@brief convert MAME input to raw scancode for keyboard.
330 
331 	@return the converted scancode
332 	@todo Unoptimized.
333 	*/
334 	uint16_t check_keyboard_press();
335 
336 	uint8_t m_fdc_ctrl;
337 
338 };
339 
340 /*----------- defined in machine/x1.c -----------*/
341 
342 DECLARE_DEVICE_TYPE(X1_KEYBOARD, x1_keyboard_device)
343 
344 #endif // MAME_INCLUDES_X1_H
345