diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index e758ee5..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,3222 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "adler32" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" - -[[package]] -name = "ahash" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" - -[[package]] -name = "aho-corasick" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" -dependencies = [ - "memchr", -] - -[[package]] -name = "alsa" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5915f52fe2cf65e83924d037b6c5290b7cee097c6b5c8700746e6168a343fd6b" -dependencies = [ - "alsa-sys", - "bitflags", - "libc", - "nix 0.23.1", -] - -[[package]] -name = "alsa-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "anyhow" -version = "1.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1485d4d2cc45e7b201ee3767015c96faa5904387c9d87c6efdd0fb511f12d305" - -[[package]] -name = "arrayvec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" - -[[package]] -name = "ash" -version = "0.34.0+1.2.203" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f780da53d0063880d45554306489f09dd8d1bda47688b4a57bc579119356df" -dependencies = [ - "libloading", -] - -[[package]] -name = "ashpd" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7915e26e0786f91768d23de32afafa4ee5e2ea76be21c0ecd8e14441543c1655" -dependencies = [ - "enumflags2", - "futures", - "rand", - "serde", - "serde_repr", - "zbus", -] - -[[package]] -name = "async-broadcast" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90622698a1218e0b2fb846c97b5f19a0831f6baddee73d9454156365ccfa473b" -dependencies = [ - "easy-parallel", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-executor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "once_cell", - "slab", -] - -[[package]] -name = "async-io" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" -dependencies = [ - "concurrent-queue", - "futures-lite", - "libc", - "log", - "once_cell", - "parking", - "polling", - "slab", - "socket2", - "waker-fn", - "winapi", -] - -[[package]] -name = "async-lock" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-recursion" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7d78656ba01f1b93024b7c3a0467f1608e4be67d725749fdcd7d2c7678fd7a2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "async-task" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d306121baf53310a3fd342d88dc0824f6bbeace68347593658525565abee8" - -[[package]] -name = "async-trait" -version = "0.1.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "atk-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "autocfg" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" - -[[package]] -name = "bindgen" -version = "0.59.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", -] - -[[package]] -name = "bit-set" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bit_field" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "bumpalo" -version = "3.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" - -[[package]] -name = "bytemuck" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72957246c41db82b8ef88a5486143830adeb8227ef9837740bdec67724cf2c5b" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" - -[[package]] -name = "cache-padded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" - -[[package]] -name = "cairo-sys-rs" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" -dependencies = [ - "libc", - "system-deps", -] - -[[package]] -name = "calloop" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf2eec61efe56aa1e813f5126959296933cf0700030e4314786c48779a66ab82" -dependencies = [ - "log", - "nix 0.22.0", -] - -[[package]] -name = "cc" -version = "1.0.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79c2681d6594606957bbb8631c4b90a7fcaaa72cdb714743a437b156d6a7eedd" -dependencies = [ - "jobserver", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-expr" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edae0b9625d1fce32f7d64b71784d9b1bf8469ec1a9c417e44aaf16a9cbd7571" -dependencies = [ - "smallvec", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - -[[package]] -name = "chrono" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6127248204b9aba09a362f6c930ef6a78f2c1b2215f8a7b398c06e1083f17af0" -dependencies = [ - "js-sys", - "num-integer", - "num-traits", - "time 0.1.44", - "wasm-bindgen", - "winapi", -] - -[[package]] -name = "clang-sys" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "claxon" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" - -[[package]] -name = "cocoa" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" -dependencies = [ - "bitflags", - "block", - "cocoa-foundation", - "core-foundation 0.9.2", - "core-graphics 0.22.2", - "foreign-types", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" -dependencies = [ - "bitflags", - "block", - "core-foundation 0.9.2", - "core-graphics-types", - "foreign-types", - "libc", - "objc", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "combine" -version = "4.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a604e93b79d1808327a6fca85a6f2d69de66461e7620f5a4cbf5fb4d1d7c948" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" -dependencies = [ - "cache-padded", -] - -[[package]] -name = "copyless" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" - -[[package]] -name = "core-foundation" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" -dependencies = [ - "core-foundation-sys 0.7.0", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" -dependencies = [ - "core-foundation-sys 0.8.3", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" - -[[package]] -name = "core-foundation-sys" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" - -[[package]] -name = "core-graphics" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" -dependencies = [ - "bitflags", - "core-foundation 0.7.0", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "269f35f69b542b80e736a20a89a05215c0ce80c2c03c514abb2e318b78379d86" -dependencies = [ - "bitflags", - "core-foundation 0.9.2", - "core-graphics-types", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" -dependencies = [ - "bitflags", - "core-foundation 0.9.2", - "foreign-types", - "libc", -] - -[[package]] -name = "core-video-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" -dependencies = [ - "cfg-if 0.1.10", - "core-foundation-sys 0.7.0", - "core-graphics 0.19.2", - "libc", - "objc", -] - -[[package]] -name = "coreaudio-rs" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11894b20ebfe1ff903cbdc52259693389eea03b94918a2def2c30c3bf227ad88" -dependencies = [ - "bitflags", - "coreaudio-sys", -] - -[[package]] -name = "coreaudio-sys" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dff444d80630d7073077d38d40b4501fd518bd2b922c2a55edcc8b0f7be57e6" -dependencies = [ - "bindgen", -] - -[[package]] -name = "cpal" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74117836a5124f3629e4b474eed03e479abaf98988b4bb317e29f08cfe0e4116" -dependencies = [ - "alsa", - "core-foundation-sys 0.8.3", - "coreaudio-rs", - "jni", - "js-sys", - "lazy_static", - "libc", - "mach", - "ndk 0.6.0", - "ndk-glue 0.6.2", - "nix 0.23.1", - "oboe", - "parking_lot", - "stdweb", - "thiserror", - "web-sys", - "winapi", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", - "lazy_static", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" -dependencies = [ - "cfg-if 1.0.0", - "lazy_static", -] - -[[package]] -name = "cty" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" - -[[package]] -name = "d3d12" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2daefd788d1e96e0a9d66dee4b828b883509bc3ea9ce30665f04c3246372690c" -dependencies = [ - "bitflags", - "libloading", - "winapi", -] - -[[package]] -name = "darling" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" -dependencies = [ - "darling_core", - "quote", - "syn", -] - -[[package]] -name = "deflate" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f" -dependencies = [ - "adler32", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dlib" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" -dependencies = [ - "libloading", -] - -[[package]] -name = "downcast-rs" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" - -[[package]] -name = "easy-parallel" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6907e25393cdcc1f4f3f513d9aac1e840eb1cc341a0fccb01171f7d14d10b946" - -[[package]] -name = "either" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" - -[[package]] -name = "enum-iterator" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a0ac4aeb3a18f92eaf09c6bb9b3ac30ff61ca95514fc58cbead1c9a6bf5401" -dependencies = [ - "enum-iterator-derive", -] - -[[package]] -name = "enum-iterator-derive" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13f1e69590421890f90448c3cd5f554746a31adc6dc0dac406ec6901db8dc25" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "enumflags2" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25c90b056b3f84111cf183cbeddef0d3a0bbe9a674f057e1a1533c315f24def" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144ec79496cbab6f84fa125dc67be9264aef22eb8a28da8454d9c33f15108da4" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "event-listener" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" - -[[package]] -name = "exr" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4badb9489a465cb2c555af1f00f0bfd8cecd6fc12ac11da9d5b40c5dd5f0200" -dependencies = [ - "bit_field", - "deflate", - "flume", - "half", - "inflate", - "lebe", - "smallvec", - "threadpool", -] - -[[package]] -name = "fastrand" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" -dependencies = [ - "instant", -] - -[[package]] -name = "flate2" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" -dependencies = [ - "cfg-if 1.0.0", - "crc32fast", - "libc", - "miniz_oxide 0.4.4", -] - -[[package]] -name = "flume" -version = "0.10.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843c03199d0c0ca54bc1ea90ac0d507274c28abcc4f691ae8b4eaa375087c76a" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "pin-project", - "spin", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" -dependencies = [ - "matches", - "percent-encoding", -] - -[[package]] -name = "fox32" -version = "0.5.0" -dependencies = [ - "anyhow", - "chrono", - "image", - "log", - "pixels", - "rfd", - "ringbuf", - "rodio", - "vergen", - "winit", - "winit_input_helper", -] - -[[package]] -name = "futures" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28560757fe2bb34e79f907794bb6b22ae8b0e5c669b638a1132f2592b19035b4" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" - -[[package]] -name = "futures-executor" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" - -[[package]] -name = "futures-lite" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-macro" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" - -[[package]] -name = "futures-task" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" - -[[package]] -name = "futures-util" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413424d9818621fa3cfc8a3a915cdb89a7c3c507d56761b4ec83a9a98e587171" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - -[[package]] -name = "getrandom" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getset" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "gif" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a7187e78088aead22ceedeee99779455b23fc231fe13ec443f99bb71694e5b" -dependencies = [ - "color_quant", - "weezl", -] - -[[package]] -name = "gio-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b57719ccaacf2a0d9c79f151be629f3a3ef3991658ee2af0bb66287e4ea86c" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", -] - -[[package]] -name = "git2" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0155506aab710a86160ddb504a480d2964d7ab5b9e62419be69e0032bc5931c" -dependencies = [ - "bitflags", - "libc", - "libgit2-sys", - "log", - "url", -] - -[[package]] -name = "glib-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c668102c6e15e0a7f6b99b59f602c2e806967bb86414f617b77e19b1de5b3fac" -dependencies = [ - "libc", - "system-deps", -] - -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "glow" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "gobject-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb1f0b3e4c08e2a0a490d1082ba9e902cdff8ff07091e85c6caec60d17e2ab" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gpu-alloc" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e64cbb8d36508d3e19da95e56e196a84f674fc190881f2cc010000798838aa6" -dependencies = [ - "bitflags", - "gpu-alloc-types", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5" -dependencies = [ - "bitflags", -] - -[[package]] -name = "gpu-descriptor" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a237f0419ab10d17006d55c62ac4f689a6bf52c75d3f38b8361d249e8d4b0b" -dependencies = [ - "bitflags", - "gpu-descriptor-types", - "hashbrown 0.9.1", -] - -[[package]] -name = "gpu-descriptor-types" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126" -dependencies = [ - "bitflags", -] - -[[package]] -name = "gtk-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "013419d486809ebafd7d8c2450afcfcf384c1a52dd079660f88c2a3b2e19f82f" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - -[[package]] -name = "hashbrown" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hexf-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" - -[[package]] -name = "hound" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a164bb2ceaeff4f42542bdb847c41517c78a60f5649671b2a07312b6e117549" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "image" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db207d030ae38f1eb6f240d5a1c1c88ff422aa005d10f8c6c6fc5e75286ab30e" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "exr", - "gif", - "jpeg-decoder 0.2.2", - "num-iter", - "num-rational", - "num-traits", - "png", - "scoped_threadpool", - "tiff", -] - -[[package]] -name = "indexmap" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" -dependencies = [ - "autocfg", - "hashbrown 0.11.2", -] - -[[package]] -name = "inflate" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff" -dependencies = [ - "adler32", -] - -[[package]] -name = "inplace_it" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90953f308a79fe6d62a4643e51f848fbfddcd05975a38e69fdf4ab86a7baf7ca" - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "itoa" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" - -[[package]] -name = "jni" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" -dependencies = [ - "cesu8", - "combine", - "jni-sys", - "log", - "thiserror", - "walkdir", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" -dependencies = [ - "libc", -] - -[[package]] -name = "jpeg-decoder" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" - -[[package]] -name = "jpeg-decoder" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "105fb082d64e2100074587f59a74231f771750c664af903f1f9f76c9dedfc6f1" -dependencies = [ - "rayon", -] - -[[package]] -name = "js-sys" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "khronos-egl" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3" -dependencies = [ - "libc", - "libloading", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "lebe" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7efd1d698db0759e6ef11a7cd44407407399a910c774dd804c64c032da7826ff" - -[[package]] -name = "lewton" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" -dependencies = [ - "byteorder", - "ogg", - "tinyvec", -] - -[[package]] -name = "libc" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" - -[[package]] -name = "libgit2-sys" -version = "0.13.4+1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fa6563431ede25f5cc7f6d803c6afbc1c5d3ad3d4925d12c882bf2b526f5d1" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - -[[package]] -name = "libloading" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cf036d15402bea3c5d4de17b3fce76b3e4a56ebc1f577be0e7a72f7c607cf0" -dependencies = [ - "cfg-if 1.0.0", - "winapi", -] - -[[package]] -name = "libz-sys" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "lock_api" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "mach" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" -dependencies = [ - "libc", -] - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - -[[package]] -name = "memchr" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" - -[[package]] -name = "memmap2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" -dependencies = [ - "autocfg", -] - -[[package]] -name = "metal" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0514f491f4cc03632ab399ee01e2c1c1b12d3e1cf2d667c1ff5f87d6dcd2084" -dependencies = [ - "bitflags", - "block", - "core-graphics-types", - "foreign-types", - "log", - "objc", -] - -[[package]] -name = "minimal-lexical" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c64630dcdd71f1a64c435f54885086a0de5d6a12d104d69b165fb7d5286d677" - -[[package]] -name = "minimp3" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985438f75febf74c392071a975a29641b420dd84431135a6e6db721de4b74372" -dependencies = [ - "minimp3-sys", - "slice-deque", - "thiserror", -] - -[[package]] -name = "minimp3-sys" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e21c73734c69dc95696c9ed8926a2b393171d98b3f5f5935686a26a487ab9b90" -dependencies = [ - "cc", -] - -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" -dependencies = [ - "adler", - "autocfg", -] - -[[package]] -name = "miniz_oxide" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" -dependencies = [ - "libc", - "log", - "miow", - "ntapi", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", -] - -[[package]] -name = "naga" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4419062f8aa39fb25938169486341945758679e260ddbc1f94bfd1f33924dc2" -dependencies = [ - "bit-set", - "bitflags", - "codespan-reporting", - "hexf-parse", - "indexmap", - "log", - "num-traits", - "rustc-hash", - "spirv", - "thiserror", -] - -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom", -] - -[[package]] -name = "ndk" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d868f654c72e75f8687572699cdabe755f03effbb62542768e995d5b8d699d" -dependencies = [ - "bitflags", - "jni-sys", - "ndk-sys 0.2.2", - "num_enum", - "thiserror", -] - -[[package]] -name = "ndk" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" -dependencies = [ - "bitflags", - "jni-sys", - "ndk-sys 0.3.0", - "num_enum", - "thiserror", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-glue" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc291b8de2095cba8dab7cf381bf582ff4c17a09acf854c32e46545b08085d28" -dependencies = [ - "lazy_static", - "libc", - "log", - "ndk 0.5.0", - "ndk-macro", - "ndk-sys 0.2.2", -] - -[[package]] -name = "ndk-glue" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0c4a7b83860226e6b4183edac21851f05d5a51756e97a1144b7f5a6b63e65f" -dependencies = [ - "lazy_static", - "libc", - "log", - "ndk 0.6.0", - "ndk-context", - "ndk-macro", - "ndk-sys 0.3.0", -] - -[[package]] -name = "ndk-macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" -dependencies = [ - "darling", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "ndk-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" - -[[package]] -name = "ndk-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "nix" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1e25ee6b412c2a1e3fcb6a4499a5c1bfe7f43e014bdce9a6b6666e5aa2d187" -dependencies = [ - "bitflags", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset", -] - -[[package]] -name = "nix" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" -dependencies = [ - "bitflags", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset", -] - -[[package]] -name = "nom" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffd9d26838a953b4af82cbeb9f1592c6798916983959be223a7124e992742c1" -dependencies = [ - "memchr", - "minimal-lexical", - "version_check", -] - -[[package]] -name = "ntapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" -dependencies = [ - "winapi", -] - -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "num-integer" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f" -dependencies = [ - "derivative", - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", - "objc_exception", -] - -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - -[[package]] -name = "oboe" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f63c358b4fa0fbcfefd7c8be5cfc39c08ce2389f5325687e7762a48d30a5c1" -dependencies = [ - "jni", - "ndk 0.6.0", - "ndk-context", - "num-derive", - "num-traits", - "oboe-sys", -] - -[[package]] -name = "oboe-sys" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3370abb7372ed744232c12954d920d1a40f1c4686de9e79e800021ef492294bd" -dependencies = [ - "cc", -] - -[[package]] -name = "ogg" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" -dependencies = [ - "byteorder", -] - -[[package]] -name = "once_cell" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" - -[[package]] -name = "ordered-stream" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44630c059eacfd6e08bdaa51b1db2ce33119caa4ddc1235e923109aa5f25ccb1" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "pango-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7022c2fb88cd2d9d55e1a708a8c53a3ae8678234c4a54bf623400aeb7f31fac2" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "parking" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall", - "smallvec", - "winapi", -] - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - -[[package]] -name = "pin-project" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pixels" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3be4951b24b374c72b0aaaeb59e51e1acb38b8e680b11f43c1d0049b8550891" -dependencies = [ - "bytemuck", - "pollster", - "raw-window-handle", - "thiserror", - "ultraviolet", - "wgpu", -] - -[[package]] -name = "pkg-config" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10e2fcbb64ecbe64c8e040a386c3104d384583af58b956d870aaaf229df6e66d" - -[[package]] -name = "png" -version = "0.17.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" -dependencies = [ - "bitflags", - "crc32fast", - "deflate", - "miniz_oxide 0.5.1", -] - -[[package]] -name = "polling" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "log", - "wepoll-ffi", - "winapi", -] - -[[package]] -name = "pollster" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb20dcc30536a1508e75d47dd0e399bb2fe7354dcf35cda9127f2bf1ed92e30e" - -[[package]] -name = "ppv-lite86" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" - -[[package]] -name = "proc-macro-crate" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" -dependencies = [ - "thiserror", - "toml", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "profiling" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dfd5592a8eed7e74f56ad7b125f8234763b805c30f0c7c95c486920026a6ec" - -[[package]] -name = "quote" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core", -] - -[[package]] -name = "range-alloc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6" - -[[package]] -name = "raw-window-handle" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba75eee94a9d5273a68c9e1e105d9cffe1ef700532325788389e5a83e2522b7" -dependencies = [ - "cty", -] - -[[package]] -name = "rayon" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" -dependencies = [ - "autocfg", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "lazy_static", - "num_cpus", -] - -[[package]] -name = "redox_syscall" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" - -[[package]] -name = "renderdoc-sys" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157" - -[[package]] -name = "rfd" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aaf1d71ccd44689f7c2c72da1117fd8db71f72a76fe9b5c5dbb17ab903007e0" -dependencies = [ - "ashpd", - "block", - "dispatch", - "glib-sys", - "gobject-sys", - "gtk-sys", - "js-sys", - "lazy_static", - "log", - "objc", - "objc-foundation", - "objc_id", - "pollster", - "raw-window-handle", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows", -] - -[[package]] -name = "ringbuf" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3064490f4a0c5bc127544803fbc2bb5f77ec5170f0208f2d7b605a4f396d44" -dependencies = [ - "cache-padded", -] - -[[package]] -name = "rodio" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0939e9f626e6c6f1989adb6226a039c855ca483053f0ee7c98b90e41cf731e" -dependencies = [ - "claxon", - "cpal", - "hound", - "lewton", - "minimp3", -] - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustversion" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" - -[[package]] -name = "safe_arch" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ff3d6d9696af502cc3110dacce942840fb06ff4514cad92236ecc455f2ce05" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - -[[package]] -name = "scoped_threadpool" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "serde" -version = "1.0.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_repr" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sha1" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", -] - -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - -[[package]] -name = "shlex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" - -[[package]] -name = "slab" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" - -[[package]] -name = "slice-deque" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31ef6ee280cdefba6d2d0b4b78a84a1c1a3f3a4cec98c2d4231c8bc225de0f25" -dependencies = [ - "libc", - "mach", - "winapi", -] - -[[package]] -name = "slotmap" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" - -[[package]] -name = "smithay-client-toolkit" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1325f292209cee78d5035530932422a30aa4c8fda1a16593ac083c1de211e68a" -dependencies = [ - "bitflags", - "calloop", - "dlib", - "lazy_static", - "log", - "memmap2", - "nix 0.22.0", - "pkg-config", - "wayland-client", - "wayland-cursor", - "wayland-protocols", -] - -[[package]] -name = "socket2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "spin" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spirv" -version = "0.2.0+1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" -dependencies = [ - "bitflags", - "num-traits", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "stdweb" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5430c8e36b713e13b48a9f709cc21e046723fe44ce34587b73a830203b533e" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "syn" -version = "1.0.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "system-deps" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1487aaddaacbc5d60a2a507ba1617c5ca66c57dd0dd07d0c5efd5b693841d4" -dependencies = [ - "cfg-expr", - "heck", - "pkg-config", - "toml", - "version-compare", -] - -[[package]] -name = "termcolor" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "tiff" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0247608e998cb6ce39dfc8f4a16c50361ce71e5b52e6d24ea1227ea8ea8ee0b2" -dependencies = [ - "flate2", - "jpeg-decoder 0.1.22", - "weezl", -] - -[[package]] -name = "time" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" -dependencies = [ - "libc", - "wasi", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db76ff9fa4b1458b3c7f077f3ff9887394058460d21e634355b273aaf11eea45" -dependencies = [ - "itoa", - "libc", - "num_threads", -] - -[[package]] -name = "tinyvec" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "toml" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" -dependencies = [ - "serde", -] - -[[package]] -name = "ultraviolet" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b9e3507eba17043af05c8a72fce3ec2c24b58945f45732e71dbc6646d904a7" -dependencies = [ - "wide", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" - -[[package]] -name = "unicode-ident" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" - -[[package]] -name = "unicode-normalization" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" - -[[package]] -name = "unicode-width" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" - -[[package]] -name = "url" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" -dependencies = [ - "form_urlencoded", - "idna", - "matches", - "percent-encoding", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vergen" -version = "7.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffa80ed519f45995741e70664d4abcf147d2a47b8c7ea0a4aa495548ef9474f" -dependencies = [ - "anyhow", - "cfg-if 1.0.0", - "enum-iterator", - "getset", - "git2", - "rustversion", - "thiserror", - "time 0.3.13", -] - -[[package]] -name = "version-compare" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73" - -[[package]] -name = "version_check" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" - -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - -[[package]] -name = "walkdir" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" -dependencies = [ - "same-file", - "winapi", - "winapi-util", -] - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasm-bindgen" -version = "0.2.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" - -[[package]] -name = "wayland-client" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91223460e73257f697d9e23d401279123d36039a3f7a449e983f123292d4458f" -dependencies = [ - "bitflags", - "downcast-rs", - "libc", - "nix 0.22.0", - "scoped-tls", - "wayland-commons", - "wayland-scanner", - "wayland-sys", -] - -[[package]] -name = "wayland-commons" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f6e5e340d7c13490eca867898c4cec5af56c27a5ffe5c80c6fc4708e22d33e" -dependencies = [ - "nix 0.22.0", - "once_cell", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-cursor" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c52758f13d5e7861fc83d942d3d99bf270c83269575e52ac29e5b73cb956a6bd" -dependencies = [ - "nix 0.22.0", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60147ae23303402e41fe034f74fb2c35ad0780ee88a1c40ac09a3be1e7465741" -dependencies = [ - "bitflags", - "wayland-client", - "wayland-commons", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39a1ed3143f7a143187156a2ab52742e89dac33245ba505c17224df48939f9e0" -dependencies = [ - "proc-macro2", - "quote", - "xml-rs", -] - -[[package]] -name = "wayland-sys" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9341df79a8975679188e37dab3889bfa57c44ac2cb6da166f519a81cbe452d4" -dependencies = [ - "dlib", - "lazy_static", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "weezl" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e" - -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - -[[package]] -name = "wgpu" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97cd781ff044d6d697b632a2e212032c2e957d1afaa21dbf58069cbb8f78567" -dependencies = [ - "arrayvec", - "js-sys", - "log", - "naga", - "parking_lot", - "raw-window-handle", - "smallvec", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core", - "wgpu-hal", - "wgpu-types", -] - -[[package]] -name = "wgpu-core" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe9cb9c9d728c0f7ea0c309f1b3d5e9d5c7d379890d0a4e3df3103323ff7a84" -dependencies = [ - "arrayvec", - "bitflags", - "cfg_aliases", - "codespan-reporting", - "copyless", - "fxhash", - "log", - "naga", - "parking_lot", - "profiling", - "raw-window-handle", - "smallvec", - "thiserror", - "wgpu-hal", - "wgpu-types", -] - -[[package]] -name = "wgpu-hal" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "742ec904d0577e1a88b82dba6cf0347c12197cd664b859b05f868bceb8cfff4d" -dependencies = [ - "arrayvec", - "ash", - "bit-set", - "bitflags", - "block", - "core-graphics-types", - "d3d12", - "foreign-types", - "fxhash", - "glow", - "gpu-alloc", - "gpu-descriptor", - "inplace_it", - "js-sys", - "khronos-egl", - "libloading", - "log", - "metal", - "naga", - "objc", - "parking_lot", - "profiling", - "range-alloc", - "raw-window-handle", - "renderdoc-sys", - "thiserror", - "wasm-bindgen", - "web-sys", - "wgpu-types", - "winapi", -] - -[[package]] -name = "wgpu-types" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "549533d9e1cdd4b4cda7718d33ff500fc4c34b5467b71d76b547ae0324f3b2a2" -dependencies = [ - "bitflags", -] - -[[package]] -name = "wide" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bbe7c604a27ca0b05c5503221e76da628225b568e6f1280b42dbad3b72d89b" -dependencies = [ - "bytemuck", - "safe_arch", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b749ebd2304aa012c5992d11a25d07b406bdbe5f79d371cb7a918ce501a19eb0" -dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_msvc" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca" - -[[package]] -name = "windows_i686_gnu" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8" - -[[package]] -name = "windows_i686_msvc" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1" - -[[package]] -name = "winit" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b43cc931d58b99461188607efd7acb2a093e65fc621f54cad78517a6063e73a" -dependencies = [ - "bitflags", - "cocoa", - "core-foundation 0.9.2", - "core-graphics 0.22.2", - "core-video-sys", - "dispatch", - "instant", - "lazy_static", - "libc", - "log", - "mio", - "ndk 0.5.0", - "ndk-glue 0.5.0", - "ndk-sys 0.2.2", - "objc", - "parking_lot", - "percent-encoding", - "raw-window-handle", - "smithay-client-toolkit", - "wasm-bindgen", - "wayland-client", - "wayland-protocols", - "web-sys", - "winapi", - "x11-dl", -] - -[[package]] -name = "winit_input_helper" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c8618b5c5e3f44a9d0a2ace15ad580cb7402d585507f4f9c74d07af7603909" -dependencies = [ - "winit", -] - -[[package]] -name = "x11-dl" -version = "2.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" -dependencies = [ - "lazy_static", - "libc", - "pkg-config", -] - -[[package]] -name = "xcursor" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" -dependencies = [ - "nom", -] - -[[package]] -name = "xml-rs" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" - -[[package]] -name = "zbus" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac8424f5aa1f239d2d7ecb32f9d5ffc6fcf5fb9298d2d524a7e7c8b258c3f80" -dependencies = [ - "async-broadcast", - "async-channel", - "async-executor", - "async-io", - "async-lock", - "async-recursion", - "async-task", - "async-trait", - "byteorder", - "derivative", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix 0.23.1", - "once_cell", - "ordered-stream", - "rand", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e03af45fc15e2c977161c5ffea56c43c41f425a963affd7074bf91b5bf5a8cf" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "regex", - "syn", -] - -[[package]] -name = "zbus_names" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45dfcdcf87b71dad505d30cc27b1b7b88a64b6d1c435648f48f9dbc1fdc4b7e1" -dependencies = [ - "serde", - "static_assertions", - "zvariant", -] - -[[package]] -name = "zvariant" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ea5dc38b2058fae6a5b79009388143dadce1e91c26a67f984a0fc0381c8033" -dependencies = [ - "byteorder", - "enumflags2", - "libc", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2cecc5a61c2a053f7f653a24cd15b3b0195d7f7ddb5042c837fb32e161fb7a" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index 20c36fb..0000000 --- a/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "fox32" -version = "0.5.0" -authors = ["ry"] -edition = "2021" -build = "build.rs" - -[dependencies] -chrono = "0.4" -image = "0.24" -log = "0.4" -pixels = "0.9.0" -rfd = "0.7.0" -ringbuf = "0.2" -rodio = "0.15.0" -winit = "0.26" -winit_input_helper = "0.11" - -[build-dependencies] -anyhow = "1.0" -vergen = { version = "7", default-features = false, features = ["build", "git"] } diff --git a/LICENSE b/LICENSE deleted file mode 100644 index e3189df..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 ryfox/ry755 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/build.rs b/build.rs deleted file mode 100644 index 6ed42d8..0000000 --- a/build.rs +++ /dev/null @@ -1,9 +0,0 @@ -use anyhow::Result; -use vergen::{Config, ShaKind, vergen}; - -fn main() -> Result<()> { - let mut config = Config::default(); - *config.git_mut().sha_kind_mut() = ShaKind::Short; - *config.git_mut().skip_if_error_mut() = true; - vergen(config) -} diff --git a/docs/encoding.md b/docs/encoding.md deleted file mode 100644 index 78424be..0000000 --- a/docs/encoding.md +++ /dev/null @@ -1,51 +0,0 @@ -# Encoding -``` -size instr . cond dest src -xx xxxxxx 0 xxx xx xx <8,16,32 bits> <8,16,32 bits> -``` - - -# Size table -If the instruction doesn't allow variable sizes or a size was not specified, set the size bits to Word (0b10) -| | | -| :--: | -------------- | -| 0b00 | byte (8 bits) | -| 0b01 | half (16 bits) | -| 0b10 | word (32 bits) | - -# Instruction table -| 0x | -0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | -8 | -9 | -A | -B | -C | -D | -E | -F | -| :-: | ---- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | -------------- | ---- | ----- | -------------- | --- | --- | --- | --- | --- | -| 0- | NOP | ADD[.8,16,32] | MUL[.8,16,32] | AND[.8,16,32] | SLA[.8,16,32] | SRA[.8,16,32] | BSE[.8,16,32] | CMP[.8,16,32] | JMP | RJMP | PUSH[.8,16,32] | IN | ISE | MSE | | | -| 1- | HALT | INC[.8,16,32] | | OR[.8,16,32] | | SRL[.8,16,32] | BCL[.8,16,32] | MOV[.8,16,32] | CALL | RCALL | POP[.8,16,32] | OUT | ICL | MCL | | | -| 2- | BRK | SUB[.8,16,32] | DIV[.8,16,32] | XOR[.8,16,32] | ROL[.8,16,32] | ROR[.8,16,32] | BTS[.8,16,32] | MOVZ[.8,16,32] | LOOP | RLOOP | RET | | INT | TLB | | | -| 3- | | DEC[.8,16,32] | REM[.8,16,32] | NOT[.8,16,32] | | | | | | RTA | RETI | | | FLP | | | - -# Condition table -| | | | -| :---: | ------ | --------------------------------------------- | -| 0b000 | --- | always | -| 0b001 | IFZ | zero | -| 0b010 | IFNZ | not zero | -| 0b011 | IFC | carry | -| 0b011 | IFLT | less than (equivalent to IFC) | -| 0b100 | IFNC | not carry | -| 0b100 | IFGTEQ | greater than or equal to (equivalent to IFNC) | -| 0b101 | IFGT | greater than | -| 0b110 | IFLTEQ | less than or equal to | - -# Destination table -| | | -| :--: | ------------------- | -| 0b00 | register | -| 0b01 | register (pointer) | -| 0b10 | (invalid) | -| 0b11 | immediate (pointer) | - -# Source table -| | | -| :--: | ------------------- | -| 0b00 | register | -| 0b01 | register (pointer) | -| 0b10 | immediate | -| 0b11 | immediate (pointer) | diff --git a/docs/logos/32.png b/docs/logos/32.png deleted file mode 100644 index 6d0c77b..0000000 Binary files a/docs/logos/32.png and /dev/null differ diff --git a/docs/logos/32.svg b/docs/logos/32.svg deleted file mode 100644 index a4ceb89..0000000 --- a/docs/logos/32.svg +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - 32 - diff --git a/docs/logos/fox32.png b/docs/logos/fox32.png deleted file mode 100644 index 17aaf8b..0000000 Binary files a/docs/logos/fox32.png and /dev/null differ diff --git a/docs/logos/fox32.svg b/docs/logos/fox32.svg deleted file mode 100644 index 134a450..0000000 --- a/docs/logos/fox32.svg +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - 32 - fox - diff --git a/docs/screenshots/screenshot_fox32rom.png b/docs/screenshots/screenshot_fox32rom.png deleted file mode 100644 index d568382..0000000 Binary files a/docs/screenshots/screenshot_fox32rom.png and /dev/null differ diff --git a/docs/screenshots/screenshot_launcher.png b/docs/screenshots/screenshot_launcher.png deleted file mode 100644 index f7ff118..0000000 Binary files a/docs/screenshots/screenshot_launcher.png and /dev/null differ diff --git a/src/32.png b/src/32.png deleted file mode 100644 index 6d0c77b..0000000 Binary files a/src/32.png and /dev/null differ diff --git a/src/audio.rs b/src/audio.rs deleted file mode 100644 index aaf05c2..0000000 --- a/src/audio.rs +++ /dev/null @@ -1,70 +0,0 @@ -// audio.rs - -use crate::Interrupt; -use crate::memory::Memory; - -use std::sync::{Arc, Mutex}; -use std::sync::mpsc::Sender; -use std::{thread, time}; -use rodio::{OutputStream, buffer::SamplesBuffer, Sink}; - -const AUDIO_BUFFER_0_ADDRESS: usize = 0x0212C000; -const AUDIO_BUFFER_1_ADDRESS: usize = 0x02134000; -const AUDIO_BUFFER_2_ADDRESS: usize = 0x02290000; -const AUDIO_BUFFER_3_ADDRESS: usize = 0x02298000; -const AUDIO_BUFFER_SIZE: usize = 0x8000; - -const AUDIO_CHANNEL_0_INTERRUPT: u8 = 0xFE; -const AUDIO_CHANNEL_1_INTERRUPT: u8 = 0xFD; -const AUDIO_CHANNEL_2_INTERRUPT: u8 = 0xFC; -const AUDIO_CHANNEL_3_INTERRUPT: u8 = 0xFB; - -pub struct AudioChannel { - pub id: u8, - pub playing: bool, - pub sample_rate: u32, -} - -impl AudioChannel { - pub fn new(id: u8) -> Self { - AudioChannel { - id, - playing: false, - sample_rate: 0, - } - } - - // this is terrible - pub fn spawn_thread(this: Arc>, interrupt_sender: Sender, memory: Memory) { - let (audio_buffer_address, audio_channel_interrupt) = match this.lock().unwrap().id { - 0 => (AUDIO_BUFFER_0_ADDRESS, AUDIO_CHANNEL_0_INTERRUPT), - 1 => (AUDIO_BUFFER_1_ADDRESS, AUDIO_CHANNEL_1_INTERRUPT), - 2 => (AUDIO_BUFFER_2_ADDRESS, AUDIO_CHANNEL_2_INTERRUPT), - 3 => (AUDIO_BUFFER_3_ADDRESS, AUDIO_CHANNEL_3_INTERRUPT), - _ => unreachable!(), - }; - let builder = thread::Builder::new().name("audio".to_string()); - builder.spawn({ - move || { - let (_stream, stream_handle) = OutputStream::try_default().unwrap(); - let channel = Sink::try_new(&stream_handle).unwrap(); - loop { - // every `sleep` number of ms, play what is in the audio buffer - let self_lock = this.lock().unwrap(); - if self_lock.playing { - let audio_buffer: Vec = memory.ram()[audio_buffer_address..audio_buffer_address+AUDIO_BUFFER_SIZE] - .to_vec() - .chunks_exact(2) - .map(|x| ((x[1] as i16) << 8) | x[0] as i16) - .collect(); - // 1 Hz = 1000 ms - let sleep: f32 = (1000 as f32 / self_lock.sample_rate as f32) * (AUDIO_BUFFER_SIZE as f32 / 2.0); - channel.append(SamplesBuffer::new(1, self_lock.sample_rate, audio_buffer)); - interrupt_sender.send(Interrupt::Request(audio_channel_interrupt)).unwrap(); - thread::sleep(time::Duration::from_millis(sleep as u64)); - } - } - } - }).unwrap(); - } -} diff --git a/src/bus.rs b/src/bus.rs deleted file mode 100644 index 51185fc..0000000 --- a/src/bus.rs +++ /dev/null @@ -1,300 +0,0 @@ -// bus.rs - -use crate::{Memory, AudioChannel, DiskController, Keyboard, Mouse, Overlay}; - -use chrono::prelude::*; -use std::sync::{Arc, Mutex}; -use std::io::{Write, stdout}; - -pub struct Bus { - pub memory: Memory, - - pub disk_controller: DiskController, - - pub audio_channel_0: Arc>, - pub audio_channel_1: Arc>, - pub audio_channel_2: Arc>, - pub audio_channel_3: Arc>, - - pub keyboard: Arc>, - pub mouse: Arc>, - - pub overlays: Arc>>, - - pub startup_time: i64, -} - -impl Bus { - pub fn read_io(&mut self, port: u32) -> u32 { - match port { - 0x80000000..=0x8000031F => { // overlay port - let overlay_lock = self.overlays.lock().unwrap(); - let overlay_number = (port & 0x000000FF) as usize; - let setting = (port & 0x0000FF00) >> 8; - - match setting { - 0x00 => { - // we're reading the position of this overlay - let x = overlay_lock[overlay_number].x as u32; - let y = overlay_lock[overlay_number].y as u32; - (y << 16) | x - } - 0x01 => { - // we're reading the size of this overlay - let width = overlay_lock[overlay_number].width as u32; - let height = overlay_lock[overlay_number].height as u32; - (height << 16) | width - } - 0x02 => { - // we're reading the framebuffer pointer of this overlay - overlay_lock[overlay_number].framebuffer_pointer - } - 0x03 => { - // we're reading the enable status of this overlay - overlay_lock[overlay_number].enabled as u32 - } - _ => panic!("invalid overlay control port"), - } - } - 0x80000400..=0x80000401 => { // mouse port - let setting = (port & 0x000000FF) as u8; - match setting { - 0x00 => { - // we're reading the button states - let mut byte: u8 = 0x00; - let mouse_lock = self.mouse.lock().expect("failed to lock the mouse mutex"); - if mouse_lock.clicked { - byte |= 0b001; - } - if mouse_lock.released { - byte |= 0b010; - } - if mouse_lock.held { - byte |= 0b100; - } else { - byte &= !0b100; - } - byte as u32 - } - 0x01 => { - // we're reading the position - let mouse_lock = self.mouse.lock().expect("failed to lock the mouse mutex"); - let x = mouse_lock.x as u32; - let y = mouse_lock.y as u32; - (y << 16) | x - } - _ => panic!("invalid mouse control port"), - } - } - 0x80000500 => { // keyboard port - let mut keyboard_lock = self.keyboard.lock().expect("failed to lock the keyboard mutex"); - keyboard_lock.pop() as u32 - } - 0x80000600..=0x80000603 => { // audio port - let channel = (port & 0x000000FF) as u8; - match channel { - 0 => { - let audio_lock = self.audio_channel_0.lock().unwrap(); - audio_lock.sample_rate - }, - 1 => { - let audio_lock = self.audio_channel_1.lock().unwrap(); - audio_lock.sample_rate - }, - 2 => { - let audio_lock = self.audio_channel_2.lock().unwrap(); - audio_lock.sample_rate - }, - 3 => { - let audio_lock = self.audio_channel_3.lock().unwrap(); - audio_lock.sample_rate - }, - _ => panic!("invalid audio channel"), - } - } - 0x80000700..=0x80000706 => { // RTC port - let setting = (port & 0x000000FF) as u8; - match setting { - 0 => { // year - Local::now().year() as u32 - }, - 1 => { // month - Local::now().month() - }, - 2 => { // day - Local::now().day() - }, - 3 => { // hour - Local::now().hour() - }, - 4 => { // minute - Local::now().minute() - }, - 5 => { // second - Local::now().second() - }, - 6 => { // milliseconds elapsed since startup - (Local::now().timestamp_millis() - self.startup_time) as u32 - }, - _ => panic!("invalid RTC port"), - } - } - 0x80001000..=0x80002003 => { // disk controller port - let id = port as u8; - let operation = (port & 0x0000F000) >> 8; - - match operation { - 0x10 => { - // we're reading the current insert state of the specified disk id - if id > 3 { - panic!("invalid disk ID"); - } - match &self.disk_controller.disk[id as usize] { - Some(_) => self.disk_controller.get_size(id) as u32, // return size if this disk is inserted - None => 0, // return 0 if this disk is not inserted - } - } - 0x20 => { - // we're getting the location of the memory sector buffer - self.disk_controller.buffer_pointer as u32 - } - _ => panic!("invalid disk controller port"), - } - } - _ => 0, - } - } - pub fn write_io(&mut self, port: u32, word: u32) { - match port { - 0x00000000 => { // terminal output port - print!("{}", word as u8 as char); - stdout().flush().expect("could not flush stdout"); - } - 0x80000000..=0x8000031F => { // overlay port - let mut overlay_lock = self.overlays.lock().unwrap(); - let overlay_number = (port & 0x000000FF) as usize; - let setting = (port & 0x0000FF00) >> 8; - - match setting { - 0x00 => { - // we're setting the position of this overlay - let x = (word & 0x0000FFFF) as usize; - let y = ((word & 0xFFFF0000) >> 16) as usize; - overlay_lock[overlay_number].x = x; - overlay_lock[overlay_number].y = y; - } - 0x01 => { - // we're setting the size of this overlay - let width = (word & 0x0000FFFF) as usize; - let height = ((word & 0xFFFF0000) >> 16) as usize; - overlay_lock[overlay_number].width = width; - overlay_lock[overlay_number].height = height; - } - 0x02 => { - // we're setting the framebuffer pointer of this overlay - overlay_lock[overlay_number].framebuffer_pointer = word; - } - 0x03 => { - // we're setting the enable status of this overlay - overlay_lock[overlay_number].enabled = word != 0; - } - _ => panic!("invalid overlay control port"), - } - } - 0x80000400..=0x80000401 => { // mouse port - let setting = (port & 0x000000FF) as u8; - match setting { - 0x00 => { - // we're setting the button states - let mut mouse_lock = self.mouse.lock().expect("failed to lock the mouse mutex"); - mouse_lock.clicked = word & (1 << 0) != 0; - mouse_lock.released = word & (1 << 1) != 0; - mouse_lock.held = word & (1 << 2) != 0; - } - 0x01 => { - // we're setting the position - let mut mouse_lock = self.mouse.lock().expect("failed to lock the mouse mutex"); - let x = (word & 0x0000FFFF) as u16; - let y = ((word & 0xFFFF0000) >> 16) as u16; - mouse_lock.x = x; - mouse_lock.y = y; - } - _ => panic!("invalid mouse control port"), - } - } - 0x80000600..=0x80000603 => { // audio port - let channel = (port & 0x000000FF) as u8; - match channel { - 0 => { - let mut audio_lock = self.audio_channel_0.lock().unwrap(); - audio_lock.playing = word != 0; - audio_lock.sample_rate = word; - }, - 1 => { - let mut audio_lock = self.audio_channel_1.lock().unwrap(); - audio_lock.playing = word != 0; - audio_lock.sample_rate = word; - }, - 2 => { - let mut audio_lock = self.audio_channel_2.lock().unwrap(); - audio_lock.playing = word != 0; - audio_lock.sample_rate = word; - }, - 3 => { - let mut audio_lock = self.audio_channel_3.lock().unwrap(); - audio_lock.playing = word != 0; - audio_lock.sample_rate = word; - }, - _ => panic!("invalid audio channel"), - }; - } - 0x80001000..=0x80005003 => { // disk controller port - let id = port as u8; - let operation = (port & 0x0000F000) >> 8; - - match operation { - 0x10 => { - // we're requesting a disk to be inserted to the specified disk id - if id > 3 { - panic!("invalid disk ID"); - } - let file = self.disk_controller.select_file(); - match file { - Some(file) => self.disk_controller.insert(file, id), - None => {}, - }; - } - 0x20 => { - // we're setting the location of the memory sector buffer - self.disk_controller.buffer_pointer = word as usize; - } - 0x30 => { - // we're reading the specified sector of the specified disk id into the memory sector buffer - if id > 3 { - panic!("invalid disk ID"); - } - self.disk_controller.set_current_sector(id, word); - self.disk_controller.read_into_memory(id, self.memory.ram()); - } - 0x40 => { - // we're writing the specified sector to the specified disk id from the memory sector buffer - if id > 3 { - panic!("invalid disk ID"); - } - self.disk_controller.set_current_sector(id, word); - self.disk_controller.write_from_memory(id, self.memory.ram()); - } - 0x50 => { - // we're requesting a disk to be removed from the specified disk id - if id > 3 { - panic!("invalid disk ID"); - } - self.disk_controller.remove(id); - } - _ => panic!("invalid disk controller port"), - } - } - _ => return, - } - } -} diff --git a/src/cpu.rs b/src/cpu.rs deleted file mode 100644 index edc2643..0000000 --- a/src/cpu.rs +++ /dev/null @@ -1,2935 +0,0 @@ -// cpu.rs - -// TODO: in the instruction match statement, all of the register ones have `let result` inside the if statement -// move this up to match all of the other ones (or move all of the other ones down, which would probably be better anyways) - -use std::sync::mpsc::Receiver; - -use crate::Bus; - -#[derive(Copy, Clone)] -pub struct Flag { - pub swap_sp: bool, - pub interrupt: bool, - pub carry: bool, - pub zero: bool, -} - -impl std::convert::From for u8 { - fn from(flag: Flag) -> u8 { - (if flag.swap_sp { 1 } else { 0 }) << 3 | - (if flag.interrupt { 1 } else { 0 }) << 2 | - (if flag.carry { 1 } else { 0 }) << 1 | - (if flag.zero { 1 } else { 0 }) << 0 - } -} - -impl std::convert::From for Flag { - fn from(byte: u8) -> Self { - let swap_sp = ((byte >> 3) & 1) != 0; - let interrupt = ((byte >> 2) & 1) != 0; - let carry = ((byte >> 1) & 1) != 0; - let zero = ((byte >> 0) & 1) != 0; - Flag { swap_sp, interrupt, carry, zero } - } -} - -#[derive(Debug)] -pub enum Exception { - DivideByZero, - InvalidOpcode(u32), - PageFaultRead(u32), - PageFaultWrite(u32), -} - -#[derive(Debug)] -pub enum Interrupt { - Exception(Exception), - Request(u8), // u8 contains the interrupt vector value -} - -pub struct Cpu { - pub instruction_pointer: u32, - pub stack_pointer: u32, - pub exception_stack_pointer: u32, - pub frame_pointer: u32, - - pub register: [u32; 32], - pub flag: Flag, - pub halted: bool, - - pub bus: Bus, - - pub next_interrupt: Option, - pub next_soft_interrupt: Option, - pub next_exception: Option, - pub next_exception_operand: Option, - - pub debug: bool, - debug_toggle_receiver: Receiver<()>, -} - -impl Cpu { - pub fn new(bus: Bus, debug_toggle_receiver: Receiver<()>) -> Self { - Cpu { - instruction_pointer: 0xF0000000, - stack_pointer: 0x00000000, - exception_stack_pointer: 0x00000000, - frame_pointer: 0x00000000, - register: [0; 32], - flag: Flag { swap_sp: false, interrupt: false, carry: false, zero: false }, - halted: false, - bus, - next_interrupt: None, - next_soft_interrupt: None, - next_exception: None, - next_exception_operand: None, - debug: false, - debug_toggle_receiver, - } - } - fn check_condition(&self, condition: Condition) -> bool { - match condition { - Condition::Always => true, - Condition::Zero => self.flag.zero, - Condition::NotZero => !self.flag.zero, - Condition::Carry => self.flag.carry, - Condition::NotCarry => !self.flag.carry, - Condition::GreaterThan => !self.flag.carry && !self.flag.zero, - Condition::LessThanEqualTo => self.flag.carry || self.flag.zero, - } - } - fn relative_to_absolute(&self, relative_address: u32) -> u32 { - self.instruction_pointer.wrapping_add(relative_address) - } - fn read_source(&mut self, source: Operand) -> Option<(u32, u32)> { - let mut instruction_pointer_offset = 2; // increment past opcode half - let source_value = match source { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let value = self.read_register(register); - instruction_pointer_offset += 1; // increment past 8 bit register number - value - } - Operand::RegisterPtr(size) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - let value = match size { - Size::Byte => self.bus.memory.read_8(pointer)? as u32, - Size::Half => self.bus.memory.read_16(pointer)? as u32, - Size::Word => self.bus.memory.read_32(pointer)?, - }; - instruction_pointer_offset += 1; // increment past 8 bit register number - value - } - Operand::Immediate8 => { - let value = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - instruction_pointer_offset += 1; // increment past 8 bit immediate - value as u32 - } - Operand::Immediate16 => { - let value = self.bus.memory.read_16(self.instruction_pointer + instruction_pointer_offset)?; - instruction_pointer_offset += 2; // increment past 16 bit immediate - value as u32 - } - Operand::Immediate32 => { - let value = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - instruction_pointer_offset += 4; // increment past 32 bit immediate - value - } - Operand::ImmediatePtr(size) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - let value = match size { - Size::Byte => self.bus.memory.read_8(pointer)? as u32, - Size::Half => self.bus.memory.read_16(pointer)? as u32, - Size::Word => self.bus.memory.read_32(pointer)?, - }; - instruction_pointer_offset += 4; // increment past 32 bit pointer - value - } - }; - Some((source_value, instruction_pointer_offset)) - } - pub fn read_register(&self, register: u8) -> u32 { - match register { - 0..=31 => self.register[register as usize], - 32 => self.stack_pointer, - 33 => self.exception_stack_pointer, - 34 => self.frame_pointer, - _ => panic!("Invalid register: {}", register), - } - } - pub fn write_register(&mut self, register: u8, word: u32) { - match register { - 0..=31 => self.register[register as usize] = word, - 32 => self.stack_pointer = word, - 33 => self.exception_stack_pointer = word, - 34 => self.frame_pointer = word, - _ => panic!("Invalid register: {}", register), - }; - } - pub fn print_registers(&mut self) { - for index in 0..2 { - println!("r{}: {:#010X} | r{}: {:#010X} | r{}: {:#010X} | r{}: {:#010X}", - index, self.register[index], - index + 8, self.register[index + 8], - index + 16, self.register[index + 16], - index + 24, self.register[index + 24] - ); - } - for index in 2..8 { - println!("r{}: {:#010X} | r{}: {:#010X} | r{}: {:#010X} | r{}: {:#010X}", - index, self.register[index], - index + 8, self.register[index + 8], - index + 16, self.register[index + 16], - index + 24, self.register[index + 24] - ); - } - println!("rsp: {:#010X} | resp: {:#010X}", self.stack_pointer, self.exception_stack_pointer); - println!("rfp: {:#010X}", self.frame_pointer); - } - pub fn push_stack_8(&mut self, byte: u8) { - let decremented_stack_pointer = self.stack_pointer.overflowing_sub(1); - if let Some(_) = self.bus.memory.write_8(decremented_stack_pointer.0, byte) { - self.stack_pointer = decremented_stack_pointer.0; - } - } - pub fn pop_stack_8(&mut self) -> Option { - let byte = self.bus.memory.read_8(self.stack_pointer); - match byte { - Some(byte) => { - let incremented_stack_pointer = self.stack_pointer.overflowing_add(1); - self.stack_pointer = incremented_stack_pointer.0; - Some(byte) - }, - None => None, - } - } - pub fn push_stack_16(&mut self, half: u16) { - let decremented_stack_pointer = self.stack_pointer.overflowing_sub(2); - if let Some(_) = self.bus.memory.write_16(decremented_stack_pointer.0, half) { - self.stack_pointer = decremented_stack_pointer.0; - } - } - pub fn pop_stack_16(&mut self) -> Option { - let half = self.bus.memory.read_16(self.stack_pointer); - match half { - Some(half) => { - let incremented_stack_pointer = self.stack_pointer.overflowing_add(2); - self.stack_pointer = incremented_stack_pointer.0; - Some(half) - }, - None => None, - } - } - pub fn push_stack_32(&mut self, word: u32) { - let decremented_stack_pointer = self.stack_pointer.overflowing_sub(4); - if let Some(_) = self.bus.memory.write_32(decremented_stack_pointer.0, word) { - self.stack_pointer = decremented_stack_pointer.0; - } - } - pub fn pop_stack_32(&mut self) -> Option { - let word = self.bus.memory.read_32(self.stack_pointer); - match word { - Some(word) => { - let incremented_stack_pointer = self.stack_pointer.overflowing_add(4); - self.stack_pointer = incremented_stack_pointer.0; - Some(word) - }, - None => None, - } - } - pub fn exception_to_vector(&mut self, exception: Exception) -> (Option, Option) { - match exception { - Exception::DivideByZero => { - (Some(0), None) - } - Exception::InvalidOpcode(opcode) => { - (Some(1), Some(opcode)) - } - Exception::PageFaultRead(virtual_address) => { - (Some(2), Some(virtual_address)) - } - Exception::PageFaultWrite(virtual_address) => { - (Some(3), Some(virtual_address)) - } - } - } - fn handle_interrupt(&mut self, vector: u8) { - if self.debug { println!("interrupt!!! vector: {:#04X}", vector); } - let address_of_pointer = vector as u32 * 4; - - let old_mmu_state = *self.bus.memory.mmu_enabled(); - *self.bus.memory.mmu_enabled() = false; - let address_maybe = self.bus.memory.read_32(address_of_pointer); - if address_maybe == None { - *self.bus.memory.mmu_enabled() = old_mmu_state; - return; - } - let address = address_maybe.unwrap(); - *self.bus.memory.mmu_enabled() = old_mmu_state; - - if self.flag.swap_sp { - let old_stack_pointer = self.stack_pointer; - self.stack_pointer = self.exception_stack_pointer; - self.push_stack_32(old_stack_pointer); - self.push_stack_32(self.instruction_pointer); - self.push_stack_8(u8::from(self.flag)); - self.flag.swap_sp = false; - } else { - self.push_stack_32(self.instruction_pointer); - self.push_stack_8(u8::from(self.flag)); - } - - self.flag.interrupt = false; // prevent interrupts while already servicing an interrupt - self.instruction_pointer = address; - } - fn handle_exception(&mut self, vector: u8, operand: Option) { - if self.debug { println!("exception!!! vector: {:#04X}, operand: {:?}", vector, operand); } - let address_of_pointer = (256 + vector as u32) * 4; - - let old_mmu_state = *self.bus.memory.mmu_enabled(); - *self.bus.memory.mmu_enabled() = false; - let address_maybe = self.bus.memory.read_32(address_of_pointer); - if address_maybe == None { - *self.bus.memory.mmu_enabled() = old_mmu_state; - return; - } - let address = address_maybe.unwrap(); - *self.bus.memory.mmu_enabled() = old_mmu_state; - - if self.flag.swap_sp { - let old_stack_pointer = self.stack_pointer; - self.stack_pointer = self.exception_stack_pointer; - self.push_stack_32(old_stack_pointer); - self.push_stack_32(self.instruction_pointer); - self.push_stack_8(u8::from(self.flag)); - self.flag.swap_sp = false; - } else { - self.push_stack_32(self.instruction_pointer); - self.push_stack_8(u8::from(self.flag)); - } - - if let Some(operand) = operand { - self.push_stack_32(operand); - } - - self.flag.interrupt = false; // prevent interrupts while already servicing an interrupt - self.instruction_pointer = address; - } - // execute instruction from memory at the current instruction pointer - pub fn execute_memory_instruction(&mut self) { - if let Some(vector) = self.next_exception { - self.handle_exception(vector, self.next_exception_operand); - self.next_exception = None; - self.next_exception_operand = None; - } else if let Some(vector) = self.next_soft_interrupt { - if self.flag.interrupt { - self.handle_interrupt(vector); - self.next_soft_interrupt = None; - } - } else if let Some(vector) = self.next_interrupt { - if self.flag.interrupt { - self.handle_interrupt(vector); - self.next_interrupt = None; - } - } - - let opcode_maybe = self.bus.memory.read_16(self.instruction_pointer); - if opcode_maybe == None { - return; - } - let opcode = opcode_maybe.unwrap(); - - if let Some(instruction) = Instruction::from_half(opcode) { - if self.debug { println!("{:#010X}: {:?}", self.instruction_pointer, instruction); } - let next_instruction_pointer = self.execute_instruction(instruction); - if let Some(next) = next_instruction_pointer { - self.instruction_pointer = next; - } - if let Ok(_) = self.debug_toggle_receiver.try_recv() { - self.debug = !self.debug; - } - } else { - let size = ((opcode & 0b1100000000000000) >> 14) as u8; - let instruction = ((opcode & 0b0011111100000000) >> 8) as u8; - let empty = ((opcode & 0b0000000010000000) >> 7) as u8; - let condition = ((opcode & 0b0000000001110000) >> 4) as u8; - let destination = ((opcode & 0b0000000000001100) >> 2) as u8; - let source = (opcode & 0b0000000000000011) as u8; - - println!("{:#010X}: bad opcode {:#06X}", self.instruction_pointer, opcode); - println!("size instr . cond dest src"); - println!("{:02b} {:06b} {:01b} {:03b} {:02b} {:02b}", size, instruction, empty, condition, destination, source); - println!("dumping RAM"); - self.bus.memory.dump(); - panic!("bad opcode"); - } - } - // execute one instruction and return the next instruction pointer value - fn execute_instruction(&mut self, instruction: Instruction) -> Option { - match instruction { - Instruction::Nop() => { - Some(self.instruction_pointer + 2) // increment past opcode half - } - Instruction::Halt(condition) => { - let instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - if should_run { - self.halted = true; - //if DEBUG { self.print_registers(); } - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Brk(condition) => { - let instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - if should_run { - //self.breakpoint = true; - println!("Breakpoint reached"); - self.print_registers(); - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - - Instruction::Add(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8).overflowing_add(source_value as u8); - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16).overflowing_add(source_value as u16); - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register).overflowing_add(source_value); - self.write_register(register, result.0); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.overflowing_add(source_value as u8); - if should_run { - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.overflowing_add(source_value as u16); - if should_run { - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.overflowing_add(source_value); - if should_run { - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.overflowing_add(source_value as u8); - if should_run { - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.overflowing_add(source_value as u16); - if should_run { - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.overflowing_add(source_value); - if should_run { - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Inc(size, condition, source) => { - let mut instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - match source { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8).overflowing_add(1); - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16).overflowing_add(1); - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register).overflowing_add(1); - self.write_register(register, result.0); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - if should_run { - let result = self.bus.memory.read_8(pointer)?.overflowing_add(1); - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - if should_run { - let result = self.bus.memory.read_16(pointer)?.overflowing_add(1); - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - if should_run { - let result = self.bus.memory.read_32(pointer)?.overflowing_add(1); - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = self.bus.memory.read_8(pointer)?.overflowing_add(1); - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - if should_run { - let result = self.bus.memory.read_16(pointer)?.overflowing_add(1); - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - if should_run { - let result = self.bus.memory.read_32(pointer)?.overflowing_add(1); - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Sub(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8).overflowing_sub(source_value as u8); - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16).overflowing_sub(source_value as u16); - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register).overflowing_sub(source_value); - self.write_register(register, result.0); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.overflowing_sub(source_value as u8); - if should_run { - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.overflowing_sub(source_value as u16); - if should_run { - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.overflowing_sub(source_value); - if should_run { - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.overflowing_sub(source_value as u8); - if should_run { - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.overflowing_sub(source_value as u16); - if should_run { - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.overflowing_sub(source_value); - if should_run { - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Dec(size, condition, source) => { - let mut instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - match source { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8).overflowing_sub(1); - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16).overflowing_sub(1); - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register).overflowing_sub(1); - self.write_register(register, result.0); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - if should_run { - let result = self.bus.memory.read_8(pointer)?.overflowing_sub(1); - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - if should_run { - let result = self.bus.memory.read_16(pointer)?.overflowing_sub(1); - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - if should_run { - let result = self.bus.memory.read_32(pointer)?.overflowing_sub(1); - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = self.bus.memory.read_8(pointer)?.overflowing_sub(1); - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - if should_run { - let result = self.bus.memory.read_16(pointer)?.overflowing_sub(1); - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - if should_run { - let result = self.bus.memory.read_32(pointer)?.overflowing_sub(1); - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Mul(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8).overflowing_mul(source_value as u8); - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16).overflowing_mul(source_value as u16); - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register).overflowing_mul(source_value); - self.write_register(register, result.0); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.overflowing_mul(source_value as u8); - if should_run { - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.overflowing_mul(source_value as u16); - if should_run { - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.overflowing_mul(source_value); - if should_run { - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.overflowing_mul(source_value as u8); - if should_run { - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.overflowing_mul(source_value as u16); - if should_run { - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.overflowing_mul(source_value); - if should_run { - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Div(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8).overflowing_div(source_value as u8); - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16).overflowing_div(source_value as u16); - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result.0 as u32)); - self.flag.zero = result.0 == 0; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register).overflowing_div(source_value); - self.write_register(register, result.0); - self.flag.zero = result.0 == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.overflowing_div(source_value as u8); - if should_run { - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.overflowing_div(source_value as u16); - if should_run { - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.overflowing_div(source_value); - if should_run { - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.overflowing_div(source_value as u8); - if should_run { - self.bus.memory.write_8(pointer, result.0)?; - self.flag.zero = result.0 == 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.overflowing_div(source_value as u16); - if should_run { - self.bus.memory.write_16(pointer, result.0)?; - self.flag.zero = result.0 == 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.overflowing_div(source_value); - if should_run { - self.bus.memory.write_32(pointer, result.0)?; - self.flag.zero = result.0 == 0; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Rem(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8) % source_value as u8; - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - self.flag.zero = result == 0; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16) % source_value as u16; - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - self.flag.zero = result == 0; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register) % source_value; - self.write_register(register, result); - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? % source_value as u8; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? % source_value as u16; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? % source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? % source_value as u8; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? % source_value as u16; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? % source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - - Instruction::And(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8) & source_value as u8; - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - self.flag.zero = result == 0; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16) & source_value as u16; - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - self.flag.zero = result == 0; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register) & source_value; - self.write_register(register, result); - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? & source_value as u8; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? & source_value as u16; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? & source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? & source_value as u8; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? & source_value as u16; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? & source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Or(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8) | source_value as u8; - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - self.flag.zero = result == 0; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16) | source_value as u16; - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - self.flag.zero = result == 0; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register) | source_value; - self.write_register(register, result); - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? | source_value as u8; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? | source_value as u16; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? | source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? | source_value as u8; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? | source_value as u16; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? | source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Xor(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8) ^ source_value as u8; - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - self.flag.zero = result == 0; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16) ^ source_value as u16; - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - self.flag.zero = result == 0; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register) ^ source_value; - self.write_register(register, result); - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? ^ source_value as u8; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? ^ source_value as u16; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? ^ source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? ^ source_value as u8; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? ^ source_value as u16; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? ^ source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Not(size, condition, source) => { - let mut instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - match source { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = !self.read_register(register) as u8; - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - self.flag.zero = result == 0; - } - } - Size::Half => { - if should_run { - let result = !self.read_register(register) as u16; - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - self.flag.zero = result == 0; - } - } - Size::Word => { - if should_run { - let result = !self.read_register(register); - self.write_register(register, result); - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result =!self.bus.memory.read_8(pointer)?; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Half => { - let result = !self.bus.memory.read_16(pointer)?; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Word => { - let result = !self.bus.memory.read_32(pointer)?; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = !self.bus.memory.read_8(pointer)?; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Half => { - let result = !self.bus.memory.read_16(pointer)?; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - } - } - Size::Word => { - let result = !self.bus.memory.read_32(pointer)?; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Sla(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8) << source_value; - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 7) != 0; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16) << source_value; - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 15) != 0; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register) << source_value; - self.write_register(register, result); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 31) != 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? << source_value; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 7) != 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? << source_value; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 15) != 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? << source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 31) != 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? << source_value; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 7) != 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? << source_value; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 15) != 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? << source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 31) != 0; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Sra(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8) >> source_value as i32; - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16) >> source_value as i32; - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register) >> source_value as i32; - self.write_register(register, result); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? >> source_value as i32; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? >> source_value as i32; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? >> source_value as i32; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? >> source_value as i32; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? >> source_value as i32; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? >> source_value as i32; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Srl(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8) >> source_value; - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16) >> source_value; - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register) >> source_value; - self.write_register(register, result); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? >> source_value; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? >> source_value; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? >> source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? >> source_value; - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? >> source_value; - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? >> source_value; - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Rol(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8).rotate_left(source_value); - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 7) != 0; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16).rotate_left(source_value); - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 15) != 0; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register).rotate_left(source_value); - self.write_register(register, result); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 31) != 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.rotate_left(source_value); - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 7) != 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.rotate_left(source_value); - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 15) != 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.rotate_left(source_value); - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 31) != 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.rotate_left(source_value); - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 7) != 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.rotate_left(source_value); - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 15) != 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.rotate_left(source_value); - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 31) != 0; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Ror(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8).rotate_right(source_value); - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16).rotate_right(source_value); - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register).rotate_right(source_value); - self.write_register(register, result); - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.rotate_right(source_value); - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.rotate_right(source_value); - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.rotate_right(source_value); - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.rotate_right(source_value); - if should_run { - self.bus.memory.write_8(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.rotate_right(source_value); - if should_run { - self.bus.memory.write_16(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.rotate_right(source_value); - if should_run { - self.bus.memory.write_32(pointer, result)?; - self.flag.zero = result == 0; - self.flag.carry = source_value & (1 << 0) != 0; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - - Instruction::Bse(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.read_register(register) as u8 | (1 << source_value); - if should_run { - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - } - } - Size::Half => { - let result = self.read_register(register) as u16 | (1 << source_value); - if should_run { - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - } - } - Size::Word => { - let result = self.read_register(register) | (1 << source_value); - if should_run { - self.write_register(register, result); - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? | (1 << source_value); - if should_run { - self.bus.memory.write_8(pointer, result)?; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? | (1 << source_value); - if should_run { - self.bus.memory.write_16(pointer, result)?; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? | (1 << source_value); - if should_run { - self.bus.memory.write_32(pointer, result)?; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? | (1 << source_value); - if should_run { - self.bus.memory.write_8(pointer, result)?; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? | (1 << source_value); - if should_run { - self.bus.memory.write_16(pointer, result)?; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? | (1 << source_value); - if should_run { - self.bus.memory.write_32(pointer, result)?; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Bcl(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.read_register(register) as u8 & !(1 << source_value); - if should_run { - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (result as u32)); - } - } - Size::Half => { - let result = self.read_register(register) as u16 & !(1 << source_value); - if should_run { - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (result as u32)); - } - } - Size::Word => { - let result = self.read_register(register) & !(1 << source_value); - if should_run { - self.write_register(register, result); - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? & !(1 << source_value); - if should_run { - self.bus.memory.write_8(pointer, result)?; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? & !(1 << source_value); - if should_run { - self.bus.memory.write_16(pointer, result)?; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? & !(1 << source_value); - if should_run { - self.bus.memory.write_32(pointer, result)?; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? & !(1 << source_value); - if should_run { - self.bus.memory.write_8(pointer, result)?; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? & !(1 << source_value); - if should_run { - self.bus.memory.write_16(pointer, result)?; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? & !(1 << source_value); - if should_run { - self.bus.memory.write_32(pointer, result)?; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Bts(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.read_register(register) as u8 & (1 << source_value) == 0; - if should_run { - self.flag.zero = result; - } - } - Size::Half => { - let result = self.read_register(register) as u16 & (1 << source_value) == 0; - if should_run { - self.flag.zero = result; - } - } - Size::Word => { - let result = self.read_register(register) & (1 << source_value) == 0; - if should_run { - self.flag.zero = result; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? & (1 << source_value) == 0; - if should_run { - self.flag.zero = result; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? & (1 << source_value) == 0; - if should_run { - self.flag.zero = result; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? & (1 << source_value) == 0; - if should_run { - self.flag.zero = result; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)? & (1 << source_value) == 0; - if should_run { - self.flag.zero = result; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)? & (1 << source_value) == 0; - if should_run { - self.flag.zero = result; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)? & (1 << source_value) == 0; - if should_run { - self.flag.zero = result; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - - Instruction::Cmp(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let result = (self.read_register(register) as u8).overflowing_sub(source_value as u8); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - if should_run { - let result = (self.read_register(register) as u16).overflowing_sub(source_value as u16); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - if should_run { - let result = self.read_register(register).overflowing_sub(source_value); - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.overflowing_sub(source_value as u8); - if should_run { - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.overflowing_sub(source_value as u16); - if should_run { - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.overflowing_sub(source_value); - if should_run { - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - let result = self.bus.memory.read_8(pointer)?.overflowing_sub(source_value as u8); - if should_run { - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Half => { - let result = self.bus.memory.read_16(pointer)?.overflowing_sub(source_value as u16); - if should_run { - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - Size::Word => { - let result = self.bus.memory.read_32(pointer)?.overflowing_sub(source_value); - if should_run { - self.flag.zero = result.0 == 0; - self.flag.carry = result.1; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Mov(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | (source_value & 0x000000FF)); - } - } - Size::Half => { - if should_run { - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | (source_value & 0x0000FFFF)); - } - } - Size::Word => { - if should_run { - self.write_register(register, source_value); - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - if should_run { - self.bus.memory.write_8(pointer, source_value as u8)?; - } - } - Size::Half => { - if should_run { - self.bus.memory.write_16(pointer, source_value as u16)?; - } - } - Size::Word => { - if should_run { - self.bus.memory.write_32(pointer, source_value)?; - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - self.bus.memory.write_8(pointer, source_value as u8)?; - } - } - Size::Half => { - if should_run { - self.bus.memory.write_16(pointer, source_value as u16)?; - } - } - Size::Word => { - if should_run { - self.bus.memory.write_32(pointer, source_value)?; - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Movz(size, condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - self.write_register(register, source_value & 0x000000FF); - } - } - Size::Half => { - if should_run { - self.write_register(register, source_value & 0x0000FFFF); - } - } - Size::Word => { - if should_run { - self.write_register(register, source_value); - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - _ => panic!("MOVZ only operates on registers"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - - Instruction::Jmp(condition, source) => { - let (source_value, instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - if should_run { - Some(source_value) - } else { - Some(self.instruction_pointer + instruction_pointer_offset) - } - } - Instruction::Call(condition, source) => { - let (source_value, instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - if should_run { - self.push_stack_32(self.instruction_pointer + instruction_pointer_offset); - Some(source_value) - } else { - Some(self.instruction_pointer + instruction_pointer_offset) - } - } - Instruction::Loop(condition, source) => { - let (source_value, instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - let result = self.read_register(31).overflowing_sub(1); - self.write_register(31, result.0); - if should_run { - if result.0 != 0 { - Some(source_value) - } else { - Some(self.instruction_pointer + instruction_pointer_offset) - } - } else { - Some(self.instruction_pointer + instruction_pointer_offset) - } - } - Instruction::Rjmp(condition, source) => { - let (source_value, instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - if should_run { - Some(self.relative_to_absolute(source_value)) - } else { - Some(self.instruction_pointer + instruction_pointer_offset) - } - } - Instruction::Rcall(condition, source) => { - let (source_value, instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - if should_run { - self.push_stack_32(self.instruction_pointer + instruction_pointer_offset); - Some(self.relative_to_absolute(source_value)) - } else { - Some(self.instruction_pointer + instruction_pointer_offset) - } - } - Instruction::Rloop(condition, source) => { - let (source_value, instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - let result = self.read_register(31).overflowing_sub(1); - self.write_register(31, result.0); - if should_run { - if result.0 != 0 { - Some(self.relative_to_absolute(source_value)) - } else { - Some(self.instruction_pointer + instruction_pointer_offset) - } - } else { - Some(self.instruction_pointer + instruction_pointer_offset) - } - } - - Instruction::Rta(condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - if should_run { - self.write_register(register, self.relative_to_absolute(source_value)); - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.relative_to_absolute(self.read_register(register)); - if should_run { - // INFO: register contains a relative address instead of an absolute address - self.bus.memory.write_32(pointer, self.relative_to_absolute(source_value))?; - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let word = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.relative_to_absolute(word); - if should_run { - self.bus.memory.write_32(pointer, self.relative_to_absolute(source_value))?; - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - - Instruction::Push(size, condition, source) => { - let (source_value, instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match size { - Size::Byte => { - if should_run { - self.push_stack_8(source_value as u8); - } - } - Size::Half => { - if should_run { - self.push_stack_16(source_value as u16); - } - } - Size::Word => { - if should_run { - self.push_stack_32(source_value); - } - } - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Pop(size, condition, source) => { - let mut instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - match source { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let value = self.pop_stack_8()? as u32; - self.write_register(register, (self.read_register(register) & 0xFFFFFF00) | value); - } - } - Size::Half => { - if should_run { - let value = self.pop_stack_16()? as u32; - self.write_register(register, (self.read_register(register) & 0xFFFF0000) | value); - } - } - Size::Word => { - if should_run { - let value = self.pop_stack_32()?; - self.write_register(register, value); - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - match size { - Size::Byte => { - if should_run { - let value = self.pop_stack_8()?; - let success = self.bus.memory.write_8(pointer, value); - if let None = success { - self.stack_pointer = self.stack_pointer.overflowing_sub(1).0; - } - } - } - Size::Half => { - if should_run { - let value = self.pop_stack_16()?; - let success = self.bus.memory.write_16(pointer, value); - if let None = success { - self.stack_pointer = self.stack_pointer.overflowing_sub(2).0; - } - } - } - Size::Word => { - if should_run { - let value = self.pop_stack_32()?; - let success = self.bus.memory.write_32(pointer, value); - if let None = success { - self.stack_pointer = self.stack_pointer.overflowing_sub(4).0; - } - } - } - } - instruction_pointer_offset += 1; // increment past 8 bit register number - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - match size { - Size::Byte => { - if should_run { - let value = self.pop_stack_8()?; - let success = self.bus.memory.write_8(pointer, value); - if let None = success { - self.stack_pointer = self.stack_pointer.overflowing_sub(1).0; - } - } - } - Size::Half => { - if should_run { - let value = self.pop_stack_16()?; - let success = self.bus.memory.write_16(pointer, value); - if let None = success { - self.stack_pointer = self.stack_pointer.overflowing_sub(2).0; - } - } - } - Size::Word => { - if should_run { - let value = self.pop_stack_32()?; - let success = self.bus.memory.write_32(pointer, value); - if let None = success { - self.stack_pointer = self.stack_pointer.overflowing_sub(4).0; - } - } - } - } - instruction_pointer_offset += 4; // increment past 32 bit pointer - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Ret(condition) => { - let instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - if should_run { - self.pop_stack_32() - } else { - Some(self.instruction_pointer + instruction_pointer_offset) - } - } - Instruction::Reti(condition) => { - let instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - if should_run { - let flag = Flag::from(self.pop_stack_8()?); - let instruction_pointer = self.pop_stack_32()?; - self.flag = flag; - if self.flag.swap_sp { - self.stack_pointer = self.pop_stack_32()?; - } - Some(instruction_pointer) - } else { - Some(self.instruction_pointer + instruction_pointer_offset) - } - } - - Instruction::In(condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let value = self.bus.read_io(source_value); - instruction_pointer_offset += 1; // increment past 8 bit register number - if should_run { - self.write_register(register, value); - } - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - let value = self.bus.read_io(source_value); - instruction_pointer_offset += 1; // increment past 8 bit register number - if should_run { - self.bus.memory.write_32(pointer, value)?; - } - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - let value = self.bus.read_io(source_value); - instruction_pointer_offset += 4; // increment past 32 bit pointer - if should_run { - self.bus.memory.write_32(pointer, value)?; - } - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Out(condition, destination, source) => { - let (source_value, mut instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - match destination { - Operand::Register => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - instruction_pointer_offset += 1; // increment past 8 bit register number - if should_run { - self.bus.write_io(self.read_register(register), source_value); - } - } - Operand::RegisterPtr(_) => { - let register = self.bus.memory.read_8(self.instruction_pointer + instruction_pointer_offset)?; - let pointer = self.read_register(register); - instruction_pointer_offset += 1; // increment past 8 bit register number - if should_run { - let word = self.bus.memory.read_32(pointer)?; - self.bus.write_io(word, source_value); - } - } - Operand::ImmediatePtr(_) => { - let pointer = self.bus.memory.read_32(self.instruction_pointer + instruction_pointer_offset)?; - instruction_pointer_offset += 4; // increment past 32 bit pointer - if should_run { - let word = self.bus.memory.read_32(pointer)?; - self.bus.write_io(word, source_value); - } - } - _ => panic!("Attempting to use an immediate value as a destination"), - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - - Instruction::Ise(condition) => { - let instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - if should_run { - self.flag.interrupt = true; - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Icl(condition) => { - let instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - if should_run { - self.flag.interrupt = false; - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Int(condition, source) => { - let (source_value, instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - if should_run { - self.next_soft_interrupt = Some(source_value as u8); - Some(self.instruction_pointer + instruction_pointer_offset) - } else { - Some(self.instruction_pointer + instruction_pointer_offset) - } - } - - Instruction::Mse(condition) => { - let instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - if should_run { - *self.bus.memory.mmu_enabled() = true; - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Mcl(condition) => { - let instruction_pointer_offset = 2; // increment past opcode half - let should_run = self.check_condition(condition); - if should_run { - *self.bus.memory.mmu_enabled() = false; - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Tlb(condition, source) => { - let (source_value, instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - if should_run { - self.bus.memory.flush_tlb(Some(source_value)); - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - Instruction::Flp(condition, source) => { - let (source_value, instruction_pointer_offset) = self.read_source(source)?; - let should_run = self.check_condition(condition); - if should_run { - self.bus.memory.flush_page(source_value); - } - Some(self.instruction_pointer + instruction_pointer_offset) - } - } - } -} - -#[derive(Debug)] -enum Operand { - Register, - RegisterPtr(Size), - Immediate8, - Immediate16, - Immediate32, - ImmediatePtr(Size), -} - -#[derive(Copy, Clone, Debug)] -enum Size { - Byte, - Half, - Word, -} - -#[derive(Debug)] -enum Condition { - Always, - Zero, - NotZero, - Carry, - NotCarry, - GreaterThan, - // GreaterThanEqualTo is equivalent to NotCarry - // LessThan is equivalent to Carry - LessThanEqualTo, -} - -#[derive(Debug)] -enum Instruction { - Nop(), - Halt(Condition), - Brk(Condition), - - Add(Size, Condition, Operand, Operand), - Inc(Size, Condition, Operand), - Sub(Size, Condition, Operand, Operand), - Dec(Size, Condition, Operand), - - Mul(Size, Condition, Operand, Operand), - Div(Size, Condition, Operand, Operand), - Rem(Size, Condition, Operand, Operand), - - And(Size, Condition, Operand, Operand), - Or(Size, Condition, Operand, Operand), - Xor(Size, Condition, Operand, Operand), - Not(Size, Condition, Operand), - - Sla(Size, Condition, Operand, Operand), - Rol(Size, Condition, Operand, Operand), - - Sra(Size, Condition, Operand, Operand), - Srl(Size, Condition, Operand, Operand), - Ror(Size, Condition, Operand, Operand), - - Bse(Size, Condition, Operand, Operand), - Bcl(Size, Condition, Operand, Operand), - Bts(Size, Condition, Operand, Operand), - - Cmp(Size, Condition, Operand, Operand), - Mov(Size, Condition, Operand, Operand), - Movz(Size, Condition, Operand, Operand), - - Jmp(Condition, Operand), - Call(Condition, Operand), - Loop(Condition, Operand), - - Rjmp(Condition, Operand), - Rcall(Condition, Operand), - Rloop(Condition, Operand), - - Rta(Condition, Operand, Operand), - - Push(Size, Condition, Operand), - Pop(Size, Condition, Operand), - Ret(Condition), - Reti(Condition), - - In(Condition, Operand, Operand), - Out(Condition, Operand, Operand), - - Ise(Condition), - Icl(Condition), - Int(Condition, Operand), - - Mse(Condition), - Mcl(Condition), - Tlb(Condition, Operand), - Flp(Condition, Operand), -} - -impl Instruction { - fn from_half(half: u16) -> Option { - // see encoding.md for more info - let size = match ((half >> 14) as u8) & 0b00000011 { - 0x00 => Size::Byte, - 0x01 => Size::Half, - 0x02 => Size::Word, - _ => return None, - }; - let opcode = ((half >> 8) as u8) & 0b00111111; - let source = match ((half & 0x000F) as u8) & 0b00000011 { - 0x00 => Operand::Register, - 0x01 => Operand::RegisterPtr(size), - 0x02 => match size { - Size::Byte => Operand::Immediate8, - Size::Half => Operand::Immediate16, - Size::Word => Operand::Immediate32, - }, - 0x03 => Operand::ImmediatePtr(size), - _ => return None, - }; - let destination = match (((half & 0x000F) >> 2) as u8) & 0b00000011 { - 0x00 => Operand::Register, - 0x01 => Operand::RegisterPtr(size), - // 0x02 is invalid, can't use an immediate value as a destination - 0x03 => Operand::ImmediatePtr(size), - _ => return None, - }; - let condition = match (half & 0x00F0) as u8 { - 0x00 => Condition::Always, - 0x10 => Condition::Zero, - 0x20 => Condition::NotZero, - 0x30 => Condition::Carry, - 0x40 => Condition::NotCarry, - 0x50 => Condition::GreaterThan, - 0x60 => Condition::LessThanEqualTo, - _ => return None, - }; - match opcode { - 0x00 => Some(Instruction::Nop()), - 0x10 => Some(Instruction::Halt(condition)), - 0x20 => Some(Instruction::Brk(condition)), - - 0x01 => Some(Instruction::Add(size, condition, destination, source)), - 0x11 => Some(Instruction::Inc(size, condition, source)), - 0x21 => Some(Instruction::Sub(size, condition, destination, source)), - 0x31 => Some(Instruction::Dec(size, condition, source)), - - 0x02 => Some(Instruction::Mul(size, condition, destination, source)), - 0x22 => Some(Instruction::Div(size, condition, destination, source)), - 0x32 => Some(Instruction::Rem(size, condition, destination, source)), - - 0x03 => Some(Instruction::And(size, condition, destination, source)), - 0x13 => Some(Instruction::Or(size, condition, destination, source)), - 0x23 => Some(Instruction::Xor(size, condition, destination, source)), - 0x33 => Some(Instruction::Not(size, condition, source)), - - 0x04 => Some(Instruction::Sla(size, condition, destination, source)), - 0x24 => Some(Instruction::Rol(size, condition, destination, source)), - - 0x05 => Some(Instruction::Sra(size, condition, destination, source)), - 0x15 => Some(Instruction::Srl(size, condition, destination, source)), - 0x25 => Some(Instruction::Ror(size, condition, destination, source)), - - 0x06 => Some(Instruction::Bse(size, condition, destination, source)), - 0x16 => Some(Instruction::Bcl(size, condition, destination, source)), - 0x26 => Some(Instruction::Bts(size, condition, destination, source)), - - 0x07 => Some(Instruction::Cmp(size, condition, destination, source)), - 0x17 => Some(Instruction::Mov(size, condition, destination, source)), - 0x27 => Some(Instruction::Movz(size, condition, destination, source)), - - 0x08 => Some(Instruction::Jmp(condition, source)), - 0x18 => Some(Instruction::Call(condition, source)), - 0x28 => Some(Instruction::Loop(condition, source)), - - 0x09 => Some(Instruction::Rjmp(condition, source)), - 0x19 => Some(Instruction::Rcall(condition, source)), - 0x29 => Some(Instruction::Rloop(condition, source)), - - 0x39 => Some(Instruction::Rta(condition, destination, source)), - - 0x0A => Some(Instruction::Push(size, condition, source)), - 0x1A => Some(Instruction::Pop(size, condition, source)), - 0x2A => Some(Instruction::Ret(condition)), - 0x3A => Some(Instruction::Reti(condition)), - - 0x0B => Some(Instruction::In(condition, destination, source)), - 0x1B => Some(Instruction::Out(condition, destination, source)), - - 0x0C => Some(Instruction::Ise(condition)), - 0x1C => Some(Instruction::Icl(condition)), - 0x2C => Some(Instruction::Int(condition, source)), - - 0x0D => Some(Instruction::Mse(condition)), - 0x1D => Some(Instruction::Mcl(condition)), - 0x2D => Some(Instruction::Tlb(condition, source)), - 0x3D => Some(Instruction::Flp(condition, source)), - - _ => None, - } - } -} diff --git a/src/disk.rs b/src/disk.rs deleted file mode 100644 index a039678..0000000 --- a/src/disk.rs +++ /dev/null @@ -1,84 +0,0 @@ -// disk.rs - -use crate::memory::MemoryRam; - -use std::io::{Seek, SeekFrom, Read, Write}; -use std::fs::File; -use rfd::FileDialog; - -pub struct Disk { - file: File, - size: u64, - current_sector: u32, -} - -impl Disk { - pub fn new(file: File) -> Self { - Disk { - size: file.metadata().unwrap().len(), - file, - current_sector: 0, - } - } -} - -pub struct DiskController { - pub disk: [Option; 4], - pub buffer_pointer: usize, -} - -impl DiskController { - pub fn new() -> Self { - DiskController { - disk: [None, None, None, None], - buffer_pointer: 0x00000000 - } - } - - pub fn select_file(&self) -> Option { - let path = FileDialog::new() - .add_filter("Disk Image", &["img", "dsk"]) - .add_filter("Raw Binary", &["bin"]) - .add_filter("All Files", &["*"]) - .set_title(&format!("Select a file to insert")) - .pick_file(); - match path { - Some(path) => Some(File::options().read(true).write(true).open(path).expect("failed to open disk image")), - None => None, - } - } - - pub fn insert(&mut self, file: File, disk_id: u8) { - self.disk[disk_id as usize] = Some(Disk::new(file)); - } - pub fn remove(&mut self, disk_id: u8) { - self.disk[disk_id as usize] = None; - } - - pub fn get_size(&self, disk_id: u8) -> u64 { - self.disk[disk_id as usize].as_ref().expect("attempted to access unmounted disk").size - } - pub fn get_current_sector(&self, disk_id: u8) -> u32 { - self.disk[disk_id as usize].as_ref().expect("attempted to access unmounted disk").current_sector - } - pub fn set_current_sector(&mut self, disk_id: u8, sector: u32) { - let mut disk = self.disk[disk_id as usize].as_mut().expect("attempted to access unmounted disk"); - disk.current_sector = sector; - disk.file.seek(SeekFrom::Start(sector as u64 * 512)).expect("attempted to seek to sector beyond edge of disk"); - } - - pub fn read_into_memory(&mut self, disk_id: u8, ram: &mut MemoryRam) -> usize { - let disk = self.disk[disk_id as usize].as_mut().expect("attempted to access unmounted disk"); - let mut temp_buffer = [0u8; 512]; - - let number_of_bytes_read = disk.file.read(&mut temp_buffer).unwrap(); - ram[self.buffer_pointer..self.buffer_pointer+512].copy_from_slice(&temp_buffer); - number_of_bytes_read - } - pub fn write_from_memory(&mut self, disk_id: u8, ram: &MemoryRam) -> usize { - let disk = self.disk[disk_id as usize].as_mut().expect("attempted to access unmounted disk"); - - let number_of_bytes_written = disk.file.write(ram.get(self.buffer_pointer..self.buffer_pointer+512).unwrap()).unwrap(); - number_of_bytes_written - } -} diff --git a/src/keyboard.rs b/src/keyboard.rs deleted file mode 100644 index 33a15f8..0000000 --- a/src/keyboard.rs +++ /dev/null @@ -1,122 +0,0 @@ -// keyboard.rs - - -use crate::warn; - -use ringbuf::{Consumer, Producer, RingBuffer}; -use std::sync::mpsc::Sender; -use winit::event::{ElementState, VirtualKeyCode}; - -pub struct Keyboard { - consumer: Consumer, - producer: Producer, - debug_toggle_sender: Sender<()>, -} - -impl Keyboard { - pub fn new(debug_toggle_sender: Sender<()>) -> Self { - let buffer = RingBuffer::::new(32); - let (producer, consumer) = buffer.split(); - Keyboard { consumer, producer, debug_toggle_sender } - } - - fn keycode_to_scancode(&self, keycode: VirtualKeyCode) -> u8 { - match keycode { - VirtualKeyCode::Escape => 0x01, - VirtualKeyCode::Key1 => 0x02, - VirtualKeyCode::Key2 => 0x03, - VirtualKeyCode::Key3 => 0x04, - VirtualKeyCode::Key4 => 0x05, - VirtualKeyCode::Key5 => 0x06, - VirtualKeyCode::Key6 => 0x07, - VirtualKeyCode::Key7 => 0x08, - VirtualKeyCode::Key8 => 0x09, - VirtualKeyCode::Asterisk => 0x09, - VirtualKeyCode::Key9 => 0x0A, - VirtualKeyCode::Key0 => 0x0B, - VirtualKeyCode::Minus => 0x0C, - VirtualKeyCode::Equals => 0x0D, - VirtualKeyCode::Back => 0x0E, - VirtualKeyCode::Tab => 0x0F, - VirtualKeyCode::Q => 0x10, - VirtualKeyCode::W => 0x11, - VirtualKeyCode::E => 0x12, - VirtualKeyCode::R => 0x13, - VirtualKeyCode::T => 0x14, - VirtualKeyCode::Y => 0x15, - VirtualKeyCode::U => 0x16, - VirtualKeyCode::I => 0x17, - VirtualKeyCode::O => 0x18, - VirtualKeyCode::P => 0x19, - VirtualKeyCode::LBracket => 0x1A, - VirtualKeyCode::RBracket => 0x1B, - VirtualKeyCode::Return => 0x1C, - VirtualKeyCode::LControl => 0x1D, - VirtualKeyCode::A => 0x1E, - VirtualKeyCode::S => 0x1F, - VirtualKeyCode::D => 0x20, - VirtualKeyCode::F => 0x21, - VirtualKeyCode::G => 0x22, - VirtualKeyCode::H => 0x23, - VirtualKeyCode::J => 0x24, - VirtualKeyCode::K => 0x25, - VirtualKeyCode::L => 0x26, - VirtualKeyCode::Semicolon => 0x27, - VirtualKeyCode::Apostrophe => 0x28, - VirtualKeyCode::Grave => 0x29, - VirtualKeyCode::LShift => 0x2A, - VirtualKeyCode::Backslash => 0x2B, - VirtualKeyCode::Z => 0x2C, - VirtualKeyCode::X => 0x2D, - VirtualKeyCode::C => 0x2E, - VirtualKeyCode::V => 0x2F, - VirtualKeyCode::B => 0x30, - VirtualKeyCode::N => 0x31, - VirtualKeyCode::M => 0x32, - VirtualKeyCode::Comma => 0x33, - VirtualKeyCode::Period => 0x34, - VirtualKeyCode::Slash => 0x35, - VirtualKeyCode::RShift => 0x36, - VirtualKeyCode::LAlt => 0x38, - VirtualKeyCode::Space => 0x39, - VirtualKeyCode::Capital => 0x3A, - VirtualKeyCode::F1 => 0x3B, - VirtualKeyCode::F2 => 0x3C, - VirtualKeyCode::F3 => 0x3D, - VirtualKeyCode::F4 => 0x3E, - VirtualKeyCode::F5 => 0x3F, - VirtualKeyCode::F6 => 0x40, - VirtualKeyCode::F7 => 0x41, - VirtualKeyCode::F8 => 0x42, - VirtualKeyCode::F9 => 0x43, - VirtualKeyCode::F10 => 0x44, - VirtualKeyCode::F11 => 0x57, - VirtualKeyCode::F12 => 0x58, - VirtualKeyCode::Up => 0x67, - VirtualKeyCode::Down => 0x6C, - VirtualKeyCode::Left => 0x69, - VirtualKeyCode::Right => 0x6A, - _ => 0x00, - } - } - - pub fn push(&mut self, keycode: Option, state: ElementState) { - let mut scancode = if let Some(keycode) = keycode { - self.keycode_to_scancode(keycode) - } else { - 0x00 - }; - if state == ElementState::Released && scancode != 0x00 { - scancode |= 0x80; // "break" scancode - } - if scancode == 0x57 { - self.debug_toggle_sender.send(()).unwrap(); - return; - } - self.producer.push(scancode).unwrap_or_else(|_| warn("keyboard buffer full!")); - } - - pub fn pop(&mut self) -> u8 { - self.consumer.pop().unwrap_or_default() - } -} diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 4f09199..0000000 --- a/src/main.rs +++ /dev/null @@ -1,352 +0,0 @@ -// main.rs - -pub mod memory; -pub mod audio; -pub mod bus; -pub mod cpu; -pub mod keyboard; -pub mod mouse; -pub mod disk; - -use audio::AudioChannel; -use bus::Bus; -use cpu::{Cpu, Exception, Interrupt}; -use keyboard::Keyboard; -use mouse::Mouse; -use disk::DiskController; -use memory::{MEMORY_RAM_START, MEMORY_ROM_START, MemoryRam, Memory}; - -use std::sync::{Arc, mpsc, Mutex}; -use std::thread; -use std::process::exit; -use std::env; -use std::fs::{File, read}; - -use chrono::prelude::*; -use image; -use log::error; -use pixels::{Pixels, SurfaceTexture}; -use winit::dpi::LogicalSize; -use winit::event::{Event, WindowEvent}; -use winit::event_loop::{ControlFlow, EventLoop}; -use winit::window::{WindowBuilder, Icon}; -use winit_input_helper::WinitInputHelper; - -const WIDTH: usize = 640; -const HEIGHT: usize = 480; - -const FRAMEBUFFER_ADDRESS: usize = 0x02000000; - -pub struct Display { - background: Vec, - overlays: Arc>>, -} - -#[derive(Copy, Clone, Debug, Default)] -pub struct Overlay { - enabled: bool, - width: usize, - height: usize, - x: usize, - y: usize, - framebuffer_pointer: u32, -} - -fn read_rom() -> Vec { - read("fox32.rom").unwrap_or_else(|_| { - read("../fox32rom/fox32.rom").unwrap_or_else(|_| { - println!("fox32.rom file not found, using embedded ROM"); - include_bytes!("fox32.rom").to_vec() - }) - }) -} - -pub fn error(message: &str) -> ! { - println!("Error: {}", message); - exit(1); -} - -pub fn warn(message: &str) { - println!("Warning: {}", message); -} - -fn main() { - let version_string = format!("fox32 {} ({})", env!("VERGEN_BUILD_SEMVER"), option_env!("VERGEN_GIT_SHA_SHORT").unwrap_or("unknown")); - println!("{}", version_string); - - let args: Vec = env::args().collect(); - - let (debug_toggle_sender, debug_toggle_receiver) = mpsc::channel::<()>(); - - let mut display = Display::new(); - let keyboard = Arc::new(Mutex::new(Keyboard::new(debug_toggle_sender))); - let mouse = Arc::new(Mutex::new(Mouse::new())); - - let audio_channel_0 = Arc::new(Mutex::new(AudioChannel::new(0))); - let audio_channel_1 = Arc::new(Mutex::new(AudioChannel::new(1))); - let audio_channel_2 = Arc::new(Mutex::new(AudioChannel::new(2))); - let audio_channel_3 = Arc::new(Mutex::new(AudioChannel::new(3))); - - let (exception_sender, exception_receiver) = mpsc::channel::(); - - let memory = Memory::new(read_rom().as_slice(), exception_sender); - let mut bus = Bus { - memory: memory.clone(), - audio_channel_0: audio_channel_0.clone(), - audio_channel_1: audio_channel_1.clone(), - audio_channel_2: audio_channel_2.clone(), - audio_channel_3: audio_channel_3.clone(), - disk_controller: DiskController::new(), - keyboard: keyboard.clone(), - mouse: mouse.clone(), - overlays: display.overlays.clone(), - startup_time: Local::now().timestamp_millis(), - }; - - if args.len() > 1 { - let mut args_iter = args.iter(); - args_iter.next(); - for (i, arg) in args_iter.enumerate() { - bus.disk_controller.insert(File::options().read(true).write(true).open(&arg).expect("failed to load provided disk image"), i as u8); - } - } - - let memory_cpu = memory.clone(); - let memory_eventloop = memory.clone(); - - let ram_size = memory_cpu.ram().len(); - let ram_bottom_address = MEMORY_RAM_START; - let ram_top_address = ram_bottom_address + ram_size - 1; - println!("RAM: {:.2} MiB mapped at physical {:#010X}-{:#010X}", ram_size / 1048576, ram_bottom_address, ram_top_address); - - let rom_size = memory_cpu.rom().len(); - let rom_bottom_address = MEMORY_ROM_START; - let rom_top_address = rom_bottom_address + rom_size - 1; - println!("ROM: {:.2} KiB mapped at physical {:#010X}-{:#010X}", rom_size / 1024, rom_bottom_address, rom_top_address); - - let mut cpu = Cpu::new(bus, debug_toggle_receiver); - - let event_loop = EventLoop::new(); - let mut input = WinitInputHelper::new(); - let icon = image::load_from_memory(include_bytes!("32.png")).unwrap(); - let window = { - let size = LogicalSize::new(WIDTH as f64, HEIGHT as f64); - WindowBuilder::new() - .with_title(version_string) - .with_inner_size(size) - .with_min_inner_size(size) - .with_window_icon(Some(Icon::from_rgba(icon.as_bytes().to_vec(), 128, 128).unwrap())) - .build(&event_loop) - .unwrap() - }; - - window.set_cursor_visible(false); - - let mut pixels = { - let window_size = window.inner_size(); - let surface_texture = SurfaceTexture::new(window_size.width, window_size.height, &window); - Pixels::new(WIDTH as u32, HEIGHT as u32, surface_texture).unwrap() - }; - - let (interrupt_sender, interrupt_receiver) = mpsc::channel::(); - let (exit_sender, exit_receiver) = mpsc::channel::(); - - AudioChannel::spawn_thread(audio_channel_0, interrupt_sender.clone(), memory.clone()); - AudioChannel::spawn_thread(audio_channel_1, interrupt_sender.clone(), memory.clone()); - AudioChannel::spawn_thread(audio_channel_2, interrupt_sender.clone(), memory.clone()); - AudioChannel::spawn_thread(audio_channel_3, interrupt_sender.clone(), memory.clone()); - - let builder = thread::Builder::new().name("cpu".to_string()); - builder.spawn({ - move || { - loop { - while !cpu.halted { - if let Ok(exception) = exception_receiver.try_recv() { - (cpu.next_exception, cpu.next_exception_operand) = cpu.exception_to_vector(exception); - } else { - if let Ok(interrupt) = interrupt_receiver.try_recv() { - if let Interrupt::Request(vector) = interrupt { - cpu.next_interrupt = Some(vector); - } - } - } - cpu.execute_memory_instruction(); - if let Ok(_) = exit_receiver.try_recv() { - // the rest of the VM has exited, stop the CPU thread - break; - } - } - if let Ok(_) = exit_receiver.try_recv() { - // the rest of the VM has exited, stop the CPU thread - break; - } - if !cpu.flag.interrupt { - // the cpu was halted and interrupts are disabled - // at this point, the cpu is dead and cannot resume, break out of the loop - break; - } - if let Ok(interrupt) = interrupt_receiver.recv() { - if let Interrupt::Request(vector) = interrupt { - cpu.next_interrupt = Some(vector); - cpu.halted = false; - } - } else { - // sender is closed, break - break; - } - } - println!("CPU halted"); - } - }).unwrap(); - - event_loop.run(move |event, _, control_flow| { - *control_flow = ControlFlow::Poll; - - // draw the current frame - if let Event::MainEventsCleared = event { - // update internal state and request a redraw - - match interrupt_sender.send(Interrupt::Request(0xFF)) { // vsync interrupt - Ok(_) => {}, - Err(_) => { - *control_flow = ControlFlow::Exit; - return; - } - }; - display.update(memory_eventloop.clone().ram()); - window.request_redraw(); - - display.draw(pixels.get_frame()); - if pixels - .render() - .map_err(|e| error!("pixels.render() failed: {}", e)) - .is_err() - { - *control_flow = ControlFlow::Exit; - return; - } - } - - // handle input events - if let Event::WindowEvent { ref event, .. } = event { - if let WindowEvent::KeyboardInput { input, .. } = event { - let mut keyboard_lock = keyboard.lock().unwrap(); - let keycode = input.virtual_keycode; - keyboard_lock.push(keycode, input.state); - } - } - - if input.update(&event) { - // close events - if input.quit() { - exit_sender.send(true).unwrap(); - *control_flow = ControlFlow::Exit; - return; - } - - // resize the window - if let Some(size) = input.window_resized() { - pixels.resize_surface(size.width, size.height); - } - - let mouse_pixel = input.mouse().map(|(mx, my)| { - let (x, y) = pixels.window_pos_to_pixel((mx, my)).unwrap_or_else(|pos| pixels.clamp_pixel_pos(pos)); - (x as u16, y as u16) - }).unwrap_or_default(); - - // TODO: allow right click - let mut mouse_lock = mouse.lock().expect("failed to lock the mouse mutex"); - mouse_lock.x = mouse_pixel.0; - mouse_lock.y = mouse_pixel.1; - if mouse_lock.held && !input.mouse_held(0) { - // mouse button was released this frame - mouse_lock.released = true; - } - mouse_lock.held = input.mouse_held(0); - if input.mouse_pressed(0) { - mouse_lock.clicked = true; - } - } - }); -} - -impl Display { - fn new() -> Self { - Self { - background: vec![0; (HEIGHT*WIDTH*4) as usize], - overlays: Arc::new(Mutex::new(vec![Overlay { enabled: false, width: 16, height: 16, x: 0, y: 0, framebuffer_pointer: 0 }; 32])), - } - } - - fn update(&mut self, ram: &MemoryRam) { - let overlay_lock = self.overlays.lock().unwrap(); - - for i in 0..(HEIGHT*WIDTH*4) as usize { - self.background[i] = ram[FRAMEBUFFER_ADDRESS + i]; - } - - for index in 0..=31 { - if overlay_lock[index].enabled { - blit_overlay(&mut self.background, &overlay_lock[index], ram); - } - } - } - - fn draw(&self, frame: &mut [u8]) { - for (i, pixel) in frame.chunks_exact_mut(4).enumerate() { - //let x = (i % WIDTH as usize) as i16; - //let y = (i / WIDTH as usize) as i16; - - let i = i * 4; - - let slice = &self.background[i..i+4]; - pixel.copy_from_slice(slice); - } - } -} - -// modified from https://github.com/parasyte/pixels/blob/main/examples/invaders/simple-invaders/src/sprites.rs -fn blit_overlay(framebuffer: &mut [u8], overlay: &Overlay, ram: &[u8]) { - //assert!(overlay.x + overlay.width <= WIDTH); - //assert!(overlay.y + overlay.height <= HEIGHT); - - let mut width = overlay.width * 4; - let mut height = overlay.height; - - // FIXME: this is a hack, and it only allows overlays to go off-screen on the bottom and right sides - // it also completely fucks up the image on the right side :p - if overlay.x + overlay.width > WIDTH { - let difference = (overlay.x + overlay.width) - WIDTH; - width = width - (difference * 4); - //println!("width: {}, difference: {}", width, difference); - } - if overlay.y + overlay.height > HEIGHT { - let difference = (overlay.y + overlay.height) - HEIGHT; - height = height - difference; - //println!("height: {}, difference: {}", height, difference); - } - - let overlay_framebuffer = &ram[(overlay.framebuffer_pointer as usize)..((overlay.framebuffer_pointer+((width as u32)*(height as u32))) as usize)]; - - let mut overlay_framebuffer_index = 0; - for y in 0..height { - let index = overlay.x * 4 + overlay.y * WIDTH * 4 + y * WIDTH * 4; - // merge overlay onto screen - // this is such a dumb hack - let mut zipped = framebuffer[index..index + width].iter_mut().zip(&overlay_framebuffer[overlay_framebuffer_index..overlay_framebuffer_index + width]); - while let Some((left, &right)) = zipped.next() { - let (left_0, &right_0) = (left, &right); - let (left_1, &right_1) = zipped.next().unwrap(); - let (left_2, &right_2) = zipped.next().unwrap(); - let (left_3, &right_3) = zipped.next().unwrap(); - // ensure that the alpha byte is greater than zero, meaning that this pixel shouldn't be transparent - if right_3 > 0 { - *left_0 = right_0; - *left_1 = right_1; - *left_2 = right_2; - *left_3 = right_3; - } - } - overlay_framebuffer_index += width; - } -} diff --git a/src/memory.rs b/src/memory.rs deleted file mode 100644 index 1f085df..0000000 --- a/src/memory.rs +++ /dev/null @@ -1,303 +0,0 @@ -// memory.rs - -use crate::error; -use crate::cpu::Exception; - -use std::cell::UnsafeCell; -use std::collections::HashMap; -use std::sync::Arc; -use std::io::Write; -use std::fs::File; -use std::sync::mpsc::Sender; - -pub const MEMORY_RAM_SIZE: usize = 0x04000000; // 64 MiB -pub const MEMORY_ROM_SIZE: usize = 0x00080000; // 512 KiB - -pub const MEMORY_RAM_START: usize = 0x00000000; -pub const MEMORY_ROM_START: usize = 0xF0000000; - -pub type MemoryRam = [u8; MEMORY_RAM_SIZE]; -pub type MemoryRom = [u8; MEMORY_ROM_SIZE]; - -#[derive(Debug)] -pub struct MemoryPage { - physical_address: u32, - present: bool, - rw: bool, -} - -struct MemoryInner { - ram: Box, - rom: Box, - mmu_enabled: Box, - tlb: Box>, - paging_directory_address: Box, - exception_sender: Sender, -} - -impl MemoryInner { - pub fn new(rom: &[u8], exception_sender: Sender) -> Self { - let mut this = Self { - // HACK: allocate directly on the heap to avoid a stack overflow - // at runtime while trying to move around a 64MB array - ram: unsafe { Box::from_raw(Box::into_raw(vec![0u8; MEMORY_RAM_SIZE].into_boxed_slice()) as *mut MemoryRam) }, - rom: unsafe { Box::from_raw(Box::into_raw(vec![0u8; MEMORY_ROM_SIZE].into_boxed_slice()) as *mut MemoryRom) }, - mmu_enabled: Box::from(false), - tlb: Box::from(HashMap::with_capacity(1024)), - paging_directory_address: Box::from(0x00000000), - exception_sender, - }; - this.rom.as_mut_slice().write(rom).expect("failed to copy ROM to memory"); - this - } -} - -#[derive(Clone)] -pub struct Memory(Arc>); - -// SAFETY: once MemoryInner is initialzed, there is no way to modify the Box -// pointers it contains and it does not matter if contents of the byte -// arrays are corrupted -unsafe impl Send for Memory {} -unsafe impl Sync for Memory {} - -impl Memory { - pub fn new(rom: &[u8], exception_sender: Sender) -> Self { - Self(Arc::new(UnsafeCell::new(MemoryInner::new(rom, exception_sender)))) - } - - fn inner(&self) -> &mut MemoryInner { - unsafe { &mut *self.0.get() } - } - - pub fn ram(&self) -> &mut MemoryRam { &mut self.inner().ram } - pub fn rom(&self) -> &mut MemoryRom { &mut self.inner().rom } - pub fn mmu_enabled(&self) -> &mut bool { &mut self.inner().mmu_enabled } - pub fn tlb(&self) -> &mut HashMap { &mut self.inner().tlb } - pub fn paging_directory_address(&self) -> &mut u32 { &mut self.inner().paging_directory_address } - pub fn exception_sender(&self) -> &mut Sender { &mut self.inner().exception_sender } - - pub fn dump(&self) { - let mut file = File::create("memory.dump").expect("failed to open memory dump file"); - file.write_all(self.ram()).expect("failed to write memory dump file"); - } - - // each table contains 1024 entries - // the paging directory contains pointers to paging tables with the following format: - // bit 0: present - // remaining bits are ignored, should be zero - // bits 12-31: physical address of paging table - - // the paging table contains pointers to physical memory pages with the following format: - // bit 0: present - // bit 1: r/w - // remaining bits are ignored, should be zero - // bits 12-31: physical address - - pub fn flush_tlb(&self, paging_directory_address: Option) { - if let Some(address) = paging_directory_address { - *self.paging_directory_address() = address; - }; - - self.tlb().clear(); - } - - pub fn flush_page(&self, virtual_address: u32) { - let virtual_page = virtual_address & 0xFFFFF000; - self.tlb().remove(&virtual_page); - } - - pub fn insert_tlb_entry_from_tables(&mut self, page_directory_index: u32, page_table_index: u32) -> bool { - let old_state = *self.mmu_enabled(); - *self.mmu_enabled() = false; - let directory_address = *self.paging_directory_address(); - let directory = self.read_opt_32(directory_address + (page_directory_index * 4)); - match directory { - Some(directory) => { - let dir_present = directory & 0b1 != 0; - let dir_address = directory & 0xFFFFF000; - if dir_present { - let table = self.read_opt_32(dir_address + (page_table_index * 4)); - match table { - Some(table) => { - let table_present = table & 0b01 != 0; - let table_rw = table & 0b10 != 0; - let table_address = table & 0xFFFFF000; - - if table_present { - let tlb_entry = MemoryPage { - physical_address: table_address, - present: table_present, - rw: table_rw, - }; - self.tlb().entry((page_directory_index << 22) | (page_table_index << 12)).or_insert(tlb_entry); - } - }, - None => {} - } - } - *self.mmu_enabled() = old_state; - dir_present - }, - None => { - *self.mmu_enabled() = old_state; - false - } - } - } - - pub fn virtual_to_physical(&mut self, virtual_address: u32) -> Option<(u32, bool)> { - let virtual_page = virtual_address & 0xFFFFF000; - let offset = virtual_address & 0x00000FFF; - let physical_page = self.tlb().get(&virtual_page); - let physical_address = match physical_page { - Some(page) => { - if page.present { - Some((page.physical_address | offset, page.rw)) - } else { - None - } - }, - None => { - let page_directory_index = virtual_address >> 22; - let page_table_index = (virtual_address >> 12) & 0x03FF; - let dir_present = self.insert_tlb_entry_from_tables(page_directory_index, page_table_index); - if !dir_present { - return None; - } - // try again after inserting the TLB entry - let physical_page = self.tlb().get(&virtual_page); - let physical_address = match physical_page { - Some(page) => { - if page.present { - Some((page.physical_address | offset, page.rw)) - } else { - None - } - }, - None => None, - }; - physical_address - }, - }; - physical_address - } - - pub fn read_opt_8(&mut self, mut address: u32) -> Option { - if *self.mmu_enabled() { - let address_maybe = self.virtual_to_physical(address as u32); - match address_maybe { - Some(addr) => address = addr.0, - None => return None, - } - } - - let address = address as usize; - - if address >= MEMORY_ROM_START && address < MEMORY_ROM_START + MEMORY_ROM_SIZE { - self.rom().get(address - MEMORY_ROM_START).map(|value| *value) - } else { - self.ram().get(address - MEMORY_RAM_START).map(|value| *value) - } - } - pub fn read_opt_16(&mut self, address: u32) -> Option { - Some(self.read_opt_8(address)? as u16 | - (self.read_opt_8(address + 1)? as u16) << 8 - ) - } - pub fn read_opt_32(&mut self, address: u32) -> Option { - Some(self.read_opt_8(address)? as u32 | - (self.read_opt_8(address + 1)? as u32) << 8 | - (self.read_opt_8(address + 2)? as u32) << 16 | - (self.read_opt_8(address + 3)? as u32) << 24 - ) - } - - pub fn read_8(&mut self, address: u32) -> Option { - let mut read_ok = true; - let value = self.read_opt_8(address).unwrap_or_else(|| { read_ok = false; 0 }); - if read_ok { - Some(value) - } else { - self.exception_sender().send(Exception::PageFaultRead(address)).unwrap(); - None - } - } - pub fn read_16(&mut self, address: u32) -> Option { - Some(self.read_8(address)? as u16 | - (self.read_8(address + 1)? as u16) << 8 - ) - } - pub fn read_32(&mut self, address: u32) -> Option { - Some(self.read_8(address)? as u32 | - (self.read_8(address + 1)? as u32) << 8 | - (self.read_8(address + 2)? as u32) << 16 | - (self.read_8(address + 3)? as u32) << 24 - ) - } - - pub fn write_8(&mut self, mut address: u32, byte: u8) -> Option<()> { - let original_address = address; - let mut writable = true; - if *self.mmu_enabled() { - (address, writable) = self.virtual_to_physical(address as u32).unwrap_or_else(|| { - (0, false) - }); - } - - if writable { - let address = address as usize; - - if address >= MEMORY_ROM_START && address < MEMORY_ROM_START + MEMORY_ROM_SIZE { - error(&format!("attempting to write to ROM address: {:#010X}", address)); - } - - match self.ram().get_mut(address - MEMORY_RAM_START) { - Some(value) => { - *value = byte; - } - None => { - self.exception_sender().send(Exception::PageFaultWrite(original_address)).unwrap(); - } - } - Some(()) - } else { - self.exception_sender().send(Exception::PageFaultWrite(original_address)).unwrap(); - None - } - } - pub fn write_16(&mut self, address: u32, half: u16) -> Option<()> { - // first check if we can write to all addresses without faulting - if *self.mmu_enabled() { - let (_, writable_0) = self.virtual_to_physical(address).unwrap_or_else(|| (0, false)); - let (_, writable_1) = self.virtual_to_physical(address + 1).unwrap_or_else(|| (0, false)); - if !writable_0 { self.exception_sender().send(Exception::PageFaultWrite(address)).unwrap(); return None } - if !writable_1 { self.exception_sender().send(Exception::PageFaultWrite(address + 1)).unwrap(); return None } - } - - // then do the actual writes - self.write_8(address, (half & 0x00FF) as u8)?; - self.write_8(address + 1, (half >> 8) as u8)?; - Some(()) - } - pub fn write_32(&mut self, address: u32, word: u32) -> Option<()> { - // first check if we can write to all addresses without faulting - if *self.mmu_enabled() { - let (_, writable_0) = self.virtual_to_physical(address).unwrap_or_else(|| (0, false)); - let (_, writable_1) = self.virtual_to_physical(address + 1).unwrap_or_else(|| (0, false)); - let (_, writable_2) = self.virtual_to_physical(address + 2).unwrap_or_else(|| (0, false)); - let (_, writable_3) = self.virtual_to_physical(address + 3).unwrap_or_else(|| (0, false)); - if !writable_0 { self.exception_sender().send(Exception::PageFaultWrite(address)).unwrap(); return None } - if !writable_1 { self.exception_sender().send(Exception::PageFaultWrite(address + 1)).unwrap(); return None } - if !writable_2 { self.exception_sender().send(Exception::PageFaultWrite(address + 2)).unwrap(); return None } - if !writable_3 { self.exception_sender().send(Exception::PageFaultWrite(address + 3)).unwrap(); return None } - } - - // then do the actual writes - self.write_8(address, (word & 0x000000FF) as u8)?; - self.write_8(address + 1, ((word & 0x0000FF00) >> 8) as u8)?; - self.write_8(address + 2, ((word & 0x00FF0000) >> 16) as u8)?; - self.write_8(address + 3, ((word & 0xFF000000) >> 24) as u8)?; - Some(()) - } -} diff --git a/src/mouse.rs b/src/mouse.rs deleted file mode 100644 index 7cc2b40..0000000 --- a/src/mouse.rs +++ /dev/null @@ -1,15 +0,0 @@ -// mouse.rs - -pub struct Mouse { - pub x: u16, - pub y: u16, - pub clicked: bool, - pub released: bool, - pub held: bool, -} - -impl Mouse { - pub fn new() -> Self { - Mouse { x: 0, y: 0, clicked: false, released: false, held: false } - } -}