|
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 - 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»