|
|
|
1991/0112/sys/src/9/ss/screen.c:20,30 –
1991/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,300 –
1991/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,596 –
1991/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,676 –
1991/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
| |
}
|