xref: /inferno-os/os/boot/rpcg/io.h (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth enum
2*74a4d8c2SCharles.Forsyth {
3*74a4d8c2SCharles.Forsyth 	/* software interrupt vectors (SIU and CPM) */
4*74a4d8c2SCharles.Forsyth 	VectorPIC= 0,	/* level 0 to level 7, assigned by software */
5*74a4d8c2SCharles.Forsyth 		CPIClevel=	4,
6*74a4d8c2SCharles.Forsyth 	VectorIRQ=	VectorPIC+8,	/* IRQ0 to IRQ7 */
7*74a4d8c2SCharles.Forsyth 	VectorCPIC=	VectorIRQ+8,	/* 32 CPM interrupts: 0 (error) to 0x1F (PC15) */
8*74a4d8c2SCharles.Forsyth };
9*74a4d8c2SCharles.Forsyth 
10*74a4d8c2SCharles.Forsyth enum
11*74a4d8c2SCharles.Forsyth {
12*74a4d8c2SCharles.Forsyth 	BUSUNKNOWN = 0,
13*74a4d8c2SCharles.Forsyth };
14*74a4d8c2SCharles.Forsyth 
15*74a4d8c2SCharles.Forsyth /*
16*74a4d8c2SCharles.Forsyth  * Buffer Descriptors and IO Rings
17*74a4d8c2SCharles.Forsyth  */
18*74a4d8c2SCharles.Forsyth 
19*74a4d8c2SCharles.Forsyth typedef struct BD BD;
20*74a4d8c2SCharles.Forsyth struct BD {
21*74a4d8c2SCharles.Forsyth 	ushort	status;
22*74a4d8c2SCharles.Forsyth 	ushort	length;
23*74a4d8c2SCharles.Forsyth 	ulong	addr;
24*74a4d8c2SCharles.Forsyth };
25*74a4d8c2SCharles.Forsyth 
26*74a4d8c2SCharles.Forsyth BD*	bdalloc(int);
27*74a4d8c2SCharles.Forsyth void	bdfree(BD*, int);
28*74a4d8c2SCharles.Forsyth 
29*74a4d8c2SCharles.Forsyth enum {
30*74a4d8c2SCharles.Forsyth 	/* Rx BDs, bits common to all protocols */
31*74a4d8c2SCharles.Forsyth 	BDEmpty=	1<<15,
32*74a4d8c2SCharles.Forsyth 	BDWrap=		1<<13,
33*74a4d8c2SCharles.Forsyth 	BDInt=		1<<12,
34*74a4d8c2SCharles.Forsyth 	BDLast=		1<<11,
35*74a4d8c2SCharles.Forsyth 	BDFirst=		1<<10,
36*74a4d8c2SCharles.Forsyth 
37*74a4d8c2SCharles.Forsyth 	/* Tx BDs */
38*74a4d8c2SCharles.Forsyth 	BDReady=		1<<15,
39*74a4d8c2SCharles.Forsyth 	/* BDWrap, BDInt, BDLast */
40*74a4d8c2SCharles.Forsyth };
41*74a4d8c2SCharles.Forsyth 
42*74a4d8c2SCharles.Forsyth typedef struct Ring Ring;
43*74a4d8c2SCharles.Forsyth struct Ring {
44*74a4d8c2SCharles.Forsyth 	BD*	rdr;				/* receive descriptor ring */
45*74a4d8c2SCharles.Forsyth 	void*	rrb;				/* receive ring buffers */
46*74a4d8c2SCharles.Forsyth 	int	rdrx;				/* index into rdr */
47*74a4d8c2SCharles.Forsyth 	int	nrdre;			/* length of rdr */
48*74a4d8c2SCharles.Forsyth 
49*74a4d8c2SCharles.Forsyth 	BD*	tdr;				/* transmit descriptor ring */
50*74a4d8c2SCharles.Forsyth 	Block**	txb;				/* corresponding transmit ring buffers */
51*74a4d8c2SCharles.Forsyth 	int	tdrh;				/* host index into tdr */
52*74a4d8c2SCharles.Forsyth 	int	tdri;				/* interface index into tdr */
53*74a4d8c2SCharles.Forsyth 	int	ntdre;			/* length of tdr */
54*74a4d8c2SCharles.Forsyth 	int	ntq;				/* pending transmit requests */
55*74a4d8c2SCharles.Forsyth };
56*74a4d8c2SCharles.Forsyth 
57*74a4d8c2SCharles.Forsyth #define NEXT(x, l)	(((x)+1)%(l))
58*74a4d8c2SCharles.Forsyth #define PREV(x, l)	(((x) == 0) ? (l)-1: (x)-1)
59*74a4d8c2SCharles.Forsyth #define	HOWMANY(x, y)	(((x)+((y)-1))/(y))
60*74a4d8c2SCharles.Forsyth #define ROUNDUP(x, y)	(HOWMANY((x), (y))*(y))
61*74a4d8c2SCharles.Forsyth 
62*74a4d8c2SCharles.Forsyth int	ioringinit(Ring*, int, int, int);
63*74a4d8c2SCharles.Forsyth 
64*74a4d8c2SCharles.Forsyth /*
65*74a4d8c2SCharles.Forsyth  * CPM
66*74a4d8c2SCharles.Forsyth  */
67*74a4d8c2SCharles.Forsyth enum {
68*74a4d8c2SCharles.Forsyth 	/* commands */
69*74a4d8c2SCharles.Forsyth 	InitRxTx =	0,
70*74a4d8c2SCharles.Forsyth 	InitRx =		1,
71*74a4d8c2SCharles.Forsyth 	InitTx =		2,
72*74a4d8c2SCharles.Forsyth 	EnterHunt=	3,
73*74a4d8c2SCharles.Forsyth 	StopTx=		4,
74*74a4d8c2SCharles.Forsyth 	GracefulStopTx = 5,
75*74a4d8c2SCharles.Forsyth 	InitIDMA =	5,
76*74a4d8c2SCharles.Forsyth 	RestartTx =	6,
77*74a4d8c2SCharles.Forsyth 	CloseRxBD =	7,
78*74a4d8c2SCharles.Forsyth 	SetGroupAddr = 8,
79*74a4d8c2SCharles.Forsyth 	SetTimer =	8,
80*74a4d8c2SCharles.Forsyth 	GCITimeout =	9,
81*74a4d8c2SCharles.Forsyth 	GCIAbort =	10,
82*74a4d8c2SCharles.Forsyth 	StopIDMA =	11,
83*74a4d8c2SCharles.Forsyth 	StartDSP = 	12,
84*74a4d8c2SCharles.Forsyth 	ArmIDMA =	13,
85*74a4d8c2SCharles.Forsyth 	InitDSP =		13,
86*74a4d8c2SCharles.Forsyth 	USBCmd =	15,
87*74a4d8c2SCharles.Forsyth 
88*74a4d8c2SCharles.Forsyth 	/* channel IDs */
89*74a4d8c2SCharles.Forsyth 	SCC1ID=	0,
90*74a4d8c2SCharles.Forsyth 	USBID=	0,
91*74a4d8c2SCharles.Forsyth 	I2CID=	1,
92*74a4d8c2SCharles.Forsyth 	IDMA1ID= 1,
93*74a4d8c2SCharles.Forsyth 	SCC2ID=	4,
94*74a4d8c2SCharles.Forsyth 	SPIID=	5,
95*74a4d8c2SCharles.Forsyth 	IDMA2ID= 5,
96*74a4d8c2SCharles.Forsyth 	TIMERID=	5,
97*74a4d8c2SCharles.Forsyth 	SCC3ID=	8,
98*74a4d8c2SCharles.Forsyth 	SMC1ID=	9,
99*74a4d8c2SCharles.Forsyth 	DSP1ID=9,
100*74a4d8c2SCharles.Forsyth 	SCC4ID=	12,
101*74a4d8c2SCharles.Forsyth 	SMC2ID=	13,
102*74a4d8c2SCharles.Forsyth 	DSP2ID=	13,
103*74a4d8c2SCharles.Forsyth 
104*74a4d8c2SCharles.Forsyth 	BaudEnable = 1<<16,
105*74a4d8c2SCharles.Forsyth 
106*74a4d8c2SCharles.Forsyth 	/* sicr */
107*74a4d8c2SCharles.Forsyth 	CLK1 = 4,		/* SCC1,2 */
108*74a4d8c2SCharles.Forsyth 	CLK2 = 5,
109*74a4d8c2SCharles.Forsyth 	CLK3 = 6,
110*74a4d8c2SCharles.Forsyth 	CLK4 = 7,
111*74a4d8c2SCharles.Forsyth 	CLK5 = CLK1,	/* SCC3,4 */
112*74a4d8c2SCharles.Forsyth 	CLK6 = CLK2,
113*74a4d8c2SCharles.Forsyth 	CLK7 = CLK3,
114*74a4d8c2SCharles.Forsyth 	CLK8 = CLK4,
115*74a4d8c2SCharles.Forsyth };
116*74a4d8c2SCharles.Forsyth 
117*74a4d8c2SCharles.Forsyth void	cpmop(int, int, int);
118*74a4d8c2SCharles.Forsyth #define	ioplock()	(m->iomem)
119*74a4d8c2SCharles.Forsyth #define	iopunlock()
120*74a4d8c2SCharles.Forsyth 
121*74a4d8c2SCharles.Forsyth /*
122*74a4d8c2SCharles.Forsyth  * the structures below follow hardware/firmware layouts in the 8xx manuals:
123*74a4d8c2SCharles.Forsyth  * mind the data types, offsets and alignment
124*74a4d8c2SCharles.Forsyth  */
125*74a4d8c2SCharles.Forsyth 
126*74a4d8c2SCharles.Forsyth /*
127*74a4d8c2SCharles.Forsyth  * basic IO controller parameters (SMC and SCC)
128*74a4d8c2SCharles.Forsyth  */
129*74a4d8c2SCharles.Forsyth typedef struct IOCparam IOCparam;
130*74a4d8c2SCharles.Forsyth struct IOCparam {
131*74a4d8c2SCharles.Forsyth 	ushort	rbase;
132*74a4d8c2SCharles.Forsyth 	ushort	tbase;
133*74a4d8c2SCharles.Forsyth 	uchar	rfcr;
134*74a4d8c2SCharles.Forsyth 	uchar	tfcr;
135*74a4d8c2SCharles.Forsyth 	ushort	mrblr;
136*74a4d8c2SCharles.Forsyth 	ulong	rstate;
137*74a4d8c2SCharles.Forsyth 	ulong	rptr;
138*74a4d8c2SCharles.Forsyth 	ushort	rbptr;
139*74a4d8c2SCharles.Forsyth 	ushort	rcnt;
140*74a4d8c2SCharles.Forsyth 	ulong	rtmp;
141*74a4d8c2SCharles.Forsyth 	ulong	tstate;
142*74a4d8c2SCharles.Forsyth 	ulong	tptr;
143*74a4d8c2SCharles.Forsyth 	ushort	tbptr;
144*74a4d8c2SCharles.Forsyth 	ushort	tcnt;
145*74a4d8c2SCharles.Forsyth 	ulong	ttmp;
146*74a4d8c2SCharles.Forsyth };
147*74a4d8c2SCharles.Forsyth 
148*74a4d8c2SCharles.Forsyth typedef struct SCCparam SCCparam;
149*74a4d8c2SCharles.Forsyth struct SCCparam {
150*74a4d8c2SCharles.Forsyth 	IOCparam;
151*74a4d8c2SCharles.Forsyth 	ulong	rcrc;
152*74a4d8c2SCharles.Forsyth 	ulong	tcrc;
153*74a4d8c2SCharles.Forsyth };
154*74a4d8c2SCharles.Forsyth 
155*74a4d8c2SCharles.Forsyth typedef struct SCC SCC;
156*74a4d8c2SCharles.Forsyth struct SCC {
157*74a4d8c2SCharles.Forsyth 	ulong	gsmrl;
158*74a4d8c2SCharles.Forsyth 	ulong	gsmrh;
159*74a4d8c2SCharles.Forsyth 	ushort	psmr;
160*74a4d8c2SCharles.Forsyth 	uchar	rsvscc0[2];
161*74a4d8c2SCharles.Forsyth 	ushort	todr;
162*74a4d8c2SCharles.Forsyth 	ushort	dsr;
163*74a4d8c2SCharles.Forsyth 	ushort	scce;
164*74a4d8c2SCharles.Forsyth 	uchar	rsvscc1[2];
165*74a4d8c2SCharles.Forsyth 	ushort	sccm;
166*74a4d8c2SCharles.Forsyth 	uchar	rsvscc3;
167*74a4d8c2SCharles.Forsyth 	uchar	sccs;
168*74a4d8c2SCharles.Forsyth 	ushort	irmode;
169*74a4d8c2SCharles.Forsyth 	ushort	irsip;
170*74a4d8c2SCharles.Forsyth };
171*74a4d8c2SCharles.Forsyth 
172*74a4d8c2SCharles.Forsyth typedef struct SMC SMC;
173*74a4d8c2SCharles.Forsyth struct SMC {
174*74a4d8c2SCharles.Forsyth 	uchar	pad1[2];
175*74a4d8c2SCharles.Forsyth 	ushort	smcmr;
176*74a4d8c2SCharles.Forsyth 	uchar	pad2[2];
177*74a4d8c2SCharles.Forsyth 	uchar	smce;
178*74a4d8c2SCharles.Forsyth 	uchar	pad3[3];
179*74a4d8c2SCharles.Forsyth 	uchar	smcm;
180*74a4d8c2SCharles.Forsyth 	uchar	pad4[5];
181*74a4d8c2SCharles.Forsyth };
182*74a4d8c2SCharles.Forsyth 
183*74a4d8c2SCharles.Forsyth typedef struct SPI SPI;
184*74a4d8c2SCharles.Forsyth struct SPI {
185*74a4d8c2SCharles.Forsyth 	ushort	spmode;
186*74a4d8c2SCharles.Forsyth 	uchar	res1[4];
187*74a4d8c2SCharles.Forsyth 	uchar	spie;
188*74a4d8c2SCharles.Forsyth 	uchar	res2[3];
189*74a4d8c2SCharles.Forsyth 	uchar	spim;
190*74a4d8c2SCharles.Forsyth 	uchar	res3[2];
191*74a4d8c2SCharles.Forsyth 	uchar	spcom;
192*74a4d8c2SCharles.Forsyth 	uchar	res4[10];
193*74a4d8c2SCharles.Forsyth };
194*74a4d8c2SCharles.Forsyth 
195*74a4d8c2SCharles.Forsyth typedef struct USB USB;
196*74a4d8c2SCharles.Forsyth struct USB {	/* 823 only */
197*74a4d8c2SCharles.Forsyth 	uchar	usmod;
198*74a4d8c2SCharles.Forsyth 	uchar	usadr;
199*74a4d8c2SCharles.Forsyth 	uchar	uscom;
200*74a4d8c2SCharles.Forsyth 	uchar	rsvu1;
201*74a4d8c2SCharles.Forsyth 	ushort	usep[4];
202*74a4d8c2SCharles.Forsyth 	uchar	rsvu2[4];
203*74a4d8c2SCharles.Forsyth 	ushort	usber;
204*74a4d8c2SCharles.Forsyth 	uchar	rsvu3[2];
205*74a4d8c2SCharles.Forsyth 	ushort	usbmr;
206*74a4d8c2SCharles.Forsyth 	uchar	rsvu4;
207*74a4d8c2SCharles.Forsyth 	uchar	usbs;
208*74a4d8c2SCharles.Forsyth 	uchar	rsvu5[8];
209*74a4d8c2SCharles.Forsyth };
210*74a4d8c2SCharles.Forsyth 
211*74a4d8c2SCharles.Forsyth typedef struct IMM IMM;
212*74a4d8c2SCharles.Forsyth struct IMM {
213*74a4d8c2SCharles.Forsyth 	struct {	/* general SIU */
214*74a4d8c2SCharles.Forsyth 		ulong	siumcr;
215*74a4d8c2SCharles.Forsyth 		ulong	sypcr;
216*74a4d8c2SCharles.Forsyth 		uchar	rsv0[0xE-0x8];
217*74a4d8c2SCharles.Forsyth 		ushort	swsr;
218*74a4d8c2SCharles.Forsyth 		ulong	sipend;
219*74a4d8c2SCharles.Forsyth 		ulong	simask;
220*74a4d8c2SCharles.Forsyth 		ulong	siel;
221*74a4d8c2SCharles.Forsyth 		uchar	sivec;
222*74a4d8c2SCharles.Forsyth 		uchar	padv[3];
223*74a4d8c2SCharles.Forsyth 		ulong	tesr;
224*74a4d8c2SCharles.Forsyth 		uchar	rsv1[0x30-0x24];
225*74a4d8c2SCharles.Forsyth 		ulong	sdcr;
226*74a4d8c2SCharles.Forsyth 		uchar	rsv2[0x80-0x34];
227*74a4d8c2SCharles.Forsyth 	};
228*74a4d8c2SCharles.Forsyth 	struct {	/* PCMCIA */
229*74a4d8c2SCharles.Forsyth 		struct {
230*74a4d8c2SCharles.Forsyth 			ulong	base;
231*74a4d8c2SCharles.Forsyth 			ulong	option;
232*74a4d8c2SCharles.Forsyth 		} pcmr[8];
233*74a4d8c2SCharles.Forsyth 		uchar	rsv3[0xe0-0xc0];
234*74a4d8c2SCharles.Forsyth 		ulong	pgcra;
235*74a4d8c2SCharles.Forsyth 		ulong	pgcrb;
236*74a4d8c2SCharles.Forsyth 		ulong	pscr;
237*74a4d8c2SCharles.Forsyth 		uchar	rsv4[0xf0-0xec];
238*74a4d8c2SCharles.Forsyth 		ulong	pipr;
239*74a4d8c2SCharles.Forsyth 		uchar	rsv5[4];
240*74a4d8c2SCharles.Forsyth 		ulong	per;
241*74a4d8c2SCharles.Forsyth 		uchar	rsv6[4];
242*74a4d8c2SCharles.Forsyth 	};
243*74a4d8c2SCharles.Forsyth 	struct {	/* MEMC */
244*74a4d8c2SCharles.Forsyth 		struct {
245*74a4d8c2SCharles.Forsyth 			ulong	base;
246*74a4d8c2SCharles.Forsyth 			ulong	option;
247*74a4d8c2SCharles.Forsyth 		} memc[8];
248*74a4d8c2SCharles.Forsyth 		uchar	rsv7a[0x24];
249*74a4d8c2SCharles.Forsyth 		ulong	mar;
250*74a4d8c2SCharles.Forsyth 		ulong	mcr;
251*74a4d8c2SCharles.Forsyth 		uchar	rsv7b[4];
252*74a4d8c2SCharles.Forsyth 		ulong	mamr;
253*74a4d8c2SCharles.Forsyth 		ulong	mbmr;
254*74a4d8c2SCharles.Forsyth 		ushort	mstat;
255*74a4d8c2SCharles.Forsyth 		ushort	mptpr;
256*74a4d8c2SCharles.Forsyth 		ulong	mdr;
257*74a4d8c2SCharles.Forsyth 		uchar	rsv7c[0x80];
258*74a4d8c2SCharles.Forsyth 	};
259*74a4d8c2SCharles.Forsyth 	struct {	/* system integration timers */
260*74a4d8c2SCharles.Forsyth 		ushort	tbscr;
261*74a4d8c2SCharles.Forsyth 		uchar	rsv8a[2];
262*74a4d8c2SCharles.Forsyth 		ulong	tbrefu;
263*74a4d8c2SCharles.Forsyth 		ulong	tbrefl;
264*74a4d8c2SCharles.Forsyth 		uchar	rsv8b[0x14];
265*74a4d8c2SCharles.Forsyth 		ushort	rtcsc;
266*74a4d8c2SCharles.Forsyth 		uchar	rsv8c[2];
267*74a4d8c2SCharles.Forsyth 		ulong	rtc;
268*74a4d8c2SCharles.Forsyth 		ulong	rtsec;
269*74a4d8c2SCharles.Forsyth 		ulong	rtcal;
270*74a4d8c2SCharles.Forsyth 		uchar	rsv8d[0x10];
271*74a4d8c2SCharles.Forsyth 		ushort	piscr;
272*74a4d8c2SCharles.Forsyth 		ushort	rsv8e;
273*74a4d8c2SCharles.Forsyth 		ulong	pitc;
274*74a4d8c2SCharles.Forsyth 		ulong	pitr;
275*74a4d8c2SCharles.Forsyth 		uchar	rsv8f[0x34];
276*74a4d8c2SCharles.Forsyth 	};
277*74a4d8c2SCharles.Forsyth 	struct {	/* 280: clocks and resets */
278*74a4d8c2SCharles.Forsyth 		ulong	sccr;
279*74a4d8c2SCharles.Forsyth 		ulong	plprcr;
280*74a4d8c2SCharles.Forsyth 		ulong	rsr;
281*74a4d8c2SCharles.Forsyth 		uchar	rsv9[0x300-0x28c];
282*74a4d8c2SCharles.Forsyth 	};
283*74a4d8c2SCharles.Forsyth 	struct {	/* 300: system integration timers keys */
284*74a4d8c2SCharles.Forsyth 		ulong	tbscrk;
285*74a4d8c2SCharles.Forsyth 		ulong	tbrefuk;
286*74a4d8c2SCharles.Forsyth 		ulong	tbreflk;
287*74a4d8c2SCharles.Forsyth 		ulong	tbk;
288*74a4d8c2SCharles.Forsyth 		uchar	rsv10a[0x10];
289*74a4d8c2SCharles.Forsyth 		ulong	rtcsck;
290*74a4d8c2SCharles.Forsyth 		ulong	rtck;
291*74a4d8c2SCharles.Forsyth 		ulong	rtseck;
292*74a4d8c2SCharles.Forsyth 		ulong	rtcalk;
293*74a4d8c2SCharles.Forsyth 		uchar	rsv10b[0x10];
294*74a4d8c2SCharles.Forsyth 		ulong	piscrk;
295*74a4d8c2SCharles.Forsyth 		ulong	pitck;
296*74a4d8c2SCharles.Forsyth 		uchar	rsv10c[0x38];
297*74a4d8c2SCharles.Forsyth 	};
298*74a4d8c2SCharles.Forsyth 	struct {	/* 380: clocks and resets keys */
299*74a4d8c2SCharles.Forsyth 		ulong	sccrk;
300*74a4d8c2SCharles.Forsyth 		ulong	plprcrk;
301*74a4d8c2SCharles.Forsyth 		ulong	rsrk;
302*74a4d8c2SCharles.Forsyth 		uchar	rsv11[0x800-0x38C];
303*74a4d8c2SCharles.Forsyth 	};
304*74a4d8c2SCharles.Forsyth 	struct {	/* 800: video controller */
305*74a4d8c2SCharles.Forsyth 		ushort	vccr;
306*74a4d8c2SCharles.Forsyth 		ushort	pad11a;
307*74a4d8c2SCharles.Forsyth 		uchar	vsr;
308*74a4d8c2SCharles.Forsyth 		uchar	pad11b;
309*74a4d8c2SCharles.Forsyth 		uchar	vcmr;
310*74a4d8c2SCharles.Forsyth 		uchar	pad11c;
311*74a4d8c2SCharles.Forsyth 		ulong	vbcb;
312*74a4d8c2SCharles.Forsyth 		ulong	pad11d;
313*74a4d8c2SCharles.Forsyth 		ulong	vfcr0;
314*74a4d8c2SCharles.Forsyth 		ulong	vfaa0;
315*74a4d8c2SCharles.Forsyth 		ulong	vfba0;
316*74a4d8c2SCharles.Forsyth 		ulong	vfcr1;
317*74a4d8c2SCharles.Forsyth 		ulong	vfaa1;
318*74a4d8c2SCharles.Forsyth 		ulong	vfba1;
319*74a4d8c2SCharles.Forsyth 		uchar	rsv11a[0x840-0x828];
320*74a4d8c2SCharles.Forsyth 	};
321*74a4d8c2SCharles.Forsyth 	struct {	/* 840: LCD */
322*74a4d8c2SCharles.Forsyth 		ulong	lccr;
323*74a4d8c2SCharles.Forsyth 		ulong	lchcr;
324*74a4d8c2SCharles.Forsyth 		ulong	lcvcr;
325*74a4d8c2SCharles.Forsyth 		ulong	rsv11b;
326*74a4d8c2SCharles.Forsyth 		ulong	lcfaa;
327*74a4d8c2SCharles.Forsyth 		ulong	lcfba;
328*74a4d8c2SCharles.Forsyth 		uchar	lcsr;
329*74a4d8c2SCharles.Forsyth 		uchar	rsv11c[0x860-0x859];
330*74a4d8c2SCharles.Forsyth 	};
331*74a4d8c2SCharles.Forsyth 	struct {	/* 860: I2C */
332*74a4d8c2SCharles.Forsyth 		uchar	i2mod;
333*74a4d8c2SCharles.Forsyth 		uchar	rsv12a[3];
334*74a4d8c2SCharles.Forsyth 		uchar	i2add;
335*74a4d8c2SCharles.Forsyth 		uchar	rsv12b[3];
336*74a4d8c2SCharles.Forsyth 		uchar	i2brg;
337*74a4d8c2SCharles.Forsyth 		uchar	rsv12c[3];
338*74a4d8c2SCharles.Forsyth 		uchar	i2com;
339*74a4d8c2SCharles.Forsyth 		uchar	rsv12d[3];
340*74a4d8c2SCharles.Forsyth 		uchar	i2cer;
341*74a4d8c2SCharles.Forsyth 		uchar	rsv12e[3];
342*74a4d8c2SCharles.Forsyth 		uchar	i2cmr;
343*74a4d8c2SCharles.Forsyth 		uchar	rsv12[0x900-0x875];
344*74a4d8c2SCharles.Forsyth 	};
345*74a4d8c2SCharles.Forsyth 	struct {	/* 900: DMA */
346*74a4d8c2SCharles.Forsyth 		uchar	rsv13[4];
347*74a4d8c2SCharles.Forsyth 		ulong	sdar;
348*74a4d8c2SCharles.Forsyth 		uchar	sdsr;
349*74a4d8c2SCharles.Forsyth 		uchar	pad1[3];
350*74a4d8c2SCharles.Forsyth 		uchar	sdmr;
351*74a4d8c2SCharles.Forsyth 		uchar	pad2[3];
352*74a4d8c2SCharles.Forsyth 		uchar	idsr1;
353*74a4d8c2SCharles.Forsyth 		uchar	pad3[3];
354*74a4d8c2SCharles.Forsyth 		uchar	idmr1;
355*74a4d8c2SCharles.Forsyth 		uchar	pad4[3];
356*74a4d8c2SCharles.Forsyth 		uchar	idsr2;
357*74a4d8c2SCharles.Forsyth 		uchar	pad5[3];
358*74a4d8c2SCharles.Forsyth 		uchar	idmr2;
359*74a4d8c2SCharles.Forsyth 		uchar	pad6[0x930-0x91D];
360*74a4d8c2SCharles.Forsyth 	};
361*74a4d8c2SCharles.Forsyth 	struct {	/* CPM interrupt control */
362*74a4d8c2SCharles.Forsyth 		ushort	civr;
363*74a4d8c2SCharles.Forsyth 		uchar	pad7[0x940-0x932];
364*74a4d8c2SCharles.Forsyth 		ulong	cicr;
365*74a4d8c2SCharles.Forsyth 		ulong	cipr;
366*74a4d8c2SCharles.Forsyth 		ulong	cimr;
367*74a4d8c2SCharles.Forsyth 		ulong	cisr;
368*74a4d8c2SCharles.Forsyth 	};
369*74a4d8c2SCharles.Forsyth 	struct {	/* input/output port */
370*74a4d8c2SCharles.Forsyth 		ushort	padir;
371*74a4d8c2SCharles.Forsyth 		ushort	papar;
372*74a4d8c2SCharles.Forsyth 		ushort	paodr;
373*74a4d8c2SCharles.Forsyth 		ushort	padat;
374*74a4d8c2SCharles.Forsyth 		uchar	pad8[8];
375*74a4d8c2SCharles.Forsyth 		ushort	pcdir;
376*74a4d8c2SCharles.Forsyth 		ushort	pcpar;
377*74a4d8c2SCharles.Forsyth 		ushort	pcso;
378*74a4d8c2SCharles.Forsyth 		ushort	pcdat;
379*74a4d8c2SCharles.Forsyth 		ushort	pcint;
380*74a4d8c2SCharles.Forsyth 		uchar	pad9[6];
381*74a4d8c2SCharles.Forsyth 		ushort	pddir;
382*74a4d8c2SCharles.Forsyth 		ushort	pdpar;
383*74a4d8c2SCharles.Forsyth 		ushort	rsv14a;
384*74a4d8c2SCharles.Forsyth 		ushort	pddat;
385*74a4d8c2SCharles.Forsyth 		uchar	rsv14[0x980-0x978];
386*74a4d8c2SCharles.Forsyth 	};
387*74a4d8c2SCharles.Forsyth 	struct {	/* CPM timers */
388*74a4d8c2SCharles.Forsyth 		ushort	tgcr;
389*74a4d8c2SCharles.Forsyth 		uchar	rsv15a[0x990-0x982];
390*74a4d8c2SCharles.Forsyth 		ushort	tmr1;
391*74a4d8c2SCharles.Forsyth 		ushort	tmr2;
392*74a4d8c2SCharles.Forsyth 		ushort	trr1;
393*74a4d8c2SCharles.Forsyth 		ushort	trr2;
394*74a4d8c2SCharles.Forsyth 		ushort	tcr1;
395*74a4d8c2SCharles.Forsyth 		ushort	tcr2;
396*74a4d8c2SCharles.Forsyth 		ushort	tcn1;
397*74a4d8c2SCharles.Forsyth 		ushort	tcn2;
398*74a4d8c2SCharles.Forsyth 		ushort	tmr3;
399*74a4d8c2SCharles.Forsyth 		ushort	tmr4;
400*74a4d8c2SCharles.Forsyth 		ushort	trr3;
401*74a4d8c2SCharles.Forsyth 		ushort	trr4;
402*74a4d8c2SCharles.Forsyth 		ushort	tcr3;
403*74a4d8c2SCharles.Forsyth 		ushort	tcr4;
404*74a4d8c2SCharles.Forsyth 		ushort	tcn3;
405*74a4d8c2SCharles.Forsyth 		ushort	tcn4;
406*74a4d8c2SCharles.Forsyth 		ushort	ter1;
407*74a4d8c2SCharles.Forsyth 		ushort	ter2;
408*74a4d8c2SCharles.Forsyth 		ushort	ter3;
409*74a4d8c2SCharles.Forsyth 		ushort	ter4;
410*74a4d8c2SCharles.Forsyth 		uchar	rsv15[0x9C0-0x9B8];
411*74a4d8c2SCharles.Forsyth 	};
412*74a4d8c2SCharles.Forsyth 	struct {	/* CPM */
413*74a4d8c2SCharles.Forsyth 		ushort	cpcr;
414*74a4d8c2SCharles.Forsyth 		uchar	res0[2];
415*74a4d8c2SCharles.Forsyth 		ushort	rccr;
416*74a4d8c2SCharles.Forsyth 		uchar	res1;
417*74a4d8c2SCharles.Forsyth 		uchar	rmds;
418*74a4d8c2SCharles.Forsyth 		uchar	res2a[4];
419*74a4d8c2SCharles.Forsyth 		ushort	rctr1;
420*74a4d8c2SCharles.Forsyth 		ushort	rctr2;
421*74a4d8c2SCharles.Forsyth 		ushort	rctr3;
422*74a4d8c2SCharles.Forsyth 		ushort	rctr4;
423*74a4d8c2SCharles.Forsyth 		uchar	res2[2];
424*74a4d8c2SCharles.Forsyth 		ushort	rter;
425*74a4d8c2SCharles.Forsyth 		uchar	res3[2];
426*74a4d8c2SCharles.Forsyth 		ushort	rtmr;
427*74a4d8c2SCharles.Forsyth 		uchar	rsv16[0x9F0-0x9DC];
428*74a4d8c2SCharles.Forsyth 	};
429*74a4d8c2SCharles.Forsyth 	union {	/* BRG */
430*74a4d8c2SCharles.Forsyth 		struct {
431*74a4d8c2SCharles.Forsyth 			ulong	brgc1;
432*74a4d8c2SCharles.Forsyth 			ulong	brgc2;
433*74a4d8c2SCharles.Forsyth 			ulong	brgc3;
434*74a4d8c2SCharles.Forsyth 			ulong	brgc4;
435*74a4d8c2SCharles.Forsyth 		};
436*74a4d8c2SCharles.Forsyth 		ulong	brgc[4];
437*74a4d8c2SCharles.Forsyth 	};
438*74a4d8c2SCharles.Forsyth 	uchar	skip0[0xAB2-0xA00];	/* USB, SCC, SMC, SPI: address using cpmdev(CP...)->regs */
439*74a4d8c2SCharles.Forsyth 	struct {	/* PIP */
440*74a4d8c2SCharles.Forsyth 		ushort	pipc;		/* not 823 */
441*74a4d8c2SCharles.Forsyth 		ushort	ptpr;		/* not 823 */
442*74a4d8c2SCharles.Forsyth 		ulong	pbdir;
443*74a4d8c2SCharles.Forsyth 		ulong	pbpar;
444*74a4d8c2SCharles.Forsyth 		uchar	pad10[2];
445*74a4d8c2SCharles.Forsyth 		ushort	pbodr;
446*74a4d8c2SCharles.Forsyth 		ulong	pbdat;
447*74a4d8c2SCharles.Forsyth 		uchar	pad11[0xAE0-0xAC8];
448*74a4d8c2SCharles.Forsyth 	};
449*74a4d8c2SCharles.Forsyth 	struct {	/* SI */
450*74a4d8c2SCharles.Forsyth 		ulong	simode;
451*74a4d8c2SCharles.Forsyth 		uchar	sigmr;
452*74a4d8c2SCharles.Forsyth 		uchar	pad12;
453*74a4d8c2SCharles.Forsyth 		uchar	sistr;
454*74a4d8c2SCharles.Forsyth 		uchar	sicmr;
455*74a4d8c2SCharles.Forsyth 		uchar	pad13[4];
456*74a4d8c2SCharles.Forsyth 		ulong	sicr;
457*74a4d8c2SCharles.Forsyth 		ulong	sirp;
458*74a4d8c2SCharles.Forsyth 		uchar	pad14[0xB00-0xAF4];
459*74a4d8c2SCharles.Forsyth 	};
460*74a4d8c2SCharles.Forsyth 	ulong	vcram[64];
461*74a4d8c2SCharles.Forsyth 	ushort	siram[256];
462*74a4d8c2SCharles.Forsyth 	ushort	lcdmap[256];
463*74a4d8c2SCharles.Forsyth };
464