]> git.sesse.net Git - pistorm/blobdiff - platforms/amiga/piscsi/piscsi.c
Fix direct SCSI reads/writes
[pistorm] / platforms / amiga / piscsi / piscsi.c
index c78650c80117cfcfe532cfcef4bc5a3ad2c6467e..3f354dd387ff9430ee8d71d3dae54f62927c69e0 100644 (file)
 #define BE(val) be32toh(val)
 #define BE16(val) be16toh(val)
 
-// Comment these lines to restore debug output:
+// Uncomment the line below to enable debug output
+//#define PISCSI_DEBUG
+
+#ifdef PISCSI_DEBUG
+#define DEBUG printf
+//#define DEBUG_TRIVIAL printf
+#define DEBUG_TRVIAL(...)
+
+extern void stop_cpu_emulation(uint8_t disasm_cur);
+
+static const char *op_type_names[4] = {
+    "BYTE",
+    "WORD",
+    "LONGWORD",
+    "MEM",
+};
+#else
 #define DEBUG(...)
-//#define DEBUG printf
 #define DEBUG_TRIVIAL(...)
-//#define DEBUG_TRIVIAL printf
 #define stop_cpu_emulation(...)
+#endif
 
 #ifdef FAKESTORM
 #define lseek64 lseek
 #endif
 
 extern struct emulator_config *cfg;
-extern void stop_cpu_emulation(uint8_t disasm_cur);
 
 struct piscsi_dev devs[8];
 struct piscsi_fs filesystems[NUM_FILESYSTEMS];
@@ -44,17 +58,8 @@ uint32_t rom_partition_prio[128];
 uint32_t rom_partition_dostype[128];
 uint32_t rom_cur_partition = 0, rom_cur_fs = 0;
 
-
-
 extern unsigned char ac_piscsi_rom[];
 
-static const char *op_type_names[4] = {
-    "BYTE",
-    "WORD",
-    "LONGWORD",
-    "MEM",
-};
-
 //static const char *partition_marker = "PART";
 
 struct hunk_info piscsi_hinfo;
@@ -220,6 +225,7 @@ void piscsi_find_filesystems(struct piscsi_dev *d) {
     
     while (BE(fhb->fhb_ID) == FS_IDENTIFIER) {
         char *dosID = (char *)&fhb->fhb_DosType;
+#ifdef PISCSI_DEBUG
         uint16_t *fsVer = (uint16_t *)&fhb->fhb_Version;
 
         DEBUG("[FSHD] FSHD Block found.\n");
@@ -232,6 +238,7 @@ void piscsi_find_filesystems(struct piscsi_dev *d) {
         DEBUG("[FSHD] Prio: %d Startup: %d\n", BE(fhb->fhb_Priority), BE(fhb->fhb_Startup));
         DEBUG("[FSHD] SegListBlocks: %d GlobalVec: %d\n", BE(fhb->fhb_Priority), BE(fhb->fhb_Startup));
         DEBUG("[FSHD] FileSysName: %s\n", fhb->fhb_FileSysName + 1);
+#endif
 
         for (int i = 0; i < NUM_FILESYSTEMS; i++) {
             if (filesystems[i].FS_ID == fhb->fhb_DosType) {
@@ -414,10 +421,36 @@ void print_piscsi_debug_message(int index) {
         case DBG_SCSI_RDG:
             DEBUG("[PISCSI] Get SCSI RDG MODE SENSE.\n");
             break;
+        case DBG_SCSICMD_RW10:
+#ifdef PISCSI_DEBUG
+            r = get_mapped_item_by_address(cfg, piscsi_dbg[0]);
+            struct SCSICmd_RW10 *rwdat = NULL;
+            char data[10];
+            if (r != -1) {
+                uint32_t addr = piscsi_dbg[0] - cfg->map_offset[r];
+                rwdat = (struct SCSICmd_RW10 *)(&cfg->map_data[r][addr]);
+            }
+            else {
+                DEBUG_TRIVIAL("[RW10] scsiData: %.8X\n", piscsi_dbg[0]);
+                for (int i = 0; i < 10; i++) {
+                    data[i] = read8(piscsi_dbg[0] + i);
+                }
+                rwdat = data;
+            }
+            if (rwdat) {
+                DEBUG_TRIVIAL("[RW10] CMD: %.2X\n", rwdat->opcode);
+                DEBUG_TRIVIAL("[RW10] RDP: %.2X\n", rwdat->rdprotect_flags);
+                DEBUG_TRIVIAL("[RW10] Block: %d (%d)\n", rwdat->block, BE(rwdat->block));
+                DEBUG_TRIVIAL("[RW10] Res_Group: %.2X\n", rwdat->res_groupnum);
+                DEBUG_TRIVIAL("[RW10] Len: %d (%d)\n", rwdat->len, BE16(rwdat->len));
+            }
+#endif
+            break;
         case DBG_SCSI_DEBUG_MODESENSE_6:
             DEBUG_TRIVIAL("[PISCSI] SCSI ModeSense debug. Data: %.8X\n", piscsi_dbg[0]);
             r = get_mapped_item_by_address(cfg, piscsi_dbg[0]);
             if (r != -1) {
+#ifdef PISCSI_DEBUG
                 uint32_t addr = piscsi_dbg[0] - cfg->map_offset[r];
                 struct SCSICmd_ModeSense6 *sense = (struct SCSICmd_ModeSense6 *)(&cfg->map_data[r][addr]);
                 DEBUG_TRIVIAL("[SenseData] CMD: %.2X\n", sense->opcode);
@@ -426,6 +459,7 @@ void print_piscsi_debug_message(int index) {
                 DEBUG_TRIVIAL("[SenseData] PageCodes: %.2X %.2X\n", (sense->pc_pagecode & 0x3F), sense->subpage_code);
                 DEBUG_TRIVIAL("[SenseData] AllocLen: %d\n", sense->alloc_len);
                 DEBUG_TRIVIAL("[SenseData] Control: %.2X (%d)\n", sense->control, sense->control);
+#endif
             }
             else {
                 DEBUG("[!!!PISCSI] ModeSense data not immediately available.\n");
@@ -471,6 +505,9 @@ void piscsi_debugme(uint32_t index) {
 
 void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type) {
     int32_t r;
+#ifndef PISCSI_DEBUG
+    if (type) {}
+#endif
 
     struct piscsi_dev *d = &devs[piscsi_cur_drive];
 
@@ -678,7 +715,9 @@ skip_disk:;
             if (r != -1) {
                 uint32_t addr = val - cfg->map_offset[r];
                 struct DeviceNode *node = (struct DeviceNode *)(cfg->map_data[r] + addr);
+#ifdef PISCSI_DEBUG
                 char *dosID = (char *)&rom_partition_dostype[rom_cur_partition];
+#endif
                 DEBUG("[PISCSI] Partition DOSType is %c%c%c/%d\n", dosID[0], dosID[1], dosID[2], dosID[3]);
                 for (i = 0; i < piscsi_num_fs; i++) {
                     if (rom_partition_dostype[rom_cur_partition] == filesystems[i].FS_ID) {