1 |
1276 |
phoenix |
/*
|
2 |
|
|
* SWIM access through the IOP
|
3 |
|
|
* Written by Joshua M. Thompson
|
4 |
|
|
*/
|
5 |
|
|
|
6 |
|
|
/* IOP number and channel number for the SWIM */
|
7 |
|
|
|
8 |
|
|
#define SWIM_IOP IOP_NUM_ISM
|
9 |
|
|
#define SWIM_CHAN 1
|
10 |
|
|
|
11 |
|
|
/* Command code: */
|
12 |
|
|
|
13 |
|
|
#define CMD_INIT 0x01 /* Initialize */
|
14 |
|
|
#define CMD_SHUTDOWN 0x02 /* Shutdown */
|
15 |
|
|
#define CMD_START_POLL 0x03 /* Start insert/eject polling */
|
16 |
|
|
#define CMD_STOP_POLL 0x04 /* Stop insert/eject polling */
|
17 |
|
|
#define CMD_SETHFSTAG 0x05 /* Set HFS tag buffer address */
|
18 |
|
|
#define CMD_STATUS 0x06 /* Status */
|
19 |
|
|
#define CMD_EJECT 0x07 /* Eject */
|
20 |
|
|
#define CMD_FORMAT 0x08 /* Format */
|
21 |
|
|
#define CMD_FORMAT_VERIFY 0x09 /* Format and Verify */
|
22 |
|
|
#define CMD_WRITE 0x0A /* Write */
|
23 |
|
|
#define CMD_READ 0x0B /* Read */
|
24 |
|
|
#define CMD_READ_VERIFY 0x0C /* Read and Verify */
|
25 |
|
|
#define CMD_CACHE_CTRL 0x0D /* Cache control */
|
26 |
|
|
#define CMD_TAGBUFF_CTRL 0x0E /* Tag buffer control */
|
27 |
|
|
#define CMD_GET_ICON 0x0F /* Get Icon */
|
28 |
|
|
|
29 |
|
|
/* Drive types: */
|
30 |
|
|
|
31 |
|
|
/* note: apple sez DRV_FDHD is 4, but I get back a type */
|
32 |
|
|
/* of 5 when I do a drive status check on my FDHD */
|
33 |
|
|
|
34 |
|
|
#define DRV_NONE 0 /* No drive */
|
35 |
|
|
#define DRV_UNKNOWN 1 /* Unspecified drive */
|
36 |
|
|
#define DRV_400K 2 /* 400K */
|
37 |
|
|
#define DRV_800K 3 /* 400K/800K */
|
38 |
|
|
#define DRV_FDHD 5 /* 400K/800K/720K/1440K */
|
39 |
|
|
#define DRV_HD20 7 /* Apple HD20 */
|
40 |
|
|
|
41 |
|
|
/* Format types: */
|
42 |
|
|
|
43 |
|
|
#define FMT_HD20 0x0001 /* Apple HD20 */
|
44 |
|
|
#define FMT_400K 0x0002 /* 400K (GCR) */
|
45 |
|
|
#define FMT_800K 0x0004 /* 800K (GCR) */
|
46 |
|
|
#define FMT_720K 0x0008 /* 720K (MFM) */
|
47 |
|
|
#define FMT_1440K 0x0010 /* 1.44M (MFM) */
|
48 |
|
|
|
49 |
|
|
#define FMD_KIND_400K 1
|
50 |
|
|
#define FMD_KIND_800K 2
|
51 |
|
|
#define FMD_KIND_720K 3
|
52 |
|
|
#define FMD_KIND_1440K 1
|
53 |
|
|
|
54 |
|
|
/* Icon Flags: */
|
55 |
|
|
|
56 |
|
|
#define ICON_MEDIA 0x01 /* Have IOP supply media icon */
|
57 |
|
|
#define ICON_DRIVE 0x01 /* Have IOP supply drive icon */
|
58 |
|
|
|
59 |
|
|
/* Error codes: */
|
60 |
|
|
|
61 |
|
|
#define gcrOnMFMErr -400 /* GCR (400/800K) on HD media */
|
62 |
|
|
#define verErr -84 /* verify failed */
|
63 |
|
|
#define fmt2Err -83 /* cant get enough sync during format */
|
64 |
|
|
#define fmt1Err -82 /* can't find sector 0 after track format */
|
65 |
|
|
#define sectNFErr -81 /* can't find sector */
|
66 |
|
|
#define seekErr -80 /* drive error during seek */
|
67 |
|
|
#define spdAdjErr -79 /* can't set drive speed */
|
68 |
|
|
#define twoSideErr -78 /* drive is single-sided */
|
69 |
|
|
#define initIWMErr -77 /* error during initialization */
|
70 |
|
|
#define tk0badErr -76 /* track zero is bad */
|
71 |
|
|
#define cantStepErr -75 /* drive error during step */
|
72 |
|
|
#define wrUnderrun -74 /* write underrun occurred */
|
73 |
|
|
#define badDBtSlp -73 /* bad data bitslip marks */
|
74 |
|
|
#define badDCksum -72 /* bad data checksum */
|
75 |
|
|
#define noDtaMkErr -71 /* can't find data mark */
|
76 |
|
|
#define badBtSlpErr -70 /* bad address bitslip marks */
|
77 |
|
|
#define badCksmErr -69 /* bad address-mark checksum */
|
78 |
|
|
#define dataVerErr -68 /* read-verify failed */
|
79 |
|
|
#define noAdrMkErr -67 /* can't find an address mark */
|
80 |
|
|
#define noNybErr -66 /* no nybbles? disk is probably degaussed */
|
81 |
|
|
#define offLinErr -65 /* no disk in drive */
|
82 |
|
|
#define noDriveErr -64 /* drive isn't connected */
|
83 |
|
|
#define nsDrvErr -56 /* no such drive */
|
84 |
|
|
#define paramErr -50 /* bad positioning information */
|
85 |
|
|
#define wPrErr -44 /* write protected */
|
86 |
|
|
#define openErr -23 /* already initialized */
|
87 |
|
|
|
88 |
|
|
#ifndef __ASSEMBLY__
|
89 |
|
|
|
90 |
|
|
struct swim_drvstatus {
|
91 |
|
|
__u16 curr_track; /* Current track number */
|
92 |
|
|
__u8 write_prot; /* 0x80 if disk is write protected */
|
93 |
|
|
__u8 disk_in_drive; /* 0x01 or 0x02 if a disk is in the drive */
|
94 |
|
|
__u8 installed; /* 0x01 if drive installed, 0xFF if not */
|
95 |
|
|
__u8 num_sides; /* 0x80 if two-sided format supported */
|
96 |
|
|
__u8 two_sided; /* 0xff if two-sided format diskette */
|
97 |
|
|
__u8 new_interface; /* 0x00 if old 400K drive, 0xFF if newer */
|
98 |
|
|
__u16 errors; /* Disk error count */
|
99 |
|
|
struct { /* 32 bits */
|
100 |
|
|
__u16 reserved;
|
101 |
|
|
__u16 :4;
|
102 |
|
|
__u16 external:1; /* Drive is external */
|
103 |
|
|
__u16 scsi:1; /* Drive is a SCSI drive */
|
104 |
|
|
__u16 fixed:1; /* Drive has fixed media */
|
105 |
|
|
__u16 secondary:1; /* Drive is secondary drive */
|
106 |
|
|
__u8 type; /* Drive type */
|
107 |
|
|
} info;
|
108 |
|
|
__u8 mfm_drive; /* 0xFF if this is an FDHD drive */
|
109 |
|
|
__u8 mfm_disk; /* 0xFF if 720K/1440K (MFM) disk */
|
110 |
|
|
__u8 mfm_format; /* 0x00 if 720K, 0xFF if 1440K */
|
111 |
|
|
__u8 ctlr_type; /* 0x00 if IWM, 0xFF if SWIM */
|
112 |
|
|
__u16 curr_format; /* Current format type */
|
113 |
|
|
__u16 allowed_fmt; /* Allowed format types */
|
114 |
|
|
__u32 num_blocks; /* Number of blocks on disk */
|
115 |
|
|
__u8 icon_flags; /* Icon flags */
|
116 |
|
|
__u8 unusued;
|
117 |
|
|
};
|
118 |
|
|
|
119 |
|
|
/* Commands issued from the host to the IOP: */
|
120 |
|
|
|
121 |
|
|
struct swimcmd_init {
|
122 |
|
|
__u8 code; /* CMD_INIT */
|
123 |
|
|
__u8 unusued;
|
124 |
|
|
__u16 error;
|
125 |
|
|
__u8 drives[28]; /* drive type list */
|
126 |
|
|
};
|
127 |
|
|
|
128 |
|
|
struct swimcmd_startpoll {
|
129 |
|
|
__u8 code; /* CMD_START_POLL */
|
130 |
|
|
__u8 unusued;
|
131 |
|
|
__u16 error;
|
132 |
|
|
};
|
133 |
|
|
|
134 |
|
|
struct swimcmd_sethfstag {
|
135 |
|
|
__u8 code; /* CMD_SETHFSTAG */
|
136 |
|
|
__u8 unusued;
|
137 |
|
|
__u16 error;
|
138 |
|
|
caddr_t tagbuf; /* HFS tag buffer address */
|
139 |
|
|
};
|
140 |
|
|
|
141 |
|
|
struct swimcmd_status {
|
142 |
|
|
__u8 code; /* CMD_STATUS */
|
143 |
|
|
__u8 drive_num;
|
144 |
|
|
__u16 error;
|
145 |
|
|
struct swim_drvstatus status;
|
146 |
|
|
};
|
147 |
|
|
|
148 |
|
|
struct swimcmd_eject {
|
149 |
|
|
__u8 code; /* CMD_EJECT */
|
150 |
|
|
__u8 drive_num;
|
151 |
|
|
__u16 error;
|
152 |
|
|
struct swim_drvstatus status;
|
153 |
|
|
};
|
154 |
|
|
|
155 |
|
|
struct swimcmd_format {
|
156 |
|
|
__u8 code; /* CMD_FORMAT */
|
157 |
|
|
__u8 drive_num;
|
158 |
|
|
__u16 error;
|
159 |
|
|
union {
|
160 |
|
|
struct {
|
161 |
|
|
__u16 fmt; /* format kind */
|
162 |
|
|
__u8 hdrbyte; /* fmt byte for hdr (0=default) */
|
163 |
|
|
__u8 interleave; /* interleave (0 = default) */
|
164 |
|
|
caddr_t databuf; /* sector data buff (0=default */
|
165 |
|
|
caddr_t tagbuf; /* tag data buffer (0=default) */
|
166 |
|
|
} f;
|
167 |
|
|
struct swim_drvstatus status;
|
168 |
|
|
} p;
|
169 |
|
|
};
|
170 |
|
|
|
171 |
|
|
struct swimcmd_fmtverify {
|
172 |
|
|
__u8 code; /* CMD_FORMAT_VERIFY */
|
173 |
|
|
__u8 drive_num;
|
174 |
|
|
__u16 error;
|
175 |
|
|
};
|
176 |
|
|
|
177 |
|
|
struct swimcmd_rw {
|
178 |
|
|
__u8 code; /* CMD_READ, CMD_WRITE or CMD_READ_VERIFY */
|
179 |
|
|
__u8 drive_num;
|
180 |
|
|
__u16 error;
|
181 |
|
|
caddr_t buffer; /* R/W buffer address */
|
182 |
|
|
__u32 first_block; /* Starting block */
|
183 |
|
|
__u32 num_blocks; /* Number of blocks */
|
184 |
|
|
__u8 tag[12]; /* tag data */
|
185 |
|
|
};
|
186 |
|
|
|
187 |
|
|
struct swimcmd_cachectl {
|
188 |
|
|
__u8 code; /* CMD_CACHE_CTRL */
|
189 |
|
|
__u8 unused;
|
190 |
|
|
__u16 error;
|
191 |
|
|
__u8 enable; /* Nonzero to enable cache */
|
192 |
|
|
__u8 install; /* +1 = install, -1 = remove, 0 = neither */
|
193 |
|
|
};
|
194 |
|
|
|
195 |
|
|
struct swimcmd_tagbufctl {
|
196 |
|
|
__u8 code; /* CMD_TAGBUFF_CTRL */
|
197 |
|
|
__u8 unused;
|
198 |
|
|
__u16 error;
|
199 |
|
|
caddr_t buf; /* buffer address or 0 to disable */
|
200 |
|
|
};
|
201 |
|
|
|
202 |
|
|
struct swimcmd_geticon {
|
203 |
|
|
__u8 code; /* CMD_GET_ICON */
|
204 |
|
|
__u8 drive_num;
|
205 |
|
|
__u16 error;
|
206 |
|
|
caddr_t buffer; /* Nuffer address */
|
207 |
|
|
__u16 kind; /* 0 = media icon, 1 = drive icon */
|
208 |
|
|
__u16 unused;
|
209 |
|
|
__u16 max_bytes; /* maximum byte count */
|
210 |
|
|
};
|
211 |
|
|
|
212 |
|
|
/* Messages from the SWIM IOP to the host CPU: */
|
213 |
|
|
|
214 |
|
|
struct swimmsg_status {
|
215 |
|
|
__u8 code; /* 1 = insert, 2 = eject, 3 = status changed */
|
216 |
|
|
__u8 drive_num;
|
217 |
|
|
__u16 error;
|
218 |
|
|
struct swim_drvstatus status;
|
219 |
|
|
};
|
220 |
|
|
|
221 |
|
|
#endif /* __ASSEMBLY__ */
|