Progress on 16b mode

This commit is contained in:
neauoire 2021-02-06 20:18:49 -08:00
parent 5d2025d7e8
commit 8c36e60a0a
2 changed files with 34 additions and 31 deletions

View File

@ -65,6 +65,8 @@ BRK ( RESET )
### Assembler ### Assembler
- Complete implementing short mode
- Implement shorthand operators
- Catch overflow/underflow - Catch overflow/underflow
- Jumps should be relative - Jumps should be relative

63
uxn.c
View File

@ -103,6 +103,9 @@ Uint8 wspeek8(void) { return cpu.wst.dat[cpu.wst.ptr - 1]; }
Uint16 rspop16(void) { return cpu.rst.dat[--cpu.rst.ptr]; } Uint16 rspop16(void) { return cpu.rst.dat[--cpu.rst.ptr]; }
void rspush16(Uint16 a) { cpu.rst.dat[cpu.rst.ptr++] = a; } void rspush16(Uint16 a) { cpu.rst.dat[cpu.rst.ptr++] = a; }
/* new flexy pop/push */
void op_brk() { setflag(FLAG_HALT, 1); } void op_brk() { setflag(FLAG_HALT, 1); }
void op_rts() { cpu.rom.ptr = rspop16(); } void op_rts() { cpu.rom.ptr = rspop16(); }
void op_lit() { cpu.literal += cpu.rom.dat[cpu.rom.ptr++]; } void op_lit() { cpu.literal += cpu.rom.dat[cpu.rom.ptr++]; }
@ -123,28 +126,35 @@ void op_and() { wspush8(wspop8() & wspop8()); }
void op_ora() { wspush8(wspop8() | wspop8()); } void op_ora() { wspush8(wspop8() | wspop8()); }
void op_rol() { wspush8(wspop8() << 1); } void op_rol() { wspush8(wspop8() << 1); }
void op_ror() { wspush8(wspop8() >> 1); } void op_ror() { wspush8(wspop8() >> 1); }
void op_add() { void op_add() { Uint8 a = wspop8(), b = wspop8(); wspush8(a + b); }
if(getflag(FLAG_SHORT)) void op_sub() { Uint8 a = wspop8(), b = wspop8(); wspush8(a - b); }
wspush16(wspop16() + wspop16()); void op_mul() { Uint8 a = wspop8(), b = wspop8(); wspush8(a * b); }
else void op_div() { Uint8 a = wspop8(), b = wspop8(); wspush8(a / b); }
wspush8(wspop8() + wspop8());
}
void op_sub() { wspush8(wspop8() - wspop8()); }
void op_mul() { wspush8(wspop8() * wspop8()); }
void op_div() { wspush8(wspop8() / wspop8()); }
void op_ldr() { wspush8(cpu.ram.dat[wspop16()]); } void op_ldr() { wspush8(cpu.ram.dat[wspop16()]); }
void op_str() { cpu.ram.dat[wspop16()] = wspop8(); } void op_str() { cpu.ram.dat[wspop16()] = wspop8(); }
void op_pek() { wspush8(cpu.rom.dat[wspop16()]); } void op_pek() { wspush8(cpu.rom.dat[wspop16()]); }
void op_pok() { printf("TODO:\n");} void op_pok() { printf("TODO:\n");}
void (*ops[])() = { void op_add16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a + b); }
void op_sub16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a - b); }
void op_mul16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a * b); }
void op_div16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a / b); }
void (*ops8[])() = {
op_brk, op_rts, op_lit, op_drp, op_dup, op_swp, op_ovr, op_rot, op_brk, op_rts, op_lit, op_drp, op_dup, op_swp, op_ovr, op_rot,
op_jmu, op_jsu, op_jmc, op_jsc, op_equ, op_neq, op_gth, op_lth, op_jmu, op_jsu, op_jmc, op_jsc, op_equ, op_neq, op_gth, op_lth,
op_and, op_ora, op_rol, op_ror, op_add, op_sub, op_mul, op_div, op_and, op_ora, op_rol, op_ror, op_add, op_sub, op_mul, op_div,
op_ldr, op_str, op_pek, op_pok, op_brk, op_brk, op_brk, op_brk op_ldr, op_str, op_pek, op_pok, op_brk, op_brk, op_brk, op_brk
}; };
Uint8 opr[][2] = { void (*ops16[])() = {
op_brk, op_rts, op_lit, op_drp, op_dup, op_swp, op_ovr, op_rot,
op_jmu, op_jsu, op_jmc, op_jsc, op_equ, op_neq, op_gth, op_lth,
op_and, op_ora, op_rol, op_ror, op_add16, op_sub16, op_mul16, op_div16,
op_ldr, op_str, op_pek, op_pok, op_brk, op_brk, op_brk, op_brk
};
Uint8 opr[][2] = { /* todo: 16 bits mode */
{0,0}, {0,0}, {0,0}, {1,0}, {0,1}, {1,1}, {0,1}, {3,3}, {0,0}, {0,0}, {0,0}, {1,0}, {0,1}, {1,1}, {0,1}, {3,3},
{2,0}, {2,0}, {2,0}, {2,0}, {2,1}, {2,1}, {2,1}, {2,1}, {2,0}, {2,0}, {2,0}, {2,0}, {2,1}, {2,1}, {2,1}, {2,1},
{1,0}, {1,0}, {1,0}, {1,0}, {2,1}, {0,0}, {0,0}, {0,0}, {1,0}, {1,0}, {1,0}, {1,0}, {2,1}, {0,0}, {0,0}, {0,0},
@ -156,17 +166,10 @@ Uint8 opr[][2] = {
void void
reset(void) reset(void)
{ {
int i; size_t i;
cpu.status = 0x00; char *cptr = (char *)&cpu;
cpu.counter = 0x00; for(i = 0; i < sizeof cpu; i++)
cpu.literal = 0x00; cptr[i] = 0;
cpu.rom.ptr = 0x00;
cpu.wst.ptr = 0x00;
cpu.rst.ptr = 0x00;
for(i = 0; i < 256; i++) {
cpu.wst.dat[i] = 0x00;
cpu.rst.dat[i] = 0x00;
}
} }
int int
@ -186,24 +189,19 @@ device1(Uint8 *read, Uint8 *write)
} }
void void
opc(Uint8 src, Uint8 *op, Uint8 *mode) opc(Uint8 src, Uint8 *op)
{ {
*op = src; *op = src;
*op &= ~(1 << 5); *op &= ~(1 << 5);
*op &= ~(1 << 6); *op &= ~(1 << 6);
*op &= ~(1 << 7); *op &= ~(1 << 7);
*mode = src;
*mode &= ~(1 << 0);
*mode &= ~(1 << 1);
*mode &= ~(1 << 2);
*mode &= ~(1 << 3);
} }
int int
eval(void) eval(void)
{ {
Uint8 instr = cpu.rom.dat[cpu.rom.ptr++]; Uint8 instr = cpu.rom.dat[cpu.rom.ptr++];
Uint8 op, opmode; Uint8 op;
/* when literal */ /* when literal */
if(cpu.literal > 0) { if(cpu.literal > 0) {
wspush8(instr); wspush8(instr);
@ -211,7 +209,7 @@ eval(void)
return 1; return 1;
} }
/* when opcode */ /* when opcode */
opc(instr, &op, &opmode); opc(instr, &op);
setflag(FLAG_SHORT, (instr >> 5) & 1); setflag(FLAG_SHORT, (instr >> 5) & 1);
if((instr >> 6) & 1) if((instr >> 6) & 1)
printf("Unused flag: %02x\n", instr); printf("Unused flag: %02x\n", instr);
@ -221,7 +219,10 @@ eval(void)
/* TODO: setflag(FLAG_C, (instr >> 7) & 1); */ /* TODO: setflag(FLAG_C, (instr >> 7) & 1); */
if(cpu.wst.ptr < opr[op][0]) if(cpu.wst.ptr < opr[op][0])
return error("Stack underflow", op); return error("Stack underflow", op);
(*ops[op])(); if(getflag(FLAG_SHORT))
(*ops16[op])();
else
(*ops8[op])();
cpu.counter++; cpu.counter++;
return 1; return 1;
} }