From 533b519d153eb698c9e950cc38b774e50867f28e Mon Sep 17 00:00:00 2001 From: Trevor Merritt Date: Thu, 12 Jun 2025 14:31:53 -0400 Subject: [PATCH] Initial commit Start of the project --- .gitignore | 1 + Cargo.lock | 512 +++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 10 + src/adder.rs | 69 ++++++ src/busses.rs | 38 +++ src/computer.rs | 52 +++++ src/constants.rs | 1 + src/control_signals.rs | 56 +++++ src/cycle_stages.rs | 28 +++ src/main.rs | 24 ++ src/memory.rs | 48 ++++ src/register.rs | 46 ++++ 12 files changed, 885 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/adder.rs create mode 100644 src/busses.rs create mode 100644 src/computer.rs create mode 100644 src/constants.rs create mode 100644 src/control_signals.rs create mode 100644 src/cycle_stages.rs create mode 100644 src/main.rs create mode 100644 src/memory.rs create mode 100644 src/register.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..58552f5 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,512 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys", +] + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "clap" +version = "4.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "errno" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "flate2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" + +[[package]] +name = "humantime" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" + +[[package]] +name = "is-terminal" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "pretty_env_logger" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +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 = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "slu4_cpu" +version = "0.1.0" +dependencies = [ + "log", + "pretty_env_logger", + "trevors_utilities", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6397daf94fa90f058bd0fd88429dd9e5738999cca8d701813c80723add80462" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "trevors_utilities" +version = "0.1.0-20250606" +dependencies = [ + "clap", + "env_logger", + "flate2", + "tempfile", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +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 = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8190abc --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "slu4_cpu" +version = "0.1.0" +edition = "2024" + +[dependencies] +trevors_utilities = { path = "/home/tmerritt/Projects/trevors_utilities" } + +pretty_env_logger = { version = "0.5" } +log = { version = "0.4" } diff --git a/src/adder.rs b/src/adder.rs new file mode 100644 index 0000000..2b7ce7f --- /dev/null +++ b/src/adder.rs @@ -0,0 +1,69 @@ +use log::debug; +use crate::busses::{AddressBus, DataBus}; +use crate::control_signals::ControlSignals; +use crate::cycle_stages::CycleStages; + +#[derive(Default)] +pub struct AdderFlags { + negative: bool, + carry: bool, + zero: bool +} + +#[derive(Default)] +pub struct Adder { + a_value: u8, + b_value: u8, + y_value: u8, + flags_value: AdderFlags +} + +impl Adder { + pub fn set_flags(&mut self, new_flags: AdderFlags) { + self.flags_value = new_flags; + } + pub fn set_a(&mut self, new_value: u8) { + self.a_value = new_value; + } + + pub fn set_b(&mut self, new_value: u8) { + self.b_value = new_value; + } + + pub fn get_y(&self) -> u8 { + self.y_value + } + + pub fn get_flags(&self) -> AdderFlags { + AdderFlags::default() + } +} + +impl CycleStages for Adder { + fn falling_edge(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } + + fn low_state(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } + + fn rising_edge(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } + + fn high_state(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } +} + +#[cfg(Test)] +mod test { + use super::*; + + #[test] + fn add_two_numbers() { + let adder = Adder::new(); + + } +} \ No newline at end of file diff --git a/src/busses.rs b/src/busses.rs new file mode 100644 index 0000000..48dd3ea --- /dev/null +++ b/src/busses.rs @@ -0,0 +1,38 @@ +use log::trace; + +pub struct AddressBus { + value: u16 +} + +impl AddressBus { + pub fn new() -> Self { + AddressBus { value : 0x0000 } + } + + pub fn set_address(&mut self, new_address: u16) { + trace!("Address bus updated from {} to {}", self.value, new_address); + self.value = new_address + } + + pub fn address(&self) -> u16 { + self.value + } +} + +pub struct DataBus { + value: u8 +} + +impl DataBus { + pub fn new() -> Self { + DataBus { value: 0x00 } + } + + pub fn set_data(&mut self, new_value: u8) { + self.value = new_value; + } + + pub fn data(&self) -> u8 { + self.value + } +} \ No newline at end of file diff --git a/src/computer.rs b/src/computer.rs new file mode 100644 index 0000000..d039b1a --- /dev/null +++ b/src/computer.rs @@ -0,0 +1,52 @@ +use std::time::{Duration, Instant}; +use log::debug; +use crate::adder::Adder; +use crate::memory::Memory; +use crate::register::Register; + +pub struct Computer { + last_updated: Instant, + current_input: String, + adder: Adder, + register: Register, + memory: Memory + +} + +impl Computer { + pub fn new() -> Self { + debug!("Created new CPU"); + Computer { + last_updated: Instant::now(), + current_input: String::from(""), + adder: Adder::default(), + register: Register::default(), + memory: Memory::default() + } + } + + pub fn reset(mut self) { + self = Computer::new(); + } + + pub fn update(&mut self) { + let now = Instant::now(); + if now.duration_since(self.last_updated).as_millis() > 10 { + debug!("Time to update cpu."); + self.last_updated = now; + + // Rising Edge + + // High State + + // Falling Edge + + // Low State + + } + } + + pub fn input(&mut self, c: char) { + self.current_input = format!("{}{}", self.current_input, c); + } +} diff --git a/src/constants.rs b/src/constants.rs new file mode 100644 index 0000000..abdd081 --- /dev/null +++ b/src/constants.rs @@ -0,0 +1 @@ +pub const SIZE_32KB: usize = 1024*1024*32; diff --git a/src/control_signals.rs b/src/control_signals.rs new file mode 100644 index 0000000..e7a276b --- /dev/null +++ b/src/control_signals.rs @@ -0,0 +1,56 @@ +use std::collections::BTreeMap; + +pub enum ControlSignal { + // UART Transmitter Register In + TI, + // UART Receiver Register Out + TO, + // UART Receiver Register Clear, + TC, + // Memory Address Register In (LSB) + MIL, + // Memory Address Register In (MSB) + MIH, + // Memory Address Register Increment + ME, + // Bank Register In + KI, + // RAM In + RI, + // RAM Out + RO, + // Program Counter In (LSB) + CIL, + // Program Counter In (MSB) + CIH, + // Program Counter Out (LSB) + COL, + // Program Counter Out (MSB), + COH, + // Program Counter Increment + CI, + // A Register In + AI, + // A Register Out + AO, + // B Register In + BI, + // B Register Out + BO, + // Adder Sum Out + EO, + // Adder Invert Operand B + ES, + // Adder Carry In + EC, + // Flags REgister IN + FI, + // Instruction Register In + II, + // Step Counter Clear + IC +} + +pub struct ControlSignals { + pub signals: BTreeMap +} diff --git a/src/cycle_stages.rs b/src/cycle_stages.rs new file mode 100644 index 0000000..0390530 --- /dev/null +++ b/src/cycle_stages.rs @@ -0,0 +1,28 @@ +use crate::busses::{AddressBus, DataBus}; +use crate::control_signals::ControlSignals; + +/// Cycle Stages +/// +/// The 4 stages of a clock cycle +pub trait CycleStages { + + /// Falling Edge + /// + /// When the clock pulse is moving from high to low + fn falling_edge(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals); + + /// Low State + /// + /// Clock pulse is stabilized at the low level + fn low_state(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals); + + /// Rising Edge + /// + /// When the clock pulse is moving from low to high + fn rising_edge(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals); + + /// High State + /// + /// Clock pulse is stabilized at the high level + fn high_state(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals); +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..eb914d4 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,24 @@ +use crate::computer::Computer; + +mod cycle_stages; +mod computer; +mod register; +mod adder; +mod memory; +mod busses; +mod constants; +mod control_signals; + +fn main() { + pretty_env_logger::init(); + + let mut cpu = Computer::new(); + + let mut keep_running = true; + + while keep_running { + cpu.update(); + } + +} + diff --git a/src/memory.rs b/src/memory.rs new file mode 100644 index 0000000..d7cce70 --- /dev/null +++ b/src/memory.rs @@ -0,0 +1,48 @@ +use log::debug; +use crate::busses::{AddressBus, DataBus}; +use crate::constants::SIZE_32KB; +use crate::control_signals::ControlSignals; +use crate::cycle_stages::CycleStages; + +pub struct Memory { + data: [u8; SIZE_32KB] +} + +impl Memory { + pub fn peek(&self, offset: u16) -> u8 { self.data[offset as usize] } + pub fn poke(&mut self, new_value: u8, offset: u16) { self.data[offset as usize] = new_value; } + + pub fn clear(&mut self) { + for i in 0..SIZE_32KB { + self.poke(0x00, i as u16); + } + } + + pub fn new() -> Self { + Memory { data: [0; SIZE_32KB] } + } +} + +impl Default for Memory { + fn default() -> Self { + Memory::new() + } +} + +impl CycleStages for Memory { + fn falling_edge(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } + + fn low_state(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } + + fn rising_edge(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } + + fn high_state(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } +} \ No newline at end of file diff --git a/src/register.rs b/src/register.rs new file mode 100644 index 0000000..9d723d0 --- /dev/null +++ b/src/register.rs @@ -0,0 +1,46 @@ +use log::debug; +use crate::busses::{AddressBus, DataBus}; +use crate::control_signals::ControlSignals; +use crate::cycle_stages::CycleStages; + +#[derive(Default)] +pub struct Register { + value: u16, + in_mask: u16, + out_mask: u16, + count_mask: u16, + hi_mask: u16, + port_lines: u8, + control_lines: u16, + name: String +} + +impl Register { + pub fn new(name: String) -> Self { + let mut working= Register::default(); + working.name = name; + working + } + + pub fn reset(&mut self) -> Self { + Register::new(self.name.clone()) + } +} + +impl CycleStages for Register { + fn falling_edge(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } + + fn low_state(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } + + fn rising_edge(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } + + fn high_state(address_bus: AddressBus, data_bus: DataBus, state: ControlSignals) { + todo!() + } +}