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 = |