Previous 199869 Revisions Next

r26163 Thursday 14th November, 2013 at 21:43:42 UTC by smf
Added SCSI status code & set it in all command handlers. It is sent over the bus when in status phase. In case of an error further information should be set in m_sense_key/m_sense_asc/m_sense_ascq & m_sense_information so that it can be returned by executing a request sense command [smf]
[src/emu/bus/ieee488]d9060hd.c
[src/emu/machine]cdu76s.c cr589.c scsihle.c scsihle.h t10mmc.c t10sbc.c t10spc.c t10spc.h
[src/mame/machine]gdrom.c
[src/mess/machine]acb4070.c s1410.c

trunk/src/mame/machine/gdrom.c
r26162r26163
110110   {
111111      case 0x11: // REQ_MODE
112112         m_phase = SCSI_PHASE_DATAIN;
113         m_status_code = SCSI_STATUS_CODE_GOOD;
113114         printf("REQ_MODE %02x %02x %02x %02x %02x %02x\n",
114115            command[0], command[1],
115116            command[2], command[3],
r26162r26163
122123      case 0x12: // SET_MODE
123124         logerror("GDROM: SET_MODE\n");
124125         m_phase = SCSI_PHASE_DATAOUT;
126         m_status_code = SCSI_STATUS_CODE_GOOD;
125127         //transferOffset = command[2];
126128         m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
127129         printf("SET_MODE %02x %02x\n",command[2],command[4]);
r26162r26163
169171            }
170172
171173            m_phase = SCSI_PHASE_DATAIN;
174            m_status_code = SCSI_STATUS_CODE_GOOD;
172175            m_transfer_length = blocks * m_sector_bytes;
173176         }
174177         break;
r26162r26163
206209         }
207210
208211         m_phase = SCSI_PHASE_DATAIN;
212         m_status_code = SCSI_STATUS_CODE_GOOD;
209213         m_transfer_length = length;
210214         break;
211215      }
212216
213217      case 0x70:
214218         m_phase = SCSI_PHASE_STATUS;
219         m_status_code = SCSI_STATUS_CODE_GOOD;
215220         m_transfer_length = 0;
216221         break;
217222
218223      case 0x71:
219224         m_phase = SCSI_PHASE_DATAIN;
225         m_status_code = SCSI_STATUS_CODE_GOOD;
220226         m_transfer_length = sizeof(GDROM_Cmd71_Reply);
221227         break;
222228
r26162r26163
224230         if(command[1] & 0xf)
225231         {
226232            m_phase = SCSI_PHASE_DATAIN;
233            m_status_code = SCSI_STATUS_CODE_GOOD;
227234            m_transfer_length = 0xe;
228235         }
229236         else
trunk/src/emu/machine/scsihle.c
r26162r26163
178178         else
179179            m_phase = SCSI_PHASE_STATUS;
180180
181         m_status_code = SCSI_STATUS_CODE_GOOD;
181182         bytes_left=4;
182183         dataout_timer->adjust(attotime::from_seconds(FORMAT_UNIT_TIMEOUT));
183184         break;
r26162r26163
187188         command_local=1;
188189         bytes_left=0;
189190         m_phase = SCSI_PHASE_STATUS;
191         m_status_code = SCSI_STATUS_CODE_GOOD;
190192         break;
191193
192194      case SCSI_CMD_READ_DEFECT:
r26162r26163
200202
201203         bytes_left=4;
202204         m_phase = SCSI_PHASE_DATAIN;
205         m_status_code = SCSI_STATUS_CODE_GOOD;
203206         break;
204207
205208      // write buffer
r26162r26163
208211         command_local=1;
209212         bytes_left=(command[7]<<8)+command[8];
210213         m_phase = SCSI_PHASE_DATAOUT;
214         m_status_code = SCSI_STATUS_CODE_GOOD;
211215         break;
212216
213217      // read buffer
r26162r26163
216220         command_local=1;
217221         bytes_left=(command[7]<<8)+command[8];
218222         m_phase = SCSI_PHASE_DATAIN;
223         m_status_code = SCSI_STATUS_CODE_GOOD;
219224         break;
220225   }
221226
r26162r26163
287292         break;
288293
289294      case SCSI_PHASE_STATUS:
290         scsi_out( SCSI_STATUS_OK | SCSI_MASK_CD | SCSI_MASK_IO, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
295         scsi_out( m_status_code | SCSI_MASK_CD | SCSI_MASK_IO, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
291296         scsi_out_req_delay( 1 );
292297         break;
293298
trunk/src/emu/machine/scsihle.h
r26162r26163
6666// Status / Sense data taken from Adaptec ACB40x0 documentation.
6767//
6868
69#define SCSI_STATUS_OK              0x00
70#define SCSI_STATUS_CHECK           0x02
71#define SCSI_STATUS_EQUAL           0x04
72#define SCSI_STATUS_BUSY            0x08
73
7469// SCSI IDs
7570enum
7671{
trunk/src/emu/machine/t10mmc.c
r26162r26163
112112      case 0x12: // INQUIRY
113113         logerror("T10MMC: INQUIRY\n");
114114         m_phase = SCSI_PHASE_DATAIN;
115         m_status_code = SCSI_STATUS_CODE_GOOD;
115116         m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
116117         if (m_transfer_length > 36)
117118            m_transfer_length = 36;
r26162r26163
120121      case 0x15: // MODE SELECT(6)
121122         logerror("T10MMC: MODE SELECT(6) length %x control %x\n", command[4], command[5]);
122123         m_phase = SCSI_PHASE_DATAOUT;
124         m_status_code = SCSI_STATUS_CODE_GOOD;
123125         m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
124126         break;
125127
126128      case 0x1a: // MODE SENSE(6)
127129         m_phase = SCSI_PHASE_DATAIN;
130         m_status_code = SCSI_STATUS_CODE_GOOD;
128131         m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
129132         break;
130133
131134      case 0x1b: // START STOP UNIT
132135         abort_audio();
133136         m_phase = SCSI_PHASE_STATUS;
137         m_status_code = SCSI_STATUS_CODE_GOOD;
134138         m_transfer_length = 0;
135139         break;
136140
137141      case 0x1e: // PREVENT ALLOW MEDIUM REMOVAL
138142         m_phase = SCSI_PHASE_STATUS;
143         m_status_code = SCSI_STATUS_CODE_GOOD;
139144         m_transfer_length = 0;
140145         break;
141146
142147      case 0x25: // READ CAPACITY
143148         m_phase = SCSI_PHASE_DATAIN;
149         m_status_code = SCSI_STATUS_CODE_GOOD;
144150         m_transfer_length = 8;
145151         break;
146152
r26162r26163
164170         abort_audio();
165171
166172         m_phase = SCSI_PHASE_DATAIN;
173         m_status_code = SCSI_STATUS_CODE_GOOD;
167174         m_transfer_length = blocks * m_sector_bytes;
168175         break;
169176
170177      case 0x42: // READ SUB-CHANNEL
171178//                      logerror("T10MMC: READ SUB-CHANNEL type %d\n", command[3]);
172179         m_phase = SCSI_PHASE_DATAIN;
180         m_status_code = SCSI_STATUS_CODE_GOOD;
173181         m_transfer_length = SCSILengthFromUINT16( &command[ 7 ] );
174182         break;
175183
r26162r26163
203211         abort_audio();
204212
205213         m_phase = SCSI_PHASE_DATAIN;
214         m_status_code = SCSI_STATUS_CODE_GOOD;
206215         m_transfer_length = length;
207216         break;
208217      }
r26162r26163
236245         }
237246
238247         m_phase = SCSI_PHASE_STATUS;
248         m_status_code = SCSI_STATUS_CODE_GOOD;
239249         m_transfer_length = 0;
240250         break;
241251
r26162r26163
269279         }
270280
271281         m_phase = SCSI_PHASE_STATUS;
282         m_status_code = SCSI_STATUS_CODE_GOOD;
272283         m_transfer_length = 0;
273284         break;
274285
r26162r26163
280291
281292         logerror("T10MMC: PAUSE/RESUME: %s\n", command[8]&1 ? "RESUME" : "PAUSE");
282293         m_phase = SCSI_PHASE_STATUS;
294         m_status_code = SCSI_STATUS_CODE_GOOD;
283295         m_transfer_length = 0;
284296         break;
285297
r26162r26163
288300
289301         logerror("T10MMC: STOP_PLAY_SCAN\n");
290302         m_phase = SCSI_PHASE_STATUS;
303         m_status_code = SCSI_STATUS_CODE_GOOD;
291304         m_transfer_length = 0;
292305         break;
293306
294307      case 0x55: // MODE SELECT(10)
295308         logerror("T10MMC: MODE SELECT length %x control %x\n", command[7]<<8 | command[8], command[1]);
296309         m_phase = SCSI_PHASE_DATAOUT;
310         m_status_code = SCSI_STATUS_CODE_GOOD;
297311         m_transfer_length = SCSILengthFromUINT16( &command[ 7 ] );
298312         break;
299313
300314      case 0x5a: // MODE SENSE(10)
301315         m_phase = SCSI_PHASE_DATAIN;
316         m_status_code = SCSI_STATUS_CODE_GOOD;
302317         m_transfer_length = SCSILengthFromUINT16( &command[ 7 ] );
303318         break;
304319
r26162r26163
332347         }
333348
334349         m_phase = SCSI_PHASE_STATUS;
350         m_status_code = SCSI_STATUS_CODE_GOOD;
335351         m_transfer_length = 0;
336352         break;
337353
r26162r26163
354370         abort_audio();
355371
356372         m_phase = SCSI_PHASE_DATAIN;
373         m_status_code = SCSI_STATUS_CODE_GOOD;
357374         m_transfer_length = blocks * m_sector_bytes;
358375         break;
359376
360377      case 0xbb: // SET CD SPEED
361378         logerror("T10MMC: SET CD SPEED to %d kbytes/sec.\n", command[2]<<8 | command[3]);
362379         m_phase = SCSI_PHASE_STATUS;
380         m_status_code = SCSI_STATUS_CODE_GOOD;
363381         m_transfer_length = 0;
364382         break;
365383
trunk/src/emu/machine/cr589.c
r26162r26163
4848      case 0x3b: // WRITE BUFFER
4949         bufferOffset = ( command[ 3 ] << 16 ) | ( command[ 4 ] << 8 ) | command[ 5 ];
5050         m_phase = SCSI_PHASE_DATAOUT;
51         m_status_code = SCSI_STATUS_CODE_GOOD;
5152         m_transfer_length = ( command[ 6 ] << 16 ) | ( command[ 7 ] << 8 ) | command[ 8 ];
5253         break;
5354
5455      case 0x3c: // READ BUFFER
5556         bufferOffset = ( command[ 3 ] << 16 ) | ( command[ 4 ] << 8 ) | command[ 5 ];
5657         m_phase = SCSI_PHASE_DATAIN;
58         m_status_code = SCSI_STATUS_CODE_GOOD;
5759         m_transfer_length = ( command[ 6 ] << 16 ) | ( command[ 7 ] << 8 ) | command[ 8 ];
5860         break;
5961
6062      case 0xcc: // FIRMWARE DOWNLOAD ENABLE
6163         m_phase = SCSI_PHASE_DATAOUT;
64         m_status_code = SCSI_STATUS_CODE_GOOD;
6265         m_transfer_length = SCSILengthFromUINT16( &command[7] );
6366         break;
6467
trunk/src/emu/machine/t10spc.c
r26162r26163
1515void t10spc::t10_reset()
1616{
1717   m_phase = SCSI_PHASE_BUS_FREE;
18   m_status_code = SCSI_STATUS_CODE_GOOD;
1819   m_sense_key = 0;
1920   m_sense_asc = 0;
2021   m_sense_ascq = 0;
r26162r26163
3536   {
3637   case SCSI_CMD_TEST_UNIT_READY:
3738      m_phase = SCSI_PHASE_STATUS;
39      m_status_code = SCSI_STATUS_CODE_GOOD;
3840      m_transfer_length = 0;
3941      break;
4042
4143   case SCSI_CMD_RECALIBRATE:
4244      m_phase = SCSI_PHASE_STATUS;
45      m_status_code = SCSI_STATUS_CODE_GOOD;
4346      m_transfer_length = 0;
4447      break;
4548
4649   case SCSI_CMD_REQUEST_SENSE:
4750      m_phase = SCSI_PHASE_DATAIN;
51      m_status_code = SCSI_STATUS_CODE_GOOD;
4852      if (command[4] == 0)
4953      {
5054         m_transfer_length = 4;
r26162r26163
6165
6266   case SCSI_CMD_SEND_DIAGNOSTIC:
6367      m_phase = SCSI_PHASE_DATAOUT;
68      m_status_code = SCSI_STATUS_CODE_GOOD;
6469      m_transfer_length = SCSILengthFromUINT16(&command[3]);
6570      break;
6671
6772   default:
6873      logerror( "SCSIDEV unknown command %02x\n", command[ 0 ] );
74      m_status_code = SCSI_STATUS_CODE_GOOD;
6975      m_transfer_length = 0;
7076      break;
7177   }
trunk/src/emu/machine/t10spc.h
r26162r26163
4545      SCSI_SENSE_ASC_ASCQ_ILLEGAL_MODE_FOR_THIS_TRACK = 0x6400
4646   };
4747
48   enum status_code_t
49   {
50      SCSI_STATUS_CODE_GOOD = 0x00,
51      SCSI_STATUS_CODE_CHECK_CONDITION = 0x02,
52      SCSI_STATUS_CODE_CONDITION_MET = 0x04,
53      SCSI_STATUS_CODE_BUSY = 0x08,
54      SCSI_STATUS_CODE_INTERMEDIATE = 0x14,
55      SCSI_STATUS_CODE_RESERVATION_CONFLICT = 0x18,
56      SCSI_STATUS_CODE_COMMAND_TERMINATED = 0x22,
57      SCSI_STATUS_CODE_TASK_SET_FULL = 0x28,
58      SCSI_STATUS_CODE_ACA_ACTIVE = 0x30,
59      SCSI_STATUS_CODE_TASK_ABORTED = 0x40
60   };
61
4862   void set_sense(sense_key_t key, sense_asc_ascq_t asc_ascq);
4963
5064   UINT8 command[ 32 ];
5165   int commandLength;
5266   int m_transfer_length;
5367   int m_phase;
68   status_code_t m_status_code;
5469   UINT8 m_sense_key;
5570   UINT8 m_sense_asc;
5671   UINT8 m_sense_ascq;
trunk/src/emu/machine/t10sbc.c
r26162r26163
3636   {
3737      case 0x04: // FORMAT UNIT
3838         m_phase = SCSI_PHASE_STATUS;
39         m_status_code = SCSI_STATUS_CODE_GOOD;
3940         m_transfer_length = 0;
4041         break;
4142
r26162r26163
4647         logerror("T10SBC: READ at LBA %x for %x blocks\n", lba, blocks);
4748
4849         m_phase = SCSI_PHASE_DATAIN;
50         m_status_code = SCSI_STATUS_CODE_GOOD;
4951         m_transfer_length = blocks * m_sector_bytes;
5052         break;
5153
r26162r26163
5658         logerror("T10SBC: WRITE to LBA %x for %x blocks\n", lba, blocks);
5759
5860         m_phase = SCSI_PHASE_DATAOUT;
61         m_status_code = SCSI_STATUS_CODE_GOOD;
5962         m_transfer_length = blocks * m_sector_bytes;
6063         break;
6164
6265      case 0x12: // INQUIRY
6366         m_phase = SCSI_PHASE_DATAIN;
67         m_status_code = SCSI_STATUS_CODE_GOOD;
6468         m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
6569         break;
6670
6771      case 0x15: // MODE SELECT (used to set CDDA volume)
6872         logerror("T10SBC: MODE SELECT length %x control %x\n", command[4], command[5]);
6973         m_phase = SCSI_PHASE_DATAOUT;
74         m_status_code = SCSI_STATUS_CODE_GOOD;
7075         m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
7176         break;
7277
7378      case 0x1a: // MODE SENSE(6)
7479         m_phase = SCSI_PHASE_DATAIN;
80         m_status_code = SCSI_STATUS_CODE_GOOD;
7581         m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
7682         break;
7783
7884      case 0x25: // READ CAPACITY
7985         m_phase = SCSI_PHASE_DATAIN;
86         m_status_code = SCSI_STATUS_CODE_GOOD;
8087         m_transfer_length = 8;
8188         break;
8289
r26162r26163
8794         logerror("T10SBC: READ at LBA %x for %x blocks\n", lba, blocks);
8895
8996         m_phase = SCSI_PHASE_DATAIN;
97         m_status_code = SCSI_STATUS_CODE_GOOD;
9098         m_transfer_length = blocks * m_sector_bytes;
9199         break;
92100
r26162r26163
97105         logerror("T10SBC: WRITE to LBA %x for %x blocks\n", lba, blocks);
98106
99107         m_phase = SCSI_PHASE_DATAOUT;
108         m_status_code = SCSI_STATUS_CODE_GOOD;
100109         m_transfer_length = blocks * m_sector_bytes;
101110         break;
102111
r26162r26163
107116         logerror("T10SBC: READ at LBA %x for %x blocks\n", lba, blocks);
108117
109118         m_phase = SCSI_PHASE_DATAIN;
119         m_status_code = SCSI_STATUS_CODE_GOOD;
110120         m_transfer_length = blocks * m_sector_bytes;
111121         break;
112122
trunk/src/emu/machine/cdu76s.c
r26162r26163
77      case 0x12: // INQUIRY
88         logerror("CDU76S: INQUIRY\n");
99         m_phase = SCSI_PHASE_DATAIN;
10         m_status_code = SCSI_STATUS_CODE_GOOD;
1011         m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
1112         break;
1213   }
trunk/src/emu/bus/ieee488/d9060hd.c
r26162r26163
2424   case D9060HD_CMD_PHYSICAL_DEVICE_ID:
2525   case D9060HD_CMD_DRIVE_DIAGS:
2626      m_phase = SCSI_PHASE_STATUS;
27      m_status_code = SCSI_STATUS_CODE_GOOD;
2728      m_transfer_length = 0;
2829      break;
2930
trunk/src/mess/machine/s1410.c
r26162r26163
259259
260260   case S1410_CMD_INIT_DRIVE_PARAMS:
261261      m_phase = SCSI_PHASE_DATAOUT;
262      m_status_code = SCSI_STATUS_CODE_GOOD;
262263      m_transfer_length = TRANSFERLENGTH_INIT_DRIVE_PARAMS;
263264      break;
264265
265266   case S1410_CMD_FORMAT_ALT_TRACK:
266267      m_phase = SCSI_PHASE_DATAOUT;
268      m_status_code = SCSI_STATUS_CODE_GOOD;
267269      m_transfer_length = TRANSFERLENGTH_FORMAT_ALT_TRACK;
268270      break;
269271
270272   case S1410_CMD_WRITE_SEC_BUFFER:
271273      m_phase = SCSI_PHASE_DATAOUT;
274      m_status_code = SCSI_STATUS_CODE_GOOD;
272275      m_transfer_length = TRANSFERLENGTH_SECTOR_BUFFER;
273276      break;
274277
275278   case S1410_CMD_READ_SEC_BUFFER:
276279      m_phase = SCSI_PHASE_DATAIN;
280      m_status_code = SCSI_STATUS_CODE_GOOD;
277281      m_transfer_length = TRANSFERLENGTH_SECTOR_BUFFER;
278282      break;
279283
r26162r26163
282286   case S1410_CMD_DRIVE_DIAGS:
283287   case S1410_CMD_CONTROLER_DIAGS:
284288      m_phase = SCSI_PHASE_STATUS;
289      m_status_code = SCSI_STATUS_CODE_GOOD;
285290      m_transfer_length = 0;
286291      break;
287292
trunk/src/mess/machine/acb4070.c
r26162r26163
2525   {
2626   case ACB4070_CMD_WRITE_DATA_BUFFER:
2727      m_phase = SCSI_PHASE_DATAOUT;
28      m_status_code = SCSI_STATUS_CODE_GOOD;
2829      m_transfer_length = TRANSFERLENGTH_DATA_BUFFER;
2930      break;
3031
3132   case ACB4070_CMD_READ_DATA_BUFFER:
3233      m_phase = SCSI_PHASE_DATAIN;
34      m_status_code = SCSI_STATUS_CODE_GOOD;
3335      m_transfer_length = TRANSFERLENGTH_DATA_BUFFER;
3436      break;
3537
3638   case SCSI_CMD_MODE_SELECT:
3739      m_phase = SCSI_PHASE_DATAOUT;
40      m_status_code = SCSI_STATUS_CODE_GOOD;
3841      m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
3942      break;
4043

Previous 199869 Revisions Next


© 1997-2024 The MAME Team