more sample roms.

more coverage.
This commit is contained in:
tmerritt committed 2024-11-01 09:41:20 -04:00
1 parent 13ceb61c97
commit 00c75a82e5
12 files changed
+232 -318

No files matched your search

+2 -2
View File
@@ -118,8 +118,8 @@
<body>
<div id="root"></div>
<script>
var data = {"files":[{"path":["/","home","tmerritt","Projects","chip8_toy","gemma","src","chip8","computer.rs"],"content":"use log::{debug};\nuse crate::chip8::delay_timer::DelayTimer;\nuse crate::chip8::keypad::Keypad;\nuse crate::chip8::quirk_modes::QuirkMode;\nuse crate::chip8::registers::Chip8Registers;\nuse crate::chip8::sound_timer::SoundTimer;\nuse crate::chip8::stack::Chip8Stack;\n\nuse super::{\n cpu_states::Chip8CpuStates, instructions::Chip8CpuInstructions, system_memory::Chip8SystemMemory, video::Chip8Video,\n};\n\n#[derive(Clone)]\npub struct Chip8Computer {\n pub num_cycles: i32,\n pub memory: Chip8SystemMemory,\n pub registers: Chip8Registers,\n pub sound_timer: SoundTimer,\n pub delay_timer: DelayTimer,\n pub video_memory: Chip8Video,\n pub state: Chip8CpuStates,\n pub keypad: Keypad,\n pub stack: Chip8Stack,\n pub quirk_mode: QuirkMode\n}\nimpl Default for Chip8Computer {\n fn default() -\u003e Self {\n Self {\n num_cycles: 0,\n memory: Chip8SystemMemory::default(),\n video_memory: Chip8Video::default(),\n registers: Chip8Registers::default(),\n sound_timer: SoundTimer::new(),\n delay_timer: DelayTimer::new(),\n state: Chip8CpuStates::default(),\n keypad: Keypad::default(),\n stack: Chip8Stack::default(),\n quirk_mode: QuirkMode::default()\n }\n }\n}\n\nimpl Chip8Computer {\n pub fn reset(\u0026mut self) {\n self.video_memory.reset();\n self.num_cycles = 0;\n self.registers.reset();\n self.delay_timer.reset();\n self.sound_timer.reset();\n self.stack.reset();\n self.memory.reset();\n self.quirk_mode = QuirkMode::Chip8;\n }\n\n pub fn dump_keypad_to_string(\u0026self) -\u003e String {\n self.keypad.format_as_string()\n }\n\n pub fn dump_registers_to_string(\u0026self) -\u003e String {\n self.registers.format_as_string()\n }\n\n pub fn dump_video_to_string(\u0026self) -\u003e String {\n self.clone().video_memory.format_as_string()\n }\n\n pub fn new_with_program(new_program: Vec\u003cu16\u003e) -\u003e Self {\n let mut working = Chip8Computer::new();\n\n for (i, \u0026word) in new_program.iter().enumerate() {\n let high = (word \u003e\u003e 8) as u8;\n let low = (word \u0026 0xff) as u8;\n let base_offset = (i * 2) as u16;\n working.memory.poke(base_offset, high);\n working.memory.poke(base_offset + 1, low);\n }\n working\n }\n pub fn new() -\u003e Self {\n Chip8Computer::default()\n }\n\n pub fn load_bytes_to_memory(\u0026mut self, offset: u16, to_load: \u0026Vec\u003cu8\u003e) {\n let total_len = to_load.len() as u16;\n for current_index in 0..total_len {\n let new_value = to_load[current_index as usize];\n let new_location = current_index + offset;\n self.memory.poke(new_location, new_value);\n }\n self.registers.set_pc(offset);\n }\n\n pub fn step_system(\u0026mut self) -\u003e \u0026mut Chip8Computer {\n debug!(\"Stepping System 1 Step\");\n // read the next instruction\n let local_memory = \u0026self.memory;\n\n // let mut working_instruction: u16 = 0b0000000000000000;\n let start_pc = self.registers.peek_pc();\n let high_byte = (local_memory.peek(start_pc) as u16).rotate_left(8);\n let low_byte = local_memory.peek(start_pc + 1) as u16;\n let result = high_byte | low_byte;\n let decoded_instruction =\n Chip8CpuInstructions::decode(result, \u0026self.quirk_mode);\n // todo: THIS IS BAD AND IS A SIDE EFFECT\n decoded_instruction.execute(self);\n\n match self.state {\n Chip8CpuStates::WaitingForInstruction =\u003e {\n self.sound_timer.tick();\n self.delay_timer.tick();\n self.video_memory.tick();\n self.num_cycles += 1;\n }\n Chip8CpuStates::WaitingForKey =\u003e {\n debug!(\"waiting for a key press...\");\n }\n _ =\u003e {}\n }\n self\n }\n}\n","traces":[{"line":27,"address":[1102102,1101600],"length":1,"stats":{"Line":3}},{"line":30,"address":[543040],"length":1,"stats":{"Line":8}},{"line":31,"address":[329986],"length":1,"stats":{"Line":7}},{"line":32,"address":[707215],"length":1,"stats":{"Line":7}},{"line":33,"address":[791326],"length":1,"stats":{"Line":4}},{"line":34,"address":[543149],"length":1,"stats":{"Line":7}},{"line":35,"address":[791356],"length":1,"stats":{"Line":4}},{"line":36,"address":[662975],"length":1,"stats":{"Line":7}},{"line":37,"address":[662990],"length":1,"stats":{"Line":4}},{"line":38,"address":[40316453],"length":1,"stats":{"Line":7}},{"line":44,"address":[3514832],"length":1,"stats":{"LLine truncated
var previousData = {"files":[{"path":["/","home","tmerritt","Projects","chip8_toy","gemma","src","chip8","computer.rs"],"content":"use log::{debug};\nuse crate::chip8::delay_timer::DelayTimer;\nuse crate::chip8::keypad::Keypad;\nuse crate::chip8::quirk_modes::QuirkMode;\nuse crate::chip8::registers::Chip8Registers;\nuse crate::chip8::sound_timer::SoundTimer;\nuse crate::chip8::stack::Chip8Stack;\n\nuse super::{\n cpu_states::Chip8CpuStates, instructions::Chip8CpuInstructions, system_memory::Chip8SystemMemory, video::Chip8Video,\n};\n\n#[derive(Clone)]\npub struct Chip8Computer {\n pub num_cycles: i32,\n pub memory: Chip8SystemMemory,\n pub registers: Chip8Registers,\n pub sound_timer: SoundTimer,\n pub delay_timer: DelayTimer,\n pub video_memory: Chip8Video,\n pub state: Chip8CpuStates,\n pub keypad: Keypad,\n pub stack: Chip8Stack,\n pub quirk_mode: QuirkMode\n}\nimpl Default for Chip8Computer {\n fn default() -\u003e Self {\n Self {\n num_cycles: 0,\n memory: Chip8SystemMemory::default(),\n video_memory: Chip8Video::default(),\n registers: Chip8Registers::default(),\n sound_timer: SoundTimer::new(),\n delay_timer: DelayTimer::new(),\n state: Chip8CpuStates::default(),\n keypad: Keypad::default(),\n stack: Chip8Stack::default(),\n quirk_mode: QuirkMode::default()\n }\n }\n}\n\nimpl Chip8Computer {\n pub fn reset(\u0026mut self) {\n self.video_memory.reset();\n self.num_cycles = 0;\n self.registers.reset();\n self.delay_timer.reset();\n self.sound_timer.reset();\n self.stack.reset();\n self.memory.reset();\n self.quirk_mode = QuirkMode::Chip8;\n }\n\n pub fn dump_keypad_to_string(\u0026self) -\u003e String {\n self.keypad.format_as_string()\n }\n\n pub fn dump_registers_to_string(\u0026self) -\u003e String {\n self.registers.format_as_string()\n }\n\n pub fn dump_video_to_string(\u0026self) -\u003e String {\n self.clone().video_memory.format_as_string()\n }\n\n pub fn new_with_program(new_program: Vec\u003cu16\u003e) -\u003e Self {\n let mut working = Chip8Computer::new();\n\n for (i, \u0026word) in new_program.iter().enumerate() {\n let high = (word \u003e\u003e 8) as u8;\n let low = (word \u0026 0xff) as u8;\n let base_offset = (i * 2) as u16;\n working.memory.poke(base_offset, high);\n working.memory.poke(base_offset + 1, low);\n }\n working\n }\n pub fn new() -\u003e Self {\n Chip8Computer::default()\n }\n\n pub fn load_bytes_to_memory(\u0026mut self, offset: u16, to_load: \u0026Vec\u003cu8\u003e) {\n let total_len = to_load.len() as u16;\n for current_index in 0..total_len {\n let new_value = to_load[current_index as usize];\n let new_location = current_index + offset;\n self.memory.poke(new_location, new_value);\n }\n self.registers.set_pc(offset);\n }\n\n pub fn step_system(\u0026mut self) -\u003e \u0026mut Chip8Computer {\n debug!(\"Stepping System 1 Step\");\n // read the next instruction\n let local_memory = \u0026self.memory;\n\n // let mut working_instruction: u16 = 0b0000000000000000;\n let start_pc = self.registers.peek_pc();\n let high_byte = (local_memory.peek(start_pc) as u16).rotate_left(8);\n let low_byte = local_memory.peek(start_pc + 1) as u16;\n let result = high_byte | low_byte;\n let decoded_instruction =\n Chip8CpuInstructions::decode(result, \u0026self.quirk_mode);\n // todo: THIS IS BAD AND IS A SIDE EFFECT\n decoded_instruction.execute(self);\n\n match self.state {\n Chip8CpuStates::WaitingForInstruction =\u003e {\n self.sound_timer.tick();\n self.delay_timer.tick();\n self.video_memory.tick();\n self.num_cycles += 1;\n }\n Chip8CpuStates::WaitingForKey =\u003e {\n debug!(\"waiting for a key press...\");\n }\n _ =\u003e {}\n }\n self\n }\n}\n","traces":[{"line":27,"address":[707654,707152],"length":1,"stats":{"Line":6}},{"line":30,"address":[1101632],"length":1,"stats":{"Line":5}},{"line":31,"address":[543054],"length":1,"stats":{"Line":5}},{"line":32,"address":[791263],"length":1,"stats":{"Line":5}},{"line":33,"address":[3514430],"length":1,"stats":{"Line":6}},{"line":34,"address":[1101741],"length":1,"stats":{"Line":4}},{"line":35,"address":[3514460],"length":1,"stats":{"Line":6}},{"line":36,"address":[40316431],"length":1,"stats":{"Line":5}},{"line":37,"address":[40316446],"length":1,"stats":{"Line":6}},{"line":38,"address":[662021],"length":1,"stats":{"Line":4}},{"line":44,"address":[330432],"length":1,Line truncated
var data = {"files":[{"path":["/","home","tmerritt","Projects","trevors_chip8_toy","gemma","src","bin","speedtest.rs"],"content":"use std::fs::File;\nuse std::io::Read;\nuse std::ops::Add;\nuse std::path::Path;\nuse std::time::{Duration, Instant};\nuse gemma::chip8::computer::Chip8Computer;\nuse gemma::chip8::computer_manager::Chip8ComputerManager;\n\nconst ROM_ROOT: \u0026str = \"resources/roms\";\n\nfn main() {\n let mut x = Chip8ComputerManager::new();\n\n let mut buffer = Vec::new();\n let mut input_file = File::open(Path::new(\u0026(ROM_ROOT.to_string() + \"/mandelbrot_bench.ch8\"))).expect(\"derp\");\n input_file.read_to_end(\u0026mut buffer).expect(\"unable to read file\");\n x.load_new_program_to_system_memory((\u0026*buffer).into());\n\n for _ in 0..10 {\n let start_time = Instant::now();\n let mut num_cycles = 0;\n // how many instructions in 10s.\n let end_time = start_time.add(Duration::from_secs(10));\n while (Instant::now().le(\u0026end_time)) {\n num_cycles += 1;\n x.step();\n }\n\n let num = num_cycles.to_string()\n .as_bytes()\n .rchunks(3)\n .rev()\n .map(std::str::from_utf8)\n .collect::\u003cResult\u003cVec\u003c\u0026str\u003e, _\u003e\u003e()\n .unwrap()\n .join(\",\"); // separator\n\n\n let num_ips = num_cycles / 1000000;\n println!(\"Completed at {num_ips} Mips.\");\n }\n}","traces":[{"line":11,"address":[237008,238973,239038],"length":1,"stats":{"Line":0}},{"line":12,"address":[237030],"length":1,"stats":{"Line":0}},{"line":14,"address":[237055],"length":1,"stats":{"Line":0}},{"line":15,"address":[237174,237106],"length":1,"stats":{"Line":0}},{"line":16,"address":[237426],"length":1,"stats":{"Line":0}},{"line":17,"address":[237519],"length":1,"stats":{"Line":0}},{"line":19,"address":[237607],"length":1,"stats":{"Line":0}},{"line":20,"address":[237756,237832],"length":1,"stats":{"Line":0}},{"line":21,"address":[237861],"length":1,"stats":{"Line":0}},{"line":23,"address":[237877],"length":1,"stats":{"Line":0}},{"line":24,"address":[237955],"length":1,"stats":{"Line":0}},{"line":25,"address":[239012,238986,238059],"length":1,"stats":{"Line":0}},{"line":26,"address":[239033,238993],"length":1,"stats":{"Line":0}},{"line":29,"address":[238094,238484,238052,238185,238551],"length":1,"stats":{"Line":0}},{"line":39,"address":[238698,238862],"length":1,"stats":{"Line":0}},{"line":40,"address":[238882],"length":1,"stats":{"Line":0}}],"covered":0,"coverable":16},{"path":["/","home","tmerritt","Projects","trevors_chip8_toy","gemma","src","chip8","computer.rs"],"content":"use log::{debug};\nuse crate::chip8::delay_timer::DelayTimer;\nuse crate::chip8::keypad::Keypad;\nuse crate::chip8::quirk_modes::QuirkMode;\nuse crate::chip8::registers::Chip8Registers;\nuse crate::chip8::sound_timer::SoundTimer;\nuse crate::chip8::stack::Chip8Stack;\n\nuse super::{\n cpu_states::Chip8CpuStates, instructions::Chip8CpuInstructions, system_memory::Chip8SystemMemory, video::Chip8Video,\n};\n\n#[derive(Clone)]\npub struct Chip8Computer {\n pub num_cycles: i32,\n pub memory: Chip8SystemMemory,\n pub registers: Chip8Registers,\n pub sound_timer: SoundTimer,\n pub delay_timer: DelayTimer,\n pub video_memory: Chip8Video,\n pub state: Chip8CpuStates,\n pub keypad: Keypad,\n pub stack: Chip8Stack,\n pub quirk_mode: QuirkMode\n}\nimpl Default for Chip8Computer {\n fn default() -\u003e Self {\n Self {\n num_cycles: 0,\n memory: Chip8SystemMemory::default(),\n video_memory: Chip8Video::default(),\n registers: Chip8Registers::default(),\n sound_timer: SoundTimer::new(),\n delay_timer: DelayTimer::new(),\n state: Chip8CpuStates::default(),\n keypad: Keypad::default(),\n stack: Chip8Stack::default(),\n quirk_mode: QuirkMode::default()\n }\n }\n}\n\nimpl Chip8Computer {\n pub fn reset(\u0026mut self) {\n self.video_memory.reset();\n self.num_cycles = 0;\n self.registers.reset();\n self.delay_timer.reset();\n self.sound_timer.reset();\n self.stack.reset();\n self.memory.reset();\n self.quirk_mode = QuirkMode::Chip8;\n }\n\n pub fn dump_keypad_to_string(\u0026self) -\u003e String {\n self.keypad.format_as_string()\n }\n\n pub fn dump_registers_to_string(\u0026self) -\u003e String {\n self.registers.format_as_string()\n }\n\n pub fn dump_video_to_string(\u0026self) -\u003e String {\n self.clone().video_memory.format_as_string()\n }\n\n pub fn new_with_program(new_program: Vec\u003cu16\u003e) -\u003e Self {\n let mut working = Chip8Computer::new();\n\n for (i, \u0026word) in new_program.iter().enumerate() {\n let high = (word \u003e\u003e 8) as u8;\n Line truncated
var previousData = {"files":[{"path":["/","home","tmerritt","Projects","trevors_chip8_toy","gemma","src","bin","speedtest.rs"],"content":"use std::fs::File;\nuse std::io::Read;\nuse std::ops::Add;\nuse std::path::Path;\nuse std::time::{Duration, Instant};\nuse gemma::chip8::computer::Chip8Computer;\nuse gemma::chip8::computer_manager::Chip8ComputerManager;\n\nconst ROM_ROOT: \u0026str = \"resources/roms\";\n\nfn main() {\n let mut x = Chip8ComputerManager::new();\n\n let mut buffer = Vec::new();\n let mut input_file = File::open(Path::new(\u0026(ROM_ROOT.to_string() + \"/mandelbrot_bench.ch8\"))).expect(\"derp\");\n input_file.read_to_end(\u0026mut buffer).expect(\"unable to read file\");\n x.load_new_program_to_system_memory((\u0026*buffer).into());\n\n for _ in 0..10 {\n let start_time = Instant::now();\n let mut num_cycles = 0;\n // how many instructions in 10s.\n let end_time = start_time.add(Duration::from_secs(10));\n while (Instant::now().le(\u0026end_time)) {\n num_cycles += 1;\n x.step();\n }\n\n let num = num_cycles.to_string()\n .as_bytes()\n .rchunks(3)\n .rev()\n .map(std::str::from_utf8)\n .collect::\u003cResult\u003cVec\u003c\u0026str\u003e, _\u003e\u003e()\n .unwrap()\n .join(\",\"); // separator\n\n\n let num_ips = num_cycles / 1000000;\n println!(\"Completed at {num_ips} Mips.\");\n }\n}","traces":[{"line":11,"address":[238973,237008,239038],"length":1,"stats":{"Line":0}},{"line":12,"address":[237030],"length":1,"stats":{"Line":0}},{"line":14,"address":[237055],"length":1,"stats":{"Line":0}},{"line":15,"address":[237174,237106],"length":1,"stats":{"Line":0}},{"line":16,"address":[237426],"length":1,"stats":{"Line":0}},{"line":17,"address":[237519],"length":1,"stats":{"Line":0}},{"line":19,"address":[237607],"length":1,"stats":{"Line":0}},{"line":20,"address":[237832,237756],"length":1,"stats":{"Line":0}},{"line":21,"address":[237861],"length":1,"stats":{"Line":0}},{"line":23,"address":[237877],"length":1,"stats":{"Line":0}},{"line":24,"address":[237955],"length":1,"stats":{"Line":0}},{"line":25,"address":[238986,238059,239012],"length":1,"stats":{"Line":0}},{"line":26,"address":[238993,239033],"length":1,"stats":{"Line":0}},{"line":29,"address":[238094,238551,238185,238484,238052],"length":1,"stats":{"Line":0}},{"line":39,"address":[238862,238698],"length":1,"stats":{"Line":0}},{"line":40,"address":[238882],"length":1,"stats":{"Line":0}}],"covered":0,"coverable":16},{"path":["/","home","tmerritt","Projects","trevors_chip8_toy","gemma","src","chip8","computer.rs"],"content":"use log::{debug};\nuse crate::chip8::delay_timer::DelayTimer;\nuse crate::chip8::keypad::Keypad;\nuse crate::chip8::quirk_modes::QuirkMode;\nuse crate::chip8::registers::Chip8Registers;\nuse crate::chip8::sound_timer::SoundTimer;\nuse crate::chip8::stack::Chip8Stack;\n\nuse super::{\n cpu_states::Chip8CpuStates, instructions::Chip8CpuInstructions, system_memory::Chip8SystemMemory, video::Chip8Video,\n};\n\n#[derive(Clone)]\npub struct Chip8Computer {\n pub num_cycles: i32,\n pub memory: Chip8SystemMemory,\n pub registers: Chip8Registers,\n pub sound_timer: SoundTimer,\n pub delay_timer: DelayTimer,\n pub video_memory: Chip8Video,\n pub state: Chip8CpuStates,\n pub keypad: Keypad,\n pub stack: Chip8Stack,\n pub quirk_mode: QuirkMode\n}\nimpl Default for Chip8Computer {\n fn default() -\u003e Self {\n Self {\n num_cycles: 0,\n memory: Chip8SystemMemory::default(),\n video_memory: Chip8Video::default(),\n registers: Chip8Registers::default(),\n sound_timer: SoundTimer::new(),\n delay_timer: DelayTimer::new(),\n state: Chip8CpuStates::default(),\n keypad: Keypad::default(),\n stack: Chip8Stack::default(),\n quirk_mode: QuirkMode::default()\n }\n }\n}\n\nimpl Chip8Computer {\n pub fn reset(\u0026mut self) {\n self.video_memory.reset();\n self.num_cycles = 0;\n self.registers.reset();\n self.delay_timer.reset();\n self.sound_timer.reset();\n self.stack.reset();\n self.memory.reset();\n self.quirk_mode = QuirkMode::Chip8;\n }\n\n pub fn dump_keypad_to_string(\u0026self) -\u003e String {\n self.keypad.format_as_string()\n }\n\n pub fn dump_registers_to_string(\u0026self) -\u003e String {\n self.registers.format_as_string()\n }\n\n pub fn dump_video_to_string(\u0026self) -\u003e String {\n self.clone().video_memory.format_as_string()\n }\n\n pub fn new_with_program(new_program: Vec\u003cu16\u003e) -\u003e Self {\n let mut working = Chip8Computer::new();\n\n for (i, \u0026word) in new_program.iter().enumerate() {\n let high = (word \u003e\u003e 8) as u8;Line truncated
</script>
<script crossorigin>/** @license React v16.13.1
* react.production.min.js