Mercurial > repos > simple16
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_