//---------------------------------------------------------------------- // Simple microcode simulator // W. J. Dally - 11/26/01 //---------------------------------------------------------------------- #include #include //---------------------------------------------------------------------- // defines for microcode assembler //---------------------------------------------------------------------- #define MAXWORDS (1<<11) // maximum size of microcode #define BYTES_PER_LINE 8 //---------------------------------------------------------------------- #define PCSHIFT 3 #define CONDCOUNT 8 //------ #define OUT 0 #define JUMP 1 //---------------------------------------------------------------------- unsigned code[MAXWORDS] ; // microcode array int pc = 0 ; // current program counter int out = 0 ; // output register int f = 0 ; int a = 0 ; int b = 0 ; int n = 0 ; // cycle count //---------------------------------------------------------------------- // loads code from stdin - assumes simple hex format - 8 bytes to the line //---------------------------------------------------------------------- void load_microcode() { int i, j, a, d, done ; FILE *fp ; done = 0 ; fp=fopen("code.txt","r") ; if(fp==NULL) exit(1) ; do { j = fscanf(fp,"%x",&a) ; // get address if((j==0) || (j == EOF)) break ; for(i=0;i>7)&1) { pc = (inst & 0x7f)<<1 ; } else { out = (inst & 0x7f)<<1 ; pc = pc+1 ; } } //---------------------------------------------------------------------- void print_light(int x) { switch(x) { case 0 : printf("___") ; break ; case 1 : printf("R ") ; break ; case 2 : printf("Y ") ; break ; case 3 : printf("RY ") ; break ; case 4 : printf("G ") ; break ; case 5 : printf("GR ") ; break ; case 6 : printf("GY ") ; break ; case 7 : printf("GRY") ; break ; } } //---------------------------------------------------------------------- void print_state() { int i ; do_addr() ; printf("%2d f=%x a=%x b=%x | pc=%02x out=%02x addr=%03x inst=%02x | ", n,f,a,b,pc,out,addr,inst) ; printf("A=") ; print_light((out>>4)&7) ; printf(" B=") ; print_light((out>>1)&7) ; // for(i=0;i