/* VM6Fh C front-end */ #include // for debugging void mark1() { printf("here1\n"); } void mark2() { printf("here2\n"); } void mark3() { printf("here3\n"); } void mark4() { printf("here4\n"); } void mark5() { printf("Fetch-Decode-Execute Loop ...\n"); } void printvmstate(unsigned char *vmcode, unsigned int *vmstack, unsigned int *vmdata, unsigned int vpc, unsigned int vsp) { int i; printf("Current state of VM6Fh (all values in hex):\n"); printf("CODE:\n"); for(i=0;i<128;i++) printf("%4x ",*(vmcode+i)); printf("\n\nSTACK: (bottom-up)\n"); for(i=31;i>=0;i--) printf("%4x ",*(vmstack+i)); printf("\n\nDATA\n"); for(i=0;i<32;i++) printf("%4x ",*(vmdata+i)); printf("\n---------------------------\n"); printf("vpc = %8x, vsp = %8x\n",vpc,vsp); } // convert insruction to binary unsigned char assemble(const char * A) { unsigned char operand = 0; unsigned char opcode = 0; char B[8]; // buffer sscanf(A,"%s",B); if (!strcmp(B,"add")) opcode = 0; if (!strcmp(B,"sub")) opcode = 1; if (!strcmp(B,"nand")) opcode = 2; if (!strcmp(B,"push")) { opcode = 3; sscanf(A,"%s %s",B,B); operand = (unsigned char) atoi(B); } if (!strcmp(B,"pop")) { opcode = 4; sscanf(A,"%s %s",B,B); operand = (unsigned char) atoi(B); } if (!strcmp(B,"jz")) { opcode = 6; sscanf(A,"%s %s",B,B); operand = (unsigned char) atoi(B); } if (!strcmp(B,"pushc")) { opcode = 5; sscanf(A,"%s %s",B,B); operand = (unsigned char) atoi(B); } if (!strcmp(B,"ja")) { opcode = 7; // sscanf(A,"%s %s",B,B); // operand = (unsigned char) atoi(B); } opcode = opcode * 32; // shift left 5 bits return (operand | opcode); } // assemble void load(unsigned char * addr, unsigned char inst) { *addr = inst; } // each program will be passed start of vmcode, where instructions will be // stored void useprog1(unsigned char * m) { load(m++,assemble("pushc 3")); load(m++,assemble("pushc 5")); load(m++,assemble("pushc 7")); load(m++,assemble("add")); load(m++,assemble("pop 1")); load(m++,assemble("pop 2")); load(m++,assemble("pop 3")); } void useprog2(unsigned char * m) { // this program computes sum of i from 1 to 10 *m++ = assemble("pushc 10"); *m++ = assemble("pop 0"); // store counter to mem *m++ = assemble("pushc 0"); // identity for + *m++ = assemble("push 0"); // load counter from memory *m++ = assemble("add"); *m++ = assemble("pushc 1"); *m++ = assemble("push 0"); *m++ = assemble("sub"); // subtract one from counter *m++ = assemble("jz 4"); *m++ = assemble("pop 0"); // store counter back to ram *m++ = assemble("pushc 3"); *m++ = assemble("ja"); *m++ = assemble("pop 4"); *m++ = assemble("pop 4"); *m++ = assemble("pop 4"); // will cause exception, ends program } void useprog3(unsigned char *m) { // implements or as a function of nand *m++ = assemble("pushc 0"); *m++ = assemble("pushc 0"); *m++ = assemble("nand"); *m++ = assemble("pushc 1"); *m++ = assemble("pushc 1"); *m++ = assemble("nand"); *m++ = assemble("nand"); *m++ = assemble("pop 0"); *m++ = assemble("pop 1"); *m++ = assemble("pop 2"); } /* other utilities 0 - ignore*/ void p2addr(unsigned char* a, unsigned char * b) { printf("%d and %d\n",a,b); }