Mercurial > hg > ede
annotate 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 |
rev | line source |
---|---|
jb302@28 | 1 /* mem.c |
jb302@28 | 2 * functions for accessing emulator memory */ |
jb302@28 | 3 #include "mem.h" |
jb302@28 | 4 |
jb302@28 | 5 /* get flag value |
jb302@28 | 6 * if invalid flag is requested value is 0 */ |
jb302@28 | 7 BYTE |
jb302@28 | 8 get_flag(BYTE flag) { |
jb302@28 | 9 if (flag > 7) { |
jb302@28 | 10 return 0; |
jb302@28 | 11 } |
jb302@28 | 12 else { |
jb302@28 | 13 return GBIT(flags, flag); |
jb302@28 | 14 } |
jb302@28 | 15 } |
jb302@28 | 16 |
jb302@28 | 17 /* set flag to 0 if on == 0 |
jb302@28 | 18 * otherwise set flag to 1 */ |
jb302@28 | 19 void |
jb302@28 | 20 set_flag(BYTE flag, BYTE on) { |
jb302@28 | 21 if (flag <= 7) { |
jb302@28 | 22 switch (on) { |
jb302@28 | 23 |
jb302@28 | 24 case 0: |
jb302@28 | 25 flags = CBIT(flags, flag); |
jb302@28 | 26 |
jb302@28 | 27 default: |
jb302@28 | 28 flags = SBIT(flags, flag); |
jb302@28 | 29 } |
jb302@28 | 30 } |
jb302@28 | 31 } |
jb302@28 | 32 |
jb302@28 | 33 WIDE |
jb302@28 | 34 get_wide(BYTE reg) { |
jb302@28 | 35 /* low | (high << 8) */ |
jb302@28 | 36 return (regs[reg + 12] | (regs[reg + 4] << 8)); |
jb302@28 | 37 } |
jb302@28 | 38 |
jb302@28 | 39 void |
jb302@28 | 40 set_wide(BYTE reg, WIDE val) { |
jb302@28 | 41 regs[reg + 4] = (val >> 8) & 0xFF; /* high */ |
jb302@28 | 42 regs[reg + 12] = val & 0xFF; /* low */ |
jb302@28 | 43 } |
jb302@28 | 44 |
jb302@28 | 45 void |
jb302@28 | 46 inc_pc(BYTE n) { |
jb302@28 | 47 if ((regs[PCL] + n) > 0xFF) { |
jb302@28 | 48 regs[PCH]++; |
jb302@28 | 49 } |
jb302@28 | 50 regs[PCL] += n; |
jb302@28 | 51 } |
jb302@28 | 52 |
jb302@28 | 53 BYTE |
jb302@28 | 54 fetch(void) { |
jb302@28 | 55 BYTE val = mem[get_wide(PC)]; |
jb302@28 | 56 inc_pc(1); |
jb302@28 | 57 return val; |
jb302@28 | 58 } |
jb302@28 | 59 |
jb302@28 | 60 WIDE |
jb302@28 | 61 fetch_wide(void) { |
jb302@28 | 62 WIDE val = mem[get_wide(PC)] | (mem[get_wide(PC + 1)] << 8); |
jb302@28 | 63 inc_pc(2); |
jb302@28 | 64 return val; |
jb302@28 | 65 } |
jb302@28 | 66 |
jb302@28 | 67 |