Fix PiSCSI bug that somehow only triggered with -lstdc++

This commit is contained in:
beeanyew
2021-05-16 04:49:41 +02:00
parent bd263c5fbd
commit 5291e047a1
6 changed files with 19 additions and 6 deletions

View File

@@ -224,7 +224,7 @@ uint8_t piscsi_rw(struct piscsi_unit *u, struct IORequest *io) {
data = iotd->iotd_Req.io_Data;
len = iotd->iotd_Req.io_Length;
WRITESHORT(PISCSI_CMD_DRVNUM, u->unit_num);
WRITESHORT(PISCSI_CMD_DRVNUMX, u->unit_num);
READLONG(PISCSI_CMD_BLOCKSIZE, block_size);
if (data == 0) {
@@ -308,7 +308,7 @@ uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io)
uint8_t write = 0;
uint32_t block_size = 512;
WRITESHORT(PISCSI_CMD_DRVNUM, u->unit_num);
WRITESHORT(PISCSI_CMD_DRVNUMX, u->unit_num);
READLONG(PISCSI_CMD_BLOCKSIZE, block_size);
debugval(PISCSI_DBG_VAL1, iostd->io_Length);

View File

@@ -48,6 +48,7 @@ enum piscsi_cmds {
PISCSI_CMD_BLOCKSIZE = 0x74,
PISCSI_CMD_READBYTES = 0x78,
PISCSI_CMD_WRITEBYTES = 0x7C,
PISCSI_CMD_DRVNUMX = 0x80,
PISCSI_DBG_MSG = 0x1000,
PISCSI_DBG_VAL1 = 0x1010,
PISCSI_DBG_VAL2 = 0x1014,

View File

@@ -651,18 +651,22 @@ void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type) {
break;
}
case PISCSI_CMD_DRVNUM:
//printf("%d ", val);
if (val % 10 != 0)
if (val % 10 != 0) {
piscsi_cur_drive = 255;
}
else
piscsi_cur_drive = val / 10;
if (piscsi_cur_drive > NUM_UNITS)
if (piscsi_cur_drive > NUM_UNITS) {
piscsi_cur_drive = 255;
}
if (piscsi_cur_drive != 255) {
DEBUG("[PISCSI] (%s) Drive number set to %d (%d)\n", op_type_names[type], piscsi_cur_drive, val);
}
break;
case PISCSI_CMD_DRVNUMX:
piscsi_cur_drive = val;
DEBUG("[PISCSI] DRVNUMX: %d.\n", val);
break;
case PISCSI_CMD_DEBUGME:
piscsi_debugme(val);
break;

View File

@@ -90,6 +90,7 @@ struct piscsi_fs {
// .long 0 /* device file name */
// .long 0 /* unit */
// .long 0 /* flags */
#pragma pack(4)
struct DosEnvec {
uint32_t de_TableSize; /* Size of Environment vector */
uint32_t de_SizeBlock; /* in longwords: standard value is 128 */
@@ -116,6 +117,7 @@ struct DosEnvec {
};
#pragma pack(4)
struct pihd_dosnode_data {
uint32_t name_ptr;
uint32_t dev_name_ptr;
@@ -140,6 +142,7 @@ struct pihd_dosnode_data {
uint32_t dostype;
};
#pragma pack(4)
struct RigidDiskBlock {
uint32_t rdb_ID;
uint32_t rdb_SummedLongs;
@@ -183,6 +186,7 @@ struct RigidDiskBlock {
char rdb_DriveInitName[40];
};
#pragma pack(4)
struct DeviceNode {
uint32_t dn_Next;
uint32_t dn_Type;
@@ -197,6 +201,7 @@ struct DeviceNode {
uint8_t *dn_Name;
};
#pragma pack(4)
struct PartitionBlock {
uint32_t pb_ID;
uint32_t pb_SummedLongs;
@@ -212,6 +217,7 @@ struct PartitionBlock {
uint32_t pb_EReserved[12];
};
#pragma pack(4)
struct SCSICmd_ModeSense6 {
uint8_t opcode;
uint8_t reserved_dbd;
@@ -221,6 +227,7 @@ struct SCSICmd_ModeSense6 {
uint8_t control;
};
#pragma pack(4)
struct SCSICmd_RW10 {
uint8_t opcode;
uint8_t rdprotect_flags;
@@ -230,6 +237,7 @@ struct SCSICmd_RW10 {
uint8_t control;
};
#pragma pack(4)
struct FileSysHeaderBlock {
uint32_t fhb_ID;
uint32_t fhb_SummedLongs;

Binary file not shown.