]> git.sesse.net Git - pistorm/blob - platforms/amiga/piscsi/piscsi.h
547596f126e2c5080a1fb972a6899181dca5b147
[pistorm] / platforms / amiga / piscsi / piscsi.h
1 // SPDX-License-Identifier: MIT
2
3 #include <stdint.h>
4
5 #include "platforms/amiga/hunk-reloc.h"
6
7 #define TDF_EXTCOM (1<<15)
8
9 #define CMD_INVALID     0
10 #define CMD_RESET       1
11 #define CMD_READ        2
12 #define CMD_WRITE       3
13 #define CMD_UPDATE      4
14 #define CMD_CLEAR       5
15 #define CMD_STOP        6
16 #define CMD_START       7
17 #define CMD_FLUSH       8
18 #define CMD_NONSTD      9
19
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
36
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)
46
47 #define HD_SCSICMD 28
48
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
54
55 #define RDB_BLOCK_LIMIT 16
56
57 // RDSK
58 #define RDB_IDENTIFIER 0x5244534B
59 // PART
60 #define PART_IDENTIFIER 0x50415254
61 // FSHD
62 #define FS_IDENTIFIER 0x46534844
63
64 #define PISCSI_DRIVER_OFFSET 0x1000
65 #define NUM_FILESYSTEMS 32
66
67 struct piscsi_dev {
68     uint32_t c;
69     uint16_t h, s;
70     uint64_t fs;
71     int32_t fd;
72     uint32_t lba;
73     uint32_t num_partitions;
74     uint32_t fshd_offs;
75     uint32_t block_size;
76     struct PartitionBlock *pb[16];
77     struct RigidDiskBlock *rdb;
78 };
79
80 struct piscsi_fs {
81    struct FileSysHeaderBlock * fhb;
82    uint32_t FS_ID;
83    uint32_t handler;
84    struct hunk_reloc relocs[512];
85    struct hunk_info h_info;
86    uint8_t *binary_data;
87 };
88
89 //  .long 0 /* dos disk name */
90 //  .long 0 /* device file name */
91 //  .long 0 /* unit */
92 //  .long 0 /* flags */
93 #pragma pack(4)
94 struct DosEnvec {
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 */
117
118 };
119
120 #pragma pack(4)
121 struct pihd_dosnode_data {
122     uint32_t name_ptr;
123     uint32_t dev_name_ptr;
124     uint32_t unit;
125     uint32_t flags;
126     uint32_t node_len;
127     uint32_t block_len;
128     uint32_t pad1;
129     uint32_t surf;
130     uint32_t secs_per_block;
131     uint32_t blocks_per_track;
132     uint32_t reserved_blocks;
133     uint32_t pad2;
134     uint32_t interleave;
135     uint32_t lowcyl;
136     uint32_t highcyl;
137     uint32_t buffers;
138     uint32_t mem_type;
139     uint32_t maxtransfer;
140     uint32_t transfer_mask;
141     uint32_t priority;
142     uint32_t dostype;
143 };
144
145 #pragma pack(4)
146 struct RigidDiskBlock {
147     uint32_t   rdb_ID;
148     uint32_t   rdb_SummedLongs;
149     int32_t    rdb_ChkSum;
150     uint32_t   rdb_HostID;
151     uint32_t   rdb_BlockBytes;
152     uint32_t   rdb_Flags;
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;
162     uint32_t   rdb_Heads;
163     uint32_t   rdb_Interleave;
164     uint32_t   rdb_Park;
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];
187 };
188
189 #pragma pack(4)
190 struct DeviceNode {
191     uint32_t    dn_Next;
192     uint32_t    dn_Type;
193     uint32_t    dn_Task;
194     uint32_t    dn_Lock;
195     uint8_t         *dn_Handler;
196     uint32_t    dn_StackSize;
197     int32_t     dn_Priority;
198     uint32_t    dn_Startup;
199     uint32_t    dn_SegList;
200     uint32_t    dn_GlobalVec;
201     uint8_t     *dn_Name;
202 };
203
204 #pragma pack(4)
205 struct PartitionBlock {
206     uint32_t   pb_ID;
207     uint32_t   pb_SummedLongs;
208     int32_t    pb_ChkSum;
209     uint32_t   pb_HostID;
210     uint32_t   pb_Next;
211     uint32_t   pb_Flags;
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];
218 };
219
220 #pragma pack(4)
221 struct SCSICmd_ModeSense6 {
222     uint8_t opcode;
223     uint8_t reserved_dbd;
224     uint8_t pc_pagecode;
225     uint8_t subpage_code;
226     uint8_t alloc_len;
227     uint8_t control;
228 };
229
230 #pragma pack(4)
231 struct SCSICmd_RW10 {
232     uint8_t opcode;
233     uint8_t rdprotect_flags;
234     uint32_t block;
235     uint8_t res_groupnum;
236     uint16_t len;
237     uint8_t control;
238 };
239
240 #pragma pack(4)
241 struct FileSysHeaderBlock {
242     uint32_t   fhb_ID;
243     uint32_t   fhb_SummedLongs;
244     int32_t    fhb_ChkSum;
245     uint32_t   fhb_HostID;
246     uint32_t   fhb_Next;
247     uint32_t   fhb_Flags;
248     uint32_t   fhb_Reserved1[2];
249     uint32_t   fhb_DosType;
250     uint32_t   fhb_Version;
251     uint32_t   fhb_PatchFlags;
252     uint32_t   fhb_Type;
253     uint32_t   fhb_Task;
254     uint32_t   fhb_Lock;
255     uint32_t   fhb_Handler;
256     uint32_t   fhb_StackSize;
257     int32_t    fhb_Priority;
258     int32_t    fhb_Startup;
259     int32_t    fhb_SegListBlocks;
260     int32_t    fhb_GlobalVec;
261     uint32_t   fhb_Reserved2[23];
262     uint8_t    fhb_FileSysName[84];
263 };
264
265 void piscsi_init();
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);
270
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);
273
274 void piscsi_find_filesystems(struct piscsi_dev *d);
275 void piscsi_refresh_drives();