view emu/mem.h @ 42:792da050d8c4 tip

more dox
author james <jb302@eecs.qmul.ac.uk>
date Tue, 22 Apr 2014 14:25:14 +0100
parents c0c2e99b6bb0
children
line wrap: on
line source
/* mem.h */
#ifndef MEM_H
#define MEM_H

#if defined MAIN
#define EXTERN
#else
#define EXTERN extern
#endif

/* 8 bit register encodings */
#define R0   (0 | (get_flag(0) << 3))
#define R1   (1 | (get_flag(0) << 3))
#define R2   (2 | (get_flag(0) << 3))
#define R3   (3 | (get_flag(0) << 3))
#define DPH  4
#define SPH  5
#define PCH  6 
#define TMPH 7
#define DPL  12
#define SPL  13
#define PCL  14
#define TMPL 15

/* 16 bit register encodings */ 
#define DPTR 0 
#define SP   1 
#define PC   2 
#define TMP  3 
 
/* flag bits numbered from LSB -> MSB 
 *  7 6 5  4 3 2  1  0 
 *  C Z AC P S OV IE BS */
#define BS 0
#define IE 1
#define OV 2
#define S  3
#define P  4
#define AC 5
#define Z  6
#define C  7

/* for getting and setting flags */ 
#define GBIT(byte, n) (byte & (0x01 << n) ? 1 : 0)  
#define SBIT(byte, n) (byte | (0x01 << n)) 
#define CBIT(byte, n) (byte ^ (0x01 << n)) 

/* for making and breaking 16 bit values */
#define MWIDE(high, low) (low | (high << 8))
#define GHIGH(wide) ((wide >> 8) & 0xFF)
#define GLOW(wide) (wide & 0xFF) 

typedef unsigned char BYTE;
typedef unsigned short WIDE;

/* these are needed for some operations */
EXTERN BYTE tmpb;
EXTERN WIDE tmpw;

EXTERN BYTE IR;
EXTERN BYTE A;
EXTERN BYTE flags;

/*  0x00 0b0000 r0 bank 0
    0x01 0b0001 r1 bank 0
    0x02 0b0010 r2 bank 0
    0x03 0b0011 r3 bank 0
    0x04 0b0100 dph
    0x05 0b0101 sph
    0x06 0b0110 pch
    0x07 0b0111 tmph
    0x08 0b1000 r0 bank 1
    0x09 0b1001 r1 bank 1
    0x0A 0b1010 r2 bank 1
    0x0B 0b1011 r3 bank 1
    0x0C 0b1100 dpl
    0x0D 0b1101 spl
    0x0E 0b1110 pcl
    0x0F 0b1111 tmpl */
EXTERN BYTE regs[0x10];

/* 64K Von Neumann memory */
EXTERN BYTE mem[0x10000];

/* functions to dealing with flags */
EXTERN BYTE
get_flag(BYTE flag);

EXTERN void
set_flag(BYTE flag, BYTE on);

EXTERN void
set_zp(BYTE val);

/* this function a byte and returns a byte
 * with zero and parity flags set or unset.
 * result should be or'd with flags reg */
EXTERN BYTE
gen_flags(BYTE val);

/* functions for dealing with 16-bit registers
 * access the 16 bit registers.
 * register map for these function:
 *   0b00 dptr
 *   0b01 sp
 *   0b10 pc
 *   0b11 tmp */
EXTERN WIDE
get_wide(BYTE reg);

EXTERN void
set_wide(BYTE reg, WIDE val);

/* functions to fetch data at PC */
EXTERN void
inc_pc(BYTE n);

EXTERN BYTE
fetch();

EXTERN WIDE
fetch_wide();

/* for mapping the register encoding in the instruction
 * set to the register address */
EXTERN BYTE
get_reg(BYTE reg);

EXTERN void
set_reg(BYTE reg, BYTE val);


#endif