Mercurial > hg > ede
view emulator/emu.c @ 18:256d24488e3f
assembler now handles EQU, ORG and DB
author | james <jb302@eecs.qmul.ac.uk> |
---|---|
date | Sat, 22 Feb 2014 20:30:58 +0000 |
parents | 26044ed126fb |
children | 45340c2a38c5 |
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 int since EOF is -1 on linux */ WIDE i = 0; signed short int c = getchar(); for(i ; i < 0x10000 ; i++) { if (c == EOF) { break; } memory[i] = c; c = getchar(); } } void step(void) { op = fetch(); (*iset[op])(); } void main(void) { boot(); for (;;) { step(); //debug //putchar(registers.flags); putchar((BYTE)(registers.PC & 0x0F)); } }