Do some stuff
This commit is contained in:
61
cpu/core.h
61
cpu/core.h
@@ -8,27 +8,31 @@
|
||||
#include <stdint.h>
|
||||
#include "stdio.h"
|
||||
|
||||
enum Mode {
|
||||
Paused,
|
||||
Done,
|
||||
Error,
|
||||
EverySecond,
|
||||
EveryFrame,
|
||||
MaxSpeed
|
||||
};
|
||||
|
||||
#define MEM_SIZE 65535
|
||||
// Register count (register names R0 to R7)
|
||||
#define REG_COUNT 32
|
||||
#define STACK_SIZE 255
|
||||
|
||||
#define CPU_FLAG_ZERO (1 << 0)
|
||||
#define CPU_FLAG_NEGATIVE (1 << 1)
|
||||
|
||||
#define CPU_MODE_PAUSED (1 << 0)
|
||||
#define CPU_MODE_HALTED (1 << 1)
|
||||
#define CPU_MODE_ERROR (1 << 2)
|
||||
#define CPU_MODE_LOOP (1 << 3)
|
||||
#define CPU_MODE_STEP (1 << 4)
|
||||
#define CPU_MODE_SECOND (1 << 5)
|
||||
|
||||
|
||||
// CPU state
|
||||
typedef struct {
|
||||
uint8_t regs[REG_COUNT];
|
||||
uint8_t memory[MEM_SIZE];
|
||||
uint32_t pc; // Program counter
|
||||
uint32_t sp; // Stack pointer
|
||||
uint32_t stack[STACK_SIZE]; // Stack pointer
|
||||
uint32_t stack_ptr; // Stack pointer
|
||||
uint8_t flags; // Status flags
|
||||
enum Mode mode;
|
||||
uint8_t mode;
|
||||
} CPU;
|
||||
|
||||
void step(CPU *cpu);
|
||||
@@ -45,12 +49,6 @@ typedef enum {
|
||||
|
||||
BRK, // BRK - Pause CPU (halts execution until resumed)
|
||||
|
||||
INC_RN, //INC Rn - Increment register
|
||||
INC_ADDR, //INC [Addr] - Increment address
|
||||
|
||||
DEC_RN, //DEC Rn - Increment register
|
||||
DEC_ADDR, //DEC [Addr] - Increment address
|
||||
|
||||
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])
|
||||
@@ -98,15 +96,22 @@ typedef enum {
|
||||
|
||||
JMP_REL, // JMP Offset - relative jump (offset is signed)
|
||||
|
||||
INC_RN, //INC Rn - Increment register
|
||||
INC_ADDR, //INC [Addr] - Increment address
|
||||
|
||||
DEC_RN, //DEC Rn - Increment register
|
||||
DEC_ADDR, //DEC [Addr] - Increment address
|
||||
|
||||
CMP, // CMP Rn, Rm - Compare two registers (sets flags based on Rn - Rm)
|
||||
|
||||
JE, // JE Addr - Jump if equal (if zero flag set, PC = Addr)
|
||||
JE_BIT_RN, // jump relative if a given bit in a register is set
|
||||
JE_BIT_ADDR, // jump relative if a given bit in memory is set
|
||||
|
||||
JNE, // JNE Addr - Jump if not equal (if zero flag not set, PC = Addr)
|
||||
JNE_BIT_RN, // jump relative if a given bit in a register is not set
|
||||
JNE_BIT_ADDR, // jump relative if a given bit in memory is not set
|
||||
|
||||
JMP_BIT_SET_RN, // jump relative if a given bit in a register is set
|
||||
JMP_BIT_SET_ADDR, // jump relative if a given bit in memory is set
|
||||
|
||||
JMP_BIT_CLEAR_RN, // jump relative if a given bit in a register is not set
|
||||
JMP_BIT_CLEAR_ADDR, // jump relative if a given bit in memory is not set
|
||||
|
||||
JG, // JG Addr - Jump if greater (if greater flag set, PC = Addr)
|
||||
|
||||
@@ -116,17 +121,9 @@ typedef enum {
|
||||
|
||||
JLE, // JLE Addr - Jump if less or equal (if less or zero flag set, PC = Addr)
|
||||
|
||||
CALL, // CALL Addr - Call subroutine (push PC to stack, PC = Addr)
|
||||
CALL, // CALL Addr - Call subroutine (push PC, flags and registers to stack, PC = Addr)
|
||||
|
||||
RET, // RET - Return from subroutine (pop PC from stack)
|
||||
|
||||
PUSH, // PUSH Rn - Push register onto stack (stack[top] = Rn)
|
||||
|
||||
POP, // POP Rn - Pop value from stack into register (Rn = stack[top])
|
||||
|
||||
PUSHF, // PUSHF - Push flags onto stack (stack[top] = flags)
|
||||
|
||||
POPF // POPF - Pop flags from stack (flags = stack[top])
|
||||
RET, // RET - Return from subroutine (pop PC, flags and registers from stack)
|
||||
} Opcode;
|
||||
|
||||
#endif //RISCB_CORE_H
|
||||
|
Reference in New Issue
Block a user