~kris/9p

9hist

3817327b56df918b67bc300de71737c34cda4f8d — David du Colombier 33 years ago 83744fa
Plan 9 from Bell Labs 1993-09-08
8 files changed, 159 insertions(+), 26 deletions(-)

M carrera/io.h
M carrera/kbd.c
M carrera/main.c
M carrera/mem.h
M carrera/screen.c
M carrera/trap.c
M port/devproc.c
M port/qio.c
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;
}

/*