1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 #ifndef MAME_INCLUDES_PC1512_H
4 #define MAME_INCLUDES_PC1512_H
5 
6 #pragma once
7 
8 #include "bus/centronics/ctronics.h"
9 #include "bus/isa/isa.h"
10 #include "bus/isa/isa_cards.h"
11 #include "bus/isa/pc1640_iga.h"
12 #include "bus/pc1512/mouse.h"
13 #include "cpu/i86/i86.h"
14 #include "cpu/mcs48/mcs48.h"
15 #include "imagedev/floppy.h"
16 #include "machine/am9517a.h"
17 #include "machine/buffer.h"
18 #include "machine/ins8250.h"
19 #include "machine/mc146818.h"
20 #include "machine/pic8259.h"
21 #include "machine/pit8253.h"
22 #include "machine/pc1512kb.h"
23 #include "machine/upd765.h"
24 #include "machine/ram.h"
25 #include "sound/spkrdev.h"
26 #include "video/ams40041.h"
27 
28 #include "formats/pc_dsk.h"
29 
30 #define I8086_TAG       "ic120"
31 #define I8087_TAG       "ic119"
32 #define I8048_TAG       "i8048"
33 #define I8237A5_TAG     "ic130"
34 #define I8259A2_TAG     "ic109"
35 #define I8253_TAG       "ic114"
36 #define MC146818_TAG    "ic134"
37 #define UPD765A_TAG     "ic112"
38 #define INS8250_TAG     "ic106"
39 #define AMS40041_TAG    "ic126"
40 #define CENTRONICS_TAG  "centronics"
41 #define ISA_BUS_TAG     "isa"
42 #define RS232_TAG       "rs232"
43 #define SCREEN_TAG      "screen"
44 
45 class pc1512_base_state : public driver_device
46 {
47 public:
pc1512_base_state(const machine_config & mconfig,device_type type,const char * tag)48 	pc1512_base_state(const machine_config &mconfig, device_type type, const char *tag) :
49 		driver_device(mconfig, type, tag),
50 		m_maincpu(*this, I8086_TAG),
51 		m_dmac(*this, I8237A5_TAG),
52 		m_pic(*this, I8259A2_TAG),
53 		m_pit(*this, I8253_TAG),
54 		m_rtc(*this, MC146818_TAG),
55 		m_fdc(*this, UPD765A_TAG),
56 		m_uart(*this, INS8250_TAG),
57 		m_centronics(*this, CENTRONICS_TAG),
58 		m_cent_data_out(*this, "cent_data_out"),
59 		m_speaker(*this, "speaker"),
60 		m_kb(*this, PC1512_KEYBOARD_TAG),
61 		m_ram(*this, RAM_TAG),
62 		m_floppy(*this, UPD765A_TAG ":%u", 0U),
63 		m_bus(*this, ISA_BUS_TAG),
64 		m_lk(*this, "LK"),
65 		m_pit1(0),
66 		m_pit2(0),
67 		m_status1(0),
68 		m_status2(0),
69 		m_port61(0),
70 		m_nmi_enable(0),
71 		m_kb_bits(0),
72 		m_kbclk(1),
73 		m_kbdata(1),
74 		m_dreq0(0),
75 		m_nden(1),
76 		m_dint(0),
77 		m_ddrq(0),
78 		m_fdc_dsr(0),
79 		m_neop(0),
80 		m_ack_int_enable(1),
81 		m_centronics_ack(0),
82 		m_speaker_drive(0)
83 	{ }
84 
85 	required_device<cpu_device> m_maincpu;
86 	required_device<am9517a_device> m_dmac;
87 	required_device<pic8259_device> m_pic;
88 	required_device<pit8253_device> m_pit;
89 	required_device<mc146818_device> m_rtc;
90 	required_device<upd765a_device> m_fdc;
91 	required_device<ins8250_device> m_uart;
92 	required_device<centronics_device> m_centronics;
93 	required_device<output_latch_device> m_cent_data_out;
94 	required_device<speaker_sound_device> m_speaker;
95 	required_device<pc1512_keyboard_device> m_kb;
96 	required_device<ram_device> m_ram;
97 	required_device_array<floppy_connector, 2> m_floppy;
98 	required_device<isa8_device> m_bus;
99 	required_ioport m_lk;
100 
101 	virtual void machine_start() override;
102 	virtual void machine_reset() override;
103 
104 	void update_speaker();
105 	void update_fdc_int();
106 	void update_fdc_drq();
107 	void update_fdc_tc();
108 	void update_ack();
109 
110 	uint8_t system_r(offs_t offset);
111 	void system_w(offs_t offset, uint8_t data);
112 	uint8_t mouse_r(offs_t offset);
113 	void mouse_w(offs_t offset, uint8_t data);
114 	void dma_page_w(offs_t offset, uint8_t data);
115 	void nmi_mask_w(uint8_t data);
116 	uint8_t printer_r(offs_t offset);
117 	void printer_w(offs_t offset, uint8_t data);
118 	DECLARE_WRITE_LINE_MEMBER( kbdata_w );
119 	DECLARE_WRITE_LINE_MEMBER( kbclk_w );
120 	DECLARE_WRITE_LINE_MEMBER( pit1_w );
121 	DECLARE_WRITE_LINE_MEMBER( pit2_w );
122 	DECLARE_WRITE_LINE_MEMBER( hrq_w );
123 	DECLARE_WRITE_LINE_MEMBER( eop_w );
124 	uint8_t memr_r(offs_t offset);
125 	void memw_w(offs_t offset, uint8_t data);
126 	uint8_t ior1_r();
127 	uint8_t ior2_r();
128 	uint8_t ior3_r();
129 	void iow0_w(uint8_t data);
130 	void iow1_w(uint8_t data);
131 	void iow2_w(uint8_t data);
132 	void iow3_w(uint8_t data);
133 	DECLARE_WRITE_LINE_MEMBER( dack0_w );
134 	DECLARE_WRITE_LINE_MEMBER( dack1_w );
135 	DECLARE_WRITE_LINE_MEMBER( dack2_w );
136 	DECLARE_WRITE_LINE_MEMBER( dack3_w );
137 	DECLARE_FLOPPY_FORMATS( floppy_formats );
138 	DECLARE_WRITE_LINE_MEMBER( fdc_int_w );
139 	DECLARE_WRITE_LINE_MEMBER( fdc_drq_w );
140 	void drive_select_w(uint8_t data);
141 	DECLARE_WRITE_LINE_MEMBER( write_centronics_ack );
142 	DECLARE_WRITE_LINE_MEMBER( write_centronics_busy );
143 	DECLARE_WRITE_LINE_MEMBER( write_centronics_perror );
144 	DECLARE_WRITE_LINE_MEMBER( write_centronics_select );
145 	DECLARE_WRITE_LINE_MEMBER( write_centronics_fault );
146 	void mouse_x_w(uint8_t data);
147 	void mouse_y_w(uint8_t data);
148 
149 	// system status register
150 	int m_pit1;
151 	int m_pit2;
152 	uint8_t m_status1;
153 	uint8_t m_status2;
154 	uint8_t m_port61;
155 
156 	// interrupt state
157 	int m_nmi_enable;
158 
159 	// keyboard state
160 	uint8_t m_kbd;
161 	int m_kb_bits;
162 	int m_kbclk;
163 	int m_kbdata;
164 
165 	// mouse state
166 	uint8_t m_mouse_x_old;
167 	uint8_t m_mouse_y_old;
168 	uint8_t m_mouse_x;
169 	uint8_t m_mouse_y;
170 
171 	// DMA state
172 	uint8_t m_dma_page[4];
173 	int m_dma_channel;
174 	int m_dreq0;
175 
176 	// floppy state
177 	int m_nden;
178 	int m_dint;
179 	int m_ddrq;
180 	uint8_t m_fdc_dsr;
181 	int m_neop;
182 
183 	// printer state
184 	int m_ack_int_enable;
185 	int m_centronics_ack;
186 	int m_centronics_busy;
187 	int m_centronics_perror;
188 	int m_centronics_select;
189 	int m_centronics_fault;
190 	uint8_t m_printer_data;
191 	uint8_t m_printer_control;
192 
193 	// sound state
194 	int m_speaker_drive;
195 };
196 
197 class pc1512_state : public pc1512_base_state
198 {
199 public:
pc1512_state(const machine_config & mconfig,device_type type,const char * tag)200 	pc1512_state(const machine_config &mconfig, device_type type, const char *tag)
201 		: pc1512_base_state(mconfig, type, tag)
202 		, m_vdu(*this, AMS40041_TAG)
203 	{ }
204 
205 	virtual void machine_start() override;
206 	virtual void machine_reset() override;
207 
208 	void pc1512hd(machine_config &config);
209 	void pc1512(machine_config &config);
210 	void pc1512dd(machine_config &config);
211 	void pc1512_io(address_map &map);
212 	void pc1512_mem(address_map &map);
213 
214 	required_device<ams40041_device> m_vdu;
215 };
216 
217 class pc1640_state : public pc1512_base_state
218 {
219 public:
pc1640_state(const machine_config & mconfig,device_type type,const char * tag)220 	pc1640_state(const machine_config &mconfig, device_type type, const char *tag)
221 		: pc1512_base_state(mconfig, type, tag)
222 		, m_sw(*this, "SW")
223 		, m_opt(0)
224 	{ }
225 
226 	virtual void machine_start() override;
227 
228 	uint8_t io_r(offs_t offset);
229 	uint8_t printer_r(offs_t offset);
230 
231 	required_ioport m_sw;
232 
233 	int m_opt;
234 	void pc1640hd(machine_config &config);
235 	void pc1640(machine_config &config);
236 	void pc1640dd(machine_config &config);
237 	void pc1640_io(address_map &map);
238 	void pc1640_mem(address_map &map);
239 };
240 
241 #endif // MAME_INCLUDES_PC1512_H
242