diff --git a/Cargo.lock b/Cargo.lock index 9dbe64b..000a39c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,18 +8,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -30,19 +18,10 @@ dependencies = [ ] [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "allocator-api2" +version = "0.2.21" 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", -] +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anstream" @@ -122,6 +101,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[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" @@ -140,15 +125,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdd7a427adc0135366d99db65b36dae9237130997e560ed61118041fb72be6e8" -[[package]] -name = "cc" -version = "1.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" -dependencies = [ - "shlex", -] - [[package]] name = "cfg-if" version = "1.0.0" @@ -161,12 +137,7 @@ version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", "num-traits", - "wasm-bindgen", - "windows-targets", ] [[package]] @@ -215,12 +186,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - [[package]] name = "crc32fast" version = "1.4.2" @@ -230,6 +195,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + [[package]] name = "env_logger" version = "0.9.3" @@ -243,6 +217,12 @@ dependencies = [ "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "fdeflate" version = "0.3.7" @@ -262,6 +242,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "getrandom" version = "0.2.15" @@ -277,11 +263,13 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ - "ahash", + "allocator-api2", + "equivalent", + "foldhash", ] [[package]] @@ -305,29 +293,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[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 = "is_terminal_polyfill" version = "1.70.1" @@ -374,9 +339,9 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.9.0" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e7d46de488603ffdd5f30afbc64fbba2378214a2c3a2fb83abf3d33126df17" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ "hashbrown", ] @@ -426,6 +391,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d37886e73d87732421aaf5da617eead9d69a7daf6b0d059780f76157d9ce5372" +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-traits" version = "0.2.19" @@ -435,6 +406,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + [[package]] name = "once_cell" version = "1.20.2" @@ -449,13 +429,12 @@ checksum = "ed089a1fbffe3337a1a345501c981f1eb1e47e69de5a40e852433e12953c3174" [[package]] name = "pix-engine" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad75f055157b8a651ade0c7f831f9dc518f1fc4054bfdf16cb47d17b2139cfc3" +checksum = "4e5e57c26123038acdd3a443bf9e34e99b7cf826b3ac9d5ef224bbcfb3f528f0" dependencies = [ "anyhow", - "bitflags", - "chrono", + "bitflags 2.6.0", "getrandom", "log", "lru", @@ -465,6 +444,7 @@ dependencies = [ "rand", "sdl2", "thiserror", + "time", ] [[package]] @@ -473,13 +453,19 @@ version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ - "bitflags", + "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", "miniz_oxide", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -572,7 +558,7 @@ version = "0.35.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7959277b623f1fb9e04aea73686c3ca52f01b2145f8ea16f4ff30d8b7623b1a" dependencies = [ - "bitflags", + "bitflags 1.3.2", "c_vec", "lazy_static", "libc", @@ -591,10 +577,24 @@ dependencies = [ ] [[package]] -name = "shlex" -version = "1.3.0" +name = "serde" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.216" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "simd-adler32" @@ -648,6 +648,27 @@ dependencies = [ "syn", ] +[[package]] +name = "time" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +dependencies = [ + "deranged", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + [[package]] name = "unicode-ident" version = "1.0.14" @@ -666,12 +687,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -763,15 +778,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[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.59.0" diff --git a/Cargo.toml b/Cargo.toml index abf054f..bfe03d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,4 +14,4 @@ env_logger = "0.9" libloading = "0.7" log = "0.4" neotron-common-bios = "0.12" -pix-engine = "0.7" +pix-engine = "0.8" diff --git a/src/font/font16.rs b/src/font/font16.rs index daebe2a..13a85eb 100644 --- a/src/font/font16.rs +++ b/src/font/font16.rs @@ -31,6 +31,7 @@ /// An 8x16 font pub static FONT: super::Font = super::Font { + name: "8x16", height: 16, data: &DATA, }; diff --git a/src/font/font8.rs b/src/font/font8.rs index e213e96..3a6b123 100644 --- a/src/font/font8.rs +++ b/src/font/font8.rs @@ -33,6 +33,7 @@ /// An 8x16 font pub static FONT: super::Font = super::Font { + name: "8x8", height: 8, data: &DATA, }; diff --git a/src/font/mod.rs b/src/font/mod.rs index 95be6a2..aceefa8 100644 --- a/src/font/mod.rs +++ b/src/font/mod.rs @@ -39,6 +39,7 @@ pub mod font8; /// A font pub struct Font<'a> { + pub name: &'static str, pub height: usize, pub data: &'a [u8], } diff --git a/src/main.rs b/src/main.rs index 2da3075..5b84988 100644 --- a/src/main.rs +++ b/src/main.rs @@ -43,6 +43,7 @@ use pix_engine::prelude::*; use neotron_common_bios as common; mod font; +mod palette; // =========================================================================== // Types @@ -53,6 +54,7 @@ struct MyApp { font8x16: Vec, font8x8: Vec, sender: mpsc::Sender, + reset: bool, } #[derive(Debug, PartialEq, Eq)] @@ -164,521 +166,11 @@ static BIOS_API: common::Api = common::Api { }; /// Our standard 256 colour palette -static PALETTE: [AtomicU32; 256] = [ - // Index 000: 0x000 (Black) - AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0x00).as_packed()), - // Index 001: 0x00a (Blue) - AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0xaa).as_packed()), - // Index 002: 0x0a0 (Green) - AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0x00).as_packed()), - // Index 003: 0x0aa (Cyan) - AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0xaa).as_packed()), - // Index 004: 0xa00 (Red) - AtomicU32::new(RGBColour::from_rgb(0xaa, 0x00, 0x00).as_packed()), - // Index 005: 0xa0a (Magenta) - AtomicU32::new(RGBColour::from_rgb(0xaa, 0x00, 0xaa).as_packed()), - // Index 006: 0xaa0 (Brown) - AtomicU32::new(RGBColour::from_rgb(0xaa, 0xaa, 0x00).as_packed()), - // Index 007: 0xaaa (Light Gray) - AtomicU32::new(RGBColour::from_rgb(0xaa, 0xaa, 0xaa).as_packed()), - // Index 008: 0x666 (Dark Gray) - AtomicU32::new(RGBColour::from_rgb(0x66, 0x66, 0x66).as_packed()), - // Index 009: 0x00f (Light Blue) - AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0xff).as_packed()), - // Index 010: 0x0f0 (Light Green) - AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0x00).as_packed()), - // Index 011: 0x0ff (Light Cyan) - AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0xff).as_packed()), - // Index 012: 0xf00 (Light Red) - AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0x00).as_packed()), - // Index 013: 0xf0f (Pink) - AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0xff).as_packed()), - // Index 014: 0xff0 (Yellow) - AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0x00).as_packed()), - // Index 015: 0xfff (White) - AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0xff).as_packed()), - // Index 016: 0x003 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0x33).as_packed()), - // Index 017: 0x006 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0x66).as_packed()), - // Index 018: 0x00c - AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0xcc).as_packed()), - // Index 019: 0x020 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0x00).as_packed()), - // Index 020: 0x023 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0x33).as_packed()), - // Index 021: 0x026 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0x66).as_packed()), - // Index 022: 0x028 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0x88).as_packed()), - // Index 023: 0x02c - AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0xcc).as_packed()), - // Index 024: 0x02f - AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0xff).as_packed()), - // Index 025: 0x040 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0x00).as_packed()), - // Index 026: 0x043 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0x33).as_packed()), - // Index 027: 0x046 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0x66).as_packed()), - // Index 028: 0x048 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0x88).as_packed()), - // Index 029: 0x04c - AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0xcc).as_packed()), - // Index 030: 0x04f - AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0xff).as_packed()), - // Index 031: 0x083 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x88, 0x33).as_packed()), - // Index 032: 0x086 - AtomicU32::new(RGBColour::from_rgb(0x00, 0x88, 0x66).as_packed()), - // Index 033: 0x08c - AtomicU32::new(RGBColour::from_rgb(0x00, 0x88, 0xcc).as_packed()), - // Index 034: 0x08f - AtomicU32::new(RGBColour::from_rgb(0x00, 0x88, 0xff).as_packed()), - // Index 035: 0x0a0 - AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0x00).as_packed()), - // Index 036: 0x0a3 - AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0x33).as_packed()), - // Index 037: 0x0a6 - AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0x66).as_packed()), - // Index 038: 0x0a8 - AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0x88).as_packed()), - // Index 039: 0x0ac - AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0xcc).as_packed()), - // Index 040: 0x0af - AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0xff).as_packed()), - // Index 041: 0x0e0 - AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0x00).as_packed()), - // Index 042: 0x0e3 - AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0x33).as_packed()), - // Index 043: 0x0e6 - AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0x66).as_packed()), - // Index 044: 0x0e8 - AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0x88).as_packed()), - // Index 045: 0x0ec - AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0xcc).as_packed()), - // Index 046: 0x0ef - AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0xff).as_packed()), - // Index 047: 0x0f3 - AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0x33).as_packed()), - // Index 048: 0x0f6 - AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0x66).as_packed()), - // Index 049: 0x0f8 - AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0x88).as_packed()), - // Index 050: 0x0fc - AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0xcc).as_packed()), - // Index 051: 0x300 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0x00).as_packed()), - // Index 052: 0x303 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0x33).as_packed()), - // Index 053: 0x306 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0x66).as_packed()), - // Index 054: 0x308 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0x88).as_packed()), - // Index 055: 0x30c - AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0xcc).as_packed()), - // Index 056: 0x30f - AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0xff).as_packed()), - // Index 057: 0x320 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0x00).as_packed()), - // Index 058: 0x323 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0x33).as_packed()), - // Index 059: 0x326 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0x66).as_packed()), - // Index 060: 0x328 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0x88).as_packed()), - // Index 061: 0x32c - AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0xcc).as_packed()), - // Index 062: 0x32f - AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0xff).as_packed()), - // Index 063: 0x340 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0x00).as_packed()), - // Index 064: 0x343 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0x33).as_packed()), - // Index 065: 0x346 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0x66).as_packed()), - // Index 066: 0x348 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0x88).as_packed()), - // Index 067: 0x34c - AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0xcc).as_packed()), - // Index 068: 0x34f - AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0xff).as_packed()), - // Index 069: 0x380 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0x00).as_packed()), - // Index 070: 0x383 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0x33).as_packed()), - // Index 071: 0x386 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0x66).as_packed()), - // Index 072: 0x388 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0x88).as_packed()), - // Index 073: 0x38c - AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0xcc).as_packed()), - // Index 074: 0x38f - AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0xff).as_packed()), - // Index 075: 0x3a0 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0x00).as_packed()), - // Index 076: 0x3a3 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0x33).as_packed()), - // Index 077: 0x3a6 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0x66).as_packed()), - // Index 078: 0x3a8 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0x88).as_packed()), - // Index 079: 0x3ac - AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0xcc).as_packed()), - // Index 080: 0x3af - AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0xff).as_packed()), - // Index 081: 0x3e0 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0x00).as_packed()), - // Index 082: 0x3e3 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0x33).as_packed()), - // Index 083: 0x3e6 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0x66).as_packed()), - // Index 084: 0x3e8 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0x88).as_packed()), - // Index 085: 0x3ec - AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0xcc).as_packed()), - // Index 086: 0x3ef - AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0xff).as_packed()), - // Index 087: 0x3f0 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0x00).as_packed()), - // Index 088: 0x3f3 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0x33).as_packed()), - // Index 089: 0x3f6 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0x66).as_packed()), - // Index 090: 0x3f8 - AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0x88).as_packed()), - // Index 091: 0x3fc - AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0xcc).as_packed()), - // Index 092: 0x3ff - AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0xff).as_packed()), - // Index 093: 0x600 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0x00).as_packed()), - // Index 094: 0x603 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0x33).as_packed()), - // Index 095: 0x606 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0x66).as_packed()), - // Index 096: 0x608 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0x88).as_packed()), - // Index 097: 0x60c - AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0xcc).as_packed()), - // Index 098: 0x60f - AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0xff).as_packed()), - // Index 099: 0x620 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0x00).as_packed()), - // Index 100: 0x623 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0x33).as_packed()), - // Index 101: 0x626 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0x66).as_packed()), - // Index 102: 0x628 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0x88).as_packed()), - // Index 103: 0x62c - AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0xcc).as_packed()), - // Index 104: 0x62f - AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0xff).as_packed()), - // Index 105: 0x640 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0x00).as_packed()), - // Index 106: 0x643 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0x33).as_packed()), - // Index 107: 0x646 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0x66).as_packed()), - // Index 108: 0x648 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0x88).as_packed()), - // Index 109: 0x64c - AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0xcc).as_packed()), - // Index 110: 0x64f - AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0xff).as_packed()), - // Index 111: 0x680 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0x00).as_packed()), - // Index 112: 0x683 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0x33).as_packed()), - // Index 113: 0x686 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0x66).as_packed()), - // Index 114: 0x688 - AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0x88).as_packed()), - // Index 115: 0x68c - AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0xcc).as_packed()), - // Index 116: 0x68f - AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0xff).as_packed()), - // Index 117: 0x6a0 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0x00).as_packed()), - // Index 118: 0x6a3 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0x33).as_packed()), - // Index 119: 0x6a6 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0x66).as_packed()), - // Index 120: 0x6a8 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0x88).as_packed()), - // Index 121: 0x6ac - AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0xcc).as_packed()), - // Index 122: 0x6af - AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0xff).as_packed()), - // Index 123: 0x6e0 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0x00).as_packed()), - // Index 124: 0x6e3 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0x33).as_packed()), - // Index 125: 0x6e6 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0x66).as_packed()), - // Index 126: 0x6e8 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0x88).as_packed()), - // Index 127: 0x6ec - AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0xcc).as_packed()), - // Index 128: 0x6ef - AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0xff).as_packed()), - // Index 129: 0x6f0 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0x00).as_packed()), - // Index 130: 0x6f3 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0x33).as_packed()), - // Index 131: 0x6f6 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0x66).as_packed()), - // Index 132: 0x6f8 - AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0x88).as_packed()), - // Index 133: 0x6fc - AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0xcc).as_packed()), - // Index 134: 0x6ff - AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0xff).as_packed()), - // Index 135: 0x803 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x00, 0x33).as_packed()), - // Index 136: 0x806 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x00, 0x66).as_packed()), - // Index 137: 0x80c - AtomicU32::new(RGBColour::from_rgb(0x88, 0x00, 0xcc).as_packed()), - // Index 138: 0x80f - AtomicU32::new(RGBColour::from_rgb(0x88, 0x00, 0xff).as_packed()), - // Index 139: 0x820 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0x00).as_packed()), - // Index 140: 0x823 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0x33).as_packed()), - // Index 141: 0x826 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0x66).as_packed()), - // Index 142: 0x828 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0x88).as_packed()), - // Index 143: 0x82c - AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0xcc).as_packed()), - // Index 144: 0x82f - AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0xff).as_packed()), - // Index 145: 0x840 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0x00).as_packed()), - // Index 146: 0x843 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0x33).as_packed()), - // Index 147: 0x846 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0x66).as_packed()), - // Index 148: 0x848 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0x88).as_packed()), - // Index 149: 0x84c - AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0xcc).as_packed()), - // Index 150: 0x84f - AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0xff).as_packed()), - // Index 151: 0x883 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x88, 0x33).as_packed()), - // Index 152: 0x886 - AtomicU32::new(RGBColour::from_rgb(0x88, 0x88, 0x66).as_packed()), - // Index 153: 0x88c - AtomicU32::new(RGBColour::from_rgb(0x88, 0x88, 0xcc).as_packed()), - // Index 154: 0x88f - AtomicU32::new(RGBColour::from_rgb(0x88, 0x88, 0xff).as_packed()), - // Index 155: 0x8a0 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0x00).as_packed()), - // Index 156: 0x8a3 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0x33).as_packed()), - // Index 157: 0x8a6 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0x66).as_packed()), - // Index 158: 0x8a8 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0x88).as_packed()), - // Index 159: 0x8ac - AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0xcc).as_packed()), - // Index 160: 0x8af - AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0xff).as_packed()), - // Index 161: 0x8e0 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0x00).as_packed()), - // Index 162: 0x8e3 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0x33).as_packed()), - // Index 163: 0x8e6 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0x66).as_packed()), - // Index 164: 0x8e8 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0x88).as_packed()), - // Index 165: 0x8ec - AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0xcc).as_packed()), - // Index 166: 0x8ef - AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0xff).as_packed()), - // Index 167: 0x8f0 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0x00).as_packed()), - // Index 168: 0x8f3 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0x33).as_packed()), - // Index 169: 0x8f6 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0x66).as_packed()), - // Index 170: 0x8f8 - AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0x88).as_packed()), - // Index 171: 0x8fc - AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0xcc).as_packed()), - // Index 172: 0x8ff - AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0xff).as_packed()), - // Index 173: 0xc00 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0x00).as_packed()), - // Index 174: 0xc03 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0x33).as_packed()), - // Index 175: 0xc06 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0x66).as_packed()), - // Index 176: 0xc08 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0x88).as_packed()), - // Index 177: 0xc0c - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0xcc).as_packed()), - // Index 178: 0xc0f - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0xff).as_packed()), - // Index 179: 0xc20 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0x00).as_packed()), - // Index 180: 0xc23 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0x33).as_packed()), - // Index 181: 0xc26 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0x66).as_packed()), - // Index 182: 0xc28 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0x88).as_packed()), - // Index 183: 0xc2c - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0xcc).as_packed()), - // Index 184: 0xc2f - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0xff).as_packed()), - // Index 185: 0xc40 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0x00).as_packed()), - // Index 186: 0xc43 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0x33).as_packed()), - // Index 187: 0xc46 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0x66).as_packed()), - // Index 188: 0xc48 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0x88).as_packed()), - // Index 189: 0xc4c - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0xcc).as_packed()), - // Index 190: 0xc4f - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0xff).as_packed()), - // Index 191: 0xc80 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0x00).as_packed()), - // Index 192: 0xc83 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0x33).as_packed()), - // Index 193: 0xc86 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0x66).as_packed()), - // Index 194: 0xc88 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0x88).as_packed()), - // Index 195: 0xc8c - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0xcc).as_packed()), - // Index 196: 0xc8f - AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0xff).as_packed()), - // Index 197: 0xca0 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0x00).as_packed()), - // Index 198: 0xca3 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0x33).as_packed()), - // Index 199: 0xca6 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0x66).as_packed()), - // Index 200: 0xca8 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0x88).as_packed()), - // Index 201: 0xcac - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0xcc).as_packed()), - // Index 202: 0xcaf - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0xff).as_packed()), - // Index 203: 0xce0 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0x00).as_packed()), - // Index 204: 0xce3 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0x33).as_packed()), - // Index 205: 0xce6 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0x66).as_packed()), - // Index 206: 0xce8 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0x88).as_packed()), - // Index 207: 0xcec - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0xcc).as_packed()), - // Index 208: 0xcef - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0xff).as_packed()), - // Index 209: 0xcf0 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0x00).as_packed()), - // Index 210: 0xcf3 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0x33).as_packed()), - // Index 211: 0xcf6 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0x66).as_packed()), - // Index 212: 0xcf8 - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0x88).as_packed()), - // Index 213: 0xcfc - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0xcc).as_packed()), - // Index 214: 0xcff - AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0xff).as_packed()), - // Index 215: 0xf03 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0x33).as_packed()), - // Index 216: 0xf06 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0x66).as_packed()), - // Index 217: 0xf08 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0x88).as_packed()), - // Index 218: 0xf0c - AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0xcc).as_packed()), - // Index 219: 0xf20 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0x00).as_packed()), - // Index 220: 0xf23 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0x33).as_packed()), - // Index 221: 0xf26 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0x66).as_packed()), - // Index 222: 0xf28 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0x88).as_packed()), - // Index 223: 0xf2c - AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0xcc).as_packed()), - // Index 224: 0xf2f - AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0xff).as_packed()), - // Index 225: 0xf40 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0x00).as_packed()), - // Index 226: 0xf43 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0x33).as_packed()), - // Index 227: 0xf46 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0x66).as_packed()), - // Index 228: 0xf48 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0x88).as_packed()), - // Index 229: 0xf4c - AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0xcc).as_packed()), - // Index 230: 0xf4f - AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0xff).as_packed()), - // Index 231: 0xf80 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0x00).as_packed()), - // Index 232: 0xf83 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0x33).as_packed()), - // Index 233: 0xf86 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0x66).as_packed()), - // Index 234: 0xf88 - AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0x88).as_packed()), - // Index 235: 0xf8c - AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0xcc).as_packed()), - // Index 236: 0xf8f - AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0xff).as_packed()), - // Index 237: 0xfa0 - AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0x00).as_packed()), - // Index 238: 0xfa3 - AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0x33).as_packed()), - // Index 239: 0xfa6 - AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0x66).as_packed()), - // Index 240: 0xfa8 - AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0x88).as_packed()), - // Index 241: 0xfac - AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0xcc).as_packed()), - // Index 242: 0xfaf - AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0xff).as_packed()), - // Index 243: 0xfe0 - AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0x00).as_packed()), - // Index 244: 0xfe3 - AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0x33).as_packed()), - // Index 245: 0xfe6 - AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0x66).as_packed()), - // Index 246: 0xfe8 - AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0x88).as_packed()), - // Index 247: 0xfec - AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0xcc).as_packed()), - // Index 248: 0xfef - AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0xff).as_packed()), - // Index 249: 0xff3 - AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0x33).as_packed()), - // Index 250: 0xff6 - AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0x66).as_packed()), - // Index 251: 0xff8 - AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0x88).as_packed()), - // Index 252: 0xffc - AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0xcc).as_packed()), - // Index 253: 0xbbb - AtomicU32::new(RGBColour::from_rgb(0xbb, 0xbb, 0xbb).as_packed()), - // Index 254: 0x333 - AtomicU32::new(RGBColour::from_rgb(0x33, 0x33, 0x33).as_packed()), - // Index 255: 0x777 - AtomicU32::new(RGBColour::from_rgb(0x77, 0x77, 0x77).as_packed()), -]; +static PALETTE: [AtomicU32; 256] = palette::make_default_palette(); +/// Our current video mode. +/// +/// Defaulting to Mode 0 - 640x480 timing, 80x30 text mode static VIDEO_MODE: AtomicU8 = AtomicU8::new(0); /// HID events come from here @@ -742,9 +234,15 @@ fn main() { *CONFIG_FILE_PATH.lock().unwrap() = Some(config_path); } + let default_mode = unsafe { common::video::Mode::from_u8(0) }; + let width = (default_mode.horizontal_pixels() as f32) * SCALE_FACTOR; + let height = (default_mode.vertical_lines() as f32) * SCALE_FACTOR; + info!("Default Window set to {} x {}", width, height); + // Make a window let mut engine = Engine::builder() - .dimensions(640, 480) + .dimensions(width as u32, height as u32) + .scale(SCALE_FACTOR, SCALE_FACTOR) .title("Neotron Desktop BIOS") .show_frame_rate() .target_frame_rate(60) @@ -752,10 +250,11 @@ fn main() { .unwrap(); let (sender, receiver) = mpsc::channel(); let mut app = MyApp { - mode: unsafe { common::video::Mode::from_u8(0) }, + mode: default_mode, font8x16: Vec::new(), font8x8: Vec::new(), sender, + reset: true, }; EV_QUEUE.lock().unwrap().replace(receiver); @@ -934,11 +433,24 @@ extern "C" fn configuration_set(buffer: common::FfiByteSlice) -> common::ApiResu /// Does this Neotron BIOS support this video mode? extern "C" fn video_is_valid_mode(mode: common::video::Mode) -> bool { - debug!("video_is_valid_mode()"); - mode == common::video::Mode::new( - common::video::Timing::T640x480, - common::video::Format::Text8x16, - ) + let result = match mode.as_u8() { + // 640x480 80x30 text mode + 0 => true, + // 640x480 80x60 text mode + 1 => true, + // 640x480, 8-bpp bitmap mode + 4 => true, + // 640x480, 4-bpp bitmap mode + 5 => true, + // 640x480, 2-bpp bitmap mode + 6 => true, + // 640x480, 1-bpp bitmap mode + 7 => true, + // nothing else will work + _ => false, + }; + debug!("video_is_valid_mode({:?}) = {}", mode, result); + result } /// Switch to a new video mode. @@ -946,29 +458,9 @@ extern "C" fn video_is_valid_mode(mode: common::video::Mode) -> bool { /// The contents of the screen are undefined after a call to this function. extern "C" fn video_set_mode(mode: common::video::Mode, fb: *mut u32) -> common::ApiResult<()> { info!("video_set_mode({:?})", mode); - match mode.timing() { - common::video::Timing::T640x480 => { - // OK - } - common::video::Timing::T640x400 => { - // OK - } - _ => { - return common::ApiResult::Err(common::Error::UnsupportedConfiguration); - } - } - match mode.format() { - common::video::Format::Text8x16 => { - // OK - } - common::video::Format::Text8x8 => { - // OK - } - _ => { - return common::ApiResult::Err(common::Error::UnsupportedConfiguration); - } + if !video_is_valid_mode(mode) { + return common::ApiResult::Err(common::Error::UnsupportedConfiguration); } - // We know this is a valid video mode because it was set with `video_set_mode`. let mode_value = mode.as_u8(); VIDEO_MODE.store(mode_value, Ordering::Relaxed); @@ -995,7 +487,7 @@ extern "C" fn video_get_mode() -> common::video::Mode { /// allowed to write to, is a function of the current video mode (see /// `video_get_mode`). extern "C" fn video_get_framebuffer() -> *mut u32 { - let p = FRAMEBUFFER.get_pointer() as *mut u32; + let p = FRAMEBUFFER.get_pointer(); debug!("video_get_framebuffer() -> {:p}", p); p } @@ -1031,10 +523,10 @@ extern "C" fn memory_get_region(region: u8) -> common::FfiOption { if unsafe { MEMORY_BLOCK.0.is_null() } { - // Allocate 256 KiB of storage space for the OS to use - let mut data = Box::new([0u8; 256 * 1024]); + // Allocate 1 MiB of storage space for the OS to use + let mut data = Box::new([0u8; 1024 * 1024]); unsafe { - MEMORY_BLOCK.0 = data.as_mut_ptr() as *mut u8; + MEMORY_BLOCK.0 = data.as_mut_ptr(); MEMORY_BLOCK.1 = std::mem::size_of_val(&*data); } std::mem::forget(data); @@ -1556,7 +1048,12 @@ impl MyApp { for glyph in 0..=255 { for palette_entry in PALETTE.iter().take(Self::NUM_FG) { let fg = RGBColour::from_packed(palette_entry.load(Ordering::Relaxed)); - info!("Drawing {glyph} in {:06x}", fg.as_packed()); + debug!( + "Drawing glyph {} from font {} in colour {:06x}", + glyph, + font.name, + fg.as_packed() + ); let texture_id = if texture_buffer.len() > slot { texture_buffer[slot] } else { @@ -1592,6 +1089,86 @@ impl MyApp { Self::render_font(&font::font8::FONT, &mut self.font8x8, s)?; Ok(()) } + + fn render_text( + &self, + font: &[pix_engine::texture::TextureId], + font_height: u16, + s: &mut PixState, + ) -> PixResult<()> { + let num_cols = self.mode.text_width().unwrap(); + let num_rows = self.mode.text_height().unwrap(); + let mut bg_idx = 0; + let mut bg_rgb = { + let bg = RGBColour::from_packed(PALETTE[usize::from(bg_idx)].load(Ordering::Relaxed)); + rgb!(bg.red(), bg.green(), bg.blue()) + }; + s.stroke(None); + // FRAMEBUFFER is an num_cols x num_rows size array of (u8_glyph, u8_attr). + for row in 0..num_rows { + let y = row * font_height; + for col in 0..num_cols { + let cell_no = (row * num_cols) + col; + let byte_offset = usize::from(cell_no) * 2; + let x = col * 8; + let glyph = FRAMEBUFFER.get_at(byte_offset); + let attr = common::video::Attr(FRAMEBUFFER.get_at(byte_offset + 1)); + let fg_idx = attr.fg().make_ffi_safe().0; + let new_bg_idx = attr.bg().make_ffi_safe().0; + if new_bg_idx != bg_idx { + bg_idx = new_bg_idx; + let bg = RGBColour::from_packed( + PALETTE[usize::from(bg_idx)].load(Ordering::Relaxed), + ); + bg_rgb = rgb!(bg.red(), bg.green(), bg.blue()); + } + let glyph_box = rect!(i32::from(x), i32::from(y), 8i32, font_height as i32,); + s.fill(bg_rgb); + s.rect(glyph_box)?; + let slot = (usize::from(glyph) * Self::NUM_FG) + usize::from(fg_idx); + s.texture(font[slot], None, Some(glyph_box))?; + } + } + Ok(()) + } + + fn render_chunky(&self, s: &mut PixState) -> PixResult<()> { + let shift = 8 - BPP; + let num_colours = 1 << BPP; + let pixels_per_byte = 8 / BPP; + let num_col_bytes = self.mode.line_size_bytes(); + let num_rows = self.mode.vertical_lines() as usize; + let colours = Self::make_colours(num_colours); + for y in 0..num_rows { + let y_bytes = y * num_col_bytes; + for x_byte in 0..num_col_bytes { + let byte_offset = y_bytes + x_byte; + let mut data = FRAMEBUFFER.get_at(byte_offset); + let x_start = x_byte * pixels_per_byte; + for x in 0..pixels_per_byte { + let bit = (data >> shift) as usize; + s.stroke(colours[bit]); + let p = point!((x_start + x) as i32, y as i32); + s.point(p)?; + data <<= BPP; + } + } + } + Ok(()) + } + + fn make_colours(count: usize) -> Vec { + let mut result = vec![]; + for palette_entry in PALETTE.iter().take(count) { + let rgb = RGBColour::from_packed(palette_entry.load(Ordering::Relaxed)); + result.push(rgb!(rgb.red(), rgb.green(), rgb.blue())); + } + if count == 2 { + // special case - use black/white for 2 colour mode, not black/blue + result[1] = rgb!(0xFF, 0xFF, 0xFF); + } + result + } } impl PixEngine for MyApp { @@ -1629,7 +1206,18 @@ impl PixEngine for MyApp { self.sender.send(AppEvent::KeyDown(*key)).unwrap(); Ok(true) } - _ => Ok(false), + Event::Window { + win_event: WindowEvent::Moved(_, _), + .. + } => { + // need to reset the scale when the window is moved? + self.reset = true; + Ok(true) + } + _ => { + debug!("Didn't know about {:?}", event); + Ok(false) + } } } @@ -1639,46 +1227,30 @@ impl PixEngine for MyApp { fn on_update(&mut self, s: &mut PixState) -> PixResult<()> { let mode_value = VIDEO_MODE.load(Ordering::Relaxed); let new_mode = unsafe { common::video::Mode::from_u8(mode_value) }; - if new_mode != self.mode { + if new_mode != self.mode || self.reset { + info!("New video mode detected, or needs reset"); + self.reset = false; self.mode = new_mode; let width = (new_mode.horizontal_pixels() as f32) * SCALE_FACTOR; let height = (new_mode.vertical_lines() as f32) * SCALE_FACTOR; info!("Window set to {} x {}", width, height); s.set_window_dimensions((width as u32, height as u32))?; s.scale(SCALE_FACTOR, SCALE_FACTOR)?; + s.background(rgb!(0, 0, 0)); + s.clear()?; } s.blend_mode(BlendMode::Blend); - let (font, font_height) = match self.mode.format() { - common::video::Format::Text8x16 => (&self.font8x16, 16), - common::video::Format::Text8x8 => (&self.font8x8, 8), + match self.mode.format() { + common::video::Format::Text8x16 => self.render_text(&self.font8x16, 16, s)?, + common::video::Format::Text8x8 => self.render_text(&self.font8x8, 8, s)?, + common::video::Format::Chunky1 => self.render_chunky::<1>(s)?, + common::video::Format::Chunky2 => self.render_chunky::<2>(s)?, + common::video::Format::Chunky4 => self.render_chunky::<4>(s)?, + common::video::Format::Chunky8 => self.render_chunky::<8>(s)?, _ => { // Unknown mode - do nothing - return Ok(()); - } - }; - - let num_cols = self.mode.text_width().unwrap(); - let num_rows = self.mode.text_height().unwrap(); - // FRAMEBUFFER is an num_cols x num_rows size array of (u8_glyph, u8_attr). - for row in 0..num_rows { - let y = row * font_height; - for col in 0..num_cols { - let cell_no = (row * num_cols) + col; - let byte_offset = usize::from(cell_no) * 2; - let x = col * 8; - let glyph = FRAMEBUFFER.get_at(byte_offset); - let attr = common::video::Attr(FRAMEBUFFER.get_at(byte_offset + 1)); - let fg_idx = attr.fg().make_ffi_safe().0; - let bg_idx = attr.bg().make_ffi_safe().0; - let bg = - RGBColour::from_packed(PALETTE[usize::from(bg_idx)].load(Ordering::Relaxed)); - let glyph_box = rect!(i32::from(x), i32::from(y), 8i32, font_height as i32,); - s.fill(rgb!(bg.red(), bg.green(), bg.blue())); - s.rect(glyph_box)?; - let slot = (usize::from(glyph) * Self::NUM_FG) + usize::from(fg_idx); - s.texture(font[slot], None, Some(glyph_box))?; } } diff --git a/src/palette.rs b/src/palette.rs new file mode 100644 index 0000000..221f24f --- /dev/null +++ b/src/palette.rs @@ -0,0 +1,519 @@ +use neotron_common_bios::video::RGBColour; +use std::sync::atomic::AtomicU32; + +pub(crate) const fn make_default_palette() -> [std::sync::atomic::AtomicU32; 256] { + [ + // Index 000: 0x000 (Black) + AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0x00).as_packed()), + // Index 001: 0x00a (Blue) + AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0xaa).as_packed()), + // Index 002: 0x0a0 (Green) + AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0x00).as_packed()), + // Index 003: 0x0aa (Cyan) + AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0xaa).as_packed()), + // Index 004: 0xa00 (Red) + AtomicU32::new(RGBColour::from_rgb(0xaa, 0x00, 0x00).as_packed()), + // Index 005: 0xa0a (Magenta) + AtomicU32::new(RGBColour::from_rgb(0xaa, 0x00, 0xaa).as_packed()), + // Index 006: 0xaa0 (Brown) + AtomicU32::new(RGBColour::from_rgb(0xaa, 0xaa, 0x00).as_packed()), + // Index 007: 0xaaa (Light Gray) + AtomicU32::new(RGBColour::from_rgb(0xaa, 0xaa, 0xaa).as_packed()), + // Index 008: 0x666 (Dark Gray) + AtomicU32::new(RGBColour::from_rgb(0x66, 0x66, 0x66).as_packed()), + // Index 009: 0x00f (Light Blue) + AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0xff).as_packed()), + // Index 010: 0x0f0 (Light Green) + AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0x00).as_packed()), + // Index 011: 0x0ff (Light Cyan) + AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0xff).as_packed()), + // Index 012: 0xf00 (Light Red) + AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0x00).as_packed()), + // Index 013: 0xf0f (Pink) + AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0xff).as_packed()), + // Index 014: 0xff0 (Yellow) + AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0x00).as_packed()), + // Index 015: 0xfff (White) + AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0xff).as_packed()), + // Index 016: 0x003 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0x33).as_packed()), + // Index 017: 0x006 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0x66).as_packed()), + // Index 018: 0x00c + AtomicU32::new(RGBColour::from_rgb(0x00, 0x00, 0xcc).as_packed()), + // Index 019: 0x020 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0x00).as_packed()), + // Index 020: 0x023 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0x33).as_packed()), + // Index 021: 0x026 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0x66).as_packed()), + // Index 022: 0x028 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0x88).as_packed()), + // Index 023: 0x02c + AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0xcc).as_packed()), + // Index 024: 0x02f + AtomicU32::new(RGBColour::from_rgb(0x00, 0x22, 0xff).as_packed()), + // Index 025: 0x040 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0x00).as_packed()), + // Index 026: 0x043 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0x33).as_packed()), + // Index 027: 0x046 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0x66).as_packed()), + // Index 028: 0x048 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0x88).as_packed()), + // Index 029: 0x04c + AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0xcc).as_packed()), + // Index 030: 0x04f + AtomicU32::new(RGBColour::from_rgb(0x00, 0x44, 0xff).as_packed()), + // Index 031: 0x083 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x88, 0x33).as_packed()), + // Index 032: 0x086 + AtomicU32::new(RGBColour::from_rgb(0x00, 0x88, 0x66).as_packed()), + // Index 033: 0x08c + AtomicU32::new(RGBColour::from_rgb(0x00, 0x88, 0xcc).as_packed()), + // Index 034: 0x08f + AtomicU32::new(RGBColour::from_rgb(0x00, 0x88, 0xff).as_packed()), + // Index 035: 0x0a0 + AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0x00).as_packed()), + // Index 036: 0x0a3 + AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0x33).as_packed()), + // Index 037: 0x0a6 + AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0x66).as_packed()), + // Index 038: 0x0a8 + AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0x88).as_packed()), + // Index 039: 0x0ac + AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0xcc).as_packed()), + // Index 040: 0x0af + AtomicU32::new(RGBColour::from_rgb(0x00, 0xaa, 0xff).as_packed()), + // Index 041: 0x0e0 + AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0x00).as_packed()), + // Index 042: 0x0e3 + AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0x33).as_packed()), + // Index 043: 0x0e6 + AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0x66).as_packed()), + // Index 044: 0x0e8 + AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0x88).as_packed()), + // Index 045: 0x0ec + AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0xcc).as_packed()), + // Index 046: 0x0ef + AtomicU32::new(RGBColour::from_rgb(0x00, 0xee, 0xff).as_packed()), + // Index 047: 0x0f3 + AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0x33).as_packed()), + // Index 048: 0x0f6 + AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0x66).as_packed()), + // Index 049: 0x0f8 + AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0x88).as_packed()), + // Index 050: 0x0fc + AtomicU32::new(RGBColour::from_rgb(0x00, 0xff, 0xcc).as_packed()), + // Index 051: 0x300 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0x00).as_packed()), + // Index 052: 0x303 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0x33).as_packed()), + // Index 053: 0x306 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0x66).as_packed()), + // Index 054: 0x308 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0x88).as_packed()), + // Index 055: 0x30c + AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0xcc).as_packed()), + // Index 056: 0x30f + AtomicU32::new(RGBColour::from_rgb(0x33, 0x00, 0xff).as_packed()), + // Index 057: 0x320 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0x00).as_packed()), + // Index 058: 0x323 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0x33).as_packed()), + // Index 059: 0x326 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0x66).as_packed()), + // Index 060: 0x328 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0x88).as_packed()), + // Index 061: 0x32c + AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0xcc).as_packed()), + // Index 062: 0x32f + AtomicU32::new(RGBColour::from_rgb(0x33, 0x22, 0xff).as_packed()), + // Index 063: 0x340 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0x00).as_packed()), + // Index 064: 0x343 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0x33).as_packed()), + // Index 065: 0x346 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0x66).as_packed()), + // Index 066: 0x348 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0x88).as_packed()), + // Index 067: 0x34c + AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0xcc).as_packed()), + // Index 068: 0x34f + AtomicU32::new(RGBColour::from_rgb(0x33, 0x44, 0xff).as_packed()), + // Index 069: 0x380 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0x00).as_packed()), + // Index 070: 0x383 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0x33).as_packed()), + // Index 071: 0x386 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0x66).as_packed()), + // Index 072: 0x388 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0x88).as_packed()), + // Index 073: 0x38c + AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0xcc).as_packed()), + // Index 074: 0x38f + AtomicU32::new(RGBColour::from_rgb(0x33, 0x88, 0xff).as_packed()), + // Index 075: 0x3a0 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0x00).as_packed()), + // Index 076: 0x3a3 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0x33).as_packed()), + // Index 077: 0x3a6 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0x66).as_packed()), + // Index 078: 0x3a8 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0x88).as_packed()), + // Index 079: 0x3ac + AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0xcc).as_packed()), + // Index 080: 0x3af + AtomicU32::new(RGBColour::from_rgb(0x33, 0xaa, 0xff).as_packed()), + // Index 081: 0x3e0 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0x00).as_packed()), + // Index 082: 0x3e3 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0x33).as_packed()), + // Index 083: 0x3e6 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0x66).as_packed()), + // Index 084: 0x3e8 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0x88).as_packed()), + // Index 085: 0x3ec + AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0xcc).as_packed()), + // Index 086: 0x3ef + AtomicU32::new(RGBColour::from_rgb(0x33, 0xee, 0xff).as_packed()), + // Index 087: 0x3f0 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0x00).as_packed()), + // Index 088: 0x3f3 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0x33).as_packed()), + // Index 089: 0x3f6 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0x66).as_packed()), + // Index 090: 0x3f8 + AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0x88).as_packed()), + // Index 091: 0x3fc + AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0xcc).as_packed()), + // Index 092: 0x3ff + AtomicU32::new(RGBColour::from_rgb(0x33, 0xff, 0xff).as_packed()), + // Index 093: 0x600 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0x00).as_packed()), + // Index 094: 0x603 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0x33).as_packed()), + // Index 095: 0x606 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0x66).as_packed()), + // Index 096: 0x608 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0x88).as_packed()), + // Index 097: 0x60c + AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0xcc).as_packed()), + // Index 098: 0x60f + AtomicU32::new(RGBColour::from_rgb(0x66, 0x00, 0xff).as_packed()), + // Index 099: 0x620 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0x00).as_packed()), + // Index 100: 0x623 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0x33).as_packed()), + // Index 101: 0x626 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0x66).as_packed()), + // Index 102: 0x628 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0x88).as_packed()), + // Index 103: 0x62c + AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0xcc).as_packed()), + // Index 104: 0x62f + AtomicU32::new(RGBColour::from_rgb(0x66, 0x22, 0xff).as_packed()), + // Index 105: 0x640 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0x00).as_packed()), + // Index 106: 0x643 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0x33).as_packed()), + // Index 107: 0x646 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0x66).as_packed()), + // Index 108: 0x648 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0x88).as_packed()), + // Index 109: 0x64c + AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0xcc).as_packed()), + // Index 110: 0x64f + AtomicU32::new(RGBColour::from_rgb(0x66, 0x44, 0xff).as_packed()), + // Index 111: 0x680 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0x00).as_packed()), + // Index 112: 0x683 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0x33).as_packed()), + // Index 113: 0x686 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0x66).as_packed()), + // Index 114: 0x688 + AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0x88).as_packed()), + // Index 115: 0x68c + AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0xcc).as_packed()), + // Index 116: 0x68f + AtomicU32::new(RGBColour::from_rgb(0x66, 0x88, 0xff).as_packed()), + // Index 117: 0x6a0 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0x00).as_packed()), + // Index 118: 0x6a3 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0x33).as_packed()), + // Index 119: 0x6a6 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0x66).as_packed()), + // Index 120: 0x6a8 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0x88).as_packed()), + // Index 121: 0x6ac + AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0xcc).as_packed()), + // Index 122: 0x6af + AtomicU32::new(RGBColour::from_rgb(0x66, 0xaa, 0xff).as_packed()), + // Index 123: 0x6e0 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0x00).as_packed()), + // Index 124: 0x6e3 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0x33).as_packed()), + // Index 125: 0x6e6 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0x66).as_packed()), + // Index 126: 0x6e8 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0x88).as_packed()), + // Index 127: 0x6ec + AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0xcc).as_packed()), + // Index 128: 0x6ef + AtomicU32::new(RGBColour::from_rgb(0x66, 0xee, 0xff).as_packed()), + // Index 129: 0x6f0 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0x00).as_packed()), + // Index 130: 0x6f3 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0x33).as_packed()), + // Index 131: 0x6f6 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0x66).as_packed()), + // Index 132: 0x6f8 + AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0x88).as_packed()), + // Index 133: 0x6fc + AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0xcc).as_packed()), + // Index 134: 0x6ff + AtomicU32::new(RGBColour::from_rgb(0x66, 0xff, 0xff).as_packed()), + // Index 135: 0x803 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x00, 0x33).as_packed()), + // Index 136: 0x806 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x00, 0x66).as_packed()), + // Index 137: 0x80c + AtomicU32::new(RGBColour::from_rgb(0x88, 0x00, 0xcc).as_packed()), + // Index 138: 0x80f + AtomicU32::new(RGBColour::from_rgb(0x88, 0x00, 0xff).as_packed()), + // Index 139: 0x820 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0x00).as_packed()), + // Index 140: 0x823 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0x33).as_packed()), + // Index 141: 0x826 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0x66).as_packed()), + // Index 142: 0x828 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0x88).as_packed()), + // Index 143: 0x82c + AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0xcc).as_packed()), + // Index 144: 0x82f + AtomicU32::new(RGBColour::from_rgb(0x88, 0x22, 0xff).as_packed()), + // Index 145: 0x840 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0x00).as_packed()), + // Index 146: 0x843 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0x33).as_packed()), + // Index 147: 0x846 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0x66).as_packed()), + // Index 148: 0x848 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0x88).as_packed()), + // Index 149: 0x84c + AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0xcc).as_packed()), + // Index 150: 0x84f + AtomicU32::new(RGBColour::from_rgb(0x88, 0x44, 0xff).as_packed()), + // Index 151: 0x883 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x88, 0x33).as_packed()), + // Index 152: 0x886 + AtomicU32::new(RGBColour::from_rgb(0x88, 0x88, 0x66).as_packed()), + // Index 153: 0x88c + AtomicU32::new(RGBColour::from_rgb(0x88, 0x88, 0xcc).as_packed()), + // Index 154: 0x88f + AtomicU32::new(RGBColour::from_rgb(0x88, 0x88, 0xff).as_packed()), + // Index 155: 0x8a0 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0x00).as_packed()), + // Index 156: 0x8a3 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0x33).as_packed()), + // Index 157: 0x8a6 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0x66).as_packed()), + // Index 158: 0x8a8 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0x88).as_packed()), + // Index 159: 0x8ac + AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0xcc).as_packed()), + // Index 160: 0x8af + AtomicU32::new(RGBColour::from_rgb(0x88, 0xaa, 0xff).as_packed()), + // Index 161: 0x8e0 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0x00).as_packed()), + // Index 162: 0x8e3 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0x33).as_packed()), + // Index 163: 0x8e6 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0x66).as_packed()), + // Index 164: 0x8e8 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0x88).as_packed()), + // Index 165: 0x8ec + AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0xcc).as_packed()), + // Index 166: 0x8ef + AtomicU32::new(RGBColour::from_rgb(0x88, 0xee, 0xff).as_packed()), + // Index 167: 0x8f0 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0x00).as_packed()), + // Index 168: 0x8f3 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0x33).as_packed()), + // Index 169: 0x8f6 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0x66).as_packed()), + // Index 170: 0x8f8 + AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0x88).as_packed()), + // Index 171: 0x8fc + AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0xcc).as_packed()), + // Index 172: 0x8ff + AtomicU32::new(RGBColour::from_rgb(0x88, 0xff, 0xff).as_packed()), + // Index 173: 0xc00 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0x00).as_packed()), + // Index 174: 0xc03 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0x33).as_packed()), + // Index 175: 0xc06 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0x66).as_packed()), + // Index 176: 0xc08 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0x88).as_packed()), + // Index 177: 0xc0c + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0xcc).as_packed()), + // Index 178: 0xc0f + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x00, 0xff).as_packed()), + // Index 179: 0xc20 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0x00).as_packed()), + // Index 180: 0xc23 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0x33).as_packed()), + // Index 181: 0xc26 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0x66).as_packed()), + // Index 182: 0xc28 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0x88).as_packed()), + // Index 183: 0xc2c + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0xcc).as_packed()), + // Index 184: 0xc2f + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x22, 0xff).as_packed()), + // Index 185: 0xc40 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0x00).as_packed()), + // Index 186: 0xc43 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0x33).as_packed()), + // Index 187: 0xc46 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0x66).as_packed()), + // Index 188: 0xc48 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0x88).as_packed()), + // Index 189: 0xc4c + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0xcc).as_packed()), + // Index 190: 0xc4f + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x44, 0xff).as_packed()), + // Index 191: 0xc80 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0x00).as_packed()), + // Index 192: 0xc83 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0x33).as_packed()), + // Index 193: 0xc86 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0x66).as_packed()), + // Index 194: 0xc88 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0x88).as_packed()), + // Index 195: 0xc8c + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0xcc).as_packed()), + // Index 196: 0xc8f + AtomicU32::new(RGBColour::from_rgb(0xcc, 0x88, 0xff).as_packed()), + // Index 197: 0xca0 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0x00).as_packed()), + // Index 198: 0xca3 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0x33).as_packed()), + // Index 199: 0xca6 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0x66).as_packed()), + // Index 200: 0xca8 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0x88).as_packed()), + // Index 201: 0xcac + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0xcc).as_packed()), + // Index 202: 0xcaf + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xaa, 0xff).as_packed()), + // Index 203: 0xce0 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0x00).as_packed()), + // Index 204: 0xce3 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0x33).as_packed()), + // Index 205: 0xce6 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0x66).as_packed()), + // Index 206: 0xce8 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0x88).as_packed()), + // Index 207: 0xcec + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0xcc).as_packed()), + // Index 208: 0xcef + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xee, 0xff).as_packed()), + // Index 209: 0xcf0 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0x00).as_packed()), + // Index 210: 0xcf3 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0x33).as_packed()), + // Index 211: 0xcf6 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0x66).as_packed()), + // Index 212: 0xcf8 + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0x88).as_packed()), + // Index 213: 0xcfc + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0xcc).as_packed()), + // Index 214: 0xcff + AtomicU32::new(RGBColour::from_rgb(0xcc, 0xff, 0xff).as_packed()), + // Index 215: 0xf03 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0x33).as_packed()), + // Index 216: 0xf06 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0x66).as_packed()), + // Index 217: 0xf08 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0x88).as_packed()), + // Index 218: 0xf0c + AtomicU32::new(RGBColour::from_rgb(0xff, 0x00, 0xcc).as_packed()), + // Index 219: 0xf20 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0x00).as_packed()), + // Index 220: 0xf23 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0x33).as_packed()), + // Index 221: 0xf26 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0x66).as_packed()), + // Index 222: 0xf28 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0x88).as_packed()), + // Index 223: 0xf2c + AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0xcc).as_packed()), + // Index 224: 0xf2f + AtomicU32::new(RGBColour::from_rgb(0xff, 0x22, 0xff).as_packed()), + // Index 225: 0xf40 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0x00).as_packed()), + // Index 226: 0xf43 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0x33).as_packed()), + // Index 227: 0xf46 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0x66).as_packed()), + // Index 228: 0xf48 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0x88).as_packed()), + // Index 229: 0xf4c + AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0xcc).as_packed()), + // Index 230: 0xf4f + AtomicU32::new(RGBColour::from_rgb(0xff, 0x44, 0xff).as_packed()), + // Index 231: 0xf80 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0x00).as_packed()), + // Index 232: 0xf83 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0x33).as_packed()), + // Index 233: 0xf86 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0x66).as_packed()), + // Index 234: 0xf88 + AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0x88).as_packed()), + // Index 235: 0xf8c + AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0xcc).as_packed()), + // Index 236: 0xf8f + AtomicU32::new(RGBColour::from_rgb(0xff, 0x88, 0xff).as_packed()), + // Index 237: 0xfa0 + AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0x00).as_packed()), + // Index 238: 0xfa3 + AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0x33).as_packed()), + // Index 239: 0xfa6 + AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0x66).as_packed()), + // Index 240: 0xfa8 + AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0x88).as_packed()), + // Index 241: 0xfac + AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0xcc).as_packed()), + // Index 242: 0xfaf + AtomicU32::new(RGBColour::from_rgb(0xff, 0xaa, 0xff).as_packed()), + // Index 243: 0xfe0 + AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0x00).as_packed()), + // Index 244: 0xfe3 + AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0x33).as_packed()), + // Index 245: 0xfe6 + AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0x66).as_packed()), + // Index 246: 0xfe8 + AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0x88).as_packed()), + // Index 247: 0xfec + AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0xcc).as_packed()), + // Index 248: 0xfef + AtomicU32::new(RGBColour::from_rgb(0xff, 0xee, 0xff).as_packed()), + // Index 249: 0xff3 + AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0x33).as_packed()), + // Index 250: 0xff6 + AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0x66).as_packed()), + // Index 251: 0xff8 + AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0x88).as_packed()), + // Index 252: 0xffc + AtomicU32::new(RGBColour::from_rgb(0xff, 0xff, 0xcc).as_packed()), + // Index 253: 0xbbb + AtomicU32::new(RGBColour::from_rgb(0xbb, 0xbb, 0xbb).as_packed()), + // Index 254: 0x333 + AtomicU32::new(RGBColour::from_rgb(0x33, 0x33, 0x33).as_packed()), + // Index 255: 0x777 + AtomicU32::new(RGBColour::from_rgb(0x77, 0x77, 0x77).as_packed()), + ] +}