~kris/9p

9hist

25bfe49a1f26422b2692d6576955bc8496046e84 — David du Colombier 35 years ago abda8f6
Plan 9 from Bell Labs 1991-06-04
11 files changed, 128 insertions(+), 238 deletions(-)

M port/devnonet.c
M port/devscc.c
M port/devwren.c
M port/portfns.h
M port/queue.c
M ss/dat.h
M ss/fns.h
M ss/io.h
M ss/main.c
M ss/screen.c
M ss/trap.c
M port/devnonet.c => port/devnonet.c +2 -2
@@ 1457,10 1457,10 @@ loop:
			 */
			if(cp->first!=cp->next && NOW>=cp->out[cp->first].time){
				mp = &(cp->out[cp->first]);
				if(cp->rexmit++ > 15){
/*				if(cp->rexmit++ > 15){
					norack(cp, mp->mid);
					noreset(cp);
				} else
				} else /**/
					nosend(cp, mp);
			}


M port/devscc.c => port/devscc.c +8 -11
@@ 197,26 197,28 @@ sccbreak(SCC *sp, int ms)
}

/*
 *  9600 baud, 1 stop bit, 8 bit chars, no interrupts,
 *  default is 9600 baud, 1 stop bit, 8 bit chars, no interrupts,
 *  transmit and receive enabled, interrupts disabled.
 */
