Mercurial > hg > ede
diff emu/mem.c @ 28:6d32e54e5c16
emulator overhauled really, new a better memory structure
also cleaned up the file system some what.
author | james <jb302@eecs.qmul.ac.uk> |
---|---|
date | Fri, 11 Apr 2014 14:38:09 +0100 |
parents | |
children | 83e80c2c489c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emu/mem.c Fri Apr 11 14:38:09 2014 +0100 @@ -0,0 +1,67 @@ +/* mem.c + * functions for accessing emulator memory */ +#include "mem.h" + +/* get flag value + * if invalid flag is requested value is 0 */ +BYTE +get_flag(BYTE flag) { + if (flag > 7) { + return 0; + } + else { + return GBIT(flags, flag); + } +} + +/* set flag to 0 if on == 0 + * otherwise set flag to 1 */ +void +set_flag(BYTE flag, BYTE on) { + if (flag <= 7) { + switch (on) { + + case 0: + flags = CBIT(flags, flag); + + default: + flags = SBIT(flags, flag); + } + } +} + +WIDE +get_wide(BYTE reg) { + /* low | (high << 8) */ + return (regs[reg + 12] | (regs[reg + 4] << 8)); +} + +void +set_wide(BYTE reg, WIDE val) { + regs[reg + 4] = (val >> 8) & 0xFF; /* high */ + regs[reg + 12] = val & 0xFF; /* low */ +} + +void +inc_pc(BYTE n) { + if ((regs[PCL] + n) > 0xFF) { + regs[PCH]++; + } + regs[PCL] += n; +} + +BYTE +fetch(void) { + BYTE val = mem[get_wide(PC)]; + inc_pc(1); + return val; +} + +WIDE +fetch_wide(void) { + WIDE val = mem[get_wide(PC)] | (mem[get_wide(PC + 1)] << 8); + inc_pc(2); + return val; +} + +