diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e6a3788b7d7ff0003d3e6ae633c4b0dbbaa58670 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea +target/ +*.swp +.vscode \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000000000000000000000000000000000000..501bf56d22bcd48dbc1f187d8fe42acec88698bf --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1453 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[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 = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +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 = "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.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" + +[[package]] +name = "bytemuck" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "calloop" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf2eec61efe56aa1e813f5126959296933cf0700030e4314786c48779a66ab82" +dependencies = [ + "log", + "nix 0.22.3", +] + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[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 = "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.3", + "core-graphics 0.22.3", + "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.3", + "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 = "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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation 0.9.3", + "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.3", + "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 = "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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "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 = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[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 = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi", +] + +[[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 = "gpu-alloc" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d" +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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b0c02e1ba0bdb14e965058ca34e09c020f8e507a760df1121728e0aef68d57a" +dependencies = [ + "bitflags", + "gpu-descriptor-types", + "hashbrown", +] + +[[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 = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "inplace_it" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67f0347836f3f6362c1e7efdadde2b1c4b4556d211310b70631bae7eb692070b" + +[[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 = "itertools" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +dependencies = [ + "either", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" +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 = "libc" +version = "0.2.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" + +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if 1.0.0", + "winapi", +] + +[[package]] +name = "lock_api" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f80bf5aacaf25cbfc8210d1cfb718f2bf3b11c4c54e5afe36c236853a8ec390" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +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.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "mio" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys", +] + +[[package]] +name = "naga" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3012f2dbcc79e8e0b5825a4836a7106a75dd9b2fe42c528163be0f572538c705" +dependencies = [ + "bit-set", + "bitflags", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "num-traits", + "rustc-hash", + "spirv", + "thiserror", +] + +[[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", + "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71bee8ea72d685477e28bd004cfe1bf99c754d688cd78cad139eae4089484d4" +dependencies = [ + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-macro", + "ndk-sys", +] + +[[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 = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[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_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "once_cell" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" + +[[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 = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[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.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "pollster" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" + +[[package]] +name = "proc-macro-crate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +dependencies = [ + "once_cell", + "thiserror", + "toml", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f61dcf0b917cd75d4521d7343d1ffff3d1583054133c9b5cbea3375c703c40d" + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" +dependencies = [ + "cty", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "renderdoc-sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "safe_arch" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ff3d6d9696af502cc3110dacce942840fb06ff4514cad92236ecc455f2ce05" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[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.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" + +[[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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" + +[[package]] +name = "smithay-client-toolkit" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a28f16a97fa0e8ce563b2774d1e732dd5d4025d2772c5dba0a41a0f90a29da3" +dependencies = [ + "bitflags", + "calloop", + "dlib", + "lazy_static", + "log", + "memmap2", + "nix 0.22.3", + "pkg-config", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[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 = "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 = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +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 = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "tudelft-nes-ppu" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41174fa93758dbce9574e20951200a4b2ab3e0a4656d132338d3de3f1936568e" +dependencies = [ + "itertools", + "pixels", + "winit", +] + +[[package]] +name = "tudelft-nes-test" +version = "0.1.0" +dependencies = [ + "thiserror", + "tudelft-nes-ppu", +] + +[[package]] +name = "ultraviolet" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b9e3507eba17043af05c8a72fce3ec2c24b58945f45732e71dbc6646d904a7" +dependencies = [ + "wide", +] + +[[package]] +name = "unicode-ident" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" + +[[package]] +name = "wayland-client" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +dependencies = [ + "bitflags", + "downcast-rs", + "libc", + "nix 0.24.2", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +dependencies = [ + "nix 0.24.2", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +dependencies = [ + "nix 0.24.2", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +dependencies = [ + "bitflags", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4688c000eb841ca55f7b35db659b78d6e1cd77d7caf8fb929f4e181f754047d" +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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d684ea6a34974a2fc19f1dfd183d11a62e22d75c4f187a574bb1224df8e056c2" +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-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +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.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[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.3", + "core-graphics 0.22.3", + "core-video-sys", + "dispatch", + "instant", + "lazy_static", + "libc", + "log", + "mio", + "ndk", + "ndk-glue", + "ndk-sys", + "objc", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "smithay-client-toolkit", + "wasm-bindgen", + "wayland-client", + "wayland-protocols", + "web-sys", + "winapi", + "x11-dl", +] + +[[package]] +name = "x11-dl" +version = "2.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c83627bc137605acc00bb399c7b908ef460b621fc37c953db2b09f88c449ea6" +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" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..cc9117218727a37da8b4397db085e59a55318312 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "tudelft-nes-test" +version = "0.1.0" +edition = "2021" +authors = [ + "Victor Roest <victor@xirion.net>", + "Jonathan Dönszelmann <jonabent@gmail.com>", +] +description = "support library for the 'software fundamentals' project for the TU Delft" +repository = "https://gitlab.ewi.tudelft.nl/software-fundamentals/nes-emulator-testing" +keywords = ["NES", "tudelft"] +categories = ["emulators", "development-tools::testing"] +license = "MIT" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +tudelft-nes-ppu = "1.0.3" +thiserror = "1.0.32" diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..e1b87d698979913b6b8237f88d551ec04d30179b --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,674 @@ +use std::error::Error; +use std::thread; +use std::thread::JoinHandle; +use tudelft_nes_ppu::Cpu; + +pub use tudelft_nes_ppu::run_cpu_headless_for; + +pub trait TestableCpu: Cpu + Sized { + fn run_ines_rom(rom: &[u8], num_cycles: usize) -> Result<Self, Box<dyn Error + Send>>; + fn memory_read(&self, address: u16) -> u8; +} + +pub fn run_all_tests<T: TestableCpu>() -> Result<(), String> { + nestest::<T>()?; + + Ok(()) +} + +fn nestest<T: TestableCpu>() -> Result<(), String> { + let rom = include_bytes!("roms/nestest.nes"); + + let handle = thread::spawn(|| { + match T::run_ines_rom(rom, 10000) { + Err(e) => { + Err(TestError::Custom(e)) + } + Ok(cpu) => { + match (cpu.memory_read(0x0002), cpu.memory_read(0x0003)) { + (0, _) | (_, 0) => Ok(()), + + // branch tests + // ------------ + (0x001, _) => Err(TestError::String("BCS failed to branch".into())), + (0x002, _) => Err(TestError::String("BCS branched when it shouldn't have".into())), + (0x003, _) => Err(TestError::String("BCC branched when it shouldn't have".into())), + (0x004, _) => Err(TestError::String("BCC failed to branch".into())), + (0x005, _) => Err(TestError::String("BEQ failed to branch".into())), + (0x006, _) => Err(TestError::String("BEQ branched when it shouldn't have".into())), + (0x007, _) => Err(TestError::String("BNE failed to branch".into())), + (0x008, _) => Err(TestError::String("BNE branched when it shouldn't have".into())), + (0x009, _) => Err(TestError::String("BVS failed to branch".into())), + (0x00A, _) => Err(TestError::String("BVC branched when it shouldn't have".into())), + (0x00B, _) => Err(TestError::String("BVC failed to branch".into())), + (0x00C, _) => Err(TestError::String("BVS branched when it shouldn't have".into())), + (0x00D, _) => Err(TestError::String("BPL failed to branch".into())), + (0x00E, _) => Err(TestError::String("BPL branched when it shouldn't have".into())), + (0x00F, _) => Err(TestError::String("BMI failed to branch".into())), + (0x010, _) => Err(TestError::String("BMI branched when it shouldn't have".into())), + + // flag tests + // ---------- + (0x011, _) => Err(TestError::String("PHP/flags failure (bits set)".into())), + (0x012, _) => Err(TestError::String("PHP/flags failure (bits clear)".into())), + (0x013, _) => Err(TestError::String("PHP/flags failure (misc bit states)".into())), + (0x014, _) => Err(TestError::String("PLP/flags failure (misc bit states)".into())), + (0x015, _) => Err(TestError::String("PLP/flags failure (misc bit states)".into())), + (0x016, _) => Err(TestError::String("PHA/PLA failure (PLA didn't affect Z and N properly)".into())), + (0x017, _) => Err(TestError::String("PHA/PLA failure (PLA didn't affect Z and N properly)".into())), + + // immediate instruction tests + // --------------------------- + (0x018, _) => Err(TestError::String("ORA # failure".into())), + (0x019, _) => Err(TestError::String("ORA # failure".into())), + (0x01A, _) => Err(TestError::String("AND # failure".into())), + (0x01B, _) => Err(TestError::String("AND # failure".into())), + (0x01C, _) => Err(TestError::String("EOR # failure".into())), + (0x01D, _) => Err(TestError::String("EOR # failure".into())), + (0x01E, _) => Err(TestError::String("ADC # failure (overflow/carry problems)".into())), + (0x01F, _) => Err(TestError::String("ADC # failure (decimal mode was turned on)".into())), + (0x020, _) => Err(TestError::String("ADC # failure".into())), + (0x021, _) => Err(TestError::String("ADC # failure".into())), + (0x022, _) => Err(TestError::String("ADC # failure".into())), + (0x023, _) => Err(TestError::String("LDA # failure (didn't set N and Z correctly)".into())), + (0x024, _) => Err(TestError::String("LDA # failure (didn't set N and Z correctly)".into())), + (0x025, _) => Err(TestError::String("CMP # failure (messed up flags)".into())), + (0x026, _) => Err(TestError::String("CMP # failure (messed up flags)".into())), + (0x027, _) => Err(TestError::String("CMP # failure (messed up flags)".into())), + (0x028, _) => Err(TestError::String("CMP # failure (messed up flags)".into())), + (0x029, _) => Err(TestError::String("CMP # failure (messed up flags)".into())), + (0x02A, _) => Err(TestError::String("CMP # failure (messed up flags)".into())), + (0x02B, _) => Err(TestError::String("CPY # failure (messed up flags)".into())), + (0x02C, _) => Err(TestError::String("CPY # failure (messed up flags)".into())), + (0x02D, _) => Err(TestError::String("CPY # failure (messed up flags)".into())), + (0x02E, _) => Err(TestError::String("CPY # failure (messed up flags)".into())), + (0x02F, _) => Err(TestError::String("CPY # failure (messed up flags)".into())), + (0x030, _) => Err(TestError::String("CPY # failure (messed up flags)".into())), + (0x031, _) => Err(TestError::String("CPY # failure (messed up flags)".into())), + (0x032, _) => Err(TestError::String("CPX # failure (messed up flags)".into())), + (0x033, _) => Err(TestError::String("CPX # failure (messed up flags)".into())), + (0x034, _) => Err(TestError::String("CPX # failure (messed up flags)".into())), + (0x035, _) => Err(TestError::String("CPX # failure (messed up flags)".into())), + (0x036, _) => Err(TestError::String("CPX # failure (messed up flags)".into())), + (0x037, _) => Err(TestError::String("CPX # failure (messed up flags)".into())), + (0x038, _) => Err(TestError::String("CPX # failure (messed up flags)".into())), + (0x039, _) => Err(TestError::String("LDX # failure (didn't set N and Z correctly)".into())), + (0x03A, _) => Err(TestError::String("LDX # failure (didn't set N and Z correctly)".into())), + (0x03B, _) => Err(TestError::String("LDY # failure (didn't set N and Z correctly)".into())), + (0x03C, _) => Err(TestError::String("LDY # failure (didn't set N and Z correctly)".into())), + (0x03D, _) => Err(TestError::String("compare(s) stored the result in a register (whoops!)".into())), + (0x071, _) => Err(TestError::String("SBC # failure".into())), + (0x072, _) => Err(TestError::String("SBC # failure".into())), + (0x073, _) => Err(TestError::String("SBC # failure".into())), + (0x074, _) => Err(TestError::String("SBC # failure".into())), + (0x075, _) => Err(TestError::String("SBC # failure".into())), + + + // implied instruction tests + // ------------------------- + (0x03E, _) => Err(TestError::String("INX/DEX/INY/DEY did something bad".into())), + (0x03F, _) => Err(TestError::String("INY/DEY messed up overflow or carry".into())), + (0x040, _) => Err(TestError::String("INX/DEX messed up overflow or carry".into())), + (0x041, _) => Err(TestError::String("TAY did something bad (changed wrong regs, messed up flags)".into())), + (0x042, _) => Err(TestError::String("TAX did something bad (changed wrong regs, messed up flags)".into())), + (0x043, _) => Err(TestError::String("TYA did something bad (changed wrong regs, messed up flags)".into())), + (0x044, _) => Err(TestError::String("TXA did something bad (changed wrong regs, messed up flags)".into())), + (0x045, _) => Err(TestError::String("TXS didn't set flags right, or TSX touched flags and it shouldn't have".into())), + + // stack tests + // ----------- + (0x046, _) => Err(TestError::String("wrong data popped, or data not in right location on stack".into())), + (0x047, _) => Err(TestError::String("JSR didn't work as expected".into())), + (0x048, _) => Err(TestError::String("RTS/JSR shouldn't have affected flags".into())), + (0x049, _) => Err(TestError::String("RTI/RTS didn't work right when return addys/data were manually pushed".into())), + + // accumulator tests + // ----------------- + (0x04A, _) => Err(TestError::String("LSR A failed".into())), + (0x04B, _) => Err(TestError::String("ASL A failed".into())), + (0x04C, _) => Err(TestError::String("ROR A failed".into())), + (0x04D, _) => Err(TestError::String("ROL A failed".into())), + + // (indirect,x) tests + // ------------------ + (0x058, _) => Err(TestError::String("LDA didn't load the data it expected to load".into())), + (0x059, _) => Err(TestError::String("STA didn't store the data where it was supposed to".into())), + (0x05A, _) => Err(TestError::String("ORA failure".into())), + (0x05B, _) => Err(TestError::String("ORA failure".into())), + (0x05C, _) => Err(TestError::String("AND failure".into())), + (0x05D, _) => Err(TestError::String("AND failure".into())), + (0x05E, _) => Err(TestError::String("EOR failure".into())), + (0x05F, _) => Err(TestError::String("EOR failure".into())), + (0x060, _) => Err(TestError::String("ADC failure".into())), + (0x061, _) => Err(TestError::String("ADC failure".into())), + (0x062, _) => Err(TestError::String("ADC failure".into())), + (0x063, _) => Err(TestError::String("ADC failure".into())), + (0x064, _) => Err(TestError::String("ADC failure".into())), + (0x065, _) => Err(TestError::String("CMP failure".into())), + (0x066, _) => Err(TestError::String("CMP failure".into())), + (0x067, _) => Err(TestError::String("CMP failure".into())), + (0x068, _) => Err(TestError::String("CMP failure".into())), + (0x069, _) => Err(TestError::String("CMP failure".into())), + (0x06A, _) => Err(TestError::String("CMP failure".into())), + (0x06B, _) => Err(TestError::String("CMP failure".into())), + (0x06C, _) => Err(TestError::String("SBC failure".into())), + (0x06D, _) => Err(TestError::String("SBC failure".into())), + (0x06E, _) => Err(TestError::String("SBC failure".into())), + (0x06F, _) => Err(TestError::String("SBC failure".into())), + (0x070, _) => Err(TestError::String("SBC failure".into())), + + // zeropage tests + // -------------- + (0x076, _) => Err(TestError::String("LDA didn't set the flags properly".into())), + (0x077, _) => Err(TestError::String("STA affected flags it shouldn't".into())), + (0x078, _) => Err(TestError::String("LDY didn't set the flags properly".into())), + (0x079, _) => Err(TestError::String("STY affected flags it shouldn't".into())), + (0x07A, _) => Err(TestError::String("LDX didn't set the flags properly".into())), + (0x07B, _) => Err(TestError::String("STX affected flags it shouldn't".into())), + (0x07C, _) => Err(TestError::String("BIT failure".into())), + (0x07D, _) => Err(TestError::String("BIT failure".into())), + (0x07E, _) => Err(TestError::String("ORA failure".into())), + (0x07F, _) => Err(TestError::String("ORA failure".into())), + (0x080, _) => Err(TestError::String("AND failure".into())), + (0x081, _) => Err(TestError::String("AND failure".into())), + (0x082, _) => Err(TestError::String("EOR failure".into())), + (0x083, _) => Err(TestError::String("EOR failure".into())), + (0x084, _) => Err(TestError::String("ADC failure".into())), + (0x085, _) => Err(TestError::String("ADC failure".into())), + (0x086, _) => Err(TestError::String("ADC failure".into())), + (0x087, _) => Err(TestError::String("ADC failure".into())), + (0x088, _) => Err(TestError::String("ADC failure".into())), + (0x089, _) => Err(TestError::String("CMP failure".into())), + (0x08A, _) => Err(TestError::String("CMP failure".into())), + (0x08B, _) => Err(TestError::String("CMP failure".into())), + (0x08C, _) => Err(TestError::String("CMP failure".into())), + (0x08D, _) => Err(TestError::String("CMP failure".into())), + (0x08E, _) => Err(TestError::String("CMP failure".into())), + (0x08F, _) => Err(TestError::String("CMP failure".into())), + (0x090, _) => Err(TestError::String("SBC failure".into())), + (0x091, _) => Err(TestError::String("SBC failure".into())), + (0x092, _) => Err(TestError::String("SBC failure".into())), + (0x093, _) => Err(TestError::String("SBC failure".into())), + (0x094, _) => Err(TestError::String("SBC failure".into())), + (0x095, _) => Err(TestError::String("CPX failure".into())), + (0x096, _) => Err(TestError::String("CPX failure".into())), + (0x097, _) => Err(TestError::String("CPX failure".into())), + (0x098, _) => Err(TestError::String("CPX failure".into())), + (0x099, _) => Err(TestError::String("CPX failure".into())), + (0x09A, _) => Err(TestError::String("CPX failure".into())), + (0x09B, _) => Err(TestError::String("CPX failure".into())), + (0x09C, _) => Err(TestError::String("CPY failure".into())), + (0x09D, _) => Err(TestError::String("CPY failure".into())), + (0x09E, _) => Err(TestError::String("CPY failure".into())), + (0x09F, _) => Err(TestError::String("CPY failure".into())), + (0x0A0, _) => Err(TestError::String("CPY failure".into())), + (0x0A1, _) => Err(TestError::String("CPY failure".into())), + (0x0A2, _) => Err(TestError::String("CPY failure".into())), + (0x0A3, _) => Err(TestError::String("LSR failure".into())), + (0x0A4, _) => Err(TestError::String("LSR failure".into())), + (0x0A5, _) => Err(TestError::String("ASL failure".into())), + (0x0A6, _) => Err(TestError::String("ASL failure".into())), + (0x0A7, _) => Err(TestError::String("ROL failure".into())), + (0x0A8, _) => Err(TestError::String("ROL failure".into())), + (0x0A9, _) => Err(TestError::String("ROR failure".into())), + (0x0AA, _) => Err(TestError::String("ROR failure".into())), + (0x0AB, _) => Err(TestError::String("INC failure".into())), + (0x0AC, _) => Err(TestError::String("INC failure".into())), + (0x0AD, _) => Err(TestError::String("DEC failure".into())), + (0x0AE, _) => Err(TestError::String("DEC failure".into())), + (0x0AF, _) => Err(TestError::String("DEC failure".into())), + + // Absolute tests + // -------------- + (0x0B0, _) => Err(TestError::String("LDA didn't set the flags properly".into())), + (0x0B1, _) => Err(TestError::String("STA affected flags it shouldn't".into())), + (0x0B2, _) => Err(TestError::String("LDY didn't set the flags properly".into())), + (0x0B3, _) => Err(TestError::String("STY affected flags it shouldn't".into())), + (0x0B4, _) => Err(TestError::String("LDX didn't set the flags properly".into())), + (0x0B5, _) => Err(TestError::String("STX affected flags it shouldn't".into())), + (0x0B6, _) => Err(TestError::String("BIT failure".into())), + (0x0B7, _) => Err(TestError::String("BIT failure".into())), + (0x0B8, _) => Err(TestError::String("ORA failure".into())), + (0x0B9, _) => Err(TestError::String("ORA failure".into())), + (0x0BA, _) => Err(TestError::String("AND failure".into())), + (0x0BB, _) => Err(TestError::String("AND failure".into())), + (0x0BC, _) => Err(TestError::String("EOR failure".into())), + (0x0BD, _) => Err(TestError::String("EOR failure".into())), + (0x0BE, _) => Err(TestError::String("ADC failure".into())), + (0x0BF, _) => Err(TestError::String("ADC failure".into())), + (0x0C0, _) => Err(TestError::String("ADC failure".into())), + (0x0C1, _) => Err(TestError::String("ADC failure".into())), + (0x0C2, _) => Err(TestError::String("ADC failure".into())), + (0x0C3, _) => Err(TestError::String("CMP failure".into())), + (0x0C4, _) => Err(TestError::String("CMP failure".into())), + (0x0C5, _) => Err(TestError::String("CMP failure".into())), + (0x0C6, _) => Err(TestError::String("CMP failure".into())), + (0x0C7, _) => Err(TestError::String("CMP failure".into())), + (0x0C8, _) => Err(TestError::String("CMP failure".into())), + (0x0C9, _) => Err(TestError::String("CMP failure".into())), + (0x0CA, _) => Err(TestError::String("SBC failure".into())), + (0x0CB, _) => Err(TestError::String("SBC failure".into())), + (0x0CC, _) => Err(TestError::String("SBC failure".into())), + (0x0CD, _) => Err(TestError::String("SBC failure".into())), + (0x0CE, _) => Err(TestError::String("SBC failure".into())), + (0x0CF, _) => Err(TestError::String("CPX failure".into())), + (0x0D0, _) => Err(TestError::String("CPX failure".into())), + (0x0D1, _) => Err(TestError::String("CPX failure".into())), + (0x0D2, _) => Err(TestError::String("CPX failure".into())), + (0x0D3, _) => Err(TestError::String("CPX failure".into())), + (0x0D4, _) => Err(TestError::String("CPX failure".into())), + (0x0D5, _) => Err(TestError::String("CPX failure".into())), + (0x0D6, _) => Err(TestError::String("CPY failure".into())), + (0x0D7, _) => Err(TestError::String("CPY failure".into())), + (0x0D8, _) => Err(TestError::String("CPY failure".into())), + (0x0D9, _) => Err(TestError::String("CPY failure".into())), + (0x0DA, _) => Err(TestError::String("CPY failure".into())), + (0x0DB, _) => Err(TestError::String("CPY failure".into())), + (0x0DC, _) => Err(TestError::String("CPY failure".into())), + (0x0DD, _) => Err(TestError::String("LSR failure".into())), + (0x0DE, _) => Err(TestError::String("LSR failure".into())), + (0x0DF, _) => Err(TestError::String("ASL failure".into())), + (0x0E0, _) => Err(TestError::String("ASL failure".into())), + (0x0E1, _) => Err(TestError::String("ROR failure".into())), + (0x0E2, _) => Err(TestError::String("ROR failure".into())), + (0x0E3, _) => Err(TestError::String("ROL failure".into())), + (0x0E4, _) => Err(TestError::String("ROL failure".into())), + (0x0E5, _) => Err(TestError::String("INC failure".into())), + (0x0E6, _) => Err(TestError::String("INC failure".into())), + (0x0E7, _) => Err(TestError::String("DEC failure".into())), + (0x0E8, _) => Err(TestError::String("DEC failure".into())), + (0x0E9, _) => Err(TestError::String("DEC failure".into())), + + // (indirect),y tests + // ------------------ + (0x0EA, _) => Err(TestError::String("LDA didn't load what it was supposed to".into())), + (0x0EB, _) => Err(TestError::String("read location should've wrapped around ffffh to 0000h".into())), + (0x0EC, _) => Err(TestError::String("should've wrapped zeropage address".into())), + (0x0ED, _) => Err(TestError::String("ORA failure".into())), + (0x0EE, _) => Err(TestError::String("ORA failure".into())), + (0x0EF, _) => Err(TestError::String("AND failure".into())), + (0x0F0, _) => Err(TestError::String("AND failure".into())), + (0x0F1, _) => Err(TestError::String("EOR failure".into())), + (0x0F2, _) => Err(TestError::String("EOR failure".into())), + (0x0F3, _) => Err(TestError::String("ADC failure".into())), + (0x0F4, _) => Err(TestError::String("ADC failure".into())), + (0x0F5, _) => Err(TestError::String("ADC failure".into())), + (0x0F6, _) => Err(TestError::String("ADC failure".into())), + (0x0F7, _) => Err(TestError::String("ADC failure".into())), + (0x0F8, _) => Err(TestError::String("CMP failure".into())), + (0x0F9, _) => Err(TestError::String("CMP failure".into())), + (0x0FA, _) => Err(TestError::String("CMP failure".into())), + (0x0FB, _) => Err(TestError::String("CMP failure".into())), + (0x0FC, _) => Err(TestError::String("CMP failure".into())), + (0x0FD, _) => Err(TestError::String("CMP failure".into())), + (0x0FE, _) => Err(TestError::String("CMP failure".into())), + + (_, 0x001) => Err(TestError::String("SBC failure".into())), + (_, 0x002) => Err(TestError::String("SBC failure".into())), + (_, 0x003) => Err(TestError::String("SBC failure".into())), + (_, 0x004) => Err(TestError::String("SBC failure".into())), + (_, 0x005) => Err(TestError::String("SBC failure".into())), + (_, 0x006) => Err(TestError::String("STA failure".into())), + (_, 0x007) => Err(TestError::String("JMP () data reading didn't wrap properly (this fails on a 65C02)".into())), + + // zeropage,x tests + // ---------------- + (_, 0x008) => Err(TestError::String("LDY,X failure".into())), + (_, 0x009) => Err(TestError::String("LDY,X failure".into())), + (_, 0x00A) => Err(TestError::String("STY,X failure".into())), + (_, 0x00B) => Err(TestError::String("ORA failure".into())), + (_, 0x00C) => Err(TestError::String("ORA failure".into())), + (_, 0x00D) => Err(TestError::String("AND failure".into())), + (_, 0x00E) => Err(TestError::String("AND failure".into())), + (_, 0x00F) => Err(TestError::String("EOR failure".into())), + (_, 0x010) => Err(TestError::String("EOR failure".into())), + (_, 0x011) => Err(TestError::String("ADC failure".into())), + (_, 0x012) => Err(TestError::String("ADC failure".into())), + (_, 0x013) => Err(TestError::String("ADC failure".into())), + (_, 0x014) => Err(TestError::String("ADC failure".into())), + (_, 0x015) => Err(TestError::String("ADC failure".into())), + (_, 0x016) => Err(TestError::String("CMP failure".into())), + (_, 0x017) => Err(TestError::String("CMP failure".into())), + (_, 0x018) => Err(TestError::String("CMP failure".into())), + (_, 0x019) => Err(TestError::String("CMP failure".into())), + (_, 0x01A) => Err(TestError::String("CMP failure".into())), + (_, 0x01B) => Err(TestError::String("CMP failure".into())), + (_, 0x01C) => Err(TestError::String("CMP failure".into())), + (_, 0x01D) => Err(TestError::String("SBC failure".into())), + (_, 0x01E) => Err(TestError::String("SBC failure".into())), + (_, 0x01F) => Err(TestError::String("SBC failure".into())), + (_, 0x020) => Err(TestError::String("SBC failure".into())), + (_, 0x021) => Err(TestError::String("SBC failure".into())), + (_, 0x022) => Err(TestError::String("LDA failure".into())), + (_, 0x023) => Err(TestError::String("LDA failure".into())), + (_, 0x024) => Err(TestError::String("STA failure".into())), + (_, 0x025) => Err(TestError::String("LSR failure".into())), + (_, 0x026) => Err(TestError::String("LSR failure".into())), + (_, 0x027) => Err(TestError::String("ASL failure".into())), + (_, 0x028) => Err(TestError::String("ASL failure".into())), + (_, 0x029) => Err(TestError::String("ROR failure".into())), + (_, 0x02A) => Err(TestError::String("ROR failure".into())), + (_, 0x02B) => Err(TestError::String("ROL failure".into())), + (_, 0x02C) => Err(TestError::String("ROL failure".into())), + (_, 0x02D) => Err(TestError::String("INC failure".into())), + (_, 0x02E) => Err(TestError::String("INC failure".into())), + (_, 0x02F) => Err(TestError::String("DEC failure".into())), + (_, 0x030) => Err(TestError::String("DEC failure".into())), + (_, 0x031) => Err(TestError::String("DEC failure".into())), + (_, 0x032) => Err(TestError::String("LDX,Y failure".into())), + (_, 0x033) => Err(TestError::String("LDX,Y failure".into())), + (_, 0x034) => Err(TestError::String("STX,Y failure".into())), + (_, 0x035) => Err(TestError::String("STX,Y failure".into())), + + // absolute,y tests + // ---------------- + (_, 0x036) => Err(TestError::String("LDA failure".into())), + (_, 0x037) => Err(TestError::String("LDA failure to wrap properly from ffffh to 0000h".into())), + (_, 0x038) => Err(TestError::String("LDA failure, page cross".into())), + (_, 0x039) => Err(TestError::String("ORA failure".into())), + (_, 0x03A) => Err(TestError::String("ORA failure".into())), + (_, 0x03B) => Err(TestError::String("AND failure".into())), + (_, 0x03C) => Err(TestError::String("AND failure".into())), + (_, 0x03D) => Err(TestError::String("EOR failure".into())), + (_, 0x03E) => Err(TestError::String("EOR failure".into())), + (_, 0x03F) => Err(TestError::String("ADC failure".into())), + (_, 0x040) => Err(TestError::String("ADC failure".into())), + (_, 0x041) => Err(TestError::String("ADC failure".into())), + (_, 0x042) => Err(TestError::String("ADC failure".into())), + (_, 0x043) => Err(TestError::String("ADC failure".into())), + (_, 0x044) => Err(TestError::String("CMP failure".into())), + (_, 0x045) => Err(TestError::String("CMP failure".into())), + (_, 0x046) => Err(TestError::String("CMP failure".into())), + (_, 0x047) => Err(TestError::String("CMP failure".into())), + (_, 0x048) => Err(TestError::String("CMP failure".into())), + (_, 0x049) => Err(TestError::String("CMP failure".into())), + (_, 0x04A) => Err(TestError::String("CMP failure".into())), + (_, 0x04B) => Err(TestError::String("SBC failure".into())), + (_, 0x04C) => Err(TestError::String("SBC failure".into())), + (_, 0x04D) => Err(TestError::String("SBC failure".into())), + (_, 0x04E) => Err(TestError::String("SBC failure".into())), + (_, 0x04F) => Err(TestError::String("SBC failure".into())), + (_, 0x050) => Err(TestError::String("STA failure".into())), + + // absolute,x tests + // ---------------- + (_, 0x051) => Err(TestError::String("LDY,X failure".into())), + (_, 0x052) => Err(TestError::String("LDY,X failure (didn't page cross)".into())), + (_, 0x053) => Err(TestError::String("ORA failure".into())), + (_, 0x054) => Err(TestError::String("ORA failure".into())), + (_, 0x055) => Err(TestError::String("AND failure".into())), + (_, 0x056) => Err(TestError::String("AND failure".into())), + (_, 0x057) => Err(TestError::String("EOR failure".into())), + (_, 0x058) => Err(TestError::String("EOR failure".into())), + (_, 0x059) => Err(TestError::String("ADC failure".into())), + (_, 0x05A) => Err(TestError::String("ADC failure".into())), + (_, 0x05B) => Err(TestError::String("ADC failure".into())), + (_, 0x05C) => Err(TestError::String("ADC failure".into())), + (_, 0x05D) => Err(TestError::String("ADC failure".into())), + (_, 0x05E) => Err(TestError::String("CMP failure".into())), + (_, 0x05F) => Err(TestError::String("CMP failure".into())), + (_, 0x060) => Err(TestError::String("CMP failure".into())), + (_, 0x061) => Err(TestError::String("CMP failure".into())), + (_, 0x062) => Err(TestError::String("CMP failure".into())), + (_, 0x063) => Err(TestError::String("CMP failure".into())), + (_, 0x064) => Err(TestError::String("CMP failure".into())), + (_, 0x065) => Err(TestError::String("SBC failure".into())), + (_, 0x066) => Err(TestError::String("SBC failure".into())), + (_, 0x067) => Err(TestError::String("SBC failure".into())), + (_, 0x068) => Err(TestError::String("SBC failure".into())), + (_, 0x069) => Err(TestError::String("SBC failure".into())), + (_, 0x06A) => Err(TestError::String("LDA failure".into())), + (_, 0x06B) => Err(TestError::String("LDA failure (didn't page cross)".into())), + (_, 0x06C) => Err(TestError::String("STA failure".into())), + (_, 0x06D) => Err(TestError::String("LSR failure".into())), + (_, 0x06E) => Err(TestError::String("LSR failure".into())), + (_, 0x06F) => Err(TestError::String("ASL failure".into())), + (_, 0x070) => Err(TestError::String("ASL failure".into())), + (_, 0x071) => Err(TestError::String("ROR failure".into())), + (_, 0x072) => Err(TestError::String("ROR failure".into())), + (_, 0x073) => Err(TestError::String("ROL failure".into())), + (_, 0x074) => Err(TestError::String("ROL failure".into())), + (_, 0x075) => Err(TestError::String("INC failure".into())), + (_, 0x076) => Err(TestError::String("INC failure".into())), + (_, 0x077) => Err(TestError::String("DEC failure".into())), + (_, 0x078) => Err(TestError::String("DEC failure".into())), + (_, 0x079) => Err(TestError::String("DEC failure".into())), + (_, 0x07A) => Err(TestError::String("LDX,Y failure".into())), + (_, 0x07B) => Err(TestError::String("LDX,Y failure".into())), + + // ------------------------------------ + // + // Invalid opcode tests... all errors are reported in byte 03h unless + // specified. + // + // NOP - "invalid" opcode tests (error byte 02h) + // --------------------------------------------- + (0x04E, _) => Err(TestError::String("absolute,X NOPs less than 3 bytes long".into())), + (0x04F, _) => Err(TestError::String("implied NOPs affects regs/flags".into())), + (0x050, _) => Err(TestError::String("ZP,X NOPs less than 2 bytes long".into())), + (0x051, _) => Err(TestError::String("absolute NOP less than 3 bytes long".into())), + (0x052, _) => Err(TestError::String("ZP NOPs less than 2 bytes long".into())), + (0x053, _) => Err(TestError::String("absolute,X NOPs less than 3 bytes long".into())), + (0x054, _) => Err(TestError::String("implied NOPs affects regs/flags".into())), + (0x055, _) => Err(TestError::String("ZP,X NOPs less than 2 bytes long".into())), + (0x056, _) => Err(TestError::String("absolute NOP less than 3 bytes long".into())), + (0x057, _) => Err(TestError::String("ZP NOPs less than 2 bytes long".into())), + + // LAX - "invalid" opcode tests + // ---------------------------- + (_, 0x07C) => Err(TestError::String("LAX (indr,x) failure".into())), + (_, 0x07D) => Err(TestError::String("LAX (indr,x) failure".into())), + (_, 0x07E) => Err(TestError::String("LAX zeropage failure".into())), + (_, 0x07F) => Err(TestError::String("LAX zeropage failure".into())), + (_, 0x080) => Err(TestError::String("LAX absolute failure".into())), + (_, 0x081) => Err(TestError::String("LAX absolute failure".into())), + (_, 0x082) => Err(TestError::String("LAX (indr),y failure".into())), + (_, 0x083) => Err(TestError::String("LAX (indr),y failure".into())), + (_, 0x084) => Err(TestError::String("LAX zp,y failure".into())), + (_, 0x085) => Err(TestError::String("LAX zp,y failure".into())), + (_, 0x086) => Err(TestError::String("LAX abs,y failure".into())), + (_, 0x087) => Err(TestError::String("LAX abs,y failure".into())), + + // SAX - "invalid" opcode tests + // ---------------------------- + (_, 0x088) => Err(TestError::String("SAX (indr,x) failure".into())), + (_, 0x089) => Err(TestError::String("SAX (indr,x) failure".into())), + (_, 0x08A) => Err(TestError::String("SAX zeropage failure".into())), + (_, 0x08B) => Err(TestError::String("SAX zeropage failure".into())), + (_, 0x08C) => Err(TestError::String("SAX absolute failure".into())), + (_, 0x08D) => Err(TestError::String("SAX absolute failure".into())), + (_, 0x08E) => Err(TestError::String("SAX zp,y failure".into())), + (_, 0x08F) => Err(TestError::String("SAX zp,y failure".into())), + + // SBC - "invalid" opcode test + // --------------------------- + (_, 0x090) => Err(TestError::String("SBC failure".into())), + (_, 0x091) => Err(TestError::String("SBC failure".into())), + (_, 0x092) => Err(TestError::String("SBC failure".into())), + (_, 0x093) => Err(TestError::String("SBC failure".into())), + (_, 0x094) => Err(TestError::String("SBC failure".into())), + + // DCP - "invalid" opcode tests + // ---------------------------- + (_, 0x095) => Err(TestError::String("DCP (indr,x) failure".into())), + (_, 0x096) => Err(TestError::String("DCP (indr,x) failure".into())), + (_, 0x097) => Err(TestError::String("DCP (indr,x) failure".into())), + (_, 0x098) => Err(TestError::String("DCP zeropage failure".into())), + (_, 0x099) => Err(TestError::String("DCP zeropage failure".into())), + (_, 0x09A) => Err(TestError::String("DCP zeropage failure".into())), + (_, 0x09B) => Err(TestError::String("DCP absolute failure".into())), + (_, 0x09C) => Err(TestError::String("DCP absolute failure".into())), + (_, 0x09D) => Err(TestError::String("DCP absolute failure".into())), + (_, 0x09E) => Err(TestError::String("DCP (indr),y failure".into())), + (_, 0x09F) => Err(TestError::String("DCP (indr),y failure".into())), + (_, 0x0A0) => Err(TestError::String("DCP (indr),y failure".into())), + (_, 0x0A1) => Err(TestError::String("DCP zp,x failure".into())), + (_, 0x0A2) => Err(TestError::String("DCP zp,x failure".into())), + (_, 0x0A3) => Err(TestError::String("DCP zp,x failure".into())), + (_, 0x0A4) => Err(TestError::String("DCP abs,y failure".into())), + (_, 0x0A5) => Err(TestError::String("DCP abs,y failure".into())), + (_, 0x0A6) => Err(TestError::String("DCP abs,y failure".into())), + (_, 0x0A7) => Err(TestError::String("DCP abs,x failure".into())), + (_, 0x0A8) => Err(TestError::String("DCP abs,x failure".into())), + (_, 0x0A9) => Err(TestError::String("DCP abs,x failure".into())), + + // ISB - "invalid" opcode tests + // ---------------------------- + (_, 0x0AA) => Err(TestError::String("DCP (indr,x) failure".into())), + (_, 0x0AB) => Err(TestError::String("DCP (indr,x) failure".into())), + (_, 0x0AC) => Err(TestError::String("DCP (indr,x) failure".into())), + (_, 0x0AD) => Err(TestError::String("DCP zeropage failure".into())), + (_, 0x0AE) => Err(TestError::String("DCP zeropage failure".into())), + (_, 0x0AF) => Err(TestError::String("DCP zeropage failure".into())), + (_, 0x0B0) => Err(TestError::String("DCP absolute failure".into())), + (_, 0x0B1) => Err(TestError::String("DCP absolute failure".into())), + (_, 0x0B2) => Err(TestError::String("DCP absolute failure".into())), + (_, 0x0B3) => Err(TestError::String("DCP (indr),y failure".into())), + (_, 0x0B4) => Err(TestError::String("DCP (indr),y failure".into())), + (_, 0x0B5) => Err(TestError::String("DCP (indr),y failure".into())), + (_, 0x0B6) => Err(TestError::String("DCP zp,x failure".into())), + (_, 0x0B7) => Err(TestError::String("DCP zp,x failure".into())), + (_, 0x0B8) => Err(TestError::String("DCP zp,x failure".into())), + (_, 0x0B9) => Err(TestError::String("DCP abs,y failure".into())), + (_, 0x0BA) => Err(TestError::String("DCP abs,y failure".into())), + (_, 0x0BB) => Err(TestError::String("DCP abs,y failure".into())), + (_, 0x0BC) => Err(TestError::String("DCP abs,x failure".into())), + (_, 0x0BD) => Err(TestError::String("DCP abs,x failure".into())), + (_, 0x0BE) => Err(TestError::String("DCP abs,x failure".into())), + + // SLO - "invalid" opcode tests + // ---------------------------- + (_, 0x0BF) => Err(TestError::String("SLO (indr,x) failure".into())), + (_, 0x0C0) => Err(TestError::String("SLO (indr,x) failure".into())), + (_, 0x0C1) => Err(TestError::String("SLO (indr,x) failure".into())), + (_, 0x0C2) => Err(TestError::String("SLO zeropage failure".into())), + (_, 0x0C3) => Err(TestError::String("SLO zeropage failure".into())), + (_, 0x0C4) => Err(TestError::String("SLO zeropage failure".into())), + (_, 0x0C5) => Err(TestError::String("SLO absolute failure".into())), + (_, 0x0C6) => Err(TestError::String("SLO absolute failure".into())), + (_, 0x0C7) => Err(TestError::String("SLO absolute failure".into())), + (_, 0x0C8) => Err(TestError::String("SLO (indr),y failure".into())), + (_, 0x0C9) => Err(TestError::String("SLO (indr),y failure".into())), + (_, 0x0CA) => Err(TestError::String("SLO (indr),y failure".into())), + (_, 0x0CB) => Err(TestError::String("SLO zp,x failure".into())), + (_, 0x0CC) => Err(TestError::String("SLO zp,x failure".into())), + (_, 0x0CD) => Err(TestError::String("SLO zp,x failure".into())), + (_, 0x0CE) => Err(TestError::String("SLO abs,y failure".into())), + (_, 0x0CF) => Err(TestError::String("SLO abs,y failure".into())), + (_, 0x0D0) => Err(TestError::String("SLO abs,y failure".into())), + (_, 0x0D1) => Err(TestError::String("SLO abs,x failure".into())), + (_, 0x0D2) => Err(TestError::String("SLO abs,x failure".into())), + (_, 0x0D3) => Err(TestError::String("SLO abs,x failure".into())), + + // RLA - "invalid" opcode tests + // ---------------------------- + (_, 0x0D4) => Err(TestError::String("RLA (indr,x) failure".into())), + (_, 0x0D5) => Err(TestError::String("RLA (indr,x) failure".into())), + (_, 0x0D6) => Err(TestError::String("RLA (indr,x) failure".into())), + (_, 0x0D7) => Err(TestError::String("RLA zeropage failure".into())), + (_, 0x0D8) => Err(TestError::String("RLA zeropage failure".into())), + (_, 0x0D9) => Err(TestError::String("RLA zeropage failure".into())), + (_, 0x0DA) => Err(TestError::String("RLA absolute failure".into())), + (_, 0x0DB) => Err(TestError::String("RLA absolute failure".into())), + (_, 0x0DC) => Err(TestError::String("RLA absolute failure".into())), + (_, 0x0DD) => Err(TestError::String("RLA (indr),y failure".into())), + (_, 0x0DE) => Err(TestError::String("RLA (indr),y failure".into())), + (_, 0x0DF) => Err(TestError::String("RLA (indr),y failure".into())), + (_, 0x0E0) => Err(TestError::String("RLA zp,x failure".into())), + (_, 0x0E1) => Err(TestError::String("RLA zp,x failure".into())), + (_, 0x0E2) => Err(TestError::String("RLA zp,x failure".into())), + (_, 0x0E3) => Err(TestError::String("RLA abs,y failure".into())), + (_, 0x0E4) => Err(TestError::String("RLA abs,y failure".into())), + (_, 0x0E5) => Err(TestError::String("RLA abs,y failure".into())), + (_, 0x0E6) => Err(TestError::String("RLA abs,x failure".into())), + (_, 0x0E7) => Err(TestError::String("RLA abs,x failure".into())), + (_, 0x0E8) => Err(TestError::String("RLA abs,x failure".into())), + + // SRE - "invalid" opcode tests + // ---------------------------- + (_, 0x0E9) => Err(TestError::String("SRE (indr,x) failure".into())), + (_, 0x0EA) => Err(TestError::String("SRE (indr,x) failure".into())), + (_, 0x0EB) => Err(TestError::String("SRE (indr,x) failure".into())), + (_, 0x0EC) => Err(TestError::String("SRE zeropage failure".into())), + (_, 0x0ED) => Err(TestError::String("SRE zeropage failure".into())), + (_, 0x0EE) => Err(TestError::String("SRE zeropage failure".into())), + (_, 0x0EF) => Err(TestError::String("SRE absolute failure".into())), + (_, 0x0F0) => Err(TestError::String("SRE absolute failure".into())), + (_, 0x0F1) => Err(TestError::String("SRE absolute failure".into())), + (_, 0x0F2) => Err(TestError::String("SRE (indr),y failure".into())), + (_, 0x0F3) => Err(TestError::String("SRE (indr),y failure".into())), + (_, 0x0F4) => Err(TestError::String("SRE (indr),y failure".into())), + (_, 0x0F5) => Err(TestError::String("SRE zp,x failure".into())), + (_, 0x0F6) => Err(TestError::String("SRE zp,x failure".into())), + (_, 0x0F7) => Err(TestError::String("SRE zp,x failure".into())), + (_, 0x0F8) => Err(TestError::String("SRE abs,y failure".into())), + (_, 0x0F9) => Err(TestError::String("SRE abs,y failure".into())), + (_, 0x0FA) => Err(TestError::String("SRE abs,y failure".into())), + (_, 0x0FB) => Err(TestError::String("SRE abs,x failure".into())), + (_, 0x0FC) => Err(TestError::String("SRE abs,x failure".into())), + (_, 0x0FD) => Err(TestError::String("SRE abs,x failure".into())), + + + // RRA - "invalid" opcode tests + // ---------------------------- + // duplicates? + // (_, 0x001) => Err(TestError::String("RRA (indr,x) failure".into())), + // (_, 0x002) => Err(TestError::String("RRA (indr,x) failure".into())), + // (_, 0x003) => Err(TestError::String("RRA (indr,x) failure".into())), + // (_, 0x004) => Err(TestError::String("RRA zeropage failure".into())), + // (_, 0x005) => Err(TestError::String("RRA zeropage failure".into())), + // (_, 0x006) => Err(TestError::String("RRA zeropage failure".into())), + // (_, 0x007) => Err(TestError::String("RRA absolute failure".into())), + // (_, 0x008) => Err(TestError::String("RRA absolute failure".into())), + // (_, 0x009) => Err(TestError::String("RRA absolute failure".into())), + // (_, 0x00A) => Err(TestError::String("RRA (indr),y failure".into())), + // (_, 0x00B) => Err(TestError::String("RRA (indr),y failure".into())), + // (_, 0x00C) => Err(TestError::String("RRA (indr),y failure".into())), + // (_, 0x00D) => Err(TestError::String("RRA zp,x failure".into())), + // (_, 0x00E) => Err(TestError::String("RRA zp,x failure".into())), + // (_, 0x00F) => Err(TestError::String("RRA zp,x failure".into())), + // (_, 0x010) => Err(TestError::String("RRA abs,y failure".into())), + // (_, 0x011) => Err(TestError::String("RRA abs,y failure".into())), + // (_, 0x012) => Err(TestError::String("RRA abs,y failure".into())), + // (_, 0x013) => Err(TestError::String("RRA abs,x failure".into())), + // (_, 0x014) => Err(TestError::String("RRA abs,x failure".into())), + // (_, 0x015) => Err(TestError::String("RRA abs,x failure".into())), + + (_, _) => Err(TestError::String("unknown failure".into())), + } + } + } + }); + + process_handle("nestest", handle) +} + +enum TestError { + Custom(Box<dyn Error + Send>), + String(String), +} + +fn process_handle(name: &str, handle: JoinHandle<Result<(), TestError>>) -> Result<(), String> { + match handle.join() { // <- waits for the thread to complete or panic + Ok(Ok(_)) => { + Ok(()) + }, + Ok(Err(e)) => match e { + TestError::Custom(e) => { + Err(format!("cpu failed while running test {name} with custom error message {e}")) + } + TestError::String(e) => { + Err(format!("cpu didn't pass test {name}: {e}")) + } + } + Err(e) => { + let err_msg = match (e.downcast_ref::<&str>(), e.downcast_ref::<String>()) { + (Some(&s), _) => s, + (_, Some(s)) => s, + (None, None) => "<No panic info>", + }; + + Err(format!("cpu implementation panicked while running test {name}: {err_msg}")) + }, + } +} diff --git a/src/roms/all_instrs.nes b/src/roms/all_instrs.nes new file mode 100644 index 0000000000000000000000000000000000000000..d5a1b83c9fdd4bf34418ce20aee5bc36f8767fc0 Binary files /dev/null and b/src/roms/all_instrs.nes differ diff --git a/src/roms/nestest.nes b/src/roms/nestest.nes new file mode 100644 index 0000000000000000000000000000000000000000..fc2a88c36db9c5c2de9cca33be0e446e12007f17 Binary files /dev/null and b/src/roms/nestest.nes differ diff --git a/src/roms/official_only.nes b/src/roms/official_only.nes new file mode 100644 index 0000000000000000000000000000000000000000..c92240a116f4f29f258a0f917c704ceb6cbe5ed5 Binary files /dev/null and b/src/roms/official_only.nes differ