1 // license:BSD-3-Clause
2 // copyright-holders:Angelo Salese
3 /********************************************************************************************************************************
4 
5     Sharp MZ-2500 (c) 1985 Sharp Corporation
6 
7 ********************************************************************************************************************************/
8 #ifndef MAME_INCLUDES_MZ2500_H
9 #define MAME_INCLUDES_MZ2500_H
10 
11 #pragma once
12 
13 
14 #include "cpu/z80/z80.h"
15 #include "machine/i8255.h"
16 #include "machine/pit8253.h"
17 #include "machine/rp5c15.h"
18 #include "machine/wd_fdc.h"
19 #include "machine/z80sio.h"
20 #include "machine/z80pio.h"
21 #include "sound/2203intf.h"
22 #include "sound/beep.h"
23 #include "machine/bankdev.h"
24 #include "emupal.h"
25 #include "screen.h"
26 #include "softlist.h"
27 #include "speaker.h"
28 
29 //#include "imagedev/cassette.h"
30 #include "imagedev/floppy.h"
31 
32 #define RP5C15_TAG      "rp5c15"
33 
34 class mz2500_state : public driver_device
35 {
36 public:
mz2500_state(const machine_config & mconfig,device_type type,const char * tag)37 	mz2500_state(const machine_config &mconfig, device_type type, const char *tag) :
38 		driver_device(mconfig, type, tag),
39 		m_maincpu(*this, "maincpu"),
40 		m_screen(*this, "screen"),
41 		m_rtc(*this, RP5C15_TAG),
42 		m_pit(*this, "pit"),
43 		m_beeper(*this, "beeper"),
44 		m_gfxdecode(*this, "gfxdecode"),
45 		m_fdc(*this, "mb8877a"),
46 		m_floppy0(*this, "mb8877a:0"),
47 		m_floppy1(*this, "mb8877a:1"),
48 		m_floppy2(*this, "mb8877a:2"),
49 		m_floppy3(*this, "mb8877a:3"),
50 		m_floppy(nullptr),
51 		m_palette(*this, "palette"),
52 		m_rambank(*this, "rambank%u", 0),
53 		m_tvram(*this, "tvram"),
54 		m_cgram(*this, "cgram"),
55 		m_wram(*this, "wram")
56 	{ }
57 
58 	void mz2500(machine_config &config);
59 
60 private:
61 	required_device<cpu_device> m_maincpu;
62 	required_device<screen_device> m_screen;
63 	required_device<rp5c15_device> m_rtc;
64 	required_device<pit8253_device> m_pit;
65 	required_device<beep_device> m_beeper;
66 	required_device<gfxdecode_device> m_gfxdecode;
67 	required_device<mb8877_device> m_fdc;
68 	required_device<floppy_connector> m_floppy0;
69 	required_device<floppy_connector> m_floppy1;
70 	required_device<floppy_connector> m_floppy2;
71 	required_device<floppy_connector> m_floppy3;
72 	floppy_image_device *m_floppy;
73 	required_device<palette_device> m_palette;
74 	required_device_array<address_map_bank_device, 8> m_rambank;
75 	required_shared_ptr<uint8_t> m_tvram;
76 	required_shared_ptr<uint8_t> m_cgram;
77 	required_shared_ptr<uint8_t> m_wram;
78 
79 	uint8_t *m_ipl_rom;
80 	uint8_t *m_kanji_rom;
81 	uint8_t *m_kanji2_rom;
82 	std::unique_ptr<uint8_t[]> m_pcg_ram;
83 	std::unique_ptr<uint8_t[]> m_emm_ram;
84 	uint8_t *m_dic_rom;
85 	uint8_t *m_phone_rom;
86 	uint8_t *m_iplpro_rom;
87 
88 	uint8_t m_bank_val[8];
89 	uint8_t m_bank_addr;
90 	uint8_t m_irq_sel;
91 	uint8_t m_irq_vector[4];
92 	uint8_t m_irq_mask[4];
93 	uint8_t m_irq_pending[4];
94 	uint8_t m_kanji_bank;
95 	uint8_t m_dic_bank;
96 	uint8_t m_fdc_reverse;
97 	uint8_t m_key_mux;
98 	uint8_t m_monitor_type;
99 	uint8_t m_text_reg[0x100];
100 	uint8_t m_text_reg_index;
101 	uint8_t m_text_col_size;
102 	uint8_t m_text_font_reg;
103 	uint8_t m_pal_select;
104 	uint16_t m_cg_vs;
105 	uint16_t m_cg_ve;
106 	uint16_t m_cg_hs;
107 	uint16_t m_cg_he;
108 	int16_t m_tv_vs;
109 	int16_t m_tv_ve;
110 	int16_t m_tv_hs;
111 	int16_t m_tv_he;
112 	uint8_t m_cg_latch[4];
113 	uint8_t m_cg_reg_index;
114 	uint8_t m_cg_reg[0x20];
115 	uint8_t m_clut16[0x10];
116 	uint16_t m_clut256[0x100];
117 	uint8_t m_cg_mask;
118 	int m_scr_x_size;
119 	int m_scr_y_size;
120 	uint8_t m_cg_clear_flag;
121 	uint32_t m_rom_index;
122 	uint8_t m_hrom_index;
123 	uint8_t m_lrom_index;
124 	struct { uint8_t r,g,b; } m_pal[16];
125 	uint8_t m_joy_mode;
126 	uint16_t m_kanji_index;
127 	uint32_t m_emm_offset;
128 	uint8_t m_old_portc;
129 	uint8_t m_prev_col_val;
130 	uint8_t m_pio_latchb;
131 	uint8_t m_ym_porta;
132 	uint8_t m_screen_enable;
133 	uint8_t mz2500_bank_addr_r();
134 	void mz2500_bank_addr_w(uint8_t data);
135 	uint8_t mz2500_bank_data_r();
136 	void mz2500_bank_data_w(uint8_t data);
137 	void mz2500_kanji_bank_w(uint8_t data);
138 	void mz2500_dictionary_bank_w(uint8_t data);
139 	uint8_t mz2500_crtc_hvblank_r();
140 	void mz2500_tv_crtc_w(offs_t offset, uint8_t data);
141 	void mz2500_irq_sel_w(uint8_t data);
142 	void mz2500_irq_data_w(uint8_t data);
143 	uint8_t mz2500_rom_r();
144 	void mz2500_rom_w(uint8_t data);
145 	void palette4096_io_w(uint8_t data);
146 	uint8_t mz2500_bplane_latch_r();
147 	uint8_t mz2500_rplane_latch_r();
148 	uint8_t mz2500_gplane_latch_r();
149 	uint8_t mz2500_iplane_latch_r();
150 	void mz2500_cg_addr_w(uint8_t data);
151 	void mz2500_cg_data_w(uint8_t data);
152 	void timer_w(uint8_t data);
153 	uint8_t mz2500_joystick_r();
154 	void mz2500_joystick_w(uint8_t data);
155 	uint8_t mz2500_kanji_r(offs_t offset);
156 	void mz2500_kanji_w(offs_t offset, uint8_t data);
157 	uint8_t rp5c15_8_r();
158 	void rp5c15_8_w(uint8_t data);
159 	uint8_t mz2500_emm_data_r();
160 	void mz2500_emm_addr_w(uint8_t data);
161 	void mz2500_emm_data_w(uint8_t data);
162 
163 	uint8_t rmw_r(offs_t offset);
164 	void rmw_w(offs_t offset, uint8_t data);
165 	uint8_t kanji_pcg_r(offs_t offset);
166 	void kanji_pcg_w(offs_t offset, uint8_t data);
167 	uint8_t dict_rom_r(offs_t offset);
168 
169 	uint8_t mz2500_cg_latch_compare();
170 	virtual void machine_start() override;
171 	virtual void machine_reset() override;
172 	virtual void video_start() override;
173 	void mz2500_palette(palette_device &palette) const;
174 	uint32_t screen_update_mz2500(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
175 	INTERRUPT_GEN_MEMBER(mz2500_vbl);
176 
177 	uint8_t fdc_r(offs_t offset);
178 	void fdc_w(offs_t offset, uint8_t data);
179 	void floppy_select_w(uint8_t data);
180 	void floppy_side_w(uint8_t data);
181 
182 	uint8_t mz2500_porta_r();
183 	uint8_t mz2500_portb_r();
184 	uint8_t mz2500_portc_r();
185 	void mz2500_porta_w(uint8_t data);
186 	void mz2500_portb_w(uint8_t data);
187 	void mz2500_portc_w(uint8_t data);
188 	void mz2500_pio1_porta_w(uint8_t data);
189 	uint8_t mz2500_pio1_porta_r();
190 	uint8_t opn_porta_r();
191 	void opn_porta_w(uint8_t data);
192 	DECLARE_WRITE_LINE_MEMBER(pit8253_clk0_irq);
193 	DECLARE_WRITE_LINE_MEMBER(mz2500_rtc_alarm_irq);
194 	IRQ_CALLBACK_MEMBER( mz2500_irq_ack );
195 
196 	void draw_80x25(bitmap_ind16 &bitmap,const rectangle &cliprect,uint16_t map_addr);
197 	void draw_40x25(bitmap_ind16 &bitmap,const rectangle &cliprect,int plane,uint16_t map_addr);
198 	void draw_cg4_screen(bitmap_ind16 &bitmap,const rectangle &cliprect,int pri);
199 	void draw_cg16_screen(bitmap_ind16 &bitmap,const rectangle &cliprect,int plane,int x_size,int pri);
200 	void draw_cg256_screen(bitmap_ind16 &bitmap,const rectangle &cliprect,int plane,int pri);
201 	void draw_tv_screen(bitmap_ind16 &bitmap,const rectangle &cliprect);
202 	void draw_cg_screen(bitmap_ind16 &bitmap,const rectangle &cliprect,int pri);
203 
204 	void mz2500_draw_pixel(bitmap_ind16 &bitmap,int x,int y,uint16_t  pen,uint8_t width,uint8_t height);
205 	void mz2500_reconfigure_screen();
206 	static uint8_t pal_256_param(int index, int param);
207 	void reset_banks(uint8_t type);
208 
209 	void mz2500_io(address_map &map);
210 	void mz2500_map(address_map &map);
211 	void mz2500_bank_window_map(address_map &map);
212 };
213 
214 #endif // MAME_INCLUDES_MZ2500_H
215