From 25bfe49a1f26422b2692d6576955bc8496046e84 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 4 Jun 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-06-04 --- port/devnonet.c | 4 +- port/devscc.c | 19 ++-- port/devwren.c | 2 + port/portfns.h | 6 ++ port/queue.c | 2 + ss/dat.h | 41 +++++++++ ss/fns.h | 13 ++- ss/io.h | 20 +++- ss/main.c | 20 ++++ ss/screen.c | 237 ++++-------------------------------------------- ss/trap.c | 2 +- 11 files changed, 128 insertions(+), 238 deletions(-) diff --git a/port/devnonet.c b/port/devnonet.c index cbecbe7470c745711b1ec092e403ed9eb4297277..7269dfa9dc1942db95d0277fa05ad1d842332c8e 100644 --- a/port/devnonet.c +++ b/port/devnonet.c @@ -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); } diff --git a/port/devscc.c b/port/devscc.c index 2750857a2017431f6c2840705e8f042061e580ae..fd21ba8893cd8a0f291c69d187409aae3a745564 100644 --- a/port/devscc.c +++ b/port/devscc.c @@ -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)); @@ -331,11 +333,6 @@ sccintr(void) void sccdevice(SCC *sp) { - /* - * turn on both ports - */ - sccsetup(); - /* * set up i/o routines */ diff --git a/port/devwren.c b/port/devwren.c index bbfe980d92867eae21a13627c91762e2bd806a7c..b0937a0f9c91c30fa3577576362fd7fd82cf9ccb 100644 --- a/port/devwren.c +++ b/port/devwren.c @@ -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"); diff --git a/port/portfns.h b/port/portfns.h index 2efd7e252c3bdf90bb33cd09e15c25796d7db9c4..f020ff7c548b7761980375460c996474d411a116 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -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); diff --git a/port/queue.c b/port/queue.c index 8e1119eb34edf5ec42505a59c53a2e7ced745d95..ae5c5c254aa73e0c6b95aee2ab3ef4cdfe4bc7bd 100644 --- a/port/queue.c +++ b/port/queue.c @@ -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 diff --git a/ss/dat.h b/ss/dat.h index 418b323dbcb9bb85865e969a0908458c47c27b48..752ff971cd7dd916c533218db5c1482ceec71533 100644 --- a/ss/dat.h +++ b/ss/dat.h @@ -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; @@ -106,6 +108,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 */ @@ -205,3 +239,10 @@ extern register Mach *m; /* R6 */ extern register User *u; /* R5 */ extern uchar *intrreg; + +struct +{ + Lock; + short machs; + short exiting; +}active; diff --git a/ss/fns.h b/ss/fns.h index b42c24b2fab64b50f3bd3519b2990b72c51b3718..0da0f09e650f610a6f3369d6bb2d6a6d1a6de452 100644 --- a/ss/fns.h +++ b/ss/fns.h @@ -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); diff --git a/ss/io.h b/ss/io.h index 584469b486afe08b3967cc94d645c60eaffb1d2a..5f7abd2d27f9e74e15f54645e54896311e9cfe46 100644 --- a/ss/io.h +++ b/ss/io.h @@ -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 diff --git a/ss/main.c b/ss/main.c index a27589c9c1f9b98becf773c1f72d4ca3d4f32191..b0e682241e8aee8989f7a6cd7925c5d2b26b9280 100644 --- a/ss/main.c +++ b/ss/main.c @@ -25,10 +25,12 @@ main(void) machinit(); confinit(); mmuinit(); + screeninit(); printinit(); print("sparc plan 9\n"); trapinit(); kmapinit(); + ioinit(); cacheinit(); intrinit(); procinit0(); @@ -74,6 +76,18 @@ machinit(void) m->fpstate = FPinit; } +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) { @@ -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(); +} diff --git a/ss/screen.c b/ss/screen.c index 163329f2b4cc064b95cfbd3a401a8f6579510a21..5ed294d8eff6e9d74dd2b6929341f1a79e6fa495 100644 --- a/ss/screen.c +++ b/ss/screen.c @@ -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) +{ +} diff --git a/ss/trap.c b/ss/trap.c index 7f8fb2a4a186c95f6af5e17e2706421e9f8f2517..2dc03e0563415e473d2f4aa05f4e8b8062309062 100644 --- a/ss/trap.c +++ b/ss/trap.c @@ -77,7 +77,7 @@ trap(Ureg *ur) clock(ur); break; case 12: /* keyboard and mouse */ - duartintr(); + sccintr(); break; case 5: /* lance */ lanceintr();