annotate 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
rev   line source
jb302@28 1 /* mem.h */
jb302@28 2 #ifndef MEM_H
jb302@28 3 #define MEM_H
jb302@28 4
jb302@28 5 #if defined MAIN
jb302@28 6 #define EXTERN
jb302@28 7 #else
jb302@28 8 #define EXTERN extern
jb302@28 9 #endif
jb302@28 10
jb302@28 11 /* 8 bit register encodings */
jb302@28 12 #define R0 (0 | (get_flag(0) << 3))
jb302@28 13 #define R1 (1 | (get_flag(0) << 3))
jb302@28 14 #define R2 (2 | (get_flag(0) << 3))
jb302@28 15 #define R3 (3 | (get_flag(0) << 3))
jb302@28 16 #define DPH 4
jb302@28 17 #define SPH 5
jb302@28 18 #define PCH 6
jb302@28 19 #define TMPH 7
jb302@28 20 #define DPL 12
jb302@28 21 #define SPL 13
jb302@28 22 #define PCL 14
jb302@28 23 #define TMPL 15
jb302@28 24
jb302@28 25 /* 16 bit register encodings */
jb302@28 26 #define DPTR 0
jb302@28 27 #define SP 1
jb302@28 28 #define PC 2
jb302@28 29 #define TMP 3
jb302@28 30
jb302@28 31 /* flag bits numbered from LSB -> MSB
jb302@28 32 * 7 6 5 4 3 2 1 0
jb302@28 33 * C Z AC P S OV IE BS */
jb302@28 34 #define BS 0
jb302@28 35 #define IE 1
jb302@28 36 #define OV 2
jb302@28 37 #define S 3
jb302@28 38 #define P 4
jb302@28 39 #define AC 5
jb302@28 40 #define Z 6
jb302@28 41 #define C 7
jb302@28 42
jb302@28 43 /* for getting and setting flags */
jb302@28 44 #define GBIT(byte, n) (byte & (0x01 << n) ? 1 : 0)
jb302@28 45 #define SBIT(byte, n) (byte | (0x01 << n))
jb302@28 46 #define CBIT(byte, n) (byte ^ (0x01 << n))
jb302@28 47
jb302@29 48 /* for making and breaking 16 bit values */
jb302@29 49 #define MWIDE(high, low) (low | (high << 8))
jb302@29 50 #define GHIGH(wide) ((wide >> 8) & 0xFF)
jb302@29 51 #define GLOW(wide) (wide & 0xFF)
jb302@29 52
jb302@28 53 typedef unsigned char BYTE;
jb302@28 54 typedef unsigned short WIDE;
jb302@28 55
jb302@28 56 /* these are needed for some operations */
jb302@28 57 EXTERN BYTE tmpb;
jb302@28 58 EXTERN WIDE tmpw;
jb302@28 59
jb302@28 60 EXTERN BYTE IR;
jb302@28 61 EXTERN BYTE A;
jb302@28 62 EXTERN BYTE flags;
jb302@28 63
jb302@28 64 /* 0x00 0b0000 r0 bank 0
jb302@28 65 0x01 0b0001 r1 bank 0
jb302@28 66 0x02 0b0010 r2 bank 0
jb302@28 67 0x03 0b0011 r3 bank 0
jb302@28 68 0x04 0b0100 dph
jb302@28 69 0x05 0b0101 sph
jb302@28 70 0x06 0b0110 pch
jb302@28 71 0x07 0b0111 tmph
jb302@28 72 0x08 0b1000 r0 bank 1
jb302@28 73 0x09 0b1001 r1 bank 1
jb302@28 74 0x0A 0b1010 r2 bank 1
jb302@28 75 0x0B 0b1011 r3 bank 1
jb302@28 76 0x0C 0b1100 dpl
jb302@28 77 0x0D 0b1101 spl
jb302@28 78 0x0E 0b1110 pcl
jb302@28 79 0x0F 0b1111 tmpl */
jb302@28 80 EXTERN BYTE regs[0x10];
jb302@28 81
jb302@28 82 /* 64K Von Neumann memory */
jb302@28 83 EXTERN BYTE mem[0x10000];
jb302@28 84
jb302@28 85 /* functions to dealing with flags */
jb302@28 86 EXTERN BYTE
jb302@28 87 get_flag(BYTE flag);
jb302@28 88
jb302@28 89 EXTERN void
jb302@29 90 set_flag(BYTE flag, BYTE on);
jb302@28 91
jb302@30 92 EXTERN void
jb302@30 93 set_zp(BYTE val);
jb302@30 94
jb302@30 95 /* this function a byte and returns a byte
jb302@30 96 * with zero and parity flags set or unset.
jb302@30 97 * result should be or'd with flags reg */
jb302@30 98 EXTERN BYTE
jb302@30 99 gen_flags(BYTE val);
jb302@30 100
jb302@28 101 /* functions for dealing with 16-bit registers
jb302@28 102 * access the 16 bit registers.
jb302@28 103 * register map for these function:
jb302@28 104 * 0b00 dptr
jb302@28 105 * 0b01 sp
jb302@28 106 * 0b10 pc
jb302@28 107 * 0b11 tmp */
jb302@28 108 EXTERN WIDE
jb302@28 109 get_wide(BYTE reg);
jb302@28 110
jb302@28 111 EXTERN void
jb302@28 112 set_wide(BYTE reg, WIDE val);
jb302@28 113
jb302@28 114 /* functions to fetch data at PC */
jb302@28 115 EXTERN void
jb302@28 116 inc_pc(BYTE n);
jb302@28 117
jb302@28 118 EXTERN BYTE
jb302@28 119 fetch();
jb302@28 120
jb302@28 121 EXTERN WIDE
jb302@28 122 fetch_wide();
jb302@28 123
jb302@29 124 /* for mapping the register encoding in the instruction
jb302@29 125 * set to the register address */
jb302@29 126 EXTERN BYTE
jb302@29 127 get_reg(BYTE reg);
jb302@29 128
jb302@29 129 EXTERN void
jb302@29 130 set_reg(BYTE reg, BYTE val);
jb302@29 131
jb302@30 132
jb302@28 133 #endif