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