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 }