plan 9 kernel history: overview | file list | diff list

1991/0604/ss/screen.c (diff list | history)

1991/0112/sys/src/9/ss/screen.c:20,301991/0604/sys/src/9/ss/screen.c:20,26 (short | long | prev | next)
1990/1223    
	int	bwid; 
}out; 
 
int	duartacr; 
int	duartimr; 
                 
void	(*kprofp)(ulong); 
1990/1231    
void	kbdstate(int); 
1990/1223    
 
GBitmap	gscreen = 
{ 
1991/0112/sys/src/9/ss/screen.c:78,3001991/0604/sys/src/9/ss/screen.c:74,87
1990/1223    
	} 
} 
 
/* 
1990/1231    
 *  Driver for the Z8530. 
1990/1223    
 */ 
1990/1231    
enum 
{ 
	/* wr 0 */ 
	ResExtPend=	2<<3, 
	ResTxPend=	5<<3, 
	ResErr=		6<<3, 
1990/1223    
                 
1990/1231    
	/* wr 1 */ 
	TxIntEna=	1<<1, 
	RxIntDis=	0<<3, 
	RxIntFirstEna=	1<<3, 
	RxIntAllEna=	2<<3, 
1990/1223    
                 
1990/1231    
	/* wr 3 */ 
	RxEna=		1, 
	Rx5bits=	0<<6, 
	Rx7bits=	1<<6, 
	Rx6bits=	2<<6, 
	Rx8bits=	3<<6, 
1990/1223    
                 
1990/1231    
	/* wr 4 */ 
	SyncMode=	0<<2, 
	Rx1stop=	1<<2, 
	Rx1hstop=	2<<2, 
	Rx2stop=	3<<2, 
	X16=		1<<6, 
1990/1223    
                 
1990/1231    
	/* 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, 
1990/1223    
                 
1990/1231    
	/* wr 9 */ 
	IntEna=		1<<3, 
	ResetB=		1<<6, 
	ResetA=		2<<6, 
	HardReset=	3<<6, 
1990/1223    
                 
1990/1231    
	/* wr 11 */ 
	TRxCOutBR=	2, 
	TxClockBR=	2<<3, 
	RxClockBR=	2<<5, 
	TRxCOI=		1<<2, 
1990/1223    
                 
1990/1231    
	/* wr 14 */ 
	BREna=		1, 
	BRSource=	2, 
1990/1223    
                 
1990/1231    
	/* rr 0 */ 
	RxReady=	1, 
	TxReady=	1<<2, 
	RxDCD=		1<<3, 
	RxCTS=		1<<5, 
	RxBreak=	1<<7, 
1990/1223    
                 
1990/1231    
	/* 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 
1990/1223    
{ 
1990/1231    
	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 
1990/1223    
{ 
1990/1231    
	QLock; 
	ushort	sticky[16];	/* sticky write register values */ 
	uchar	*ptr;		/* command/pointer register in Z8530 */ 
	uchar	*data;		/* data register in Z8530 */ 
}; 
Duart	duart[2]; 
1990/1223    
                 
1990/1231    
#define PRINTING	0x4 
#define MASK		0x1 
1990/1223    
                 
1990/1231    
/* 
 *  Access registers using the pointer in register 0. 
 */ 
1990/1223    
void 
1990/1231    
duartwrreg(Duart *dp, int addr, int value) 
1991/0604    
screenputs(char *s, int n) 
1990/1223    
{ 
1990/1231    
	*dp->ptr = addr; 
	*dp->ptr = dp->sticky[addr] | value; 
1991/0604    
	while(n-- > 0) 
		screenputc(*s++); 
1990/1223    
} 
 
1990/1231    
ushort 
duartrdreg(Duart *dp, int addr) 
1990/1223    
{ 
1990/1231    
	*dp->ptr = addr; 
	return *dp->ptr; 
1990/1223    
} 
                 
1990/1231    
/* 
 *  set the baud rate by calculating and setting the baudrate 
 *  generator constant.  This will work with fairly non-standard 
 *  baud rates. 
 */ 
1990/1223    
void 
1990/1231    
duartsetbaud(Duart *dp, int rate) 
1990/1223    
{ 
1990/1231    
	int brconst; 
1990/1223    
                 
1990/1231    
	brconst = 10000000/(16*2*rate) - 2; 
	duartwrreg(dp, 12, brconst & 0xff); 
	duartwrreg(dp, 13, (brconst>>8) & 0xff); 
1990/1223    
} 
                 
1990/1231    
/* 
 * Initialize just keyboard and mouse for now 
 */ 
1990/1223    
void 
1990/1231    
duartinit(void) 
1990/1223    
{ 
1990/1231    
	Duart *dp; 
	Z8530 *zp; 
	KMap *k; 
1990/1223    
                 
1990/1231    
	k = kmappa(KMDUART, PTEIO|PTENOCACHE); 
	zp = (Z8530*)k->va; 
1990/1223    
                 
1990/1231    
	/* 
	 *  get port addresses 
	 */ 
	duart[0].ptr = &zp->ptra; 
	duart[0].data = &zp->dataa; 
	duart[1].ptr = &zp->ptrb; 
	duart[1].data = &zp->datab; 
1990/1223    
                 
1990/1231    
	for(dp=duart; dp < &duart[2]; dp++){ 
		memset(dp->sticky, 0, sizeof(dp->sticky)); 
1990/1223    
                 
1990/1231    
		/* 
		 *  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); 
1990/1223    
} 
                 
void 
1990/1231    
duartintr(void) 
1990/1223    
{ 
1990/1231    
	char ch; 
	int cause; 
	Duart *dp; 
1990/1223    
                 
1990/1231    
	cause = duartrdreg(&duart[0], 3); 
1991/0110    
                 
1990/1223    
	/* 
1990/1231    
	 * Keyboard 
1990/1223    
	 */ 
1990/1231    
	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); 
1990/1223    
	/* 
1990/1231    
	 * Mouse 
1990/1223    
	 */ 
1990/1231    
	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); 
1991/0110    
	cause = duartrdreg(&duart[0], 3); 
1990/1231    
} 
                 
/* 
1991/0112    
 * Map is indexed by keyboard char, output is ASCII. 
 * Gnotisms: Return sends newline and Line Feed sends carriage return. 
 * Delete and Backspace both send backspace. 
1991/0112/sys/src/9/ss/screen.c:589,5961991/0604/sys/src/9/ss/screen.c:376,383
1991/0112    
	return 0; 
} 
 
1990/1231    
void 
kbdstate(int c) 
1991/0604    
int 
kbdstate(IOQ *q, int c) 
1990/1231    
{ 
	static shift = 0x00; 
	static caps = 0; 
1991/0112/sys/src/9/ss/screen.c:664,6761991/0604/sys/src/9/ss/screen.c:451,473
1991/0112    
			k2 = tc; 
			tc = latin1(k1, k2); 
			if(c == 0){ 
				kbdchar(k1); 
1991/0604    
				kbdputc(&kbdq, k1); 
1991/0112    
				tc = k2; 
			} 
			/* fall through */ 
		default: 
			kbdstate = 0; 
			kbdchar(tc); 
1991/0604    
			kbdputc(&kbdq, tc); 
1991/0112    
		} 
	} 
1991/0604    
} 
 
void 
buzz(int freq, int dur) 
{ 
} 
 
void 
lights(int mask) 
{ 
1990/1223    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)