1 // license:BSD-3-Clause
2 // copyright-holders:Carl
3 // Commodore PC 10 / PC 20 / PC 30
4 /***************************************************************************
5 Commodore PC10 / PC20 / PC30
6 Links: http://www.zimmers.net/cbmpics/cpcs.html , https://de.wikipedia.org/wiki/Commodore_PC-10_bis_PC-60 , http://mingos-commodorepage.tumblr.com/post/123656301482/commodore-pc-20-beim-pc-20-handelt-es-sich-um
7 http://www.richardlagendijk.nl/cip/computer/item/pc20ii/de
8 Form Factor: Desktop
9 CPU: 8088 @ 4.77 MHz
10 RAM: 256K / 512K / 640K
11 BUS: 5x ISA
12 Video: MDA
13 Mass storage: PC10: 1 or 2x 5.25" 360K , PC20: 1x 360K + 10MB HD, PC30: 1x 360K + 20MB HD
14 On board ports: Floppy, serial, parallel, speaker
15 Options: 8087 FPU
16 
17 
18 Commodore PC-10 III
19 =============
20 Links: http://dostalgie.de/downloads/pc10III-20III/PC10III_OM_COMMODORE_EN_DE.pdf ; ftp://ftp.zimmers.net/pub/cbm-pc/documents/PC-8088-Information.txt
21 Info: PC10-III and PC20-III are the same machines - PC10 has two floppies, PC20 one floppy and one harddisk
22 Form Factor: Desktop
23 CPU: 8088 @ 4.77 MHz / 7.16 MHz / 9.54 MHz
24 RAM: 640K
25 Bus: 3x ISA
26 Video: On board: MDA/CGA/Hercules/Plantronics
27 Mass storage: 1x Floppy 5.25" 360K and (PC10) another 360K or (PC20) 3.5" harddisk
28 On board ports: Floppy, XTA(8-bit IDE) Harddisk, Mouse, serial, parallel, RTC, Speaker
29 Options: 8087 FPU
30 ***************************************************************************/
31 
32 #include "emu.h"
33 
34 #include "cpu/i86/i86.h"
35 #include "machine/genpc.h"
36 #include "machine/nvram.h"
37 #include "machine/pckeybrd.h"
38 
39 #include "coreutil.h"
40 
41 
42 class compc_state : public driver_device
43 {
44 public:
compc_state(const machine_config & mconfig,device_type type,const char * tag)45 	compc_state(const machine_config &mconfig, device_type type, const char *tag) :
46 		driver_device(mconfig, type, tag),
47 		m_maincpu(*this, "maincpu"),
48 		m_mb(*this, "mb"),
49 		m_keyboard(*this, "pc_keyboard")
50 	{ }
51 
52 	required_device<cpu_device> m_maincpu;
53 	required_device<pc_noppi_mb_device> m_mb;
54 	required_device<pc_keyboard_device> m_keyboard;
55 
56 	void machine_reset() override;
57 
58 	void pioiii_w(offs_t offset, u8 data);
59 	u8 pioiii_r(offs_t offset);
60 	void pio_w(offs_t offset, u8 data);
61 	u8 pio_r(offs_t offset);
62 
63 	void compc(machine_config &config);
64 	void pc10iii(machine_config &config);
65 	void compc1(machine_config &config);
66 	void compc_io(address_map &map);
67 	void compc_map(address_map &map);
68 	void compciii_io(address_map &map);
69 private:
70 	u8 m_portb, m_dips;
71 };
72 
machine_reset()73 void compc_state::machine_reset()
74 {
75 	m_portb = 0;
76 	m_dips = 0;
77 }
78 
pio_w(offs_t offset,u8 data)79 void compc_state::pio_w(offs_t offset, u8 data)
80 {
81 	switch (offset)
82 	{
83 		case 1:
84 			m_portb = data;
85 			m_mb->m_pit8253->write_gate2(BIT(data, 0));
86 			m_mb->pc_speaker_set_spkrdata(BIT(data, 1));
87 			m_keyboard->enable(BIT(data, 6));
88 			if(data & 0x80)
89 				m_mb->m_pic8259->ir1_w(0);
90 			break;
91 	}
92 }
93 
94 
pio_r(offs_t offset)95 u8 compc_state::pio_r(offs_t offset)
96 {
97 	int data = 0;
98 	switch (offset)
99 	{
100 		case 0:
101 			data = m_keyboard->read();
102 			break;
103 		case 1:
104 			data = m_portb;
105 			break;
106 		case 2:
107 			if(BIT(m_portb, 3))
108 			{
109 				/* read hi nibble of S2 */
110 				data = (ioport("DSW0")->read() >> 4) & 0x0f;
111 			}
112 			else
113 			{
114 				/* read lo nibble of S2 */
115 				data = ioport("DSW0")->read() & 0x0f;
116 			}
117 			if(m_mb->pit_out2())
118 				data |= 0x20;
119 			break;
120 	}
121 	return data;
122 }
123 
pioiii_w(offs_t offset,u8 data)124 void compc_state::pioiii_w(offs_t offset, u8 data)
125 {
126 	switch (offset)
127 	{
128 		case 1:
129 			m_portb = data;
130 			m_mb->m_pit8253->write_gate2(BIT(data, 0));
131 			m_mb->pc_speaker_set_spkrdata(BIT(data, 1));
132 			m_keyboard->enable(BIT(data, 6));
133 			if(data & 0x80)
134 				m_mb->m_pic8259->ir1_w(0);
135 			break;
136 		case 2:
137 			m_dips = (data & ~0x30) | ioport("DSW0")->read();
138 			break;
139 	}
140 }
141 
142 
pioiii_r(offs_t offset)143 u8 compc_state::pioiii_r(offs_t offset)
144 {
145 	int data = 0;
146 	switch (offset)
147 	{
148 		case 0:
149 			data = m_keyboard->read();
150 			break;
151 		case 1:
152 			data = m_portb;
153 			break;
154 		case 2:
155 			if(!BIT(m_portb, 2))
156 				data = (m_dips >> 4) & 0x0f;
157 			else
158 				data = m_dips & 0x0f;
159 			if(m_mb->pit_out2())
160 				data |= 0x30;
161 			break;
162 	}
163 	return data;
164 }
165 
166 static INPUT_PORTS_START(compciii)
167 	PORT_START("DSW0") /* IN1 */
168 	PORT_DIPNAME( 0x30, 0x30, "Graphics adapter")
169 	PORT_DIPSETTING(    0x00, "EGA/VGA" )
170 	PORT_DIPSETTING(    0x10, "Color 40x25" )
171 	PORT_DIPSETTING(    0x20, "Color 80x25" )
172 	PORT_DIPSETTING(    0x30, "Monochrome" )
173 INPUT_PORTS_END
174 
INPUT_PORTS_START(compc)175 static INPUT_PORTS_START(compc)
176 	PORT_START("DSW0") /* IN1 */
177 	PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives")
178 	PORT_DIPSETTING(    0x00, "1" )
179 	PORT_DIPSETTING(    0x40, "2" )
180 	PORT_DIPSETTING(    0x80, "3" )
181 	PORT_DIPSETTING(    0xc0, "4" )
182 	PORT_DIPNAME( 0x30, 0x30, "Graphics adapter")
183 	PORT_DIPSETTING(    0x00, "EGA/VGA" )
184 	PORT_DIPSETTING(    0x10, "Color 40x25" )
185 	PORT_DIPSETTING(    0x20, "Color 80x25" )
186 	PORT_DIPSETTING(    0x30, "Monochrome" )
187 	PORT_DIPNAME( 0x0c, 0x0c, "RAM banks")
188 	PORT_DIPSETTING(    0x00, "1 - 16/ 64/256K" )
189 	PORT_DIPSETTING(    0x04, "2 - 32/128/512K" )
190 	PORT_DIPSETTING(    0x08, "3 - 48/192/576K" )
191 	PORT_DIPSETTING(    0x0c, "4 - 64/256/640K" )
192 	PORT_DIPNAME( 0x02, 0x00, "8087 installed")
193 	PORT_DIPSETTING(    0x00, DEF_STR(No) )
194 	PORT_DIPSETTING(    0x02, DEF_STR(Yes) )
195 	PORT_DIPNAME( 0x01, 0x01, "Boot from floppy")
196 	PORT_DIPSETTING(    0x01, DEF_STR(Yes) )
197 	PORT_DIPSETTING(    0x00, DEF_STR(No) )
198 INPUT_PORTS_END
199 
200 void compc_state::compc_map(address_map &map)
201 {
202 	map.unmap_value_high();
203 	map(0xf0000, 0xfffff).rom().region("bios", 0);
204 }
205 
compc_io(address_map & map)206 void compc_state::compc_io(address_map &map)
207 {
208 	map.unmap_value_high();
209 	map(0x0000, 0x00ff).m(m_mb, FUNC(pc_noppi_mb_device::map));
210 	map(0x0060, 0x0063).rw(FUNC(compc_state::pio_r), FUNC(compc_state::pio_w));
211 }
212 
compciii_io(address_map & map)213 void compc_state::compciii_io(address_map &map)
214 {
215 	map.unmap_value_high();
216 	map(0x0000, 0x00ff).m(m_mb, FUNC(pc_noppi_mb_device::map));
217 	map(0x0060, 0x0063).rw(FUNC(compc_state::pioiii_r), FUNC(compc_state::pioiii_w));
218 }
219 
compc(machine_config & config)220 void compc_state::compc(machine_config &config)
221 {
222 	I8088(config, m_maincpu, 4772720*2);
223 	m_maincpu->set_addrmap(AS_PROGRAM, &compc_state::compc_map);
224 	m_maincpu->set_addrmap(AS_IO, &compc_state::compc_io);
225 	m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
226 
227 	PCNOPPI_MOTHERBOARD(config, m_mb, 0).set_cputag(m_maincpu);
228 	m_mb->int_callback().set_inputline(m_maincpu, 0);
229 	m_mb->nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
230 	config.device_remove("mb:pit8253");
231 	fe2010_pit_device &pit(FE2010_PIT(config, "mb:pit8253", 0));
232 	pit.set_clk<0>(XTAL(14'318'181)/12.0); /* heartbeat IRQ */
233 	pit.out_handler<0>().set("mb:pic8259", FUNC(pic8259_device::ir0_w));
234 	pit.set_clk<1>(XTAL(14'318'181)/12.0); /* dram refresh */
235 	pit.out_handler<1>().set(m_mb, FUNC(ibm5160_mb_device::pc_pit8253_out1_changed));
236 	pit.set_clk<2>(XTAL(14'318'181)/12.0); /* pio port c pin 4, and speaker polling enough */
237 	pit.out_handler<2>().set(m_mb, FUNC(ibm5160_mb_device::pc_pit8253_out2_changed));
238 
239 	// FIXME: determine ISA bus clock
240 	ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "mda", false);
241 	ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "lpt", false);
242 	ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "com", false);
243 	ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
244 
245 	PC_KEYB(config, m_keyboard);
246 	m_keyboard->keypress().set("mb:pic8259", FUNC(pic8259_device::ir1_w));
247 
248 	/* internal ram */
249 	RAM(config, RAM_TAG).set_default_size("256K").set_extra_options("512K, 640K");
250 
251 	/* software lists */
252 	SOFTWARE_LIST(config, "disk_list").set_original("ibm5150");
253 }
254 
pc10iii(machine_config & config)255 void compc_state::pc10iii(machine_config &config)
256 {
257 	compc(config);
258 	m_maincpu->set_addrmap(AS_IO, &compc_state::compciii_io);
259 }
260 
261 ROM_START(compc10)
262 	ROM_REGION(0x10000, "bios", 0)
263 	ROM_DEFAULT_BIOS("v205")
264 	ROM_SYSTEM_BIOS(0, "v201", "v2.01")
265 	ROMX_LOAD("bios2.01-380258-01.bin", 0xc000, 0x4000, CRC(921de6aa) SHA1(eb6c3fe4200cb40da20131b264521ba9f82021b2), ROM_BIOS(0))
266 	ROM_SYSTEM_BIOS(1, "v203", "v2.03")
267 	ROMX_LOAD("380258-03", 0xc000, 0x4000, CRC(fbe53865) SHA1(a6d6433c055d1c328f71403a2ed2fd5908c23d40), ROM_BIOS(1))
268 	ROM_SYSTEM_BIOS(2, "v205", "v2.05")
269 	ROMX_LOAD("380258-04", 0xc000, 0x4000, CRC(e61084da) SHA1(dfb360a6ec6cb1250d8a6243f12a0d702e8479cb), ROM_BIOS(2))
270 ROM_END
271 
272 // Note: Commodore PC20-III, PC10-III and COLT share the same BIOS
273 ROM_START(pc10iii)
274 	ROM_DEFAULT_BIOS("v441")
275 	ROM_SYSTEM_BIOS(0, "v435", "v4.35")
276 	ROM_SYSTEM_BIOS(1, "v435c", "v4.35c")
277 	ROM_SYSTEM_BIOS(2, "v436", "v4.36")
278 	ROM_SYSTEM_BIOS(3, "v436b", "v4.36b")
279 	ROM_SYSTEM_BIOS(4, "v436c", "v4.36c")
280 	ROM_SYSTEM_BIOS(5, "v438", "v4.38")
281 	ROM_SYSTEM_BIOS(6, "v439", "v4.39")
282 	ROM_SYSTEM_BIOS(7, "v440", "v4.40")
283 	ROM_SYSTEM_BIOS(8, "v441", "v4.41")
284 
285 	ROM_REGION(0x10000, "bios", 0)
286 	ROMX_LOAD("318085-01.u201", 0x8000, 0x8000, CRC(be752d1e) SHA1(5e5e63cd6d6269816cd691602e4c4d209fe3df67), ROM_BIOS(0))
287 	ROMX_LOAD("318085-01_pc-3_bios_4.35c.bin", 0x8000, 0x8000, CRC(adbc4ab7) SHA1(c157e5bc115906705849f185e4fe8e42ab28930c), ROM_BIOS(1))
288 	ROMX_LOAD("318085-02.u201", 0x8000, 0x8000, CRC(db0c9d04) SHA1(1314ce606840f4f78e58e5f78909e8971387f387), ROM_BIOS(2))
289 	ROMX_LOAD("318085-03.u201", 0x8000, 0x8000, CRC(559e6b76) SHA1(cdfd4781f3520db7f5111469ebb29c10b39ab587), ROM_BIOS(3))
290 	ROMX_LOAD("318085-04.u201", 0x8000, 0x8000, CRC(f81e67f0) SHA1(b46613cb5c6ac4beb769778bc35f81777ebe02e1), ROM_BIOS(4))
291 	ROMX_LOAD("318085-05.u201", 0x8000, 0x8000, CRC(ae9e6a31) SHA1(853ee251cf230818c407a8d13ef060a21c90a8c1), ROM_BIOS(5))
292 	ROMX_LOAD("318085-06.u201", 0x8000, 0x8000, CRC(1901993c) SHA1(f75060c1c442376bd42c61e74fa9eee053351791), ROM_BIOS(6))
293 	ROMX_LOAD("318085-07.u201", 0x8000, 0x8000, CRC(505d52b0) SHA1(f717c6ab791d51f35e1c38ffbc81a44075b5f2f8), ROM_BIOS(7))
294 	ROMX_LOAD("318085-08.u201", 0x8000, 0x8000, CRC(7e228dc8) SHA1(958dfdd637bd31c01b949fac729d6973a7e630bc), ROM_BIOS(8))
295 
296 	ROM_REGION(0x8000, "gfx1", 0)
297 	ROMX_LOAD("318086-01_p10c_164a.bin", 0x0000, 0x4000, CRC(ee6c27f0) SHA1(e769cc3a49a1d708bd74eb4ac85bb6ea67220d38), ROM_BIOS(0)) // came with ROM 4.35c
298 	ROMX_LOAD("318086-01_p10c_164a.bin", 0x0000, 0x4000, CRC(ee6c27f0) SHA1(e769cc3a49a1d708bd74eb4ac85bb6ea67220d38), ROM_BIOS(1))
299 	ROMX_LOAD("318086-02.u607", 0x0000, 0x8000, CRC(b406651c) SHA1(856f58353391a74a06ebb8ec9f8333d7d69e5fd6), ROM_BIOS(2))
300 	ROMX_LOAD("318086-02.u607", 0x0000, 0x8000, CRC(b406651c) SHA1(856f58353391a74a06ebb8ec9f8333d7d69e5fd6), ROM_BIOS(3))
301 	ROMX_LOAD("318086-02.u607", 0x0000, 0x8000, CRC(b406651c) SHA1(856f58353391a74a06ebb8ec9f8333d7d69e5fd6), ROM_BIOS(4))
302 	ROMX_LOAD("318086-02.u607", 0x0000, 0x8000, CRC(b406651c) SHA1(856f58353391a74a06ebb8ec9f8333d7d69e5fd6), ROM_BIOS(5))
303 	ROMX_LOAD("318086-02.u607", 0x0000, 0x8000, CRC(b406651c) SHA1(856f58353391a74a06ebb8ec9f8333d7d69e5fd6), ROM_BIOS(6))
304 	ROMX_LOAD("318086-02.u607", 0x0000, 0x8000, CRC(b406651c) SHA1(856f58353391a74a06ebb8ec9f8333d7d69e5fd6), ROM_BIOS(7))
305 	ROMX_LOAD("318086-02.u607", 0x0000, 0x8000, CRC(b406651c) SHA1(856f58353391a74a06ebb8ec9f8333d7d69e5fd6), ROM_BIOS(8))
306 ROM_END
307 
308 
309 /*********************************************************** Commodore PC-1 ***
310 
311 Links: http://www.amiga-stuff.com/hardware/pc-i.html , http://www.zimmers.net/cbmpics/cpci.html
312 Form Factor: Desktop
313 CPU: 8088 @ 4.77 MHz
314 RAM: 512K / 640K
315 Bus: Proprietary expansion slot, carrying almost all ISA signals
316 Video: On board, MDA/Hercules/CGA
317 Mass storage: 1x 5.25" 360K
318 On board ports: Floppy, floppy expansion (for Amiga A1010/1011 (720 KB, 3.5") or A1020 (360 KB, 5.25" drives), speaker (but no speaker fitted), mouse,
319 Options: 8087 FPU
320 Expansion: Expansion box: 2x ISA
321 
322 ******************************************************************************/
323 
324 ROM_START( compc1 )
325 	ROM_DEFAULT_BIOS("bios12")
326 	ROM_REGION(0x10000, "bios", 0)
327 	ROM_SYSTEM_BIOS(0, "bios11", "PC-1 BIOS Rev. 1.1")
328 	ROMX_LOAD("pc1_bios.bin", 0xc000, 0x4000, CRC(e37367c8) SHA1(9aac9c38b4ebdb9a740e393199c2eff75a0bde03), ROM_BIOS(1))
329 	ROM_SYSTEM_BIOS(1, "bios12", "PC-1 BIOS Rev. 1.2")
330 	ROMX_LOAD("cbm-pci-bios-v1.2-380270-02.bin", 0xc000, 0x4000, CRC(7f744f87) SHA1(07f94a7e8ca4ddd1c738b304d24358711b4cd2ca), ROM_BIOS(1))
331 	ROM_REGION(0x8000, "gfx1", 0)
332 	ROM_LOAD("pc1_char.bin", 0x0000, 0x4000, CRC(ee6c27f0) SHA1(e769cc3a49a1d708bd74eb4ac85bb6ea67220d38))
333 ROM_END
334 
335 //    YEAR  NAME     PARENT   COMPAT  MACHINE  INPUT     CLASS        INIT        COMPANY                        FULLNAME               FLAGS
336 COMP( 1984, compc10, ibm5150, 0,      compc,   compc,    compc_state, empty_init, "Commodore Business Machines", "Commodore PC 10",     MACHINE_NOT_WORKING )
337 COMP( 1987, pc10iii, ibm5150, 0,      pc10iii, compciii, compc_state, empty_init, "Commodore Business Machines", "Commodore PC-10 III", MACHINE_NOT_WORKING )
338 COMP( 198?, compc1,  ibm5150, 0,      pc10iii, compciii, compc_state, empty_init, "Commodore Business Machines", "PC-1",                MACHINE_NOT_WORKING )
339