diff src/cpu.h @ 0:7e44f7d5810b

Initial commit. CPU working well enough for simple hello world program.
author Michael Pavone <pavone@retrodev.com>
date Tue, 22 Mar 2016 22:44:02 -0700
parents
children 6204c81e2933
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cpu.h	Tue Mar 22 22:44:02 2016 -0700
@@ -0,0 +1,114 @@
+#ifndef CPU_H_
+#define CPU_H_
+
+
+typedef struct cpu cpu;
+
+typedef void (*port_write_fun) (cpu *context, uint8_t port, uint16_t value);
+typedef uint16_t (*port_read_fun) (cpu *context, uint8_t port);
+
+typedef struct {
+	port_write_fun write;
+	port_read_fun  read;
+} port_handler;
+
+
+#define MEM_READ 1
+#define MEM_WRITE 2
+
+typedef struct {
+	uint8_t  *base;
+	uint16_t start;
+	uint16_t end;
+	uint8_t  flags;
+} memory_region;
+
+
+struct cpu {
+	uint32_t cycles;
+	uint32_t clock_inc;
+	uint32_t num_mem_regions;
+	uint16_t regs[16];
+	uint16_t exception;
+	uint16_t exception_pc;
+	uint16_t exception_sr;
+	uint16_t exception_ur;
+	uint16_t vector_base;
+	
+	uint16_t prefetch;
+	
+	uint8_t  state;
+	
+	port_handler  port_handlers[16];
+	memory_region mem_regions[];
+};
+
+cpu* alloc_cpu(uint32_t clock_divider, uint32_t num_regions, memory_region *regions);
+void run_cpu(cpu *context, uint32_t target_cycle);
+
+enum {
+	LDIM,
+	LDIMH,
+	LD8,
+	LD16,
+	STR8,
+	STR16,
+	ADD,
+	ADC,
+	AND,
+	OR,
+	XOR,
+	LSL,
+	LSR,
+	ASR,
+	BCC,
+	SINGLE_SOURCE
+};
+
+enum {
+	MOVE,
+	NEG,
+	NOT,
+	CMP,
+	CALL,
+	SWAP,
+	IN,
+	OUT,
+	INI,
+	OUTI,
+	ADDI,
+	ANDI,
+	ORI,
+	LSI,
+	ASRI,
+	SINGLE_REG
+};
+
+enum {
+	RETI,
+	TRAP,
+	TRAPI,
+	GETEPC,
+	SETEPC,
+	GETESR,
+	SETESR,
+	GETEUR,
+	SETEUR,
+	GETENUM,
+	SETENUM
+};
+
+enum {
+	COND_ALWAYS,
+	COND_NEVER,
+	COND_ZERO,
+	COND_NZERO,
+	COND_NEG,
+	COND_POS,
+	COND_CARRY,
+	COND_NCARRY,
+	COND_GREATER,
+	COND_LEQ
+};
+
+#endif //CPU_H_