chip8-rs/chip8/src/lib.rs
chip8/src/lib.rsRaw
1use std::fs;
2use std::io::Read;
3
4const w: usize = 64;
5const h: usize = 32;
6
7pub struct Chip8 {
8 opcode: u16,
9 memory: [u8; 4096],
10 v: [u8; 16],
11 index: u16,
12 pc: u16,
13 gfx: [u8; w * h],
14 delay_timer: u8,
15 sound_timer: u8,
16 stack: [u16; 16],
17 sp: isize,
18 key: [u8; 16],
19 pub draw_flag: bool,
20}
21
22const font_set: [u8; 80] = [
23 0xF0, 0x90, 0x90, 0x90, 0xF0, // 0
24 0x20, 0x60, 0x20, 0x20, 0x70, // 1
25 0xF0, 0x10, 0xF0, 0x80, 0xF0, // 2
26 0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3
27 0x90, 0x90, 0xF0, 0x10, 0x10, // 4
28 0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5
29 0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6
30 0xF0, 0x10, 0x20, 0x40, 0x40, // 7
31 0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8
32 0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9
33 0xF0, 0x90, 0xF0, 0x90, 0x90, // A
34 0xE0, 0x90, 0xE0, 0x90, 0xE0, // B
35 0xF0, 0x80, 0x80, 0x80, 0xF0, // C
36 0xE0, 0x90, 0x90, 0x90, 0xE0, // D
37 0xF0, 0x80, 0xF0, 0x80, 0xF0, // E
38 0xF0, 0x80, 0xF0, 0x80, 0x80, // F
39];
40
41impl Chip8 {
42 pub fn new() -> Chip8 {
43 let mut c = Chip8 {
44 opcode: 0,
45 memory: [0; 4096],
46 v: [0; 16],
47 index: 0,
48 pc: 0x200,
49 gfx: [0; w * h],
50 delay_timer: 0,
51 sound_timer: 0,
52 stack: [0; 16],
53 sp: 0,
54 key: [0; 16],
55 draw_flag: false,
56 };
57
58 for i in 0..font_set.len() {
59 c.memory[i] = font_set[i];
60 }
61 c
62 }
63 pub fn load_game(&mut self, filepath: &str) {
64 let mut f = fs::File::open(filepath).expect("can not load rom file");
65 let metadata = fs::metadata(filepath).expect("unable to read metadata");
66 let mut b = vec![0; metadata.len() as usize];
67 f.read(&mut b).expect("buffer overflow");
68 for i in 0..b.len() {
69 self.memory[512 + i] = b[i];
70 }
71 }
72 pub fn emulate_cycle(&mut self) {
73 self.opcode = (self.memory[self.pc as usize] as u16) << 8
74 | self.memory[(self.pc + 1) as usize] as u16;
75 let x: usize = ((self.opcode & 0x0F00) >> 8) as usize;
76 let y: usize = ((self.opcode & 0x00F0) >> 4) as usize;
77 let nn: u8 = (self.opcode & 0x00FF) as u8;
78 let nnn: u16 = (self.opcode & 0x0FFF) as u16;
79 // TODO
80 }
81}
82
83#[cfg(test)]
84mod tests {
85 use super::*;
86 #[test]
87 fn test_load_game() {
88 let mut c = Chip8::new();
89 c.load_game("Cargo.toml");
90 c.emulate_cycle();
91 // println!("{:?}", c.memory);
92 }
93}