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