Created
September 28, 2014 09:48
-
-
Save jwdunne/a22d5d8d8fefb5945ffc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
/* registers */ | |
#define NUM_REGS 4 | |
int regs[NUM_REGS]; | |
/* program instructions */ | |
int prog[] = { | |
0x1005, /* loadi r0 #5 */ | |
0x1101, /* loadi r1 #1 */ | |
0x2221, /* add r2 r2 r1 */ | |
0x3001, /* sub r0 r0 r1 */ | |
0x4002, /* jnz r0 #2 */ | |
0x0000 /* halt */ | |
}; | |
/* program counter */ | |
int pc = 0; | |
int fetch() | |
{ | |
return prog[pc++]; | |
} | |
int opcode = 0; | |
/* operands */ | |
int reg1 = 0; | |
int reg2 = 0; | |
int reg3 = 0; | |
int imm = 0; | |
void decode(int instr) | |
{ | |
opcode = (instr & 0xF000) >> 12; | |
reg1 = (instr & 0x0F00) >> 8; | |
reg2 = (instr & 0x00F0) >> 4; | |
reg3 = (instr & 0x000F); | |
imm = (instr & 0x00FF); | |
} | |
int running = 1; | |
void eval() | |
{ | |
switch (opcode) { | |
case 0: | |
printf("halt\n"); | |
running = 0; | |
break; | |
case 1: | |
printf("loadi r%d #%d\n", reg1, imm); | |
regs[reg1] = imm; | |
break; | |
case 2: | |
printf("add r%d r%d r%d\n", reg1, reg2, reg3); | |
regs[reg1] = regs[reg2] + regs[reg3]; | |
break; | |
case 3: | |
printf("sub r%d r%d r%d\n", reg1, reg2, reg3); | |
regs[reg1] = regs[reg2] - regs[reg3]; | |
break; | |
case 4: | |
printf("jnz r%d #%d\n", reg1, imm); | |
if (regs[reg1] != 0) { | |
pc = imm; | |
} | |
break; | |
} | |
} | |
void showregs() | |
{ | |
int i; | |
printf("regs = "); | |
for (i = 0; i < NUM_REGS; i++) | |
printf("%04X ", regs[i]); | |
printf("\n"); | |
} | |
void run() | |
{ | |
while (running) { | |
showregs(); | |
int instr = fetch(); | |
decode(instr); | |
eval(); | |
} | |
} | |
int main (int argc, const char* argv[]) | |
{ | |
run(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment