Преглед изворни кода

Merge pull request #36 from mynameistroy/troy/icd_and_full_cmd_decode

Support for Atari ST ICD extensions
Eric Helgeson пре 2 година
родитељ
комит
77919d159f
2 измењених фајлова са 27 додато и 5 уклоњено
  1. 26 4
      lib/SCSI2SD/src/firmware/scsi.c
  2. 1 1
      lib/SCSI2SD/src/firmware/scsi.h

+ 26 - 4
lib/SCSI2SD/src/firmware/scsi.c

@@ -278,10 +278,22 @@ static void process_DataOut()
 	}
 }
 
-static const uint8_t CmdGroupBytes[8] = {6, 10, 10, 6, 6, 12, 6, 6};
+static const uint8_t CmdGroupBytes[] = {
+	6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
+	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
+	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
+	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
+	10,10,10,10,10,10,10,10,10,10,10,10,10,16,16,16,16,16,16,16,16,
+	16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+	16,16,16,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+	12,12,12,12,12,12,12,12,12,12,12,12,12,12,10,10,10,10,10,10,10,
+	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
+	10,10,10,10,10,10,10,10,10,10,10,10,10,10
+};
+
 static void process_Command()
 {
-	int group;
 	uint8_t command;
 	uint8_t control;
 
@@ -291,8 +303,18 @@ static void process_Command()
 	int parityError = 0;
 	scsiRead(scsiDev.cdb, 6, &parityError);
 
-	group = scsiDev.cdb[0] >> 5;
-	scsiDev.cdbLen = CmdGroupBytes[group];
+	// Handle Atari ST ICD extended commands
+	if (scsiDev.cdb[0] == 0x1F)
+	{
+		scsiDev.cdb[0] = scsiDev.cdb[1];
+		scsiDev.cdb[1] = scsiDev.cdb[2];
+		scsiDev.cdb[2] = scsiDev.cdb[3];
+		scsiDev.cdb[3] = scsiDev.cdb[4];
+		scsiDev.cdb[4] = scsiDev.cdb[5];
+		scsiDev.cdb[5] = scsiReadByte();
+	}
+
+	scsiDev.cdbLen = CmdGroupBytes[scsiDev.cdb[0]];
 	if (parityError &&
 		(scsiDev.boardCfg.flags & S2S_CFG_ENABLE_PARITY))
 	{

+ 1 - 1
lib/SCSI2SD/src/firmware/scsi.h

@@ -145,7 +145,7 @@ typedef struct
 	int savedDataPtr; // Index into data, initially 0.
 	int dataLen;
 
-	uint8_t cdb[12]; // command descriptor block
+	uint8_t cdb[20]; // command descriptor block
 	uint8_t cdbLen; // 6, 10, or 12 byte message.
 	int8_t lun; // Target lun, set by IDENTIFY message.
 	uint8_t discPriv; // Disconnect priviledge.