void
sccsetup(void)
sccsetup(void *addr)
{
	SCCdev *dev;
	SCC *sp;
	static int already;

	if(already)
		return;
	already = 1;
	dev = addr;

	/*
	 *  get port addresses
	 */
	scc[0].ptr = &SCCADDR->ptra;
	scc[0].data = &SCCADDR->dataa;
	scc[1].ptr = &SCCADDR->ptrb;
	scc[1].data = &SCCADDR->datab;
	scc[0].ptr = &dev->ptra;
	scc[0].data = &dev->dataa;
	scc[1].ptr = &dev->ptrb;
	scc[1].data = &dev->datab;

	for(sp = scc; sp < &scc[2]; sp++){
		memset(sp->sticky, 0, sizeof(sp->sticky));


@@ 332,11 334,6 @@ void
sccdevice(SCC *sp)
{
	/*
	 *  turn on both ports
	 */
	sccsetup();

	/*
	 *  set up i/o routines
	 */
	if(sp->oq){

M port/devwren.c => port/devwren.c +2 -0
@@ 235,6 235,7 @@ wrenread(Chan *c, char *a, long n, ulong offset)
		n = cmd->data.ptr - cmd->data.base;
		memmove(a, cmd->data.base, n);
		qunlock(cmd);
		poperror();
		break;
	case Qstruct:
		if (n < 2*sizeof(ulong))


@@ 286,6 287,7 @@ wrenwrite(Chan *c, char *a, long n, ulong offset)
		scsiexec(cmd, 0);
		n = cmd->data.ptr - cmd->data.base;
		qunlock(cmd);
		poperror();
		break;
	default:
		panic("wrenwrite");

M port/portfns.h => port/portfns.h +6 -0
@@ 8,6 8,7 @@ int	anyready(void);
void	append(List**, List*);
int	blen(Block *);
int	bround(Block *, int);
void	buzz(int, int);
void	cancel(Alarm*);
int	canlock(Lock*);
int	canqlock(QLock*);


@@ 74,6 75,7 @@ void	insert(List**, List*, List*);
void	invalidateu(void);
void	isdir(Chan*);
void	kproc(char*, void(*)(void*), void*);
void	lights(int);
void	lock(Lock*);
void	lockinit(void);
Orig*	lookorig(ulong, ulong, int, Chan*);


@@ 126,6 128,10 @@ void	resched(char*);
int	return0(void*);
Proc*	runproc(void);
void	savefpregs(FPsave*);
void	sccintr(void);
void	sccputs(IOQ*, char*, int);
void	sccsetup(void*);
void	sccspecial(int, IOQ*, IOQ*, int);
void	schedinit(void);
void	sched(void);
long	seconds(void);

M port/queue.c => port/queue.c +2 -0
@@ 9,9 9,11 @@
void
initq(IOQ *q)
{
	lock(q);
	q->in = q->out = q->buf;
	q->puts = puts;
	q->putc = putc;
	unlock(q);
}

int

M ss/dat.h => ss/dat.h +41 -0
@@ 1,6 1,8 @@
typedef struct Conf	Conf;
typedef struct FFrame	FFrame;
typedef struct FPsave	FPsave;
typedef struct IOQ	IOQ;
typedef struct KIOQ	KIOQ;
typedef struct KMap	KMap;
typedef struct Lance	Lance;
typedef struct Lancemem	Lancemem;


@@ 107,6 109,38 @@ struct PMMU
#include "../port/portdat.h"

/*
 *  character based IO (mouse, keyboard, console screen)
 */
#define NQ	4096
struct IOQ
{
	Lock;
	uchar	buf[NQ];
	uchar	*in;
	uchar	*out;
	int	state;
	Rendez	r;
	union{
		void	(*puts)(IOQ*, void*, int);	/* output */
		int	(*putc)(IOQ*, int);		/* input */
	};
	void	*ptr;
};
struct KIOQ
{
	QLock;
	IOQ;
	int	repeat;
	int	c;
	int	count;
};

extern IOQ	lineq;
extern IOQ	printq;
extern IOQ	mouseq;
extern KIOQ	kbdq;

/*
 *  machine dependent definitions not used by ../port/dat.h
 */
struct KMap


@@ 205,3 239,10 @@ extern register Mach	*m;		/* R6 */
extern register User	*u;		/* R5 */

extern	uchar	*intrreg;

struct
{
	Lock;
	short	machs;
	short	exiting;
}active;

M ss/fns.h => ss/fns.h +11 -2
@@ 1,6 1,8 @@
#include "../port/portfns.h"

void	cacheinit(void);
int	cangetc(void*);
int	canputc(void*);
void	clearfpintr(void);
#define	clearmmucache()
void	clockinit(void);


@@ 25,11 27,16 @@ void	fpregrestore(char*);
void	fpregsave(char*);
void	fprestore(FPsave*);
void	fpsave(FPsave*);
int	getc(IOQ*);
int	gets(IOQ*, void*, int);
int	getb2(ulong);
int	getrs232o(void);
int	getw2(ulong);
void	initq(IOQ*);
void	intrinit(void);
void	kbdchar(int);
void	ioinit(void);
int	kbdputc(IOQ*, int);
int	kbdstate(IOQ*, int);
void	kbdclock(void);
void	kbdrepeat(int);
KMap*	kmap(Page*);


@@ 42,12 49,14 @@ void	lancesetup(Lance*);
void	lancetoggle(void);
void	mmuinit(void);
void	mousebuttons(int);
void	mousechar(int);
int	mouseputc(IOQ*, int);
void	mouseclock(void);
void	printinit(void);
#define	procrestore(x,y)
#define	procsave(x,y)
#define	procsetup(x)	((p)->fpstate = FPinit)
int	putc(IOQ*, int);
void	puts(IOQ*, void*, int);
void	putb2(ulong, int);
void	putcontext(int);
void	putcxreg(int);

M ss/io.h => ss/io.h +18 -2
@@ 1,5 1,3 @@
typedef struct	Duart	Duart;

#define	DISPLAYRAM	0x1E800000
#define	EPROM		0xF6000000
#define	CLOCK		0xF3000000


@@ 8,3 6,21 @@ typedef struct	Duart	Duart;
#define	ETHER		0xF8C00000	/* RDP, RAP */
#define	EEPROM		0xF2000000
#define	INTRREG		0xF5000000	/* interrupt register, IO space */

typedef struct SCCdev	SCCdev;
struct SCCdev
{
	uchar	ptrb;
	uchar	dummy1;
	uchar	datab;
	uchar	dummy2;
	uchar	ptra;
	uchar	dummy3;
	uchar	dataa;
	uchar	dummy4;
};

/*
 *  crystal frequency for SCC
 */
#define SCCFREQ	10000000

M ss/main.c => ss/main.c +20 -0
@@ 25,10 25,12 @@ main(void)
	machinit();
	confinit();
	mmuinit();
	screeninit();
	printinit();
	print("sparc plan 9\n");
	trapinit();
	kmapinit();
	ioinit();
	cacheinit();
	intrinit();
	procinit0();


@@ 75,6 77,18 @@ machinit(void)
}

void
ioinit(void)
{
	KMap *k;

	k = kmappa(KMDUART, PTEIO|PTENOCACHE);
	sccsetup((void*)(k->va));
	sccspecial(0, 0, &kbdq, 2400);		/* scc port 0 is the keyboard */
	kbdq.putc = kbdstate;
	sccspecial(1, 0, &mouseq, 2400);	/* scc port 1 is the mouse */
}

void
init0(void)
{
	Chan *c;


@@ 343,3 357,9 @@ print("%d lance buffers\n", i);
	lp->ltp = lp->lrp+lp->nrrb;
	lp->tp = lp->rp+lp->nrrb;
}

void
firmware(void)
{
	reset();
}

M ss/screen.c => ss/screen.c +17 -220
@@ 20,11 20,7 @@ struct{
	int	bwid;
}out;

int	duartacr;
int	duartimr;

void	(*kprofp)(ulong);
void	kbdstate(int);

GBitmap	gscreen =
{


@@ 78,220 74,11 @@ screenputc(int c)
	}
}

/*
 *  Driver for the Z8530.
 */
enum
{
	/* wr 0 */
	ResExtPend=	2<<3,
	ResTxPend=	5<<3,
	ResErr=		6<<3,

	/* wr 1 */
	TxIntEna=	1<<1,
	RxIntDis=	0<<3,
	RxIntFirstEna=	1<<3,
	RxIntAllEna=	2<<3,

	/* wr 3 */
	RxEna=		1,
	Rx5bits=	0<<6,
	Rx7bits=	1<<6,
	Rx6bits=	2<<6,
	Rx8bits=	3<<6,

	/* wr 4 */
	SyncMode=	0<<2,
	Rx1stop=	1<<2,
	Rx1hstop=	2<<2,
	Rx2stop=	3<<2,
	X16=		1<<6,

	/* wr 5 */
	TxRTS=		1<<1,
	TxEna=		1<<3,
	TxBreak=	1<<4,
	TxDTR=		1<<7,
	Tx5bits=	0<<5,
	Tx7bits=	1<<5,
	Tx6bits=	2<<5,
	Tx8bits=	3<<5,

	/* wr 9 */
	IntEna=		1<<3,
	ResetB=		1<<6,
	ResetA=		2<<6,
	HardReset=	3<<6,

	/* wr 11 */
	TRxCOutBR=	2,
	TxClockBR=	2<<3,
	RxClockBR=	2<<5,
	TRxCOI=		1<<2,

	/* wr 14 */
	BREna=		1,
	BRSource=	2,

	/* rr 0 */
	RxReady=	1,
	TxReady=	1<<2,
	RxDCD=		1<<3,
	RxCTS=		1<<5,
	RxBreak=	1<<7,

	/* rr 3 */
	ExtPendB=	1,	
	TxPendB=	1<<1,
	RxPendB=	1<<2,
	ExtPendA=	1<<3,	
	TxPendA=	1<<4,
	RxPendA=	1<<5,
};

typedef struct Z8530	Z8530;
struct Z8530
{
	uchar	ptrb;
	uchar	dummy1;
	uchar	datab;
	uchar	dummy2;
	uchar	ptra;
	uchar	dummy3;
	uchar	dataa;
	uchar	dummy4;
};

#define NDELIM 5
typedef struct Duart	Duart;
struct Duart
{
	QLock;
	ushort	sticky[16];	/* sticky write register values */
	uchar	*ptr;		/* command/pointer register in Z8530 */
	uchar	*data;		/* data register in Z8530 */
};
Duart	duart[2];

#define PRINTING	0x4
#define MASK		0x1

/*
 *  Access registers using the pointer in register 0.
 */
void
duartwrreg(Duart *dp, int addr, int value)
{
	*dp->ptr = addr;
	*dp->ptr = dp->sticky[addr] | value;
}

ushort
duartrdreg(Duart *dp, int addr)
screenputs(char *s, int n)
{
	*dp->ptr = addr;
	return *dp->ptr;
}

/*
 *  set the baud rate by calculating and setting the baudrate
 *  generator constant.  This will work with fairly non-standard
 *  baud rates.
 */
void
duartsetbaud(Duart *dp, int rate)
{
	int brconst;

	brconst = 10000000/(16*2*rate) - 2;
	duartwrreg(dp, 12, brconst & 0xff);
	duartwrreg(dp, 13, (brconst>>8) & 0xff);
}

/*
 * Initialize just keyboard and mouse for now
 */
void
duartinit(void)
{
	Duart *dp;
	Z8530 *zp;
	KMap *k;

	k = kmappa(KMDUART, PTEIO|PTENOCACHE);
	zp = (Z8530*)k->va;

	/*
	 *  get port addresses
	 */
	duart[0].ptr = &zp->ptra;
	duart[0].data = &zp->dataa;
	duart[1].ptr = &zp->ptrb;
	duart[1].data = &zp->datab;

	for(dp=duart; dp < &duart[2]; dp++){
		memset(dp->sticky, 0, sizeof(dp->sticky));

		/*
		 *  enable I/O, 8 bits/character
		 */
		dp->sticky[3] = RxEna | Rx8bits;
		duartwrreg(dp, 3, 0);
		dp->sticky[5] = TxEna | Tx8bits;
		duartwrreg(dp, 5, 0);

		/*
	 	 *  turn on interrupts
		 */
		dp->sticky[1] |= TxIntEna | RxIntAllEna;
		duartwrreg(dp, 1, 0);
		dp->sticky[9] |= IntEna;
		duartwrreg(dp, 9, 0);
	}

	/*
	 *  turn on DTR and RTS
	 */
	dp = &duart[1];
	dp->sticky[5] |= TxRTS | TxDTR;
	duartwrreg(dp, 5, 0);
}

void
duartintr(void)
{
	char ch;
	int cause;
	Duart *dp;

	cause = duartrdreg(&duart[0], 3);

	/*
	 * Keyboard
	 */
	dp = &duart[0];
	if(cause & ExtPendA)
		duartwrreg(dp, 0, ResExtPend);
	if(cause & RxPendA){
		ch = *dp->data;
		kbdstate(ch);
	}
	if(cause & TxPendA)
		duartwrreg(dp, 0, ResTxPend);
	/*
	 * Mouse
	 */
	dp = &duart[1];
	if(cause & ExtPendB)
		duartwrreg(dp, 0, ResExtPend);
	if(cause & RxPendB){
		ch = *dp->data;
		mousechar(ch);
	}
	if(cause & TxPendB)
		duartwrreg(dp, 0, ResTxPend);
	cause = duartrdreg(&duart[0], 3);
	while(n-- > 0)
		screenputc(*s++);
}

/*


@@ 589,8 376,8 @@ latin1(int k1, int k2)
	return 0;
}

void
kbdstate(int c)
int
kbdstate(IOQ *q, int c)
{
	static shift = 0x00;
	static caps = 0;


@@ 664,13 451,23 @@ kbdstate(int c)
			k2 = tc;
			tc = latin1(k1, k2);
			if(c == 0){
				kbdchar(k1);
				kbdputc(&kbdq, k1);
				tc = k2;
			}
			/* fall through */
		default:
			kbdstate = 0;
			kbdchar(tc);
			kbdputc(&kbdq, tc);
		}
	}
}

void
buzz(int freq, int dur)
{
}

void
lights(int mask)
{
}

M ss/trap.c => ss/trap.c +1 -1
@@ 77,7 77,7 @@ trap(Ureg *ur)
			clock(ur);
			break;
		case 12:			/* keyboard and mouse */
			duartintr();
			sccintr();
			break;
		case 5:				/* lance */
			lanceintr();