Add highlighting, fixed len instructions and more

This commit is contained in:
2025-02-09 21:15:50 +01:00
parent 45653b6372
commit e133c2df3a
17 changed files with 753 additions and 338 deletions

View File

@@ -34,11 +34,22 @@ void step(CPU *cpu) {
cpu->mode |= CPU_MODE_HALTED;
}
}
uint8_t opcode = read_mem(cpu, cpu->pc++);
uint8_t reg1, reg2, imm, temp, temp2;
uint32_t newPC, addrTemp;
uint32_t newPC, addrTemp, oldPC;
int32_t cmpResult;
oldPC = cpu->pc;
newPC = oldPC;
uint8_t opcode = read_mem(cpu, cpu->pc++);
const uint32_t differenceAlignment = oldPC % CPU_INSTRUCTION_SIZE;
if (differenceAlignment) {
cpu->pc += differenceAlignment;
}
switch (opcode) {
case NOP:
//Don't do anything
@@ -491,5 +502,12 @@ void step(CPU *cpu) {
printf("Unknown opcode: %d\n", opcode);
cpu->mode |= CPU_MODE_ERROR;
}
if (oldPC == newPC) {
const uint32_t remainingBytes = CPU_INSTRUCTION_SIZE - (cpu->pc - oldPC);
if (remainingBytes > CPU_INSTRUCTION_SIZE) {
printf("HELP, INSTRUCTION SIZE SMALLER THAN INSTRUCTION");
}
cpu->pc += remainingBytes;
}
cpu->cycle++;
}

View File

@@ -23,13 +23,16 @@
#define CPU_MODE_STEP (1 << 4)
#define CPU_MODE_SECOND (1 << 5)
#define CPU_INSTRUCTION_SIZE 8 //Biggest instruction
// CPU state
typedef struct {
uint8_t regs[REG_COUNT];
uint8_t memory[MEM_SIZE];
uint32_t pc; // Program counter
uint32_t stack[STACK_SIZE]; // Stack pointer
uint32_t addrToLineMapper[MEM_SIZE / CPU_INSTRUCTION_SIZE];
uint32_t pc; // Program counter
uint32_t stack_ptr; // Stack pointer
uint8_t flags; // Status flags
uint8_t mode;

View File

@@ -37,9 +37,13 @@ uint32_t read_mem32(CPU *cpu, uint32_t addr) {
return read_mem16(cpu, addr) | (read_mem16(cpu, addr + 2) << 16);
}
uint32_t read_mem24(CPU *cpu, uint32_t addr) {
return read_mem16(cpu, addr) | (read_mem(cpu, addr + 2) << 16);
}
uint32_t read_address_argument(CPU *cpu) {
uint32_t out = read_mem32(cpu, cpu->pc);
cpu->pc += 4;
uint32_t out = read_mem24(cpu, cpu->pc);
cpu->pc += 3;
if (out >= MEM_SIZE) {
out = MEM_SIZE - 1;
}
@@ -58,8 +62,7 @@ void write_stack(CPU *cpu) {
for (uint32_t reg = 0; reg < REG_COUNT; reg += 4) {
uint32_t packed = cpu->regs[reg] |
((reg + 1 < REG_COUNT) ? (cpu->regs[reg + 1] << 8) : 0) |
((reg + 2 < REG_COUNT) ? (cpu->regs[reg + 2] << 16) : 0) |
((reg + 3 < REG_COUNT) ? (cpu->regs[reg + 3] << 24) : 0);
((reg + 2 < REG_COUNT) ? (cpu->regs[reg + 2] << 16) : 0);
cpu->stack[++cpu->stack_ptr] = packed;
}
cpu->stack[++cpu->stack_ptr] = cpu->flags;
@@ -83,7 +86,6 @@ void read_stack(CPU *cpu) {
cpu->regs[reg] = (packed & 0xFF);
if (reg - 1 >= 0) cpu->regs[reg - 1] = ((packed >> 8) & 0xFF);
if (reg - 2 >= 0) cpu->regs[reg - 2] = ((packed >> 16) & 0xFF);
if (reg - 3 >= 0) cpu->regs[reg - 3] = ((packed >> 24) & 0xFF);
}
// Restore PC