Something is almost working

This commit is contained in:
2025-02-08 23:23:21 +01:00
parent aaf3dfb40c
commit 45653b6372
15 changed files with 969 additions and 326 deletions

View File

@@ -9,6 +9,7 @@
// Initialize CPU
void init_cpu(CPU *cpu) {
memset(cpu, 0, sizeof(CPU));
cpu->mode = CPU_MODE_HALTED;
}
// Helper function for setting flags in the CPU (here we assume bit0 is the Zero flag,
@@ -23,7 +24,7 @@ static inline void set_flags(CPU *cpu, int32_t result) {
// Execute one cycle
void step(CPU *cpu) {
if (!(cpu->mode & (CPU_MODE_HALTED | CPU_MODE_PAUSED | CPU_MODE_ERROR))) {
if (cpu->mode & (CPU_MODE_HALTED | CPU_MODE_PAUSED | CPU_MODE_ERROR)) {
return;
}
if (cpu->pc >= MEM_SIZE) {
@@ -48,29 +49,38 @@ void step(CPU *cpu) {
cpu->mode |= CPU_MODE_PAUSED;
break;
case HLT:
//Pause CPU (for breakpoints)
cpu->mode |= CPU_MODE_HALTED;
break;
case INC_RN:
//Increment register
reg1 = read_reg_number(cpu);
temp = read_reg(cpu, reg1);
write_reg(cpu, reg1, temp + 1);
break;
case INC_ADDR:
//Increment address
addrTemp = read_address_argument(cpu);
temp = read_mem(cpu, addrTemp);
write_mem(cpu, addrTemp, temp + 1);
break;
case DEC_RN:
//Decrement register
reg1 = read_reg_number(cpu);
temp = read_reg(cpu, reg1);
write_reg(cpu, reg1, temp - 1);
break;
case DEC_ADDR:
//Decrement address
addrTemp = read_address_argument(cpu);
temp = read_mem(cpu, addrTemp);
write_mem(cpu, addrTemp, temp - 1);
break;
case MOV_RN_IMM:
//Load from immediate to register
@@ -351,7 +361,7 @@ void step(CPU *cpu) {
break;
}
case JMP_BIT_SET_RN: {
case JMP_BIT_SET_RN:
// Jump if bit in register set
reg1 = read_reg_number(cpu);
uint8_t bit = read_mem(cpu, cpu->pc++);
@@ -367,7 +377,6 @@ void step(CPU *cpu) {
if (temp & (1 << bit))
cpu->pc = newPC;
break;
}
case JMP_BIT_SET_ADDR: {
// Jump if bit in register set
@@ -482,4 +491,5 @@ void step(CPU *cpu) {
printf("Unknown opcode: %d\n", opcode);
cpu->mode |= CPU_MODE_ERROR;
}
cpu->cycle++;
}