Something is almost working
This commit is contained in:
16
cpu/core.c
16
cpu/core.c
@@ -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++;
|
||||
}
|
Reference in New Issue
Block a user