| ... | ... |
@@ -103,6 +103,9 @@ Uint8 wspeek8(void) { return cpu.wst.dat[cpu.wst.ptr - 1]; }
|
| 103 | 103 |
Uint16 rspop16(void) { return cpu.rst.dat[--cpu.rst.ptr]; }
|
| 104 | 104 |
void rspush16(Uint16 a) { cpu.rst.dat[cpu.rst.ptr++] = a; }
|
| 105 | 105 |
|
| 106 |
+/* new flexy pop/push */ |
|
| 107 |
+ |
|
| 108 |
+ |
|
| 106 | 109 |
void op_brk() { setflag(FLAG_HALT, 1); }
|
| 107 | 110 |
void op_rts() { cpu.rom.ptr = rspop16(); }
|
| 108 | 111 |
void op_lit() { cpu.literal += cpu.rom.dat[cpu.rom.ptr++]; }
|
| ... | ... |
@@ -123,28 +126,35 @@ void op_and() { wspush8(wspop8() & wspop8()); }
|
| 123 | 126 |
void op_ora() { wspush8(wspop8() | wspop8()); }
|
| 124 | 127 |
void op_rol() { wspush8(wspop8() << 1); }
|
| 125 | 128 |
void op_ror() { wspush8(wspop8() >> 1); }
|
| 126 |
-void op_add() {
|
|
| 127 |
- if(getflag(FLAG_SHORT)) |
|
| 128 |
- wspush16(wspop16() + wspop16()); |
|
| 129 |
- else |
|
| 130 |
- wspush8(wspop8() + wspop8()); |
|
| 131 |
-} |
|
| 132 |
-void op_sub() { wspush8(wspop8() - wspop8()); }
|
|
| 133 |
-void op_mul() { wspush8(wspop8() * wspop8()); }
|
|
| 134 |
-void op_div() { wspush8(wspop8() / wspop8()); }
|
|
| 129 |
+void op_add() { Uint8 a = wspop8(), b = wspop8(); wspush8(a + b); }
|
|
| 130 |
+void op_sub() { Uint8 a = wspop8(), b = wspop8(); wspush8(a - b); }
|
|
| 131 |
+void op_mul() { Uint8 a = wspop8(), b = wspop8(); wspush8(a * b); }
|
|
| 132 |
+void op_div() { Uint8 a = wspop8(), b = wspop8(); wspush8(a / b); }
|
|
| 135 | 133 |
void op_ldr() { wspush8(cpu.ram.dat[wspop16()]); }
|
| 136 | 134 |
void op_str() { cpu.ram.dat[wspop16()] = wspop8(); }
|
| 137 | 135 |
void op_pek() { wspush8(cpu.rom.dat[wspop16()]); }
|
| 138 | 136 |
void op_pok() { printf("TODO:\n");}
|
| 139 | 137 |
|
| 140 |
-void (*ops[])() = {
|
|
| 138 |
+void op_add16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a + b); }
|
|
| 139 |
+void op_sub16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a - b); }
|
|
| 140 |
+void op_mul16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a * b); }
|
|
| 141 |
+void op_div16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a / b); }
|
|
| 142 |
+ |
|
| 143 |
+void (*ops8[])() = {
|
|
| 141 | 144 |
op_brk, op_rts, op_lit, op_drp, op_dup, op_swp, op_ovr, op_rot, |
| 142 | 145 |
op_jmu, op_jsu, op_jmc, op_jsc, op_equ, op_neq, op_gth, op_lth, |
| 143 | 146 |
op_and, op_ora, op_rol, op_ror, op_add, op_sub, op_mul, op_div, |
| 144 | 147 |
op_ldr, op_str, op_pek, op_pok, op_brk, op_brk, op_brk, op_brk |
| 145 | 148 |
}; |
| 146 | 149 |
|
| 147 |
-Uint8 opr[][2] = {
|
|
| 150 |
+void (*ops16[])() = {
|
|
| 151 |
+ op_brk, op_rts, op_lit, op_drp, op_dup, op_swp, op_ovr, op_rot, |
|
| 152 |
+ op_jmu, op_jsu, op_jmc, op_jsc, op_equ, op_neq, op_gth, op_lth, |
|
| 153 |
+ op_and, op_ora, op_rol, op_ror, op_add16, op_sub16, op_mul16, op_div16, |
|
| 154 |
+ op_ldr, op_str, op_pek, op_pok, op_brk, op_brk, op_brk, op_brk |
|
| 155 |
+}; |
|
| 156 |
+ |
|
| 157 |
+Uint8 opr[][2] = { /* todo: 16 bits mode */
|
|
| 148 | 158 |
{0,0}, {0,0}, {0,0}, {1,0}, {0,1}, {1,1}, {0,1}, {3,3},
|
| 149 | 159 |
{2,0}, {2,0}, {2,0}, {2,0}, {2,1}, {2,1}, {2,1}, {2,1},
|
| 150 | 160 |
{1,0}, {1,0}, {1,0}, {1,0}, {2,1}, {0,0}, {0,0}, {0,0},
|
| ... | ... |
@@ -156,17 +166,10 @@ Uint8 opr[][2] = {
|
| 156 | 166 |
void |
| 157 | 167 |
reset(void) |
| 158 | 168 |
{
|
| 159 |
- int i; |
|
| 160 |
- cpu.status = 0x00; |
|
| 161 |
- cpu.counter = 0x00; |
|
| 162 |
- cpu.literal = 0x00; |
|
| 163 |
- cpu.rom.ptr = 0x00; |
|
| 164 |
- cpu.wst.ptr = 0x00; |
|
| 165 |
- cpu.rst.ptr = 0x00; |
|
| 166 |
- for(i = 0; i < 256; i++) {
|
|
| 167 |
- cpu.wst.dat[i] = 0x00; |
|
| 168 |
- cpu.rst.dat[i] = 0x00; |
|
| 169 |
- } |
|
| 169 |
+ size_t i; |
|
| 170 |
+ char *cptr = (char *)&cpu; |
|
| 171 |
+ for(i = 0; i < sizeof cpu; i++) |
|
| 172 |
+ cptr[i] = 0; |
|
| 170 | 173 |
} |
| 171 | 174 |
|
| 172 | 175 |
int |
| ... | ... |
@@ -186,24 +189,19 @@ device1(Uint8 *read, Uint8 *write) |
| 186 | 189 |
} |
| 187 | 190 |
|
| 188 | 191 |
void |
| 189 |
-opc(Uint8 src, Uint8 *op, Uint8 *mode) |
|
| 192 |
+opc(Uint8 src, Uint8 *op) |
|
| 190 | 193 |
{
|
| 191 | 194 |
*op = src; |
| 192 | 195 |
*op &= ~(1 << 5); |
| 193 | 196 |
*op &= ~(1 << 6); |
| 194 | 197 |
*op &= ~(1 << 7); |
| 195 |
- *mode = src; |
|
| 196 |
- *mode &= ~(1 << 0); |
|
| 197 |
- *mode &= ~(1 << 1); |
|
| 198 |
- *mode &= ~(1 << 2); |
|
| 199 |
- *mode &= ~(1 << 3); |
|
| 200 | 198 |
} |
| 201 | 199 |
|
| 202 | 200 |
int |
| 203 | 201 |
eval(void) |
| 204 | 202 |
{
|
| 205 | 203 |
Uint8 instr = cpu.rom.dat[cpu.rom.ptr++]; |
| 206 |
- Uint8 op, opmode; |
|
| 204 |
+ Uint8 op; |
|
| 207 | 205 |
/* when literal */ |
| 208 | 206 |
if(cpu.literal > 0) {
|
| 209 | 207 |
wspush8(instr); |
| ... | ... |
@@ -211,7 +209,7 @@ eval(void) |
| 211 | 209 |
return 1; |
| 212 | 210 |
} |
| 213 | 211 |
/* when opcode */ |
| 214 |
- opc(instr, &op, &opmode); |
|
| 212 |
+ opc(instr, &op); |
|
| 215 | 213 |
setflag(FLAG_SHORT, (instr >> 5) & 1); |
| 216 | 214 |
if((instr >> 6) & 1) |
| 217 | 215 |
printf("Unused flag: %02x\n", instr);
|
| ... | ... |
@@ -221,7 +219,10 @@ eval(void) |
| 221 | 219 |
/* TODO: setflag(FLAG_C, (instr >> 7) & 1); */ |
| 222 | 220 |
if(cpu.wst.ptr < opr[op][0]) |
| 223 | 221 |
return error("Stack underflow", op);
|
| 224 |
- (*ops[op])(); |
|
| 222 |
+ if(getflag(FLAG_SHORT)) |
|
| 223 |
+ (*ops16[op])(); |
|
| 224 |
+ else |
|
| 225 |
+ (*ops8[op])(); |
|
| 225 | 226 |
cpu.counter++; |
| 226 | 227 |
return 1; |
| 227 | 228 |
} |