|
|
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: 4864 (0x1300)
Types: TextFile
Names: »CDB.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⟧ »CDB.C«
#include "cdb1.h"
/* Copyright (c) 1982 by J. David Kirkland, Jr. */
ucase (s) char *s; æ
while (*s = toupper(*s))
s++;
å
makeext (fname, ext) char *fname, *ext; æ
/* uppercase filename and force extension to ext */
while (*fname && (*fname != '.')) æ
*fname = toupper (*fname);
++fname;
å
*fname++ = '.';
strcpy (fname, ext);
å
buildfnt (addr, name) struct fntentry *addr; char *name; æ
FILE sym;
char afntnameÆ4ÅÆ20Å;
char *afntaddrÆ4Å;
struct fntentry *p;
int i, n;
strcpy(afntname, name);
makeext(afntname,"SYM");
if (ERROR==fopen(afntname,sym)) æ
printf("Can't open %sØn",afntname);
return ERROR;
å
p = addr;
(--p)->fntaddr = 0x0000;
fntab = p;
strcpy(p->fntname, "C.CCC");
while (1) æ
n = fscanf(sym,"%x %sØt%x %sØt%x %sØt%x %sØn",
&afntaddrÆ0Å, afntnameÆ0Å,
&afntaddrÆ1Å, afntnameÆ1Å, &afntaddrÆ2Å, afntnameÆ2Å,
&afntaddrÆ3Å, afntnameÆ3Å);
n /= 2;
for (i=0; i<n; i++) æ
(--p)->fntaddr = afntaddrÆiÅ;
strcpy(p->fntname, afntnameÆiÅ);
p->fntbreakindex = NOBREAK;
p->fntst = NIL;
p->fntfsize = -1;
å
if (n<4) break;
å
(--p)->fntaddr = 0xffff;
strcpy(p->fntname, "NEVER");
return p;
å
doargs(i, ac, av, arg) int i, ac; char **av; struct argb *arg; æ
char lineÆ80Å;
strcpy(avÆiÅ, &avÆiÅÆ2Å);
for (arg->nfiles = 0; i < ac; i++)
if (*avÆiÅ=='-') æ
i--;
break;
å
else if (0==strcmp(avÆiÅ,"0")) æ
arg->nfiles = -1;
break;
å
else if (*avÆiÅ) æ
strcpy (arg->filesÆarg->nfilesÅ, avÆiÅ);
makeext(arg->filesÆarg->nfiles++Å, CSYMEXT);
å
if (arg->nfiles==0) æ
printf("Enter %s symbol files, one per line (null line to end)Øn*",
(arg==locals) ? "local" : "global" );
for (; arg->nfiles<NFILES && getline(line,70); ) æ
strcpy (arg->filesÆarg->nfilesÅ, line);
makeext(arg->filesÆarg->nfiles++Å, CSYMEXT);
putchar('*');
å
if (arg->nfiles==NFILES)
printf("Error: too many filesØn");
else if (arg->nfiles==0)
arg->nfiles = -1;
å
return i;
å
validdrive (d) char *d; æ
if (isdigit(*d))
if ((isdigit(*++d) && *++d=='/') øø *d=='/')
d++;
else
return 0;
return !*d øø (isalpha(*d) && !*++d);
å
processargc(argc, argv, drive) int argc; char **argv, **drive; æ
int i;
locals.nfiles = globals.nfiles = 0;
strcpy (globals.filesÆ0Å, argvÆ1Å);
makeext(globals.filesÆ0Å, CSYMEXT);
strcpy (locals.filesÆ0Å, globals.filesÆ0Å);
*drive = CDB2_DRIVE;
for (i=2; i<argc; i++)
if (argvÆiÅÆ0Å=='%')
break;
else if (argvÆiÅÆ0Å=='-')
if (argvÆiÅÆ1Å=='L')
i = doargs(i, argc, argv, locals);
else if (argvÆiÅÆ1Å=='G')
i = doargs(i, argc, argv, globals);
else if (argvÆiÅÆ1Å=='D') æ
if (!*(*drive = &argvÆiÅÆ2Å))
if (++i>=argc)
printf("-d operand omittedØn");
else
*drive = argvÆiÅ;
if (**drive && !validdrive(*drive))æ
printf("Invalid -d option %sØn",*drive);
*drive = CDB2_DRIVE;
å
å
else
printf("invalid argument %sØn",argvÆiÅ);
else
printf("invalid argument %sØn",argvÆiÅ);
if (isalpha(**drive))
strcat(*drive,":");
å
cpmtinker(p) char *p; æ
int i, *a;
movmem(ORIGIN + 0x0005, p-3, 3); /* fix BDOS jumps so 0x0006 has */
a = ORIGIN + 0x0006; /* a good stack pointer */
*a = p-3;
p = ORIGIN + 0x0080; /* patch the arguments to the target */
i = *p++;
while (--i && *++p!='%') ; /* find 'em */
if (i>1)
movmem(p+1,ORIGIN + 0x0082,i);
else if (i==0)
poke(ORIGIN + 0x0081,0);
else æ
printf("Enter command line args: ");
i = 1 + getline(ORIGIN + 0x0082,126);
ucase(ORIGIN + 0x0082);
å
poke(ORIGIN + 0x0080,i);
å
statusmsg(p, glob, loc) char *p, *glob, *loc; æ
printf("top of target stack is %04x, cdb2 is at %04xØn",p-3,CDB2ADDR);
printf("globals use %04x bytes, locals use %04x bytesØn",
glob-loc, loc-p);
å
main (argc, argv) int argc; char **argv; æ
int i;
char (*f)(), *p, *drive, nameÆ20Å, ovlnameÆ20Å;
COPYRIGHT;
printf("c debugger ver 1.2Øn");
if (argc<2) æ
printf("usage: cdb target_name Æ-g Æglobal_fns ø 0ÅÅ Æ-l Ælocal_fns ø 0Å ÅØn");
printf(" Æ-d Æusr/ÅÆdriveÅ Å Æ %% Ætarget argumentsÅ ÅØn");
exit();
å
strcpy(name,argvÆ1Å);
if (ERROR==(p = buildfnt(CDB2ADDR, name)))
exit();
processargs(argc, argv, &drive);
if (ERROR==(p = buildglob(p)))
exit();
if (ERROR==(p = buildloc(p)))
exit();
cpmtinker(p);
statusmsg(p, globalp+1, localp+1);
strcpy(ovlname,drive);
strcat(ovlname,CDB2_FILE);
if (ERROR==swapin(ovlname,CDB2ADDR)) æ
printf("Couldn't swapin %sØn",ovlname);
exit();
å
makeext(name,"COM");
f = CDB2ADDR;
(*f)(name,globalp,localp,p);
å
«eof»