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