DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

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

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦1ef1611a3⟧ TextFile

    Length: 4453 (0x1165)
    Types: TextFile
    Notes: UNIX file
    Names: »asm.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦0a3c255ba⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »assm/asm.c« 

TextFile

#include	<stdio.h>
#include	"opcode.c"



char	line_buf[255];
unsigned int	pc;
FILE	*fopen();
FILE	*fp0, *fp1;
int	dlab, ulab;

typedef struct	label	{		/* structure for label	*/
	char *lbl;
	unsigned int lbl_add;		/* 16 bit address	*/
	unsigned int flag;		/* flag = 0, defined	*/
	} LABEL;			/* flag = 1, undefined	*/

LABEL *lbl_lst, *def_label, *udef_label;

main()
{
	register int i;
	char 	file[32];

	printf("\033[E");
	printf("\n\n8085 Cross Assembler\n\n\n\n");
	printf("Source file: ");
	scanf("%s", file);

	if((fp0 = fopen(file, "r")) == NULL) {
		panic("\n\7File not found\n\7\n");
	}

	def_label = (LABEL *) malloc(3000 * sizeof (LABEL));	/* 3000 total */
	udef_label = (LABEL *) malloc(1000 * sizeof (LABEL));	/* 1000 here  */


	pass1();
	printf("\n\n# labels = %d, pc = %d\n", dlab, pc);
	for(i = 0; i < dlab; i++) {
		printf("Label = |%s|, value = |%d|\n", def_label[i].lbl,
		def_label[i].lbl_add);
	}
	pass2();

	printf("Assembly complete.\n");
	fclose(fp0);
	
}

/*
 * Pass 1 code
 */

pass1()

{
	register int i,ii;

	pc = 0;		/* initial PC counter			*/
	dlab = 0;	/* no defined labels			*/
	ulab = 0;	/* no undefined labels			*/

	for(;;) {
		ii = get_line();
		if (ii == 0 && line_buf[0] != 0) {
			printf("line point = %d\n", &line_buf[0]);
			if (parse(&line_buf[0]) == 0xFF)	
				return(0);	/* done - return	*/
			printf("line point = %d\n", &line_buf[0]); 
			printf("%s\n", line_buf); 
		}
	}
}

/*
 * Pass 2 code
 */

pass2()

{

}

/*
 * get a  line from the file.
 */
get_line()
{
	char c, *tmp;
	register int	cnt;

	tmp = &line_buf[0];			/* point tmp @ buffer	*/
	cnt = 0;
	*tmp = 0;				/* set NULL at start	*/
	while (( c=getc(fp0)) != EOF) {
		if(((c == 0x3B) || (c == 0x0A))  && (cnt == 0)) {
			if(c == 0x3B)
				while((c=getc(fp0)) != EOF) {
					if(c == 0x0A)
						return(1);
				}
			return(1);
		}
		cnt++;				/* bump char count	*/
		if(c == 0x3B ) {		/* chuck rest of line	*/
			while ((c = getc(fp0)) != EOF) {
				if(c == 0x0A) {
					*tmp++ = 0;
					return(0);
				}
			}
			panic("Pass 1: Unexpected EOF\n");
		}
		if ( c == 0x0A ) {
			*tmp++ = 0;
			return(0);	/* got line - return		*/
		}
		*tmp++ = c;		/* c into buf & inc pointer	*/
					/* bump counter			*/
		if (cnt == 255)
			panic("Pass 1: Bogus source file!\n");
	}
	panic("Pass 1: Unexpected EOF\n");
}

/*
 * parse the line 
 */

parse(buf)
char *buf;

{
	int i, cnt, end;
	char	opcd[6];	/* temp opcode buffer		*/
/*	char	param[20];	 temp parameter buffer	*/

	printf("Parse: %d,  %s\n", buf, buf);
	i = 0;
	cnt = 0;
	end = 0;
	if (*buf !=0x20 && *buf != 0x09)
		buf = get_label(i, buf);
	while((*buf == 0x20) || (*buf == 0x09))
		*buf++;
	printf("PARSE 2:%s\n", buf);
	buf = get_op(buf, &end);		/* get opcode	*/
						/* and necessary param. */
	if(end == 0xFF)
		return(0xFF);

	printf("End Parse:\n");
	return(0);
}

/*
 * Get a defined label - i.e. first label in a line.
 */
get_label(i, buf)
int i;
char *buf;
{
	char tmp[10];			/* temp label storage	*/

	i = 0;
	printf("Label: %d \n", buf);
	while(*buf != 0x20 && *buf != 0x09) {
		tmp[i] = *buf++;
		if (i == 11)
			panic("get_label: label error\n");
		i++;
	}

	tmp[i] = 0;
	add_d(&tmp[0]);
	def_label[dlab].lbl_add = pc;	/* set value to current PC	*/
	def_label[dlab].flag = 0;	/* show as defined		*/
	

	printf("End Label: %s\n" ,def_label[dlab].lbl);
	dlab++;				/* bump count	*/
	printf(" return now\n");
	return(buf);
}

/*]
 * add a defined label to structure
 */

add_d(tmp)
char *tmp;
{

/* check for overflow		*/

	def_label[dlab].lbl = (char *) malloc((unsigned) strlen(tmp) + 1);
	strcpy(def_label[dlab].lbl, tmp);

}

/*
 * get opcode
 */

get_op(buf, endflg)
char *buf;
int *endflg;

{
	register int i;
	char tmpop[6];

	i = 0;
	printf("OP: point = %d buf = |%s|\n", buf, buf);
	while(*buf != 0x00 && *buf != 0x20 && *buf != 0x09 && *buf !=0x0A) {
		tmpop[i] = *buf++;
		if (i == 6) {
			printf("tmp op = |%s| i = %d b point = %d\n", tmpop
			, i, buf);
			panic("get_op: op error\n");
		}
		i++;
	}
	tmpop[i] = 0;

	printf("tmpop = %s\n", tmpop);

	for(i = 0; ; i++) {
		if (strcmp(op_list[i].mn, "LAST") == 0)	/* bad opcode? */
			panic("s/w error\n");
		if (strcmp(op_list[i].mn, &tmpop[0]) == 0) {
			printf("Match = %x\n", op_list[i].val);

			pc = pc + (op_list[i].param & 0x03);
			*endflg = op_list[i].param;
			return(buf);
		}
	}

	printf("Why here? %d\n", i);
	
	return(buf);
}



/*
 * Error exit.
 */

panic(msg)
char	*msg;
{
	printf("%s", msg);
	exit(1);
}