Indentation formatting fix.
This commit is contained in:
+41
-41
@@ -5,54 +5,54 @@ import "core:log"
|
|||||||
// System struct, init, constants, fontset
|
// System struct, init, constants, fontset
|
||||||
|
|
||||||
System :: struct {
|
System :: struct {
|
||||||
// 4kb ram
|
// 4kb ram
|
||||||
memory: [4096]u8,
|
memory: [4096]u8,
|
||||||
// 16 general purpose 8bit registers 0 -> F
|
// 16 general purpose 8bit registers 0 -> F
|
||||||
v: [16]u8,
|
v: [16]u8,
|
||||||
// Call stack, up to 16, 2 byte addresses.
|
// Call stack, up to 16, 2 byte addresses.
|
||||||
stack: [16]u16,
|
stack: [16]u16,
|
||||||
// Stack pointer
|
// Stack pointer
|
||||||
sp: u8,
|
sp: u8,
|
||||||
// index register
|
// index register
|
||||||
i: u16,
|
i: u16,
|
||||||
// PC program counter
|
// PC program counter
|
||||||
pc: u16,
|
pc: u16,
|
||||||
// 64x32-pixel monochrome display
|
// 64x32-pixel monochrome display
|
||||||
display: [32][64]u8,
|
display: [32][64]u8,
|
||||||
keypad: [16]bool,
|
keypad: [16]bool,
|
||||||
delay_timer: u8,
|
delay_timer: u8,
|
||||||
sound_timer: u8,
|
sound_timer: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
FONT_SET := [80]u8 {
|
FONT_SET := [80]u8 {
|
||||||
0xF0, 0x90, 0x90, 0x90, 0xF0, // 0
|
0xF0, 0x90, 0x90, 0x90, 0xF0, // 0
|
||||||
0x20, 0x60, 0x20, 0x20, 0x70, // 1
|
0x20, 0x60, 0x20, 0x20, 0x70, // 1
|
||||||
0xF0, 0x10, 0xF0, 0x80, 0xF0, // 2
|
0xF0, 0x10, 0xF0, 0x80, 0xF0, // 2
|
||||||
0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3
|
0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3
|
||||||
0x90, 0x90, 0xF0, 0x10, 0x10, // 4
|
0x90, 0x90, 0xF0, 0x10, 0x10, // 4
|
||||||
0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5
|
0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5
|
||||||
0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6
|
0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6
|
||||||
0xF0, 0x10, 0x20, 0x40, 0x40, // 7
|
0xF0, 0x10, 0x20, 0x40, 0x40, // 7
|
||||||
0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8
|
0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8
|
||||||
0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9
|
0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9
|
||||||
0xF0, 0x90, 0xF0, 0x90, 0x90, // A
|
0xF0, 0x90, 0xF0, 0x90, 0x90, // A
|
||||||
0xE0, 0x90, 0xE0, 0x90, 0xE0, // B
|
0xE0, 0x90, 0xE0, 0x90, 0xE0, // B
|
||||||
0xF0, 0x80, 0x80, 0x80, 0xF0, // C
|
0xF0, 0x80, 0x80, 0x80, 0xF0, // C
|
||||||
0xE0, 0x90, 0x90, 0x90, 0xE0, // D
|
0xE0, 0x90, 0x90, 0x90, 0xE0, // D
|
||||||
0xF0, 0x80, 0xF0, 0x80, 0xF0, // E
|
0xF0, 0x80, 0xF0, 0x80, 0xF0, // E
|
||||||
0xF0, 0x80, 0xF0, 0x80, 0x80 // F
|
0xF0, 0x80, 0xF0, 0x80, 0x80 // F
|
||||||
}
|
}
|
||||||
|
|
||||||
init :: proc() -> System {
|
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.
|
// Structs are zero initialized so timers, sp etc are good.
|
||||||
s := System { pc = 0x200 }
|
s := System { pc = 0x200 }
|
||||||
|
|
||||||
// load fonts into the memory
|
// load fonts into the memory
|
||||||
for v, i in FONT_SET {
|
for v, i in FONT_SET {
|
||||||
s.memory[i] = v
|
s.memory[i] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-14
@@ -6,22 +6,20 @@ import "core:log"
|
|||||||
import "core:os"
|
import "core:os"
|
||||||
|
|
||||||
load_rom :: proc(s: ^System, file_path: string) -> os.Error {
|
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)
|
data, read_err := os.read_entire_file(file_path, context.allocator)
|
||||||
if read_err != os.ERROR_NONE {
|
if read_err != os.ERROR_NONE {
|
||||||
log.errorf("failed to read rom %v", read_err)
|
log.errorf("failed to read rom %v", read_err)
|
||||||
return read_err
|
return read_err
|
||||||
}
|
}
|
||||||
defer delete(data)
|
defer delete(data)
|
||||||
|
|
||||||
for byte,i in data {
|
for byte,i in data {
|
||||||
s.memory[0x200 + i] = byte
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+32
-32
@@ -8,44 +8,44 @@ import chip "machine"
|
|||||||
DEV :: #config(DEV, false)
|
DEV :: #config(DEV, false)
|
||||||
|
|
||||||
main :: proc() {
|
main :: proc() {
|
||||||
context.logger = log.create_console_logger()
|
context.logger = log.create_console_logger()
|
||||||
defer log.destroy_console_logger(context.logger)
|
defer log.destroy_console_logger(context.logger)
|
||||||
|
|
||||||
when DEV {
|
when DEV {
|
||||||
track: mem.Tracking_Allocator
|
track: mem.Tracking_Allocator
|
||||||
mem.tracking_allocator_init(&track, context.allocator)
|
mem.tracking_allocator_init(&track, context.allocator)
|
||||||
defer mem.tracking_allocator_destroy(&track)
|
defer mem.tracking_allocator_destroy(&track)
|
||||||
|
|
||||||
context.allocator = mem.tracking_allocator(&track)
|
context.allocator = mem.tracking_allocator(&track)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init the Chip 8 "cpu"
|
// Init the Chip 8 "cpu"
|
||||||
system := chip.init()
|
system := chip.init()
|
||||||
|
|
||||||
// load rom, hardcoded for now, will eventually be cli or gui
|
// 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, "./2-ibm-logo.ch8")
|
||||||
err := chip.load_rom(&system, "./1-chip8-logo.ch8")
|
err := chip.load_rom(&system, "./1-chip8-logo.ch8")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("failed to load rom!")
|
panic("failed to load rom!")
|
||||||
}
|
}
|
||||||
|
|
||||||
// start the cycle
|
// start the cycle
|
||||||
chip.run_system(&system)
|
chip.run_system(&system)
|
||||||
|
|
||||||
when DEV {
|
when DEV {
|
||||||
if len(track.allocation_map) > 0 {
|
if len(track.allocation_map) > 0 {
|
||||||
log.errorf("\nMEMORY LEAKS: %v allocation(s)", len(track.allocation_map))
|
log.errorf("\nMEMORY LEAKS: %v allocation(s)", len(track.allocation_map))
|
||||||
for _, entry in track.allocation_map {
|
for _, entry in track.allocation_map {
|
||||||
log.errorf(" %v bytes @ %v", entry.size, entry.location)
|
log.errorf(" %v bytes @ %v", entry.size, entry.location)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(track.bad_free_array) > 0 {
|
if len(track.bad_free_array) > 0 {
|
||||||
log.errorf("\nBAD FREES: %v", len(track.bad_free_array))
|
log.errorf("\nBAD FREES: %v", len(track.bad_free_array))
|
||||||
|
|
||||||
for entry in track.bad_free_array {
|
for entry in track.bad_free_array {
|
||||||
log.errorf(" %v @ %v", entry.memory, entry.location)
|
log.errorf(" %v @ %v", entry.memory, entry.location)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user