arnaucube
arnaucube/chip8-rsPublic Self-hosted repository
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}