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*) ˙
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*) ˙
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*) ˙
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