~kris/9p

9hist

500ba80012a0d37e86eff1cabfc1b01bbb5b510a — David du Colombier 32 years ago 9774d97
Plan 9 from Bell Labs 1993-09-30
5 files changed, 81 insertions(+), 5 deletions(-)

M carrera/main.c
M carrera/mem.h
M carrera/screen.c
M carrera/trap.c
M port/segment.c
M carrera/main.c => carrera/main.c +1 -1
@@ 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();

M carrera/mem.h => carrera/mem.h +1 -0
@@ 75,6 75,7 @@
#define INTR7		0x00008000
#define ISC		0x00010000
#define SWC		0x00020000
#define CU0		0x10000000
#define CU1		0x20000000

/*

M carrera/screen.c => carrera/screen.c +77 -3
@@ 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<r.max.y; y++){
			*q ^= (*data^*q) & m;
			q += gscreen.width*sizeof(ulong);
			data++;
		}
	}else if(lpart==0 && rpart==0){	/* easy case */
		for(y=r.min.y; y<r.max.y; y++){
			memmove(q, data, l);
			q += gscreen.width*sizeof(ulong);
			data += l;
		}
	}else if(rpart==0){
		for(y=r.min.y; y<r.max.y; y++){
			*q ^= (*data^*q) & m;
			if(l > 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<r.max.y; y++){
			if(l > 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<r.max.y; y++){
			*q ^= (*data^*q) & m;
			if(l > 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);
}

M carrera/trap.c => carrera/trap.c +1 -0
@@ 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;

M port/segment.c => port/segment.c +1 -1
@@ 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);