|
DataMuseum.dkPresents historical artifacts from the history of: RegneCentralen RC700 "Piccolo" |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RegneCentralen RC700 "Piccolo" Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 6272 (0x1880) Types: TextFile Names: »COMMAND.C«
└─⟦b35f94715⟧ Bits:30003295 BDS C version 1.50 arbejdsdiskette til RC703 Piccolo └─⟦b35f94715⟧ Bits:30005324 BDS C version 1.50 arbejdsdiskette til RC703 Piccolo └─ ⟦this⟧ »COMMAND.C«
#include "cdb2.h" /* Copyright (c) 1982 by J. David Kirkland, Jr. */ help() æ printf("debugger commands are:Øn"); printf(" bÆreakÅ ÆfnÅ Æsn ÆcountÅÅØn"); printf(" clear all breakpointsØn"); printf(" , dÆumpÅ pÆrintÅ contents of memoryØn"); printf(" gÆoÅØn"); printf(" lÆistÅØn"); printf(" lÆistÅ aÆrgsÅØn"); printf(" lÆistÅ bÆreaksÅØn"); printf(" lÆistÅ gÆlobalsÅØn"); printf(" lÆistÅ lÆocalsÅØn"); printf(" lÆistÅ mÆapÅØn"); printf(" lÆistÅ tÆracebackÅØn"); printf(" quit exit to CP/MØn"); printf(" rÆesetÅ ÆfnÅ ÆsnÅ a breakpointØn"); printf(" run start execution, debugger offØn"); printf(" sÆetÅ var val ÆcÅ a variableØn"); printf(" tÆraceÅ ÆnumÅ execute num statements, displaying sn'sØn"); printf(" uÆntraceÅ ÆnumÅ execute num statements, silentlyØn"); å printasn(n) unsigned n; æ /* print a statement number. If 4 high order bits are on, then * use decimal format (low order 12 bits . high order 4). */ if (n==0xffff) printf("-1"); else æ printf("%d",n&0x0fff); if (n&0xf000) printf(".%d",n>>12); å å listbreaks () æ int i; for (i=0; i<nbreaks; i++) æ printf("%s ",breaktabÆiÅ.bfnt->fntname); printasn(breaktabÆiÅ.bsn); if (breaktabÆiÅ.bcount!=1) printf(" (%d)Øn",breaktabÆiÅ.bcount); else putchar('Øn'); å å listit(l) char *l; æ /* process a list command */ char subcmdÆ10Å, *garbage; get_token(&l, subcmd, garbage); switch (tolower(*subcmd)) æ case 0: printf("current location: %s ",curfnt->fntname); printasn(cursn); putchar('Øn'); break; case 'a': if (curfnt->fntst!=NIL) printargs(); else if (curargs == NIL) printf("can't list args to %s because it has called a functionØn", curfnt->fntname); else æ printf("first argument address is %04xØn",curargs); printf("Æ1Å = %04x = %d, Æ2Å = %04x = %d, Æ3Å = %04x = %dØn", *curargs, *curargs, *(curargs+1), *(curargs+1), *(curargs+2), *(curargs+2) ); printf("Æ4Å = %04x = %d, Æ5Å = %04x = %d, Æ6Å = %04x = %dØn", *(curargs+3), *(curargs+3), *(curargs+4), *(curargs+4), *(curargs+5), *(curargs+5) ); å break; case 'g': printlg(globalp); break; case 'l': if (curfnt->fntst!=NIL) printlg(curfnt->fntst); else printf("local symbols not availableØn"); break; case 'm': map(); break; case 't': trace(); break; case 'b': listbreaks(); break; default: printf("illegal list subcommandØn"); å å trace () æ int i; for (i=1; i<ntraces; i++) if (tracetabÆiÅ.tsn!=0xffff) æ printf("%s ",addr2fnt(tracetabÆiÅ.taddr)->fntname); printasn(tracetabÆiÅ.tsn); printf(" calledØn"); å else printf("%s calledØn", addr2fnt(tracetabÆiÅ.taddr)->fntname); printf("%sØn",curfnt->fntname ); å compare(s, pat) char *s, *pat; æ while (*pat && tolower(*s++) == tolower(*pat)) pat++; return !*pat; å breakargs(l, fnt, sn) char **l; struct fntentry **fnt; unsigned *sn; æ /* Process arguments to break and reset commands. Determines * function (and sets fnt) and statement number (sets sn). * l is pointer to pointer to input line * * syntax: * Æfunction nameÅ ÆlineÆ.statement within lineÅÅ * if function name is ommitted, current function assumed. * if line ommitted, zero (i.e., function entry) assumed. */ char nameÆ10Å, class; int high; if (0 == (class = get_token(l, name, sn))) æ printf("arguments missingØn"); return ERROR; å else if (class==INTEGER) *fnt = curfnt; else æ if (ERROR == (*fnt = name2fnt(name))) æ printf("%s does not existØn",name); return ERROR; å if (INTEGER != get_token(l, name, sn)) *sn = 0; å if ('.' == **l) æ (*l)++; if (INTEGER != get_token(l, name, &high)) æ printf("invalid statement number %d.%sØn",*sn,name); return ERROR; å *sn ø= high<<12; å å setbreak(l) char *l; æ unsigned sn, count; struct fntentry *fnt; char nameÆ20Å; if (ERROR!=breakargs(&l,&fnt,&sn)) æ if (INTEGER != get_token(&l, name, &count)) count = 1; insertbreak(fnt,sn,count); å å resetbreak(l) char *l; æ unsigned sn; struct fntentry *fnt; if (ERROR!=breakargs(&l,&fnt,&sn)) deletebreak(fnt,sn); å map() æ /* print a load module map of the target program. */ struct fntentry *q; int i; for (i = 0, q = fntab-1; (q-1) > fntabend; q--, i++) æ if (!(i&3)) putchar('Øn'); printf("%-8s %04x ", q->fntname, q->fntaddr); å putchar('Øn'); å command() æ /* get and process commands. */ char *l, lineÆ128Å, cmdÆ10Å; int garbage; walkcount = trace_display = 0; while (1) æ cancel_char = 0; putchar('>'); l = gets(line); get_token(&l, cmd, &garbage); switch (tolower(*cmd)) æ case 'b': setbreak(l); break; case 'c': if (compare(cmd,"clear")) clearbreaks(); else goto wrong; break; case 'l': listit(l); break; case 'q': if (compare(cmd,"quit")) exit(); else goto wrong; break; case 'r': if (!compare(cmd,"run")) æ resetbreak(l); break; å movmem("Ø341Ø043Ø043Ø351",8*RST_NUM,4); /* POP H INX H x2 PCHL */ zapbreaks(); /* fall through */ case 'g': return; break; case 't': trace_display = 1; /* fall through */ case 'w': case 'u': if (INTEGER!=get_token(&l, cmd, &walkcount)) walkcount = 1; return; break; case 's': set(l); break; case '?': case 'h': help(); break; case ',': case 'd': case 'p': print(l); break; #ifdef DEBUG case 'z': debug = !debug; printf("debug %sØn", debug ? "on" : "off"); break; #endif wrong: default: printf("illegal commandØn"); å å å «eof»