initial commit
This commit is contained in:
Generated
+384
@@ -0,0 +1,384 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "android-tzdata"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
|
||||
|
||||
[[package]]
|
||||
name = "android_system_properties"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.1.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1"
|
||||
dependencies = [
|
||||
"shlex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "chip8_core"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"rand",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.38"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
|
||||
dependencies = [
|
||||
"android-tzdata",
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
"num-traits",
|
||||
"wasm-bindgen",
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation-sys"
|
||||
version = "0.8.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.2.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"wasi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone"
|
||||
version = "0.1.61"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
|
||||
dependencies = [
|
||||
"android_system_properties",
|
||||
"core-foundation-sys",
|
||||
"iana-time-zone-haiku",
|
||||
"js-sys",
|
||||
"wasm-bindgen",
|
||||
"windows-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone-haiku"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
|
||||
dependencies = [
|
||||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.70"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
|
||||
dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.159"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5"
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.20.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
|
||||
dependencies = [
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.87"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"rand_chacha",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_chacha"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
||||
dependencies = [
|
||||
"ppv-lite86",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.79"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.11.0+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
"wasm-bindgen-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-backend"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"log",
|
||||
"once_cell",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"wasm-bindgen-backend",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
|
||||
dependencies = [
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm",
|
||||
"windows_aarch64_msvc",
|
||||
"windows_i686_gnu",
|
||||
"windows_i686_gnullvm",
|
||||
"windows_i686_msvc",
|
||||
"windows_x86_64_gnu",
|
||||
"windows_x86_64_gnullvm",
|
||||
"windows_x86_64_msvc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
@@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "chip8_core"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
rand = "0.8"
|
||||
chrono = "0.4"
|
||||
@@ -0,0 +1,463 @@
|
||||
use rand::Rng;
|
||||
// use chrono::Local;
|
||||
|
||||
const FONTSET_SIZE: usize = 80;
|
||||
|
||||
const FONTSET: [u8; FONTSET_SIZE] = [
|
||||
0xF0, 0x90, 0x90, 0x90, 0xF0, // 0
|
||||
0x20, 0x60, 0x20, 0x20, 0x70, // 1
|
||||
0xF0, 0x10, 0xF0, 0x80, 0xF0, // 2
|
||||
0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3
|
||||
0x90, 0x90, 0xF0, 0x10, 0x10, // 4
|
||||
0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5
|
||||
0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6
|
||||
0xF0, 0x10, 0x20, 0x40, 0x40, // 7
|
||||
0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8
|
||||
0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9
|
||||
0xF0, 0x90, 0xF0, 0x90, 0x90, // A
|
||||
0xE0, 0x90, 0xE0, 0x90, 0xE0, // B
|
||||
0xF0, 0x80, 0x80, 0x80, 0xF0, // C
|
||||
0xE0, 0x90, 0x90, 0x90, 0xE0, // D
|
||||
0xF0, 0x80, 0xF0, 0x80, 0xF0, // E
|
||||
0xF0, 0x80, 0xF0, 0x80, 0x80 // F
|
||||
];
|
||||
|
||||
|
||||
|
||||
const RAM_SIZE: usize = 4096;
|
||||
const REGISTER_COUNT: usize = 16;
|
||||
const STACK_SIZE: usize = 16;
|
||||
const NUM_KEYS: usize = 16;
|
||||
|
||||
pub const SCREEN_HEIGHT: usize = 32;
|
||||
pub const SCREEN_WIDTH: usize = 64;
|
||||
|
||||
const START_ADDR: u16 = 0x200;
|
||||
|
||||
pub struct Emu {
|
||||
programm_counter: u16, // to keep count at which instruction we are
|
||||
ram: [u8; RAM_SIZE],
|
||||
|
||||
screen: [bool; SCREEN_WIDTH * SCREEN_HEIGHT],
|
||||
pressed_keys: [bool; NUM_KEYS],
|
||||
|
||||
registers: [u8; REGISTER_COUNT],
|
||||
i_register: u16,
|
||||
|
||||
stack_pointer: u16,
|
||||
stack: [u16; STACK_SIZE],
|
||||
|
||||
delay_timer: u8, // performs any action after finished
|
||||
sound_timer: u8, // plays sound after finished
|
||||
}
|
||||
|
||||
impl Emu {
|
||||
|
||||
// NEW INSTANCE
|
||||
|
||||
pub fn new() -> Self {
|
||||
let mut new_instance = Self {
|
||||
programm_counter: START_ADDR,
|
||||
ram: [0; RAM_SIZE],
|
||||
|
||||
screen: [false; SCREEN_WIDTH * SCREEN_HEIGHT],
|
||||
pressed_keys: [false; NUM_KEYS],
|
||||
|
||||
registers: [0; REGISTER_COUNT],
|
||||
i_register: 0,
|
||||
|
||||
stack_pointer: 0,
|
||||
stack: [0; STACK_SIZE],
|
||||
|
||||
delay_timer: 0, // performs any action after finished
|
||||
sound_timer: 0, // plays sound after finished
|
||||
|
||||
};
|
||||
|
||||
new_instance.ram[..FONTSET_SIZE].copy_from_slice(&FONTSET);
|
||||
|
||||
new_instance
|
||||
}
|
||||
|
||||
// RESET INSTANCE
|
||||
|
||||
pub fn reset(&mut self) {
|
||||
self.programm_counter = START_ADDR;
|
||||
self.ram = [0; RAM_SIZE];
|
||||
self.screen = [false; SCREEN_WIDTH * SCREEN_HEIGHT];
|
||||
self.registers = [0; REGISTER_COUNT];
|
||||
self.i_register = 0;
|
||||
self.stack_pointer = 0;
|
||||
self.stack = [0; STACK_SIZE];
|
||||
self.pressed_keys = [false; NUM_KEYS];
|
||||
self.delay_timer = 0;
|
||||
self.sound_timer = 0;
|
||||
|
||||
self.ram[..FONTSET_SIZE].copy_from_slice(&FONTSET);
|
||||
}
|
||||
|
||||
// EXPOSE TO FRONTEND
|
||||
|
||||
pub fn get_display(&self) -> &[bool] {
|
||||
&self.screen
|
||||
}
|
||||
|
||||
pub fn keypress(&mut self, id: usize, pressed: bool) {
|
||||
self.pressed_keys[id] = pressed;
|
||||
}
|
||||
|
||||
pub fn load(&mut self, data: &[u8]) {
|
||||
let start = START_ADDR as usize;
|
||||
let end = (START_ADDR as usize) + data.len();
|
||||
self.ram[start..end].copy_from_slice(data);
|
||||
}
|
||||
|
||||
// STACK
|
||||
|
||||
fn push(&mut self, val:u16) {
|
||||
self.stack[self.stack_pointer as usize] = val;
|
||||
self.stack_pointer += 1;
|
||||
}
|
||||
|
||||
fn pop(&mut self) -> u16 {
|
||||
self.stack_pointer -= 1;
|
||||
self.stack[self.stack_pointer as usize]
|
||||
}
|
||||
|
||||
|
||||
// CPU
|
||||
|
||||
pub fn tick(&mut self) {
|
||||
// fetch
|
||||
let opcode = self.fetch();
|
||||
// decode and execute
|
||||
self.better_execute(opcode);
|
||||
|
||||
// let timestamp = Local::now().format("%H:%M:%S.%f").to_string();
|
||||
// println!("[{}] {:?}", timestamp, self.pressed_keys);
|
||||
|
||||
}
|
||||
|
||||
fn fetch(&mut self) -> u16 {
|
||||
let higher_byte = self.ram[self.programm_counter as usize] as u16;
|
||||
let lower_byte = self.ram[(self.programm_counter + 1) as usize] as u16;
|
||||
let opcode: u16 = (higher_byte << 8) | lower_byte;
|
||||
// println!("opcode loaded: {:0x}", opcode);
|
||||
self.programm_counter += 2;
|
||||
|
||||
opcode
|
||||
}
|
||||
|
||||
fn better_execute(&mut self, op: u16) {
|
||||
let digit1 = (op & 0xF000) >> 12;
|
||||
let digit2 = (op & 0x0F00) >> 8;
|
||||
let digit3 = (op & 0x00F0) >> 4;
|
||||
let digit4 = op & 0x000F;
|
||||
|
||||
match (digit1, digit2, digit3, digit4) {
|
||||
// NOP
|
||||
(0, 0, 0, 0) => return,
|
||||
// CLS
|
||||
(0, 0, 0xE, 0) => {
|
||||
self.screen = [false; SCREEN_WIDTH * SCREEN_HEIGHT];
|
||||
},
|
||||
// RET
|
||||
(0, 0, 0xE, 0xE) => {
|
||||
let ret_addr = self.pop();
|
||||
self.programm_counter = ret_addr;
|
||||
},
|
||||
// JMP NNN
|
||||
(1, _, _, _) => {
|
||||
let nnn = op & 0xFFF;
|
||||
self.programm_counter = nnn;
|
||||
},
|
||||
// CALL NNN
|
||||
(2, _, _, _) => {
|
||||
let nnn = op & 0xFFF;
|
||||
self.push(self.programm_counter);
|
||||
self.programm_counter = nnn;
|
||||
},
|
||||
// SKIP VX == NN
|
||||
(3, _, _, _) => {
|
||||
let x = digit2 as usize;
|
||||
let nn = (op & 0xFF) as u8;
|
||||
if self.registers[x] == nn {
|
||||
self.programm_counter += 2;
|
||||
}
|
||||
},
|
||||
// SKIP VX != NN
|
||||
(4, _, _, _) => {
|
||||
let x = digit2 as usize;
|
||||
let nn = (op & 0xFF) as u8;
|
||||
if self.registers[x] != nn {
|
||||
self.programm_counter += 2;
|
||||
}
|
||||
},
|
||||
// SKIP VX == VY
|
||||
(5, _, _, _) => {
|
||||
let x = digit2 as usize;
|
||||
let y = digit3 as usize;
|
||||
if self.registers[x] == self.registers[y] {
|
||||
self.programm_counter += 2;
|
||||
}
|
||||
},
|
||||
// VX = NN
|
||||
(6, _, _, _) => {
|
||||
let x = digit2 as usize;
|
||||
let nn = (op & 0xFF) as u8;
|
||||
self.registers[x] = nn;
|
||||
},
|
||||
// VX += NN
|
||||
(7, _, _, _) => {
|
||||
let x = digit2 as usize;
|
||||
let nn = (op & 0xFF) as u8;
|
||||
self.registers[x] = self.registers[x].wrapping_add(nn);
|
||||
},
|
||||
// VX = VY
|
||||
(8, _, _, 0) => {
|
||||
let x = digit2 as usize;
|
||||
let y = digit3 as usize;
|
||||
self.registers[x] = self.registers[y];
|
||||
},
|
||||
// VX |= VY
|
||||
(8, _, _, 1) => {
|
||||
let x = digit2 as usize;
|
||||
let y = digit3 as usize;
|
||||
self.registers[x] |= self.registers[y];
|
||||
},
|
||||
// VX &= VY
|
||||
(8, _, _, 2) => {
|
||||
let x = digit2 as usize;
|
||||
let y = digit3 as usize;
|
||||
self.registers[x] &= self.registers[y];
|
||||
},
|
||||
// VX ^= VY
|
||||
(8, _, _, 3) => {
|
||||
let x = digit2 as usize;
|
||||
let y = digit3 as usize;
|
||||
self.registers[x] ^= self.registers[y];
|
||||
},
|
||||
// VX += VY
|
||||
(8, _, _, 4) => {
|
||||
let x = digit2 as usize;
|
||||
let y = digit3 as usize;
|
||||
|
||||
let (new_vx, carry) = self.registers[x].overflowing_add(self.registers[y]);
|
||||
let new_vf = if carry { 1 } else { 0 };
|
||||
|
||||
self.registers[x] = new_vx;
|
||||
self.registers[0xF] = new_vf;
|
||||
},
|
||||
// VX -= VY
|
||||
(8, _, _, 5) => {
|
||||
let x = digit2 as usize;
|
||||
let y = digit3 as usize;
|
||||
|
||||
let (new_vx, borrow) = self.registers[x].overflowing_sub(self.registers[y]);
|
||||
let new_vf = if borrow { 0 } else { 1 };
|
||||
|
||||
self.registers[x] = new_vx;
|
||||
self.registers[0xF] = new_vf;
|
||||
},
|
||||
// VX >>= 1
|
||||
(8, _, _, 6) => {
|
||||
let x = digit2 as usize;
|
||||
let lsb = self.registers[x] & 1;
|
||||
self.registers[x] >>= 1;
|
||||
self.registers[0xF] = lsb;
|
||||
},
|
||||
// VX = VY - VX
|
||||
(8, _, _, 7) => {
|
||||
let x = digit2 as usize;
|
||||
let y = digit3 as usize;
|
||||
|
||||
let (new_vx, borrow) = self.registers[y].overflowing_sub(self.registers[x]);
|
||||
let new_vf = if borrow { 0 } else { 1 };
|
||||
|
||||
self.registers[x] = new_vx;
|
||||
self.registers[0xF] = new_vf;
|
||||
},
|
||||
// VX <<= 1
|
||||
(8, _, _, 0xE) => {
|
||||
let x = digit2 as usize;
|
||||
let msb = (self.registers[x] >> 7) & 1;
|
||||
self.registers[x] <<= 1;
|
||||
self.registers[0xF] = msb;
|
||||
},
|
||||
// SKIP VX != VY
|
||||
(9, _, _, 0) => {
|
||||
let x = digit2 as usize;
|
||||
let y = digit3 as usize;
|
||||
if self.registers[x] != self.registers[y] {
|
||||
self.programm_counter += 2;
|
||||
}
|
||||
},
|
||||
// I = NNN
|
||||
(0xA, _, _, _) => {
|
||||
let nnn = op & 0xFFF;
|
||||
self.i_register = nnn;
|
||||
},
|
||||
// JMP V0 + NNN
|
||||
(0xB, _, _, _) => {
|
||||
let nnn = op & 0xFFF;
|
||||
self.programm_counter = (self.registers[0] as u16) + nnn;
|
||||
},
|
||||
// VX = rand() & NN
|
||||
(0xC, _, _, _) => {
|
||||
let x = digit2 as usize;
|
||||
let nn = (op & 0xFF) as u8;
|
||||
let rng: u8 = rand::thread_rng().gen();
|
||||
self.registers[x] = rng & nn;
|
||||
},
|
||||
// DRAW
|
||||
(0xD, _, _, _) => {
|
||||
// Get the (x, y) coords for our sprite
|
||||
let x_coord = self.registers[digit2 as usize] as u16;
|
||||
let y_coord = self.registers[digit3 as usize] as u16;
|
||||
// The last digit determines how many rows high our sprite is
|
||||
let num_rows = digit4;
|
||||
|
||||
// Keep track if any pixels were flipped
|
||||
let mut flipped = false;
|
||||
// Iterate over each row of our sprite
|
||||
for y_line in 0..num_rows {
|
||||
// Determine which memory address our row's data is stored
|
||||
let addr = self.i_register + y_line as u16;
|
||||
let pixels = self.ram[addr as usize];
|
||||
// Iterate over each column in our row
|
||||
for x_line in 0..8 {
|
||||
// Use a mask to fetch current pixel's bit. Only flip if a 1
|
||||
if (pixels & (0b1000_0000 >> x_line)) != 0 {
|
||||
// Sprites should wrap around screen, so apply modulo
|
||||
let x = (x_coord + x_line) as usize % SCREEN_WIDTH;
|
||||
let y = (y_coord + y_line) as usize % SCREEN_HEIGHT;
|
||||
|
||||
// Get our pixel's index in the 1D screen array
|
||||
let idx = x + SCREEN_WIDTH * y;
|
||||
// Check if we're about to flip the pixel and set
|
||||
flipped |= self.screen[idx];
|
||||
self.screen[idx] ^= true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Populate VF register
|
||||
if flipped {
|
||||
self.registers[0xF] = 1;
|
||||
} else {
|
||||
self.registers[0xF] = 0;
|
||||
}
|
||||
},
|
||||
// SKIP KEY PRESS
|
||||
(0xE, _, 9, 0xE) => {
|
||||
let x = digit2 as usize;
|
||||
let vx = self.registers[x];
|
||||
let key = self.pressed_keys[vx as usize];
|
||||
if key {
|
||||
self.programm_counter += 2;
|
||||
}
|
||||
},
|
||||
// SKIP KEY RELEASE
|
||||
(0xE, _, 0xA, 1) => {
|
||||
let x = digit2 as usize;
|
||||
let vx = self.registers[x];
|
||||
let key = self.pressed_keys[vx as usize];
|
||||
if !key {
|
||||
self.programm_counter += 2;
|
||||
}
|
||||
},
|
||||
// VX = DT
|
||||
(0xF, _, 0, 7) => {
|
||||
let x = digit2 as usize;
|
||||
self.registers[x] = self.delay_timer;
|
||||
},
|
||||
// WAIT KEY
|
||||
(0xF, _, 0, 0xA) => {
|
||||
let x = digit2 as usize;
|
||||
let mut pressed = false;
|
||||
for i in 0..self.pressed_keys.len() {
|
||||
if self.pressed_keys[i] {
|
||||
self.registers[x] = i as u8;
|
||||
pressed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if !pressed {
|
||||
// Redo opcode
|
||||
self.programm_counter -= 2;
|
||||
}
|
||||
},
|
||||
// DT = VX
|
||||
(0xF, _, 1, 5) => {
|
||||
let x = digit2 as usize;
|
||||
self.delay_timer = self.registers[x];
|
||||
},
|
||||
// ST = VX
|
||||
(0xF, _, 1, 8) => {
|
||||
let x = digit2 as usize;
|
||||
self.sound_timer = self.registers[x];
|
||||
},
|
||||
// I += VX
|
||||
(0xF, _, 1, 0xE) => {
|
||||
let x = digit2 as usize;
|
||||
let vx = self.registers[x] as u16;
|
||||
self.i_register = self.i_register.wrapping_add(vx);
|
||||
},
|
||||
// I = FONT
|
||||
(0xF, _, 2, 9) => {
|
||||
let x = digit2 as usize;
|
||||
let c = self.registers[x] as u16;
|
||||
self.i_register = c * 5;
|
||||
},
|
||||
// BCD
|
||||
(0xF, _, 3, 3) => {
|
||||
let x = digit2 as usize;
|
||||
let vx = self.registers[x] as f32;
|
||||
|
||||
// Fetch the hundreds digit by dividing by 100 and tossing the decimal
|
||||
let hundreds = (vx / 100.0).floor() as u8;
|
||||
// Fetch the tens digit by dividing by 10, tossing the ones digit and the decimal
|
||||
let tens = ((vx / 10.0) % 10.0).floor() as u8;
|
||||
// Fetch the ones digit by tossing the hundreds and the tens
|
||||
let ones = (vx % 10.0) as u8;
|
||||
|
||||
self.ram[self.i_register as usize] = hundreds;
|
||||
self.ram[(self.i_register + 1) as usize] = tens;
|
||||
self.ram[(self.i_register + 2) as usize] = ones;
|
||||
},
|
||||
// STORE V0 - VX
|
||||
(0xF, _, 5, 5) => {
|
||||
let x = digit2 as usize;
|
||||
let i = self.i_register as usize;
|
||||
for idx in 0..=x {
|
||||
self.ram[i + idx] = self.registers[idx];
|
||||
}
|
||||
},
|
||||
// LOAD V0 - VX
|
||||
(0xF, _, 6, 5) => {
|
||||
let x = digit2 as usize;
|
||||
let i = self.i_register as usize;
|
||||
for idx in 0..=x {
|
||||
self.registers[idx] = self.ram[i + idx];
|
||||
}
|
||||
},
|
||||
(_, _, _, _) => unimplemented!("Unimplemented opcode: {:#04x}", op),
|
||||
}
|
||||
}
|
||||
// TIMERS
|
||||
|
||||
pub fn tick_timers(&mut self) {
|
||||
// println!("ticked timer");
|
||||
if self.delay_timer > 0 {
|
||||
self.delay_timer -= 1;
|
||||
}
|
||||
|
||||
if self.sound_timer > 0 {
|
||||
if self.sound_timer == 1 {
|
||||
// beep
|
||||
}
|
||||
self.sound_timer -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Generated
+854
@@ -0,0 +1,854 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "ahash"
|
||||
version = "0.3.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217"
|
||||
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "1.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "android-tzdata"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
|
||||
|
||||
[[package]]
|
||||
name = "android_system_properties"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "arrayvec"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
|
||||
|
||||
[[package]]
|
||||
name = "bindgen"
|
||||
version = "0.69.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cexpr",
|
||||
"clang-sys",
|
||||
"itertools",
|
||||
"lazy_static",
|
||||
"lazycell",
|
||||
"log",
|
||||
"prettyplease",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"regex",
|
||||
"rustc-hash",
|
||||
"shlex",
|
||||
"syn 2.0.79",
|
||||
"which",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.1.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1"
|
||||
dependencies = [
|
||||
"shlex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cexpr"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
|
||||
dependencies = [
|
||||
"nom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "chip8_core"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"rand",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.38"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
|
||||
dependencies = [
|
||||
"android-tzdata",
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
"num-traits",
|
||||
"wasm-bindgen",
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clang-sys"
|
||||
version = "1.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
|
||||
dependencies = [
|
||||
"glob",
|
||||
"libc",
|
||||
"libloading",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cmake"
|
||||
version = "0.1.51"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a"
|
||||
dependencies = [
|
||||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation-sys"
|
||||
version = "0.8.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-queue"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"crossbeam-utils",
|
||||
"maybe-uninit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"cfg-if 0.1.10",
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "desktop"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"chip8_core",
|
||||
"raylib",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fs_extra"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.2.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"libc",
|
||||
"wasi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "glob"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "96282e96bfcd3da0d3aa9938bedf1e50df3269b6db08b4876d2da0bb1a0841cf"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hibitset"
|
||||
version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f3ede5cfa60c958e60330d65163adbc4211e15a2653ad80eb0cce878de120121"
|
||||
|
||||
[[package]]
|
||||
name = "home"
|
||||
version = "0.5.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
|
||||
dependencies = [
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone"
|
||||
version = "0.1.61"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
|
||||
dependencies = [
|
||||
"android_system_properties",
|
||||
"core-foundation-sys",
|
||||
"iana-time-zone-haiku",
|
||||
"js-sys",
|
||||
"wasm-bindgen",
|
||||
"windows-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone-haiku"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
|
||||
dependencies = [
|
||||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.70"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
|
||||
dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "lazycell"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.159"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5"
|
||||
|
||||
[[package]]
|
||||
name = "libloading"
|
||||
version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.4.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"scopeguard",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
|
||||
|
||||
[[package]]
|
||||
name = "maybe-uninit"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.7.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
||||
|
||||
[[package]]
|
||||
name = "minimal-lexical"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
||||
|
||||
[[package]]
|
||||
name = "mopa"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a785740271256c230f57462d3b83e52f998433a7062fc18f96d5999474a9f915"
|
||||
|
||||
[[package]]
|
||||
name = "nom"
|
||||
version = "7.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"minimal-lexical",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.20.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.12.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
|
||||
dependencies = [
|
||||
"lock_api",
|
||||
"parking_lot_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot_core"
|
||||
version = "0.9.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
"smallvec",
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
|
||||
dependencies = [
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prettyplease"
|
||||
version = "0.2.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"syn 2.0.79",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.87"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"rand_chacha",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_chacha"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
||||
dependencies = [
|
||||
"ppv-lite86",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "raylib"
|
||||
version = "5.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2a7a6734329d7b872a418fe4cb08ca282eb66a6f4a3430bd4ee4e6a8cac6632"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"lazy_static",
|
||||
"libc",
|
||||
"parking_lot",
|
||||
"raylib-sys",
|
||||
"specs",
|
||||
"specs-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "raylib-sys"
|
||||
version = "5.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "db5c6001cfaeec17210713227d11f3b1ba4b723bb12cff47d1b93c4060e10ad0"
|
||||
dependencies = [
|
||||
"bindgen",
|
||||
"cc",
|
||||
"cmake",
|
||||
"fs_extra",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.5.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-automata",
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "0.38.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||
|
||||
[[package]]
|
||||
name = "shred"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c5f08237e667ac94ad20f8878b5943d91a93ccb231428446c57c21c57779016d"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"hashbrown",
|
||||
"mopa",
|
||||
"smallvec",
|
||||
"tynm",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "shrev"
|
||||
version = "1.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5ea33232fdcf1bf691ca33450e5a94dde13e1a8cbb8caabc5e4f9d761e10b1a"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.13.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
||||
|
||||
[[package]]
|
||||
name = "specs"
|
||||
version = "0.16.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fff28a29366aff703d5da8a7e2c8875dc8453ac1118f842cbc0fa70c7db51240"
|
||||
dependencies = [
|
||||
"crossbeam-queue",
|
||||
"hashbrown",
|
||||
"hibitset",
|
||||
"log",
|
||||
"shred",
|
||||
"shrev",
|
||||
"tuple_utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "specs-derive"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3e23e09360f3d2190fec4222cd9e19d3158d5da948c0d1ea362df617dd103511"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.109"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.79"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tuple_utils"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "44834418e2c5b16f47bedf35c28e148db099187dd5feee6367fb2525863af4f1"
|
||||
|
||||
[[package]]
|
||||
name = "tynm"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bd30d05e69d1478e13fe3e7a853409cfec82cebc2cf9b8d613b3c6b0081781ed"
|
||||
dependencies = [
|
||||
"nom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.11.0+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"once_cell",
|
||||
"wasm-bindgen-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-backend"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"log",
|
||||
"once_cell",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.79",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.79",
|
||||
"wasm-bindgen-backend",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
|
||||
|
||||
[[package]]
|
||||
name = "which"
|
||||
version = "4.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
|
||||
dependencies = [
|
||||
"either",
|
||||
"home",
|
||||
"once_cell",
|
||||
"rustix",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
|
||||
dependencies = [
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
||||
dependencies = [
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm",
|
||||
"windows_aarch64_msvc",
|
||||
"windows_i686_gnu",
|
||||
"windows_i686_gnullvm",
|
||||
"windows_i686_msvc",
|
||||
"windows_x86_64_gnu",
|
||||
"windows_x86_64_gnullvm",
|
||||
"windows_x86_64_msvc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.79",
|
||||
]
|
||||
@@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "desktop"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
chip8_core = { path = "../chip8_core" }
|
||||
raylib = { version = "5.0" }
|
||||
@@ -0,0 +1,263 @@
|
||||
use chip8_core::*;
|
||||
use raylib::prelude::*;
|
||||
|
||||
use std::env;
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use std::process;
|
||||
use std::collections::HashMap;
|
||||
|
||||
use raylib::consts::KeyboardKey::*;
|
||||
// use std::io;
|
||||
|
||||
const WIN_SCALE_FAC: u32 = 15;
|
||||
const WIN_WIDTH: u32 = (SCREEN_WIDTH as u32) * WIN_SCALE_FAC;
|
||||
const WIN_HEIGHT: u32 = (SCREEN_HEIGHT as u32) * WIN_SCALE_FAC;
|
||||
|
||||
const TPS: u32 = 60;
|
||||
const FPS: u32= 244;
|
||||
|
||||
#[allow(dead_code)]
|
||||
struct EmuSettings {
|
||||
tps: u32,
|
||||
fps: u32,
|
||||
}
|
||||
|
||||
struct UI {
|
||||
game_keymap: HashMap<KeyboardKey, u8>,
|
||||
theme: HashMap<String, String>,
|
||||
|
||||
clock_timer: f32,
|
||||
|
||||
rl: RaylibHandle,
|
||||
thread: RaylibThread,
|
||||
|
||||
canvas: Image,
|
||||
|
||||
emulator: Emu,
|
||||
emu_settings: EmuSettings,
|
||||
_emu_keymap: HashMap<String, KeyboardKey>,
|
||||
|
||||
args: Vec<String>,
|
||||
}
|
||||
|
||||
impl UI {
|
||||
pub fn new() -> Self {
|
||||
// init raylib window
|
||||
let (mut raylib_handle, raylib_thread) = raylib::init()
|
||||
.resizable()
|
||||
.size(WIN_WIDTH as i32, WIN_HEIGHT as i32)
|
||||
.title("Chip8 emulator")
|
||||
.build();
|
||||
|
||||
raylib_handle.set_trace_log(TraceLogLevel::LOG_NONE);
|
||||
raylib_handle.set_target_fps(FPS);
|
||||
|
||||
let args: Vec<_> = env::args().collect();
|
||||
if args.len() != 2 {
|
||||
println!("ERROR: invalid args!");
|
||||
process::exit(0);
|
||||
}
|
||||
|
||||
let mut instance = UI {
|
||||
game_keymap: Self::get_game_keymap(),
|
||||
|
||||
clock_timer: 0.,
|
||||
|
||||
theme: HashMap::from([("".to_string(),"".to_string())]),
|
||||
|
||||
rl: raylib_handle,
|
||||
thread: raylib_thread,
|
||||
canvas: Image::gen_image_color(SCREEN_WIDTH as i32, SCREEN_HEIGHT as i32, Color::GREENYELLOW),
|
||||
|
||||
emulator: Emu::new(),
|
||||
emu_settings: EmuSettings {
|
||||
fps: FPS,
|
||||
tps: TPS,
|
||||
},
|
||||
_emu_keymap: Self::get_emu_keymap(),
|
||||
|
||||
args: args,
|
||||
};
|
||||
|
||||
instance.set_theme_preset("light_green".to_string());
|
||||
|
||||
instance
|
||||
}
|
||||
|
||||
fn main_loop(&mut self) {
|
||||
while !self.rl.window_should_close() {
|
||||
self.emulator.tick();
|
||||
self.update_clock();
|
||||
|
||||
self.handle_input();
|
||||
|
||||
self.render_game();
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_input(&mut self) {
|
||||
for (ray_key, key_id) in &self.game_keymap {
|
||||
if self.rl.is_key_down(ray_key.clone()) {
|
||||
self.emulator.keypress(key_id.clone() as usize, true);
|
||||
}
|
||||
else {
|
||||
self.emulator.keypress(key_id.clone() as usize, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn render_game(&mut self) {
|
||||
let screenbuffer = self.emulator.get_display();
|
||||
|
||||
for x in 0..SCREEN_WIDTH {
|
||||
for y in 0..SCREEN_HEIGHT {
|
||||
let pixel_color = if screenbuffer[x + SCREEN_WIDTH * y] {
|
||||
self.get_ui_col("FG".to_string())
|
||||
} else {
|
||||
self.get_ui_col("BG".to_string())
|
||||
};
|
||||
|
||||
self.canvas.draw_pixel(x as i32, y as i32, pixel_color);
|
||||
}
|
||||
}
|
||||
|
||||
let texture = self.rl.load_texture_from_image(&self.thread, &self.canvas).unwrap();
|
||||
let rom_path = self.args[1].clone();
|
||||
let path_col = self.get_ui_col("FILE".to_string());
|
||||
|
||||
let mut d = self.rl.begin_drawing(&self.thread);
|
||||
|
||||
d.clear_background(Color::RED);
|
||||
|
||||
d.draw_texture_ex(&texture, Vector2::new(0.,0.), 0., (WIN_SCALE_FAC) as f32, Color::WHITE);
|
||||
|
||||
|
||||
let text_width = d.measure_text(&rom_path.as_str(), 20) as u32;
|
||||
let x_pos = ((WIN_WIDTH - text_width) as f32) * 0.5;
|
||||
|
||||
d.draw_text(&self.args[1], x_pos as i32, 12, 20, path_col);
|
||||
d.draw_fps(400, 200);
|
||||
}
|
||||
|
||||
fn update_clock(&mut self) {
|
||||
self.clock_timer += self.rl.get_frame_time();
|
||||
|
||||
if self.clock_timer >= 1. / (self.emu_settings.tps as f32) {
|
||||
self.emulator.tick_timers();
|
||||
self.clock_timer = 0.;
|
||||
}
|
||||
}
|
||||
|
||||
fn load_rom(&mut self, path: Option<String>) {
|
||||
let mut load_path = self.args[1].clone();
|
||||
if path.is_some() {
|
||||
load_path = path.expect("You really shouldnt see this");
|
||||
}
|
||||
|
||||
let mut rom = File::open(load_path).expect("ERROR: Unable to open file");
|
||||
let mut buffer = Vec::new();
|
||||
|
||||
rom.read_to_end(&mut buffer).expect("ERROR: File could not be read");
|
||||
// println!("buffer: {:?}", buffer);
|
||||
|
||||
self.emulator.load(&buffer);
|
||||
println!("Loaded ROM successfully");
|
||||
}
|
||||
|
||||
fn _set_fps(&mut self, new_fps:u32) {
|
||||
self.emu_settings.fps = new_fps;
|
||||
self.rl.set_target_fps(new_fps);
|
||||
}
|
||||
|
||||
fn get_game_keymap() -> HashMap<KeyboardKey, u8> {
|
||||
let _tetris_keymap: HashMap<KeyboardKey, u8> = HashMap::from([
|
||||
(KEY_ONE, 0x1),
|
||||
(KEY_TWO, 0x2),
|
||||
(KEY_THREE, 0x3),
|
||||
(KEY_FOUR, 0xC),
|
||||
(KEY_Q, 0x4),
|
||||
(KEY_W, 0x5),
|
||||
(KEY_E, 0x6),
|
||||
(KEY_R, 0xD),
|
||||
(KEY_A, 0x7),
|
||||
(KEY_S, 0x8),
|
||||
(KEY_D, 0x9),
|
||||
(KEY_F, 0xE),
|
||||
(KEY_Z, 0xA),
|
||||
(KEY_X, 0x0),
|
||||
(KEY_C, 0xB),
|
||||
(KEY_V, 0xF),
|
||||
]);
|
||||
|
||||
// KEYMAP:
|
||||
let wasd_keymap: HashMap<KeyboardKey, u8> = HashMap::from([
|
||||
(KEY_ONE, 0x1),
|
||||
(KEY_W, 0x2),
|
||||
(KEY_THREE, 0x3),
|
||||
(KEY_FOUR, 0xC),
|
||||
(KEY_A, 0x4),
|
||||
(KEY_SPACE, 0x5),
|
||||
(KEY_D, 0x6),
|
||||
(KEY_R, 0xD),
|
||||
(KEY_Q, 0x7),
|
||||
(KEY_S, 0x8),
|
||||
(KEY_E, 0x9),
|
||||
(KEY_F, 0xE),
|
||||
(KEY_Z, 0xA),
|
||||
(KEY_X, 0x0),
|
||||
(KEY_C, 0xB),
|
||||
(KEY_V, 0xF),
|
||||
]);
|
||||
|
||||
wasd_keymap
|
||||
}
|
||||
|
||||
fn get_emu_keymap() -> HashMap<String, KeyboardKey> {
|
||||
HashMap::from([
|
||||
("RESTART".to_string(), KEY_T),
|
||||
("PAUSE".to_string(), KEY_Z),
|
||||
])
|
||||
}
|
||||
|
||||
fn get_ui_col(&self, color_name: String) -> Color {
|
||||
let theme = &self.theme;
|
||||
let color_code = theme.get(&color_name).expect("Invalid theme color key used").replace("#", "");
|
||||
|
||||
Color::from_hex(&color_code).expect("invalid theme data")
|
||||
}
|
||||
|
||||
fn set_theme_preset(&mut self, theme_name: String) {
|
||||
let presets = HashMap::from([
|
||||
(
|
||||
"light_green",
|
||||
HashMap::from([
|
||||
("BG".to_string(), "#3c3c3c".to_string()),
|
||||
("FG".to_string(), "#00b280".to_string()),
|
||||
("FILE".to_string(), "#c2b280".to_string())
|
||||
])
|
||||
),
|
||||
|
||||
(
|
||||
"light_pink",
|
||||
HashMap::from([
|
||||
("BG".to_string(), "#3c3c3c".to_string()),
|
||||
("FG".to_string(), "##EF9AF5".to_string()),
|
||||
("FILE".to_string(), "##EB238B".to_string())
|
||||
])
|
||||
)
|
||||
]);
|
||||
|
||||
self.theme = presets.get(&theme_name.as_str()).expect(" ").clone();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
fn main() {
|
||||
let mut ui = UI::new();
|
||||
|
||||
ui.load_rom(None);
|
||||
|
||||
ui.main_loop();
|
||||
}
|
||||
Executable
+9
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Specify the directory containing the applications
|
||||
APP_DIR="../../roms"
|
||||
|
||||
# Loop through each file in the directory
|
||||
for app in "$APP_DIR"/*; do
|
||||
cargo run -- "$app" &
|
||||
done
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Executable
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Executable
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Executable
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Executable
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Executable
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,11 @@
|
||||
`
|
||||
ef
|
||||
ghabcd`
|
||||
¢xÐVp
|
||||
¢~Ðfp
|
||||
¢„Ðvp
|
||||
¢ŠÐ†jú`
|
||||
¢xÐVEaÿEa…ÐVp
|
||||
¢~ÐfFbÿFb†$Ðfp
|
||||
¢„ÐvGcÿGc‡4Ðvp
|
||||
¢ŠÐ†HdÿHdˆDІ*ÿ0ÀÿÿÀÀüÀÿðÌÌðÌÃ<ÃÃÃÃ<
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user