diff options
author | Aaditya Dhruv <[email protected]> | 2023-01-02 16:36:57 +0530 |
---|---|---|
committer | Aaditya Dhruv <[email protected]> | 2023-01-02 16:36:57 +0530 |
commit | 8a01a57129de444289834777bae916e28d5a5ae8 (patch) | |
tree | 9ee0f5eb65393c1efc923768e4e318fa64334363 /src/lib.rs | |
parent | b8544d8c81d69b27d3c6e8dd222a09bf4706084a (diff) |
rand package, core fns
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 125 |
1 files changed, 110 insertions, 15 deletions
@@ -1,4 +1,5 @@ use sdl2::keyboard::Keycode; +use rand::prelude::*; use std::fs::File; use std::io::Read; use sdl2::rect::Rect; @@ -19,7 +20,7 @@ pub struct Chip { index: u16, //16-bit index pointer pc: u16, //Program counter stack: [u16; 16], //16 level stack - sp: u8, //stack pointer + sp: usize, //stack pointer delay_timer: u8, //delay timer sound_timer: u8, //sound timer keys : [Keycode; 16], //mapping keys to chip-8 input keys @@ -27,8 +28,8 @@ pub struct Chip { display: [u16; DISPLAY_LENGTH as usize], //the display array instr: u16, //current exec instr v: u8, - x: u8, - y: u8, + x: usize, + y: usize, n: u8, nn: u8, nnn: u16, @@ -105,8 +106,8 @@ impl Chip { pub fn execute(&mut self) { self.v = ((self.instr & 0xF000) >> 12) as u8; - self.x = ((self.instr & 0x0F00) >> 8) as u8; - self.y = ((self.instr & 0x00F0) >> 4) as u8; + self.x = ((self.instr & 0x0F00) >> 8) as usize; + self.y = ((self.instr & 0x00F0) >> 4) as usize; self.n = (self.instr & 0x000F) as u8; self.nn = (self.instr & 0x00FF) as u8; self.nnn = self.instr & 0x0FFF; @@ -119,41 +120,132 @@ impl Chip { 0x7000..=0x7fff => { self.add_7xkk() }, 0xa000..=0xafff => { self.ld_annn() }, 0xd000..=0xdfff => { self.drw_dxyn() }, + 0x00ee => { self.ret_00ee() }, + 0x2000..=0x2fff => { self.call_2nnn() }, + 0x3000..=0x3fff => { self.se_3xkk() } + 0x4000..=0x4fff => { self.sne_4xkk() } + 0x5000..=0x5ff0 => { self.se_5xy0() } + 0x9000..=0x9ff0 => { self.sne_9xy0() } + 0x8000..=0x8ff0 => { self.ld_8xy0() } + 0x8001..=0x8ff1 => { self.or_8xy1() } + 0x8002..=0x8ff2 => { self.and_8xy2() } + 0x8003..=0x8ff3 => { self.xor_8xy3() } + 0x8004..=0x8ff4 => { self.add_8xy4() } + 0x8005..=0x8ff5 => { self.sub_8xy5() } + 0x8006..=0x8ff6 => { self.shr_8xy6() } + 0x8007..=0x8ff7 => { self.sub_8xy7() } + 0x800e..=0x8ffe => { self.shl_8xye() } + 0xb000..=0xbfff => { self.jp_bnnn() } + 0xc000..=0xcfff => { self.rnd_cxnn() } _ => { println!("Doing nothing!"); } } } + fn ret_00ee(&mut self) { + self.sp -= 1; + self.pc = self.stack[self.sp as usize]; + } + fn call_2nnn(&mut self) { + self.stack[self.sp as usize] = self.pc; + self.sp += 1; + self.pc = self.nnn; + } + fn se_3xkk(&mut self) { + if self.registers[self.x] == self.nn { + self.pc += 2; + } + } + fn sne_4xkk(&mut self) { + if self.registers[self.x] != self.nn { + self.pc += 2; + } + } + fn se_5xy0(&mut self) { + if self.registers[self.x] == self.registers[self.y] { + self.pc += 2; + } + } + fn sne_9xy0(&mut self) { + if self.registers[self.x] != self.registers[self.y] { + self.pc += 2; + } + } //Clear screen fn cls_00e0(&mut self) { self.display = [0; DISPLAY_LENGTH]; } - //Jump fn jmp_1nnn(&mut self) { self.pc = self.nnn; } - //set register vx fn ld_6xkk(&mut self) { - self.registers[self.x as usize] = self.nn as u8; + self.registers[self.x] = self.nn as u8; } - //add value to register vx fn add_7xkk(&mut self) { - self.registers[self.x as usize] += self.nn as u8; + self.registers[self.x] += self.nn as u8; + } + fn ld_8xy0(&mut self) { + self.registers[self.x] = self.registers[self.y]; + } + fn or_8xy1(&mut self) { + self.registers[self.x] = self.registers[self.x] | self.registers[self.y]; + } + fn and_8xy2(&mut self) { + self.registers[self.x] = self.registers[self.x] & self.registers[self.y]; + } + fn xor_8xy3(&mut self) { + self.registers[self.x] = self.registers[self.x] ^ self.registers[self.y]; + } + fn add_8xy4(&mut self) { + + self.registers[self.x] += self.registers[self.y]; + match self.registers[self.x].checked_add(self.registers[self.y]) { + Some(_) => { } + None => { self.registers[0xF] = 1; } + } + } + fn sub_8xy5(&mut self) { + self.registers[self.x] -= self.registers[self.y]; + match self.registers[self.x].checked_sub(self.registers[self.y]) { + Some(_) => { self.registers[0xF] = 1; } + None => { } + } + } + fn sub_8xy7(&mut self) { + self.registers[self.x] = self.registers[self.y] - self.registers[self.x]; + match self.registers[self.y].checked_sub(self.registers[self.x]) { + Some(_) => { self.registers[0xF] = 1; } + None => { } + } + } + fn shr_8xy6(&mut self) { + self.registers[self.x] = self.registers[self.y]; + self.registers[0xF] = self.registers[self.x] << 7 & 1; + self.registers[self.x] >>= 1; + } + fn shl_8xye(&mut self) { + self.registers[self.x] = self.registers[self.y]; + self.registers[0xF] = self.registers[self.x] >> 7 & 1; + self.registers[self.x] <<= 1; } - //set index register fn ld_annn(&mut self) { self.index = self.nnn; } - + fn jp_bnnn(&mut self) { + self.pc = self.nnn + self.registers[0x0] as u16; + } + fn rnd_cxnn(&mut self) { + let x : u8 = rand::thread_rng().gen(); + self.registers[self.x] = x | self.n; + } //draw logic fn drw_dxyn(&mut self) { - let x = self.registers[self.x as usize] as u32 % WIDTH; //x-coord - let y = self.registers[self.y as usize] as u32 % HEIGHT; //y-coord - + let x = self.registers[self.x] as u32 % WIDTH; //x-coord + let y = self.registers[self.y] as u32 % HEIGHT; //y-coord //TODO: Cover up for end of bounds //for every row for i in 0..self.n { @@ -166,6 +258,9 @@ impl Chip { } } } + fn skp_ex9e(&mut self) { + } + //render the current grid of pixels accounting for scale pub fn render(&mut self, canvas : &mut sdl2::render::WindowCanvas) { |