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++;
|
||||
}
|
@@ -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])
|
||||
|
20
cpu/memory.h
20
cpu/memory.h
@@ -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
|
||||
|
Reference in New Issue
Block a user