code: 9ferno

Download patch

ref: e8c5c6689fe0924c2a285910fa2cf6af02302023
parent: e1fc0ec55d4e898d2decb8d8e61e5a6d5c8dc52a
author: joe9 <joe9mail@gmail.com>
date: Fri Jul 2 17:27:39 EDT 2021

fixed bug in byteaddr on negative x or y values

--- a/emu/port/devdraw.c
+++ b/emu/port/devdraw.c
@@ -27,8 +27,8 @@
  */
 #define	QSHIFT	4	/* location in qid of client # */
 
-#define	QID(q)		((((ulong)(q).path)&0x0000000F)>>0)
-#define	CLIENTPATH(q)	((((ulong)q)&0x7FFFFFF0)>>QSHIFT)
+#define	QID(q)		((((u32int)(q).path)&0x0000000F)>>0)
+#define	CLIENTPATH(q)	((((u32int)q)&0x7FFFFFF0)>>QSHIFT)
 #define	CLIENT(q)	CLIENTPATH((q).path)
 
 #define	NHASH		(1<<5)
@@ -45,21 +45,21 @@
 typedef struct Refx Refx;
 typedef struct DName DName;
 
-ulong blanktime = 30;	/* in minutes; a half hour */
+u32int blanktime = 30;	/* in minutes; a half hour */
 
 struct Draw
 {
 	QLock	q;
-	int		clientid;
-	int		nclient;
+	s32int		clientid;
+	s32int		nclient;
 	Client**	client;
-	int		nname;
+	s32int		nname;
 	DName*	name;
-	int		vers;
-	int		softscreen;
-	int		blanked;	/* screen turned off */
-	ulong		blanktime;	/* time of last operation */
-	ulong		savemap[3*256];
+	s32int		vers;
+	s32int		softscreen;
+	s32int		blanked;	/* screen turned off */
+	u32int		blanktime;	/* time of last operation */
+	u32int		savemap[3*256];
 };
 
 struct Client
@@ -70,13 +70,13 @@
 	Refresh*	refresh;
 	Rendez		refrend;
 	uchar*		readdata;
-	int		nreaddata;
-	int		busy;
-	int		clientid;
-	int		slot;
-	int		refreshme;
-	int		infoid;
-	int	op;	/* compositing operator - SoverD by default */
+	s32int		nreaddata;
+	s32int		busy;
+	s32int		clientid;
+	s32int		slot;
+	s32int		refreshme;
+	s32int		infoid;
+	s32int	op;	/* compositing operator - SoverD by default */
 };
 
 struct Refresh
@@ -97,13 +97,13 @@
 	char			*name;
 	Client	*client;
 	DImage*		dimage;
