dasm.cpp


/* \file dsim1.cpp
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <string>
using namespace std;
#include "strtoken.h"

void parse(FILE *in, FILE *out);

int main(int argc, char *argv[])
{
	FILE *in, *out;
	string filename;
	errno_t nerr;
	if (argc<2) {
		cout << "usage: dsim1 csvfile [ outfile ]\n";
		return EXIT_FAILURE;
	}
	filename = argv[1];
	nerr = fopen_s(&in,filename.c_str(),"r");
	if (nerr) {
		cout << "file: " << filename << " not found\n";
		return EXIT_FAILURE;
	}
	if (argc<3) out = stdout;
	else {
		filename = argv[2];
		nerr = fopen_s(&out,filename.c_str(),"wt");
		if (nerr) {
			cout << "file: " << filename << " creation error\n";
			return EXIT_FAILURE;
		}
	}
	parse(in,out);
	fclose(in);
	return EXIT_SUCCESS;
}

int decode(string token)
{
	string cmd[] = { "HALT", "LW", "SW", "LI", "LUI"};
	int ncmd = 5;
	int n;
	for (n=0; n<ncmd; n++) {
		if (token.compare(cmd[n])==0) return n;
	}
	return -1;
}



void parse(FILE *in, FILE *out)
{
	char buf[512];
	char *inp, *next;
	int opcode, ra, rb, rd, field;
	int count, code, n;
	string token;
	bool done = false;
	/*
	 * Go through input file, line by line
	 */
	n = 0;
	while (!done) {
		fgets(buf,511,in);
		if (feof(in)) break;
		//fprintf(out,"%s",buf);
		if (*buf=='#') continue;
		next = buf;
		/*
		 * parse current line
		 */
		count = 0;
		opcode = ra = rb = rd = 0;
		while (next) {
			/*
			 * search for '<', and copy prior text to
			 * output stream
 */
			inp = next;
			next = strqtrm(inp,',');
			sscanf_s(inp,"%d",&field);
			//fprintf(out,"count %d field %d\n",count,field);
			switch (count) {
			case 0:
				token = inp;
				opcode = decode(token);
				//fprintf(out,"%s %d\n",token.c_str(),opcode);
				count = 1;
				break;
			case 1:
				rd = field;
				count = 2;
				break;
			case 2:
				ra = field;
				count = 3;
				break;
			case 3:
				rb = field;
				count = 4;
				break;
			default:
				break;
			}
		}
		if (opcode==0) {
			fprintf(out,"0000");
		}
		else  {
			if (opcode<0) opcode = 0;
			code = (opcode<<11) | ((rd&0x7)<<8) | (ra&0xFF);
			fprintf(out,"%04X",code);
		}
		if (n%8==7) fprintf(out,"\n");
		else fprintf(out," ");
		n++;

	}
	while (n < 32) {
		fprintf(out,"0000");
		if (n%8==7) fprintf(out,"\n");
		else fprintf(out," ");
		n++;
	}
	fprintf(out,"\n");
}


Results




Maintained by John Loomis, updated Tue Mar 01 09:09:22 2011