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