]> git.sesse.net Git - pistorm/commitdiff
Fix direct SCSI reads/writes
authorbeeanyew <beeanyew@gmail.com>
Fri, 19 Feb 2021 11:32:29 +0000 (12:32 +0100)
committerbeeanyew <beeanyew@gmail.com>
Fri, 19 Feb 2021 11:32:29 +0000 (12:32 +0100)
README.md
platforms/amiga/amiga-platform.c
platforms/amiga/piscsi/device_driver_amiga/bootrom
platforms/amiga/piscsi/device_driver_amiga/pi-scsi.device
platforms/amiga/piscsi/device_driver_amiga/piscsi-amiga-2.c
platforms/amiga/piscsi/piscsi-enums.h
platforms/amiga/piscsi/piscsi.c
platforms/amiga/piscsi/piscsi.h
platforms/amiga/piscsi/piscsi.rom

index 522176cb9bc718da18ce694b1b4cb122ee15eb64..63a067c238684b5fca09539c55a796fdf66c4eff 100644 (file)
--- a/README.md
+++ b/README.md
@@ -8,11 +8,21 @@
 * Hardware files are in Hardware.zip, using the hardware design or parts of it in a commercial product (aka selling with profit) needs a explicit approval from me!
 * Even selling blank PCBs at eBay or so without my approval might makes me pretty mad and probably leads to the forthcomming related projects to be closed source. You have been warned :)
 
+# wip-crap tutorial/quickstart
 
-Simple quickstart
+In order to successfully use the features on the wip-crap branch, you need to take a few additional steps:
 
+* Follow the steps in the "Simple quickstart" below up to `sudo apt-install git`, then do this:
+* `git clone https://github.com/beeanyew/pistorm.git`
+* `cd pistorm`
+* `git checkout wip-crap`
+* `sudo apt-get install libsdl2-dev`
+* `make`
+* Follow the instructions for `FPGA bitstream update` below the quickstart. This is very important, as the latest commit on the branch uses the updated proto3 firmware.
 
 
+# Simple quickstart
+
 * Download Raspberry OS from https://www.raspberrypi.org/software/operating-systems/ , the Lite version is sufficent
 * Write the Image to a SD Card (8GB sized is plenty, for larger HDD Images pick a bigger one)
 * Install the pistorm adapter inplace of the orignal CPU into the Amiga500. Make sure the pistorm sits flush and correct in the Amiga.
@@ -54,7 +64,9 @@ to exit emulation
 
 The IDE emulation can take both hard drive images generated using `makedisk` in the `ide` directory (these have a 1KB header) or headerless RDSK/RDB images created for instance in WinUAE or as empty files. The IDE emulation currently has a quirk that may require you to reduce/increase the size of the image file by 2MB in order for it to work.
 
-** FPGA bitstream update :
+Since PiSCSI can now autoboot RDSK hard drive images, using the IDE controller emulation is not recommended unless you already have a suitable .img file set up for it.
+
+# FPGA bitstream update :
 
 install openocd 
 `sudo apt-get install openocd`
index 82301791bfd9714dc01bd44d10f1580151474c93..b284789d51b247848ad1d509b8eeba9007df95c1 100644 (file)
@@ -138,10 +138,6 @@ void adjust_ranges_amiga(struct emulator_config *cfg) {
     cfg->custom_low = 0;
 
     // Set up the min/max ranges for mapped reads/writes
-    if (gayle_emulation_enabled) {
-        cfg->mapped_low = GAYLEBASE;
-        cfg->mapped_high = GAYLEBASE + GAYLESIZE;
-    }
     for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
         if (cfg->map_type[i] != MAPTYPE_NONE) {
             if ((cfg->map_offset[i] != 0 && cfg->map_offset[i] < cfg->mapped_low) || cfg->mapped_low == 0)
index ab7cf16eeb0d0a79f3878438e175f277e5d9f873..fe3d33a7be850f347fcb8d7203d478fb2d29b1be 100644 (file)
Binary files a/platforms/amiga/piscsi/device_driver_amiga/bootrom and b/platforms/amiga/piscsi/device_driver_amiga/bootrom differ
index c57df2bd9171447eeb8746f03382b1a36fd5a8b3..05c9b311a095bc7ac47ccbfa1635b950a5581e6a 100644 (file)
Binary files a/platforms/amiga/piscsi/device_driver_amiga/pi-scsi.device and b/platforms/amiga/piscsi/device_driver_amiga/pi-scsi.device differ
index fd0a0e2ee98f4c961766763d2597f5f9e5cf6e13..22145661add7f6703ebc25f029fbd78631a1535e 100644 (file)
@@ -91,10 +91,10 @@ uint8_t piscsi_perform_io(struct piscsi_unit *u, struct IORequest *io);
 uint8_t piscsi_rw(struct piscsi_unit *u, struct IORequest *io);
 uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io);
 
-//#define debug(...)
-//#define debugval(...)
-#define debug(c, v) WRITESHORT(c, v)
-#define debugval(c, v) WRITELONG(c, v)
+#define debug(...)
+#define debugval(...)
+//#define debug(c, v) WRITESHORT(c, v)
+//#define debugval(c, v) WRITELONG(c, v)
 
 struct piscsi_base *dev_base = NULL;
 
@@ -362,24 +362,28 @@ uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io)
         case SCSICMD_WRITE_6:
             write = 1;
         case SCSICMD_READ_6:
