From f69b4516f8c94eae71145f83586912e18d909ba9 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 4 Jun 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-06-04 --- gnot/devduart.c | 1 - gnot/io.h | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ gnot/screen.c | 3 ++- pc/devvga.c | 28 +++++++++++++++++++------- pc/fns.h | 1 + pc/vga.c | 6 +++--- pc/vga.h | 3 ++- port/devbit.c | 37 ++++++++++++++++++++++++++++++----- port/devlance.c | 19 +++++++++--------- port/proc.c | 2 +- ss/screen.c | 1 + 11 files changed, 124 insertions(+), 29 deletions(-) diff --git a/gnot/devduart.c b/gnot/devduart.c index e71288ce392f0cd5267277c76ce31cbf14132ef5..1820e1a36787c27f0f090fc6a4bbd27d9c0f1f62 100644 --- a/gnot/devduart.c +++ b/gnot/devduart.c @@ -97,7 +97,6 @@ struct Duartport /* stream interface */ Queue *wq; /* write queue */ Rendez r; /* kproc waiting for input */ - Alarm *a; /* alarm for waking the kernel process */ int kstarted; /* kproc started */ }; Duartport duartport[1]; diff --git a/gnot/io.h b/gnot/io.h index b7d26941b491ebc66b1ce68ca44d3d87760456f5..32b70726035463cfa301528d789f937d9b65f3bc 100644 --- a/gnot/io.h +++ b/gnot/io.h @@ -4,3 +4,55 @@ typedef struct Duart Duart; #define DISPLAYRAM 0x02000000 #define DUARTREG ((Duart*)0x40100000) #define PORT ((uchar *)0x40300000) + +/* + * Balu + */ +typedef struct Balu Balu; + +struct Balu{ + ulong src[4]; + ulong dst[4]; + ulong res[4]; + ulong cr0; + ulong cr1; +}; + +#define BALU ((Balu *) 0xc0000000) +#define OR(x,n) (ulong *) (((ulong) (x)) | n) +#define SOR(x) (OR(x,0x30000000)) +#define DOR(x) (OR(x,0x20000000)) + +/* goo for cr0 manipulations */ +#define OPLENMA 0x0000ffff /* 15 bits only needed */ +#define OPLENSH 0 +#define OPCNTMA 0xffff0000 /* 16 bit signed */ +#define OPCNTSH 16 + +/* goo for cr1 manipulations */ +#define ALUOPMA 0x0000001f /* 5bits */ +#define ALUOPSH 0 +#define PIXELMA 0x00000060 /* 2bits */ +#define PIXELSH 5 +#define SHMAGMA 0x00000f80 /* 5bits */ +#define SHMAGSH 7 +#define ALIGNMA 0x00003000 /* 2bits */ +#define ALIGNSH 12 +#define RLSCANMA 0x00004000 /* 1bit */ +#define RLSCANSH 14 +#define QOPMA 0x00008000 /* 1bit */ +#define QOPSH 15 +#define RMASKMA 0x001f0000 /* 5bits */ +#define RMASKSH 16 +#define LMASKMA 0x03e00000 /* 5bits */ +#define LMASKSH 21 + +enum +{ + SUB = 0x10, /* balu arithmetic codes */ + SSUB = 0x11, + ADD = 0x12, + SADD = 0x13, + MIN = 0x14, + MAX = 0x15 +}; diff --git a/gnot/screen.c b/gnot/screen.c index 0915429f61a36729e6cd430943993b5b8170db73..cbb5fb0b465433f0ae9a880f86441b5bd06ce086 100644 --- a/gnot/screen.c +++ b/gnot/screen.c @@ -29,7 +29,8 @@ GBitmap gscreen = 0, 64, 0, - 0, 0, 1024, 1024, + { 0, 0, 1024, 1024, }, + { 0, 0, 1024, 1024, }, 0 }; diff --git a/pc/devvga.c b/pc/devvga.c index 77ae0ef6853ffcaa56fda31f03a9c0b35ff60539..907a128b64f336cf7d14a54b7ddb140dbc678cc9 100644 --- a/pc/devvga.c +++ b/pc/devvga.c @@ -29,7 +29,8 @@ enum { Qvgasize= 2, Qvgatype= 3, Qvgaport= 4, - Nvga= 4, + Qvgamem= 5, + Nvga= 5, }; Dirtab vgadir[]={ @@ -37,6 +38,7 @@ Dirtab vgadir[]={ "vgatype", {Qvgatype}, 0, 0666, "vgasize", {Qvgasize}, 0, 0666, "vgaport", {Qvgaport}, 0, 0666, + "vgamem", {Qvgamem}, 0, 0666, }; /* a routine from ../port/devcons.c */ @@ -97,9 +99,9 @@ vgaopen(Chan *c, int omode) case Qvgatype: case Qvgasize: case Qvgaport: + case Qvgamem: break; } - return devopen(c, omode, vgadir, Nvga, devgen); } @@ -119,6 +121,7 @@ vgaread(Chan *c, void *buf, long n, ulong offset) { char obuf[60]; int port, i; + uchar *mem; uchar *cp = buf; void *outfunc(int, int); @@ -136,9 +139,15 @@ vgaread(Chan *c, void *buf, long n, ulong offset) case Qvgaport: if (offset + n >= 0x8000) error(Ebadarg); - for (port=offset; port 0x10000) + return 0; + if (offset + n > 0x10000) + n = 0x10000 - offset; + memmove(cp, (void *)(SCREENMEM+offset), n); return n; } } @@ -163,10 +172,10 @@ vgawrite(Chan *c, void *buf, long n, ulong offset) case Qvgasize: if(offset != 0) error(Ebadarg); - if(n >= sizeof cbuf) - n = sizeof cbuf - 1; + if(n >= sizeof(cbuf)) + n = sizeof(cbuf) - 1; memmove(cbuf, buf, n); - cbuf[n-1] = 0; + cbuf[n] = 0; cp = cbuf; maxx = strtoul(cp, &cp, 0); maxy = strtoul(cp, &cp, 0); @@ -183,6 +192,11 @@ vgawrite(Chan *c, void *buf, long n, ulong offset) outb(port, *cp++); } return n; + case Qvgamem: + if (offset + n > 0x10000) + error(Ebadarg); + memmove((void *)(SCREENMEM+offset), buf, n); + return n; } } diff --git a/pc/fns.h b/pc/fns.h index e975ede15494fc8b6fee781a7064224cfb894378..89ecb906109fbe0201f781a83cf9f1454e287b02 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -58,6 +58,7 @@ void screenputs(char*, int); int serial(int); void setvec(int, void (*)(Ureg*)); void systrap(void); +void toscreen(void*); void touser(void*); void trapinit(void); int tas(void*); diff --git a/pc/vga.c b/pc/vga.c index c9d35d2b322b7d82d93828bc7c8eb3389657e9c9..4a88f8b88015823349e89bc9a3c130283a1f9223 100644 --- a/pc/vga.c +++ b/pc/vga.c @@ -27,15 +27,14 @@ struct{ #define MAXX 640 #define MAXY 480 -#define SCREENMEM (0xA0000 | KZERO) - GBitmap gscreen = { (ulong*)SCREENMEM, 0, 640/32, 0, - 0, 0, MAXX, MAXY, + { 0, 0, MAXX, MAXY, }, + { 0, 0, MAXX, MAXY, }, 0 }; @@ -229,6 +228,7 @@ setscreen(int maxx, int maxy, int bpp) { gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, flipD[S]); gscreen.width = maxx/32; gscreen.r.max = Pt(maxx, maxy); + gscreen.clipr.max = gscreen.r.max; gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, flipD[0]); out.pos.x = MINX; out.pos.y = 0; diff --git a/pc/vga.h b/pc/vga.h index 3d1e5e288e69273807fe8e791bd1a15c0b503c36..80f5605d808686372d8760197fafb7f307888307 100644 --- a/pc/vga.h +++ b/pc/vga.h @@ -17,6 +17,7 @@ enum ARR= 0x3C1, /* attribute registers (reading) */ }; -extern void setscreen(int, int, int); +#define SCREENMEM (0xA0000 | KZERO) +extern void setscreen(int, int, int); extern struct GBitmap gscreen; diff --git a/port/devbit.c b/port/devbit.c index 5f544e75b0545a91c97621ccacc1a5c981e1706a..7a97a1cc81bbe6f73d55acd1b305d0cba8cc1e17 100644 --- a/port/devbit.c +++ b/port/devbit.c @@ -97,6 +97,7 @@ GBitmap set = 0, 1, 0, + {0, 0, 16, 16}, {0, 0, 16, 16} }; @@ -107,6 +108,7 @@ GBitmap clr = 0, 1, 0, + {0, 0, 16, 16}, {0, 0, 16, 16} }; @@ -117,6 +119,7 @@ GBitmap cursorback = 0, 1, 0, + {0, 0, 16, 16}, {0, 0, 16, 16} }; @@ -193,6 +196,7 @@ bitinit(void) Chan* bitattach(char *spec) { + bit.map[0] = gscreen; /* bitmap 0 is screen */ return devattach('b', spec); } @@ -229,6 +233,7 @@ bitopen(Chan *c, int omode) unlock(&bit); error(Einuse); } + bit.map[0].clipr = gscreen.clipr; bit.lastid = -1; bit.lastfid = -1; bit.lastsubfid = -1; @@ -913,6 +918,31 @@ bitwrite(Chan *c, void *va, long n, ulong offset) p += 14; break; + case 'q': + /* + * clip rectangle + * 'q' 1 + * id 2 + * rect 16 + */ + if(m < 19) + error(Ebadblt); + v = GSHORT(p+1); + dst = &bit.map[v]; + if(v<0 || v>=conf.nbitmap || dst->ldepth<0) + error(Ebadbitmap); + rect.min.x = GLONG(p+3); + rect.min.y = GLONG(p+7); + rect.max.x = GLONG(p+11); + rect.max.y = GLONG(p+15); + if(rectclip(&rect, dst->r)) + dst->clipr = rect; + else + dst->clipr = dst->r; + m -= 19; + p += 19; + break; + case 'r': /* * read @@ -987,7 +1017,7 @@ bitwrite(Chan *c, void *va, long n, ulong offset) * texture * 't' 1 * dst id 2 - * Rectangle 16 + * rect 16 * src id 2 * fcode 2 */ @@ -1275,6 +1305,7 @@ bitalloc(Rectangle rect, int ld) bp->width = l; bp->ldepth = ld; bp->r = rect; + bp->clipr = rect; bp->cache = 0; return bp; } @@ -1352,10 +1383,6 @@ bitloadchar(GFont *f, int ci, GSubfont *subf, int si) rect.max.x = (fi+1)->x; rect.max.y = subf->height; gbitblt(f->b, Pt(c->x, f->ascent-subf->ascent), subf->bits, rect, S); -/* -gbitblt(&gscreen, Pt(0,0), f->b, f->b->r, S); -gbitblt(&gscreen, Pt(0,30), f->b, Rect(c->x, 0, c->x+f->width,f->height), S); -*/ } QLock bitlock; diff --git a/port/devlance.c b/port/devlance.c index 4cfd692fadb5c509c7624b1ac190e72cec66146d..3aa60d745a0517b3502f7e4e6bd9db33c79e4e44 100644 --- a/port/devlance.c +++ b/port/devlance.c @@ -310,16 +310,7 @@ lanceoput(Queue *q, Block *bp ) } p = (Etherpkt *)bp->rptr; memmove(p->s, l.ea, sizeof(l.ea)); - if(memcmp(l.ea, p->d, sizeof(l.ea)) == 0){ - len = blen(bp); - bp = expandb(bp, len >= ETHERMINTU ? len : ETHERMINTU); - if(bp){ - putq(&l.self, bp); - wakeup(&l.rr); - } - return; - } - if(memcmp(l.bcast, p->d, sizeof(l.bcast)) == 0 || l.prom || l.all){ + if(*p->d == 0xff || l.prom || l.all){ len = blen(bp); nbp = copyb(bp, len); nbp = expandb(nbp, len >= ETHERMINTU ? len : ETHERMINTU); @@ -328,6 +319,14 @@ lanceoput(Queue *q, Block *bp ) putq(&l.self, nbp); wakeup(&l.rr); } + } else if(*p->d == *l.ea && memcmp(l.ea, p->d, sizeof(l.ea)) == 0){ + len = blen(bp); + bp = expandb(bp, len >= ETHERMINTU ? len : ETHERMINTU); + if(bp){ + putq(&l.self, bp); + wakeup(&l.rr); + } + return; } /* diff --git a/port/proc.c b/port/proc.c index 7b82a7d3cc2cebfc09c7ffea95a4984bb1bd10ce..4847a0a1cc7d372158e34747b71354e519e0e1ec 100644 --- a/port/proc.c +++ b/port/proc.c @@ -763,7 +763,7 @@ procctl(Proc *p) #include "errstr.h" void -error(char err[]) +error(char *err) { strncpy(u->error, err, ERRLEN); nexterror(); diff --git a/ss/screen.c b/ss/screen.c index d941c9e8f836e3f37467d4c0c186c9f163a8fb4e..3ba6aacd87ca3b226262afacd8bbf2b5f1df1c8f 100644 --- a/ss/screen.c +++ b/ss/screen.c @@ -29,6 +29,7 @@ GBitmap gscreen = 1152/32, 0, {0, 0, 1152, 900}, + {0, 0, 1152, 900}, 0 };