|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - 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»