diff --git a/src/machine/machine.odin b/src/machine/machine.odin index 89a9cc1..376d87d 100644 --- a/src/machine/machine.odin +++ b/src/machine/machine.odin @@ -5,54 +5,54 @@ import "core:log" // 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: [16]bool, - delay_timer: u8, - sound_timer: u8, + // 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: [16]bool, + 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 + 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") + log.info("Booting chip 8 cpu") - // Structs are zero initialized so timers, sp etc are good. - s := System { pc = 0x200 } + // 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 - } + // load fonts into the memory + for v, i in FONT_SET { + s.memory[i] = v + } - return s + return s } diff --git a/src/machine/rom.odin b/src/machine/rom.odin index 98ce912..72ca4f3 100644 --- a/src/machine/rom.odin +++ b/src/machine/rom.odin @@ -6,22 +6,20 @@ import "core:log" import "core:os" load_rom :: proc(s: ^System, file_path: string) -> os.Error { - log.info("Loading rom from file") + log.info("Loading rom from file") - data, read_err := os.read_entire_file(file_path, context.allocator) - if read_err != os.ERROR_NONE { - log.errorf("failed to read rom %v", read_err) - return read_err - } - defer delete(data) + data, read_err := os.read_entire_file(file_path, context.allocator) + if read_err != os.ERROR_NONE { + log.errorf("failed to read rom %v", read_err) + return read_err + } + defer delete(data) - for byte,i in data { - s.memory[0x200 + i] = byte - } + for byte,i in data { + s.memory[0x200 + i] = byte + } - log.infof("First few bytes: %X %X %X %X", s.memory[0x200], s.memory[0x201], s.memory[0x202], s.memory[0x203]) + log.infof("First few bytes: %X %X %X %X", s.memory[0x200], s.memory[0x201], s.memory[0x202], s.memory[0x203]) - return nil + return nil } - - diff --git a/src/main.odin b/src/main.odin index 204c887..5e0415f 100644 --- a/src/main.odin +++ b/src/main.odin @@ -8,44 +8,44 @@ import chip "machine" DEV :: #config(DEV, false) main :: proc() { - context.logger = log.create_console_logger() - defer log.destroy_console_logger(context.logger) + context.logger = log.create_console_logger() + defer log.destroy_console_logger(context.logger) - when DEV { - track: mem.Tracking_Allocator - mem.tracking_allocator_init(&track, context.allocator) - defer mem.tracking_allocator_destroy(&track) + when DEV { + track: mem.Tracking_Allocator + mem.tracking_allocator_init(&track, context.allocator) + defer mem.tracking_allocator_destroy(&track) - context.allocator = mem.tracking_allocator(&track) - } + context.allocator = mem.tracking_allocator(&track) + } - // Init the Chip 8 "cpu" - system := chip.init() + // Init the Chip 8 "cpu" + system := chip.init() - // load rom, hardcoded for now, will eventually be cli or gui - // err := chip.load_rom(&system, "./2-ibm-logo.ch8") - err := chip.load_rom(&system, "./1-chip8-logo.ch8") - if err != nil { - panic("failed to load rom!") - } + // load rom, hardcoded for now, will eventually be cli or gui + // err := chip.load_rom(&system, "./2-ibm-logo.ch8") + err := chip.load_rom(&system, "./1-chip8-logo.ch8") + if err != nil { + panic("failed to load rom!") + } - // start the cycle - chip.run_system(&system) + // start the cycle + chip.run_system(&system) - when DEV { - if len(track.allocation_map) > 0 { - log.errorf("\nMEMORY LEAKS: %v allocation(s)", len(track.allocation_map)) - for _, entry in track.allocation_map { - log.errorf(" %v bytes @ %v", entry.size, entry.location) - } - } + when DEV { + if len(track.allocation_map) > 0 { + log.errorf("\nMEMORY LEAKS: %v allocation(s)", len(track.allocation_map)) + for _, entry in track.allocation_map { + log.errorf(" %v bytes @ %v", entry.size, entry.location) + } + } - if len(track.bad_free_array) > 0 { - log.errorf("\nBAD FREES: %v", len(track.bad_free_array)) + if len(track.bad_free_array) > 0 { + log.errorf("\nBAD FREES: %v", len(track.bad_free_array)) - for entry in track.bad_free_array { - log.errorf(" %v @ %v", entry.memory, entry.location) - } - } - } + for entry in track.bad_free_array { + log.errorf(" %v @ %v", entry.memory, entry.location) + } + } + } }