Mercurial > hg > ede
comparison emu/mem.c @ 29:83e80c2c489c
seperated working emu code from broken emu code.
wrote dbg interface
author | james <jb302@eecs.qmul.ac.uk> |
---|---|
date | Sun, 13 Apr 2014 22:42:57 +0100 |
parents | 6d32e54e5c16 |
children | c0c2e99b6bb0 |
comparison
equal
deleted
inserted
replaced
28:6d32e54e5c16 | 29:83e80c2c489c |
---|---|
17 /* set flag to 0 if on == 0 | 17 /* set flag to 0 if on == 0 |
18 * otherwise set flag to 1 */ | 18 * otherwise set flag to 1 */ |
19 void | 19 void |
20 set_flag(BYTE flag, BYTE on) { | 20 set_flag(BYTE flag, BYTE on) { |
21 if (flag <= 7) { | 21 if (flag <= 7) { |
22 switch (on) { | 22 if (on == 0x00) { |
23 | 23 flags = CBIT(flags, flag); |
24 case 0: | 24 } |
25 flags = CBIT(flags, flag); | 25 else { |
26 | 26 flags = SBIT(flags, flag); |
27 default: | |
28 flags = SBIT(flags, flag); | |
29 } | 27 } |
30 } | 28 } |
31 } | 29 } |
32 | 30 |
33 WIDE | 31 WIDE |
34 get_wide(BYTE reg) { | 32 get_wide(BYTE reg) { |
35 /* low | (high << 8) */ | 33 /* high, low */ |
36 return (regs[reg + 12] | (regs[reg + 4] << 8)); | 34 return MWIDE(regs[reg + 4], regs[reg + 12]); |
37 } | 35 } |
38 | 36 |
39 void | 37 void |
40 set_wide(BYTE reg, WIDE val) { | 38 set_wide(BYTE reg, WIDE val) { |
41 regs[reg + 4] = (val >> 8) & 0xFF; /* high */ | 39 regs[reg + 4] = GHIGH(val); /* high */ |
42 regs[reg + 12] = val & 0xFF; /* low */ | 40 regs[reg + 12] = GLOW(val); /* low */ |
43 } | 41 } |
44 | 42 |
45 void | 43 void |
46 inc_pc(BYTE n) { | 44 inc_pc(BYTE n) { |
47 if ((regs[PCL] + n) > 0xFF) { | 45 if ((regs[PCL] + n) > 0xFF) { |
57 return val; | 55 return val; |
58 } | 56 } |
59 | 57 |
60 WIDE | 58 WIDE |
61 fetch_wide(void) { | 59 fetch_wide(void) { |
62 WIDE val = mem[get_wide(PC)] | (mem[get_wide(PC + 1)] << 8); | 60 WIDE val = MWIDE(mem[get_wide(PC)], mem[get_wide(PC) + g1]); |
63 inc_pc(2); | 61 inc_pc(2); |
64 return val; | 62 return val; |
65 } | 63 } |
66 | 64 |
65 /* 0b000 = R0 | |
66 * 0b001 = R1 | |
67 * 0b010 = R2 | |
68 * 0b011 = R3 | |
69 * 0b100 = DPH | |
70 * 0b101 = DPL | |
71 * 0b110 = SPH | |
72 * 0b111 = SPL */ | |
73 BYTE | |
74 get_reg(BYTE reg) { | |
75 if (reg < 4) { | |
76 return regs[reg | (get_flag(BS) << 3)]; | |
77 } | |
78 else { | |
79 switch (reg) { | |
80 | |
81 case 4: | |
82 return regs[DPH]; | |
83 case 5: | |
84 return regs[DPL]; | |
85 case 6: | |
86 return regs[SPH]; | |
87 case 7: | |
88 return regs[SPL]; | |
89 default: | |
90 return 0; | |
91 } | |
92 } | |
93 } | |
67 | 94 |
95 void | |
96 set_reg(BYTE reg, BYTE val) { | |
97 if (reg < 4) { | |
98 regs[reg | (get_flag(BS) << 3)] = val; | |
99 } | |
100 else { | |
101 switch (reg) { | |
102 | |
103 case 4: | |
104 regs[DPH] = val; | |
105 break; | |
106 case 5: | |
107 regs[DPL] = val; | |
108 break; | |
109 case 6: | |
110 regs[SPH] = val; | |
111 break; | |
112 case 7: | |
113 regs[SPL] = val; | |
114 break; | |
115 default: | |
116 break; | |
117 } | |
118 } | |
119 } |