M carrera/screen.c => carrera/screen.c +2 -0
@@ 559,6 559,7 @@ screenload(Rectangle r, uchar *data, long n)
unlock(&screenlock);
error("bad tile size");
}
+ cursoroff(1);
q = gbaddr(&gscreen, r.min);
mx = 7>>gscreen.ldepth;
lpart = (r.min.x & mx) << gscreen.ldepth;
@@ 605,6 606,7 @@ screenload(Rectangle r, uchar *data, long n)
data += l;
}
mbbrect(r);
+ cursoron(1);
screenupdate();
unlock(&screenlock);
}
M port/devlance.c => port/devlance.c +23 -0
@@ 430,6 430,28 @@ isoutbuf(void *x)
return l.wedged || (MPus(m->flags)&LANCEOWNER) == 0;
}
+static void
+etherloop(Etherpkt *p, long n)
+{
+ int s;
+ ushort t;
+ Netfile *f, **fp;
+
+ if(memcmp(p->d, p->s, sizeof(p->d)) && memcmp(p->d, l.bcast, sizeof(p->d)))
+ return;
+
+ s = splhi();
+ t = (p->type[0]<<8) | p->type[1];
+ for(fp = l.f; fp < &l.f[Ntypes]; fp++) {
+ f = *fp;
+ if(f == 0)
+ continue;
+ if(f->type == t || f->type < 0)
+ qproduce(f->in, p->d, n);
+ }
+ splx(s);
+}
+
long
lancewrite(Chan *c, void *buf, long n, ulong offset)
{
@@ 452,6 474,7 @@ lancewrite(Chan *c, void *buf, long n, ulong offset)
if(!isoutbuf(m) || l.wedged)
print("lance transmitter jammed\n");
else {
+ etherloop(buf, n);
p = &l.tp[l.tc];
memmove(p->d, buf, n);
if(n < 60) {
M port/devmouse.c => port/devmouse.c +17 -22
@@ 251,34 251,25 @@ mouseclose(Chan *c)
long
mouseread(Chan *c, void *va, long n, ulong offset)
{
- uchar *p;
+ char buf[4*12+1];
USED(offset);
if(c->qid.path & CHDIR)
return devdirread(c, va, n, mousedir, NMOUSE, devgen);
if(c->qid.path == Qmouse){
- /*
- * mouse:
- * 'm' 1
- * buttons 1
- * point 8
- * msec 4
- */
- if(n < 14)
- error(Eshort);
while(mousechanged(0) == 0)
sleep(&mouse.r, mousechanged, 0);
lock(&cursor);
- p = va;
- p[0] = 'm';
- p[1] = mouse.buttons;
- BPLONG(p+2, mouse.xy.x);
- BPLONG(p+6, mouse.xy.y);
- BPLONG(p+10, TK2MS(MACHP(0)->ticks));
+ sprint(buf, "%11d %11d %11d %11d",
+ mouse.xy.x, mouse.xy.y, mouse.buttons,
+ TK2MS(MACHP(0)->ticks));
mouse.lastcounter = mouse.counter;
unlock(&cursor);
- return 14;
+ if(n > 4*12)
+ n = 4*12;
+ memmove(va, buf, n);
+ return n;
}
return 0;
}
@@ 286,7 277,7 @@ mouseread(Chan *c, void *va, long n, ulong offset)
long
mousewrite(Chan *c, void *va, long n, ulong offset)
{
- uchar *p;
+ char *p;
Point pt;
char buf[64];
@@ 305,12 296,16 @@ mousewrite(Chan *c, void *va, long n, ulong offset)
return n;
case Qmouse:
- if(n != 9)
+ if(n > sizeof buf-1)
+ n = sizeof buf -1;
+ memmove(buf, va, n);
+ buf[n] = 0;
+ p = 0;
+ pt.x = strtoul(buf, &p, 0);
+ if(p == 0)
error(Eshort);
+ pt.y = strtoul(p, 0, 0);
qlock(&mouse);
- p = va;
- pt.x = BGLONG(p+1);
- pt.y = BGLONG(p+5);
if(ptinrect(pt, gscreen.r)){
mouse.xy = pt;
mouse.redraw = 1;
M port/page.c => port/page.c +1 -1
@@ 76,7 76,7 @@ retry:
color = getpgcolor(va);
hw = swapalloc.highwater;
for(;;) {
- if(palloc.freecol[color] > hw)
+ if(palloc.freecol[color] > hw/NCOLOR)
break;
if(up->kp && palloc.freecol[color] > 0)
break;
M port/swap.c => port/swap.c +4 -0
@@ 114,6 114,10 @@ loop:
if(p >= ep)
p = proctab(0);
+ /* don't swap out programs from devroot.c */
+ if(devchar[p->seg[SG_TEXT]->image->c->type] == '/')
+ continue;
+
if(p->state == Dead || p->kp)
continue;
M power/mem.h => power/mem.h +2 -1
@@ 114,7 114,8 @@
#define TLBROFF 8 /* offset of first randomly indexed entry */
#define NCOLOR 1
-#define getcolor(a) 0
+#define getpgcolor(a) 0
+
/*
* Address spaces
*/
M power/trap.c => power/trap.c +1 -0
@@ 416,6 416,7 @@ notify(Ureg *ur)
*(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */
up->svr1 = ur->r1; /* save away r1 */
ur->r1 = (ulong)up->ureg; /* arg 1 is ureg* */
+ *(ulong*)(sp+1*BY2WD) = (ulong)up->ureg;/* arg 1 0(FP) is ureg* (for Alef) */
*(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */
ur->usp = sp;
ur->pc = (ulong)up->notify;