Previous 199869 Revisions Next

r21501 Friday 1st March, 2013 at 01:26:03 UTC by R. Belmont
nscsi_hd: Added 6-byte WRITE, logging of unknown commands, and some Apple-specific SCSI tweaks. [R. Belmont]
[src/emu/machine]nscsi_hd.c

trunk/src/emu/machine/nscsi_hd.c
r21500r21501
7272
7373void nscsi_harddisk_device::scsi_command()
7474{
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
7587   switch(scsi_cmdbuf[0]) {
7688   case SC_TEST_UNIT_READY:
7789      logerror("%s: command TEST UNIT READY\n", tag());
r21500r21501
91103      scsi_status_complete(SS_GOOD);
92104      break;
93105
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
94119   case SC_INQUIRY: {
95120      int lun = get_lun(scsi_cmdbuf[1] >> 5);
96121      logerror("%s: command INQUIRY lun=%d EVPD=%d page=%d alloc=%02x link=%02x\n",
r21500r21501
109134         scsi_cmdbuf[0] = 0x00; // device is direct-access (e.g. hard disk)
110135         scsi_cmdbuf[1] = 0x00; // media is not removable
111136         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
113138         // Apple HD SC setup utility needs to see this
114139         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;
119162         scsi_data_in(0, size);
120163         break;
121164      }
r21500r21501
218261            break;
219262         }
220263
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
221292         default:
222293            logerror("%s: mode sense page %02x unhandled\n", tag(), page);
223294            break;
r21500r21501
280351      break;
281352
282353   default:
354      logerror("%s: command %02x ***UNKNOWN***\n", tag(), scsi_cmdbuf[0]);
283355      nscsi_full_device::scsi_command();
284356      break;
285357   }

Previous 199869 Revisions Next


© 1997-2024 The MAME Team