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