M carrera/io.h => carrera/io.h +7 -3
@@ 7,6 7,10 @@ enum
Eisaphys = 0x90000000, /* IO port physical */
Devicevirt = 0xE0000000,
Dmabase = 0xE0000000,
+ R4030Isr = 0xE0000204, /* Interrupt status register */
+ R4030Et = 0xE000020C, /* Eisa error type */
+ R4030Rfa = 0xE000003C, /* Remote failed address */
+ R4030Mfa = 0xE0000044, /* Memory failed address */
Sonicbase = 0xE0001000,
Scsibase = 0xE0002000,
Floppybase = 0xE0003000,
@@ 24,7 28,7 @@ enum
Keydat = 7,
MouseIO = 0xE0005000,
SoundIO = 0xE000C000,
- EisaLatch = 0xE000E000,
+ EisaLatch = 0xE000E007,
Diag = 0xE000F000,
VideoCTL = 0x60000000,
VideoMEM = 0x40000000,
@@ 66,5 70,5 @@ struct Tte
#define UNCACHED(type, v) (type*)((ulong)(v)|0xA0000000)
#define EISA(v) (Eisamvirt+(v))
-#define EISAOUTB(port, v) *(uchar*)((EisaControl+(port))^7) = v
-#define EISAINB(port) (*(uchar*)((EisaControl+(port))^7))
+#define EISAOUTB(port, v) *(uchar*)((EisaControl+(port))^2) = v
+#define EISAINB(port) (*(uchar*)((EisaControl+(port))^2))
M carrera/kbd.c => carrera/kbd.c +13 -8
@@ 152,7 152,7 @@ kdbdly(int l)
{
int i;
- l *= 21;
+ l *= 21; /* experimentally determined */
for(i=0; i<l; i++)
;
}
@@ 167,7 167,6 @@ kbdwait(void)
for(tries = 0; tries < 2000; tries++){
if(KBDCTL & Sobf){
- kdbdly(1);
return 1;
}
kdbdly(1);
@@ 193,6 192,7 @@ kbdintr(void)
uchar ch, code;
static uchar kc[5];
static int shifted, ctrled, lstate;
+ static int upcode;
kbdwait();
code = KBDDAT;
@@ 201,17 201,23 @@ kbdintr(void)
* key has gone up
*/
if(code == Up) {
- kbdwait();
- ch = keymap[KBDDAT];
+ upcode = 1;
+ return 0;
+ }
+
+ if(code > 0x87)
+ return 1;
+
+ if(upcode){
+ ch = keymap[code];
if(ch == Ctrl)
ctrled = 0;
else if(ch == Shift)
shifted = 0;
+ upcode = 0;
return 0;
}
-
- if(code > 0x87)
- return 1;
+ upcode = 0;
/*
* convert
@@ 220,7 226,6 @@ kbdintr(void)
ch = skeymap[code];
else
ch = keymap[code];
-iprint("code %d %d\n", code, ch);
/*
* normal character
*/
M carrera/main.c => carrera/main.c +10 -5
@@ 47,7 47,7 @@ main(void)
serialinit();
vecinit();
iprint("\n\nBrazil\n");
-/*screeninit();*/
+ screeninit(); /**/
pageinit();
procinit0();
initseg();
@@ 170,21 170,26 @@ ioinit(void)
/*
* Map devices and the Eisa control space
*/
- devphys = PPN(Devicephys)|PTEGLOBL|PTEVALID|PTEWRITE|PTEUNCACHED;
- isaphys = PPN(Eisaphys)|PTEGLOBL|PTEVALID|PTEWRITE|PTEUNCACHED;
+ devphys = IOPTE|PPN(Devicephys);
+ isaphys = IOPTE|PPN(Eisaphys);
puttlbx(1, Devicevirt, devphys, isaphys, PGSZ64K);
/*
* Map Interrupt control & Eisa memory
*/
- intphys = PPN(Intctlphys)|PTEGLOBL|PTEVALID|PTEWRITE|PTEUNCACHED;
- isamphys = PPN(Eisamphys)|PTEGLOBL|PTEVALID|PTEWRITE|PTEUNCACHED;
+ intphys = IOPTE|PPN(Intctlphys);
+ isamphys = IOPTE|PPN(Eisamphys);
puttlbx(2, Intctlvirt, intphys, isamphys, PGSZ1M);
/* Enable all devce interrupt */
IO(ushort, Intenareg) = 0xffff;
+
+ /* Look at the first 16M of Eisa memory */
+iprint("write latch\n");
+/* IO(uchar, EisaLatch) = 0; /**/
+iprint("done\n");
}
/*
M carrera/mem.h => carrera/mem.h +1 -0
@@ 131,6 131,7 @@
#define PTECOHERXCL (4<<3)
#define PTECOHERXCLW (5<<3)
#define PTECOHERUPDW (6<<3)
+#define IOPTE (PTEGLOBL|PTEVALID|PTEWRITE|PTEUNCACHED)
#define PTEPID(n) (n)
#define TLBPID(n) ((n)&0xFF)
M carrera/screen.c => carrera/screen.c +109 -6
@@ 180,6 180,10 @@ screenwin(void)
hwcurs = 0;
}
+void getvmode(VGAmode *v);
+void writeregisters(VGAmode *v);
+VGAmode x;
+
void
screeninit(void)
{
@@ 187,10 191,12 @@ screeninit(void)
uchar *scr;
setmode(&dfltmode);
-
+ getvmode(&x);
+ writeregisters(&x);
+return;
memmove(&arrow, &fatarrow, sizeof(fatarrow));
- scr = (uchar*)EISA(0xA0000);
+ scr = (uchar*)EISA(0xC0000);
iprint("%lux\n", scr);
*scr = 0xaa;
i = *scr;
@@ 383,7 389,8 @@ srout(int reg, int val)
}
uchar
-srin(ushort i) {
+srin(ushort i)
+{
EISAOUTB(SRX, i);
return EISAINB(SR);
}
@@ 438,6 445,9 @@ setmode(VGAmode *v)
{
int i;
+ for(i = 0; i < sizeof(v->general); i++)
+ genout(i, v->general[i]);
+
/* turn screen off (to avoid damage) */
srout(1, 0x21);
@@ 447,9 457,6 @@ setmode(VGAmode *v)
srout(0x00, srin(0x00) & 0xFD); /* synchronous reset*/
- for(i = 0; i < sizeof(v->general); i++)
- genout(i, v->general[i]);
-
for(i = 0; i < sizeof(v->sequencer); i++)
if(i == 1)
srout(i, v->sequencer[i]|0x20);
@@ 490,3 497,99 @@ setmode(VGAmode *v)
/* turn screen on */
srout(1, v->sequencer[1]);
}
+
+uchar
+grin(ushort i)
+{
+ EISAOUTB(GRX, i);
+ return EISAINB(GR);
+}
+
+uchar
+arin(ushort i)
+{
+ uchar junk;
+ junk = EISAINB(0x3DA);
+ USED(junk);
+ EISAOUTB(ARW, i | 0x20);
+ return EISAINB(ARR);
+}
+
+uchar
+crin(ushort i) {
+ EISAOUTB(CRX, i);
+ return EISAINB(CR);
+}
+
+void
+getvmode(VGAmode *v)
+{
+ int i;
+
+ v->general[0] = EISAINB(EMISCR); /* misc output */
+ v->general[1] = EISAINB(EFCR); /* feature control */
+ for(i = 0; i < sizeof(v->sequencer); i++)
+ v->sequencer[i] = srin(i);
+ for(i = 0; i < sizeof(v->crt); i++)
+ v->crt[i] = crin(i);
+ for(i = 0; i < sizeof(v->graphics); i++)
+ v->graphics[i] = grin(i);
+ for(i = 0; i < sizeof(v->attribute); i++)
+ v->attribute[i] = arin(i);
+
+ v->tseng.viden = EISAINB(0x3c3);
+ v->tseng.sr6 = srin(6);
+ v->tseng.sr7 = srin(7);
+ v->tseng.ar16 = arin(0x16);
+ v->tseng.ar17 = arin(0x17);
+ v->tseng.crt31= crin(0x31);
+ v->tseng.crt32= crin(0x32);
+ v->tseng.crt33= crin(0x33);
+ v->tseng.crt34= crin(0x34);
+ v->tseng.crt35= crin(0x35);
+ v->tseng.crt36= crin(0x36);
+ v->tseng.crt37= crin(0x37);
+}
+
+void
+writeregisters(VGAmode *v)
+{
+ int i;
+
+ print("\t/* general */\n\t");
+ for (i=0; i<sizeof(v->general); i++)
+ print("0x%.2x, ", v->general[i]);
+ print("\n\t/* sequence */\n\t");
+ for (i=0; i<sizeof(v->sequencer); i++) {
+ if (i>0 && i%8 == 0)
+ print("\n\t");
+ print("0x%.2x, ", v->sequencer[i]);
+ }
+ print("\n\t/* crt */\n\t");
+ for (i=0; i<sizeof(v->crt); i++) {
+ if (i>0 && i%8 == 0)
+ print("\n\t");
+ print("0x%.2x, ", v->crt[i]);
+ }
+ print("\n\t/* graphics */\n\t");
+ for (i=0; i<sizeof(v->graphics); i++) {
+ if (i>0 && i%8 == 0)
+ print("\n\t");
+ print("0x%.2x, ", v->graphics[i]);
+ }
+ print("\n\t/* attribute */\n\t");
+ for (i=0; i<sizeof(v->attribute); i++) {
+ if (i>0 && i%8 == 0)
+ print("\n\t");
+ print("0x%.2x, ", v->attribute[i]);
+ }
+ print("\n");
+ print("\t/* special */\n");
+
+ for (i=0; i<12; i++) {
+ if (i%8 == 0)
+ print("\n\t");
+ print("0x%.2x, ", ((uchar*)(&v->tseng))[i]);
+ }
+ print("\n");
+}
M carrera/trap.c => carrera/trap.c +8 -1
@@ 309,7 309,14 @@ intr(Ureg *ur)
}
cause &= ~INTR3;
}
-
+ if(cause & INTR2) {
+ iprint("R4030 Interrupt\n");
+ iprint(" ISR #%lux\n", IO(ulong, R4030Isr));
+ iprint(" ET #%lux\n", IO(ulong, R4030Et));
+ iprint(" RFA #%lux\n", IO(ulong, R4030Rfa));
+ iprint(" MFA #%lux\n", IO(ulong, R4030Mfa));
+ cause &= ~INTR2;
+ }
if(cause & INTR4) {
devint = IO(uchar, I386ack);
iprint("i386ack=#%lux\n", devint);
M port/devproc.c => port/devproc.c +4 -3
@@ 296,19 296,19 @@ procread(Chan *c, void *va, long n, ulong offset)
if(offset+n > (ulong)end)
n = (ulong)end - offset;
memmove(a, (char*)offset, n);
- break;
+ return n;
}
if(offset >= conf.base0 && offset < conf.npage0){
if(offset+n > conf.npage0)
n = conf.npage0 - offset;
memmove(a, (char*)offset, n);
- break;
+ return n;
}
if(offset >= conf.base1 && offset < conf.npage1){
if(offset+n > conf.npage1)
n = conf.npage1 - offset;
memmove(a, (char*)offset, n);
- break;
+ return n;
}
error(Ebadarg);
@@ 349,6 349,7 @@ procread(Chan *c, void *va, long n, ulong offset)
memset(&kur, 0, sizeof(Ureg));
kur.pc = p->sched.pc;
kur.sp = p->sched.sp;
+ kur.r31 = (ulong)sched;
rptr = (uchar*)&kur;
rsize = sizeof(Ureg);
goto regread;
M port/qio.c => port/qio.c +7 -0
@@ 70,6 70,7 @@ struct Queue
int len; /* bytes in queue */
int limit; /* max bytes in queue */
int state;
+ int eof; /* number of eofs read by user */
void (*kick)(void*); /* restart output */
void *arg; /* argument to kick */
@@ 409,6 410,7 @@ qopen(int limit, int msg, void (*kick)(void*), void *arg)
q->arg = arg;
q->state = msg ? Qmsg : 0;
q->state |= Qstarve;
+ q->eof = 0;
return q;
}
@@ 451,6 453,10 @@ qread(Queue *q, void *vp, int len)
if(q->state & Qclosed){
unlock(q);
splx(x);
+ poperror();
+ qunlock(&q->rlock);
+ if(++q->eof > 3)
+ error(Ehungup);
return 0;
}
@@ 632,6 638,7 @@ qreopen(Queue *q)
{
q->state &= ~Qclosed;
q->state |= Qstarve;
+ q->eof = 0;
}
/*