Mercurial > hg > ede
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