DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦ad457f533⟧ TextFile

    Length: 4864 (0x1300)
    Types: TextFile
    Names: »CDB.C«

Derivation

└─⟦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« 

TextFile

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