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..