-	int			vers;
+	s32int			vers;
 };
 
 struct FChar
 {
-	int		minx;	/* left edge of bits */
-	int		maxx;	/* right edge of bits */
+	s32int		minx;	/* left edge of bits */
+	s32int		maxx;	/* right edge of bits */
 	uchar		miny;	/* first non-zero scan-line */
 	uchar		maxy;	/* last non-zero scan-line + 1 */
 	schar		left;	/* offset of baseline */
@@ -118,13 +118,13 @@
  */
 struct DImage
 {
-	int		id;
-	int		ref;
+	s32int		id;
+	s32int		ref;
 	char		*name;
-	int		vers;
+	s32int		vers;
 	Memimage*	image;
-	int		ascent;
-	int		nfchar;
+	s32int		ascent;
+	s32int		nfchar;
 	FChar*		fchar;
 	DScreen*	dscreen;	/* 0 if not a window */
 	DImage*	fromname;	/* image this one is derived from, by name */
@@ -139,9 +139,9 @@
 
 struct DScreen
 {
-	int		id;
-	int		public;
-	int		ref;
+	s32int		id;
+	s32int		public;
+	s32int		ref;
 	DImage	*dimage;
 	DImage	*dfill;
 	Memscreen*	screen;
@@ -810,9 +810,11 @@
 {
 	DImage *d;
 
-	d = drawlookup(client, BGLONG(a), 1);
-	if(d == nil)
+	d = drawlookup(client, BG32INT(a), 1);
+	if(d == nil){
+		iprint("drawimage error\n");
 		error(Enodrawimage);
+	}
 	return d->image;
 }
 
@@ -819,17 +821,19 @@
 void
 drawrectangle(Rectangle *r, uchar *a)
 {
-	r->min.x = BGLONG(a+0*4);
-	r->min.y = BGLONG(a+1*4);
-	r->max.x = BGLONG(a+2*4);
-	r->max.y = BGLONG(a+3*4);
+	r->min.x = BG32INT(a+0*4);
+	r->min.y = BG32INT(a+1*4);
+	r->max.x = BG32INT(a+2*4);
+	r->max.y = BG32INT(a+3*4);
+	// iprint("drawrectangle %R\n", *r);
 }
 
 void
 drawpoint(Point *p, uchar *a)
 {
-	p->x = BGLONG(a+0*4);
-	p->y = BGLONG(a+1*4);
+	p->x = BG32INT(a+0*4);
+	p->y = BG32INT(a+1*4);
+	// iprint("drawpoint %P\n", *p);
 }
 
 Point
@@ -864,7 +868,7 @@
 
 	memimageinit();
 	screendata.base = nil;
-	screendata.bdata = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen);
+	screendata.bdata = (uchar*)attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen);
 	if(screendata.bdata == nil)
 		return 0;
 	screendata.ref = 1;
@@ -1030,6 +1034,16 @@
 	char buf[16];
 
 	USED(offset);
+	SET(red);
+	SET(green);
+	SET(blue);
+	SET(m);
+	SET(index);
+	USED(red);
+	USED(green);
+	USED(blue);
+	USED(m);
+	USED(index);
 	if(c->qid.type & QTDIR)
 		return devdirread(c, a, n, 0, 0, drawgen);
 	cl = drawclient(c);
@@ -1107,11 +1121,11 @@
 		p = a;
 		while(cl->refresh && n>=5*4){
 			r = cl->refresh;
-			BPLONG(p+0*4, r->dimage->id);
-			BPLONG(p+1*4, r->r.min.x);
-			BPLONG(p+2*4, r->r.min.y);
-			BPLONG(p+3*4, r->r.max.x);
-			BPLONG(p+4*4, r->r.max.y);
+			BP32INT(p+0*4, r->dimage->id);
+			BP32INT(p+1*4, r->r.min.x);
+			BP32INT(p+2*4, r->r.min.y);
+			BP32INT(p+3*4, r->r.max.x);
+			BP32INT(p+4*4, r->r.max.y);
 			cl->refresh = r->next;
 			free(r);
 			p += 5*4;
@@ -1147,6 +1161,24 @@
 	ulong offset = off;
 
 	USED(offset);
+	SET(red);
+	SET(green);
+	SET(blue);
+	SET(m);
+	SET(i);
+	SET(x);
+	SET(q);
+	SET(fields);
+	SET(buf);
+	USED(red);
+	USED(green);
+	USED(blue);
+	USED(m);
+	USED(i);
+	USED(x);
+	USED(q);
+	USED(fields);
+	USED(buf);
 	if(c->qid.type & QTDIR)
 		error(Eisdir);
 	cl = drawclient(c);
@@ -1160,7 +1192,7 @@
 	case Qctl:
 		if(n != 4)
 			error("unknown draw control request");
-		cl->infoid = BGLONG((uchar*)a);
+		cl->infoid = BG32INT((uchar*)a);
 		break;
 
 	case Qcolormap:
@@ -1216,7 +1248,7 @@
 }
 
 uchar*
-drawcoord(uchar *p, uchar *maxp, int oldx, int *newx)
+drawcoord(uchar *p, uchar *maxp, s32int oldx, s32int *newx)
 {
 	int b, x;
 
@@ -1257,19 +1289,19 @@
 	for(p=fmt; *p; p++){
 		switch(*p){
 		case 'l':
-			q += sprint(q, " %ld", (long)BGLONG(a));
+			q += sprint(q, " %ld", (long)BG32INT(a));
 			a += 4;
 			break;
 		case 'L':
-			q += sprint(q, " %.8lux", (ulong)BGLONG(a));
+			q += sprint(q, " %.8lux", (ulong)BG32INT(a));
 			a += 4;
 			break;
 		case 'R':
-			q += sprint(q, " [%d %d %d %d]", BGLONG(a), BGLONG(a+4), BGLONG(a+8), BGLONG(a+12));
+			q += sprint(q, " [%d %d %d %d]", BG32INT(a), BG32INT(a+4), BG32INT(a+8), BG32INT(a+12));
 			a += 16;
 			break;
 		case 'P':
-			q += sprint(q, " [%d %d]", BGLONG(a), BGLONG(a+4));
+			q += sprint(q, " [%d %d]", BG32INT(a), BG32INT(a+4));
 			a += 8;
 			break;
 		case 'b':
@@ -1276,11 +1308,11 @@
 			q += sprint(q, " %d", *a++);
 			break;
 		case 's':
-			q += sprint(q, " %d", BGSHORT(a));
+			q += sprint(q, " %d", BG16INT(a));
 			a += 2;
 			break;
 		case 'S':
-			q += sprint(q, " %.4ux", BGSHORT(a));
+			q += sprint(q, " %.4ux", BG16INT(a));
 			a += 2;
 			break;
 		}
@@ -1293,10 +1325,10 @@
 void
 drawmesg(Client *client, void *av, int n)
 {
-	int c, op, repl, m, y, dstid, scrnid, ni, ci, j, nw, e0, e1, ox, oy, esize, oesize, doflush;
+	s32int c, op, repl, m, y, dstid, scrnid, ni, ci, j, nw, e0, e1, ox, oy, esize, oesize, doflush;
 	uchar *u, *a, refresh;
 	char *fmt;
-	ulong value, chan;
+	u32int value, chan;
 	Rectangle r, clipr;
 	Point p, q, *pp, sp;
 	Memimage *i, *dst, *src, *mask;
@@ -1330,14 +1362,14 @@
 			m = 1+4+4+1+4+1+4*4+4*4+4;
 			if(n < m)
 				error(Eshortdraw);
-			dstid = BGLONG(a+1);
-			scrnid = BGSHORT(a+5);
+			dstid = BG32INT(a+1);
+			scrnid = BG32INT(a+5);
 			refresh = a[9];
-			chan = BGLONG(a+10);
+			chan = BG32INT(a+10);
 			repl = a[14];
 			drawrectangle(&r, a+15);
 			drawrectangle(&clipr, a+31);
-			value = BGLONG(a+47);
+			value = BG32INT(a+47);
 			if(drawlookup(client, dstid, 0))
 				error(Eimageexists);
 			if(scrnid){
@@ -1405,13 +1437,13 @@
 			m = 1+4+4+4+1;
 			if(n < m)
 				error(Eshortdraw);
-			dstid = BGLONG(a+1);
+			dstid = BG32INT(a+1);
 			if(dstid == 0)
 				error(Ebadarg);
 			if(drawlookupdscreen(dstid))
 				error(Escreenexists);
-			ddst = drawlookup(client, BGLONG(a+5), 1);
-			dsrc = drawlookup(client, BGLONG(a+9), 1);
+			ddst = drawlookup(client, BG32INT(a+5), 1);
+			dsrc = drawlookup(client, BG32INT(a+9), 1);
 			if(ddst==0 || dsrc==0)
 				error(Enodrawimage);
 			if(drawinstallscreen(client, 0, dstid, ddst, dsrc, a[13]) == 0)
@@ -1424,7 +1456,7 @@
 			m = 1+4+1+4*4;
 			if(n < m)
 				error(Eshortdraw);
-			ddst = drawlookup(client, BGLONG(a+1), 1);
+			ddst = drawlookup(client, BG32INT(a+1), 1);
 			if(ddst == nil)
 				error(Enodrawimage);
 			if(ddst->name)
@@ -1471,11 +1503,11 @@
 			dst = drawimage(client, a+1);
 			src = drawimage(client, a+5);
 			drawpoint(&p, a+9);
-			e0 = BGLONG(a+17);
-			e1 = BGLONG(a+21);
+			e0 = BG32INT(a+17);
+			e1 = BG32INT(a+21);
 			if(e0<0 || e1<0)
 				error("invalid ellipse semidiameter");
-			j = BGLONG(a+25);
+			j = BG32INT(a+25);
 			if(j < 0)
 				error("negative ellipse thickness");
 			drawpoint(&sp, a+29);
@@ -1482,8 +1514,8 @@
 			c = j;
 			if(*a == 'E')
 				c = -1;
-			ox = BGLONG(a+37);
-			oy = BGLONG(a+41);
+			ox = BG32INT(a+37);
+			oy = BG32INT(a+41);
 			op = drawclientop(client);
 			/* high bit indicates arc angles are present */
 			if(ox & (1<<31)){
@@ -1501,10 +1533,10 @@
 			m = 1+4;
 			if(n < m)
 				error(Eshortdraw);
-			ll = drawlookup(client, BGLONG(a+1), 0);
+			ll = drawlookup(client, BG32INT(a+1), 0);
 			if(ll && ll->dscreen && ll->dscreen->owner != client)
 				ll->dscreen->owner->refreshme = 1;
-			drawuninstall(client, BGLONG(a+1));
+			drawuninstall(client, BG32INT(a+1));
 			continue;
 
 		/* free screen: 'F' id[4] */
@@ -1513,7 +1545,7 @@
 			m = 1+4;
 			if(n < m)
 				error(Eshortdraw);
-			drawlookupscreen(client, BGLONG(a+1), &cs);
+			drawlookupscreen(client, BG32INT(a+1), &cs);
 			drawuninstallscreen(client, cs);
 			continue;
 
@@ -1523,7 +1555,7 @@
 			m = 1+4+4+1;
 			if(n < m)
 				error(Eshortdraw);
-			dstid = BGLONG(a+1);
+			dstid = BG32INT(a+1);
 			dst = drawimage(client, a+1);
 			if(dstid == 0 || dst == screenimage)
 				error("cannot use display as font");
@@ -1532,7 +1564,7 @@
 				error(Enodrawimage);
 			if(font->image->layer)
 				error("cannot use window as font");
-			ni = BGLONG(a+5);
+			ni = BG32INT(a+5);
 			if(ni<=0 || ni>4096)
 				error("bad font size (4096 chars max)");
 			free(font->fchar);	/* should we complain if non-zero? */
@@ -1550,13 +1582,13 @@
 			m = 1+4+4+2+4*4+2*4+1+1;
 			if(n < m)
 				error(Eshortdraw);
-			font = drawlookup(client, BGLONG(a+1), 1);
+			font = drawlookup(client, BG32INT(a+1), 1);
 			if(font == 0)
 				error(Enodrawimage);
 			if(font->nfchar == 0)
 				error(Enotfont);
 			src = drawimage(client, a+5);
-			ci = BGSHORT(a+9);
+			ci = BG16INT(a+9);
 			if(ci >= font->nfchar)
 				error(Eindex);
 			drawrectangle(&r, a+11);
@@ -1580,9 +1612,9 @@
 			dst = drawimage(client, a+1);
 			drawpoint(&p, a+5);
 			drawpoint(&q, a+13);
-			e0 = BGLONG(a+21);
-			e1 = BGLONG(a+25);
-			j = BGLONG(a+29);
+			e0 = BG32INT(a+21);
+			e1 = BG32INT(a+25);
+			j = BG32INT(a+29);
 			if(j < 0)
 				error("negative line width");
 			src = drawimage(client, a+33);
@@ -1621,7 +1653,7 @@
 			m += j;
 			if(n < m)
 				error(Eshortdraw);
-			dstid = BGLONG(a+1);
+			dstid = BG32INT(a+1);
 			if(drawlookup(client, dstid, 0))
 				error(Eimageexists);
 			dn = drawlookupname(j, (char*)a+6);
@@ -1654,7 +1686,7 @@
 			m += j;
 			if(n < m)
 				error(Eshortdraw);
-			di = drawlookup(client, BGLONG(a+1), 0);
+			di = drawlookup(client, BG32INT(a+1), 0);
 			if(di == 0)
 				error(Enodrawimage);
 			if(di->name)
@@ -1688,7 +1720,7 @@
 				if(ni > 0){
 					dstflush(dst->layer->screen->image, r);
 					dstflush(dst->layer->screen->image, dst->layer->screenr);
-					ll = drawlookup(client, BGLONG(a+1), 1);
+					ll = drawlookup(client, BG32INT(a+1), 1);
 					drawrefreshscreen(ll, client);
 				}
 			}
@@ -1712,14 +1744,14 @@
 			if(n < m)
 				error(Eshortdraw);
 			dst = drawimage(client, a+1);
-			ni = BGSHORT(a+5);
+			ni = BG16INT(a+5);
 			if(ni < 0)
 				error("negative count in polygon");
-			e0 = BGLONG(a+7);
-			e1 = BGLONG(a+11);
+			e0 = BG32INT(a+7);
+			e1 = BG32INT(a+11);
 			j = 0;
 			if(*a == 'p'){
-				j = BGLONG(a+15);
+				j = BG32INT(a+15);
 				if(j < 0)
 					error("negative polygon line width");
 			}
@@ -1816,7 +1848,7 @@
 
 			dst = drawimage(client, a+1);
 			src = drawimage(client, a+5);
-			font = drawlookup(client, BGLONG(a+9), 1);
+			font = drawlookup(client, BG32INT(a+9), 1);
 			if(font == 0)
 				error(Enodrawimage);
 			if(font->nfchar == 0)
@@ -1824,7 +1856,7 @@
 			drawpoint(&p, a+13);
 			drawrectangle(&r, a+21);
 			drawpoint(&sp, a+37);
-			ni = BGSHORT(a+45);
+			ni = BG16INT(a+45);
 			u = a+m;
 			m += ni*2;
 			if(n < m)
@@ -1842,7 +1874,7 @@
 				r.max.y = r.min.y+Dy(font->image->r);
 				j = ni;
 				while(--j >= 0){
-					ci = BGSHORT(u);
+					ci = BG16INT(u);
 					if(ci<0 || ci>=font->nfchar){
 						dst->clipr = clipr;
 						error(Eindex);
@@ -1855,7 +1887,7 @@
 			}
 			q = p;
 			while(--ni >= 0){
-				ci = BGSHORT(u);
+				ci = BG16INT(u);
 				if(ci<0 || ci>=font->nfchar){
 					dst->clipr = clipr;
 					error(Eindex);
@@ -1874,13 +1906,13 @@
 			m = 1+4+4;
 			if(n < m)
 				error(Eshortdraw);
-			dstid = BGLONG(a+1);
+			dstid = BG32INT(a+1);
 			if(dstid == 0)
 				error(Ebadarg);
 			dscrn = drawlookupdscreen(dstid);
 			if(dscrn==0 || (dscrn->public==0 && dscrn->owner!=client))
 				error(Enodrawscreen);
-			if(dscrn->screen->image->chan != BGLONG(a+5))
+			if(dscrn->screen->image->chan != BG32INT(a+5))
 				error("inconsistent chan");
 			if(drawinstallscreen(client, dscrn, 0, 0, 0, 0) == 0)
 				error(Edrawmem);
@@ -1892,7 +1924,7 @@
 			m = 1+1+2;
 			if(n < m)
 				error(Eshortdraw);
-			nw = BGSHORT(a+2);
+			nw = BG16INT(a+2);
 			if(nw < 0)
 				error(Ebadarg);
 			if(nw == 0)
@@ -1921,7 +1953,7 @@
 			if(lp[0]->layer->screen->image->data == screenimage->data)
 				for(j=0; j<nw; j++)
 					dstflush(lp[j]->layer->screen->image, lp[j]->layer->screenr);
-			ll = drawlookup(client, BGLONG(a+1+1+2), 1);
+			ll = drawlookup(client, BG32INT(a+1+1+2), 1);
 			drawrefreshscreen(ll, client);
 			poperror();
 			free(lp);
--- a/emu/port/dis.c
+++ b/emu/port/dis.c
@@ -6,6 +6,8 @@
 #include	"error.h"
 #include	"raise.h"
 
+#define DP if(1){}else print
+
 struct
 {
 	Lock	l;
@@ -23,7 +25,7 @@
 	Atidle*	idletasks;
 } isched;
 
-int	bflag;
+extern	int	bflag;
 int	cflag;
 uvlong	gcbusy;
 uvlong	gcidle;
@@ -205,6 +207,10 @@
 	Osenv *o;
 	Prog **ph;
 
+	if(p->exstr != nil)
+		DP("delprog p->pid %d msg %s p->exstr %s\n", p->pid, msg, p->exstr);
+	else
+		DP("delprog p->pid %d msg --%s--\n", p->pid, msg);
 	tellsomeone(p, msg);	/* call before being removed from prog list */
 
 	o = p->osenv;
@@ -264,8 +270,10 @@
 {
 	Osenv *o;
 
+	DP("tellsomeone pid %d buf %s\n", p->pid, buf);
 	if(waserror())
 		return;
+	DP("tellsomeone after waserror() pid %d buf %s\n", p->pid, buf);
 	o = p->osenv;
 	if(o->childq != nil)
 		qproduce(o->childq, buf, strlen(buf));
@@ -934,6 +942,7 @@
 
 	estr = up->env->errstr;
 	broken = 0;
+	DP("progexit estr %s\n", estr);
 	if(estr[0] != '\0' && strcmp(estr, Eintr) != 0 && strncmp(estr, "fail:", 5) != 0)
 		broken = 1;
 
@@ -949,17 +958,28 @@
 	m = R.M->m;
 	if(broken){
 		if(cflag){	/* only works on Plan9 for now */
+			DP("progexit cflag set\n");
 			char *pc = strstr(estr, "pc=");
 
 			if(pc != nil)
 				R.PC = r->R.PC = (Inst*)strtol(pc+3, nil, 0);	/* for debugging */
 		}
-		print("[%s] Broken: \"%s\"\n", m->name, estr);
+		print("[%s] Broken: pid %d \"%s\"\n", m->name, getpid(), estr);
 	}
 
+	if(r->exstr != nil)
+		DP("progexit pid %d name %s estr %s exval %p exstr %s\n",
+			r->pid, m->name, estr, r->exval, r->exstr);
+	else
+		DP("progexit pid %d name %s estr %s exval %p\n",
+			r->pid, m->name, estr, r->exval);
+	// sh.b is matching on fail: not on "<pid> fail: "
 	snprint(msg, sizeof(msg), "%d \"%s\":%s", r->pid, m->name, estr);
+	// snprint(msg, sizeof(msg), "%s", estr);
+	DP("progexit msg %s\n", msg);
 
 	if(up->env->debug != nil) {
+		DP("progexit debug set\n");
 		dbgexit(r, broken, estr);
 		broken = 1;
 		/* must force it to break if in debug */
@@ -1010,6 +1030,7 @@
 
 	/* cause an exception in the dis prog.  As for error(), but Plan 9 needs reg*/
 	kstrcpy(up->env->errstr, msg, ERRMAX);
+	print("disfault: %s\n", msg);
 	oslongjmp(reg, up->estack[--up->nerr], 1);
 }
 
--- a/include/memdraw.h
+++ b/include/memdraw.h
@@ -19,11 +19,11 @@
 
 struct Memdata
 {
-	ulong	*base;	/* allocated data pointer */
+	uintptr	*base;	/* allocated data pointer */
 	uchar	*bdata;	/* pointer to first byte of actual data; word-aligned */
-	int		ref;		/* number of Memimages using this data */
+	s32int		ref;		/* number of Memimages using this data */
 	void*	imref;
-	int		allocd;	/* is this malloc'd? */
+	s32int		allocd;	/* is this malloc'd? */
 };
 
 enum {
@@ -39,20 +39,20 @@
 {
 	Rectangle	r;		/* rectangle in data area, local coords */
 	Rectangle	clipr;		/* clipping region */
-	int		depth;	/* number of bits of storage per pixel */
-	int		nchan;	/* number of channels */
-	ulong	chan;	/* channel descriptions */
+	s32int		depth;	/* number of bits of storage per pixel */
+	s32int		nchan;	/* number of channels */
+	u32int	chan;	/* channel descriptions */
 	Memcmap	*cmap;
 
 	Memdata	*data;	/* pointer to data; shared by windows in this image */
-	int		zero;		/* data->bdata+zero==&byte containing (0,0) */
-	ulong	width;	/* width in words of a single scan line */
+	s32int		zero;		/* data->bdata+zero==&byte containing (0,0) */
+	u32int	width;	/* width in words of a single scan line */
 	Memlayer	*layer;	/* nil if not a layer*/
-	ulong	flags;
+	u32int	flags;
 
-	int		shift[NChan];
-	int		mask[NChan];
-	int		nbits[NChan];
+	s32int		shift[NChan];
+	s32int		mask[NChan];
+	s32int		nbits[NChan];
 };
 
 struct Memcmap
@@ -76,7 +76,7 @@
 struct	Memsubfont
 {
 	char		*name;
-	short	n;		/* number of chars in font */
+	s16int	n;		/* number of chars in font */
 	uchar	height;		/* height of bitmap */
 	char	ascent;		/* top of bitmap to baseline */
 	Fontchar *info;		/* n+1 character descriptors */
@@ -101,14 +101,14 @@
 	Rectangle sr;
 	Memimage *mask;
 	Rectangle mr;
-	int op;
+	s32int op;
 
-	ulong state;
-	ulong mval;	/* if Simplemask, the mask pixel in mask format */
-	ulong mrgba;	/* mval in rgba */
-	ulong sval;	/* if Simplesrc, the source pixel in src format */
-	ulong srgba;	/* sval in rgba */
-	ulong sdval;	/* sval in dst format */
+	u32int state;
+	u32int mval;	/* if Simplemask, the mask pixel in mask format */
+	u32int mrgba;	/* mval in rgba */
+	u32int sval;	/* if Simplesrc, the source pixel in src format */
+	u32int srgba;	/* sval in rgba */
+	u32int sdval;	/* sval in dst format */
 };
 
 /*
@@ -115,8 +115,8 @@
  * Memimage management
  */
 
-extern Memimage*	allocmemimage(Rectangle, ulong);
-extern Memimage*	allocmemimaged(Rectangle, ulong, Memdata*);
+extern Memimage*	allocmemimage(Rectangle, u32int);
+extern Memimage*	allocmemimaged(Rectangle, u32int, Memdata*);
 extern Memimage*	readmemimage(int);
 extern Memimage*	creadmemimage(int);
 extern int	writememimage(int, Memimage*);
@@ -124,11 +124,11 @@
 extern int		loadmemimage(Memimage*, Rectangle, uchar*, int);
 extern int		cloadmemimage(Memimage*, Rectangle, uchar*, int);
 extern int		unloadmemimage(Memimage*, Rectangle, uchar*, int);
-extern ulong*	wordaddr(Memimage*, Point);
+extern u32int*	u32addr(Memimage*, Point);
 extern uchar*	byteaddr(Memimage*, Point);
 extern int		drawclip(Memimage*, Rectangle*, Memimage*, Point*, Memimage*, Point*, Rectangle*, Rectangle*);
-extern void	memfillcolor(Memimage*, ulong);
-extern int		memsetchan(Memimage*, ulong);
+extern void	memfillcolor(Memimage*, u32int);
+extern int		memsetchan(Memimage*, u32int);
 
 /*
  * Graphics
@@ -148,7 +148,7 @@
 extern Rectangle	memlinebbox(Point, Point, int, int, int);
 extern int	memlineendsize(int);
 extern void	_memmkcmap(void);
-extern void	memimageinit(void);
+extern s32	memimageinit(void);
 
 /*
  * Subfont management
@@ -171,7 +171,7 @@
 /*
  * Kernel interface
  */
-uchar*	attachscreen(Rectangle*, ulong*, int*, int*, int*);
+Memdata*	attachscreen(Rectangle*, ulong*, int*, int*, int*);
 void		memimagemove(void*, void*);
 
 /*
--- a/include/memlayer.h
+++ b/include/memlayer.h
@@ -18,7 +18,7 @@
 	Memscreen	*screen;	/* screen this layer belongs to */
 	Memimage	*front;	/* window in front of this one */
 	Memimage	*rear;	/* window behind this one*/
-	int		clear;	/* layer is fully visible */
+	s32int		clear;	/* layer is fully visible */
 	Memimage	*save;	/* save area for obscured parts */
 	Refreshfn	refreshfn;		/* function to call to refresh obscured parts if save==nil */
 	void		*refreshptr;	/* argument to refreshfn */
@@ -34,7 +34,7 @@
  * All these functions accept screen coordinates, not local ones.
  */
 void			_memlayerop(void (*fn)(Memimage*, Rectangle, Rectangle, void*, int), Memimage*, Rectangle, Rectangle, void*);
-Memimage*	memlalloc(Memscreen*, Rectangle, Refreshfn, void*, ulong);
+Memimage*	memlalloc(Memscreen*, Rectangle, Refreshfn, void*, u32int);
 void			memldelete(Memimage*);
 void			memlfree(Memimage*);
 void			memltofront(Memimage*);
--- a/libdraw/alloc.c
+++ b/libdraw/alloc.c
@@ -2,14 +2,16 @@
 #include "draw.h"
 #include "kernel.h"
 
+#define DP if(1){}else print
+
 Image*
-allocimage(Display *d, Rectangle r, ulong chan, int repl, ulong val)
+allocimage(Display *d, Rectangle r, u32int chan, int repl, u32int val)
 {
 	return _allocimage(nil, d, r, chan, repl, val, 0, 0);
 }
 
 Image*
-_allocimage(Image *ai, Display *d, Rectangle r, ulong chan, int repl, ulong val, int screenid, int refresh)
+_allocimage(Image *ai, Display *d, Rectangle r, u32int chan, int repl, u32int val, int screenid, int refresh)
 {
 	uchar *a;
 	char *err;
@@ -46,25 +48,26 @@
 	d->imageid++;
 	id = d->imageid;
 	a[0] = 'b';
-	BPLONG(a+1, id);
-	BPLONG(a+5, screenid);
+	BP32INT(a+1, id);
+	BP32INT(a+5, screenid);
 	a[9] = refresh;
-	BPLONG(a+10, chan);
+	BP32INT(a+10, chan);
 	a[14] = repl;
-	BPLONG(a+15, r.min.x);
-	BPLONG(a+19, r.min.y);
-	BPLONG(a+23, r.max.x);
-	BPLONG(a+27, r.max.y);
+	BP32INT(a+15, r.min.x);
+	BP32INT(a+19, r.min.y);
+	BP32INT(a+23, r.max.x);
+	BP32INT(a+27, r.max.y);
 	if(repl)
 		/* huge but not infinite, so various offsets will leave it huge, not overflow */
 		clipr = Rect(-0x3FFFFFFF, -0x3FFFFFFF, 0x3FFFFFFF, 0x3FFFFFFF);
 	else
 		clipr = r;
-	BPLONG(a+31, clipr.min.x);
-	BPLONG(a+35, clipr.min.y);
-	BPLONG(a+39, clipr.max.x);
-	BPLONG(a+43, clipr.max.y);
-	BPLONG(a+47, val);
+	BP32INT(a+31, clipr.min.x);
+	BP32INT(a+35, clipr.min.y);
+	BP32INT(a+39, clipr.max.x);
+	BP32INT(a+43, clipr.max.y);
+	BP32INT(a+47, val);
+	DP("_allocimage id %d screenid %d r %R clipr %R\n", id, screenid, r, clipr);
 	if(flushimage(d, 0) < 0)
 		goto Error;
 
@@ -76,7 +79,7 @@
 			a = bufimage(d, 1+4);
 			if(a){
 				a[0] = 'f';
-				BPLONG(a+1, id);
+				BP32INT(a+1, id);
 				flushimage(d, 0);
 			}
 			goto Error;
@@ -101,7 +104,7 @@
 	char *err, buf[12*12+1];
 	Image *i;
 	int id, n;
-	ulong chan;
+	u32int chan;
 
 	err = 0;
 	i = 0;
@@ -126,7 +129,7 @@
 	d->imageid++;
 	id = d->imageid;
 	a[0] = 'n';
-	BPLONG(a+1, id);
+	BP32INT(a+1, id);
 	a[5] = n;
 	memmove(a+6, name, n);
 	if(flushimage(d, 0) < 0)
@@ -142,7 +145,7 @@
 		a = bufimage(d, 1+4);
 		if(a){
 			a[0] = 'f';
-			BPLONG(a+1, id);
+			BP32INT(a+1, id);
 			flushimage(d, 0);
 		}
 		goto Error;
@@ -180,7 +183,7 @@
 	if(a == 0)
 		return 0;
 	a[0] = 'N';
-	BPLONG(a+1, i->id);
+	BP32INT(a+1, i->id);
 	a[5] = in;
 	a[6] = n;
 	memmove(a+7, name, n);
@@ -206,7 +209,7 @@
 	if(a == 0)
 		return -1;
 	a[0] = 'f';
-	BPLONG(a+1, i->id);
+	BP32INT(a+1, i->id);
 	if(i->screen){
 		w = d->windows;
 		if(w == i)
--- a/libmemdraw/alloc.c
+++ b/libmemdraw/alloc.c
@@ -22,14 +22,14 @@
 }
 
 Memimage*
-allocmemimaged(Rectangle r, ulong chan, Memdata *md)
+allocmemimaged(Rectangle r, u32int chan, Memdata *md)
 {
-	int d;
-	ulong l;
+	s32int d;
+	u32int l;
 	Memimage *i;
 
 	if((d = chantodepth(chan)) == 0) {
-		werrstr("bad channel descriptor %.8lux", chan);
+		werrstr("bad channel descriptor %.8ux", chan);
 		return nil;
 	}
 
@@ -40,7 +40,7 @@
 		return nil;
 
 	i->data = md;
-	i->zero = sizeof(ulong)*l*r.min.y;
+	i->zero = sizeof(u32int)*l*r.min.y;
 	
 	if(r.min.x >= 0)
 		i->zero += (r.min.x*d)/8;
@@ -61,15 +61,15 @@
 }
 
 Memimage*
-allocmemimage(Rectangle r, ulong chan)
+allocmemimage(Rectangle r, u32int chan)
 {
-	int d;
-	ulong l, nw;
+	s32int d;
+	u32int l, nw;
 	Memdata *md;
 	Memimage *i;
 
 	if((d = chantodepth(chan)) == 0) {
-		werrstr("bad channel descriptor %.8lux", chan);
+		werrstr("bad channel descriptor %.8ux", chan);
 		return nil;
 	}
 
@@ -80,14 +80,14 @@
 		return nil;
 
 	md->ref = 1;
-	md->base = poolalloc(imagmem, (2+nw)*sizeof(ulong));
+	md->base = poolalloc(imagmem, 2*sizeof(intptr)+nw*sizeof(u32int));
 	if(md->base == nil){
 		free(md);
 		return nil;
 	}
 
-	md->base[0] = (ulong)md;
-	/* md->base[1] = getcallerpc(&r); */
+	md->base[0] = (uintptr)md;
+	md->base[1] = getcallerpc(&r);
 
 	/* if this changes, memimagemove must change too */
 	md->bdata = (uchar*)&md->base[2];
@@ -120,10 +120,10 @@
 /*
  * Wordaddr is deprecated.
  */
-ulong*
-wordaddr(Memimage *i, Point p)
+u32int*
+u32addr(Memimage *i, Point p)
 {
-	return (ulong*) ((ulong)byteaddr(i, p) & ~(sizeof(ulong)-1));
+	return (u32int*) ((uintptr)byteaddr(i, p) & ~(sizeof(uintptr)-1));
 }
 
 uchar*
@@ -131,7 +131,7 @@
 {
 	uchar *a;
 
-	a = i->data->bdata+i->zero+sizeof(ulong)*p.y*i->width;
+	a = i->data->bdata+i->zero+(s32int)(sizeof(u32int)*p.y*i->width);
 
 	if(i->depth < 8){
 		/*
@@ -138,7 +138,7 @@
 		 * We need to always round down,
 		 * but C rounds toward zero.
 		 */
-		int np;
+		s32int np;
 		np = 8/i->depth;
 		if(p.x < 0)
 			return a+(p.x-np+1)/np;
@@ -150,12 +150,12 @@
 }
 
 int
-memsetchan(Memimage *i, ulong chan)
+memsetchan(Memimage *i, u32int chan)
 {
-	int d;
-	int t, j, k;
-	ulong cc;
-	int bytes;
+	s32int d;
+	s32int t, j, k;
+	u32int cc;
+	s32int bytes;
 
 	if((d = chantodepth(chan)) == 0) {
 		werrstr("bad channel descriptor");
--- a/libmemdraw/draw.c
+++ b/libmemdraw/draw.c
@@ -43,7 +43,7 @@
 
 int	_ifmt(Fmt*);
 
-void
+s32
 memimageinit(void)
 {
 	static int didinit = 0;
@@ -50,7 +50,7 @@
 	char *n;
 
 	if(didinit)
-		return;
+		return 0;
 
 	didinit = 1;
 
@@ -74,20 +74,23 @@
 	memzeros->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF);
 	*byteaddr(memzeros, ZP) = 0;
 
-	if(memones == nil || memzeros == nil)
+	if(memones == nil || memzeros == nil){
 		assert(0 /*cannot initialize memimage library */);	/* RSC BUG */
+		return -1;
+	}
 
 	memwhite = memones;
 	memblack = memzeros;
 	memopaque = memones;
 	memtransparent = memzeros;
+	return 0;
 }
 
-static ulong imgtorgba(Memimage*, ulong);
-static ulong rgbatoimg(Memimage*, ulong);
-static ulong pixelbits(Memimage*, Point);
+static u32int imgtorgba(Memimage*, u32int);
+static u32int rgbatoimg(Memimage*, u32int);
+static u32int pixelbits(Memimage*, Point);
 
-#define DBG if(0)
+#define DBG if(drawdebug)
 void
 memimagedraw(Memimage *dst, Rectangle r, Memimage *src, Point p0, Memimage *mask, Point p1, int op)
 {
@@ -96,17 +99,18 @@
 	if(mask == nil)
 		mask = memopaque;
 
-DBG	print("memimagedraw %p/%luX %R @ %p %p/%luX %P %p/%luX %P... ", dst, dst->chan, r, dst->data->bdata, src, src->chan, p0, mask, mask->chan, p1);
+DBG	print("memimagedraw %p/%uX %R @ %p %p/%uX %P %p/%uX %P... ",
+		dst, dst->chan, r, dst->data->bdata, src, src->chan, p0, mask, mask->chan, p1);
 
 	if(drawclip(dst, &r, src, &p0, mask, &p1, &par.sr, &par.mr) == 0){
-//		if(drawdebug)
-//			iprint("empty clipped rectangle\n");
+		if(drawdebug)
+			iprint("empty clipped rectangle\n");
 		return;
 	}
 
 	if(op < Clear || op > SoverD){
-//		if(drawdebug)
-//			iprint("op out of range: %d\n", op);
+		if(drawdebug)
+			iprint("op out of range: %d\n", op);
 		return;
 	}
 
@@ -127,7 +131,7 @@
 			par.srgba = imgtorgba(src, par.sval);
 			par.sdval = rgbatoimg(dst, par.srgba);
 			if((par.srgba&0xFF) == 0 && (op&DoutS)){
-//				if (drawdebug) iprint("fill with transparent source\n");
+				if (drawdebug) iprint("fill with transparent source\n");
 				return;	/* no-op successfully handled */
 			}
 		}
@@ -138,7 +142,7 @@
 		if(Dx(mask->r)==1 && Dy(mask->r)==1){
 			par.mval = pixelbits(mask, mask->r.min);
 			if(par.mval == 0 && (op&DoutS)){
-//				if(drawdebug) iprint("fill with zero mask\n");
+				if(drawdebug) iprint("fill with zero mask\n");
 				return;	/* no-op successfully handled */
 			}
 			par.state |= Simplemask;
@@ -148,9 +152,9 @@
 		}
 	}
 
-//	if(drawdebug)
-//		iprint("dr %R sr %R mr %R...", r, par.sr, par.mr);
-DBG print("draw dr %R sr %R mr %R %lux\n", r, par.sr, par.mr, par.state);
+	if(drawdebug)
+		iprint("dr %R sr %R mr %R...", r, par.sr, par.mr);
+DBG print("draw dr %R sr %R mr %R %ux\n", r, par.sr, par.mr, par.state);
 
 	/*
 	 * Now that we've clipped the parameters down to be consistent, we 
@@ -166,7 +170,7 @@
 	 */
 DBG print("test hwdraw\n");
 	if(hwdraw(&par)){
-//if(drawdebug) iprint("hw handled\n");
+if(drawdebug) iprint("hw handled\n");
 DBG print("hwdraw handled\n");
 		return;
 	}
@@ -175,7 +179,7 @@
 	 */
 DBG print("test memoptdraw\n");
 	if(memoptdraw(&par)){
-//if(drawdebug) iprint("memopt handled\n");
+if(drawdebug) iprint("memopt handled\n");
 DBG print("memopt handled\n");
 		return;
 	}
@@ -186,7 +190,7 @@
 	 */
 DBG print("test chardraw\n");
 	if(chardraw(&par)){
-//if(drawdebug) iprint("chardraw handled\n");
+if(drawdebug) iprint("chardraw handled\n");
 DBG print("chardraw handled\n");
 		return;
 	}
@@ -196,10 +200,9 @@
 	 */
 DBG print("do alphadraw\n");
 	alphadraw(&par);
-//if(drawdebug) iprint("alphadraw handled\n");
+if(drawdebug) iprint("alphadraw handled\n");
 DBG print("alphadraw handled\n");
 }
-#undef DBG
 
 /*
  * Clip the destination rectangle further based on the properties of the 
@@ -222,8 +225,10 @@
 	splitcoords = (p0->x!=p1->x) || (p0->y!=p1->y);
 	/* clip to destination */
 	rmin = r->min;
-	if(!rectclip(r, dst->r) || !rectclip(r, dst->clipr))
+	if(!rectclip(r, dst->r) || !rectclip(r, dst->clipr)){
+		DBG print("drawclip: !rectclip(r, dst->r) || !rectclip(r, dst->clipr)\n");
 		return 0;
+	}
 	/* move mask point */
 	p1->x += r->min.x-rmin.x;
 	p1->y += r->min.y-rmin.y;
@@ -235,10 +240,15 @@
 	sr->max.x = p0->x+Dx(*r);
 	sr->max.y = p0->y+Dy(*r);
 	/* sr is r in source coordinates; clip to source */
-	if(!(src->flags&Frepl) && !rectclip(sr, src->r))
+	if(!(src->flags&Frepl) && !rectclip(sr, src->r)){
+		DBG print("drawclip: !(src->flags&Frepl) && !rectclip(sr, src->r)\n");
 		return 0;
-	if(!rectclip(sr, src->clipr))
+	}
+	if(!rectclip(sr, src->clipr)){
+		DBG print("drawclip: sr %R src->clipr %R\n\t!rectclip(sr, src->clipr)\n",
+			*sr, src->clipr);
 		return 0;
+	}
 	/* compute and clip rectangle in mask */
 	if(splitcoords){
 		/* move mask point with source */
@@ -249,10 +259,14 @@
 		mr->max.y = p1->y+Dy(*sr);
 		omr = *mr;
 		/* mr is now rectangle in mask; clip it */
-		if(!(mask->flags&Frepl) && !rectclip(mr, mask->r))
+		if(!(mask->flags&Frepl) && !rectclip(mr, mask->r)){
+			DBG print("drawclip: !(mask->flags&Frepl) && !rectclip(mr, mask->r)\n");
 			return 0;
-		if(!rectclip(mr, mask->clipr))
+		}
+		if(!rectclip(mr, mask->clipr)){
+			DBG print("drawclip: !rectclip(mr, mask->clipr)\n");
 			return 0;
+		}
 		/* reflect any clips back to source */
 		sr->min.x += mr->min.x-omr.min.x;
 		sr->min.y += mr->min.y-omr.min.y;
@@ -260,10 +274,14 @@
 		sr->max.y += mr->max.y-omr.max.y;
 		*p1 = mr->min;
 	}else{
-		if(!(mask->flags&Frepl) && !rectclip(sr, mask->r))
+		if(!(mask->flags&Frepl) && !rectclip(sr, mask->r)){
+			DBG print("drawclip: !(mask->flags&Frepl) && !rectclip(mr, mask->r)\n");
 			return 0;
-		if(!rectclip(sr, mask->clipr))
+		}
+		if(!rectclip(sr, mask->clipr)){
+			DBG print("drawclip: !rectclip(mr, mask->clipr)\n");
 			return 0;
+		}
 		*p1 = sr->min;
 	}
 
@@ -300,6 +318,7 @@
 
 	return 1;
 }
+#undef DBG
 
 /*
  * Conversion tables.
@@ -369,7 +388,7 @@
 	uchar	*blu;
 	uchar	*alpha;
 	uchar	*grey;
-	ulong	*rgba;
+	u32int	*rgba;
 	int	delta;	/* number of bytes to add to pointer to get next pixel to the right */
 
 	/* used by boolcalc* for mask data */
@@ -411,7 +430,7 @@
 
 	int	replcache;	/* if set, cache buffers */
 	Buffer	bcache[MAXBCACHE];
-	ulong	bfilled;
+	u32int	bfilled;
 	uchar	*bufbase;
 	int	bufoff;
 	int	bufdelta;
@@ -514,7 +533,7 @@
 	p->bytey0s = byteaddr(img, Pt(img->r.min.x, img->r.min.y));
 	p->bytermin = byteaddr(img, Pt(r.min.x, img->r.min.y));
 	p->bytey0e = byteaddr(img, Pt(img->r.max.x, img->r.min.y));
-	p->bwidth = sizeof(ulong)*img->width;
+	p->bwidth = sizeof(u32int)*img->width;
 
 	assert(p->bytey0s <= p->bytermin && p->bytermin <= p->bytey0e);
 
@@ -657,9 +676,9 @@
 	 * but it avoids a fair amount of code duplication to make this a case here
 	 * rather than have a separate booldraw.
 	 */
-//if(drawdebug) iprint("flag %lud mchan %lux=?%x dd %d\n", src->flags&Falpha, mask->chan, GREY1, dst->depth);
+if(drawdebug) iprint("flag %ud mchan %ux=?%x dd %d\n", src->flags&Falpha, mask->chan, GREY1, dst->depth);
 	if(!(src->flags&Falpha) && mask->chan == GREY1 && dst->depth >= 8 && op == SoverD){
-//if(drawdebug) iprint("boolcopy...");
+if(drawdebug) iprint("boolcopy...");
 		rdsrc = convfn(dst, &z->dpar, src, &z->spar, &ndrawbuf);
 		rddst = readptr;
 		rdmask = readfn(mask);
@@ -670,6 +689,7 @@
 		rdsrc = readfn(src);
 		rddst = readfn(dst);
 		wrdst = writefn(dst);
+if(drawdebug) iprint("alphacalc op %d\n", op);
 		calc = alphacalc[op];
 
 		/*
@@ -692,13 +712,17 @@
 			 * When there's no alpha involved and the mask is boolean,
 			 * we can avoid all the division and multiplication.
 			 */
-			if(mask->chan == GREY1 && !(src->flags&Falpha))
+			if(mask->chan == GREY1 && !(src->flags&Falpha)){
+if(drawdebug) iprint("boolcalc op %d\n", op);
 				calc = boolcalc[op];
-			else if(op == SoverD && !(src->flags&Falpha))
+			}else if(op == SoverD && !(src->flags&Falpha)){
+if(drawdebug) iprint("alphacalcS\n");
 				calc = alphacalcS;
+			}
 		}
 	}
 
+if(drawdebug) iprint("after if\n");
 	/*
 	 * If the image has a small enough repl rectangle,
 	 * we can just read each line once and cache them.
@@ -721,6 +745,7 @@
 		z->n = ndrawbuf;
 	}
 	drawbuf = z->p;
+if(drawdebug) iprint("after drawbuf\n");
 
 	/*
 	 * Before we were saving only offsets from drawbuf in the parameter
@@ -739,6 +764,7 @@
 		starty = dy-1;
 		endy = -1;
 	}
+if(drawdebug) iprint("before srcy\n");
 
 	/*
 	 * srcy, masky, and dsty are offsets from the top of their
@@ -753,7 +779,9 @@
 	assert(0 <= masky && masky < Dy(mask->r));
 	assert(0 <= dsty && dsty < Dy(dst->r));
 
+if(drawdebug) iprint("before for y=starty\n");
 	for(y=starty; y!=endy; y+=dir, srcy+=dir, masky+=dir, dsty+=dir){
+if(drawdebug) iprint("\ty=%d ", y);
 		clipy(src, &srcy);
 		clipy(dst, &dsty);
 		clipy(mask, &masky);
@@ -768,11 +796,13 @@
 DBG		dumpbuf("src", bsrc, dx);
 DBG		dumpbuf("mask", bmask, dx);
 DBG		dumpbuf("dst", bdst, dx);
+		/* this is where the trapBUS error is springing from */
 		bdst = calc(bdst, bsrc, bmask, dx, isgrey, op);
 		wrdst(&z->dpar, z->dpar.bytermin+dsty*z->dpar.bwidth, bdst);
 	}
 
 	z->inuse = 0;
+if(drawdebug) iprint("alphadraw return 1\n");
 	return 1;
 }
 #undef DBG
@@ -794,7 +824,7 @@
 	Buffer obdst;
 	int fd, sadelta;
 	int i, sa, ma;
-	ulong s, t;
+	u32int s, t;
 
 	obdst = bdst;
 	sadelta = bsrc.alpha == &ones ? 0 : bsrc.delta;
@@ -845,7 +875,7 @@
 	Buffer obdst;
 	int fs, sadelta;
 	int i, ma, da;
-	ulong s, t;
+	u32int s, t;
 
 	obdst = bdst;
 	sadelta = bsrc.alpha == &ones ? 0 : bsrc.delta;
@@ -898,7 +928,7 @@
 	Buffer obdst;
 	int fs, fd, sadelta;
 	int i, sa, ma, da;
-	ulong s, t, q1, q2;
+	u32int s, t, q1, q2;
 
 	obdst = bdst;
 	sadelta = bsrc.alpha == &ones ? 0 : bsrc.delta;
@@ -972,7 +1002,7 @@
 	Buffer obdst;
 	int fd, sadelta;
 	int i, sa, ma;
-	ulong s, t, q1, q2;
+	u32int s, t, q1, q2;
 
 	USED(op);
 	obdst = bdst;
@@ -1065,12 +1095,16 @@
 	Buffer obdst;
 	int fd;
 	int i, ma;
-	ulong s, t;
+	u32int s, t;
 
+	// iprint("\t\talphacalcS");
 	USED(op);
 	obdst = bdst;
 
+	// iprint(" grey %d dx %d ", grey, dx);
 	for(i=0; i<dx; i++){
+		//if(i > dx-2)
+		//	iprint(" i %d ", i);
 		ma = *bmask.alpha;
 		fd = 255-ma;
 
@@ -1079,9 +1113,16 @@
 			bsrc.grey += bsrc.delta;
 			bdst.grey += bdst.delta;
 		}else{
+			/* if(i > dx-2){
+				iprint("ma %d *bsrc.red %d s %d fd %d *bdst.red %d t %d ",
+					ma, *bsrc.red, s, fd, *bdst.red, t);
+			} */
 			*bdst.red = MUL(ma, *bsrc.red, s)+MUL(fd, *bdst.red, t);
 			*bdst.grn = MUL(ma, *bsrc.grn, s)+MUL(fd, *bdst.grn, t);
 			*bdst.blu = MUL(ma, *bsrc.blu, s)+MUL(fd, *bdst.blu, t);
+			/* if(i > dx-2){
+				iprint("*%p %x ", bdst.red, *bdst.red);
+			} */
 			bsrc.red += bsrc.delta;
 			bsrc.blu += bsrc.delta;
 			bsrc.grn += bsrc.delta;
@@ -1090,11 +1131,13 @@
 			bdst.grn += bdst.delta;
 		}
 		if(bdst.alpha != &ones){
+			// iprint("alphacalcS != &ones\n");
 			*bdst.alpha = ma+MUL(fd, *bdst.alpha, t);
 			bdst.alpha += bdst.delta;
 		}
 		bmask.alpha += bmask.delta;
 	}
+	// iprint("\n");
 	return obdst;
 }
 
@@ -1138,7 +1181,7 @@
 	Buffer obdst;
 	int fs, fd;
 	int i, ma, da, zero;
-	ulong s, t;
+	u32int s, t;
 
 	obdst = bdst;
 	zero = !(op&1);
@@ -1272,7 +1315,7 @@
 	uchar *repl, *r, *w, *ow, bits;
 	int i, n, sh, depth, x, dx, npack, nbits;
 
-	b.rgba = (ulong*)buf;
+	b.rgba = (u32int*)buf;
 	b.grey = w = buf;
 	b.red = b.blu = b.grn = w;
 	b.alpha = &ones;
@@ -1362,7 +1405,7 @@
 writenbit(Param *p, uchar *w, Buffer src)
 {
 	uchar *r;
-	ulong bits;
+	u32int bits;
 	int i, sh, depth, npack, nbits, x, ex;
 
 	assert(src.grey != nil && src.delta == 1);
@@ -1450,7 +1493,7 @@
 		}
 	}
 
-	b.rgba = (ulong*)(buf-copyalpha);
+	b.rgba = (u32int*)(buf-copyalpha);
 
 	if(convgrey){
 		b.grey = buf;
@@ -1493,7 +1536,7 @@
 	int dx, isgrey, convgrey, alphaonly, copyalpha, i, nb;
 	uchar *begin, *end, *r, *w, *rrepl, *grepl, *brepl, *arepl, *krepl;
 	uchar ured, ugrn, ublu;
-	ulong u;
+	u32int u;
 
 	img = p->img;
 	begin = p->bytey0s + y*p->bwidth;
@@ -1517,7 +1560,7 @@
 			memmove(buf, r, dx*nb);
 			r = buf;
 		}
-		b.rgba = (ulong*)r;
+		b.rgba = (u32int*)r;
 		if(copyalpha)
 			b.alpha = r+img->shift[CAlpha]/8;
 		else
@@ -1570,7 +1613,7 @@
 	}
 	
 	b.alpha = copyalpha ? buf : &ones;
-	b.rgba = (ulong*)buf;
+	b.rgba = (u32int*)buf;
 	if(alphaonly){
 		b.red = b.grn = b.blu = b.grey = nil;
 		if(!copyalpha)
@@ -1599,7 +1642,7 @@
 	Memimage *img;
 	int i, isalpha, isgrey, nb, delta, dx, adelta;
 	uchar ff, *red, *grn, *blu, *grey, *alpha;
-	ulong u, mask;
+	u32int u, mask;
 
 	img = p->img;
 
@@ -1626,12 +1669,12 @@
 
 	for(i=0; i<dx; i++){
 		u = w[0] | (w[1]<<8) | (w[2]<<16) | (w[3]<<24);
-DBG print("u %.8lux...", u);
+DBG print("u %.8ux...", u);
 		u &= mask;
-DBG print("&mask %.8lux...", u);
+DBG print("&mask %.8ux...", u);
 		if(isgrey){
 			u |= ((*grey >> (8-img->nbits[CGrey])) & img->mask[CGrey]) << img->shift[CGrey];
-DBG print("|grey %.8lux...", u);
+DBG print("|grey %.8ux...", u);
 			grey += delta;
 		}else{
 			u |= ((*red >> (8-img->nbits[CRed])) & img->mask[CRed]) << img->shift[CRed];
@@ -1640,13 +1683,13 @@
 			red += delta;
 			grn += delta;
 			blu += delta;
-DBG print("|rgb %.8lux...", u);
+DBG print("|rgb %.8ux...", u);
 		}
 
 		if(isalpha){
 			u |= ((*alpha >> (8-img->nbits[CAlpha])) & img->mask[CAlpha]) << img->shift[CAlpha];
 			alpha += adelta;
-DBG print("|alpha %.8lux...", u);
+DBG print("|alpha %.8ux...", u);
 		}
 
 		w[0] = u;
@@ -1661,10 +1704,12 @@
 static Readfn*
 readfn(Memimage *img)
 {
-	if(img->depth < 8)
+	if(img->depth < 8){
 		return readnbit;
-	if(img->nbits[CMap] == 8)
+	}
+	if(img->nbits[CMap] == 8){
 		return readcmap;
+	}
 	return readbyte;
 }
 
@@ -1703,7 +1748,7 @@
 	q = p->bytermin + y*p->bwidth;
 	b.red = q;	/* ptr to data */
 	b.grn = b.blu = b.grey = b.alpha = nil;
-	b.rgba = (ulong*)q;
+	b.rgba = (u32int*)q;
 	b.delta = p->img->depth/8;
 	return b;
 }
@@ -1782,13 +1827,13 @@
 boolcopy32(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int i, int o)
 {
 	uchar *m;
-	ulong *r, *w, *ew;
+	u32int *r, *w, *ew;
 
 	USED(i);
 	USED(o);
 	m = bmask.grey;
-	w = (ulong*)bdst.red;
-	r = (ulong*)bsrc.red;
+	w = (u32int*)bdst.red;
+	r = (u32int*)bsrc.red;
 	ew = w+dx;
 	for(; w < ew; w++,r++)
 		if(*m++)
@@ -1820,7 +1865,7 @@
 
 	b.red = buf;
 	b.blu = b.grn = b.grey = b.alpha = nil;
-	b.rgba = (ulong*)buf;
+	b.rgba = (u32int*)buf;
 	b.delta = 0;
 	
 	return b;
@@ -1857,11 +1902,11 @@
 	return genconv;
 }
 
-static ulong
+static u32int
 pixelbits(Memimage *i, Point pt)
 {
 	uchar *p;
-	ulong val;
+	u32int val;
 	int off, bpp, npack;
 
 	val = 0;
@@ -1931,7 +1976,7 @@
 }
 
 static void
-memsets(void *vp, ushort val, int n)
+memset16(void *vp, ushort val, int n)
 {
 	ushort *p, *ep;
 
@@ -1942,9 +1987,9 @@
 }
 
 static void
-memsetl(void *vp, ulong val, int n)
+memset32(void *vp, u32int val, int n)
 {
-	ulong *p, *ep;
+	u32int *p, *ep;
 
 	p = vp;
 	ep = p+n;
@@ -1953,7 +1998,7 @@
 }
 
 static void
-memset24(void *vp, ulong val, int n)
+memset24(void *vp, u32int val, int n)
 {
 	uchar *p, *ep;
 	uchar a,b,c;
@@ -1970,12 +2015,12 @@
 	}
 }
 
-static ulong
-imgtorgba(Memimage *img, ulong val)
+static u32int
+imgtorgba(Memimage *img, u32int val)
 {
 	uchar r, g, b, a;
 	int nb, ov, v;
-	ulong chan;
+	u32int chan;
 	uchar *p;
 
 	a = 0xFF;
@@ -2018,12 +2063,12 @@
 	return (r<<24)|(g<<16)|(b<<8)|a;	
 }
 
-static ulong
-rgbatoimg(Memimage *img, ulong rgba)
+static u32int
+rgbatoimg(Memimage *img, u32int rgba)
 {
-	ulong chan;
+	u32int chan;
 	int d, nb;
-	ulong v;
+	u32int v;
 	uchar *p, r, g, b, a, m;
 
 	v = 0;
@@ -2067,8 +2112,8 @@
 static int
 memoptdraw(Memdrawparam *par)
 {
-	int m, y, dy, dx, op;
-	ulong v;
+	s32int m, y, dy, dx, op;
+	u32int v;
 	Memimage *src;
 	Memimage *dst;
 
@@ -2078,7 +2123,7 @@
 	dst = par->dst;
 	op = par->op;
 
-DBG print("state %lux mval %lux dd %d\n", par->state, par->mval, dst->depth);
+DBG print("state %ux mval %ux dd %d\n", par->state, par->mval, dst->depth);
 	/*
 	 * If we have an opaque mask and source is one opaque pixel we can convert to the
 	 * destination format and just replicate with memset.
@@ -2086,14 +2131,15 @@
 	m = Simplesrc|Simplemask|Fullmask;
 	if((par->state&m)==m && (par->srgba&0xFF) == 0xFF && (op ==S || op == SoverD)){
 		uchar *dp, p[4];
-		int d, dwid, ppb, np, nb;
+		s32int d, dwid, ppb, np, nb;
 		uchar lm, rm;
 
+DBG print("Simplesrc|Simplemask|Fullmask\n");
 DBG print("memopt, dst %p, dst->data->bdata %p\n", dst, dst->data->bdata);
-		dwid = dst->width*sizeof(ulong);
+		dwid = dst->width*sizeof(u32int);
 		dp = byteaddr(dst, par->r.min);
 		v = par->sdval;
-DBG print("sdval %lud, depth %d\n", v, dst->depth);
+DBG print("sdval %ud, depth %d\n", v, dst->depth);
 		switch(dst->depth){
 		case 1:
 		case 2:
@@ -2128,7 +2174,7 @@
 
 				for(y=0; y<dy; y++, dp+=dwid){
 					if(lm){
-DBG print("dp %p v %lux lm %ux (v ^ *dp) & lm %lux\n", dp, v, lm, (v^*dp)&lm);
+DBG print("dp %p v %ux lm %ux (v ^ *dp) & lm %ux\n", dp, v, lm, (v^*dp)&lm);
 						*dp ^= (v ^ *dp) & lm;
 						dp++;
 					}
@@ -2162,7 +2208,7 @@
 DBG print("dp=%p; dx=%d; for(y=0; y<%d; y++, dp+=%d)\nmemsets(dp, v, dx);\n",
 	dp, dx, dy, dwid);
 			for(y=0; y<dy; y++, dp+=dwid)
-				memsets(dp, v, dx);
+				memset16(dp, v, dx);
 			return 1;
 		case 24:
 			for(y=0; y<dy; y++, dp+=dwid)
@@ -2173,9 +2219,9 @@
 			p[1] = v>>8;
 			p[2] = v>>16;
 			p[3] = v>>24;
-			v = *(ulong*)p;
+			v = *(u32int*)p;
 			for(y=0; y<dy; y++, dp+=dwid)
-				memsetl(dp, v, dx);
+				memset32(dp, v, dx);
 			return 1;
 		default:
 			assert(0 /* bad dest depth in memoptdraw */);
@@ -2191,16 +2237,17 @@
 	if((par->state&(m|Replsrc))==m && src->depth >= 8 
 	&& src->chan == dst->chan && (op == S || (op == SoverD && !(src->flags&Falpha)))){
 		uchar *sp, *dp;
-		long swid, dwid, nb;
-		int dir;
+		s32int swid, dwid, nb;
+		u32int dir;
 
+DBG print("Simplemask|Fullmask\n");
 		if(src->data == dst->data && byteaddr(dst, par->r.min) > byteaddr(src, par->sr.min))
 			dir = -1;
 		else
 			dir = 1;
 
-		swid = src->width*sizeof(ulong);
-		dwid = dst->width*sizeof(ulong);
+		swid = src->width*sizeof(u32int);
+		dwid = dst->width*sizeof(u32int);
 		sp = byteaddr(src, par->sr.min);
 		dp = byteaddr(dst, par->r.min);
 		if(dir == -1){
@@ -2210,6 +2257,13 @@
 			dwid = -dwid;
 		}
 		nb = (dx*src->depth)/8;
+DBG print("swid %d dwid %d sp %p dp %p dir %d nb %d\n"
+	"	dst %p dst->data->bdata %p dst->zero %d"
+	" dst->width %d dst->depth %d\n"
+	"	par->r.min.x %d par->r.min.y %d\n",
+	swid, dwid, sp, dp, dir, nb,
+	dst, dst->data->bdata, dst->zero, dst->width, dst->depth,
+	par->r.min.x, par->r.min.y);
 		for(y=0; y<dy; y++, sp+=swid, dp+=dwid)
 			memmove(dp, sp, nb);
 		return 1;
@@ -2225,15 +2279,16 @@
 	&& (par->r.min.x&7)==(par->sr.min.x&7) && (par->r.min.x&7)==(par->mr.min.x&7)){
 		uchar *sp, *dp, *mp;
 		uchar lm, rm;
-		long swid, dwid, mwid;
-		int i, x, dir;
+		s32int swid, dwid, mwid;
+		s32int i, x, dir;
 
+DBG print("Simplemask|Simplesrc|Replmask|Replsrc");
 		sp = byteaddr(src, par->sr.min);
 		dp = byteaddr(dst, par->r.min);
 		mp = byteaddr(par->mask, par->mr.min);
-		swid = src->width*sizeof(ulong);
-		dwid = dst->width*sizeof(ulong);
-		mwid = par->mask->width*sizeof(ulong);
+		swid = src->width*sizeof(u32int);
+		dwid = dst->width*sizeof(u32int);
+		mwid = par->mask->width*sizeof(u32int);
 
 		if(src->data == dst->data && byteaddr(dst, par->r.min) > byteaddr(src, par->sr.min)){
 			dir = -1;
@@ -2322,17 +2377,17 @@
 static int
 chardraw(Memdrawparam *par)
 {
-	ulong bits;
+	u32int bits;
 	int i, ddepth, dy, dx, x, bx, ex, y, npack, bsh, depth, op;
-	ulong v, maskwid, dstwid;
+	u32int v, maskwid, dstwid;
 	uchar *wp, *rp, *q, *wc;
 	ushort *ws;
-	ulong *wl;
+	u32int *wl;
 	uchar sp[4];
 	Rectangle r, mr;
 	Memimage *mask, *src, *dst;
 
-if(0) if(drawdebug) iprint("chardraw? mf %lux md %d sf %lux dxs %d dys %d dd %d ddat %p sdat %p\n",
+if(0) if(drawdebug) iprint("chardraw? mf %ux md %d sf %ux dxs %d dys %d dd %d ddat %p sdat %p\n",
 		par->mask->flags, par->mask->depth, par->src->flags, 
 		Dx(par->src->r), Dy(par->src->r), par->dst->depth, par->dst->data, par->src->data);
 
@@ -2351,13 +2406,13 @@
 //if(drawdebug) iprint("chardraw...");
 
 	depth = mask->depth;
-	maskwid = mask->width*sizeof(ulong);
+	maskwid = mask->width*sizeof(u32int);
 	rp = byteaddr(mask, mr.min);
 	npack = 8/depth;
 	bsh = (mr.min.x % npack) * depth;
 
 	wp = byteaddr(dst, r.min);
-	dstwid = dst->width*sizeof(ulong);
+	dstwid = dst->width*sizeof(u32int);
 DBG print("bsh %d\n", bsh);
 	dy = Dy(r);
 	dx = Dx(r);
@@ -2397,7 +2452,7 @@
 				i = x&7;
 				if(i == 8-1)
 					bits = *q++;
-DBG print("bits %lux sh %d...", bits, i);
+DBG print("bits %ux sh %d...", bits, i);
 				if((bits>>i)&1)
 					*wc = v;
 			}
@@ -2409,7 +2464,7 @@
 				i = x&7;
 				if(i == 8-1)
 					bits = *q++;
-DBG print("bits %lux sh %d...", bits, i);
+DBG print("bits %ux sh %d...", bits, i);
 				if((bits>>i)&1)
 					*ws = v;
 			}
@@ -2420,7 +2475,7 @@
 				i = x&7;
 				if(i == 8-1)
 					bits = *q++;
-DBG print("bits %lux sh %d...", bits, i);
+DBG print("bits %ux sh %d...", bits, i);
 				if((bits>>i)&1){
 					wc[0] = sp[0];
 					wc[1] = sp[1];
@@ -2429,13 +2484,13 @@
 			}
 			break;
 		case 32:
-			wl = (ulong*)wp;
-			v = *(ulong*)sp;
+			wl = (u32int*)wp;
+			v = *(u32int*)sp;
 			for(x=bx; x>ex; x--, wl++){
 				i = x&7;
 				if(i == 8-1)
 					bits = *q++;
-DBG iprint("bits %lux sh %d...", bits, i);
+DBG iprint("bits %ux sh %d...", bits, i);
 				if((bits>>i)&1)
 					*wl = v;
 			}
@@ -2455,7 +2510,7 @@
  *
  * This code is just plain wrong for >8bpp.
  *
-ulong
+u32int
 membyteval(Memimage *src)
 {
 	int i, val, bpp;
@@ -2475,9 +2530,9 @@
  */
 
 void
-memfillcolor(Memimage *i, ulong val)
+memfillcolor(Memimage *i, u32int val)
 {
-	ulong bits;
+	u32int bits;
 	int d, y;
 	uchar p[4];
 
@@ -2498,7 +2553,7 @@
 		p[2] = bits>>16;
 		p[3] = bits>>24;
 		bits = *(u32int*)p;
-		memsetl(wordaddr(i, i->r.min), bits, i->width*Dy(i->r));
+		memset32(u32addr(i, i->r.min), bits, i->width*Dy(i->r));
 		break;
 	}
 }
--- a/libmemdraw/drawtest.c
+++ b/libmemdraw/drawtest.c
@@ -306,9 +306,9 @@
 void
 checkline(Rectangle r, Point sp, Point mp, int y, Memimage *stmp, Memimage *mtmp)
 {
-	ulong *dp;
+	u32int *dp;
 	int nb;
-	ulong *saved;
+	u32int *saved;
 
 	dp = wordaddr(dst, Pt(0, y));
 	saved = savedstbits + y*dst->width;
--- a/libmemlayer/draw.c
+++ b/libmemlayer/draw.c
@@ -11,7 +11,7 @@
 	Memlayer		*dstlayer;
 	Memimage	*src;
 	Memimage	*mask;
-	int	op;
+	s32int	op;
 };
 
 static
--- a/libmemlayer/lalloc.c
+++ b/libmemlayer/lalloc.c
@@ -4,7 +4,7 @@
 #include "memlayer.h"
 
 Memimage*
-memlalloc(Memscreen *s, Rectangle screenr, Refreshfn refreshfn, void *refreshptr, ulong val)
+memlalloc(Memscreen *s, Rectangle screenr, Refreshfn refreshfn, void *refreshptr, u32int val)
 {
 	Memlayer *l;
 	Memimage *n;