view emulator/mem.h @ 27:a542cd390efd

long overdue update
author james <jb302@eecs.qmul.ac.uk>
date Wed, 02 Apr 2014 14:11:50 +0100
parents 2b8eb2c86602
children
line wrap: on
line source
/*  mem.h
 *  emultor memory structure and access function definitions  */
#ifndef MEM_H
#define MEM_H

/* data types
 *  - 8 bit BYTE
 *  - 16 bit WIDE */
typedef unsigned char BYTE;
typedef unsigned short WIDE;

/* emulator memory
 *  
 * 8 bit registers:
 *   bank 0: R[0x00 - 0x02]
 *   bank 1: R[0x03 - 0x06] 
 *   DPH, DPL
 *   SPH, SPL
 *   A
 *   flags 
 *
 * 16 bit registers:
 *   DPTR
 *   SP 
 *
 * 64KB Von Neumann memory */

/* program counter stored seperately for ease of use */
WIDE PC;

struct
registers {
    BYTE R[0x06];
    /* DPTR */
    BYTE DPH;
    BYTE DPL;
    /* SP */
    BYTE SPH;
    BYTE SPL;
    BYTE A;
    /* 7 6 5  4 3 2  1  0
     * C Z AC P S OV IE BS */
    BYTE flags;
} registers;

BYTE
memory[0x10000];

/* memory access function definitions
 *  - fetch() returns BYTE
 *  - fetch_wide() returns WIDE
 *  - read_mem(WIDE) returns BYTE
 *  - write_mem(WIDE, BYTE)
 *  - get_flag(BYTE)
 *  - get_R(BYTE, BOOL) returns BYTE
 *  - set_R(BYTE, BOOL, BYTE)
 *  - get_DPTR() returns WIDE
 *  - set_DPTR(WIDE)
 *  - get_SP() returns WIDE
 *  - set_SP(WIDE) */
BYTE
fetch(void);

WIDE
fetch_wide(void);

BYTE
read_mem(WIDE addr, WIDE len);

void
write_mem(WIDE addr, WIDE len, BYTE data);

/* MCS-51 - can use bit type here */
BYTE
get_flags(BYTE flag);

BYTE
get_R(BYTE reg, BYTE bank);

void
set_R(BYTE reg, BYTE bank, BYTE data);

WIDE
get_DPTR(void);

void
set_DPTR(WIDE data);

WIDE
get_SP(void);

void
set_SP(WIDE data);

#endif