1 // license:BSD-3-Clause
2 // copyright-holders:Angelo Salese
3 #ifndef MAME_INCLUDES_PC6001_H
4 #define MAME_INCLUDES_PC6001_H
5 
6 #pragma once
7 
8 
9 #include "cpu/z80/z80.h"
10 #include "imagedev/cassette.h"
11 #include "machine/i8251.h"
12 #include "machine/i8255.h"
13 #include "machine/timer.h"
14 #include "sound/ay8910.h"
15 #include "sound/upd7752.h"
16 //#include "sound/2203intf.h"
17 #include "video/mc6847.h"
18 
19 #include "bus/generic/slot.h"
20 #include "bus/generic/carts.h"
21 
22 #include "emupal.h"
23 #include "speaker.h"
24 #include "screen.h"
25 
26 #include "formats/p6001_cas.h"
27 
28 class pc6001_state : public driver_device
29 {
30 public:
pc6001_state(const machine_config & mconfig,device_type type,const char * tag)31 	pc6001_state(const machine_config &mconfig, device_type type, const char *tag) :
32 		driver_device(mconfig, type, tag),
33 		m_ppi(*this, "ppi8255"),
34 		m_ram(*this, "ram"),
35 		m_maincpu(*this, "maincpu"),
36 		m_screen(*this, "screen"),
37 		m_cassette(*this, "cassette"),
38 		m_cas_hack(*this, "cas_hack"),
39 		m_cart(*this, "cartslot"),
40 		m_region_maincpu(*this, "maincpu"),
41 		m_region_gfx1(*this, "gfx1"),
42 		m_io_mode4_dsw(*this, "MODE4_DSW"),
43 		m_io_p1(*this, "P1"),
44 		m_io_p2(*this, "P2"),
45 		m_io_keys(*this, "key%u", 1U),
46 		m_io_key_modifiers(*this, "key_modifiers"),
47 		m_bank1(*this, "bank1"),
48 		m_palette(*this, "palette")
49 	{ }
50 
51 	void system_latch_w(uint8_t data);
52 	uint8_t nec_ppi8255_r(offs_t offset);
53 	void nec_ppi8255_w(offs_t offset, uint8_t data);
54 
55 	void pc6001_palette(palette_device &palette) const;
56 
57 	uint32_t screen_update_pc6001(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
58 
59 	INTERRUPT_GEN_MEMBER(vrtc_irq);
60 	TIMER_CALLBACK_MEMBER(audio_callback);
61 	TIMER_DEVICE_CALLBACK_MEMBER(cassette_callback);
62 	TIMER_DEVICE_CALLBACK_MEMBER(keyboard_callback);
63 
64 	uint8_t ppi_porta_r();
65 	void ppi_porta_w(uint8_t data);
66 	uint8_t ppi_portb_r();
67 	void ppi_portb_w(uint8_t data);
68 	void ppi_portc_w(uint8_t data);
69 	uint8_t ppi_portc_r();
70 
71 	IRQ_CALLBACK_MEMBER(irq_callback);
72 
73 	void pc6001(machine_config &config);
74 	void pc6001_io(address_map &map);
75 	void pc6001_map(address_map &map);
76 protected:
77 	required_device<i8255_device> m_ppi;
78 	optional_shared_ptr<uint8_t> m_ram;
79 	required_device<cpu_device> m_maincpu;
80 	required_device<screen_device> m_screen;
81 	optional_device<cassette_image_device> m_cassette;
82 	optional_device<generic_slot_device> m_cas_hack;
83 	required_device<generic_slot_device> m_cart;
84 	required_memory_region m_region_maincpu;
85 	required_memory_region m_region_gfx1;
86 	required_ioport m_io_mode4_dsw;
87 	required_ioport m_io_p1;
88 	required_ioport m_io_p2;
89 	required_ioport_array<3> m_io_keys;
90 	required_ioport m_io_key_modifiers;
91 	required_memory_bank m_bank1;
92 	required_device<palette_device> m_palette;
93 
94 	memory_region *m_cart_rom;
95 	uint8_t m_timer_irq_vector;
96 	uint16_t m_timer_hz_div;
97 
98 	virtual void machine_start() override;
99 	virtual void machine_reset() override;
100 	virtual void video_start() override;
101 
102 	// i/o functions
103 	uint8_t check_joy_press();
104 	uint8_t check_keyboard_press();
105 	inline void cassette_latch_control(bool new_state);
106 	inline void ppi_control_hack_w(uint8_t data);
107 	inline void set_timer_divider(uint8_t data);
108 	inline void set_videoram_bank(uint32_t offs);
109 	inline void set_maincpu_irq_line(uint8_t vector_num);
110 
111 	// video functions
112 	void draw_gfx_mode4(bitmap_ind16 &bitmap,const rectangle &cliprect,int attr);
113 	void draw_bitmap_2bpp(bitmap_ind16 &bitmap,const rectangle &cliprect, int attr);
114 	void draw_tile_3bpp(bitmap_ind16 &bitmap,const rectangle &cliprect,int x,int y,int tile,int attr);
115 	void draw_tile_text(bitmap_ind16 &bitmap,const rectangle &cliprect,int x,int y,int tile,int attr,int has_mc6847);
116 	void draw_border(bitmap_ind16 &bitmap,const rectangle &cliprect,int attr,int has_mc6847);
117 	void pc6001_screen_draw(bitmap_ind16 &bitmap,const rectangle &cliprect, int has_mc6847);
118 
119 	emu_timer *m_timer_irq_timer;
120 	uint8_t *m_video_ram;
121 	uint8_t m_irq_vector;
122 	uint8_t m_cas_switch;
123 	uint8_t m_sys_latch;
124 	uint32_t m_cas_offset;
125 	uint32_t m_cas_maxsize;
126 	uint8_t m_bank_opt;
127 	uint8_t m_timer_irq_mask;
128 	uint8_t m_timer_irq_mask2;
129 	uint8_t m_port_c_8255;
130 	uint8_t m_cur_keycode;
131 
132 private:
133 	uint32_t m_old_key1;
134 	uint32_t m_old_key2;
135 	uint32_t m_old_key3;
136 
137 };
138 
139 
140 class pc6001mk2_state : public pc6001_state
141 {
142 public:
pc6001mk2_state(const machine_config & mconfig,device_type type,const char * tag)143 	pc6001mk2_state(const machine_config &mconfig, device_type type, const char *tag) :
144 		pc6001_state(mconfig, type, tag),
145 		m_bank2(*this, "bank2"),
146 		m_bank3(*this, "bank3"),
147 		m_bank4(*this, "bank4"),
148 		m_bank5(*this, "bank5"),
149 		m_bank6(*this, "bank6"),
150 		m_bank7(*this, "bank7"),
151 		m_bank8(*this, "bank8")
152 	{ }
153 
154 	uint8_t mk2_bank_r0_r();
155 	uint8_t mk2_bank_r1_r();
156 	uint8_t mk2_bank_w0_r();
157 	void mk2_bank_r0_w(uint8_t data);
158 	void mk2_bank_r1_w(uint8_t data);
159 	void mk2_bank_w0_w(uint8_t data);
160 	void mk2_opt_bank_w(uint8_t data);
161 	void mk2_work_ram0_w(offs_t offset, uint8_t data);
162 	void mk2_work_ram1_w(offs_t offset, uint8_t data);
163 	void mk2_work_ram2_w(offs_t offset, uint8_t data);
164 	void mk2_work_ram3_w(offs_t offset, uint8_t data);
165 	void mk2_work_ram4_w(offs_t offset, uint8_t data);
166 	void mk2_work_ram5_w(offs_t offset, uint8_t data);
167 	void mk2_work_ram6_w(offs_t offset, uint8_t data);
168 	void mk2_work_ram7_w(offs_t offset, uint8_t data);
169 	void necmk2_ppi8255_w(offs_t offset, uint8_t data);
170 	void mk2_system_latch_w(uint8_t data);
171 	void mk2_vram_bank_w(uint8_t data);
172 	void mk2_col_bank_w(uint8_t data);
173 	void mk2_0xf3_w(uint8_t data);
174 	void mk2_timer_adj_w(uint8_t data);
175 	void mk2_timer_irqv_w(uint8_t data);
176 
177 	void pc6001mk2_palette(palette_device &palette) const;
178 	void pc6001mk2(machine_config &config);
179 
180 	uint32_t screen_update_pc6001mk2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
181 
182 	void pc6001mk2_io(address_map &map);
183 	void pc6001mk2_map(address_map &map);
184 protected:
185 	uint8_t m_bgcol_bank;
186 	uint8_t m_gfx_bank_on;
187 	required_memory_bank m_bank2;
188 	required_memory_bank m_bank3;
189 	required_memory_bank m_bank4;
190 	required_memory_bank m_bank5;
191 	required_memory_bank m_bank6;
192 	required_memory_bank m_bank7;
193 	required_memory_bank m_bank8;
194 	inline void refresh_crtc_params();
195 
196 	virtual void video_start() override;
197 	virtual void machine_reset() override;
198 
199 private:
200 	uint8_t m_bank_r0;
201 	uint8_t m_bank_r1;
202 	uint8_t m_bank_w;
203 	uint8_t m_ex_vram_bank;
204 	uint8_t m_exgfx_text_mode;
205 	uint32_t m_cgrom_bank_addr;
206 	uint8_t m_exgfx_bitmap_mode;
207 	uint8_t m_exgfx_2bpp_mode;
208 
209 	void vram_bank_change(uint8_t vram_bank);
210 };
211 
212 class pc6601_state : public pc6001mk2_state
213 {
214 public:
pc6601_state(const machine_config & mconfig,device_type type,const char * tag)215 	pc6601_state(const machine_config &mconfig, device_type type, const char *tag) :
216 		pc6001mk2_state(mconfig, type, tag)
217 	{ }
218 
219 	uint8_t fdc_r();
220 	void fdc_w(uint8_t data);
221 
222 	void pc6601(machine_config &config);
223 	void pc6601_io(address_map &map);
224 };
225 
226 class pc6001sr_state : public pc6601_state
227 {
228 public:
pc6001sr_state(const machine_config & mconfig,device_type type,const char * tag)229 	pc6001sr_state(const machine_config &mconfig, device_type type, const char *tag) :
230 		pc6601_state(mconfig, type, tag),
231 		m_sr_irq_vectors(*this, "irq_vectors")
232 	{ }
233 
234 	uint8_t hw_rev_r();
235 	uint8_t sr_bank_rn_r(offs_t offset);
236 	void sr_bank_rn_w(offs_t offset, uint8_t data);
237 	uint8_t sr_bank_wn_r(offs_t offset);
238 	void sr_bank_wn_w(offs_t offset, uint8_t data);
239 	void sr_work_ram0_w(offs_t offset, uint8_t data);
240 	void sr_work_ram1_w(offs_t offset, uint8_t data);
241 	void sr_work_ram2_w(offs_t offset, uint8_t data);
242 	void sr_work_ram3_w(offs_t offset, uint8_t data);
243 	void sr_work_ram4_w(offs_t offset, uint8_t data);
244 	void sr_work_ram5_w(offs_t offset, uint8_t data);
245 	void sr_work_ram6_w(offs_t offset, uint8_t data);
246 	void sr_work_ram7_w(offs_t offset, uint8_t data);
247 	void sr_mode_w(uint8_t data);
248 	void sr_vram_bank_w(uint8_t data);
249 	void sr_system_latch_w(uint8_t data);
250 	void necsr_ppi8255_w(offs_t offset, uint8_t data);
251 	void sr_bitmap_yoffs_w(uint8_t data);
252 	void sr_bitmap_xoffs_w(uint8_t data);
253 
254 	INTERRUPT_GEN_MEMBER(sr_vrtc_irq);
255 
256 	uint32_t screen_update_pc6001sr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
257 
258 	void pc6001sr(machine_config &config);
259 
260 	void pc6001sr_io(address_map &map);
261 	void pc6001sr_map(address_map &map);
262 protected:
263 	virtual void video_start() override;
264 	virtual void machine_reset() override;
265 
266 private:
267 	uint8_t m_sr_bank_r[8];
268 	uint8_t m_sr_bank_w[8];
269 	uint8_t m_kludge;
270 	bool m_sr_text_mode;
271 	uint8_t m_sr_text_rows;
272 	uint8_t *m_gvram;
273 	uint8_t m_bitmap_yoffs,m_bitmap_xoffs;
274 
275 	enum{
276 		SUB_CPU_IRQ = 0,
277 		JOYSTICK_IRQ,
278 		TIMER_IRQ,
279 		VOICE_IRQ,
280 		VRTC_IRQ,
281 		RS232_IRQ,
282 		PRINTER_IRQ,
283 		EXT_IRQ
284 	};
285 
286 	required_shared_ptr<uint8_t> m_sr_irq_vectors;
287 };
288 
289 #endif
290