Skip to content

Instantly share code, notes, and snippets.

@jwdunne
Created September 28, 2014 09:48
Show Gist options
  • Save jwdunne/a22d5d8d8fefb5945ffc to your computer and use it in GitHub Desktop.
Save jwdunne/a22d5d8d8fefb5945ffc to your computer and use it in GitHub Desktop.
#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