trunk/src/emu/machine/nscsi_hd.c
| r21500 | r21501 | |
| 72 | 72 | |
| 73 | 73 | void nscsi_harddisk_device::scsi_command() |
| 74 | 74 | { |
| 75 | #if 0 |
| 76 | if (scsi_cmdbuf[0] != SC_READ) |
| 77 | { |
| 78 | logerror("%s: ", tag()); |
| 79 | for (int i = 0; i < 6; i++) |
| 80 | { |
| 81 | logerror("%02x ", scsi_cmdbuf[i]); |
| 82 | } |
| 83 | logerror("\n"); |
| 84 | } |
| 85 | #endif |
| 86 | |
| 75 | 87 | switch(scsi_cmdbuf[0]) { |
| 76 | 88 | case SC_TEST_UNIT_READY: |
| 77 | 89 | logerror("%s: command TEST UNIT READY\n", tag()); |
| r21500 | r21501 | |
| 91 | 103 | scsi_status_complete(SS_GOOD); |
| 92 | 104 | break; |
| 93 | 105 | |
| 106 | case SC_WRITE: |
| 107 | lba = ((scsi_cmdbuf[1] & 0x1f)<<16) | (scsi_cmdbuf[2]<<8) | scsi_cmdbuf[3]; |
| 108 | blocks = scsi_cmdbuf[4]; |
| 109 | if(!blocks) |
| 110 | blocks = 256; |
| 111 | |
| 112 | logerror("%s: command WRITE start=%08x blocks=%04x\n", |
| 113 | tag(), lba, blocks); |
| 114 | |
| 115 | scsi_data_out(2, blocks*bytes_per_sector); |
| 116 | scsi_status_complete(SS_GOOD); |
| 117 | break; |
| 118 | |
| 94 | 119 | case SC_INQUIRY: { |
| 95 | 120 | int lun = get_lun(scsi_cmdbuf[1] >> 5); |
| 96 | 121 | logerror("%s: command INQUIRY lun=%d EVPD=%d page=%d alloc=%02x link=%02x\n", |
| r21500 | r21501 | |
| 109 | 134 | scsi_cmdbuf[0] = 0x00; // device is direct-access (e.g. hard disk) |
| 110 | 135 | scsi_cmdbuf[1] = 0x00; // media is not removable |
| 111 | 136 | scsi_cmdbuf[2] = 0x05; // device complies with SPC-3 standard |
| 112 | | scsi_cmdbuf[3] = 0x02; // response data format = SPC-3 standard |
| 137 | scsi_cmdbuf[3] = 0x01; // response data format = CCS |
| 113 | 138 | // Apple HD SC setup utility needs to see this |
| 114 | 139 | strcpy((char *)&scsi_cmdbuf[8], " SEAGATE"); |
| 115 | | strcpy((char *)&scsi_cmdbuf[16], " ST225N"); |
| 116 | | strcpy((char *)&scsi_cmdbuf[32], "1.0"); |
| 117 | | if(size > 148) |
| 118 | | size = 148; |
| 140 | strcpy((char *)&scsi_cmdbuf[15], " ST225N"); |
| 141 | strcpy((char *)&scsi_cmdbuf[31], "1.00"); |
| 142 | scsi_cmdbuf[36] = 0x00; // # of extents high |
| 143 | scsi_cmdbuf[37] = 0x08; // # of extents low |
| 144 | scsi_cmdbuf[38] = 0x00; // group 0 commands 0-1f |
| 145 | scsi_cmdbuf[39] = 0x99; // commands 0,3,4,7 |
| 146 | scsi_cmdbuf[40] = 0xa0; // commands 8, a |
| 147 | scsi_cmdbuf[41] = 0x27; // commands 12,15,16,17 |
| 148 | scsi_cmdbuf[42] = 0x34; // commands 1a,1b,1d |
| 149 | scsi_cmdbuf[43] = 0x01; // group 1 commands 20-3f |
| 150 | scsi_cmdbuf[44] = 0x04; |
| 151 | scsi_cmdbuf[45] = 0xa0; |
| 152 | scsi_cmdbuf[46] = 0x01; |
| 153 | scsi_cmdbuf[47] = 0x18; |
| 154 | scsi_cmdbuf[48] = 0x07; // group 7 commands e0-ff |
| 155 | scsi_cmdbuf[49] = 0x00; |
| 156 | scsi_cmdbuf[50] = 0xa0; // commands 8, a |
| 157 | scsi_cmdbuf[51] = 0x00; |
| 158 | scsi_cmdbuf[52] = 0x00; |
| 159 | scsi_cmdbuf[53] = 0xff; // end of list |
| 160 | if(size > 54) |
| 161 | size = 54; |
| 119 | 162 | scsi_data_in(0, size); |
| 120 | 163 | break; |
| 121 | 164 | } |
| r21500 | r21501 | |
| 218 | 261 | break; |
| 219 | 262 | } |
| 220 | 263 | |
| 264 | case 0x30: { // Apple firmware ID page |
| 265 | scsi_cmdbuf[pos++] = 0xb0; // cPS, page id |
| 266 | scsi_cmdbuf[pos++] = 0x16; // Page length |
| 267 | scsi_cmdbuf[pos++] = 'A'; |
| 268 | scsi_cmdbuf[pos++] = 'P'; |
| 269 | scsi_cmdbuf[pos++] = 'P'; |
| 270 | scsi_cmdbuf[pos++] = 'L'; |
| 271 | scsi_cmdbuf[pos++] = 'E'; |
| 272 | scsi_cmdbuf[pos++] = ' '; |
| 273 | scsi_cmdbuf[pos++] = 'C'; |
| 274 | scsi_cmdbuf[pos++] = 'O'; |
| 275 | scsi_cmdbuf[pos++] = 'M'; |
| 276 | scsi_cmdbuf[pos++] = 'P'; |
| 277 | scsi_cmdbuf[pos++] = 'U'; |
| 278 | scsi_cmdbuf[pos++] = 'T'; |
| 279 | scsi_cmdbuf[pos++] = 'E'; |
| 280 | scsi_cmdbuf[pos++] = 'R'; |
| 281 | scsi_cmdbuf[pos++] = ','; |
| 282 | scsi_cmdbuf[pos++] = ' '; |
| 283 | scsi_cmdbuf[pos++] = 'I'; |
| 284 | scsi_cmdbuf[pos++] = 'N'; |
| 285 | scsi_cmdbuf[pos++] = 'C'; |
| 286 | scsi_cmdbuf[pos++] = ' '; |
| 287 | scsi_cmdbuf[pos++] = ' '; |
| 288 | scsi_cmdbuf[pos++] = ' '; |
| 289 | break; |
| 290 | } |
| 291 | |
| 221 | 292 | default: |
| 222 | 293 | logerror("%s: mode sense page %02x unhandled\n", tag(), page); |
| 223 | 294 | break; |
| r21500 | r21501 | |
| 280 | 351 | break; |
| 281 | 352 | |
| 282 | 353 | default: |
| 354 | logerror("%s: command %02x ***UNKNOWN***\n", tag(), scsi_cmdbuf[0]); |
| 283 | 355 | nscsi_full_device::scsi_command(); |
| 284 | 356 | break; |
| 285 | 357 | } |