1 // SPDX-License-Identifier: MIT
5 #include "platforms/amiga/hunk-reloc.h"
7 #define TDF_EXTCOM (1<<15)
20 #define TD_MOTOR (CMD_NONSTD+0) // 9
21 #define TD_SEEK (CMD_NONSTD+1) // 10
22 #define TD_FORMAT (CMD_NONSTD+2) // 11
23 #define TD_REMOVE (CMD_NONSTD+3) // 12
24 #define TD_CHANGENUM (CMD_NONSTD+4) // 13
25 #define TD_CHANGESTATE (CMD_NONSTD+5) // 15
26 #define TD_PROTSTATUS (CMD_NONSTD+6) // 16
27 #define TD_RAWREAD (CMD_NONSTD+7) // 17
28 #define TD_RAWWRITE (CMD_NONSTD+8) // 18
29 #define TD_GETDRIVETYPE (CMD_NONSTD+9) // 19
30 #define TD_GETNUMTRACKS (CMD_NONSTD+10) // 20
31 #define TD_ADDCHANGEINT (CMD_NONSTD+11) // 21
32 #define TD_REMCHANGEINT (CMD_NONSTD+12) // 22
33 #define TD_GETGEOMETRY (CMD_NONSTD+13) // 23
34 #define TD_EJECT (CMD_NONSTD+14) // 24
35 #define TD_LASTCOMM (CMD_NONSTD+15) // 25
37 #define ETD_WRITE (CMD_WRITE|TDF_EXTCOM)
38 #define ETD_READ (CMD_READ|TDF_EXTCOM)
39 #define ETD_MOTOR (TD_MOTOR|TDF_EXTCOM)
40 #define ETD_SEEK (TD_SEEK|TDF_EXTCOM)
41 #define ETD_FORMAT (TD_FORMAT|TDF_EXTCOM)
42 #define ETD_UPDATE (CMD_UPDATE|TDF_EXTCOM)
43 #define ETD_CLEAR (CMD_CLEAR|TDF_EXTCOM)
44 #define ETD_RAWREAD (TD_RAWREAD|TDF_EXTCOM)
45 #define ETD_RAWWRITE (TD_RAWWRITE|TDF_EXTCOM)
49 #define NSCMD_DEVICEQUERY 0x4000
50 #define NSCMD_TD_READ64 0xC000
51 #define NSCMD_TD_WRITE64 0xC001
52 #define NSCMD_TD_SEEK64 0xC002
53 #define NSCMD_TD_FORMAT64 0xC003
55 #define RDB_BLOCK_LIMIT 16
58 #define RDB_IDENTIFIER 0x5244534B
60 #define PART_IDENTIFIER 0x50415254
62 #define FS_IDENTIFIER 0x46534844
64 #define PISCSI_DRIVER_OFFSET 0x1000
65 #define NUM_FILESYSTEMS 32
73 uint32_t num_partitions;
76 struct PartitionBlock *pb[16];
77 struct RigidDiskBlock *rdb;
81 struct FileSysHeaderBlock * fhb;
84 struct hunk_reloc relocs[512];
85 struct hunk_info h_info;
89 // .long 0 /* dos disk name */
90 // .long 0 /* device file name */
92 // .long 0 /* flags */
95 uint32_t de_TableSize; /* Size of Environment vector */
96 uint32_t de_SizeBlock; /* in longwords: standard value is 128 */
97 uint32_t de_SecOrg; /* not used; must be 0 */
98 uint32_t de_Surfaces; /* # of heads (surfaces). drive specific */
99 uint32_t de_SectorPerBlock; /* not used; must be 1 */
100 uint32_t de_BlocksPerTrack; /* blocks per track. drive specific */
101 uint32_t de_Reserved; /* DOS reserved blocks at start of partition. */
102 uint32_t de_PreAlloc; /* DOS reserved blocks at end of partition */
103 uint32_t de_Interleave; /* usually 0 */
104 uint32_t de_LowCyl; /* starting cylinder. typically 0 */
105 uint32_t de_HighCyl; /* max cylinder. drive specific */
106 uint32_t de_NumBuffers; /* Initial # DOS of buffers. */
107 uint32_t de_BufMemType; /* type of mem to allocate for buffers */
108 uint32_t de_MaxTransfer; /* Max number of bytes to transfer at a time */
109 uint32_t de_Mask; /* Address Mask to block out certain memory */
110 int32_t de_BootPri; /* Boot priority for autoboot */
111 uint32_t de_DosType; /* ASCII (HEX) string showing filesystem type;
112 * 0X444F5300 is old filesystem,
113 * 0X444F5301 is fast file system */
114 uint32_t de_Baud; /* Baud rate for serial handler */
115 uint32_t de_Control; /* Control word for handler/filesystem */
116 uint32_t de_BootBlocks; /* Number of blocks containing boot code */
121 struct pihd_dosnode_data {
123 uint32_t dev_name_ptr;
130 uint32_t secs_per_block;
131 uint32_t blocks_per_track;
132 uint32_t reserved_blocks;
139 uint32_t maxtransfer;
140 uint32_t transfer_mask;
146 struct RigidDiskBlock {
148 uint32_t rdb_SummedLongs;
151 uint32_t rdb_BlockBytes;
153 /* block list heads */
154 uint32_t rdb_BadBlockList;
155 uint32_t rdb_PartitionList;
156 uint32_t rdb_FileSysHeaderList;
157 uint32_t rdb_DriveInit;
158 uint32_t rdb_Reserved1[6];
159 /* physical drive characteristics */
160 uint32_t rdb_Cylinders;
161 uint32_t rdb_Sectors;
163 uint32_t rdb_Interleave;
165 uint32_t rdb_Reserved2[3];
166 uint32_t rdb_WritePreComp;
167 uint32_t rdb_ReducedWrite;
168 uint32_t rdb_StepRate;
169 uint32_t rdb_Reserved3[5];
170 /* logical drive characteristics */
171 uint32_t rdb_RDBBlocksLo;
172 uint32_t rdb_RDBBlocksHi;
173 uint32_t rdb_LoCylinder;
174 uint32_t rdb_HiCylinder;
175 uint32_t rdb_CylBlocks;
176 uint32_t rdb_AutoParkSeconds;
177 uint32_t rdb_HighRDSKBlock;
178 uint32_t rdb_Reserved4;
179 /* drive identification */
180 char rdb_DiskVendor[8];
181 char rdb_DiskProduct[16];
182 char rdb_DiskRevision[4];
183 char rdb_ControllerVendor[8];
184 char rdb_ControllerProduct[16];
185 char rdb_ControllerRevision[4];
186 char rdb_DriveInitName[40];
196 uint32_t dn_StackSize;
200 uint32_t dn_GlobalVec;
205 struct PartitionBlock {
207 uint32_t pb_SummedLongs;
212 uint32_t pb_Reserved1[2];
213 uint32_t pb_DevFlags;
214 uint8_t pb_DriveName[32];
215 uint32_t pb_Reserved2[15];
216 uint32_t pb_Environment[20];
217 uint32_t pb_EReserved[12];
221 struct SCSICmd_ModeSense6 {
223 uint8_t reserved_dbd;
225 uint8_t subpage_code;
231 struct SCSICmd_RW10 {
233 uint8_t rdprotect_flags;
235 uint8_t res_groupnum;
241 struct FileSysHeaderBlock {
243 uint32_t fhb_SummedLongs;
248 uint32_t fhb_Reserved1[2];
249 uint32_t fhb_DosType;
250 uint32_t fhb_Version;
251 uint32_t fhb_PatchFlags;
255 uint32_t fhb_Handler;
256 uint32_t fhb_StackSize;
257 int32_t fhb_Priority;
259 int32_t fhb_SegListBlocks;
260 int32_t fhb_GlobalVec;
261 uint32_t fhb_Reserved2[23];
262 uint8_t fhb_FileSysName[84];
266 void piscsi_shutdown();
267 void piscsi_map_drive(char *filename, uint8_t index);
268 void piscsi_unmap_drive(uint8_t index);
269 struct piscsi_dev *piscsi_get_dev(uint8_t index);
271 void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type);
272 uint32_t handle_piscsi_read(uint32_t addr, uint8_t type);
274 void piscsi_find_filesystems(struct piscsi_dev *d);
275 void piscsi_refresh_drives();