jb302@34: /* mem.h */ jb302@34: #ifndef MEM_H jb302@34: #define MEM_H jb302@34: jb302@34: #if defined MAIN jb302@34: #define EXTERN jb302@34: #else jb302@34: #define EXTERN extern jb302@34: #endif jb302@34: jb302@34: /* 8 bit register encodings */ jb302@34: #define R0 (0 | (get_flag(0) << 3)) jb302@34: #define R1 (1 | (get_flag(0) << 3)) jb302@34: #define R2 (2 | (get_flag(0) << 3)) jb302@34: #define R3 (3 | (get_flag(0) << 3)) jb302@34: #define DPH 4 jb302@34: #define SPH 5 jb302@34: #define PCH 6 jb302@34: #define TMPH 7 jb302@34: #define DPL 12 jb302@34: #define SPL 13 jb302@34: #define PCL 14 jb302@34: #define TMPL 15 jb302@34: jb302@34: /* 16 bit register encodings */ jb302@34: #define DPTR 0 jb302@34: #define SP 1 jb302@34: #define PC 2 jb302@34: #define TMP 3 jb302@34: jb302@34: /* flag bits numbered from LSB -> MSB jb302@34: * 7 6 5 4 3 2 1 0 jb302@34: * C Z AC P S OV IE BS */ jb302@34: #define BS 0 jb302@34: #define IE 1 jb302@34: #define OV 2 jb302@34: #define S 3 jb302@34: #define P 4 jb302@34: #define AC 5 jb302@34: #define Z 6 jb302@34: #define C 7 jb302@34: jb302@34: /* for getting and setting flags */ jb302@34: #define GBIT(byte, n) (byte & (0x01 << n) ? 1 : 0) jb302@34: #define SBIT(byte, n) (byte | (0x01 << n)) jb302@34: #define CBIT(byte, n) (byte ^ (0x01 << n)) jb302@34: jb302@34: /* for making and breaking 16 bit values */ jb302@34: #define MWIDE(high, low) (low | (high << 8)) jb302@34: #define GHIGH(wide) ((wide >> 8) & 0xFF) jb302@34: #define GLOW(wide) (wide & 0xFF) jb302@34: jb302@34: typedef unsigned char BYTE; jb302@34: typedef unsigned short WIDE; jb302@34: jb302@34: /* these are needed for some operations */ jb302@34: EXTERN BYTE tmpb; jb302@34: EXTERN WIDE tmpw; jb302@34: jb302@34: EXTERN BYTE IR; jb302@34: EXTERN BYTE A; jb302@34: EXTERN BYTE flags; jb302@34: jb302@34: /* 0x00 0b0000 r0 bank 0 jb302@34: 0x01 0b0001 r1 bank 0 jb302@34: 0x02 0b0010 r2 bank 0 jb302@34: 0x03 0b0011 r3 bank 0 jb302@34: 0x04 0b0100 dph jb302@34: 0x05 0b0101 sph jb302@34: 0x06 0b0110 pch jb302@34: 0x07 0b0111 tmph jb302@34: 0x08 0b1000 r0 bank 1 jb302@34: 0x09 0b1001 r1 bank 1 jb302@34: 0x0A 0b1010 r2 bank 1 jb302@34: 0x0B 0b1011 r3 bank 1 jb302@34: 0x0C 0b1100 dpl jb302@34: 0x0D 0b1101 spl jb302@34: 0x0E 0b1110 pcl jb302@34: 0x0F 0b1111 tmpl */ jb302@34: EXTERN BYTE regs[0x10]; jb302@34: jb302@34: /* 64K Von Neumann memory */ jb302@34: EXTERN BYTE mem[0x10000]; jb302@34: jb302@34: /* functions to dealing with flags */ jb302@34: EXTERN BYTE jb302@34: get_flag(BYTE flag); jb302@34: jb302@34: EXTERN void jb302@34: set_flag(BYTE flag, BYTE on); jb302@34: jb302@34: EXTERN void jb302@34: set_zp(BYTE val); jb302@34: jb302@34: /* this function a byte and returns a byte jb302@34: * with zero and parity flags set or unset. jb302@34: * result should be or'd with flags reg */ jb302@34: EXTERN BYTE jb302@34: gen_flags(BYTE val); jb302@34: jb302@34: /* functions for dealing with 16-bit registers jb302@34: * access the 16 bit registers. jb302@34: * register map for these function: jb302@34: * 0b00 dptr jb302@34: * 0b01 sp jb302@34: * 0b10 pc jb302@34: * 0b11 tmp */ jb302@34: EXTERN WIDE jb302@34: get_wide(BYTE reg); jb302@34: jb302@34: EXTERN void jb302@34: set_wide(BYTE reg, WIDE val); jb302@34: jb302@34: /* functions to fetch data at PC */ jb302@34: EXTERN void jb302@34: inc_pc(BYTE n); jb302@34: jb302@34: EXTERN BYTE jb302@34: fetch(); jb302@34: jb302@34: EXTERN WIDE jb302@34: fetch_wide(); jb302@34: jb302@34: /* for mapping the register encoding in the instruction jb302@34: * set to the register address */ jb302@34: EXTERN BYTE jb302@34: get_reg(BYTE reg); jb302@34: jb302@34: EXTERN void jb302@34: set_reg(BYTE reg, BYTE val); jb302@34: jb302@34: jb302@34: #endif