xref: /plan9/sys/src/cmd/db/format.c (revision c93608cc76758b2be624199c6208a0f90bad298d)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  *
33e12c5d1SDavid du Colombier  *	debugger
43e12c5d1SDavid du Colombier  *
53e12c5d1SDavid du Colombier  */
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier #include "defs.h"
83e12c5d1SDavid du Colombier #include "fns.h"
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier void
scanform(long icount,int prt,char * ifp,Map * map,int literal)11219b2ee8SDavid du Colombier scanform(long icount, int prt, char *ifp, Map *map, int literal)
123e12c5d1SDavid du Colombier {
133e12c5d1SDavid du Colombier 	char	*fp;
143e12c5d1SDavid du Colombier 	char	c;
153e12c5d1SDavid du Colombier 	int	fcount;
163e12c5d1SDavid du Colombier 	ADDR	savdot;
173e12c5d1SDavid du Colombier 	int firstpass;
183e12c5d1SDavid du Colombier 
193e12c5d1SDavid du Colombier 	firstpass = 1;
203e12c5d1SDavid du Colombier 	while (icount) {
213e12c5d1SDavid du Colombier 		fp=ifp;
223e12c5d1SDavid du Colombier 		savdot=dot;
233e12c5d1SDavid du Colombier 		/*now loop over format*/
24219b2ee8SDavid du Colombier 		while (*fp) {
253e12c5d1SDavid du Colombier 			if (!isdigit(*fp))
263e12c5d1SDavid du Colombier 				fcount = 1;
273e12c5d1SDavid du Colombier 			else {
283e12c5d1SDavid du Colombier 				fcount = 0;
293e12c5d1SDavid du Colombier 				while (isdigit(c = *fp++)) {
303e12c5d1SDavid du Colombier 					fcount *= 10;
313e12c5d1SDavid du Colombier 					fcount += c-'0';
323e12c5d1SDavid du Colombier 				}
333e12c5d1SDavid du Colombier 				fp--;
343e12c5d1SDavid du Colombier 			}
353e12c5d1SDavid du Colombier 			if (*fp==0)
363e12c5d1SDavid du Colombier 				break;
37219b2ee8SDavid du Colombier 			fp=exform(fcount,prt,fp,map,literal,firstpass);
383e12c5d1SDavid du Colombier 			firstpass = 0;
393e12c5d1SDavid du Colombier 		}
403e12c5d1SDavid du Colombier 		dotinc=dot-savdot;
413e12c5d1SDavid du Colombier 		dot=savdot;
423e12c5d1SDavid du Colombier 		if (--icount)
433e12c5d1SDavid du Colombier 			dot=inkdot(dotinc);
443e12c5d1SDavid du Colombier 	}
453e12c5d1SDavid du Colombier }
463e12c5d1SDavid du Colombier 
473e12c5d1SDavid du Colombier char *
exform(int fcount,int prt,char * ifp,Map * map,int literal,int firstpass)48219b2ee8SDavid du Colombier exform(int fcount, int prt, char *ifp, Map *map, int literal, int firstpass)
493e12c5d1SDavid du Colombier {
503e12c5d1SDavid du Colombier 	/* execute single format item `fcount' times
513e12c5d1SDavid du Colombier 	 * sets `dotinc' and moves `dot'
523e12c5d1SDavid du Colombier 	 * returns address of next format item
533e12c5d1SDavid du Colombier 	 */
544de34a7eSDavid du Colombier 	uvlong	v;
554de34a7eSDavid du Colombier 	ulong	w;
564de34a7eSDavid du Colombier 	ADDR	savdot;
577dd7cddfSDavid du Colombier 	char	*fp;
583e12c5d1SDavid du Colombier 	char	c, modifier;
593e12c5d1SDavid du Colombier 	int	i;
60219b2ee8SDavid du Colombier 	ushort sh, *sp;
61219b2ee8SDavid du Colombier 	uchar ch, *cp;
623e12c5d1SDavid du Colombier 	Symbol s;
63219b2ee8SDavid du Colombier 	char buf[512];
649a747e4fSDavid du Colombier 	extern int printcol;
653e12c5d1SDavid du Colombier 
663e12c5d1SDavid du Colombier 	fp = 0;
673e12c5d1SDavid du Colombier 	while (fcount > 0) {
683e12c5d1SDavid du Colombier 		fp = ifp;
693e12c5d1SDavid du Colombier 		c = *fp;
703e12c5d1SDavid du Colombier 		modifier = *fp++;
713e12c5d1SDavid du Colombier 		if (firstpass) {
723e12c5d1SDavid du Colombier 			firstpass = 0;
73219b2ee8SDavid du Colombier 			if (!literal  && (c == 'i' || c == 'I' || c == 'M')
743e12c5d1SDavid du Colombier 					&& (dot & (mach->pcquant-1))) {
753e12c5d1SDavid du Colombier 				dprint("warning: instruction not aligned");
76219b2ee8SDavid du Colombier 				printc('\n');
773e12c5d1SDavid du Colombier 			}
78219b2ee8SDavid du Colombier 			if (prt && modifier != 'a' && modifier != 'A') {
79219b2ee8SDavid du Colombier 				symoff(buf, 512, dot, CANY);
80219b2ee8SDavid du Colombier 				dprint("%s%c%16t", buf, map==symmap? '?':'/');
813e12c5d1SDavid du Colombier 			}
82219b2ee8SDavid du Colombier 		}
839a747e4fSDavid du Colombier 		if (printcol==0 && modifier != 'a' && modifier != 'A')
843e12c5d1SDavid du Colombier 			dprint("\t\t");
853e12c5d1SDavid du Colombier 		switch(modifier) {
863e12c5d1SDavid du Colombier 
873e12c5d1SDavid du Colombier 		case SPC:
883e12c5d1SDavid du Colombier 		case TB:
893e12c5d1SDavid du Colombier 			dotinc = 0;
903e12c5d1SDavid du Colombier 			break;
913e12c5d1SDavid du Colombier 
923e12c5d1SDavid du Colombier 		case 't':
933e12c5d1SDavid du Colombier 		case 'T':
943e12c5d1SDavid du Colombier 			dprint("%*t", fcount);
953e12c5d1SDavid du Colombier 			dotinc = 0;
963e12c5d1SDavid du Colombier 			return(fp);
973e12c5d1SDavid du Colombier 
983e12c5d1SDavid du Colombier 		case 'a':
99219b2ee8SDavid du Colombier 			symoff(buf, sizeof(buf), dot, CANY);
100219b2ee8SDavid du Colombier 			dprint("%s%c%16t", buf, map==symmap? '?':'/');
101219b2ee8SDavid du Colombier 			dotinc = 0;
102219b2ee8SDavid du Colombier 			break;
103219b2ee8SDavid du Colombier 
104219b2ee8SDavid du Colombier 		case 'A':
1054de34a7eSDavid du Colombier 			dprint("%#llux%10t", dot);
1063e12c5d1SDavid du Colombier 			dotinc = 0;
1073e12c5d1SDavid du Colombier 			break;
1083e12c5d1SDavid du Colombier 
1093e12c5d1SDavid du Colombier 		case 'p':
110219b2ee8SDavid du Colombier 			if (get4(map, dot, &w) < 0)
111219b2ee8SDavid du Colombier 				error("%r");
112219b2ee8SDavid du Colombier 			symoff(buf, sizeof(buf), w, CANY);
113219b2ee8SDavid du Colombier 			dprint("%s%16t", buf);
1143e12c5d1SDavid du Colombier 			dotinc = mach->szaddr;
1153e12c5d1SDavid du Colombier 			break;
1163e12c5d1SDavid du Colombier 
1173e12c5d1SDavid du Colombier 		case 'u':
1183e12c5d1SDavid du Colombier 		case 'd':
1193e12c5d1SDavid du Colombier 		case 'x':
1203e12c5d1SDavid du Colombier 		case 'o':
1213e12c5d1SDavid du Colombier 		case 'q':
122219b2ee8SDavid du Colombier 			if (literal)
123219b2ee8SDavid du Colombier 				sh = (ushort) dot;
124219b2ee8SDavid du Colombier 			else if (get2(map, dot, &sh) < 0)
125219b2ee8SDavid du Colombier 				error("%r");
1263e12c5d1SDavid du Colombier 			w = sh;
1273e12c5d1SDavid du Colombier 			dotinc = 2;
1283e12c5d1SDavid du Colombier 			if (c == 'u')
1293e12c5d1SDavid du Colombier 				dprint("%-8lud", w);
1303e12c5d1SDavid du Colombier 			else if (c == 'x')
1319a747e4fSDavid du Colombier 				dprint("%-8#lux", w);
1323e12c5d1SDavid du Colombier 			else if (c == 'd')
1333e12c5d1SDavid du Colombier 				dprint("%-8ld", w);
1343e12c5d1SDavid du Colombier 			else if (c == 'o')
1353e12c5d1SDavid du Colombier 				dprint("%-8#luo", w);
1363e12c5d1SDavid du Colombier 			else if (c == 'q')
1373e12c5d1SDavid du Colombier 				dprint("%-8#lo", w);
1383e12c5d1SDavid du Colombier 			break;
1393e12c5d1SDavid du Colombier 
1403e12c5d1SDavid du Colombier 		case 'U':
1413e12c5d1SDavid du Colombier 		case 'D':
1423e12c5d1SDavid du Colombier 		case 'X':
1433e12c5d1SDavid du Colombier 		case 'O':
1443e12c5d1SDavid du Colombier 		case 'Q':
145219b2ee8SDavid du Colombier 			if (literal)
146219b2ee8SDavid du Colombier 				w = (long) dot;
147219b2ee8SDavid du Colombier 			else if (get4(map, dot, &w) < 0)
148219b2ee8SDavid du Colombier 				error("%r");
1493e12c5d1SDavid du Colombier 			dotinc = 4;
1503e12c5d1SDavid du Colombier 			if (c == 'U')
1513e12c5d1SDavid du Colombier 				dprint("%-16lud", w);
1523e12c5d1SDavid du Colombier 			else if (c == 'X')
1539a747e4fSDavid du Colombier 				dprint("%-16#lux", w);
1543e12c5d1SDavid du Colombier 			else if (c == 'D')
1553e12c5d1SDavid du Colombier 				dprint("%-16ld", w);
1563e12c5d1SDavid du Colombier 			else if (c == 'O')
1573e12c5d1SDavid du Colombier 				dprint("%-#16luo", w);
1583e12c5d1SDavid du Colombier 			else if (c == 'Q')
1593e12c5d1SDavid du Colombier 				dprint("%-#16lo", w);
1603e12c5d1SDavid du Colombier 			break;
1617dd7cddfSDavid du Colombier 		case 'Z':
1627dd7cddfSDavid du Colombier 		case 'V':
1637dd7cddfSDavid du Colombier 		case 'Y':
1647dd7cddfSDavid du Colombier 			if (literal)
1657dd7cddfSDavid du Colombier 				v = dot;
1667dd7cddfSDavid du Colombier 			else if (get8(map, dot, &v) < 0)
1677dd7cddfSDavid du Colombier 				error("%r");
1687dd7cddfSDavid du Colombier 			dotinc = 8;
1697dd7cddfSDavid du Colombier 			if (c == 'Y')
1709a747e4fSDavid du Colombier 				dprint("%-20#llux", v);
1717dd7cddfSDavid du Colombier 			else if (c == 'V')
1727dd7cddfSDavid du Colombier 				dprint("%-20lld", v);
1737dd7cddfSDavid du Colombier 			else if (c == 'Z')
1747dd7cddfSDavid du Colombier 				dprint("%-20llud", v);
1757dd7cddfSDavid du Colombier 			break;
1763e12c5d1SDavid du Colombier 		case 'B':
1773e12c5d1SDavid du Colombier 		case 'b':
1783e12c5d1SDavid du Colombier 		case 'c':
1793e12c5d1SDavid du Colombier 		case 'C':
180219b2ee8SDavid du Colombier 			if (literal)
181219b2ee8SDavid du Colombier 				ch = (uchar) dot;
182219b2ee8SDavid du Colombier 			else if (get1(map, dot, &ch, 1)  < 0)
183219b2ee8SDavid du Colombier 				error("%r");
1843e12c5d1SDavid du Colombier 			if (modifier == 'C')
1853e12c5d1SDavid du Colombier 				printesc(ch);
1863e12c5d1SDavid du Colombier 			else if (modifier == 'B' || modifier == 'b')
1879a747e4fSDavid du Colombier 				dprint("%-8#lux", (long) ch);
1883e12c5d1SDavid du Colombier 			else
1893e12c5d1SDavid du Colombier 				printc(ch);
1903e12c5d1SDavid du Colombier 			dotinc = 1;
1913e12c5d1SDavid du Colombier 			break;
1923e12c5d1SDavid du Colombier 
1933e12c5d1SDavid du Colombier 		case 'r':
194219b2ee8SDavid du Colombier 			if (literal)
195219b2ee8SDavid du Colombier 				sh = (ushort) dot;
196219b2ee8SDavid du Colombier 			else if (get2(map, dot, &sh) < 0)
197219b2ee8SDavid du Colombier 				error("%r");
198219b2ee8SDavid du Colombier 			dprint("%C", sh);
1993e12c5d1SDavid du Colombier 			dotinc = 2;
2003e12c5d1SDavid du Colombier 			break;
2013e12c5d1SDavid du Colombier 
2023e12c5d1SDavid du Colombier 		case 'R':
203219b2ee8SDavid du Colombier 			if (literal) {
204219b2ee8SDavid du Colombier 				sp = (ushort*) &dot;
205219b2ee8SDavid du Colombier 				dprint("%C%C", sp[0], sp[1]);
206219b2ee8SDavid du Colombier 				endline();
207219b2ee8SDavid du Colombier 				dotinc = 4;
208219b2ee8SDavid du Colombier 				break;
209219b2ee8SDavid du Colombier 			}
2103e12c5d1SDavid du Colombier 			savdot=dot;
211219b2ee8SDavid du Colombier 			while ((i = get2(map, dot, &sh) > 0) && sh) {
2123e12c5d1SDavid du Colombier 				dot=inkdot(2);
2133e12c5d1SDavid du Colombier 				dprint("%C", sh);
2143e12c5d1SDavid du Colombier 				endline();
2153e12c5d1SDavid du Colombier 			}
216219b2ee8SDavid du Colombier 			if (i < 0)
217219b2ee8SDavid du Colombier 				error("%r");
2183e12c5d1SDavid du Colombier 			dotinc = dot-savdot+2;
2193e12c5d1SDavid du Colombier 			dot=savdot;
2203e12c5d1SDavid du Colombier 			break;
2213e12c5d1SDavid du Colombier 
2223e12c5d1SDavid du Colombier 		case 's':
223219b2ee8SDavid du Colombier 			if (literal) {
224219b2ee8SDavid du Colombier 				cp = (uchar*) &dot;
225219b2ee8SDavid du Colombier 				for (i = 0; i < 4; i++)
226219b2ee8SDavid du Colombier 					buf[i] = cp[i];
227219b2ee8SDavid du Colombier 				buf[i] = 0;
228219b2ee8SDavid du Colombier 				dprint("%s", buf);
229219b2ee8SDavid du Colombier 				endline();
230219b2ee8SDavid du Colombier 				dotinc = 4;
231219b2ee8SDavid du Colombier 				break;
232219b2ee8SDavid du Colombier 			}
2333e12c5d1SDavid du Colombier 			savdot = dot;
2343e12c5d1SDavid du Colombier 			for(;;){
2353e12c5d1SDavid du Colombier 				i = 0;
2363e12c5d1SDavid du Colombier 				do{
237219b2ee8SDavid du Colombier 					if (get1(map, dot, (uchar*)&buf[i], 1) < 0)
238219b2ee8SDavid du Colombier 						error("%r");
2393e12c5d1SDavid du Colombier 					dot = inkdot(1);
2403e12c5d1SDavid du Colombier 					i++;
2413e12c5d1SDavid du Colombier 				}while(!fullrune(buf, i));
2423e12c5d1SDavid du Colombier 				if(buf[0] == 0)
2433e12c5d1SDavid du Colombier 					break;
2443e12c5d1SDavid du Colombier 				buf[i] = 0;
2453e12c5d1SDavid du Colombier 				dprint("%s", buf);
2463e12c5d1SDavid du Colombier 				endline();
2473e12c5d1SDavid du Colombier 			}
2483e12c5d1SDavid du Colombier 			dotinc = dot-savdot+1;
2493e12c5d1SDavid du Colombier 			dot = savdot;
2503e12c5d1SDavid du Colombier 			break;
2513e12c5d1SDavid du Colombier 
2523e12c5d1SDavid du Colombier 		case 'S':
253219b2ee8SDavid du Colombier 			if (literal) {
254219b2ee8SDavid du Colombier 				cp = (uchar*) &dot;
255219b2ee8SDavid du Colombier 				for (i = 0; i < 4; i++)
256219b2ee8SDavid du Colombier 					printesc(cp[i]);
257219b2ee8SDavid du Colombier 				endline();
258219b2ee8SDavid du Colombier 				dotinc = 4;
259219b2ee8SDavid du Colombier 				break;
260219b2ee8SDavid du Colombier 			}
2613e12c5d1SDavid du Colombier 			savdot=dot;
262219b2ee8SDavid du Colombier 			while ((i = get1(map, dot, &ch, 1) > 0) && ch) {
2633e12c5d1SDavid du Colombier 				dot=inkdot(1);
2643e12c5d1SDavid du Colombier 				printesc(ch);
2653e12c5d1SDavid du Colombier 				endline();
2663e12c5d1SDavid du Colombier 			}
267219b2ee8SDavid du Colombier 			if (i < 0)
268219b2ee8SDavid du Colombier 				error("%r");
2693e12c5d1SDavid du Colombier 			dotinc = dot-savdot+1;
2703e12c5d1SDavid du Colombier 			dot=savdot;
2713e12c5d1SDavid du Colombier 			break;
2723e12c5d1SDavid du Colombier 
2733e12c5d1SDavid du Colombier 
2743e12c5d1SDavid du Colombier 		case 'I':
2753e12c5d1SDavid du Colombier 		case 'i':
27622a127bbSDavid du Colombier 			i = machdata->das(map, dot, modifier, buf, sizeof(buf));
27722a127bbSDavid du Colombier 			if (i < 0)
278219b2ee8SDavid du Colombier 				error("%r");
27922a127bbSDavid du Colombier 			dotinc = i;
280219b2ee8SDavid du Colombier 			dprint("%s\n", buf);
2813e12c5d1SDavid du Colombier 			break;
2823e12c5d1SDavid du Colombier 
2833e12c5d1SDavid du Colombier 		case 'M':
28422a127bbSDavid du Colombier 			i = machdata->hexinst(map, dot, buf, sizeof(buf));
28522a127bbSDavid du Colombier 			if (i < 0)
286219b2ee8SDavid du Colombier 				error("%r");
28722a127bbSDavid du Colombier 			dotinc = i;
288219b2ee8SDavid du Colombier 			dprint("%s", buf);
289219b2ee8SDavid du Colombier 			if (*fp) {
290219b2ee8SDavid du Colombier 				dotinc = 0;
291219b2ee8SDavid du Colombier 				dprint("%48t");
292219b2ee8SDavid du Colombier 			} else
293219b2ee8SDavid du Colombier 				dprint("\n");
2943e12c5d1SDavid du Colombier 			break;
2953e12c5d1SDavid du Colombier 
2963e12c5d1SDavid du Colombier 		case 'f':
2977dd7cddfSDavid du Colombier 			/* BUG: 'f' and 'F' assume szdouble is sizeof(vlong) in the literal case */
2987dd7cddfSDavid du Colombier 			if (literal) {
2994de34a7eSDavid du Colombier 				v = machdata->swav(dot);
3007dd7cddfSDavid du Colombier 				memmove(buf, &v, mach->szfloat);
3017dd7cddfSDavid du Colombier 			}else if (get1(map, dot, (uchar*)buf, mach->szfloat) < 0)
302219b2ee8SDavid du Colombier 				error("%r");
303219b2ee8SDavid du Colombier 			machdata->sftos(buf, sizeof(buf), (void*) buf);
304219b2ee8SDavid du Colombier 			dprint("%s\n", buf);
3053e12c5d1SDavid du Colombier 			dotinc = mach->szfloat;
3063e12c5d1SDavid du Colombier 			break;
3073e12c5d1SDavid du Colombier 
3083e12c5d1SDavid du Colombier 		case 'F':
3097dd7cddfSDavid du Colombier 			/* BUG: 'f' and 'F' assume szdouble is sizeof(vlong) in the literal case */
3107dd7cddfSDavid du Colombier 			if (literal) {
3117dd7cddfSDavid du Colombier 				v = machdata->swav(dot);
3127dd7cddfSDavid du Colombier 				memmove(buf, &v, mach->szdouble);
3137dd7cddfSDavid du Colombier 			}else if (get1(map, dot, (uchar*)buf, mach->szdouble) < 0)
314219b2ee8SDavid du Colombier 				error("%r");
315219b2ee8SDavid du Colombier 			machdata->dftos(buf, sizeof(buf), (void*) buf);
316219b2ee8SDavid du Colombier 			dprint("%s\n", buf);
3173e12c5d1SDavid du Colombier 			dotinc = mach->szdouble;
3183e12c5d1SDavid du Colombier 			break;
3193e12c5d1SDavid du Colombier 
3203e12c5d1SDavid du Colombier 		case 'n':
3213e12c5d1SDavid du Colombier 		case 'N':
3223e12c5d1SDavid du Colombier 			printc('\n');
3233e12c5d1SDavid du Colombier 			dotinc=0;
3243e12c5d1SDavid du Colombier 			break;
3253e12c5d1SDavid du Colombier 
3263e12c5d1SDavid du Colombier 		case '"':
3273e12c5d1SDavid du Colombier 			dotinc=0;
3283e12c5d1SDavid du Colombier 			while (*fp != '"' && *fp)
3293e12c5d1SDavid du Colombier 				printc(*fp++);
3303e12c5d1SDavid du Colombier 			if (*fp)
3313e12c5d1SDavid du Colombier 				fp++;
3323e12c5d1SDavid du Colombier 			break;
3333e12c5d1SDavid du Colombier 
3343e12c5d1SDavid du Colombier 		case '^':
3353e12c5d1SDavid du Colombier 			dot=inkdot(-dotinc*fcount);
3363e12c5d1SDavid du Colombier 			return(fp);
3373e12c5d1SDavid du Colombier 
3383e12c5d1SDavid du Colombier 		case '+':
3393e12c5d1SDavid du Colombier 			dot=inkdot((WORD)fcount);
3403e12c5d1SDavid du Colombier 			return(fp);
3413e12c5d1SDavid du Colombier 
3423e12c5d1SDavid du Colombier 		case '-':
3433e12c5d1SDavid du Colombier 			dot=inkdot(-(WORD)fcount);
3443e12c5d1SDavid du Colombier 			return(fp);
3453e12c5d1SDavid du Colombier 
3463e12c5d1SDavid du Colombier 		case 'z':
3473e12c5d1SDavid du Colombier 			if (findsym(dot, CTEXT, &s))
3483e12c5d1SDavid du Colombier 				dprint("%s() ", s.name);
3493e12c5d1SDavid du Colombier 			printsource(dot);
3503e12c5d1SDavid du Colombier 			printc(EOR);
3513e12c5d1SDavid du Colombier 			return fp;
3523e12c5d1SDavid du Colombier 
3533e12c5d1SDavid du Colombier 		default:
3543e12c5d1SDavid du Colombier 			error("bad modifier");
3553e12c5d1SDavid du Colombier 		}
3567dd7cddfSDavid du Colombier 		if (map->seg[0].fd >= 0)
3573e12c5d1SDavid du Colombier 			dot=inkdot(dotinc);
3583e12c5d1SDavid du Colombier 		fcount--;
3593e12c5d1SDavid du Colombier 		endline();
3603e12c5d1SDavid du Colombier 	}
3613e12c5d1SDavid du Colombier 
3623e12c5d1SDavid du Colombier 	return(fp);
3633e12c5d1SDavid du Colombier }
3643e12c5d1SDavid du Colombier 
3653e12c5d1SDavid du Colombier void
printesc(int c)3663e12c5d1SDavid du Colombier printesc(int c)
3673e12c5d1SDavid du Colombier {
3683e12c5d1SDavid du Colombier 	static char hex[] = "0123456789abcdef";
3693e12c5d1SDavid du Colombier 
3703e12c5d1SDavid du Colombier 	if (c < SPC || c >= 0177)
3713e12c5d1SDavid du Colombier 		dprint("\\x%c%c", hex[(c&0xF0)>>4], hex[c&0xF]);
3723e12c5d1SDavid du Colombier 	else
3733e12c5d1SDavid du Colombier 		printc(c);
3743e12c5d1SDavid du Colombier }
3753e12c5d1SDavid du Colombier 
3763e12c5d1SDavid du Colombier ADDR
inkdot(int incr)377*c93608ccSDavid du Colombier inkdot(int incr)
3783e12c5d1SDavid du Colombier {
3793e12c5d1SDavid du Colombier 	ADDR	newdot;
3803e12c5d1SDavid du Colombier 
3813e12c5d1SDavid du Colombier 	newdot=dot+incr;
3823e12c5d1SDavid du Colombier 	if ((incr >= 0 && newdot < dot)
3833e12c5d1SDavid du Colombier 	||  (incr < 0 && newdot > dot))
3843e12c5d1SDavid du Colombier 		error("address wraparound");
3853e12c5d1SDavid du Colombier 	return(newdot);
3863e12c5d1SDavid du Colombier }
387