view 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 source
/* 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;
}