trunk/src/mess/drivers/apricot.c
r24769 | r24770 | |
9 | 9 | |
10 | 10 | #include "emu.h" |
11 | 11 | #include "cpu/i86/i86.h" |
| 12 | #include "machine/ram.h" |
12 | 13 | #include "machine/pit8253.h" |
13 | 14 | #include "machine/i8255.h" |
14 | 15 | #include "machine/pic8259.h" |
15 | 16 | #include "machine/z80dart.h" |
| 17 | #include "machine/serial.h" |
| 18 | #include "machine/ctronics.h" |
16 | 19 | #include "machine/wd17xx.h" |
| 20 | #include "video/mc6845.h" |
17 | 21 | #include "sound/sn76496.h" |
18 | | #include "video/mc6845.h" |
19 | | #include "machine/ram.h" |
20 | 22 | #include "imagedev/flopdrv.h" |
21 | 23 | #include "formats/apridisk.h" |
22 | 24 | |
r24769 | r24770 | |
37 | 39 | m_ppi(*this, "ic17"), |
38 | 40 | m_pic(*this, "ic31"), |
39 | 41 | m_pit(*this, "ic16"), |
40 | | m_z80sio(*this, "ic15"), |
| 42 | m_sio(*this, "ic15"), |
| 43 | m_rs232(*this, "rs232"), |
| 44 | m_centronics(*this, "centronics"), |
41 | 45 | m_fdc(*this, "ic68"), |
42 | 46 | m_screen_buffer(*this, "screen_buffer"), |
| 47 | m_data_selector_dtr(1), |
| 48 | m_data_selector_rts(1), |
43 | 49 | m_video_mode(0), |
44 | 50 | m_display_on(1), |
45 | 51 | m_display_enabled(0) |
r24769 | r24770 | |
52 | 58 | required_device<i8255_device> m_ppi; |
53 | 59 | required_device<pic8259_device> m_pic; |
54 | 60 | required_device<pit8253_device> m_pit; |
55 | | required_device<z80sio0_device> m_z80sio; |
| 61 | required_device<z80sio0_device> m_sio; |
| 62 | required_device<rs232_port_device> m_rs232; |
| 63 | required_device<centronics_device> m_centronics; |
56 | 64 | required_device<wd2793_device> m_fdc; |
57 | 65 | |
58 | 66 | required_shared_ptr<UINT16> m_screen_buffer; |
59 | 67 | |
60 | | DECLARE_READ8_MEMBER(apricot_sysctrl_r); |
61 | | DECLARE_WRITE8_MEMBER(apricot_sysctrl_w); |
62 | | DECLARE_WRITE_LINE_MEMBER(apricot_pit8253_out1); |
63 | | DECLARE_WRITE_LINE_MEMBER(apricot_pit8253_out2); |
64 | | DECLARE_WRITE_LINE_MEMBER(apricot_wd2793_intrq_w); |
65 | | DECLARE_WRITE_LINE_MEMBER(apricot_wd2793_drq_w); |
66 | | DECLARE_WRITE_LINE_MEMBER(apricot_mc6845_de) { m_display_enabled = state; }; |
| 68 | DECLARE_READ8_MEMBER( apricot_sysctrl_r ); |
| 69 | DECLARE_WRITE8_MEMBER( apricot_sysctrl_w ); |
| 70 | DECLARE_WRITE_LINE_MEMBER( timer_out1 ); |
| 71 | DECLARE_WRITE_LINE_MEMBER( timer_out2 ); |
| 72 | DECLARE_WRITE_LINE_MEMBER( apricot_wd2793_intrq_w ); |
| 73 | DECLARE_WRITE_LINE_MEMBER( apricot_wd2793_drq_w ); |
| 74 | DECLARE_WRITE_LINE_MEMBER( apricot_mc6845_de ) { m_display_enabled = state; }; |
67 | 75 | |
| 76 | DECLARE_WRITE_LINE_MEMBER( data_selector_dtr_w ) { m_data_selector_dtr = state; }; |
| 77 | DECLARE_WRITE_LINE_MEMBER( data_selector_rts_w ) { m_data_selector_rts = state; }; |
| 78 | |
68 | 79 | virtual void machine_start(); |
69 | 80 | |
70 | 81 | IRQ_CALLBACK_MEMBER( irq_callback ) { return m_pic->inta_r(); } |
71 | 82 | |
| 83 | int m_data_selector_dtr; |
| 84 | int m_data_selector_rts; |
| 85 | |
72 | 86 | bool m_video_mode; |
73 | 87 | bool m_display_on; |
74 | 88 | |
r24769 | r24770 | |
104 | 118 | |
105 | 119 | static const i8255_interface apricot_i8255a_intf = |
106 | 120 | { |
| 121 | DEVCB_DEVICE_MEMBER("centronics", centronics_device, read), |
| 122 | DEVCB_DEVICE_MEMBER("centronics", centronics_device, write), |
107 | 123 | DEVCB_NULL, |
108 | | DEVCB_NULL, |
109 | | DEVCB_NULL, |
110 | 124 | DEVCB_DRIVER_MEMBER(apricot_state, apricot_sysctrl_w), |
111 | 125 | DEVCB_DRIVER_MEMBER(apricot_state, apricot_sysctrl_r), |
112 | 126 | DEVCB_NULL |
113 | 127 | }; |
114 | 128 | |
115 | | WRITE_LINE_MEMBER( apricot_state::apricot_pit8253_out1 ) |
| 129 | WRITE_LINE_MEMBER( apricot_state::timer_out1 ) |
116 | 130 | { |
117 | | /* connected to the rs232c interface */ |
| 131 | // receive clock via timer 1 |
| 132 | if (m_data_selector_rts == 0 && m_data_selector_dtr == 0) |
| 133 | m_sio->rxca_w(state); |
118 | 134 | } |
119 | 135 | |
120 | | WRITE_LINE_MEMBER( apricot_state::apricot_pit8253_out2 ) |
| 136 | WRITE_LINE_MEMBER( apricot_state::timer_out2 ) |
121 | 137 | { |
122 | | /* connected to the rs232c interface */ |
| 138 | // transmit clock via timer 2 |
| 139 | if (m_data_selector_rts == 0 && m_data_selector_dtr == 0) |
| 140 | m_sio->txca_w(state); |
| 141 | |
| 142 | // transmit and receive clock via timer 2 |
| 143 | if (m_data_selector_rts == 1 && m_data_selector_dtr == 0) |
| 144 | { |
| 145 | m_sio->txca_w(state); |
| 146 | m_sio->rxca_w(state); |
| 147 | } |
123 | 148 | } |
124 | 149 | |
125 | 150 | static const struct pit8253_interface apricot_pit8253_intf = |
126 | 151 | { |
127 | 152 | { |
128 | | { XTAL_4MHz / 16, DEVCB_LINE_VCC, DEVCB_DEVICE_LINE_MEMBER("ic31", pic8259_device, ir6_w) }, |
129 | | { 0 /*XTAL_4MHz / 2*/, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(apricot_state, apricot_pit8253_out1) }, |
130 | | { 0 /*XTAL_4MHz / 2*/, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(apricot_state, apricot_pit8253_out2) } |
| 153 | { XTAL_4MHz / 16, DEVCB_LINE_VCC, DEVCB_DEVICE_LINE_MEMBER("ic31", pic8259_device, ir6_w) }, |
| 154 | { XTAL_4MHz / 2, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(apricot_state, timer_out1) }, |
| 155 | { XTAL_4MHz / 2, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(apricot_state, timer_out2) } |
131 | 156 | } |
132 | 157 | }; |
133 | 158 | |
r24769 | r24770 | |
137 | 162 | XTAL_4MHz / 16, XTAL_4MHz / 16, |
138 | 163 | |
139 | 164 | // channel a |
| 165 | DEVCB_DEVICE_LINE_MEMBER("rs232", serial_port_device, rx), |
| 166 | DEVCB_DEVICE_LINE_MEMBER("rs232", serial_port_device, tx), |
| 167 | DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, dtr_w), |
| 168 | DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, rts_w), |
| 169 | DEVCB_NULL, // wait/ready: i8089 data request channel 2 |
140 | 170 | DEVCB_NULL, |
141 | | DEVCB_NULL, |
142 | | DEVCB_NULL, |
143 | | DEVCB_NULL, |
144 | | DEVCB_NULL, |
145 | | DEVCB_NULL, |
146 | 171 | |
147 | 172 | // channel b |
148 | 173 | DEVCB_NULL, |
149 | 174 | DEVCB_NULL, |
| 175 | DEVCB_DRIVER_LINE_MEMBER(apricot_state, data_selector_dtr_w), |
| 176 | DEVCB_DRIVER_LINE_MEMBER(apricot_state, data_selector_rts_w), |
150 | 177 | DEVCB_NULL, |
151 | 178 | DEVCB_NULL, |
152 | | DEVCB_NULL, |
153 | | DEVCB_NULL, |
154 | 179 | |
155 | 180 | DEVCB_DEVICE_LINE_MEMBER("ic31", pic8259_device, ir5_w), |
156 | 181 | DEVCB_NULL, |
r24769 | r24770 | |
159 | 184 | DEVCB_NULL |
160 | 185 | }; |
161 | 186 | |
| 187 | // note: missing a receive clock callback to support external clock mode |
| 188 | // (m_data_selector_rts == 1 and m_data_selector_dtr == 0) |
| 189 | static const rs232_port_interface rs232_intf = |
| 190 | { |
| 191 | DEVCB_NULL, |
| 192 | DEVCB_DEVICE_LINE_MEMBER("ic15", z80dart_device, dcda_w), |
| 193 | DEVCB_DEVICE_LINE_MEMBER("ic15", z80dart_device, synca_w), |
| 194 | DEVCB_NULL, |
| 195 | DEVCB_DEVICE_LINE_MEMBER("ic15", z80dart_device, ctsa_w) |
| 196 | }; |
162 | 197 | |
| 198 | // note: fault output should be connected to syncb input of the sio |
| 199 | static const centronics_interface apricot_centronics_intf = |
| 200 | { |
| 201 | DEVCB_DEVICE_LINE_MEMBER("ic15", z80dart_device, ctsb_w), |
| 202 | DEVCB_DEVICE_LINE_MEMBER("ic15", z80dart_device, dcdb_w), |
| 203 | DEVCB_NULL |
| 204 | }; |
| 205 | |
| 206 | |
163 | 207 | /*************************************************************************** |
164 | 208 | FLOPPY |
165 | 209 | ***************************************************************************/ |
r24769 | r24770 | |
183 | 227 | { FLOPPY_0, FLOPPY_1, NULL, NULL } |
184 | 228 | }; |
185 | 229 | |
| 230 | static LEGACY_FLOPPY_OPTIONS_START( apricot ) |
| 231 | LEGACY_FLOPPY_OPTION |
| 232 | ( |
| 233 | apridisk, "dsk", "ACT Apricot disk image", apridisk_identify, apridisk_construct, NULL, |
| 234 | HEADS(1-[2]) |
| 235 | TRACKS(70/[80]) |
| 236 | SECTORS([9]/18) |
| 237 | SECTOR_LENGTH([512]) |
| 238 | FIRST_SECTOR_ID([1]) |
| 239 | ) |
| 240 | LEGACY_FLOPPY_OPTIONS_END |
186 | 241 | |
| 242 | static const floppy_interface apricot_floppy_interface = |
| 243 | { |
| 244 | DEVCB_NULL, |
| 245 | DEVCB_NULL, |
| 246 | DEVCB_NULL, |
| 247 | DEVCB_NULL, |
| 248 | DEVCB_NULL, |
| 249 | FLOPPY_STANDARD_3_5_DSDD, |
| 250 | LEGACY_FLOPPY_OPTIONS_NAME(apricot), |
| 251 | "floppy_3_5", |
| 252 | NULL |
| 253 | }; |
| 254 | |
| 255 | |
187 | 256 | /*************************************************************************** |
188 | 257 | VIDEO EMULATION |
189 | 258 | ***************************************************************************/ |
r24769 | r24770 | |
191 | 260 | UINT32 apricot_state::screen_update_apricot(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
192 | 261 | { |
193 | 262 | if (!m_display_on) |
194 | | m_crtc->screen_update( screen, bitmap, cliprect); |
| 263 | m_crtc->screen_update(screen, bitmap, cliprect); |
195 | 264 | else |
196 | 265 | bitmap.fill(RGB_BLACK, cliprect); |
197 | 266 | |
r24769 | r24770 | |
286 | 355 | |
287 | 356 | |
288 | 357 | /*************************************************************************** |
289 | | INPUT PORTS |
| 358 | MACHINE DRIVERS |
290 | 359 | ***************************************************************************/ |
291 | 360 | |
292 | | static INPUT_PORTS_START( apricot ) |
293 | | INPUT_PORTS_END |
294 | | |
295 | | |
296 | | /*************************************************************************** |
297 | | SOUND INTERFACE |
298 | | **************************************************************************/ |
299 | | |
300 | | |
301 | | //------------------------------------------------- |
302 | | // sn76496_config psg_intf |
303 | | //------------------------------------------------- |
304 | | |
305 | 361 | static const sn76496_config psg_intf = |
306 | 362 | { |
307 | 363 | DEVCB_NULL |
308 | 364 | }; |
309 | 365 | |
310 | | |
311 | | /*************************************************************************** |
312 | | MACHINE DRIVERS |
313 | | ***************************************************************************/ |
314 | | |
315 | | static LEGACY_FLOPPY_OPTIONS_START( apricot ) |
316 | | LEGACY_FLOPPY_OPTION |
317 | | ( |
318 | | apridisk, "dsk", "ACT Apricot disk image", apridisk_identify, apridisk_construct, NULL, |
319 | | HEADS(1-[2]) |
320 | | TRACKS(70/[80]) |
321 | | SECTORS([9]/18) |
322 | | SECTOR_LENGTH([512]) |
323 | | FIRST_SECTOR_ID([1]) |
324 | | ) |
325 | | LEGACY_FLOPPY_OPTIONS_END |
326 | | |
327 | | static const floppy_interface apricot_floppy_interface = |
328 | | { |
329 | | DEVCB_NULL, |
330 | | DEVCB_NULL, |
331 | | DEVCB_NULL, |
332 | | DEVCB_NULL, |
333 | | DEVCB_NULL, |
334 | | FLOPPY_STANDARD_3_5_DSDD, |
335 | | LEGACY_FLOPPY_OPTIONS_NAME(apricot), |
336 | | "floppy_3_5", |
337 | | NULL |
338 | | }; |
339 | | |
340 | 366 | static MACHINE_CONFIG_START( apricot, apricot_state ) |
341 | | |
342 | | /* basic machine hardware */ |
343 | 367 | MCFG_CPU_ADD("maincpu", I8086, XTAL_15MHz / 3) |
344 | 368 | MCFG_CPU_PROGRAM_MAP(apricot_mem) |
345 | 369 | MCFG_CPU_IO_MAP(apricot_io) |
346 | 370 | |
347 | 371 | // MCFG_CPU_ADD("ic71", I8089, XTAL_15MHz / 3) |
348 | 372 | |
349 | | /* video hardware */ |
| 373 | // video hardware |
350 | 374 | MCFG_SCREEN_ADD("screen", RASTER) |
351 | 375 | MCFG_SCREEN_SIZE(800, 400) |
352 | 376 | MCFG_SCREEN_VISIBLE_AREA(0, 800-1, 0, 400-1) |
353 | 377 | MCFG_SCREEN_REFRESH_RATE(72) |
354 | 378 | MCFG_SCREEN_UPDATE_DRIVER(apricot_state, screen_update_apricot) |
355 | 379 | |
356 | | /* sound hardware */ |
| 380 | // sound hardware |
357 | 381 | MCFG_SPEAKER_STANDARD_MONO("mono") |
358 | 382 | MCFG_SOUND_ADD("ic7", SN76489, XTAL_4MHz / 2) |
359 | 383 | MCFG_SOUND_CONFIG(psg_intf) |
360 | 384 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) |
361 | 385 | |
362 | | /* internal ram */ |
| 386 | // internal ram |
363 | 387 | MCFG_RAM_ADD(RAM_TAG) |
364 | 388 | MCFG_RAM_DEFAULT_SIZE("256k") |
365 | 389 | MCFG_RAM_EXTRA_OPTIONS("384k,512k") /* with 1 or 2 128k expansion boards */ |
366 | 390 | |
367 | | /* Devices */ |
| 391 | // devices |
368 | 392 | MCFG_MC6845_ADD("ic30", MC6845, "screen", XTAL_15MHz / 10, apricot_mc6845_intf) |
369 | 393 | MCFG_I8255A_ADD("ic17", apricot_i8255a_intf) |
370 | 394 | MCFG_PIC8259_ADD("ic31", INPUTLINE("maincpu", 0), VCC, NULL) |
371 | 395 | MCFG_PIT8253_ADD("ic16", apricot_pit8253_intf) |
372 | 396 | MCFG_Z80SIO0_ADD("ic15", XTAL_15MHz / 6, apricot_z80sio_intf) |
373 | 397 | |
374 | | /* floppy */ |
| 398 | // rs232 port |
| 399 | MCFG_RS232_PORT_ADD("rs232", rs232_intf, default_rs232_devices, NULL) |
| 400 | |
| 401 | // centronics printer |
| 402 | MCFG_CENTRONICS_PRINTER_ADD("centronics", apricot_centronics_intf) |
| 403 | |
| 404 | // floppy |
375 | 405 | MCFG_WD2793_ADD("ic68", apricot_wd17xx_intf) |
376 | 406 | MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(apricot_floppy_interface) |
377 | 407 | MACHINE_CONFIG_END |
r24769 | r24770 | |
401 | 431 | GAME DRIVERS |
402 | 432 | ***************************************************************************/ |
403 | 433 | |
404 | | /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ |
405 | | COMP( 1983, apricot, 0, 0, apricot, apricot, driver_device, 0, "ACT", "Apricot PC", GAME_NOT_WORKING ) |
406 | | COMP( 1984, apricotxi, apricot, 0, apricotxi, apricot, driver_device, 0, "ACT", "Apricot Xi", GAME_NOT_WORKING ) |
| 434 | /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ |
| 435 | COMP( 1983, apricot, 0, 0, apricot, 0, driver_device, 0, "ACT", "Apricot PC", GAME_NOT_WORKING ) |
| 436 | COMP( 1984, apricotxi, apricot, 0, apricotxi, 0, driver_device, 0, "ACT", "Apricot Xi", GAME_NOT_WORKING ) |