Murad
2 years ago
9 changed files with 680 additions and 34 deletions
@ -0,0 +1,6 @@ |
|||||
|
// SPDX-License-Identifier: MIT
|
||||
|
// Copyright Murad Karammaev, Nikita Kuzmin
|
||||
|
|
||||
|
pub mod assembler; |
||||
|
pub mod cpu; |
||||
|
pub mod instruction; |
@ -1,33 +0,0 @@ |
|||||
// SPDX-License-Identifier: MIT
|
|
||||
// Copyright Murad Karammaev, Nikita Kuzmin
|
|
||||
|
|
||||
mod assembler; |
|
||||
mod cpu; |
|
||||
mod instruction; |
|
||||
|
|
||||
use assembler::Assembler; |
|
||||
use cpu::*; |
|
||||
|
|
||||
fn main() { |
|
||||
let asm = Assembler::new(); |
|
||||
let code = asm |
|
||||
.assemble( |
|
||||
r#" |
|
||||
MOV R0.h, 0x0 |
|
||||
MOV R0.l, 0xF |
|
||||
MOV R1.l, 0x3 |
|
||||
ADD |
|
||||
MOV [0], R0 |
|
||||
ZERO R0 |
|
||||
HALT |
|
||||
"#, |
|
||||
) |
|
||||
.unwrap(); |
|
||||
let mut cpu = Cpu::new(&code); |
|
||||
loop { |
|
||||
if cpu.step() { |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
cpu.visualize(); |
|
||||
} |
|
@ -0,0 +1,286 @@ |
|||||
|
# This file is automatically @generated by Cargo. |
||||
|
# It is not intended for manual editing. |
||||
|
version = 3 |
||||
|
|
||||
|
[[package]] |
||||
|
name = "aho-corasick" |
||||
|
version = "0.7.18" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" |
||||
|
dependencies = [ |
||||
|
"memchr", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "atty" |
||||
|
version = "0.2.14" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" |
||||
|
dependencies = [ |
||||
|
"hermit-abi", |
||||
|
"libc", |
||||
|
"winapi", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "autocfg" |
||||
|
version = "1.1.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "bitflags" |
||||
|
version = "1.3.2" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "clap" |
||||
|
version = "3.1.17" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "47582c09be7c8b32c0ab3a6181825ababb713fde6fff20fc573a3870dd45c6a0" |
||||
|
dependencies = [ |
||||
|
"atty", |
||||
|
"bitflags", |
||||
|
"clap_derive", |
||||
|
"clap_lex", |
||||
|
"indexmap", |
||||
|
"lazy_static", |
||||
|
"strsim", |
||||
|
"termcolor", |
||||
|
"textwrap", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "clap_derive" |
||||
|
version = "3.1.7" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" |
||||
|
dependencies = [ |
||||
|
"heck", |
||||
|
"proc-macro-error", |
||||
|
"proc-macro2", |
||||
|
"quote", |
||||
|
"syn", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "clap_lex" |
||||
|
version = "0.2.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" |
||||
|
dependencies = [ |
||||
|
"os_str_bytes", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "hashbrown" |
||||
|
version = "0.11.2" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "heck" |
||||
|
version = "0.4.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "hermit-abi" |
||||
|
version = "0.1.19" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" |
||||
|
dependencies = [ |
||||
|
"libc", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "indexmap" |
||||
|
version = "1.8.1" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" |
||||
|
dependencies = [ |
||||
|
"autocfg", |
||||
|
"hashbrown", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "lazy_static" |
||||
|
version = "1.4.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "libc" |
||||
|
version = "0.2.125" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "memchr" |
||||
|
version = "2.5.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "os_str_bytes" |
||||
|
version = "6.0.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "proc-macro-error" |
||||
|
version = "1.0.4" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" |
||||
|
dependencies = [ |
||||
|
"proc-macro-error-attr", |
||||
|
"proc-macro2", |
||||
|
"quote", |
||||
|
"syn", |
||||
|
"version_check", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "proc-macro-error-attr" |
||||
|
version = "1.0.4" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" |
||||
|
dependencies = [ |
||||
|
"proc-macro2", |
||||
|
"quote", |
||||
|
"version_check", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "proc-macro2" |
||||
|
version = "1.0.38" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "9027b48e9d4c9175fa2218adf3557f91c1137021739951d4932f5f8268ac48aa" |
||||
|
dependencies = [ |
||||
|
"unicode-xid", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "quote" |
||||
|
version = "1.0.18" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" |
||||
|
dependencies = [ |
||||
|
"proc-macro2", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "regex" |
||||
|
version = "1.5.5" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" |
||||
|
dependencies = [ |
||||
|
"aho-corasick", |
||||
|
"memchr", |
||||
|
"regex-syntax", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "regex-syntax" |
||||
|
version = "0.6.25" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "strsim" |
||||
|
version = "0.10.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "syn" |
||||
|
version = "1.0.92" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" |
||||
|
dependencies = [ |
||||
|
"proc-macro2", |
||||
|
"quote", |
||||
|
"unicode-xid", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "termcolor" |
||||
|
version = "1.1.3" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" |
||||
|
dependencies = [ |
||||
|
"winapi-util", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "textwrap" |
||||
|
version = "0.15.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "toy_cpu_4bit" |
||||
|
version = "0.1.0" |
||||
|
dependencies = [ |
||||
|
"lazy_static", |
||||
|
"regex", |
||||
|
"ux", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "toyasm" |
||||
|
version = "0.1.0" |
||||
|
dependencies = [ |
||||
|
"clap", |
||||
|
"toy_cpu_4bit", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "unicode-xid" |
||||
|
version = "0.2.3" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "ux" |
||||
|
version = "0.1.4" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "5efdcf885b33bb81bc9336e66cebc10d503288449466c0e43e51250ddc93a3d8" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "version_check" |
||||
|
version = "0.9.4" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "winapi" |
||||
|
version = "0.3.9" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" |
||||
|
dependencies = [ |
||||
|
"winapi-i686-pc-windows-gnu", |
||||
|
"winapi-x86_64-pc-windows-gnu", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "winapi-i686-pc-windows-gnu" |
||||
|
version = "0.4.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "winapi-util" |
||||
|
version = "0.1.5" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" |
||||
|
dependencies = [ |
||||
|
"winapi", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "winapi-x86_64-pc-windows-gnu" |
||||
|
version = "0.4.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" |
@ -0,0 +1,8 @@ |
|||||
|
[package] |
||||
|
name = "toyasm" |
||||
|
version = "0.1.0" |
||||
|
edition = "2021" |
||||
|
|
||||
|
[dependencies] |
||||
|
toy_cpu_4bit = { version = "0.1.0", path = ".." } |
||||
|
clap = { version = "3.1.17", features = ["derive"] } |
@ -0,0 +1,42 @@ |
|||||
|
use clap::Parser; |
||||
|
use std::io::Write; |
||||
|
use std::{ |
||||
|
error::Error, |
||||
|
fs::{File, OpenOptions}, |
||||
|
io::Read, |
||||
|
path::PathBuf, |
||||
|
}; |
||||
|
use toy_cpu_4bit::assembler::Assembler; |
||||
|
|
||||
|
/// ToyCPU-4bit Assembler
|
||||
|
#[derive(Parser)] |
||||
|
#[clap(version, about, long_about = None)] |
||||
|
struct Args { |
||||
|
/// Path to input source code
|
||||
|
input: PathBuf, |
||||
|
/// Path to output machine code
|
||||
|
output: PathBuf, |
||||
|
} |
||||
|
|
||||
|
fn read_code(path: PathBuf) -> Result<String, Box<dyn Error>> { |
||||
|
let mut code = String::new(); |
||||
|
File::open(path)?.read_to_string(&mut code)?; |
||||
|
Ok(code) |
||||
|
} |
||||
|
|
||||
|
fn write_code(path: PathBuf, code: [u8; 256]) -> Result<(), Box<dyn Error>> { |
||||
|
let mut file = OpenOptions::new() |
||||
|
.create(true) |
||||
|
.write(true) |
||||
|
.truncate(true) |
||||
|
.open(path)?; |
||||
|
file.write_all(&code)?; |
||||
|
Ok(()) |
||||
|
} |
||||
|
|
||||
|
fn main() -> Result<(), Box<dyn Error>> { |
||||
|
let args = Args::parse(); |
||||
|
let code = Assembler::new().assemble(&read_code(args.input)?)?; |
||||
|
write_code(args.output, code)?; |
||||
|
Ok(()) |
||||
|
} |
@ -0,0 +1,286 @@ |
|||||
|
# This file is automatically @generated by Cargo. |
||||
|
# It is not intended for manual editing. |
||||
|
version = 3 |
||||
|
|
||||
|
[[package]] |
||||
|
name = "aho-corasick" |
||||
|
version = "0.7.18" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" |
||||
|
dependencies = [ |
||||
|
"memchr", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "atty" |
||||
|
version = "0.2.14" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" |
||||
|
dependencies = [ |
||||
|
"hermit-abi", |
||||
|
"libc", |
||||
|
"winapi", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "autocfg" |
||||
|
version = "1.1.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "bitflags" |
||||
|
version = "1.3.2" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "clap" |
||||
|
version = "3.1.17" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "47582c09be7c8b32c0ab3a6181825ababb713fde6fff20fc573a3870dd45c6a0" |
||||
|
dependencies = [ |
||||
|
"atty", |
||||
|
"bitflags", |
||||
|
"clap_derive", |
||||
|
"clap_lex", |
||||
|
"indexmap", |
||||
|
"lazy_static", |
||||
|
"strsim", |
||||
|
"termcolor", |
||||
|
"textwrap", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "clap_derive" |
||||
|
version = "3.1.7" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" |
||||
|
dependencies = [ |
||||
|
"heck", |
||||
|
"proc-macro-error", |
||||
|
"proc-macro2", |
||||
|
"quote", |
||||
|
"syn", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "clap_lex" |
||||
|
version = "0.2.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" |
||||
|
dependencies = [ |
||||
|
"os_str_bytes", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "hashbrown" |
||||
|
version = "0.11.2" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "heck" |
||||
|
version = "0.4.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "hermit-abi" |
||||
|
version = "0.1.19" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" |
||||
|
dependencies = [ |
||||
|
"libc", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "indexmap" |
||||
|
version = "1.8.1" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" |
||||
|
dependencies = [ |
||||
|
"autocfg", |
||||
|
"hashbrown", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "lazy_static" |
||||
|
version = "1.4.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "libc" |
||||
|
version = "0.2.125" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "memchr" |
||||
|
version = "2.5.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "os_str_bytes" |
||||
|
version = "6.0.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "proc-macro-error" |
||||
|
version = "1.0.4" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" |
||||
|
dependencies = [ |
||||
|
"proc-macro-error-attr", |
||||
|
"proc-macro2", |
||||
|
"quote", |
||||
|
"syn", |
||||
|
"version_check", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "proc-macro-error-attr" |
||||
|
version = "1.0.4" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" |
||||
|
dependencies = [ |
||||
|
"proc-macro2", |
||||
|
"quote", |
||||
|
"version_check", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "proc-macro2" |
||||
|
version = "1.0.38" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "9027b48e9d4c9175fa2218adf3557f91c1137021739951d4932f5f8268ac48aa" |
||||
|
dependencies = [ |
||||
|
"unicode-xid", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "quote" |
||||
|
version = "1.0.18" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" |
||||
|
dependencies = [ |
||||
|
"proc-macro2", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "regex" |
||||
|
version = "1.5.5" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" |
||||
|
dependencies = [ |
||||
|
"aho-corasick", |
||||
|
"memchr", |
||||
|
"regex-syntax", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "regex-syntax" |
||||
|
version = "0.6.25" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "strsim" |
||||
|
version = "0.10.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "syn" |
||||
|
version = "1.0.92" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" |
||||
|
dependencies = [ |
||||
|
"proc-macro2", |
||||
|
"quote", |
||||
|
"unicode-xid", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "termcolor" |
||||
|
version = "1.1.3" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" |
||||
|
dependencies = [ |
||||
|
"winapi-util", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "textwrap" |
||||
|
version = "0.15.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "toy_cpu_4bit" |
||||
|
version = "0.1.0" |
||||
|
dependencies = [ |
||||
|
"lazy_static", |
||||
|
"regex", |
||||
|
"ux", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "toyvm" |
||||
|
version = "0.1.0" |
||||
|
dependencies = [ |
||||
|
"clap", |
||||
|
"toy_cpu_4bit", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "unicode-xid" |
||||
|
version = "0.2.3" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "ux" |
||||
|
version = "0.1.4" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "5efdcf885b33bb81bc9336e66cebc10d503288449466c0e43e51250ddc93a3d8" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "version_check" |
||||
|
version = "0.9.4" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "winapi" |
||||
|
version = "0.3.9" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" |
||||
|
dependencies = [ |
||||
|
"winapi-i686-pc-windows-gnu", |
||||
|
"winapi-x86_64-pc-windows-gnu", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "winapi-i686-pc-windows-gnu" |
||||
|
version = "0.4.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" |
||||
|
|
||||
|
[[package]] |
||||
|
name = "winapi-util" |
||||
|
version = "0.1.5" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" |
||||
|
dependencies = [ |
||||
|
"winapi", |
||||
|
] |
||||
|
|
||||
|
[[package]] |
||||
|
name = "winapi-x86_64-pc-windows-gnu" |
||||
|
version = "0.4.0" |
||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
|
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" |
@ -0,0 +1,8 @@ |
|||||
|
[package] |
||||
|
name = "toyvm" |
||||
|
version = "0.1.0" |
||||
|
edition = "2021" |
||||
|
|
||||
|
[dependencies] |
||||
|
toy_cpu_4bit = { version = "0.1.0", path = ".." } |
||||
|
clap = { version = "3.1.17", features = ["derive"] } |
@ -0,0 +1,43 @@ |
|||||
|
use clap::Parser; |
||||
|
use std::{error::Error, fs::File, io::Read, path::PathBuf}; |
||||
|
use toy_cpu_4bit::cpu::Cpu; |
||||
|
|
||||
|
/// ToyCPU-4bit Virtual Machine
|
||||
|
#[derive(Parser)] |
||||
|
#[clap(version, about, long_about = None)] |
||||
|
struct Args { |
||||
|
/// Visualize every CPU tick
|
||||
|
#[clap(short, long)] |
||||
|
trace: bool, |
||||
|
/// Path to 256-byte file with code for CPU
|
||||
|
code: PathBuf, |
||||
|
} |
||||
|
|
||||
|
fn read_code(path: PathBuf) -> Result<[u8; 256], Box<dyn Error>> { |
||||
|
let mut file = File::open(path)?; |
||||
|
match file.metadata()?.len() { |
||||
|
x if x != 256 => { |
||||
|
Err(format!("Wrong code file size, expected: 256, provided: {}", x).into()) |
||||
|
} |
||||
|
_ => { |
||||
|
let mut buf = [0u8; 256]; |
||||
|
file.read_exact(&mut buf)?; |
||||
|
Ok(buf) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
fn main() -> Result<(), Box<dyn Error>> { |
||||
|
let args = Args::parse(); |
||||
|
let code = read_code(args.code)?; |
||||
|
let mut cpu = Cpu::new(&code); |
||||
|
loop { |
||||
|
if cpu.step() { |
||||
|
break; |
||||
|
} |
||||
|
if args.trace { |
||||
|
cpu.visualize(); |
||||
|
} |
||||
|
} |
||||
|
Ok(()) |
||||
|
} |
Loading…
Reference in new issue