trunk/src/emu/machine/scsihle.c
| r18411 | r18412 | |
| 17 | 17 | { |
| 18 | 18 | scsidev_device::device_start(); |
| 19 | 19 | |
| 20 | | //req_timer = timer_alloc(0); |
| 21 | | sel_timer = timer_alloc(2); |
| 22 | | dataout_timer = timer_alloc(3); |
| 20 | req_timer = timer_alloc(0); |
| 21 | sel_timer = timer_alloc(1); |
| 22 | dataout_timer = timer_alloc(2); |
| 23 | 23 | |
| 24 | 24 | save_item( NAME( command ) ); |
| 25 | 25 | save_item( NAME( commandLength ) ); |
| r18411 | r18412 | |
| 160 | 160 | } |
| 161 | 161 | |
| 162 | 162 | #define BSY_DELAY_NS 50 |
| 163 | | //#define REQ_DELAY_NS 90 |
| 163 | #define REQ_DELAY_NS 90 |
| 164 | 164 | |
| 165 | 165 | static const char *const phasenames[] = |
| 166 | 166 | { |
| r18411 | r18412 | |
| 214 | 214 | 3 2 + line changes |
| 215 | 215 | */ |
| 216 | 216 | |
| 217 | | #define LOGLEVEL 0 |
| 217 | #define LOGLEVEL 2 |
| 218 | 218 | |
| 219 | | #define LOG(level,...) if(LOGLEVEL>=level) logerror(__VA_ARGS__) |
| 219 | #define LOG(level,...) if(LOGLEVEL>=level) printf(__VA_ARGS__) |
| 220 | 220 | |
| 221 | | //void scsibus_device::scsi_out_line_change(UINT8 line, UINT8 state) |
| 222 | | //{ |
| 223 | | // if(line==SCSI_LINE_REQ) |
| 224 | | // scsi_out_line_req(state); |
| 225 | | // else |
| 226 | | // scsi_out_line_change_now(line,state); |
| 227 | | //} |
| 228 | | // |
| 229 | | //void scsibus_device::scsi_out_line_req(UINT8 state) |
| 230 | | //{ |
| 231 | | // req_timer->adjust(attotime::from_nsec(REQ_DELAY_NS),state); |
| 232 | | //} |
| 233 | | // |
| 221 | void scsihle_device::scsi_out_req_delay(UINT8 state) |
| 222 | { |
| 223 | req_timer->adjust(attotime::from_nsec(REQ_DELAY_NS),state); |
| 224 | } |
| 234 | 225 | |
| 235 | 226 | void scsihle_device::dump_bytes(UINT8 *buff, int count) |
| 236 | 227 | { |
| r18411 | r18412 | |
| 288 | 279 | { |
| 289 | 280 | switch( tid ) |
| 290 | 281 | { |
| 291 | | // case 0: |
| 292 | | // scsi_out_line_change_now(SCSI_LINE_REQ, param); |
| 293 | | // break; |
| 282 | case 0: |
| 283 | scsi_out(param * SCSI_MASK_REQ, SCSI_MASK_REQ); |
| 284 | break; |
| 294 | 285 | |
| 295 | | case 2: |
| 286 | case 1: |
| 296 | 287 | scsi_out(param * SCSI_MASK_BSY, SCSI_MASK_BSY); |
| 297 | 288 | break; |
| 298 | 289 | |
| 299 | | case 3: |
| 290 | case 2: |
| 300 | 291 | // Some drives, notably the ST225N and ST125N, accept fromat unit commands |
| 301 | 292 | // with flags set indicating that bad block data should be transfered but |
| 302 | 293 | // don't then implemnt a data in phase, this timeout it to catch these ! |
| 303 | 294 | if(IS_COMMAND(SCSI_CMD_FORMAT_UNIT) && (data_idx==0)) |
| 295 | { |
| 304 | 296 | scsi_change_phase(SCSI_PHASE_STATUS); |
| 297 | } |
| 305 | 298 | break; |
| 306 | 299 | } |
| 307 | 300 | } |
| r18411 | r18412 | |
| 423 | 416 | break; |
| 424 | 417 | |
| 425 | 418 | case SCSI_PHASE_COMMAND: |
| 426 | | scsi_out( SCSI_MASK_DATA | SCSI_MASK_IO | SCSI_MASK_MSG, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG | SCSI_MASK_REQ ); |
| 419 | scsi_out( SCSI_MASK_DATA | SCSI_MASK_IO | SCSI_MASK_MSG, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG ); |
| 427 | 420 | LOG(1,"\nSCSIBUS: Command begin\n"); |
| 421 | scsi_out_req_delay( 0 ); |
| 428 | 422 | break; |
| 429 | 423 | |
| 430 | 424 | case SCSI_PHASE_DATAOUT: |
| 431 | | scsi_out( SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG, SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG | SCSI_MASK_REQ ); |
| 425 | scsi_out( SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG ); |
| 426 | scsi_out_req_delay( 0 ); |
| 432 | 427 | break; |
| 433 | 428 | |
| 434 | 429 | case SCSI_PHASE_DATAIN: |
| 435 | | scsi_out( SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_MSG, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG | SCSI_MASK_REQ ); |
| 430 | scsi_out( SCSI_MASK_CD | SCSI_MASK_MSG, SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG ); |
| 431 | scsi_out_req_delay( 0 ); |
| 436 | 432 | break; |
| 437 | 433 | |
| 438 | 434 | case SCSI_PHASE_STATUS: |
| 439 | | scsi_out( SCSI_STATUS_OK | SCSI_MASK_MSG, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG | SCSI_MASK_REQ ); |
| 435 | scsi_out( SCSI_STATUS_OK | SCSI_MASK_MSG, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG ); |
| 436 | scsi_out_req_delay( 0 ); |
| 440 | 437 | break; |
| 441 | 438 | |
| 442 | 439 | case SCSI_PHASE_MESSAGE_OUT: |
| 443 | | scsi_out( SCSI_MASK_IO, SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG | SCSI_MASK_REQ ); |
| 440 | scsi_out( SCSI_MASK_DATA | SCSI_MASK_IO, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG ); |
| 441 | scsi_out_req_delay( 0 ); |
| 444 | 442 | break; |
| 445 | 443 | |
| 446 | 444 | case SCSI_PHASE_MESSAGE_IN: |
| 447 | | scsi_out( 0, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG | SCSI_MASK_REQ );// no errors for the time being ! |
| 445 | scsi_out( 0, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );// no errors for the time being ! |
| 446 | scsi_out_req_delay( 0 ); |
| 448 | 447 | break; |
| 449 | 448 | } |
| 450 | 449 | } |
| r18411 | r18412 | |
| 469 | 468 | // only one line active. |
| 470 | 469 | if( ( mask & SCSI_MASK_SEL ) != 0 && scsibus_driveno(data & SCSI_MASK_DATA) == scsiID) |
| 471 | 470 | { |
| 472 | | void *hdfile; |
| 471 | void *hdfile = NULL; |
| 473 | 472 | // Check to see if device had image file mounted, if not, do not set busy, |
| 474 | 473 | // and stay busfree. |
| 475 | 474 | GetDevice(&hdfile); |
| r18411 | r18412 | |
| 482 | 481 | } |
| 483 | 482 | else |
| 484 | 483 | { |
| 485 | | sel_timer->adjust(attotime::from_nsec(BSY_DELAY_NS)); |
| 484 | sel_timer->adjust(attotime::from_nsec(BSY_DELAY_NS),0); |
| 486 | 485 | } |
| 487 | 486 | } |
| 488 | 487 | } |
| r18411 | r18412 | |
| 502 | 501 | } |
| 503 | 502 | else |
| 504 | 503 | { |
| 505 | | scsi_out( 0, SCSI_MASK_REQ ); |
| 504 | scsi_out_req_delay( 0 ); |
| 506 | 505 | } |
| 507 | 506 | } |
| 508 | 507 | else |
| 509 | 508 | { |
| 510 | | scsi_out( SCSI_MASK_REQ, SCSI_MASK_REQ ); |
| 509 | scsi_out_req_delay( 1 ); |
| 511 | 510 | } |
| 512 | 511 | } |
| 513 | 512 | break; |
| r18411 | r18412 | |
| 530 | 529 | } |
| 531 | 530 | else |
| 532 | 531 | { |
| 533 | | scsi_out( buffer[ data_idx++ ], SCSI_MASK_DATA | SCSI_MASK_REQ ); |
| 532 | scsi_out( buffer[ data_idx++ ], SCSI_MASK_DATA ); |
| 533 | scsi_out_req_delay( 0 ); |
| 534 | 534 | } |
| 535 | 535 | } |
| 536 | 536 | else |
| 537 | 537 | { |
| 538 | | scsi_out( SCSI_MASK_REQ, SCSI_MASK_REQ ); |
| 538 | scsi_out_req_delay( 1 ); |
| 539 | 539 | } |
| 540 | 540 | } |
| 541 | 541 | break; |
| r18411 | r18412 | |
| 578 | 578 | } |
| 579 | 579 | else |
| 580 | 580 | { |
| 581 | | scsi_out( 0, SCSI_MASK_REQ ); |
| 581 | scsi_out_req_delay( 0 ); |
| 582 | 582 | } |
| 583 | 583 | } |
| 584 | 584 | else |
| 585 | 585 | { |
| 586 | | scsi_out( SCSI_MASK_REQ, SCSI_MASK_REQ ); |
| 586 | scsi_out_req_delay( 1 ); |
| 587 | 587 | } |
| 588 | 588 | } |
| 589 | 589 | break; |
| r18411 | r18412 | |
| 599 | 599 | } |
| 600 | 600 | else |
| 601 | 601 | { |
| 602 | | scsi_out( 0, SCSI_MASK_REQ ); |
| 602 | scsi_out_req_delay( 0 ); |
| 603 | 603 | } |
| 604 | 604 | } |
| 605 | 605 | else |
| 606 | 606 | { |
| 607 | 607 | cmd_idx++; |
| 608 | | scsi_out( SCSI_MASK_REQ, SCSI_MASK_REQ ); |
| 608 | scsi_out_req_delay( 1 ); |
| 609 | 609 | } |
| 610 | 610 | } |
| 611 | 611 | break; |
| r18411 | r18412 | |
| 624 | 624 | } |
| 625 | 625 | else |
| 626 | 626 | { |
| 627 | | scsi_out( 0, SCSI_MASK_REQ ); |
| 627 | scsi_out_req_delay( 0 ); |
| 628 | 628 | } |
| 629 | 629 | } |
| 630 | 630 | else |
| 631 | 631 | { |
| 632 | 632 | cmd_idx++; |
| 633 | | scsi_out( SCSI_MASK_REQ, SCSI_MASK_REQ ); |
| 633 | scsi_out_req_delay( 1 ); |
| 634 | 634 | } |
| 635 | 635 | } |
| 636 | 636 | break; |