trunk/src/mess/drivers/pc.c
r19933 | r19934 | |
94 | 94 | #include "formats/mfi_dsk.h" |
95 | 95 | #include "formats/pc_dsk.h" |
96 | 96 | |
97 | | #include "machine/8237dma.h" |
| 97 | #include "machine/am9517a.h" |
98 | 98 | #include "sound/sn76496.h" |
99 | 99 | |
100 | 100 | #include "machine/wd17xx.h" |
r19933 | r19934 | |
192 | 192 | |
193 | 193 | static ADDRESS_MAP_START(pc8_io, AS_IO, 8, pc_state ) |
194 | 194 | ADDRESS_MAP_UNMAP_HIGH |
195 | | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE_LEGACY("dma8237", i8237_r, i8237_w) |
| 195 | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE("dma8237", am9517a_device, read, write) |
196 | 196 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE_LEGACY("pic8259", pic8259_r, pic8259_w) |
197 | 197 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE_LEGACY("pit8253", pit8253_r, pit8253_w) |
198 | 198 | AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE("ppi8255", i8255_device, read, write) |
r19933 | r19934 | |
217 | 217 | |
218 | 218 | static ADDRESS_MAP_START(pc16_io, AS_IO, 16, pc_state ) |
219 | 219 | ADDRESS_MAP_UNMAP_HIGH |
220 | | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) |
| 220 | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) |
221 | 221 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) |
222 | 222 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) |
223 | 223 | AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) |
r19933 | r19934 | |
240 | 240 | |
241 | 241 | static ADDRESS_MAP_START(ec1841_io, AS_IO, 16, pc_state) |
242 | 242 | ADDRESS_MAP_UNMAP_HIGH |
243 | | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) |
| 243 | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) |
244 | 244 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) |
245 | 245 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) |
246 | 246 | AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) |
r19933 | r19934 | |
261 | 261 | |
262 | 262 | static ADDRESS_MAP_START(iskr1031_io, AS_IO, 16, pc_state) |
263 | 263 | ADDRESS_MAP_UNMAP_HIGH |
264 | | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) |
| 264 | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) |
265 | 265 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) |
266 | 266 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) |
267 | 267 | AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) |
r19933 | r19934 | |
293 | 293 | |
294 | 294 | static ADDRESS_MAP_START(ibm5550_io, AS_IO, 16, pc_state ) |
295 | 295 | ADDRESS_MAP_UNMAP_HIGH |
296 | | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) |
| 296 | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) |
297 | 297 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) |
298 | 298 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) |
299 | 299 | AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) |
r19933 | r19934 | |
325 | 325 | |
326 | 326 | |
327 | 327 | static ADDRESS_MAP_START(europc_io, AS_IO, 8, pc_state ) |
328 | | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE_LEGACY("dma8237", i8237_r, i8237_w) |
| 328 | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE("dma8237", am9517a_device, read, write) |
329 | 329 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE_LEGACY("pic8259", pic8259_r, pic8259_w) |
330 | 330 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE_LEGACY("pit8253", pit8253_r, pit8253_w) |
331 | 331 | AM_RANGE(0x0060, 0x0063) AM_READWRITE_LEGACY(europc_pio_r, europc_pio_w) |
r19933 | r19934 | |
359 | 359 | |
360 | 360 | |
361 | 361 | static ADDRESS_MAP_START(tandy1000_io, AS_IO, 8, pc_state ) |
362 | | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE_LEGACY("dma8237", i8237_r, i8237_w) |
| 362 | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE("dma8237", am9517a_device, read, write) |
363 | 363 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE_LEGACY("pic8259", pic8259_r, pic8259_w) |
364 | 364 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE_LEGACY("pit8253", pit8253_r, pit8253_w) |
365 | 365 | AM_RANGE(0x0060, 0x0063) AM_READWRITE_LEGACY(tandy1000_pio_r, tandy1000_pio_w) |
r19933 | r19934 | |
389 | 389 | |
390 | 390 | |
391 | 391 | static ADDRESS_MAP_START(tandy1000_16_io, AS_IO, 16, pc_state ) |
392 | | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) |
| 392 | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) |
393 | 393 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) |
394 | 394 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) |
395 | 395 | AM_RANGE(0x0060, 0x0063) AM_READWRITE8_LEGACY(tandy1000_pio_r, tandy1000_pio_w, 0xffff) |
r19933 | r19934 | |
420 | 420 | |
421 | 421 | |
422 | 422 | static ADDRESS_MAP_START(tandy1000_286_io, AS_IO, 16, pc_state ) |
423 | | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) |
| 423 | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) |
424 | 424 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) |
425 | 425 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) |
426 | 426 | AM_RANGE(0x0060, 0x0063) AM_READWRITE8_LEGACY(tandy1000_pio_r, tandy1000_pio_w, 0xffff) |
r19933 | r19934 | |
1141 | 1141 | |
1142 | 1142 | MCFG_PC_FDC_XT_ADD("fdc") |
1143 | 1143 | |
1144 | | MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) |
1145 | | MCFG_FLOPPY_DRIVE_ADD("fdc:1", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) |
| 1144 | MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "35dd", 0, pc_state::floppy_formats) |
1146 | 1145 | |
1147 | 1146 | /* internal ram */ |
1148 | 1147 | MCFG_RAM_ADD(RAM_TAG) |
1149 | 1148 | MCFG_RAM_DEFAULT_SIZE("640K") |
1150 | 1149 | MACHINE_CONFIG_END |
1151 | 1150 | |
| 1151 | static MACHINE_CONFIG_DERIVED( t1000sx, t1000hx ) |
| 1152 | MCFG_DEVICE_REMOVE("fdc:0") |
| 1153 | MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) |
| 1154 | MACHINE_CONFIG_END |
1152 | 1155 | |
1153 | 1156 | static MACHINE_CONFIG_START( t1000_16, pc_state ) |
1154 | 1157 | /* basic machine hardware */ |
r19933 | r19934 | |
1190 | 1193 | MCFG_PC_LPT_ADD("lpt_2", pc_lpt_config) |
1191 | 1194 | |
1192 | 1195 | MCFG_PC_FDC_XT_ADD("fdc") |
| 1196 | MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "35dd", 0, pc_state::floppy_formats) |
1193 | 1197 | |
1194 | | MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) |
1195 | | MCFG_FLOPPY_DRIVE_ADD("fdc:1", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) |
1196 | | |
1197 | 1198 | /* internal ram */ |
1198 | 1199 | MCFG_RAM_ADD(RAM_TAG) |
1199 | 1200 | MCFG_RAM_DEFAULT_SIZE("640K") |
r19933 | r19934 | |
1240 | 1241 | MCFG_PC_LPT_ADD("lpt_2", pc_lpt_config) |
1241 | 1242 | |
1242 | 1243 | MCFG_PC_FDC_XT_ADD("fdc") |
| 1244 | MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "35dd", 0, pc_state::floppy_formats) |
1243 | 1245 | |
1244 | | MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) |
1245 | | MCFG_FLOPPY_DRIVE_ADD("fdc:1", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) |
1246 | | |
1247 | 1246 | /* internal ram */ |
1248 | 1247 | MCFG_RAM_ADD(RAM_TAG) |
1249 | 1248 | MCFG_RAM_DEFAULT_SIZE("640K") |
r19933 | r19934 | |
2325 | 2324 | |
2326 | 2325 | // tandy 1000 |
2327 | 2326 | COMP( 1987, t1000hx, ibm5150, 0, t1000hx, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 HX", 0) |
2328 | | COMP( 1987, t1000sx, ibm5150, 0, t1000hx, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 SX", GAME_NOT_WORKING) |
| 2327 | COMP( 1987, t1000sx, ibm5150, 0, t1000sx, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 SX", GAME_NOT_WORKING) |
2329 | 2328 | COMP( 1987, t1000tx, ibm5150, 0, t1000_286, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 TX", 0) |
2330 | 2329 | COMP( 1989, t1000rl, ibm5150, 0, t1000_16, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 RL", 0) |
2331 | 2330 | COMP( 1989, t1000tl2, ibm5150, 0, t1000_286, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 TL/2", 0) |
trunk/src/mess/machine/pc.c
r19933 | r19934 | |
36 | 36 | #include "imagedev/cassette.h" |
37 | 37 | #include "sound/speaker.h" |
38 | 38 | |
39 | | #include "machine/8237dma.h" |
| 39 | #include "machine/am9517a.h" |
40 | 40 | #include "machine/wd17xx.h" |
41 | 41 | |
42 | 42 | #include "machine/ram.h" |
r19933 | r19934 | |
167 | 167 | |
168 | 168 | WRITE_LINE_MEMBER(pc_state::pc_dma_hrq_changed) |
169 | 169 | { |
170 | | device_t *device = machine().device("dma8237"); |
171 | 170 | m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); |
172 | 171 | |
173 | 172 | /* Assert HLDA */ |
174 | | i8237_hlda_w( device, state ); |
| 173 | m_dma8237->hack_w(state); |
175 | 174 | } |
176 | 175 | |
177 | 176 | |
178 | 177 | READ8_MEMBER(pc_state::pc_dma_read_byte) |
179 | 178 | { |
180 | | UINT8 result; |
| 179 | if(m_dma_channel == -1) |
| 180 | return 0xff; |
181 | 181 | address_space& prog_space = m_maincpu->space(AS_PROGRAM); |
182 | 182 | offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) |
183 | 183 | & 0x0F0000; |
184 | 184 | |
185 | | result = prog_space.read_byte( page_offset + offset); |
186 | | return result; |
| 185 | return prog_space.read_byte( page_offset + offset); |
187 | 186 | } |
188 | 187 | |
189 | 188 | |
190 | 189 | WRITE8_MEMBER(pc_state::pc_dma_write_byte) |
191 | 190 | { |
| 191 | if(m_dma_channel == -1) |
| 192 | return; |
192 | 193 | address_space& prog_space = m_maincpu->space(AS_PROGRAM); |
193 | 194 | offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) |
194 | 195 | & 0x0F0000; |
r19933 | r19934 | |
223 | 224 | WRITE8_MEMBER(pc_state::pc_dma8237_0_dack_w) |
224 | 225 | { |
225 | 226 | m_u73_q2 = 0; |
226 | | i8237_dreq0_w( m_dma8237, m_u73_q2 ); |
| 227 | m_dma8237->dreq0_w( m_u73_q2 ); |
227 | 228 | } |
228 | 229 | |
| 230 | void pc_state::pc_eop_w(int channel, bool state) |
| 231 | { |
| 232 | switch(channel) |
| 233 | { |
| 234 | case 2: |
| 235 | machine().device<pc_fdc_interface>("fdc")->tc_w(state); |
| 236 | break; |
| 237 | case 0: |
| 238 | case 1: |
| 239 | case 3: |
| 240 | default: |
| 241 | break; |
| 242 | } |
| 243 | } |
229 | 244 | |
| 245 | |
230 | 246 | WRITE_LINE_MEMBER(pc_state::pc_dma8237_out_eop) |
231 | 247 | { |
232 | | machine().device<pc_fdc_interface>("fdc")->tc_w(state == ASSERT_LINE); |
| 248 | m_cur_eop = state == ASSERT_LINE; |
| 249 | if(m_dma_channel != -1 && m_cur_eop) |
| 250 | pc_eop_w(m_dma_channel, m_cur_eop ? ASSERT_LINE : CLEAR_LINE); |
233 | 251 | } |
234 | 252 | |
235 | | static void set_dma_channel(running_machine &machine, int channel, int state) |
| 253 | void pc_state::pc_select_dma_channel(int channel, bool state) |
236 | 254 | { |
237 | | pc_state *st = machine.driver_data<pc_state>(); |
| 255 | if(!state) { |
| 256 | m_dma_channel = channel; |
| 257 | if(m_cur_eop) |
| 258 | pc_eop_w(channel, ASSERT_LINE ); |
238 | 259 | |
239 | | if (!state) st->m_dma_channel = channel; |
| 260 | } else if(m_dma_channel == channel) { |
| 261 | m_dma_channel = -1; |
| 262 | if(m_cur_eop) |
| 263 | pc_eop_w(channel, CLEAR_LINE ); |
| 264 | } |
240 | 265 | } |
241 | 266 | |
242 | | WRITE_LINE_MEMBER(pc_state::pc_dack0_w){ set_dma_channel(machine(), 0, state); } |
243 | | WRITE_LINE_MEMBER(pc_state::pc_dack1_w){ set_dma_channel(machine(), 1, state); } |
244 | | WRITE_LINE_MEMBER(pc_state::pc_dack2_w){ set_dma_channel(machine(), 2, state); } |
245 | | WRITE_LINE_MEMBER(pc_state::pc_dack3_w){ set_dma_channel(machine(), 3, state); } |
| 267 | WRITE_LINE_MEMBER(pc_state::pc_dack0_w){ pc_select_dma_channel(0, state); } |
| 268 | WRITE_LINE_MEMBER(pc_state::pc_dack1_w){ pc_select_dma_channel(1, state); } |
| 269 | WRITE_LINE_MEMBER(pc_state::pc_dack2_w){ pc_select_dma_channel(2, state); } |
| 270 | WRITE_LINE_MEMBER(pc_state::pc_dack3_w){ pc_select_dma_channel(3, state); } |
246 | 271 | |
247 | 272 | I8237_INTERFACE( ibm5150_dma8237_config ) |
248 | 273 | { |
r19933 | r19934 | |
354 | 379 | if ( m_out1 == 0 && state == 1 && m_u73_q2 == 0 ) |
355 | 380 | { |
356 | 381 | m_u73_q2 = 1; |
357 | | i8237_dreq0_w( m_dma8237, m_u73_q2 ); |
| 382 | m_dma8237->dreq0_w( m_u73_q2 ); |
358 | 383 | } |
359 | 384 | m_out1 = state; |
360 | 385 | } |
r19933 | r19934 | |
1135 | 1160 | |
1136 | 1161 | void pc_state::fdc_dma_drq(bool state) |
1137 | 1162 | { |
1138 | | i8237_dreq2_w( m_dma8237, state); |
| 1163 | m_dma8237->dreq2_w( state ); |
1139 | 1164 | } |
1140 | 1165 | |
1141 | 1166 | static void pc_set_irq_line(running_machine &machine,int irq, int state) |
r19933 | r19934 | |
1438 | 1463 | MACHINE_START_MEMBER(pc_state,pc) |
1439 | 1464 | { |
1440 | 1465 | m_pic8259 = machine().device("pic8259"); |
1441 | | m_dma8237 = machine().device("dma8237"); |
1442 | 1466 | m_pit8253 = machine().device("pit8253"); |
| 1467 | m_maincpu = machine().device<cpu_device>("maincpu" ); |
| 1468 | m_maincpu->set_irq_acknowledge_callback(pc_irq_callback); |
1443 | 1469 | |
1444 | 1470 | pc_fdc_interface *fdc = machine().device<pc_fdc_interface>("fdc"); |
1445 | 1471 | fdc->setup_intrq_cb(pc_fdc_interface::line_cb(FUNC(pc_state::fdc_interrupt), this)); |
r19933 | r19934 | |
1450 | 1476 | MACHINE_RESET_MEMBER(pc_state,pc) |
1451 | 1477 | { |
1452 | 1478 | device_t *speaker = machine().device(SPEAKER_TAG); |
1453 | | m_maincpu = machine().device<cpu_device>("maincpu" ); |
1454 | | m_maincpu->set_irq_acknowledge_callback(pc_irq_callback); |
1455 | 1479 | |
1456 | 1480 | m_u73_q2 = 0; |
1457 | 1481 | m_out1 = 0; |
1458 | 1482 | m_pc_spkrdata = 0; |
1459 | 1483 | m_pc_input = 1; |
1460 | | m_dma_channel = 0; |
| 1484 | m_dma_channel = -1; |
| 1485 | m_cur_eop = 0; |
1461 | 1486 | memset(m_dma_offset,0,sizeof(m_dma_offset)); |
1462 | 1487 | m_ppi_portc_switch_high = 0; |
1463 | 1488 | m_ppi_speaker = 0; |
r19933 | r19934 | |
1479 | 1504 | m_maincpu->set_irq_acknowledge_callback(pc_irq_callback); |
1480 | 1505 | |
1481 | 1506 | m_pic8259 = machine().device("pic8259"); |
1482 | | m_dma8237 = NULL; |
1483 | 1507 | m_pit8253 = machine().device("pit8253"); |
1484 | 1508 | |
1485 | 1509 | /* |
r19933 | r19934 | |
1507 | 1531 | |
1508 | 1532 | |
1509 | 1533 | m_pic8259 = machine().device("pic8259"); |
1510 | | m_dma8237 = NULL; |
1511 | 1534 | m_pit8253 = machine().device("pit8253"); |
1512 | 1535 | } |
1513 | 1536 | |
r19933 | r19934 | |
1518 | 1541 | m_out1 = 0; |
1519 | 1542 | m_pc_spkrdata = 0; |
1520 | 1543 | m_pc_input = 1; |
1521 | | m_dma_channel = 0; |
| 1544 | m_dma_channel = -1; |
1522 | 1545 | memset(m_memboard,0xc,sizeof(m_memboard)); // check |
1523 | 1546 | memset(m_dma_offset,0,sizeof(m_dma_offset)); |
1524 | 1547 | m_ppi_portc_switch_high = 0; |