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++;
}

View File

@@ -10,7 +10,7 @@
#define MEM_SIZE 65535
// Register count (register names R0 to R7)
#define REG_COUNT 32
#define REG_COUNT 64
#define STACK_SIZE 255
#define CPU_FLAG_ZERO (1 << 0)
@@ -33,6 +33,7 @@ typedef struct {
uint32_t stack_ptr; // Stack pointer
uint8_t flags; // Status flags
uint8_t mode;
uint32_t cycle;
} CPU;
void step(CPU *cpu);
@@ -49,6 +50,8 @@ typedef enum {
BRK, // BRK - Pause CPU (halts execution until resumed)
HLT,
MOV_RN_IMM, // MOV Rn, Imm - Move immediate to register (Rn = Imm)
MOV_RN_RM, // MOV Rn, Rm - Move value from one register to another (Rn = Rm)
MOV_RN_ADDR, // MOV Rn, [Addr] - Load value from memory address into register (Rn = [Addr])

View File

@@ -8,29 +8,29 @@
#include <stdint.h>
#include "../cpu/core.h"
inline uint8_t write_mem32(CPU *cpu, uint32_t addr, uint32_t value);
uint8_t write_mem32(CPU *cpu, uint32_t addr, uint32_t value);
inline uint8_t write_mem16(CPU *cpu, uint32_t addr, uint16_t value);
uint8_t write_mem16(CPU *cpu, uint32_t addr, uint16_t value);
inline uint32_t read_mem32(CPU *cpu, uint32_t addr);
uint32_t read_mem32(CPU *cpu, uint32_t addr);
inline uint32_t read_address_argument(CPU *cpu);
uint32_t read_address_argument(CPU *cpu);
void read_stack(CPU *cpu);
void write_stack(CPU *cpu);
inline uint8_t read_reg_number(CPU *cpu);
uint8_t read_reg_number(CPU *cpu);
inline uint8_t read_reg(CPU *cpu, uint8_t number);
uint8_t read_reg(CPU *cpu, uint8_t number);
inline uint8_t write_reg(CPU *cpu, uint8_t number, uint8_t value);
uint8_t write_reg(CPU *cpu, uint8_t number, uint8_t value);
inline uint16_t read_mem16(CPU *cpu, uint32_t addr);
uint16_t read_mem16(CPU *cpu, uint32_t addr);
inline uint8_t read_mem(CPU *cpu, uint32_t addr);
uint8_t read_mem(CPU *cpu, uint32_t addr);
inline uint8_t write_mem(CPU *cpu, uint32_t addr, uint8_t value);
uint8_t write_mem(CPU *cpu, uint32_t addr, uint8_t value);
#endif //RISCB_MEMORY_H