From 500ba80012a0d37e86eff1cabfc1b01bbb5b510a Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 30 Sep 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-09-30 --- carrera/main.c | 2 +- carrera/mem.h | 1 + carrera/screen.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++-- carrera/trap.c | 1 + port/segment.c | 2 +- 5 files changed, 81 insertions(+), 5 deletions(-) diff --git a/carrera/main.c b/carrera/main.c index c6b6e2d367f2108d921f92df3120660a579a3e9b..2ba7ed9bb8210720286277e60632e4891f14b60f 100644 --- a/carrera/main.c +++ b/carrera/main.c @@ -277,7 +277,7 @@ init0(void) if(!waserror()){ ksetenv("cputype", "mips"); - sprint(buf, "sgi %s 4D", conffile); + sprint(buf, "%s R4400PC", conffile); ksetenv("terminal", buf); ksetenv("sysname", sysname); poperror(); diff --git a/carrera/mem.h b/carrera/mem.h index cf9dfea53382b725d95515835456611e5c56ab07..53db6f31d5577a37e4913f9f43c446a5dad6d992 100644 --- a/carrera/mem.h +++ b/carrera/mem.h @@ -75,6 +75,7 @@ #define INTR7 0x00008000 #define ISC 0x00010000 #define SWC 0x00020000 +#define CU0 0x10000000 #define CU1 0x20000000 /* diff --git a/carrera/screen.c b/carrera/screen.c index 568c1f4716a81c63599958a139a28fdff6344207..5101ad5e82a87cf4d49d1425c2940952c416bb0d 100644 --- a/carrera/screen.c +++ b/carrera/screen.c @@ -253,6 +253,7 @@ screenputc(char *buf) { int pos; + mbbpt(cursor); switch(buf[0]) { case '\n': if(cursor.y+h >= window.max.y) @@ -278,6 +279,7 @@ screenputc(char *buf) cursor = gsubfstring(&gscreen, cursor, &defont0, buf, S); } + mbbpt(Pt(cursor.x, cursor.y+h)); } void @@ -295,7 +297,6 @@ screenputs(char *s, int n) else lock(&screenlock); - mbbpt(cursor); while(n > 0) { i = chartorune(&r, s); if(i == 0){ @@ -313,8 +314,6 @@ screenputs(char *s, int n) mbb = window; isscroll = 0; } - else - mbbpt(Pt(cursor.x, cursor.y+h)); screenupdate(); unlock(&screenlock); @@ -549,3 +548,78 @@ screenupdate(void) sp += inc; } } + +/* + * graphics + */ +void +screenload(Rectangle r, uchar *data, long n) +{ + int y, ws, l, t, lpart, rpart, mx, m, mr; + uchar *q; + + if(!rectclip(&r, gscreen.r)) + return; + lock(&screenlock); + ws = 8>>gscreen.ldepth; /* pixels per byte */ + /* set l to number of bytes of data per scan line */ + if(r.min.x >= 0) + l = (r.max.x+ws-1)/ws - r.min.x/ws; + else{ /* make positive before divide */ + t = (-r.min.x)+ws-1; + t = (t/ws)*ws; + l = (t+r.max.x+ws-1)/ws; + } + if(n != l*Dy(r)){ + unlock(&screenlock); + error("bad tile size"); + } + q = gbaddr(&gscreen, r.min); + mx = 7>>gscreen.ldepth; + lpart = (r.min.x & mx) << gscreen.ldepth; + rpart = (r.max.x & mx) << gscreen.ldepth; + m = 0xFF >> lpart; + mr = 0xFF ^ (0xFF >> rpart); + /* may need to do bit insertion on edges */ + if(l == 1){ /* all in one byte */ + if(rpart) + m ^= 0xFF >> rpart; + for(y=r.min.y; y 1) + memmove(q+1, data+1, l-1); + q += gscreen.width*sizeof(ulong); + data += l; + } + }else if(lpart == 0){ + for(y=r.min.y; y 1) + memmove(q, data, l-1); + q[l-1] ^= (data[l-1]^q[l-1]) & mr; + q += gscreen.width*sizeof(ulong); + data += l; + } + }else for(y=r.min.y; y 2) + memmove(q+1, data+1, l-2); + q[l-1] ^= (data[l-1]^q[l-1]) & mr; + q += gscreen.width*sizeof(ulong); + data += l; + } + mbbrect(r); + screenupdate(); + unlock(&screenlock); +} diff --git a/carrera/trap.c b/carrera/trap.c index 335a7f7e87e2282eac511d958bc50712141f7477..d6a2bcb23131c318b6df9a8738068d0d429267aa 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -613,6 +613,7 @@ forkchild(Proc *p, Ureg *ur) memmove(cur, ur, sizeof(Ureg)); cur->pc += 4; + cur->status |= CU0; /* Things from bottom of syscall we never got to execute */ p->psstate = 0; diff --git a/port/segment.c b/port/segment.c index fa922ba21e6fffcb5191c5b6bd7927b362a0d5b0..2de99627f7208b9f88ba61c32009a375854200f8 100644 --- a/port/segment.c +++ b/port/segment.c @@ -485,7 +485,7 @@ syssegflush(ulong *arg) len = arg[1]; while(len > 0) { - s = seg(u->p, addr, 1); + s = seg(up, addr, 1); if(s == 0) error(Ebadarg);