Mercurial > hg > ede
view emulator/emu.c @ 15:26044ed126fb
minor changes to emu
author | james <jb302@eecs.qmul.ac.uk> |
---|---|
date | Thu, 30 Jan 2014 12:55:23 +0000 |
parents | 2b8eb2c86602 |
children | 256d24488e3f |
line wrap: on
line source
/* emu.c * emuulation start up and fetch/decode/execute loop */ #include <stdio.h> #include <string.h> #include "mem.h" #include "iset.h" /* instruction table */ void (*iset[256])(void) = { NOP, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, SET, CLR, SET, CLR, SET, CLR, CPL, CPL, XCSD, SFA, LAF, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, ANL, ANL, ANL, ANL, ANL, ANL, ANL, ANL, ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL, XRL, XRL, XRL, XRL, XRL, XRL, XRL, XRL, RL, RLC, RR, RRC, INC, DEC, INC, DEC, ADD, ADD, ADD, ADD, ADD, ADD, ADD, ADD, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, DJNZ, DJNZ, DJNZ, DJNZ, CJNE, CJNE, CJNE, CJNE, LJMP, LCALL, RET, RETI, SJMP, JMP, JMP, CJNE, JZ, JNZ, JC, JNC, JPO, JPE, JS, JNS, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, POP, POP, POP, POP, POP, POP, POP, POP, MUL, DIV, DA, RESERVED, IN, OUT, INT, HLT }; void boot(void) { /* set everything to zero */ memset(®isters, 0, sizeof(registers)); memset(&memory, 0, sizeof(memory)); /* load program from stdin * c must be signed since EOF is -1 on linux */ WIDE i = 0; BYTE c = getchar(); for(i ; i < 0x10000 ; i++) { /* add HLT if EOF is reached */ if ((signed char) c == EOF) { memory[i] = 0xFF; break; } memory[i] = c; c = getchar(); } } void step(void) { op = fetch(); (*iset[op])(); } void main(void) { boot(); for (;;) { step(); putchar(registers.flags); } }