]> git.sesse.net Git - pistorm/blob - platforms/amiga/piscsi/piscsi.h
[WIP] Pile of stuff
[pistorm] / platforms / amiga / piscsi / piscsi.h
1 #define TDF_EXTCOM (1<<15)
2
3 #define CMD_INVALID     0
4 #define CMD_RESET       1
5 #define CMD_READ        2
6 #define CMD_WRITE       3
7 #define CMD_UPDATE      4
8 #define CMD_CLEAR       5
9 #define CMD_STOP        6
10 #define CMD_START       7
11 #define CMD_FLUSH       8
12 #define CMD_NONSTD      9
13
14 #define TD_MOTOR        (CMD_NONSTD+0)      // 9
15 #define TD_SEEK         (CMD_NONSTD+1)      // 10
16 #define TD_FORMAT       (CMD_NONSTD+2)      // 11
17 #define TD_REMOVE       (CMD_NONSTD+3)      // 12
18 #define TD_CHANGENUM    (CMD_NONSTD+4)  // 13
19 #define TD_CHANGESTATE  (CMD_NONSTD+5)  // 15
20 #define TD_PROTSTATUS   (CMD_NONSTD+6)  // 16
21 #define TD_RAWREAD      (CMD_NONSTD+7)      // 17
22 #define TD_RAWWRITE     (CMD_NONSTD+8)      // 18
23 #define TD_GETDRIVETYPE (CMD_NONSTD+9)  // 19
24 #define TD_GETNUMTRACKS (CMD_NONSTD+10) // 20
25 #define TD_ADDCHANGEINT (CMD_NONSTD+11) // 21
26 #define TD_REMCHANGEINT (CMD_NONSTD+12) // 22
27 #define TD_GETGEOMETRY  (CMD_NONSTD+13) // 23
28 #define TD_EJECT        (CMD_NONSTD+14)     // 24
29 #define TD_LASTCOMM     (CMD_NONSTD+15)     // 25
30
31 #define ETD_WRITE       (CMD_WRITE|TDF_EXTCOM)
32 #define ETD_READ        (CMD_READ|TDF_EXTCOM)
33 #define ETD_MOTOR       (TD_MOTOR|TDF_EXTCOM)
34 #define ETD_SEEK        (TD_SEEK|TDF_EXTCOM)
35 #define ETD_FORMAT      (TD_FORMAT|TDF_EXTCOM)
36 #define ETD_UPDATE      (CMD_UPDATE|TDF_EXTCOM)
37 #define ETD_CLEAR       (CMD_CLEAR|TDF_EXTCOM)
38 #define ETD_RAWREAD     (TD_RAWREAD|TDF_EXTCOM)
39 #define ETD_RAWWRITE    (TD_RAWWRITE|TDF_EXTCOM)
40
41 #define HD_SCSICMD 28
42
43 #define NSCMD_DEVICEQUERY 0x4000
44 #define NSCMD_TD_READ64   0xC000
45 #define NSCMD_TD_WRITE64  0xC001
46 #define NSCMD_TD_SEEK64   0xC002
47 #define NSCMD_TD_FORMAT64 0xC003
48
49 #define RDB_BLOCK_LIMIT 16
50 #define RDB_IDENTIFIER 0x5244534B
51
52 void piscsi_init();
53 void piscsi_map_drive(char *filename, uint8_t index);
54
55 void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type);
56 uint32_t handle_piscsi_read(uint32_t addr, uint8_t type);
57
58 void piscsi_block_op(uint8_t type, uint8_t num, uint32_t dest, uint32_t len);
59
60 struct piscsi_dev {
61     uint32_t c;
62     uint16_t h, s;
63     uint64_t fs;
64     int32_t fd;
65     uint32_t lba;
66     // Will parse max eight partitions per disk
67     struct PartitionBlock *pb[16];
68     struct RigidDiskBlock *rdb;
69 };
70
71 /*
72 dosnode: \
73 //  .long 0 /* dos disk name */
74 //  .long 0 /* device file name */
75 //  .long 0 /* unit */
76 //  .long 0 /* flags */
77 //  .long 16 /* length of node? */
78 //  .long 128 /* longs in a block */
79 //  .long 0
80 //  .long 4 /* surfaces */
81 //  .long 1 /* sectors per block */
82 //  .long 256 /* blocks per track */
83 //  .long 2 /* reserved bootblocks 256 = 128KB */
84 //  .long 0
85 //  .long 0
86 //  .long 2  /* lowcyl FIXME */
87 //  /*.long 2047*/ /* hicyl */
88 //  .long 10 /* buffers */
89 //  .long 0 /* MEMF_ANY */
90 //  .long 0x0001fe00 /* MAXTRANS */
91 //  .long 0x7ffffffe /* Mask */
92 //  .long -1 /* boot prio */
93 //  .long 0x444f5303 /* dostype: DOS3 */1
94
95 struct pihd_dosnode_data {
96     uint32_t name_ptr;
97     uint32_t dev_name_ptr;
98     uint32_t unit;
99     uint32_t flags;
100     uint32_t node_len;
101     uint32_t block_len;
102     uint32_t pad1;
103     uint32_t surf;
104     uint32_t secs_per_block;
105     uint32_t blocks_per_track;
106     uint32_t reserved_blocks;
107     uint32_t pad2;
108     uint32_t pad3;
109     uint32_t lowcyl;
110     uint32_t highcyl;
111     uint32_t buffers;
112     uint32_t mem_type;
113     uint32_t maxtransfer;
114     uint32_t transfer_mask;
115     uint32_t priority;
116     uint32_t dostype;
117 };
118
119 struct RigidDiskBlock {
120     uint32_t   rdb_ID;
121     uint32_t   rdb_SummedLongs;
122     int32_t    rdb_ChkSum;
123     uint32_t   rdb_HostID;
124     uint32_t   rdb_BlockBytes;
125     uint32_t   rdb_Flags;
126     /* block list heads */
127     uint32_t   rdb_BadBlockList;
128     uint32_t   rdb_PartitionList;
129     uint32_t   rdb_FileSysHeaderList;
130     uint32_t   rdb_DriveInit;
131     uint32_t   rdb_Reserved1[6];
132     /* physical drive characteristics */
133     uint32_t   rdb_Cylinders;
134     uint32_t   rdb_Sectors;
135     uint32_t   rdb_Heads;
136     uint32_t   rdb_Interleave;
137     uint32_t   rdb_Park;
138     uint32_t   rdb_Reserved2[3];
139     uint32_t   rdb_WritePreComp;
140     uint32_t   rdb_ReducedWrite;
141     uint32_t   rdb_StepRate;
142     uint32_t   rdb_Reserved3[5];
143     /* logical drive characteristics */
144     uint32_t   rdb_RDBBlocksLo;
145     uint32_t   rdb_RDBBlocksHi;
146     uint32_t   rdb_LoCylinder;
147     uint32_t   rdb_HiCylinder;
148     uint32_t   rdb_CylBlocks;
149     uint32_t   rdb_AutoParkSeconds;
150     uint32_t   rdb_HighRDSKBlock;
151     uint32_t   rdb_Reserved4;
152     /* drive identification */
153     char    rdb_DiskVendor[8];
154     char    rdb_DiskProduct[16];
155     char    rdb_DiskRevision[4];
156     char    rdb_ControllerVendor[8];
157     char    rdb_ControllerProduct[16];
158     char    rdb_ControllerRevision[4];
159     char    rdb_DriveInitName[40];
160 };
161
162 struct PartitionBlock {
163     uint32_t   pb_ID;
164     uint32_t   pb_SummedLongs;
165     int32_t    pb_ChkSum;
166     uint32_t   pb_HostID;
167     uint32_t   pb_Next;
168     uint32_t   pb_Flags;
169     uint32_t   pb_Reserved1[2];
170     uint32_t   pb_DevFlags;
171     uint8_t    pb_DriveName[32];
172     uint32_t   pb_Reserved2[15];
173     uint32_t   pb_Environment[20];
174     uint32_t   pb_EReserved[12];
175 };