1 /*        $NetBSD: iodevice.h,v 1.19 2024/01/07 07:58:35 isaki Exp $  */
2 
3 /*
4  * Copyright (c) 1993, 1994, 1995 Masaru Oki
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *      This product includes software developed by Masaru Oki.
18  * 4. The name of the author may not be used to endorse or promote products
19  *    derived from this software without specific prior written permission
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /*
34  * custom CRTC
35  */
36 struct crtc {
37           unsigned short r00, r01, r02, r03, r04, r05, r06, r07;
38           unsigned short r08, r09, r10, r11, r12, r13, r14, r15;
39           unsigned short r16, r17, r18, r19, r20, r21, r22, r23;
40           char pad0[0x0450];
41           unsigned short crtctrl;
42           char pad1[0x1b7e];
43 };
44 
45 /*
46  * custom VIDEO Controller
47  */
48 struct videoc {
49           unsigned short r0;
50           char pad1[0x00fe]; unsigned short r1;
51           char pad2[0x00fe]; unsigned short r2;
52           char pad3[0x19fe];
53 };
54 
55 /*
56  * Hitachi HD63450 DMA chip
57  */
58 struct dmac {
59                               unsigned char csr;
60                               unsigned char cer;
61           char pad0[2];       unsigned char dcr;
62                               unsigned char ocr;
63                               unsigned char scr;
64                               unsigned char ccr;
65           char pad1[2];       unsigned short mtc;
66                               unsigned long mar;
67           char pad2[4];       unsigned long dar;
68           char pad3[2];       unsigned short btc;
69                               unsigned long bar;
70           char pad4[5];       unsigned char niv;
71           char pad5[1];       unsigned char eiv;
72           char pad6[1];       unsigned char mfc;
73           char pad7[3];       unsigned char cpr;
74           char pad8[3];       unsigned char dfc;
75           char pad9[7];       unsigned char bfc;
76           char pada[5];       unsigned char gcr;
77 };
78 
79 /*
80  * MC68901 Multi Function Periferal
81  */
82 struct mfp {
83           char pad00; unsigned char gpip;
84 #define MFP_GPIP_HSYNC 0x80
85 #define MFP_GPIP_VDISP 0x10
86           char pad01; unsigned char aer;
87           char pad02; unsigned char ddr;
88           char pad03; unsigned char iera;
89 #define MFP_TIMERA_STOP  0
90 #define MFP_TIMERA_RESET 0x10
91           char pad04; unsigned char ierb;
92 #define MFP_TIMERB_STOP  0
93 #define MFP_TIMERB_RESET 0x10
94           char pad05; unsigned char ipra;
95           char pad06; unsigned char iprb;
96           char pad07; unsigned char isra;
97           char pad08; unsigned char isrb;
98           char pad09; unsigned char imra;
99           char pad0a; unsigned char imrb;
100           char pad0b; unsigned char vr;
101           char pad0c; unsigned char tacr;
102           char pad0d; unsigned char tbcr;
103           char pad0e; unsigned char tcdcr;
104           char pad0f; unsigned char tadr;
105           char pad10; unsigned char tbdr;
106           char pad11; unsigned char tcdr;
107           char pad12; unsigned char tddr;
108           char pad13; unsigned char scr;
109           char pad14; unsigned char ucr;
110 #define MFP_UCR_EVENP                   0x02
111 #define MFP_UCR_PARENB                  0x04
112 #define MFP_UCR_SYNCMODE      0x00
113 #define MFP_UCR_ONESB                   0x08
114 #define MFP_UCR_1P5SB                   0x10
115 #define MFP_UCR_TWOSB                   0x18
116 #define MFP_UCR_RW_5                    0x60
117 #define MFP_UCR_RW_6                    0x40
118 #define MFP_UCR_RW_7                    0x20
119 #define MFP_UCR_RW_8                    0x00
120 #define MFP_UCR_CLKX16                  0x80
121           char pad15; unsigned char rsr;
122 #define MFP_RSR_BF            0x80
123 #define MFP_RSR_OE            0x40
124 #define MFP_RSR_PE            0x20
125 #define MFP_RSR_FE            0x10
126 #define MFP_RSR_SS            0x02
127 #define MFP_RSR_RE            0x01
128           char pad16; unsigned char tsr;
129 #define MFP_TSR_BE            0x80
130 #define MFP_TSR_TE            0x01
131           char pad17; unsigned char udr;
132           char pad[0x1fd0];
133 };
134 
135 /*
136  * RICOH Real Time Clock RP5C15
137  */
138 union rtc {
139           struct {
140                     char pad0; unsigned char sec;
141                     char pad1; unsigned char sec10;
142                     char pad2; unsigned char min;
143                     char pad3; unsigned char min10;
144                     char pad4; unsigned char hour;
145                     char pad5; unsigned char hour10;
146                     char pad6; unsigned char week;
147                     char pad7; unsigned char day;
148                     char pad8; unsigned char day10;
149                     char pad9; unsigned char mon;
150                     char pada; unsigned char mon10;
151                     char padb; unsigned char year;
152                     char padc; unsigned char year10;
153                     char padd; unsigned char mode;
154                     char pade; unsigned char test;
155                     char padf; unsigned char reset;
156                     char pad[0x1fe0];
157           } bank0;
158           struct {
159                     char pad0; unsigned char clkout;
160                     char pad1; unsigned char adjust;
161                     char pad2; unsigned char al_min;
162                     char pad3; unsigned char al_min10;
163                     char pad4; unsigned char al_hour;
164                     char pad5; unsigned char al_hour10;
165                     char pad6; unsigned char al_week;
166                     char pad7; unsigned char al_day;
167                     char pad8; unsigned char al_day10;
168                     char pad9; unsigned char unused;
169                     char pada; unsigned char ampm;
170                     char padb; unsigned char leep;
171                     char padc; unsigned char unused2;
172                     char padd; unsigned char mode;
173                     char pade; unsigned char test;
174                     char padf; unsigned char reset;
175                     char pad[0x1fe0];
176           } bank1;
177 };
178 
179 /*
180  * Centronics printer port (output only)
181  */
182 struct centro {
183           char pad0; unsigned char data;
184           char pad1; unsigned char strobe;
185           char pad[0x1ffc];
186 };
187 
188 /*
189  * system control port
190  */
191 struct sysport {
192           char pad0; unsigned char contrast;
193           char pad1; unsigned char tvctrl;
194           char pad2; unsigned char imageunit;
195           char pad3; unsigned char keyctrl;
196           char pad4; unsigned char waitctrl; /* XXX: X68030 only */
197           char pad5; unsigned char mpustat;
198           char pad6; unsigned char sramwp;
199           char pad7; unsigned char powoff;
200           char pad[0x1ff0];
201 };
202 
203 /*
204  * YAMAHA (Operator type-M) chip.
205  */
206 struct opm {
207           char pad0; unsigned char reg;
208           char pad1; unsigned char data;
209           char pad[0x1ffc];
210 };
211 
212 /*
213  * OKI MSM6258V ADPCM chip.
214  */
215 struct adpcm {
216           char pad0; unsigned char stat;
217           char pad1; unsigned char data;
218           char pad[0x1ffc];
219 };
220 
221 /*
222  * NEC 72065 Floppy Disk Controller
223  */
224 struct fdc {
225           char pad0; unsigned char stat;
226           char pad1; unsigned char data;
227           char pad2; unsigned char drvstat;
228           char pad3; unsigned char select;
229           char pad[0x1ff8];
230 };
231 
232 /*
233  * FUJITSU SCSI Protocol Controller MB89352
234  */
235 struct spc {
236           char pad00; unsigned char bdid;
237           char pad02; unsigned char sctl;
238           char pad04; unsigned char scmd;
239           char pad06; unsigned char tmod;
240           char pad08; unsigned char ints;
241           char pad0a; unsigned char psns;
242           char pad0c; unsigned char ssts;
243           char pad0e; unsigned char serr;
244           char pad10; unsigned char pctl;
245           char pad12; unsigned char mbc;
246           char pad14; unsigned char dreg;
247           char pad16; unsigned char temp;
248           char pad18; unsigned char tch;
249           char pad1a; unsigned char tcm;
250           char pad1c; unsigned char tcl;
251           char pad1e;
252           char pad1f;
253 };
254 
255 /*
256  * Zilog scc.
257  */
258 struct zschan {
259           unsigned char       zc_xxx0;
260           unsigned char       zc_csr;             /* control and status, and indirect access */
261           unsigned char       zc_xxx1;
262           unsigned char       zc_data;  /* data */
263 };
264 
265 struct zsdevice {
266           /* Yes, they are backwards. */
267           struct zschan zs_chan_b;
268           struct zschan zs_chan_a;
269           char pad4; unsigned char bstat;         /* external only        : 2 bytes */
270           char pad[6];                            /* ---                  : 6 bytes */
271 };
272 
273 struct ppi8255 {
274           char pad0; unsigned char porta;
275           char pad1; unsigned char portb;
276           char pad2; unsigned char portc;
277           char pad3; unsigned char ctrl;
278           char pad[0x1ff8];
279 };
280 
281 struct ioctlr {
282           char pad0; unsigned char intr;
283           char pad1; unsigned char vect;
284           char pad[0x1ffc];
285 };
286 
287 /*
288  * YAMAHA YM3802 MIDI chip.
289  */
290 struct midi {
291           char pad0; unsigned char r00;
292           char pad1; unsigned char r01;
293           char pad2; unsigned char r02;
294           char pad3; unsigned char r03;
295           char pad4; unsigned char rn4;
296           char pad5; unsigned char rn5;
297           char pad6; unsigned char rn6;
298           char pad7; unsigned char rn7;
299 };
300 
301 struct IODEVICE
302 {
303           unsigned short gvram[0x100000]; /* 0x00c00000 */
304           unsigned char  tvram[0x080000]; /* 0x00e00000 */
305           struct crtc io_crtc;                    /* 0x00e80000 */
306           unsigned short gpalet[0x00100]; /* 0x00e82000 */
307           unsigned short tpalet[0x00100]; /* 0x00e82200 */
308           struct videoc io_videoc;      /* 0x00e82400 */
309           struct dmac io_dma[4];                  /* 0x00e84000 */
310           char  dmapad[0x1f00];
311           char areapad[0x2000];                   /* 0x00e86000 */
312           struct mfp io_mfp;            /* 0x00e88000 */
313           union rtc io_rtc;             /* 0x00e8a000 */
314           struct centro io_printer;     /* 0x00e8c000 */
315           struct sysport io_sysport;    /* 0x00e8e000 */
316           struct opm io_opm;            /* 0x00e90000 */
317           struct adpcm io_adpcm;
318           struct fdc io_fdc;
319           char spcpad1[0x20];           /* 0x00e96000 */
320           struct spc io_inspc;                    /* 0x00e96020 */
321           char spcpad2[0x1fc0];
322           struct zsdevice io_inscc;
323           char sccpad[0x1ff0];
324           struct ppi8255 io_joyport;
325           struct ioctlr io_ctlr;                  /* 0x00e9c000 */
326           char fpcprsv[0x2000];                   /* 0x00e9e000 */
327           struct spc io_exspc;                    /* 0x00ea0000 */
328           char exscsirom[0x1fe0];                 /* */
329           char sysiorsv1[0xda00];                 /* 0x00ea2000 */
330           struct midi io_midi[2];                 /* 0x00eafa00 */
331           char sysiorsv2[0x1e0];                  /* 0x00eafa20 */
332           struct zsdevice io_exscc[4];  /* 0x00eafc00 */
333           char sysiorsv3[0x3c0];                  /* 0x00eafc40 */
334           char sprite[0x10000];                   /* 0x00eb0000 */
335           char usriorsv1[0xe000];                 /* 0x00ec0000 */
336           char neptune[0x400];                    /* 0x00ece000 */
337           char usriorsv2[0x1c00];                 /* 0x00ece400 */
338           char io_sram[0x10000];                  /* 0x00ed0000 */
339           char rsv[0x1ff00];            /* 0x00ee0000 */
340           char psx16550[0x00020];                 /* 0x00efff00 */
341           char rsv2[0x000e0];           /* 0x00efff20 */
342           char cgrom0_16x16[0x05e00];   /* 0x00f00000 */
343           char cgrom1_16x16[0x17800];   /* 0x00f05e00 */
344           char cgrom2_16x16[0x1b2c0];   /* 0x00f1d600 */
345           char cgrom__rsv1 [0x01740];   /* 0x00f388c0 */
346           char cgrom0_8x8  [0x00800];   /* 0x00f3a000 */
347           char cgrom0_8x16 [0x01000];   /* 0x00f3a800 */
348           char cgrom0_12x12[0x01800];   /* 0x00f3b800 */
349           char cgrom0_12x24[0x03000];   /* 0x00f3d000 */
350           char cgrom0_24x24[0x0d380];   /* 0x00f40000 */
351           char cgrom1_24x24[0x34e00];   /* 0x00f4d380 */
352           char cgrom2_24x24[0x3d230];   /* 0x00f82180 */
353           char cgrom__rsv2 [0x00c50];   /* 0x00fbf3b0 */
354           char inscsirom[0x2000];                 /* 0x00fc0000 */
355 };
356 
357 #if defined(_KERNEL) && !defined(_LOCORE)
358 extern uint8_t *intiobase;    /* XXX */
359 #define IODEVbase   ((volatile struct IODEVICE *)intiobase)
360 #endif
361