trunk/src/emu/machine/scsicb.h
r18331 | r18332 | |
25 | 25 | |
26 | 26 | struct SCSICB_interface |
27 | 27 | { |
28 | | void (*line_change_cb)(device_t *, UINT8 line, UINT8 state); |
29 | | |
30 | 28 | devcb_write_line _out_bsy_func; |
31 | 29 | devcb_write_line _out_sel_func; |
32 | 30 | devcb_write_line _out_cd_func; |
33 | 31 | devcb_write_line _out_io_func; |
34 | 32 | devcb_write_line _out_msg_func; |
35 | 33 | devcb_write_line _out_req_func; |
| 34 | devcb_write_line _out_ack_func; |
36 | 35 | devcb_write_line _out_rst_func; |
37 | 36 | }; |
38 | 37 | |
r18331 | r18332 | |
49 | 48 | devcb_resolved_write_line out_io_func; |
50 | 49 | devcb_resolved_write_line out_msg_func; |
51 | 50 | devcb_resolved_write_line out_req_func; |
| 51 | devcb_resolved_write_line out_ack_func; |
52 | 52 | devcb_resolved_write_line out_rst_func; |
53 | 53 | |
54 | 54 | UINT8 scsi_data_r(); |
trunk/src/emu/machine/scsibus.c
r18331 | r18332 | |
491 | 491 | |
492 | 492 | if(m_scsicb != NULL) |
493 | 493 | { |
494 | | if(m_scsicb->line_change_cb!=NULL) |
495 | | m_scsicb->line_change_cb(this, line,state); |
496 | | |
497 | 494 | switch (line) |
498 | 495 | { |
499 | 496 | case SCSI_LINE_BSY: m_scsicb->out_bsy_func(state); break; |
r18331 | r18332 | |
502 | 499 | case SCSI_LINE_IO: m_scsicb->out_io_func(state); break; |
503 | 500 | case SCSI_LINE_MSG: m_scsicb->out_msg_func(state); break; |
504 | 501 | case SCSI_LINE_REQ: m_scsicb->out_req_func(state); break; |
| 502 | case SCSI_LINE_ACK: m_scsicb->out_ack_func(state); break; |
505 | 503 | case SCSI_LINE_RESET: m_scsicb->out_rst_func(state); break; |
506 | 504 | } |
507 | 505 | } |
trunk/src/mess/machine/rmnimbus.c
r18331 | r18332 | |
2456 | 2456 | } |
2457 | 2457 | } |
2458 | 2458 | |
2459 | | void nimbus_scsi_linechange(device_t *device, UINT8 line, UINT8 state) |
| 2459 | WRITE_LINE_MEMBER( rmnimbus_state::nimbus_scsi_bsy_w ) |
2460 | 2460 | { |
2461 | | rmnimbus_state *drvstate = device->machine().driver_data<rmnimbus_state>(); |
2462 | | UINT8 mask = 0; |
| 2461 | nimbus_scsi_linechange( HDC_BSY_MASK, state ); |
| 2462 | } |
| 2463 | |
| 2464 | WRITE_LINE_MEMBER( rmnimbus_state::nimbus_scsi_cd_w ) |
| 2465 | { |
| 2466 | nimbus_scsi_linechange( HDC_CD_MASK, state ); |
| 2467 | } |
| 2468 | |
| 2469 | WRITE_LINE_MEMBER( rmnimbus_state::nimbus_scsi_io_w ) |
| 2470 | { |
| 2471 | nimbus_scsi_linechange( HDC_IO_MASK, state ); |
| 2472 | } |
| 2473 | |
| 2474 | WRITE_LINE_MEMBER( rmnimbus_state::nimbus_scsi_msg_w ) |
| 2475 | { |
| 2476 | nimbus_scsi_linechange( HDC_MSG_MASK, state ); |
| 2477 | } |
| 2478 | |
| 2479 | WRITE_LINE_MEMBER( rmnimbus_state::nimbus_scsi_req_w ) |
| 2480 | { |
| 2481 | nimbus_scsi_linechange( HDC_REQ_MASK, state ); |
| 2482 | } |
| 2483 | |
| 2484 | void rmnimbus_state::nimbus_scsi_linechange( UINT8 mask, UINT8 state ) |
| 2485 | { |
2463 | 2486 | UINT8 last = 0; |
2464 | 2487 | |
2465 | | switch (line) |
2466 | | { |
2467 | | case SCSI_LINE_REQ : mask=HDC_REQ_MASK; break; |
2468 | | case SCSI_LINE_CD : mask=HDC_CD_MASK; break; |
2469 | | case SCSI_LINE_IO : mask=HDC_IO_MASK; break; |
2470 | | case SCSI_LINE_BSY : mask=HDC_BSY_MASK; break; |
2471 | | case SCSI_LINE_MSG : mask=HDC_MSG_MASK; break; |
2472 | | } |
| 2488 | last=m_nimbus_drives.reg410_in & mask; |
2473 | 2489 | |
2474 | | last=drvstate->m_nimbus_drives.reg410_in & mask; |
2475 | | |
2476 | 2490 | if(state) |
2477 | | drvstate->m_nimbus_drives.reg410_in|=mask; |
| 2491 | m_nimbus_drives.reg410_in|=mask; |
2478 | 2492 | else |
2479 | | drvstate->m_nimbus_drives.reg410_in&=~mask; |
| 2493 | m_nimbus_drives.reg410_in&=~mask; |
2480 | 2494 | |
2481 | 2495 | |
2482 | | if(HDC_IRQ_ENABLED(drvstate) && ((~drvstate->m_nimbus_drives.reg410_in & HDC_INT_TRIGGER)==HDC_INT_TRIGGER)) |
2483 | | set_disk_int(device->machine(),1); |
| 2496 | if(HDC_IRQ_ENABLED() && ((~m_nimbus_drives.reg410_in & HDC_INT_TRIGGER)==HDC_INT_TRIGGER)) |
| 2497 | set_disk_int(machine(),1); |
2484 | 2498 | else |
2485 | | set_disk_int(device->machine(),0); |
| 2499 | set_disk_int(machine(),0); |
2486 | 2500 | |
2487 | | if(line==SCSI_LINE_REQ) |
| 2501 | if( mask == HDC_REQ_MASK ) |
2488 | 2502 | { |
2489 | 2503 | if (state==0) |
2490 | 2504 | { |
2491 | | if(((drvstate->m_nimbus_drives.reg410_in & HDC_CD_MASK)==HDC_CD_MASK) && (last!=0)) |
| 2505 | if(((m_nimbus_drives.reg410_in & HDC_CD_MASK)==HDC_CD_MASK) && (last!=0)) |
2492 | 2506 | { |
2493 | | drvstate->m_nimbus_drives.drq_ff=1; |
2494 | | hdc_drq(device->machine()); |
| 2507 | m_nimbus_drives.drq_ff=1; |
| 2508 | hdc_drq(machine()); |
2495 | 2509 | } |
2496 | 2510 | } |
2497 | 2511 | else |
2498 | 2512 | { |
2499 | | drvstate->m_scsibus->scsi_ack_w(1); |
| 2513 | m_scsibus->scsi_ack_w(1); |
2500 | 2514 | } |
2501 | 2515 | } |
2502 | 2516 | } |
trunk/src/mess/includes/rmnimbus.h
r18331 | r18332 | |
264 | 264 | /* SASI harddisk interface */ |
265 | 265 | #define SCSIBUS_TAG "scsibus" |
266 | 266 | |
267 | | void nimbus_scsi_linechange(device_t *device, UINT8 line, UINT8 state); |
268 | | |
269 | 267 | /* Masks for writes to port 0x400 */ |
270 | 268 | #define FDC_DRIVE0_MASK 0x01 |
271 | 269 | #define FDC_DRIVE1_MASK 0x02 |
r18331 | r18332 | |
305 | 303 | #define HDC_RESET_MASK 0x01 |
306 | 304 | #define HDC_SEL_MASK 0x02 |
307 | 305 | #define HDC_IRQ_MASK 0x04 |
308 | | #define HDC_IRQ_ENABLED(state) ((state->m_nimbus_drives.reg410_out & HDC_IRQ_MASK) ? 1 : 0) |
| 306 | #define HDC_IRQ_ENABLED() ((m_nimbus_drives.reg410_out & HDC_IRQ_MASK) ? 1 : 0) |
309 | 307 | |
310 | 308 | |
311 | 309 | #define SCSI_ID_NONE 0x80 |
r18331 | r18332 | |
463 | 461 | DECLARE_WRITE8_MEMBER(nimbus_via_write_portb); |
464 | 462 | DECLARE_WRITE_LINE_MEMBER(nimbus_via_irq_w); |
465 | 463 | DECLARE_WRITE_LINE_MEMBER(nimbus_ack_w); |
| 464 | DECLARE_WRITE_LINE_MEMBER(nimbus_scsi_bsy_w); |
| 465 | DECLARE_WRITE_LINE_MEMBER(nimbus_scsi_cd_w); |
| 466 | DECLARE_WRITE_LINE_MEMBER(nimbus_scsi_io_w); |
| 467 | DECLARE_WRITE_LINE_MEMBER(nimbus_scsi_msg_w); |
| 468 | DECLARE_WRITE_LINE_MEMBER(nimbus_scsi_req_w); |
| 469 | void nimbus_scsi_linechange( UINT8 mask, UINT8 state ); |
466 | 470 | }; |
trunk/src/mess/drivers/rmnimbus.c
r18331 | r18332 | |
86 | 86 | |
87 | 87 | static const SCSICB_interface scsibus_config = |
88 | 88 | { |
89 | | &nimbus_scsi_linechange |
| 89 | DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_bsy_w), |
| 90 | DEVCB_NULL, |
| 91 | DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_cd_w), |
| 92 | DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_io_w), |
| 93 | DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_msg_w), |
| 94 | DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_req_w), |
| 95 | DEVCB_NULL, |
| 96 | DEVCB_NULL |
90 | 97 | }; |
91 | 98 | |
92 | 99 | static const centronics_interface nimbus_centronics_config = |