commit 656ed32f8a97a61eb9ee3728672ffb65c8373cd1 Author: Tim Schubert Date: Fri Dec 27 23:22:40 2024 +0100 conway diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cb23289 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +*.fd +esp diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..7c8ecbb --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,186 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcada80daa06c42ed5f48c9a043865edea5dc44cbf9ac009fda3b89526e28607" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca9224df2e20e7c5548aeb5f110a0f3b77ef05f8585139b7148b59056168ed2" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[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.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ae51629bf965c5c098cc9e87908a3df5301051a9e087d6f9bef5c9771ed126" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "ucs2" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79298e11f316400c57ec268f3c2c29ac3c4d4777687955cd3d4f3a35ce7eba" +dependencies = [ + "bit_field", +] + +[[package]] +name = "uefi" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6679b7fc2f6d6d2ea2f67555ef3ed9d71d30c5021faf9193091a5192db7dc468" +dependencies = [ + "bitflags", + "cfg-if", + "log", + "ptr_meta", + "ucs2", + "uefi-macros", + "uefi-raw", + "uguid", +] + +[[package]] +name = "uefi-macros" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b24e77d3fc1e617051e630f99da24bcae6328abab37b8f9216bb68d06804f9a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.92", +] + +[[package]] +name = "uefi-raw" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d465de2c918779dafb769a5a4fe8d6e4fb7cc4cc6cb1a735f2f6ec68beea4" +dependencies = [ + "bitflags", + "ptr_meta", + "uguid", +] + +[[package]] +name = "uefi-textadventure" +version = "0.1.0" +dependencies = [ + "heapless", + "log", + "uefi", +] + +[[package]] +name = "uguid" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab14ea9660d240e7865ce9d54ecdbd1cd9fa5802ae6f4512f093c7907e921533" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..f23a761 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "uefi-textadventure" +version = "0.1.0" +edition = "2021" + +[dependencies] +heapless = "0.8.0" +log = "0.4.22" +uefi = { version = "0.33.0", features = ["logger", "panic_handler"] } diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..378f247 --- /dev/null +++ b/flake.lock @@ -0,0 +1,97 @@ +{ + "nodes": { + "fenix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "rust-analyzer-src": "rust-analyzer-src" + }, + "locked": { + "lastModified": 1735281280, + "narHash": "sha256-FgW6NkzbGlmNeY0lywjvXgrZD+UPS/+848kI30Yaup0=", + "owner": "nix-community", + "repo": "fenix", + "rev": "3915fd69e1a2827209f3a1080cb8bcca48d11fa7", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1735191716, + "narHash": "sha256-rwHLmGc/2OfudyjGnH8h5vQK2e5uJ6gt2GwPhWL9pPk=", + "path": "/nix/store/g421ks4gdcizmgacddxm2b7c6xabfhiv-source", + "rev": "1dd8f51e62c0ff199e551744ab46fc4fbe6f827a", + "type": "path" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "fenix": "fenix", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1735227773, + "narHash": "sha256-eYkxxU3Bqr7uLMKXOIb9BGlaD0W/I2pI6bh1SIuPZH4=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "1ce4de2585cb9802c4d5a99d1a904b11fdba9501", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..d1ab260 --- /dev/null +++ b/flake.nix @@ -0,0 +1,36 @@ +{ + description = "a653rs-router"; + + inputs = { + fenix = { + url = "github:nix-community/fenix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { fenix, flake-utils, nixpkgs, ... }: flake-utils.lib.eachSystem [ "x86_64-linux" ] (system: + let + pkgs = import nixpkgs { inherit system; }; + rustToolchain = with fenix.packages.${system}; combine [ + latest.rustc + latest.cargo + latest.clippy + latest.rustfmt + latest.rust-src + latest.rust-analyzer + targets.aarch64-unknown-uefi.latest.rust-std + targets.i686-unknown-uefi.latest.rust-std + targets.x86_64-unknown-uefi.latest.rust-std + ]; + in + { + devShells.default = pkgs.mkShell { + packages = [ + pkgs.OVMF + rustToolchain + ]; + }; + } + ); +} diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..566dee0 --- /dev/null +++ b/run.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -x +set -e + +cargo build --target x86_64-unknown-uefi +mkdir -p esp/efi/boot +cp target/x86_64-unknown-uefi/debug/uefi-textadventure.efi esp/efi/boot/bootx64.efi +qemu-system-x86_64 -enable-kvm \ + -drive if=pflash,format=raw,readonly=on,file=edk2-x86_64-code.fd \ + -drive format=raw,file=fat:rw:esp diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..78f1ca4 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,92 @@ +#![no_main] +#![no_std] + +use core::iter::repeat; + +use heapless::Vec; +use log::info; +use system::with_stdout; +use uefi::{prelude::*, print, println}; + +#[entry] +fn main() -> Status { + uefi::helpers::init().unwrap(); + info!("Hello world!"); + + const W: usize = 32; + const H: usize = 32; + + let mut life: Vec, H> = life(); + for (i, j) in [(15, 16), (16, 15), (16, 16), (17, 16), (17, 17)] { + life[i][j] = true; + } + + for i in 0..100_000 { + with_stdout(|stdout| stdout.clear()).unwrap(); + println!("Generation: {}", i); + life = gol(life.clone()); + for l in life.iter() { + for cell in l.iter() { + if *cell { + print!("X") + } else { + print!(" ") + } + } + println!(""); + } + boot::stall(1_000); + } + + boot::stall(100_000_000); + Status::SUCCESS +} + +fn gol(cells: Vec, H>) -> Vec, H> { + let mut future = life(); + cells.iter().enumerate().for_each(|(row, line)| { + line.iter().enumerate().for_each(|(column, cell)| { + let neighbors = [ + (-1 as i64, -1), + (-1, 0), + (-1, 1 as i64), + (0, -1), + (0, 1), + (1, -1), + (1, 0), + (1, 1), + ] + .iter() + .filter_map(|offset| { + let neighbor = ( + (row as i64).checked_add(offset.0), + (column as i64).checked_add(offset.1), + ); + match neighbor { + (Some(r), Some(w)) + if r >= 0 + && w >= 0 + && (r as usize) < H + && (w as usize) < W + && cells[r as usize][w as usize] => + { + Some(()) + } + _ => None, + } + }) + .count(); + future[row][column] = + (*cell && (neighbors == 2 || neighbors == 3)) || (!*cell && neighbors == 3); + }) + }); + future +} + +fn life() -> Vec, H> { + let mut future: Vec, H> = Vec::default(); + for _ in 0..H { + future.push(repeat(false).take(W).collect()).unwrap(); + } + future +}