Files
octal_cookie/src/machine/machine.odin
T

87 lines
1.7 KiB
Odin

package machine
// System struct, init, constants, fontset
System :: struct {
// 4kb ram
memory: [4096]u8,
// 16 general purpose 8bit registers 0 -> F
v: [16]u8,
// Call stack, up to 16, 2 byte addresses.
stack: [16]u16,
// Stack pointer
sp: u8,
// index register
i: u16,
// PC program counter
pc: u16,
// 64x32-pixel monochrome display
display: [32][64]u8,
// Keypad
keypad: [16]bool,
// -1 = no key pressed, 0-15 = key index
current_key: i16,
// Timers
delay_timer: u8,
sound_timer: u8,
}
FONT_SET := [80]u8 {
0xF0, 0x90, 0x90, 0x90, 0xF0, // 0
0x20, 0x60, 0x20, 0x20, 0x70, // 1
0xF0, 0x10, 0xF0, 0x80, 0xF0, // 2
0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3
0x90, 0x90, 0xF0, 0x10, 0x10, // 4
0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5
0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6
0xF0, 0x10, 0x20, 0x40, 0x40, // 7
0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8
0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9
0xF0, 0x90, 0xF0, 0x90, 0x90, // A
0xE0, 0x90, 0xE0, 0x90, 0xE0, // B
0xF0, 0x80, 0x80, 0x80, 0xF0, // C
0xE0, 0x90, 0x90, 0x90, 0xE0, // D
0xF0, 0x80, 0xF0, 0x80, 0xF0, // E
0xF0, 0x80, 0xF0, 0x80, 0x80 // F
}
init :: proc() -> System {
// log.info("Booting chip 8 cpu")
// Structs are zero initialized so timers, sp etc are good.
s := System { pc = 0x200 }
// load fonts into the memory
for v, i in FONT_SET {
s.memory[i] = v
}
return s
}
run_machine :: proc(s: ^System, cycles: int) {
// CPU cycles
for _ in 0..<cycles {
handle_input(s)
cycle(s)
}
}
reset_machine :: proc(s: ^System) {
s.memory = {}
s.v = {}
s.stack = {}
s.sp = 0
s.i = 0
s.pc = 0x200
s.display = {}
s.keypad = {}
s.current_key = -1
s.delay_timer = 0
s.sound_timer = 0
for v, i in FONT_SET {
s.memory[i] = v
}
}