-            block = *(uint32_t *)(&scsi->scsi_Command[0]) & 0x001FFFFF;
-            /*block = scsi->scsi_Command[1] & 0x1f;
+            //block = *(uint32_t *)(&scsi->scsi_Command[0]) & 0x001FFFFF;
+            block = scsi->scsi_Command[1] & 0x1f;
             block = (block << 8) | scsi->scsi_Command[2];
-            block = (block << 8) | scsi->scsi_Command[3];*/
+            block = (block << 8) | scsi->scsi_Command[3];
             blocks = scsi->scsi_Command[4];
+            debugval(PISCSI_DBG_VAL1, (uint32_t)scsi->scsi_Command);
+            debug(PISCSI_DBG_MSG, DBG_SCSICMD_RW6);
             goto scsireadwrite;
         case SCSICMD_WRITE_10:
             write = 1;
         case SCSICMD_READ_10:
-            block = *(uint32_t *)(&scsi->scsi_Command[2]);
-            /*block = scsi->scsi_Command[2];
+            debugval(PISCSI_DBG_VAL1, (uint32_t)scsi->scsi_Command);
+            debug(PISCSI_DBG_MSG, DBG_SCSICMD_RW10);
+            //block = *(uint32_t *)(&scsi->scsi_Command[2]);
+            block = scsi->scsi_Command[2];
             block = (block << 8) | scsi->scsi_Command[3];
             block = (block << 8) | scsi->scsi_Command[4];
-            block = (block << 8) | scsi->scsi_Command[5];*/
+            block = (block << 8) | scsi->scsi_Command[5];
 
-            blocks = *(uint16_t *)(&scsi->scsi_Command[7]);
-            /*blocks = scsi->scsi_Command[7];
-            blocks = (blocks << 8) | scsi->scsi_Command[8];*/
+            //blocks = *(uint16_t *)(&scsi->scsi_Command[7]);
+            blocks = scsi->scsi_Command[7];
+            blocks = (blocks << 8) | scsi->scsi_Command[8];
 
 scsireadwrite:;
             WRITESHORT(PISCSI_CMD_DRVNUM, (u->scsi_num));
@@ -394,13 +398,13 @@ scsireadwrite:;
             }
 
             if (write == 0) {
-                WRITELONG(PISCSI_CMD_ADDR2, block);
+                WRITELONG(PISCSI_CMD_ADDR1, block);
                 WRITELONG(PISCSI_CMD_ADDR2, (blocks << 9));
                 WRITELONG(PISCSI_CMD_ADDR3, (uint32_t)data);
                 WRITESHORT(PISCSI_CMD_READ, u->unit_num);
             }
             else {
-                WRITELONG(PISCSI_CMD_ADDR2, block);
+                WRITELONG(PISCSI_CMD_ADDR1, block);
                 WRITELONG(PISCSI_CMD_ADDR2, (blocks << 9));
                 WRITELONG(PISCSI_CMD_ADDR3, (uint32_t)data);
                 WRITESHORT(PISCSI_CMD_WRITE, u->unit_num);
index 5d4efa44908160354930953e4097a0c124189b26..9fc9bd8732fd5529cc981c3defe22cf4bbbc4092 100644 (file)
@@ -72,6 +72,8 @@ enum piscsi_dbg_msgs {
     DBG_IOCMD_UNHANDLED,
     DBG_SCSI_DEBUG_MODESENSE_6,
     DBG_SCSI_DEBUG_MODESENSE_10,
+    DBG_SCSICMD_RW6,
+    DBG_SCSICMD_RW10,
 };
 
 enum scsi_commands {
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) {
index d3271255b8dc80fb74078ac8cc92f673f866b7d3..5ed0078320c3c711916b3a705bfd85b7896f27af 100644 (file)
@@ -215,6 +215,15 @@ struct SCSICmd_ModeSense6 {
     uint8_t control;
 };
 
+struct SCSICmd_RW10 {
+    uint8_t opcode;
+    uint8_t rdprotect_flags;
+    uint32_t block;
+    uint8_t res_groupnum;
+    uint16_t len;
+    uint8_t control;
+};
+
 struct FileSysHeaderBlock {
     uint32_t   fhb_ID;
     uint32_t   fhb_SummedLongs;
index 67af5f82e18b5fca07dbd56b536f7dcfcea5c6ca..85add466bc9ff7cd101f6efebaac9c0fc647e0d1 100644 (file)
Binary files a/platforms/amiga/piscsi/piscsi.rom and b/platforms/amiga/piscsi/piscsi.rom differ