Inital Commit
This commit is contained in:
commit
fb9f811160
|
@ -0,0 +1,522 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538"
|
||||
|
||||
[[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 = "console_error_panic_hook"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "emulator"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"console_error_panic_hook",
|
||||
"lazy_static",
|
||||
"log",
|
||||
"once_cell",
|
||||
"wasm-bindgen",
|
||||
"wasm-bindgen-test",
|
||||
"wasm-timer",
|
||||
"wee_alloc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca"
|
||||
dependencies = [
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-executor",
|
||||
"futures-io",
|
||||
"futures-sink",
|
||||
"futures-task",
|
||||
"futures-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-channel"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-core"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d"
|
||||
|
||||
[[package]]
|
||||
name = "futures-executor"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-task",
|
||||
"futures-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-io"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377"
|
||||
|
||||
[[package]]
|
||||
name = "futures-macro"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"proc-macro-hack",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-sink"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11"
|
||||
|
||||
[[package]]
|
||||
name = "futures-task"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99"
|
||||
|
||||
[[package]]
|
||||
name = "futures-util"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-io",
|
||||
"futures-macro",
|
||||
"futures-sink",
|
||||
"futures-task",
|
||||
"memchr",
|
||||
"pin-project-lite",
|
||||
"pin-utils",
|
||||
"proc-macro-hack",
|
||||
"proc-macro-nested",
|
||||
"slab",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "instant"
|
||||
version = "0.1.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "716d3d89f35ac6a34fd0eed635395f4c3b76fa889338a4632e5231a8684216bd"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
]
|
||||
|
||||
[[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 = "lazy_static"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.99"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a7f823d141fe0a24df1e23b4af4e3c7ba9e5966ec514ea068c93024aa7deb765"
|
||||
|
||||
[[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 = "memchr"
|
||||
version = "2.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
|
||||
|
||||
[[package]]
|
||||
name = "memory_units"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3"
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56"
|
||||
|
||||
[[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 = "pin-project-lite"
|
||||
version = "0.2.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443"
|
||||
|
||||
[[package]]
|
||||
name = "pin-utils"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-hack"
|
||||
version = "0.5.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-nested"
|
||||
version = "0.1.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.29"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.2.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[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 = "sdl2"
|
||||
version = "0.34.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "deecbc3fa9460acff5a1e563e05cb5f31bba0aa0c214bb49a43db8159176d54b"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"lazy_static",
|
||||
"libc",
|
||||
"sdl2-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sdl2-sys"
|
||||
version = "0.34.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41a29aa21f175b5a41a6e26da572d5e5d1ee5660d35f9f9d0913e8a802098f74"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"libc",
|
||||
"version-compare",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "slab"
|
||||
version = "0.4.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309"
|
||||
|
||||
[[package]]
|
||||
name = "space-invaders"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"emulator",
|
||||
"lazy_static",
|
||||
"once_cell",
|
||||
"sdl2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.76"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
|
||||
|
||||
[[package]]
|
||||
name = "version-compare"
|
||||
version = "0.0.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1"
|
||||
|
||||
[[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 = "wasm-bindgen-test"
|
||||
version = "0.3.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "96f1aa7971fdf61ef0f353602102dbea75a56e225ed036c1e3740564b91e6b7e"
|
||||
dependencies = [
|
||||
"console_error_panic_hook",
|
||||
"js-sys",
|
||||
"scoped-tls",
|
||||
"wasm-bindgen",
|
||||
"wasm-bindgen-futures",
|
||||
"wasm-bindgen-test-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-test-macro"
|
||||
version = "0.3.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6006f79628dfeb96a86d4db51fbf1344cd7fd8408f06fc9aa3c84913a4789688"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-timer"
|
||||
version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f"
|
||||
dependencies = [
|
||||
"futures",
|
||||
"js-sys",
|
||||
"parking_lot",
|
||||
"pin-utils",
|
||||
"wasm-bindgen",
|
||||
"wasm-bindgen-futures",
|
||||
"web-sys",
|
||||
]
|
||||
|
||||
[[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 = "wee_alloc"
|
||||
version = "0.4.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dbb3b5a6b2bb17cb6ad44a2e68a43e8d2722c997da10e928665c72ec6c0a0b8e"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"libc",
|
||||
"memory_units",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[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-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
|
@ -0,0 +1,16 @@
|
|||
[package]
|
||||
name = "space-invaders"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[workspace]
|
||||
members = [ "emulator"]
|
||||
|
||||
[dependencies]
|
||||
once_cell = "1.8.0"
|
||||
lazy_static = "1.4.0"
|
||||
sdl2 = "0.34.5"
|
||||
emulator = { path = "emulator" }
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
# space-invade.rs: Biterrfied edition
|
||||
## I resized cells and changed colors.
|
||||
![Screenshot](screenshot.png)
|
||||
[Original source code](https://github.com/cbeust/space-invade.rs)
|
|
@ -0,0 +1,33 @@
|
|||
[package]
|
||||
name = "emulator"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
once_cell = "1.8.0"
|
||||
lazy_static = "1.4.0"
|
||||
log = "0.4"
|
||||
wasm-bindgen = "0.2.63"
|
||||
wasm-timer = "0.2.5"
|
||||
|
||||
# The `console_error_panic_hook` crate provides better debugging of panics by
|
||||
# logging them with `console.error`. This is great for development, but requires
|
||||
# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for
|
||||
# code size when deploying.
|
||||
console_error_panic_hook = { version = "0.1.6", optional = true }
|
||||
|
||||
# `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size
|
||||
# compared to the default allocator's ~10K. It is slower than the default
|
||||
# allocator, however.
|
||||
#
|
||||
# Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now.
|
||||
wee_alloc = { version = "0.4.5", optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
wasm-bindgen-test = "0.3.13"
|
||||
|
||||
[profile.release]
|
||||
# Tell `rustc` to optimize for small code size.
|
||||
opt-level = "s"
|
|
@ -0,0 +1,811 @@
|
|||
;***********************************************************************
|
||||
; MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC VERSION 1.0 (C) 1980
|
||||
;***********************************************************************
|
||||
;
|
||||
;DONATED TO THE "SIG/M" CP/M USER'S GROUP BY:
|
||||
;KELLY SMITH, MICROCOSM ASSOCIATES
|
||||
;3055 WACO AVENUE
|
||||
;SIMI VALLEY, CALIFORNIA, 93065
|
||||
;(805) 527-9321 (MODEM, CP/M-NET (TM))
|
||||
;(805) 527-0518 (VERBAL)
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
|
||||
ORG 00100H
|
||||
;
|
||||
;
|
||||
;
|
||||
JMP CPU ;JUMP TO 8080 CPU DIAGNOSTIC
|
||||
;
|
||||
;
|
||||
;
|
||||
DB 'MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC'
|
||||
DB ' VERSION 1.0 (C) 1980'
|
||||
;
|
||||
;
|
||||
;
|
||||
BDOS EQU 00005H ;BDOS ENTRY TO CP/M
|
||||
WBOOT EQU 00000H ;RE-ENTRY TO CP/M WARM BOOT
|
||||
;
|
||||
;
|
||||
;
|
||||
;MESSAGE OUTPUT ROUTINE
|
||||
;
|
||||
MSG: PUSH D ;EXILE D REG.
|
||||
XCHG ;SWAP H&L REGS. TO D&E REGS.
|
||||
MVI C,9 ;LET BDOS KNOW WE WANT TO SEND A MESSAGE
|
||||
CALL BDOS
|
||||
POP D ;BACK FROM EXILE
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
;CHARACTER OUTPUT ROUTINE
|
||||
;
|
||||
PCHAR: MVI C,2
|
||||
CALL BDOS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
BYTEO: PUSH PSW
|
||||
CALL BYTO1
|
||||
MOV E,A
|
||||
CALL PCHAR
|
||||
POP PSW
|
||||
CALL BYTO2
|
||||
MOV E,A
|
||||
JMP PCHAR
|
||||
BYTO1: RRC
|
||||
RRC
|
||||
RRC
|
||||
RRC
|
||||
BYTO2: ANI 0FH
|
||||
CPI 0AH
|
||||
JM BYTO3
|
||||
ADI 7
|
||||
BYTO3: ADI 30H
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
;************************************************************
|
||||
; MESSAGE TABLE FOR OPERATIONAL CPU TEST
|
||||
;************************************************************
|
||||
;
|
||||
OKCPU: DB 0CH,0DH,0AH,' CPU IS OPERATIONAL$'
|
||||
;
|
||||
NGCPU: DB 0CH,0DH,0AH,' CPU HAS FAILED! ERROR EXIT=$'
|
||||
;
|
||||
;
|
||||
;
|
||||
;************************************************************
|
||||
; 8080/8085 CPU TEST/DIAGNOSTIC
|
||||
;************************************************************
|
||||
;
|
||||
;NOTE: (1) PROGRAM ASSUMES "CALL",AND "LXI SP" INSTRUCTIONS WORK!
|
||||
;
|
||||
; (2) INSTRUCTIONS NOT TESTED ARE "HLT","DI","EI","RIM","SIM",
|
||||
; AND "RST 0" THRU "RST 7"
|
||||
;
|
||||
;
|
||||
;
|
||||
;TEST JUMP INSTRUCTIONS AND FLAGS
|
||||
;
|
||||
CPU: LXI SP,STACK ;SET THE STACK POINTER
|
||||
ANI 0 ;INITIALIZE A REG. AND CLEAR ALL FLAGS
|
||||
JZ J010 ;TEST "JZ"
|
||||
CALL CPUER
|
||||
J010: JNC J020 ;TEST "JNC"
|
||||
CALL CPUER
|
||||
J020: JPE J030 ;TEST "JPE"
|
||||
CALL CPUER
|
||||
J030: JP J040 ;TEST "JP"
|
||||
CALL CPUER
|
||||
J040: JNZ J050 ;TEST "JNZ"
|
||||
JC J050 ;TEST "JC"
|
||||
JPO J050 ;TEST "JPO"
|
||||
JM J050 ;TEST "JM"
|
||||
JMP J060 ;TEST "JMP" (IT'S A LITTLE LATE,BUT WHAT THE HELL!
|
||||
J050: CALL CPUER
|
||||
J060: ADI 6 ;A=6,C=0,P=1,S=0,Z=0
|
||||
JNZ J070 ;TEST "JNZ"
|
||||
CALL CPUER
|
||||
J070: JC J080 ;TEST "JC"
|
||||
JPO J080 ;TEST "JPO"
|
||||
JP J090 ;TEST "JP"
|
||||
J080: CALL CPUER
|
||||
J090: ADI 070H ;A=76H,C=0,P=0,S=0,Z=0
|
||||
JPO J100 ;TEST "JPO"
|
||||
CALL CPUER
|
||||
J100: JM J110 ;TEST "JM"
|
||||
JZ J110 ;TEST "JZ"
|
||||
JNC J120 ;TEST "JNC"
|
||||
J110: CALL CPUER
|
||||
J120: ADI 081H ;A=F7H,C=0,P=0,S=1,Z=0
|
||||
JM J130 ;TEST "JM"
|
||||
CALL CPUER
|
||||
J130: JZ J140 ;TEST "JZ"
|
||||
JC J140 ;TEST "JC"
|
||||
JPO J150 ;TEST "JPO"
|
||||
J140: CALL CPUER
|
||||
J150: ADI 0FEH ;A=F5H,C=1,P=1,S=1,Z=0
|
||||
JC J160 ;TEST "JC"
|
||||
CALL CPUER
|
||||
J160: JZ J170 ;TEST "JZ"
|
||||
JPO J170 ;TEST "JPO"
|
||||
JM AIMM ;TEST "JM"
|
||||
J170: CALL CPUER
|
||||
;
|
||||
;
|
||||
;
|
||||
;TEST ACCUMULATOR IMMEDIATE INSTRUCTIONS
|
||||
;
|
||||
AIMM: CPI 0 ;A=F5H,C=0,Z=0
|
||||
JC CPIE ;TEST "CPI" FOR RE-SET CARRY
|
||||
JZ CPIE ;TEST "CPI" FOR RE-SET ZERO
|
||||
CPI 0F5H ;A=F5H,C=0,Z=1
|
||||
JC CPIE ;TEST "CPI" FOR RE-SET CARRY ("ADI")
|
||||
JNZ CPIE ;TEST "CPI" FOR RE-SET ZERO
|
||||
CPI 0FFH ;A=F5H,C=1,Z=0
|
||||
JZ CPIE ;TEST "CPI" FOR RE-SET ZERO
|
||||
JC ACII ;TEST "CPI" FOR SET CARRY
|
||||
CPIE: CALL CPUER
|
||||
ACII: ACI 00AH ;A=F5H+0AH+CARRY(1)=0,C=1
|
||||
ACI 00AH ;A=0+0AH+CARRY(0)=0BH,C=0
|
||||
CPI 00BH
|
||||
JZ SUII ;TEST "ACI"
|
||||
CALL CPUER
|
||||
SUII: SUI 00CH ;A=FFH,C=0
|
||||
SUI 00FH ;A=F0H,C=1
|
||||
CPI 0F0H
|
||||
JZ SBII ;TEST "SUI"
|
||||
CALL CPUER
|
||||
SBII: SBI 0F1H ;A=F0H-0F1H-CARRY(0)=FFH,C=1
|
||||
SBI 00EH ;A=FFH-OEH-CARRY(1)=F0H,C=0
|
||||
CPI 0F0H
|
||||
JZ ANII ;TEST "SBI"
|
||||
CALL CPUER
|
||||
ANII: ANI 055H ;A=F0H<AND>55H=50H,C=0,P=1,S=0,Z=0
|
||||
CPI 050H
|
||||
JZ ORII ;TEST "ANI"
|
||||
CALL CPUER
|
||||
ORII: ORI 03AH ;A=50H<OR>3AH=7AH,C=0,P=0,S=0,Z=0
|
||||
CPI 07AH
|
||||
JZ XRII ;TEST "ORI"
|
||||
CALL CPUER
|
||||
XRII: XRI 00FH ;A=7AH<XOR>0FH=75H,C=0,P=0,S=0,Z=0
|
||||
CPI 075H
|
||||
JZ C010 ;TEST "XRI"
|
||||
CALL CPUER
|
||||
;
|
||||
;
|
||||
;
|
||||
;TEST CALLS AND RETURNS
|
||||
;
|
||||
C010: ANI 000H ;A=0,C=0,P=1,S=0,Z=1
|
||||
CC CPUER ;TEST "CC"
|
||||
CPO CPUER ;TEST "CPO"
|
||||
CM CPUER ;TEST "CM"
|
||||
CNZ CPUER ;TEST "CNZ"
|
||||
CPI 000H
|
||||
JZ C020 ;A=0,C=0,P=0,S=0,Z=1
|
||||
CALL CPUER
|
||||
C020: SUI 077H ;A=89H,C=1,P=0,S=1,Z=0
|
||||
CNC CPUER ;TEST "CNC"
|
||||
CPE CPUER ;TEST "CPE"
|
||||
CP CPUER ;TEST "CP"
|
||||
CZ CPUER ;TEST "CZ"
|
||||
CPI 089H
|
||||
JZ C030 ;TEST FOR "CALLS" TAKING BRANCH
|
||||
CALL CPUER
|
||||
C030: ANI 0FFH ;SET FLAGS BACK!
|
||||
CPO CPOI ;TEST "CPO"
|
||||
CPI 0D9H
|
||||
JZ MOVI ;TEST "CALL" SEQUENCE SUCCESS
|
||||
CALL CPUER
|
||||
CPOI: RPE ;TEST "RPE"
|
||||
ADI 010H ;A=99H,C=0,P=0,S=1,Z=0
|
||||
CPE CPEI ;TEST "CPE"
|
||||
ADI 002H ;A=D9H,C=0,P=0,S=1,Z=0
|
||||
RPO ;TEST "RPO"
|
||||
CALL CPUER
|
||||
CPEI: RPO ;TEST "RPO"
|
||||
ADI 020H ;A=B9H,C=0,P=0,S=1,Z=0
|
||||
CM CMI ;TEST "CM"
|
||||
ADI 004H ;A=D7H,C=0,P=1,S=1,Z=0
|
||||
RPE ;TEST "RPE"
|
||||
CALL CPUER
|
||||
CMI: RP ;TEST "RP"
|
||||
ADI 080H ;A=39H,C=1,P=1,S=0,Z=0
|
||||
CP TCPI ;TEST "CP"
|
||||
ADI 080H ;A=D3H,C=0,P=0,S=1,Z=0
|
||||
RM ;TEST "RM"
|
||||
CALL CPUER
|
||||
TCPI: RM ;TEST "RM"
|
||||
ADI 040H ;A=79H,C=0,P=0,S=0,Z=0
|
||||
CNC CNCI ;TEST "CNC"
|
||||
ADI 040H ;A=53H,C=0,P=1,S=0,Z=0
|
||||
RP ;TEST "RP"
|
||||
CALL CPUER
|
||||
CNCI: RC ;TEST "RC"
|
||||
ADI 08FH ;A=08H,C=1,P=0,S=0,Z=0
|
||||
CC CCI ;TEST "CC"
|
||||
SUI 002H ;A=13H,C=0,P=0,S=0,Z=0
|
||||
RNC ;TEST "RNC"
|
||||
CALL CPUER
|
||||
CCI: RNC ;TEST "RNC"
|
||||
ADI 0F7H ;A=FFH,C=0,P=1,S=1,Z=0
|
||||
CNZ CNZI ;TEST "CNZ"
|
||||
ADI 0FEH ;A=15H,C=1,P=0,S=0,Z=0
|
||||
RC ;TEST "RC"
|
||||
CALL CPUER
|
||||
CNZI: RZ ;TEST "RZ"
|
||||
ADI 001H ;A=00H,C=1,P=1,S=0,Z=1
|
||||
CZ CZI ;TEST "CZ"
|
||||
ADI 0D0H ;A=17H,C=1,P=1,S=0,Z=0
|
||||
RNZ ;TEST "RNZ"
|
||||
CALL CPUER
|
||||
CZI: RNZ ;TEST "RNZ"
|
||||
ADI 047H ;A=47H,C=0,P=1,S=0,Z=0
|
||||
CPI 047H ;A=47H,C=0,P=1,S=0,Z=1
|
||||
RZ ;TEST "RZ"
|
||||
CALL CPUER
|
||||
;
|
||||
;
|
||||
;
|
||||
;TEST "MOV","INR",AND "DCR" INSTRUCTIONS
|
||||
;
|
||||
MOVI: MVI A,077H
|
||||
INR A
|
||||
MOV B,A
|
||||
INR B
|
||||
MOV C,B
|
||||
DCR C
|
||||
MOV D,C
|
||||
MOV E,D
|
||||
MOV H,E
|
||||
MOV L,H
|
||||
MOV A,L ;TEST "MOV" A,L,H,E,D,C,B,A
|
||||
DCR A
|
||||
MOV C,A
|
||||
MOV E,C
|
||||
MOV L,E
|
||||
MOV B,L
|
||||
MOV D,B
|
||||
MOV H,D
|
||||
MOV A,H ;TEST "MOV" A,H,D,B,L,E,C,A
|
||||
MOV D,A
|
||||
INR D
|
||||
MOV L,D
|
||||
MOV C,L
|
||||
INR C
|
||||
MOV H,C
|
||||
MOV B,H
|
||||
DCR B
|
||||
MOV E,B
|
||||
MOV A,E ;TEST "MOV" A,E,B,H,C,L,D,A
|
||||
MOV E,A
|
||||
INR E
|
||||
MOV B,E
|
||||
MOV H,B
|
||||
INR H
|
||||
MOV C,H
|
||||
MOV L,C
|
||||
MOV D,L
|
||||
DCR D
|
||||
MOV A,D ;TEST "MOV" A,D,L,C,H,B,E,A
|
||||
MOV H,A
|
||||
DCR H
|
||||
MOV D,H
|
||||
MOV B,D
|
||||
MOV L,B
|
||||
INR L
|
||||
MOV E,L
|
||||
DCR E
|
||||
MOV C,E
|
||||
MOV A,C ;TEST "MOV" A,C,E,L,B,D,H,A
|
||||
MOV L,A
|
||||
DCR L
|
||||
MOV H,L
|
||||
MOV E,H
|
||||
MOV D,E
|
||||
MOV C,D
|
||||
MOV B,C
|
||||
MOV A,B
|
||||
CPI 077H
|
||||
CNZ CPUER ;TEST "MOV" A,B,C,D,E,H,L,A
|
||||
;
|
||||
;
|
||||
;
|
||||
;TEST ARITHMETIC AND LOGIC INSTRUCTIONS
|
||||
;
|
||||
XRA A
|
||||
MVI B,001H
|
||||
MVI C,003H
|
||||
MVI D,007H
|
||||
MVI E,00FH
|
||||
MVI H,01FH
|
||||
MVI L,03FH
|
||||
ADD B
|
||||
ADD C
|
||||
ADD D
|
||||
ADD E
|
||||
ADD H
|
||||
ADD L
|
||||
ADD A
|
||||
CPI 0F0H
|
||||
CNZ CPUER ;TEST "ADD" B,C,D,E,H,L,A
|
||||
SUB B
|
||||
SUB C
|
||||
SUB D
|
||||
SUB E
|
||||
SUB H
|
||||
SUB L
|
||||
CPI 078H
|
||||
CNZ CPUER ;TEST "SUB" B,C,D,E,H,L
|
||||
SUB A
|
||||
CNZ CPUER ;TEST "SUB" A
|
||||
MVI A,080H
|
||||
ADD A
|
||||
MVI B,001H
|
||||
MVI C,002H
|
||||
MVI D,003H
|
||||
MVI E,004H
|
||||
MVI H,005H
|
||||
MVI L,006H
|
||||
ADC B
|
||||
MVI B,080H
|
||||
ADD B
|
||||
ADD B
|
||||
ADC C
|
||||
ADD B
|
||||
ADD B
|
||||
ADC D
|
||||
ADD B
|
||||
ADD B
|
||||
ADC E
|
||||
ADD B
|
||||
ADD B
|
||||
ADC H
|
||||
ADD B
|
||||
ADD B
|
||||
ADC L
|
||||
ADD B
|
||||
ADD B
|
||||
ADC A
|
||||
CPI 037H
|
||||
CNZ CPUER ;TEST "ADC" B,C,D,E,H,L,A
|
||||
MVI A,080H
|
||||
ADD A
|
||||
MVI B,001H
|
||||
SBB B
|
||||
MVI B,0FFH
|
||||
ADD B
|
||||
SBB C
|
||||
ADD B
|
||||
SBB D
|
||||
ADD B
|
||||
SBB E
|
||||
ADD B
|
||||
SBB H
|
||||
ADD B
|
||||
SBB L
|
||||
CPI 0E0H
|
||||
CNZ CPUER ;TEST "SBB" B,C,D,E,H,L
|
||||
MVI A,080H
|
||||
ADD A
|
||||
SBB A
|
||||
CPI 0FFH
|
||||
CNZ CPUER ;TEST "SBB" A
|
||||
MVI A,0FFH
|
||||
MVI B,0FEH
|
||||
MVI C,0FCH
|
||||
MVI D,0EFH
|
||||
MVI E,07FH
|
||||
MVI H,0F4H
|
||||
MVI L,0BFH
|
||||
ANA A
|
||||
ANA C
|
||||
ANA D
|
||||
ANA E
|
||||
ANA H
|
||||
ANA L
|
||||
ANA A
|
||||
CPI 024H
|
||||
CNZ CPUER ;TEST "ANA" B,C,D,E,H,L,A
|
||||
XRA A
|
||||
MVI B,001H
|
||||
MVI C,002H
|
||||
MVI D,004H
|
||||
MVI E,008H
|
||||
MVI H,010H
|
||||
MVI L,020H
|
||||
ORA B
|
||||
ORA C
|
||||
ORA D
|
||||
ORA E
|
||||
ORA H
|
||||
ORA L
|
||||
ORA A
|
||||
CPI 03FH
|
||||
CNZ CPUER ;TEST "ORA" B,C,D,E,H,L,A
|
||||
MVI A,000H
|
||||
MVI H,08FH
|
||||
MVI L,04FH
|
||||
XRA B
|
||||
XRA C
|
||||
XRA D
|
||||
XRA E
|
||||
XRA H
|
||||
XRA L
|
||||
CPI 0CFH
|
||||
CNZ CPUER ;TEST "XRA" B,C,D,E,H,L
|
||||
XRA A
|
||||
CNZ CPUER ;TEST "XRA" A
|
||||
MVI B,044H
|
||||
MVI C,045H
|
||||
MVI D,046H
|
||||
MVI E,047H
|
||||
MVI H,(TEMP0 / 0FFH) ;HIGH BYTE OF TEST MEMORY LOCATION
|
||||
MVI L,(TEMP0 AND 0FFH) ;LOW BYTE OF TEST MEMORY LOCATION
|
||||
MOV M,B
|
||||
MVI B,000H
|
||||
MOV B,M
|
||||
MVI A,044H
|
||||
CMP B
|
||||
CNZ CPUER ;TEST "MOV" M,B AND B,M
|
||||
MOV M,D
|
||||
MVI D,000H
|
||||
MOV D,M
|
||||
MVI A,046H
|
||||
CMP D
|
||||
CNZ CPUER ;TEST "MOV" M,D AND D,M
|
||||
MOV M,E
|
||||
MVI E,000H
|
||||
MOV E,M
|
||||
MVI A,047H
|
||||
CMP E
|
||||
CNZ CPUER ;TEST "MOV" M,E AND E,M
|
||||
MOV M,H
|
||||
MVI H,(TEMP0 / 0FFH)
|
||||
MVI L,(TEMP0 AND 0FFH)
|
||||
MOV H,M
|
||||
MVI A,(TEMP0 / 0FFH)
|
||||
CMP H
|
||||
CNZ CPUER ;TEST "MOV" M,H AND H,M
|
||||
MOV M,L
|
||||
MVI H,(TEMP0 / 0FFH)
|
||||
MVI L,(TEMP0 AND 0FFH)
|
||||
MOV L,M
|
||||
MVI A,(TEMP0 AND 0FFH)
|
||||
CMP L
|
||||
CNZ CPUER ;TEST "MOV" M,L AND L,M
|
||||
MVI H,(TEMP0 / 0FFH)
|
||||
MVI L,(TEMP0 AND 0FFH)
|
||||
MVI A,032H
|
||||
MOV M,A
|
||||
CMP M
|
||||
CNZ CPUER ;TEST "MOV" M,A
|
||||
ADD M
|
||||
CPI 064H
|
||||
CNZ CPUER ;TEST "ADD" M
|
||||
XRA A
|
||||
MOV A,M
|
||||
CPI 032H
|
||||
CNZ CPUER ;TEST "MOV" A,M
|
||||
MVI H,(TEMP0 / 0FFH)
|
||||
MVI L,(TEMP0 AND 0FFH)
|
||||
MOV A,M
|
||||
SUB M
|
||||
CNZ CPUER ;TEST "SUB" M
|
||||
MVI A,080H
|
||||
ADD A
|
||||
ADC M
|
||||
CPI 033H
|
||||
CNZ CPUER ;TEST "ADC" M
|
||||
MVI A,080H
|
||||
ADD A
|
||||
SBB M
|
||||
CPI 0CDH
|
||||
CNZ CPUER ;TEST "SBB" M
|
||||
ANA M
|
||||
CNZ CPUER ;TEST "ANA" M
|
||||
MVI A,025H
|
||||
ORA M
|
||||
CPI 037H
|
||||
CNZ CPUER ;TEST "ORA" M
|
||||
XRA M
|
||||
CPI 005H
|
||||
CNZ CPUER ;TEST "XRA" M
|
||||
MVI M,055H
|
||||
INR M
|
||||
DCR M
|
||||
ADD M
|
||||
CPI 05AH
|
||||
CNZ CPUER ;TEST "INR","DCR",AND "MVI" M
|
||||
LXI B,12FFH
|
||||
LXI D,12FFH
|
||||
LXI H,12FFH
|
||||
INX B
|
||||
INX D
|
||||
INX H
|
||||
MVI A,013H
|
||||
CMP B
|
||||
CNZ CPUER ;TEST "LXI" AND "INX" B
|
||||
CMP D
|
||||
CNZ CPUER ;TEST "LXI" AND "INX" D
|
||||
CMP H
|
||||
CNZ CPUER ;TEST "LXI" AND "INX" H
|
||||
MVI A,000H
|
||||
CMP C
|
||||
CNZ CPUER ;TEST "LXI" AND "INX" B
|
||||
CMP E
|
||||
CNZ CPUER ;TEST "LXI" AND "INX" D
|
||||
CMP L
|
||||
CNZ CPUER ;TEST "LXI" AND "INX" H
|
||||
DCX B
|
||||
DCX D
|
||||
DCX H
|
||||
MVI A,012H
|
||||
CMP B
|
||||
CNZ CPUER ;TEST "DCX" B
|
||||
CMP D
|
||||
CNZ CPUER ;TEST "DCX" D
|
||||
CMP H
|
||||
CNZ CPUER ;TEST "DCX" H
|
||||
MVI A,0FFH
|
||||
CMP C
|
||||
CNZ CPUER ;TEST "DCX" B
|
||||
CMP E
|
||||
CNZ CPUER ;TEST "DCX" D
|
||||
CMP L
|
||||
CNZ CPUER ;TEST "DCX" H
|
||||
STA TEMP0
|
||||
XRA A
|
||||
LDA TEMP0
|
||||
CPI 0FFH
|
||||
CNZ CPUER ;TEST "LDA" AND "STA"
|
||||
LHLD TEMPP
|
||||
SHLD TEMP0
|
||||
LDA TEMPP
|
||||
MOV B,A
|
||||
LDA TEMP0
|
||||
CMP B
|
||||
CNZ CPUER ;TEST "LHLD" AND "SHLD"
|
||||
LDA TEMPP+1
|
||||
MOV B,A
|
||||
LDA TEMP0+1
|
||||
CMP B
|
||||
CNZ CPUER ;TEST "LHLD" AND "SHLD"
|
||||
MVI A,0AAH
|
||||
STA TEMP0
|
||||
MOV B,H
|
||||
MOV C,L
|
||||
XRA A
|
||||
LDAX B
|
||||
CPI 0AAH
|
||||
CNZ CPUER ;TEST "LDAX" B
|
||||
INR A
|
||||
STAX B
|
||||
LDA TEMP0
|
||||
CPI 0ABH
|
||||
CNZ CPUER ;TEST "STAX" B
|
||||
MVI A,077H
|
||||
STA TEMP0
|
||||
LHLD TEMPP
|
||||
LXI D,00000H
|
||||
XCHG
|
||||
XRA A
|
||||
LDAX D
|
||||
CPI 077H
|
||||
CNZ CPUER ;TEST "LDAX" D AND "XCHG"
|
||||
XRA A
|
||||
ADD H
|
||||
ADD L
|
||||
CNZ CPUER ;TEST "XCHG"
|
||||
MVI A,0CCH
|
||||
STAX D
|
||||
LDA TEMP0
|
||||
CPI 0CCH
|
||||
STAX D
|
||||
LDA TEMP0
|
||||
CPI 0CCH
|
||||
CNZ CPUER ;TEST "STAX" D
|
||||
LXI H,07777H
|
||||
DAD H
|
||||
MVI A,0EEH
|
||||
CMP H
|
||||
CNZ CPUER ;TEST "DAD" H
|
||||
CMP L
|
||||
CNZ CPUER ;TEST "DAD" H
|
||||
LXI H,05555H
|
||||
LXI B,0FFFFH
|
||||
DAD B
|
||||
MVI A,055H
|
||||
CNC CPUER ;TEST "DAD" B
|
||||
CMP H
|
||||
CNZ CPUER ;TEST "DAD" B
|
||||
MVI A,054H
|
||||
CMP L
|
||||
CNZ CPUER ;TEST "DAD" B
|
||||
LXI H,0AAAAH
|
||||
LXI D,03333H
|
||||
DAD D
|
||||
MVI A,0DDH
|
||||
CMP H
|
||||
CNZ CPUER ;TEST "DAD" D
|
||||
CMP L
|
||||
CNZ CPUER ;TEST "DAD" B
|
||||
STC
|
||||
CNC CPUER ;TEST "STC"
|
||||
CMC
|
||||
CC CPUER ;TEST "CMC
|
||||
MVI A,0AAH
|
||||
CMA
|
||||
CPI 055H
|
||||
CNZ CPUER ;TEST "CMA"
|
||||
ORA A ;RE-SET AUXILIARY CARRY
|
||||
DAA
|
||||
CPI 055H
|
||||
CNZ CPUER ;TEST "DAA"
|
||||
MVI A,088H
|
||||
ADD A
|
||||
DAA
|
||||
CPI 076H
|
||||
CNZ CPUER ;TEST "DAA"
|
||||
XRA A
|
||||
MVI A,0AAH
|
||||
DAA
|
||||
CNC CPUER ;TEST "DAA"
|
||||
CPI 010H
|
||||
CNZ CPUER ;TEST "DAA"
|
||||
XRA A
|
||||
MVI A,09AH
|
||||
DAA
|
||||
CNC CPUER ;TEST "DAA"
|
||||
CNZ CPUER ;TEST "DAA"
|
||||
STC
|
||||
MVI A,042H
|
||||
RLC
|
||||
CC CPUER ;TEST "RLC" FOR RE-SET CARRY
|
||||
RLC
|
||||
CNC CPUER ;TEST "RLC" FOR SET CARRY
|
||||
CPI 009H
|
||||
CNZ CPUER ;TEST "RLC" FOR ROTATION
|
||||
RRC
|
||||
CNC CPUER ;TEST "RRC" FOR SET CARRY
|
||||
RRC
|
||||
CPI 042H
|
||||
CNZ CPUER ;TEST "RRC" FOR ROTATION
|
||||
RAL
|
||||
RAL
|
||||
CNC CPUER ;TEST "RAL" FOR SET CARRY
|
||||
CPI 008H
|
||||
CNZ CPUER ;TEST "RAL" FOR ROTATION
|
||||
RAR
|
||||
RAR
|
||||
CC CPUER ;TEST "RAR" FOR RE-SET CARRY
|
||||
CPI 002H
|
||||
CNZ CPUER ;TEST "RAR" FOR ROTATION
|
||||
LXI B,01234H
|
||||
LXI D,0AAAAH
|
||||
LXI H,05555H
|
||||
XRA A
|
||||
PUSH B
|
||||
PUSH D
|
||||
PUSH H
|
||||
PUSH PSW
|
||||
LXI B,00000H
|
||||
LXI D,00000H
|
||||
LXI H,00000H
|
||||
MVI A,0C0H
|
||||
ADI 0F0H
|
||||
POP PSW
|
||||
POP H
|
||||
POP D
|
||||
POP B
|
||||
CC CPUER ;TEST "PUSH PSW" AND "POP PSW"
|
||||
CNZ CPUER ;TEST "PUSH PSW" AND "POP PSW"
|
||||
CPO CPUER ;TEST "PUSH PSW" AND "POP PSW"
|
||||
CM CPUER ;TEST "PUSH PSW" AND "POP PSW"
|
||||
MVI A,012H
|
||||
CMP B
|
||||
CNZ CPUER ;TEST "PUSH B" AND "POP B"
|
||||
MVI A,034H
|
||||
CMP C
|
||||
CNZ CPUER ;TEST "PUSH B" AND "POP B"
|
||||
MVI A,0AAH
|
||||
CMP D
|
||||
CNZ CPUER ;TEST "PUSH D" AND "POP D"
|
||||
CMP E
|
||||
CNZ CPUER ;TEST "PUSH D" AND "POP D"
|
||||
MVI A,055H
|
||||
CMP H
|
||||
CNZ CPUER ;TEST "PUSH H" AND "POP H"
|
||||
CMP L
|
||||
CNZ CPUER ;TEST "PUSH H" AND "POP H"
|
||||
LXI H,00000H
|
||||
DAD SP
|
||||
SHLD SAVSTK ;SAVE THE "OLD" STACK-POINTER!
|
||||
LXI SP,TEMP4
|
||||
DCX SP
|
||||
DCX SP
|
||||
INX SP
|
||||
DCX SP
|
||||
MVI A,055H
|
||||
STA TEMP2
|
||||
CMA
|
||||
STA TEMP3
|
||||
POP B
|
||||
CMP B
|
||||
CNZ CPUER ;TEST "LXI","DAD","INX",AND "DCX" SP
|
||||
CMA
|
||||
CMP C
|
||||
CNZ CPUER ;TEST "LXI","DAD","INX", AND "DCX" SP
|
||||
LXI H,TEMP4
|
||||
SPHL
|
||||
LXI H,07733H
|
||||
DCX SP
|
||||
DCX SP
|
||||
XTHL
|
||||
LDA TEMP3
|
||||
CPI 077H
|
||||
CNZ CPUER ;TEST "SPHL" AND "XTHL"
|
||||
LDA TEMP2
|
||||
CPI 033H
|
||||
CNZ CPUER ;TEST "SPHL" AND "XTHL"
|
||||
MVI A,055H
|
||||
CMP L
|
||||
CNZ CPUER ;TEST "SPHL" AND "XTHL"
|
||||
CMA
|
||||
CMP H
|
||||
CNZ CPUER ;TEST "SPHL" AND "XTHL"
|
||||
LHLD SAVSTK ;RESTORE THE "OLD" STACK-POINTER
|
||||
SPHL
|
||||
LXI H,CPUOK
|
||||
PCHL ;TEST "PCHL"
|
||||
;
|
||||
;
|
||||
;
|
||||
CPUER: LXI H,NGCPU ;OUTPUT "CPU HAS FAILED ERROR EXIT=" TO CONSOLE
|
||||
CALL MSG
|
||||
XTHL
|
||||
MOV A,H
|
||||
CALL BYTEO ;SHOW ERROR EXIT ADDRESS HIGH BYTE
|
||||
MOV A,L
|
||||
CALL BYTEO ;SHOW ERROR EXIT ADDRESS LOW BYTE
|
||||
JMP WBOOT ;EXIT TO CP/M WARM BOOT
|
||||
;
|
||||
;
|
||||
;
|
||||
CPUOK: LXI H,OKCPU ;OUTPUT "CPU IS OPERATIONAL" TO CONSOLE
|
||||
CALL MSG
|
||||
JMP WBOOT ;EXIT TO CP/M WARM BOOT
|
||||
;
|
||||
;
|
||||
;
|
||||
TEMPP: DW TEMP0 ;POINTER USED TO TEST "LHLD","SHLD",
|
||||
; AND "LDAX" INSTRUCTIONS
|
||||
;
|
||||
TEMP0: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
|
||||
TEMP1: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
|
||||
TEMP2 DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
|
||||
TEMP3: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
|
||||
TEMP4: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
|
||||
SAVSTK: DS 2 ;TEMPORARY STACK-POINTER STORAGE LOCATION
|
||||
;
|
||||
;
|
||||
;
|
||||
STACK EQU TEMPP+256 ;DE-BUG STACK POINTER STORAGE AREA
|
||||
;
|
||||
;
|
||||
;
|
||||
END
|
||||
;
|
||||
;
|
||||
;
|
Binary file not shown.
|
@ -0,0 +1,981 @@
|
|||
;***********************************************************************
|
||||
; MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC VERSION 1.0 (C) 1980
|
||||
;***********************************************************************
|
||||
;
|
||||
;DONATED TO THE "SIG/M" CP/M USER'S GROUP BY:
|
||||
;KELLY SMITH, MICROCOSM ASSOCIATES
|
||||
;3055 WACO AVENUE
|
||||
;SIMI VALLEY, CALIFORNIA, 93065
|
||||
;(805) 527-9321 (MODEM, CP/M-NET (TM))
|
||||
;(805) 527-0518 (VERBAL)
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
|
||||
ORG 00100H
|
||||
;
|
||||
;
|
||||
;
|
||||
0100 C3 AB 01 JMP CPU ;JUMP TO 8080 CPU DIAGNOSTIC
|
||||
;
|
||||
;
|
||||
;
|
||||
0103 4D 49 43 52 DB 'MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC'
|
||||
. . .
|
||||
012F 43
|
||||
0130 20 56 45 52 DB ' VERSION 1.0 (C) 1980'
|
||||
. . .
|
||||
0144 30
|
||||
;
|
||||
;
|
||||
;
|
||||
BDOS EQU 00005H ;BDOS ENTRY TO CP/M
|
||||
WBOOT EQU 00000H ;RE-ENTRY TO CP/M WARM BOOT
|
||||
;
|
||||
;
|
||||
;
|
||||
;MESSAGE OUTPUT ROUTINE
|
||||
;
|
||||
0145 D5 MSG: PUSH D ;EXILE D REG.
|
||||
0146 EB XCHG ;SWAP H&L REGS. TO D&E REGS.
|
||||
0147 0E 09 MVI C,9 ;LET BDOS KNOW WE WANT TO SEND A MESSAGE
|
||||
0149 CD 05 00 CALL BDOS
|
||||
014C D1 POP D ;BACK FROM EXILE
|
||||
014D C9 RET
|
||||
;
|
||||
;
|
||||
;
|
||||
;CHARACTER OUTPUT ROUTINE
|
||||
;
|
||||
014E 0E 02 PCHAR: MVI C,2
|
||||
0150 CD 05 00 CALL BDOS
|
||||
0153 C9 RET
|
||||
;
|
||||
;
|
||||
;
|
||||
0154 F5 BYTEO: PUSH PSW
|
||||
0155 CD 64 01 CALL BYTO1
|
||||
0158 5F MOV E,A
|
||||
0159 CD 4E 01 CALL PCHAR
|
||||
015C F1 POP PSW
|
||||
015D CD 68 01 CALL BYTO2
|
||||
0160 5F MOV E,A
|
||||
0161 C3 4E 01 JMP PCHAR
|
||||
0164 0F BYTO1: RRC
|
||||
0165 0F RRC
|
||||
0166 0F RRC
|
||||
0167 0F RRC
|
||||
0168 E6 0F BYTO2: ANI 0FH
|
||||
016A FE 0A CPI 0AH
|
||||
016C FA 71 01 JM BYTO3
|
||||
016F C6 07 ADI 7
|
||||
0171 C6 30 BYTO3: ADI 30H
|
||||
0173 C9 RET
|
||||
;
|
||||
;
|
||||
;
|
||||
;************************************************************
|
||||
; MESSAGE TABLE FOR OPERATIONAL CPU TEST
|
||||
;************************************************************
|
||||
;
|
||||
0174 0C 0D 0A 20 OKCPU: DB 0CH,0DH,0AH,' CPU IS OPERATIONAL$'
|
||||
. . .
|
||||
0188 41 4C 24
|
||||
;
|
||||
018B 0C 0D 0A 20 NGCPU: DB 0CH,0DH,0AH,' CPU HAS FAILED! ERROR EXIT=$'
|
||||
. . .
|
||||
01A7 49 54 3D 24
|
||||
;
|
||||
;
|
||||
;
|
||||
;************************************************************
|
||||
; 8080/8085 CPU TEST/DIAGNOSTIC
|
||||
;************************************************************
|
||||
;
|
||||
;NOTE: (1) PROGRAM ASSUMES "CALL",AND "LXI SP" INSTRUCTIONS WORK!
|
||||
;
|
||||
; (2) INSTRUCTIONS NOT TESTED ARE "HLT","DI","EI","RIM","SIM",
|
||||
; AND "RST 0" THRU "RST 7"
|
||||
;
|
||||
;
|
||||
;
|
||||
;TEST JUMP INSTRUCTIONS AND FLAGS
|
||||
;
|
||||
01AB 31 AD 06 CPU: LXI SP,STACK ;SET THE STACK POINTER
|
||||
01AE E6 00 ANI 0 ;INITIALIZE A REG. AND CLEAR ALL FLAGS
|
||||
01B0 CA B6 01 JZ J010 ;TEST "JZ"
|
||||
01B3 CD 89 06 CALL CPUER
|
||||
01B6 D2 BC 01 J010: JNC J020 ;TEST "JNC"
|
||||
01B9 CD 89 06 CALL CPUER
|
||||
01BC EA C2 01 J020: JPE J030 ;TEST "JPE"
|
||||
01BF CD 89 06 CALL CPUER
|
||||
01C2 F2 C8 01 J030: JP J040 ;TEST "JP"
|
||||
01C5 CD 89 06 CALL CPUER
|
||||
01C8 C2 D7 01 J040: JNZ J050 ;TEST "JNZ"
|
||||
01CB DA D7 01 JC J050 ;TEST "JC"
|
||||
01CE E2 D7 01 JPO J050 ;TEST "JPO"
|
||||
01D1 FA D7 01 JM J050 ;TEST "JM"
|
||||
01D4 C3 DA 01 JMP J060 ;TEST "JMP" (IT'S A LITTLE LATE,BUT WHAT THE HELL!
|
||||
01D7 CD 89 06 J050: CALL CPUER
|
||||
01DA C6 06 J060: ADI 6 ;A=6,C=0,P=1,S=0,Z=0
|
||||
01DC C2 E2 01 JNZ J070 ;TEST "JNZ"
|
||||
01DF CD 89 06 CALL CPUER
|
||||
01E2 DA EB 01 J070: JC J080 ;TEST "JC"
|
||||
01E5 E2 EB 01 JPO J080 ;TEST "JPO"
|
||||
01E8 F2 EE 01 JP J090 ;TEST "JP"
|
||||
01EB CD 89 06 J080: CALL CPUER
|
||||
01EE C6 70 J090: ADI 070H ;A=76H,C=0,P=0,S=0,Z=0
|
||||
01F0 E2 F6 01 JPO J100 ;TEST "JPO"
|
||||
01F3 CD 89 06 CALL CPUER
|
||||
01F6 FA FF 01 J100: JM J110 ;TEST "JM"
|
||||
01F9 CA FF 01 JZ J110 ;TEST "JZ"
|
||||
01FC D2 02 02 JNC J120 ;TEST "JNC"
|
||||
01FF CD 89 06 J110: CALL CPUER
|
||||
0202 C6 81 J120: ADI 081H ;A=F7H,C=0,P=0,S=1,Z=0
|
||||
0204 FA 0A 02 JM J130 ;TEST "JM"
|
||||
0207 CD 89 06 CALL CPUER
|
||||
020A CA 13 02 J130: JZ J140 ;TEST "JZ"
|
||||
020D DA 13 02 JC J140 ;TEST "JC"
|
||||
0210 E2 16 02 JPO J150 ;TEST "JPO"
|
||||
0213 CD 89 06 J140: CALL CPUER
|
||||
0216 C6 FE J150: ADI 0FEH ;A=F5H,C=1,P=1,S=1,Z=0
|
||||
0218 DA 1E 02 JC J160 ;TEST "JC"
|
||||
021B CD 89 06 CALL CPUER
|
||||
021E CA 27 02 J160: JZ J170 ;TEST "JZ"
|
||||
0221 E2 27 02 JPO J170 ;TEST "JPO"
|
||||
0224 FA 2A 02 JM AIMM ;TEST "JM"
|
||||
0227 CD 89 06 J170: CALL CPUER
|
||||
;
|
||||
;
|
||||
;
|
||||
;TEST ACCUMULATOR IMMEDIATE INSTRUCTIONS
|
||||
;
|
||||
022A FE 00 AIMM: CPI 0 ;A=F5H,C=0,Z=0
|
||||
022C DA 42 02 JC CPIE ;TEST "CPI" FOR RE-SET CARRY
|
||||
022F CA 42 02 JZ CPIE ;TEST "CPI" FOR RE-SET ZERO
|
||||
0232 FE F5 CPI 0F5H ;A=F5H,C=0,Z=1
|
||||
0234 DA 42 02 JC CPIE ;TEST "CPI" FOR RE-SET CARRY ("ADI")
|
||||
0237 C2 42 02 JNZ CPIE ;TEST "CPI" FOR RE-SET ZERO
|
||||
023A FE FF CPI 0FFH ;A=F5H,C=1,Z=0
|
||||
023C CA 42 02 JZ CPIE ;TEST "CPI" FOR RE-SET ZERO
|
||||
023F DA 45 02 JC ACII ;TEST "CPI" FOR SET CARRY
|
||||
0242 CD 89 06 CPIE: CALL CPUER
|
||||
0245 CE 0A ACII: ACI 00AH ;A=F5H+0AH+CARRY(1)=0,C=1
|
||||
0247 CE 0A ACI 00AH ;A=0+0AH+CARRY(0)=0BH,C=0
|
||||
0249 FE 0B CPI 00BH
|
||||
024B CA 51 02 JZ SUII ;TEST "ACI"
|
||||
024E CD 89 06 CALL CPUER
|
||||
0251 D6 0C SUII: SUI 00CH ;A=FFH,C=0
|
||||
0253 D6 0F SUI 00FH ;A=F0H,C=1
|
||||
0255 FE F0 CPI 0F0H
|
||||
0257 CA 5D 02 JZ SBII ;TEST "SUI"
|
||||
025A CD 89 06 CALL CPUER
|
||||
025D DE F1 SBII: SBI 0F1H ;A=F0H-0F1H-CARRY(0)=FFH,C=1
|
||||
025F DE 0E SBI 00EH ;A=FFH-OEH-CARRY(1)=F0H,C=0
|
||||
0261 FE F0 CPI 0F0H
|
||||
0263 CA 69 02 JZ ANII ;TEST "SBI"
|
||||
0266 CD 89 06 CALL CPUER
|
||||
0269 E6 55 ANII: ANI 055H ;A=F0H55H=50H,C=0,P=1,S=0,Z=0
|
||||
026B FE 50 CPI 050H
|
||||
026D CA 73 02 JZ ORII ;TEST "ANI"
|
||||
0270 CD 89 06 CALL CPUER
|
||||
0273 F6 3A ORII: ORI 03AH ;A=50H3AH=7AH,C=0,P=0,S=0,Z=0
|
||||
0275 FE 7A CPI 07AH
|
||||
0277 CA 7D 02 JZ XRII ;TEST "ORI"
|
||||
027A CD 89 06 CALL CPUER
|
||||
027D EE 0F XRII: XRI 00FH ;A=7AH0FH=75H,C=0,P=0,S=0,Z=0
|
||||
027F FE 75 CPI 075H
|
||||
0281 CA 87 02 JZ C010 ;TEST "XRI"
|
||||
0284 CD 89 06 CALL CPUER
|
||||
;
|
||||
;
|
||||
;
|
||||
;TEST CALLS AND RETURNS
|
||||
;
|
||||
0287 E6 00 C010: ANI 000H ;A=0,C=0,P=1,S=0,Z=1
|
||||
0289 DC 89 06 CC CPUER ;TEST "CC"
|
||||
028C E4 89 06 CPO CPUER ;TEST "CPO"
|
||||
028F FC 89 06 CM CPUER ;TEST "CM"
|
||||
0292 C4 89 06 CNZ CPUER ;TEST "CNZ"
|
||||
0295 FE 00 CPI 000H
|
||||
0297 CA 9D 02 JZ C020 ;A=0,C=0,P=0,S=0,Z=1
|
||||
029A CD 89 06 CALL CPUER
|
||||
029D D6 77 C020: SUI 077H ;A=89H,C=1,P=0,S=1,Z=0
|
||||
029F D4 89 06 CNC CPUER ;TEST "CNC"
|
||||
02A2 EC 89 06 CPE CPUER ;TEST "CPE"
|
||||
02A5 F4 89 06 CP CPUER ;TEST "CP"
|
||||
02A8 CC 89 06 CZ CPUER ;TEST "CZ"
|
||||
02AB FE 89 CPI 089H
|
||||
02AD CA B3 02 JZ C030 ;TEST FOR "CALLS" TAKING BRANCH
|
||||
02B0 CD 89 06 CALL CPUER
|
||||
02B3 E6 FF C030: ANI 0FFH ;SET FLAGS BACK!
|
||||
02B5 E4 C0 02 CPO CPOI ;TEST "CPO"
|
||||
02B8 FE D9 CPI 0D9H
|
||||
02BA CA 1D 03 JZ MOVI ;TEST "CALL" SEQUENCE SUCCESS
|
||||
02BD CD 89 06 CALL CPUER
|
||||
02C0 E8 CPOI: RPE ;TEST "RPE"
|
||||
02C1 C6 10 ADI 010H ;A=99H,C=0,P=0,S=1,Z=0
|
||||
02C3 EC CC 02 CPE CPEI ;TEST "CPE"
|
||||
02C6 C6 02 ADI 002H ;A=D9H,C=0,P=0,S=1,Z=0
|
||||
02C8 E0 RPO ;TEST "RPO"
|
||||
02C9 CD 89 06 CALL CPUER
|
||||
02CC E0 CPEI: RPO ;TEST "RPO"
|
||||
02CD C6 20 ADI 020H ;A=B9H,C=0,P=0,S=1,Z=0
|
||||
02CF FC D8 02 CM CMI ;TEST "CM"
|
||||
02D2 C6 04 ADI 004H ;A=D7H,C=0,P=1,S=1,Z=0
|
||||
02D4 E8 RPE ;TEST "RPE"
|
||||
02D5 CD 89 06 CALL CPUER
|
||||
02D8 F0 CMI: RP ;TEST "RP"
|
||||
02D9 C6 80 ADI 080H ;A=39H,C=1,P=1,S=0,Z=0
|
||||
02DB F4 E4 02 CP TCPI ;TEST "CP"
|
||||
02DE C6 80 ADI 080H ;A=D3H,C=0,P=0,S=1,Z=0
|
||||
02E0 F8 RM ;TEST "RM"
|
||||
02E1 CD 89 06 CALL CPUER
|
||||
02E4 F8 TCPI: RM ;TEST "RM"
|
||||
02E5 C6 40 ADI 040H ;A=79H,C=0,P=0,S=0,Z=0
|
||||
02E7 D4 F0 02 CNC CNCI ;TEST "CNC"
|
||||
02EA C6 40 ADI 040H ;A=53H,C=0,P=1,S=0,Z=0
|
||||
02EC F0 RP ;TEST "RP"
|
||||
02ED CD 89 06 CALL CPUER
|
||||
02F0 D8 CNCI: RC ;TEST "RC"
|
||||
02F1 C6 8F ADI 08FH ;A=08H,C=1,P=0,S=0,Z=0
|
||||
02F3 DC FC 02 CC CCI ;TEST "CC"
|
||||
02F6 D6 02 SUI 002H ;A=13H,C=0,P=0,S=0,Z=0
|
||||
02F8 D0 RNC ;TEST "RNC"
|
||||
02F9 CD 89 06 CALL CPUER
|
||||
02FC D0 CCI: RNC ;TEST "RNC"
|
||||
02FD C6 F7 ADI 0F7H ;A=FFH,C=0,P=1,S=1,Z=0
|
||||
02FF C4 08 03 CNZ CNZI ;TEST "CNZ"
|
||||
0302 C6 FE ADI 0FEH ;A=15H,C=1,P=0,S=0,Z=0
|
||||
0304 D8 RC ;TEST "RC"
|
||||
0305 CD 89 06 CALL CPUER
|
||||
0308 C8 CNZI: RZ ;TEST "RZ"
|
||||
0309 C6 01 ADI 001H ;A=00H,C=1,P=1,S=0,Z=1
|
||||
030B CC 14 03 CZ CZI ;TEST "CZ"
|
||||
030E C6 D0 ADI 0D0H ;A=17H,C=1,P=1,S=0,Z=0
|
||||
0310 C0 RNZ ;TEST "RNZ"
|
||||
0311 CD 89 06 CALL CPUER
|
||||
0314 C0 CZI: RNZ ;TEST "RNZ"
|
||||
0315 C6 47 ADI 047H ;A=47H,C=0,P=1,S=0,Z=0
|
||||
0317 FE 47 CPI 047H ;A=47H,C=0,P=1,S=0,Z=1
|
||||
0319 C8 RZ ;TEST "RZ"
|
||||
031A CD 89 06 CALL CPUER
|
||||
;
|
||||
;
|
||||
;
|
||||
;TEST "MOV","INR",AND "DCR" INSTRUCTIONS
|
||||
;
|
||||
031D 3E 77 MOVI: MVI A,077H
|
||||
031F 3C INR A
|
||||
0320 47 MOV B,A
|
||||
0321 04 INR B
|
||||
0322 48 MOV C,B
|
||||
0323 0D DCR C
|
||||
0324 51 MOV D,C
|
||||
0325 5A MOV E,D
|
||||
0326 63 MOV H,E
|
||||
0327 6C MOV L,H
|
||||
0328 7D MOV A,L ;TEST "MOV" A,L,H,E,D,C,B,A
|
||||
0329 3D DCR A
|
||||
032A 4F MOV C,A
|
||||
032B 59 MOV E,C
|
||||
032C 6B MOV L,E
|
||||
032D 45 MOV B,L
|
||||
032E 50 MOV D,B
|
||||
032F 62 MOV H,D
|
||||
0330 7C MOV A,H ;TEST "MOV" A,H,D,B,L,E,C,A
|
||||
0331 57 MOV D,A
|
||||
0332 14 INR D
|
||||
0333 6A MOV L,D
|
||||
0334 4D MOV C,L
|
||||
0335 0C INR C
|
||||
0336 61 MOV H,C
|
||||
0337 44 MOV B,H
|
||||
0338 05 DCR B
|
||||
0339 58 MOV E,B
|
||||
033A 7B MOV A,E ;TEST "MOV" A,E,B,H,C,L,D,A
|
||||
033B 5F MOV E,A
|
||||
033C 1C INR E
|
||||
033D 43 MOV B,E
|
||||
033E 60 MOV H,B
|
||||
033F 24 INR H
|
||||
0340 4C MOV C,H
|
||||
0341 69 MOV L,C
|
||||
0342 55 MOV D,L
|
||||
0343 15 DCR D
|
||||
0344 7A MOV A,D ;TEST "MOV" A,D,L,C,H,B,E,A
|
||||
0345 67 MOV H,A
|
||||
0346 25 DCR H
|
||||
0347 54 MOV D,H
|
||||
0348 42 MOV B,D
|
||||
0349 68 MOV L,B
|
||||
034A 2C INR L
|
||||
034B 5D MOV E,L
|
||||
034C 1D DCR E
|
||||
034D 4B MOV C,E
|
||||
034E 79 MOV A,C ;TEST "MOV" A,C,E,L,B,D,H,A
|
||||
034F 6F MOV L,A
|
||||
0350 2D DCR L
|
||||
0351 65 MOV H,L
|
||||
0352 5C MOV E,H
|
||||
0353 53 MOV D,E
|
||||
0354 4A MOV C,D
|
||||
0355 41 MOV B,C
|
||||
0356 78 MOV A,B
|
||||
0357 FE 77 CPI 077H
|
||||
0359 C4 89 06 CNZ CPUER ;TEST "MOV" A,B,C,D,E,H,L,A
|
||||
;
|
||||
;
|
||||
;
|
||||
;TEST ARITHMETIC AND LOGIC INSTRUCTIONS
|
||||
;
|
||||
035C AF XRA A
|
||||
035D 06 01 MVI B,001H
|
||||
035F 0E 03 MVI C,003H
|
||||
0361 16 07 MVI D,007H
|
||||
0363 1E 0F MVI E,00FH
|
||||
0365 26 1F MVI H,01FH
|
||||
0367 2E 3F MVI L,03FH
|
||||
0369 80 ADD B
|
||||
036A 81 ADD C
|
||||
036B 82 ADD D
|
||||
036C 83 ADD E
|
||||
036D 84 ADD H
|
||||
036E 85 ADD L
|
||||
036F 87 ADD A
|
||||
0370 FE F0 CPI 0F0H
|
||||
0372 C4 89 06 CNZ CPUER ;TEST "ADD" B,C,D,E,H,L,A
|
||||
0375 90 SUB B
|
||||
0376 91 SUB C
|
||||
0377 92 SUB D
|
||||
0378 93 SUB E
|
||||
0379 94 SUB H
|
||||
037A 95 SUB L
|
||||
037B FE 78 CPI 078H
|
||||
037D C4 89 06 CNZ CPUER ;TEST "SUB" B,C,D,E,H,L
|
||||
0380 97 SUB A
|
||||
0381 C4 89 06 CNZ CPUER ;TEST "SUB" A
|
||||
0384 3E 80 MVI A,080H
|
||||
0386 87 ADD A
|
||||
0387 06 01 MVI B,001H
|
||||
0389 0E 02 MVI C,002H
|
||||
038B 16 03 MVI D,003H
|
||||
038D 1E 04 MVI E,004H
|
||||
038F 26 05 MVI H,005H
|
||||
0391 2E 06 MVI L,006H
|
||||
0393 88 ADC B
|
||||
0394 06 80 MVI B,080H
|
||||
0396 80 ADD B
|
||||
0397 80 ADD B
|
||||
0398 89 ADC C
|
||||
0399 80 ADD B
|
||||
039A 80 ADD B
|
||||
039B 8A ADC D
|
||||
039C 80 ADD B
|
||||
039D 80 ADD B
|
||||
039E 8B ADC E
|
||||
039F 80 ADD B
|
||||
03A0 80 ADD B
|
||||
03A1 8C ADC H
|
||||
03A2 80 ADD B
|
||||
03A3 80 ADD B
|
||||
03A4 8D ADC L
|
||||
03A5 80 ADD B
|
||||
03A6 80 ADD B
|
||||
03A7 8F ADC A
|
||||
03A8 FE 37 CPI 037H
|
||||
03AA C4 89 06 CNZ CPUER ;TEST "ADC" B,C,D,E,H,L,A
|
||||
03AD 3E 80 MVI A,080H
|
||||
03AF 87 ADD A
|
||||
03B0 06 01 MVI B,001H
|
||||
03B2 98 SBB B
|
||||
03B3 06 FF MVI B,0FFH
|
||||
03B5 80 ADD B
|
||||
03B6 99 SBB C
|
||||
03B7 80 ADD B
|
||||
03B8 9A SBB D
|
||||
03B9 80 ADD B
|
||||
03BA 9B SBB E
|
||||
03BB 80 ADD B
|
||||
03BC 9C SBB H
|
||||
03BD 80 ADD B
|
||||
03BE 9D SBB L
|
||||
03BF FE E0 CPI 0E0H
|
||||
03C1 C4 89 06 CNZ CPUER ;TEST "SBB" B,C,D,E,H,L
|
||||
03C4 3E 80 MVI A,080H
|
||||
03C6 87 ADD A
|
||||
03C7 9F SBB A
|
||||
03C8 FE FF CPI 0FFH
|
||||
03CA C4 89 06 CNZ CPUER ;TEST "SBB" A
|
||||
03CD 3E FF MVI A,0FFH
|
||||
03CF 06 FE MVI B,0FEH
|
||||
03D1 0E FC MVI C,0FCH
|
||||
03D3 16 EF MVI D,0EFH
|
||||
03D5 1E 7F MVI E,07FH
|
||||
03D7 26 F4 MVI H,0F4H
|
||||
03D9 2E BF MVI L,0BFH
|
||||
03DB A7 ANA A
|
||||
03DC A1 ANA C
|
||||
03DD A2 ANA D
|
||||
03DE A3 ANA E
|
||||
03DF A4 ANA H
|
||||
03E0 A5 ANA L
|
||||
03E1 A7 ANA A
|
||||
03E2 FE 24 CPI 024H
|
||||
03E4 C4 89 06 CNZ CPUER ;TEST "ANA" B,C,D,E,H,L,A
|
||||
03E7 AF XRA A
|
||||
03E8 06 01 MVI B,001H
|
||||
03EA 0E 02 MVI C,002H
|
||||
03EC 16 04 MVI D,004H
|
||||
03EE 1E 08 MVI E,008H
|
||||
03F0 26 10 MVI H,010H
|
||||
03F2 2E 20 MVI L,020H
|
||||
03F4 B0 ORA B
|
||||
03F5 B1 ORA C
|
||||
03F6 B2 ORA D
|
||||
03F7 B3 ORA E
|
||||
03F8 B4 ORA H
|
||||
03F9 B5 ORA L
|
||||
03FA B7 ORA A
|
||||
03FB FE 3F CPI 03FH
|
||||
03FD C4 89 06 CNZ CPUER ;TEST "ORA" B,C,D,E,H,L,A
|
||||
0400 3E 00 MVI A,000H
|
||||
0402 26 8F MVI H,08FH
|
||||
0404 2E 4F MVI L,04FH
|
||||
0406 A8 XRA B
|
||||
0407 A9 XRA C
|
||||
0408 AA XRA D
|
||||
0409 AB XRA E
|
||||
040A AC XRA H
|
||||
040B AD XRA L
|
||||
040C FE CF CPI 0CFH
|
||||
040E C4 89 06 CNZ CPUER ;TEST "XRA" B,C,D,E,H,L
|
||||
0411 AF XRA A
|
||||
0412 C4 89 06 CNZ CPUER ;TEST "XRA" A
|
||||
0415 06 44 MVI B,044H
|
||||
0417 0E 45 MVI C,045H
|
||||
0419 16 46 MVI D,046H
|
||||
041B 1E 47 MVI E,047H
|
||||
041D 26 06 MVI H,(TEMP0 / 0FFH) ;HIGH BYTE OF TEST MEMORY LOCATION
|
||||
041F 2E A6 MVI L,(TEMP0 AND 0FFH) ;LOW BYTE OF TEST MEMORY LOCATION
|
||||
0421 70 MOV M,B
|
||||
0422 06 00 MVI B,000H
|
||||
0424 46 MOV B,M
|
||||
0425 3E 44 MVI A,044H
|
||||
0427 B8 CMP B
|
||||
0428 C4 89 06 CNZ CPUER ;TEST "MOV" M,B AND B,M
|
||||
042B 72 MOV M,D
|
||||
042C 16 00 MVI D,000H
|
||||
042E 56 MOV D,M
|
||||
042F 3E 46 MVI A,046H
|
||||
0431 BA CMP D
|
||||
0432 C4 89 06 CNZ CPUER ;TEST "MOV" M,D AND D,M
|
||||
0435 73 MOV M,E
|
||||
0436 1E 00 MVI E,000H
|
||||
0438 5E MOV E,M
|
||||
0439 3E 47 MVI A,047H
|
||||
043B BB CMP E
|
||||
043C C4 89 06 CNZ CPUER ;TEST "MOV" M,E AND E,M
|
||||
043F 74 MOV M,H
|
||||
0440 26 06 MVI H,(TEMP0 / 0FFH)
|
||||
0442 2E A6 MVI L,(TEMP0 AND 0FFH)
|
||||
0444 66 MOV H,M
|
||||
0445 3E 06 MVI A,(TEMP0 / 0FFH)
|
||||
0447 BC CMP H
|
||||
0448 C4 89 06 CNZ CPUER ;TEST "MOV" M,H AND H,M
|
||||
044B 75 MOV M,L
|
||||
044C 26 06 MVI H,(TEMP0 / 0FFH)
|
||||
044E 2E A6 MVI L,(TEMP0 AND 0FFH)
|
||||
0450 6E MOV L,M
|
||||
0451 3E A6 MVI A,(TEMP0 AND 0FFH)
|
||||
0453 BD CMP L
|
||||
0454 C4 89 06 CNZ CPUER ;TEST "MOV" M,L AND L,M
|
||||
0457 26 06 MVI H,(TEMP0 / 0FFH)
|
||||
0459 2E A6 MVI L,(TEMP0 AND 0FFH)
|
||||
045B 3E 32 MVI A,032H
|
||||
045D 77 MOV M,A
|
||||
045E BE CMP M
|
||||
045F C4 89 06 CNZ CPUER ;TEST "MOV" M,A
|
||||
0462 86 ADD M
|
||||
0463 FE 64 CPI 064H
|
||||
0465 C4 89 06 CNZ CPUER ;TEST "ADD" M
|
||||
0468 AF XRA A
|
||||
0469 7E MOV A,M
|
||||
046A FE 32 CPI 032H
|
||||
046C C4 89 06 CNZ CPUER ;TEST "MOV" A,M
|
||||
046F 26 06 MVI H,(TEMP0 / 0FFH)
|
||||
0471 2E A6 MVI L,(TEMP0 AND 0FFH)
|
||||
0473 7E MOV A,M
|
||||
0474 96 SUB M
|
||||
0475 C4 89 06 CNZ CPUER ;TEST "SUB" M
|
||||
0478 3E 80 MVI A,080H
|
||||
047A 87 ADD A
|
||||
047B 8E ADC M
|
||||
047C FE 33 CPI 033H
|
||||
047E C4 89 06 CNZ CPUER ;TEST "ADC" M
|
||||
0481 3E 80 MVI A,080H
|
||||
0483 87 ADD A
|
||||
0484 9E SBB M
|
||||
0485 FE CD CPI 0CDH
|
||||
0487 C4 89 06 CNZ CPUER ;TEST "SBB" M
|
||||
048A A6 ANA M
|
||||
048B C4 89 06 CNZ CPUER ;TEST "ANA" M
|
||||
048E 3E 25 MVI A,025H
|
||||
0490 B6 ORA M
|
||||
0491 FE 37 CPI 037H
|
||||
0493 C4 89 06 CNZ CPUER ;TEST "ORA" M
|
||||
0496 AE XRA M
|
||||
0497 FE 05 CPI 005H
|
||||
0499 C4 89 06 CNZ CPUER ;TEST "XRA" M
|
||||
049C 36 55 MVI M,055H
|
||||
049E 34 INR M
|
||||
049F 35 DCR M
|
||||
04A0 86 ADD M
|
||||
04A1 FE 5A CPI 05AH
|
||||
04A3 C4 89 06 CNZ CPUER ;TEST "INR","DCR",AND "MVI" M
|
||||
04A6 01 FF 12 LXI B,12FFH
|
||||
04A9 11 FF 12 LXI D,12FFH
|
||||
04AC 21 FF 12 LXI H,12FFH
|
||||
04AF 03 INX B
|
||||
04B0 13 INX D
|
||||
04B1 23 INX H
|
||||
04B2 3E 13 MVI A,013H
|
||||
04B4 B8 CMP B
|
||||
04B5 C4 89 06 CNZ CPUER ;TEST "LXI" AND "INX" B
|
||||
04B8 BA CMP D
|
||||
04B9 C4 89 06 CNZ CPUER ;TEST "LXI" AND "INX" D
|
||||
04BC BC CMP H
|
||||
04BD C4 89 06 CNZ CPUER ;TEST "LXI" AND "INX" H
|
||||
04C0 3E 00 MVI A,000H
|
||||
04C2 B9 CMP C
|
||||
04C3 C4 89 06 CNZ CPUER ;TEST "LXI" AND "INX" B
|
||||
04C6 BB CMP E
|
||||
04C7 C4 89 06 CNZ CPUER ;TEST "LXI" AND "INX" D
|
||||
04CA BD CMP L
|
||||
04CB C4 89 06 CNZ CPUER ;TEST "LXI" AND "INX" H
|
||||
04CE 0B DCX B
|
||||
04CF 1B DCX D
|
||||
04D0 2B DCX H
|
||||
04D1 3E 12 MVI A,012H
|
||||
04D3 B8 CMP B
|
||||
04D4 C4 89 06 CNZ CPUER ;TEST "DCX" B
|
||||
04D7 BA CMP D
|
||||
04D8 C4 89 06 CNZ CPUER ;TEST "DCX" D
|
||||
04DB BC CMP H
|
||||
04DC C4 89 06 CNZ CPUER ;TEST "DCX" H
|
||||
04DF 3E FF MVI A,0FFH
|
||||
04E1 B9 CMP C
|
||||
04E2 C4 89 06 CNZ CPUER ;TEST "DCX" B
|
||||
04E5 BB CMP E
|
||||
04E6 C4 89 06 CNZ CPUER ;TEST "DCX" D
|
||||
04E9 BD CMP L
|
||||
04EA C4 89 06 CNZ CPUER ;TEST "DCX" H
|
||||
04ED 32 A6 06 STA TEMP0
|
||||
04F0 AF XRA A
|
||||
04F1 3A A6 06 LDA TEMP0
|
||||
04F4 FE FF CPI 0FFH
|
||||
04F6 C4 89 06 CNZ CPUER ;TEST "LDA" AND "STA"
|
||||
04F9 2A A4 06 LHLD TEMPP
|
||||
04FC 22 A6 06 SHLD TEMP0
|
||||
04FF 3A A4 06 LDA TEMPP
|
||||
0502 47 MOV B,A
|
||||
0503 3A A6 06 LDA TEMP0
|
||||
0506 B8 CMP B
|
||||
0507 C4 89 06 CNZ CPUER ;TEST "LHLD" AND "SHLD"
|
||||
050A 3A A5 06 LDA TEMPP+1
|
||||
050D 47 MOV B,A
|
||||
050E 3A A7 06 LDA TEMP0+1
|
||||
0511 B8 CMP B
|
||||
0512 C4 89 06 CNZ CPUER ;TEST "LHLD" AND "SHLD"
|
||||
0515 3E AA MVI A,0AAH
|
||||
0517 32 A6 06 STA TEMP0
|
||||
051A 44 MOV B,H
|
||||
051B 4D MOV C,L
|
||||
051C AF XRA A
|
||||
051D 0A LDAX B
|
||||
051E FE AA CPI 0AAH
|
||||
0520 C4 89 06 CNZ CPUER ;TEST "LDAX" B
|
||||
0523 3C INR A
|
||||
0524 02 STAX B
|
||||
0525 3A A6 06 LDA TEMP0
|
||||
0528 FE AB CPI 0ABH
|
||||
052A C4 89 06 CNZ CPUER ;TEST "STAX" B
|
||||
052D 3E 77 MVI A,077H
|
||||
052F 32 A6 06 STA TEMP0
|
||||
0532 2A A4 06 LHLD TEMPP
|
||||
0535 11 00 00 LXI D,00000H
|
||||
0538 EB XCHG
|
||||
0539 AF XRA A
|
||||
053A 1A LDAX D
|
||||
053B FE 77 CPI 077H
|
||||
053D C4 89 06 CNZ CPUER ;TEST "LDAX" D AND "XCHG"
|
||||
0540 AF XRA A
|
||||
0541 84 ADD H
|
||||
0542 85 ADD L
|
||||
0543 C4 89 06 CNZ CPUER ;TEST "XCHG"
|
||||
0546 3E CC MVI A,0CCH
|
||||
0548 12 STAX D
|
||||
0549 3A A6 06 LDA TEMP0
|
||||
054C FE CC CPI 0CCH
|
||||
054E 12 STAX D
|
||||
054F 3A A6 06 LDA TEMP0
|
||||
0552 FE CC CPI 0CCH
|
||||
0554 C4 89 06 CNZ CPUER ;TEST "STAX" D
|
||||
0557 21 77 77 LXI H,07777H
|
||||
055A 29 DAD H
|
||||
055B 3E EE MVI A,0EEH
|
||||
055D BC CMP H
|
||||
055E C4 89 06 CNZ CPUER ;TEST "DAD" H
|
||||
0561 BD CMP L
|
||||
0562 C4 89 06 CNZ CPUER ;TEST "DAD" H
|
||||
0565 21 55 55 LXI H,05555H
|
||||
0568 01 FF FF LXI B,0FFFFH
|
||||
056B 09 DAD B
|
||||
056C 3E 55 MVI A,055H
|
||||
056E D4 89 06 CNC CPUER ;TEST "DAD" B
|
||||
0571 BC CMP H
|
||||
0572 C4 89 06 CNZ CPUER ;TEST "DAD" B
|
||||
0575 3E 54 MVI A,054H
|
||||
0577 BD CMP L
|
||||
0578 C4 89 06 CNZ CPUER ;TEST "DAD" B
|
||||
057B 21 AA AA LXI H,0AAAAH
|
||||
057E 11 33 33 LXI D,03333H
|
||||
0581 19 DAD D
|
||||
0582 3E DD MVI A,0DDH
|
||||
0584 BC CMP H
|
||||
0585 C4 89 06 CNZ CPUER ;TEST "DAD" D
|
||||
0588 BD CMP L
|
||||
0589 C4 89 06 CNZ CPUER ;TEST "DAD" B
|
||||
058C 37 STC
|
||||
058D D4 89 06 CNC CPUER ;TEST "STC"
|
||||
0590 3F CMC
|
||||
0591 DC 89 06 CC CPUER ;TEST "CMC
|
||||
0594 3E AA MVI A,0AAH
|
||||
0596 2F CMA
|
||||
0597 FE 55 CPI 055H
|
||||
0599 C4 89 06 CNZ CPUER ;TEST "CMA"
|
||||
059C B7 ORA A ;RE-SET AUXILIARY CARRY
|
||||
059D 27 DAA
|
||||
059E FE 55 CPI 055H
|
||||
05A0 C4 89 06 CNZ CPUER ;TEST "DAA"
|
||||
05A3 3E 88 MVI A,088H
|
||||
05A5 87 ADD A
|
||||
05A6 27 DAA
|
||||
05A7 FE 76 CPI 076H
|
||||
05A9 C4 89 06 CNZ CPUER ;TEST "DAA"
|
||||
05AC AF XRA A
|
||||
05AD 3E AA MVI A,0AAH
|
||||
05AF 27 DAA
|
||||
05B0 D4 89 06 CNC CPUER ;TEST "DAA"
|
||||
05B3 FE 10 CPI 010H
|
||||
05B5 C4 89 06 CNZ CPUER ;TEST "DAA"
|
||||
05B8 AF XRA A
|
||||
05B9 3E 9A MVI A,09AH
|
||||
05BB 27 DAA
|
||||
05BC D4 89 06 CNC CPUER ;TEST "DAA"
|
||||
05BF C4 89 06 CNZ CPUER ;TEST "DAA"
|
||||
05C2 37 STC
|
||||
05C3 3E 42 MVI A,042H
|
||||
05C5 07 RLC
|
||||
05C6 DC 89 06 CC CPUER ;TEST "RLC" FOR RE-SET CARRY
|
||||
05C9 07 RLC
|
||||
05CA D4 89 06 CNC CPUER ;TEST "RLC" FOR SET CARRY
|
||||
05CD FE 09 CPI 009H
|
||||
05CF C4 89 06 CNZ CPUER ;TEST "RLC" FOR ROTATION
|
||||
05D2 0F RRC
|
||||
05D3 D4 89 06 CNC CPUER ;TEST "RRC" FOR SET CARRY
|
||||
05D6 0F RRC
|
||||
05D7 FE 42 CPI 042H
|
||||
05D9 C4 89 06 CNZ CPUER ;TEST "RRC" FOR ROTATION
|
||||
05DC 17 RAL
|
||||
05DD 17 RAL
|
||||
05DE D4 89 06 CNC CPUER ;TEST "RAL" FOR SET CARRY
|
||||
05E1 FE 08 CPI 008H
|
||||
05E3 C4 89 06 CNZ CPUER ;TEST "RAL" FOR ROTATION
|
||||
05E6 1F RAR
|
||||
05E7 1F RAR
|
||||
05E8 DC 89 06 CC CPUER ;TEST "RAR" FOR RE-SET CARRY
|
||||
05EB FE 02 CPI 002H
|
||||
05ED C4 89 06 CNZ CPUER ;TEST "RAR" FOR ROTATION
|
||||
05F0 01 34 12 LXI B,01234H
|
||||
05F3 11 AA AA LXI D,0AAAAH
|
||||
05F6 21 55 55 LXI H,05555H
|
||||
05F9 AF XRA A
|
||||
05FA C5 PUSH B
|
||||
05FB D5 PUSH D
|
||||
05FC E5 PUSH H
|
||||
05FD F5 PUSH PSW
|
||||
05FE 01 00 00 LXI B,00000H
|
||||
0601 11 00 00 LXI D,00000H
|
||||
0604 21 00 00 LXI H,00000H
|
||||
0607 3E C0 MVI A,0C0H
|
||||
0609 C6 F0 ADI 0F0H
|
||||
060B F1 POP PSW
|
||||
060C E1 POP H
|
||||
060D D1 POP D
|
||||
060E C1 POP B
|
||||
060F DC 89 06 CC CPUER ;TEST "PUSH PSW" AND "POP PSW"
|
||||
0612 C4 89 06 CNZ CPUER ;TEST "PUSH PSW" AND "POP PSW"
|
||||
0615 E4 89 06 CPO CPUER ;TEST "PUSH PSW" AND "POP PSW"
|
||||
0618 FC 89 06 CM CPUER ;TEST "PUSH PSW" AND "POP PSW"
|
||||
061B 3E 12 MVI A,012H
|
||||
061D B8 CMP B
|
||||
061E C4 89 06 CNZ CPUER ;TEST "PUSH B" AND "POP B"
|
||||
0621 3E 34 MVI A,034H
|
||||
0623 B9 CMP C
|
||||
0624 C4 89 06 CNZ CPUER ;TEST "PUSH B" AND "POP B"
|
||||
0627 3E AA MVI A,0AAH
|
||||
0629 BA CMP D
|
||||
062A C4 89 06 CNZ CPUER ;TEST "PUSH D" AND "POP D"
|
||||
062D BB CMP E
|
||||
062E C4 89 06 CNZ CPUER ;TEST "PUSH D" AND "POP D"
|
||||
0631 3E 55 MVI A,055H
|
||||
0633 BC CMP H
|
||||
0634 C4 89 06 CNZ CPUER ;TEST "PUSH H" AND "POP H"
|
||||
0637 BD CMP L
|
||||
0638 C4 89 06 CNZ CPUER ;TEST "PUSH H" AND "POP H"
|
||||
063B 21 00 00 LXI H,00000H
|
||||
063E 39 DAD SP
|
||||
063F 22 AB 06 SHLD SAVSTK ;SAVE THE "OLD" STACK-POINTER!
|
||||
0642 31 AA 06 LXI SP,TEMP4
|
||||
0645 3B DCX SP
|
||||
0646 3B DCX SP
|
||||
0647 33 INX SP
|
||||
0648 3B DCX SP
|
||||
0649 3E 55 MVI A,055H
|
||||
064B 32 A8 06 STA TEMP2
|
||||
064E 2F CMA
|
||||
064F 32 A9 06 STA TEMP3
|
||||
0652 C1 POP B
|
||||
0653 B8 CMP B
|
||||
0654 C4 89 06 CNZ CPUER ;TEST "LXI","DAD","INX",AND "DCX" SP
|
||||
0657 2F CMA
|
||||
0658 B9 CMP C
|
||||
0659 C4 89 06 CNZ CPUER ;TEST "LXI","DAD","INX", AND "DCX" SP
|
||||
065C 21 AA 06 LXI H,TEMP4
|
||||
065F F9 SPHL
|
||||
0660 21 33 77 LXI H,07733H
|
||||
0663 3B DCX SP
|
||||
0664 3B DCX SP
|
||||
0665 E3 XTHL
|
||||
0666 3A A9 06 LDA TEMP3
|
||||
0669 FE 77 CPI 077H
|
||||
066B C4 89 06 CNZ CPUER ;TEST "SPHL" AND "XTHL"
|
||||
066E 3A A8 06 LDA TEMP2
|
||||
0671 FE 33 CPI 033H
|
||||
0673 C4 89 06 CNZ CPUER ;TEST "SPHL" AND "XTHL"
|
||||
0676 3E 55 MVI A,055H
|
||||
0678 BD CMP L
|
||||
0679 C4 89 06 CNZ CPUER ;TEST "SPHL" AND "XTHL"
|
||||
067C 2F CMA
|
||||
067D BC CMP H
|
||||
067E C4 89 06 CNZ CPUER ;TEST "SPHL" AND "XTHL"
|
||||
0681 2A AB 06 LHLD SAVSTK ;RESTORE THE "OLD" STACK-POINTER
|
||||
0684 F9 SPHL
|
||||
0685 21 9B 06 LXI H,CPUOK
|
||||
0688 E9 PCHL ;TEST "PCHL"
|
||||
;
|
||||
;
|
||||
;
|
||||
0689 21 8B 01 CPUER: LXI H,NGCPU ;OUTPUT "CPU HAS FAILED ERROR EXIT=" TO CONSOLE
|
||||
068C CD 45 01 CALL MSG
|
||||
068F E3 XTHL
|
||||
0690 7C MOV A,H
|
||||
0691 CD 54 01 CALL BYTEO ;SHOW ERROR EXIT ADDRESS HIGH BYTE
|
||||
0694 7D MOV A,L
|
||||
0695 CD 54 01 CALL BYTEO ;SHOW ERROR EXIT ADDRESS LOW BYTE
|
||||
0698 C3 00 00 JMP WBOOT ;EXIT TO CP/M WARM BOOT
|
||||
;
|
||||
;
|
||||
;
|
||||
069B 21 74 01 CPUOK: LXI H,OKCPU ;OUTPUT "CPU IS OPERATIONAL" TO CONSOLE
|
||||
069E CD 45 01 CALL MSG
|
||||
06A1 C3 00 00 JMP WBOOT ;EXIT TO CP/M WARM BOOT
|
||||
;
|
||||
;
|
||||
;
|
||||
06A4 A6 06 TEMPP: DW TEMP0 ;POINTER USED TO TEST "LHLD","SHLD",
|
||||
; AND "LDAX" INSTRUCTIONS
|
||||
;
|
||||
06A6 00 TEMP0: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
|
||||
06A7 00 TEMP1: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
|
||||
06A8 00 TEMP2 DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
|
||||
06A9 00 TEMP3: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
|
||||
06AA 00 TEMP4: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
|
||||
06AB 00 00 SAVSTK: DS 2 ;TEMPORARY STACK-POINTER STORAGE LOCATION
|
||||
;
|
||||
;
|
||||
;
|
||||
STACK EQU TEMPP+256 ;DE-BUG STACK POINTER STORAGE AREA
|
||||
;
|
||||
;
|
||||
;
|
||||
END
|
||||
;
|
||||
;
|
||||
;
|
||||
|
||||
Labels:
|
||||
acii 0245aimm 022Aanii 0269bdos 0005
|
||||
byteo 0154byto1 0164byto2 0168byto3 0171
|
||||
c010 0287c020 029Dc030 02B3cci 02FC
|
||||
cmi 02D8cnci 02F0cnzi 0308cpei 02CC
|
||||
cpie 0242cpoi 02C0cpu 01ABcpuer 0689
|
||||
cpuok 069Bczi 0314end 06ADj010 01B6
|
||||
j020 01BCj030 01C2j040 01C8j050 01D7
|
||||
j060 01DAj070 01E2j080 01EBj090 01EE
|
||||
j100 01F6j110 01FFj120 0202j130 020A
|
||||
j140 0213j150 0216j160 021Ej170 0227
|
||||
movi 031Dmsg 0145ngcpu 018Bokcpu 0174
|
||||
orii 0273pchar 014Esavstk 06ABsbii 025D
|
||||
stack 06ADsuii 0251tcpi 02E4temp0 06A6
|
||||
temp1 06A7temp2 06A8temp3 06A9temp4 06AA
|
||||
tempp 06A4wboot 0000xrii 027D
|
||||
|
||||
Memory dump:
|
||||
0100: C3 AB 01 4D 49 43 52 4F-43 4F 53 4D 20 41 53 53 ...MICROCOSM.ASS
|
||||
0110: 4F 43 49 41 54 45 53 20-38 30 38 30 2F 38 30 38 OCIATES.8080/808
|
||||
0120: 35 20 43 50 55 20 44 49-41 47 4E 4F 53 54 49 43 5.CPU.DIAGNOSTIC
|
||||
0130: 20 56 45 52 53 49 4F 4E-20 31 2E 30 20 28 43 29 .VERSION.1.0.(C)
|
||||
0140: 20 31 39 38 30 D5 EB 0E-09 CD 05 00 D1 C9 0E 02 .1980...........
|
||||
0150: CD 05 00 C9 F5 CD 64 01-5F CD 4E 01 F1 CD 68 01 ......d._.N...h.
|
||||
0160: 5F C3 4E 01 0F 0F 0F 0F-E6 0F FE 0A FA 71 01 C6 _.N..........q..
|
||||
0170: 07 C6 30 C9 0C 0D 0A 20-43 50 55 20 49 53 20 4F ..0.....CPU.IS.O
|
||||
0180: 50 45 52 41 54 49 4F 4E-41 4C 24 0C 0D 0A 20 43 PERATIONAL$....C
|
||||
0190: 50 55 20 48 41 53 20 46-41 49 4C 45 44 21 20 45 PU.HAS.FAILED!.E
|
||||
01A0: 52 52 4F 52 20 45 58 49-54 3D 24 31 AD 06 E6 00 RROR.EXIT=$1....
|
||||
01B0: CA B6 01 CD 89 06 D2 BC-01 CD 89 06 EA C2 01 CD ................
|
||||
01C0: 89 06 F2 C8 01 CD 89 06-C2 D7 01 DA D7 01 E2 D7 ................
|
||||
01D0: 01 FA D7 01 C3 DA 01 CD-89 06 C6 06 C2 E2 01 CD ................
|
||||
01E0: 89 06 DA EB 01 E2 EB 01-F2 EE 01 CD 89 06 C6 70 ...............p
|
||||
01F0: E2 F6 01 CD 89 06 FA FF-01 CA FF 01 D2 02 02 CD ................
|
||||
0200: 89 06 C6 81 FA 0A 02 CD-89 06 CA 13 02 DA 13 02 ................
|
||||
0210: E2 16 02 CD 89 06 C6 FE-DA 1E 02 CD 89 06 CA 27 ...............'
|
||||
0220: 02 E2 27 02 FA 2A 02 CD-89 06 FE 00 DA 42 02 CA ..'..*.......B..
|
||||
0230: 42 02 FE F5 DA 42 02 C2-42 02 FE FF CA 42 02 DA B....B..B....B..
|
||||
0240: 45 02 CD 89 06 CE 0A CE-0A FE 0B CA 51 02 CD 89 E...........Q...
|
||||
0250: 06 D6 0C D6 0F FE F0 CA-5D 02 CD 89 06 DE F1 DE ........].......
|
||||
0260: 0E FE F0 CA 69 02 CD 89-06 E6 55 FE 50 CA 73 02 ....i.....U.P.s.
|
||||
0270: CD 89 06 F6 3A FE 7A CA-7D 02 CD 89 06 EE 0F FE ....:.z.}.......
|
||||
0280: 75 CA 87 02 CD 89 06 E6-00 DC 89 06 E4 89 06 FC u...............
|
||||
0290: 89 06 C4 89 06 FE 00 CA-9D 02 CD 89 06 D6 77 D4 ..............w.
|
||||
02A0: 89 06 EC 89 06 F4 89 06-CC 89 06 FE 89 CA B3 02 ................
|
||||
02B0: CD 89 06 E6 FF E4 C0 02-FE D9 CA 1D 03 CD 89 06 ................
|
||||
02C0: E8 C6 10 EC CC 02 C6 02-E0 CD 89 06 E0 C6 20 FC ................
|
||||
02D0: D8 02 C6 04 E8 CD 89 06-F0 C6 80 F4 E4 02 C6 80 ................
|
||||
02E0: F8 CD 89 06 F8 C6 40 D4-F0 02 C6 40 F0 CD 89 06 ......@....@....
|
||||
02F0: D8 C6 8F DC FC 02 D6 02-D0 CD 89 06 D0 C6 F7 C4 ................
|
||||
0300: 08 03 C6 FE D8 CD 89 06-C8 C6 01 CC 14 03 C6 D0 ................
|
||||
0310: C0 CD 89 06 C0 C6 47 FE-47 C8 CD 89 06 3E 77 3C ......G.G....>w<
|
||||
0320: 47 04 48 0D 51 5A 63 6C-7D 3D 4F 59 6B 45 50 62 G.H.QZcl}=OYkEPb
|
||||
0330: 7C 57 14 6A 4D 0C 61 44-05 58 7B 5F 1C 43 60 24 |W.jM.aD.X{_.C`$
|
||||
0340: 4C 69 55 15 7A 67 25 54-42 68 2C 5D 1D 4B 79 6F LiU.zg%TBh,].Kyo
|
||||
0350: 2D 65 5C 53 4A 41 78 FE-77 C4 89 06 AF 06 01 0E -e\SJAx.w.......
|
||||
0360: 03 16 07 1E 0F 26 1F 2E-3F 80 81 82 83 84 85 87 .....&..?.......
|
||||
0370: FE F0 C4 89 06 90 91 92-93 94 95 FE 78 C4 89 06 ............x...
|
||||
0380: 97 C4 89 06 3E 80 87 06-01 0E 02 16 03 1E 04 26 ....>..........&
|
||||
0390: 05 2E 06 88 06 80 80 80-89 80 80 8A 80 80 8B 80 ................
|
||||
03A0: 80 8C 80 80 8D 80 80 8F-FE 37 C4 89 06 3E 80 87 .........7...>..
|
||||
03B0: 06 01 98 06 FF 80 99 80-9A 80 9B 80 9C 80 9D FE ................
|
||||
03C0: E0 C4 89 06 3E 80 87 9F-FE FF C4 89 06 3E FF 06 ....>........>..
|
||||
03D0: FE 0E FC 16 EF 1E 7F 26-F4 2E BF A7 A1 A2 A3 A4 .......&........
|
||||
03E0: A5 A7 FE 24 C4 89 06 AF-06 01 0E 02 16 04 1E 08 ...$............
|
||||
03F0: 26 10 2E 20 B0 B1 B2 B3-B4 B5 B7 FE 3F C4 89 06 &...........?...
|
||||
0400: 3E 00 26 8F 2E 4F A8 A9-AA AB AC AD FE CF C4 89 >.&..O..........
|
||||
0410: 06 AF C4 89 06 06 44 0E-45 16 46 1E 47 26 06 2E ......D.E.F.G&..
|
||||
0420: A6 70 06 00 46 3E 44 B8-C4 89 06 72 16 00 56 3E .p..F>D....r..V>
|
||||
0430: 46 BA C4 89 06 73 1E 00-5E 3E 47 BB C4 89 06 74 F....s..^>G....t
|
||||
0440: 26 06 2E A6 66 3E 06 BC-C4 89 06 75 26 06 2E A6 &...f>.....u&...
|
||||
0450: 6E 3E A6 BD C4 89 06 26-06 2E A6 3E 32 77 BE C4 n>.....&...>2w..
|
||||
0460: 89 06 86 FE 64 C4 89 06-AF 7E FE 32 C4 89 06 26 ....d....~.2...&
|
||||
0470: 06 2E A6 7E 96 C4 89 06-3E 80 87 8E FE 33 C4 89 ...~....>....3..
|
||||
0480: 06 3E 80 87 9E FE CD C4-89 06 A6 C4 89 06 3E 25 .>............>%
|
||||
0490: B6 FE 37 C4 89 06 AE FE-05 C4 89 06 36 55 34 35 ..7.........6U45
|
||||
04A0: 86 FE 5A C4 89 06 01 FF-12 11 FF 12 21 FF 12 03 ..Z.........!...
|
||||
04B0: 13 23 3E 13 B8 C4 89 06-BA C4 89 06 BC C4 89 06 .#>.............
|
||||
04C0: 3E 00 B9 C4 89 06 BB C4-89 06 BD C4 89 06 0B 1B >...............
|
||||
04D0: 2B 3E 12 B8 C4 89 06 BA-C4 89 06 BC C4 89 06 3E +>.............>
|
||||
04E0: FF B9 C4 89 06 BB C4 89-06 BD C4 89 06 32 A6 06 .............2..
|
||||
04F0: AF 3A A6 06 FE FF C4 89-06 2A A4 06 22 A6 06 3A .:.......*.."..:
|
||||
0500: A4 06 47 3A A6 06 B8 C4-89 06 3A A5 06 47 3A A7 ..G:......:..G:.
|
||||
0510: 06 B8 C4 89 06 3E AA 32-A6 06 44 4D AF 0A FE AA .....>.2..DM....
|
||||
0520: C4 89 06 3C 02 3A A6 06-FE AB C4 89 06 3E 77 32 ...<.:.......>w2
|
||||
0530: A6 06 2A A4 06 11 00 00-EB AF 1A FE 77 C4 89 06 ..*.........w...
|
||||
0540: AF 84 85 C4 89 06 3E CC-12 3A A6 06 FE CC 12 3A ......>..:.....:
|
||||
0550: A6 06 FE CC C4 89 06 21-77 77 29 3E EE BC C4 89 .......!ww)>....
|
||||
0560: 06 BD C4 89 06 21 55 55-01 FF FF 09 3E 55 D4 89 .....!UU....>U..
|
||||
0570: 06 BC C4 89 06 3E 54 BD-C4 89 06 21 AA AA 11 33 .....>T....!...3
|
||||
0580: 33 19 3E DD BC C4 89 06-BD C4 89 06 37 D4 89 06 3.>.........7...
|
||||
0590: 3F DC 89 06 3E AA 2F FE-55 C4 89 06 B7 27 FE 55 ?...>./.U....'.U
|
||||
05A0: C4 89 06 3E 88 87 27 FE-76 C4 89 06 AF 3E AA 27 ...>..'.v....>.'
|
||||
05B0: D4 89 06 FE 10 C4 89 06-AF 3E 9A 27 D4 89 06 C4 .........>.'....
|
||||
05C0: 89 06 37 3E 42 07 DC 89-06 07 D4 89 06 FE 09 C4 ..7>B...........
|
||||
05D0: 89 06 0F D4 89 06 0F FE-42 C4 89 06 17 17 D4 89 ........B.......
|
||||
05E0: 06 FE 08 C4 89 06 1F 1F-DC 89 06 FE 02 C4 89 06 ................
|
||||
05F0: 01 34 12 11 AA AA 21 55-55 AF C5 D5 E5 F5 01 00 .4....!UU.......
|
||||
0600: 00 11 00 00 21 00 00 3E-C0 C6 F0 F1 E1 D1 C1 DC ....!..>........
|
||||
0610: 89 06 C4 89 06 E4 89 06-FC 89 06 3E 12 B8 C4 89 ...........>....
|
||||
0620: 06 3E 34 B9 C4 89 06 3E-AA BA C4 89 06 BB C4 89 .>4....>........
|
||||
0630: 06 3E 55 BC C4 89 06 BD-C4 89 06 21 00 00 39 22 .>U........!..9"
|
||||
0640: AB 06 31 AA 06 3B 3B 33-3B 3E 55 32 A8 06 2F 32 ..1..;;3;>U2../2
|
||||
0650: A9 06 C1 B8 C4 89 06 2F-B9 C4 89 06 21 AA 06 F9 ......./....!...
|
||||
0660: 21 33 77 3B 3B E3 3A A9-06 FE 77 C4 89 06 3A A8 !3w;;.:...w...:.
|
||||
0670: 06 FE 33 C4 89 06 3E 55-BD C4 89 06 2F BC C4 89 ..3...>U..../...
|
||||
0680: 06 2A AB 06 F9 21 9B 06-E9 21 8B 01 CD 45 01 E3 .*...!...!...E..
|
||||
0690: 7C CD 54 01 7D CD 54 01-C3 00 00 21 74 01 CD 45 |.T.}.T....!t..E
|
||||
06A0: 01 C3 00 00 A6 06 00 00-00 00 00 00 00 ................
|
||||
|
||||
Intel HEX:
|
||||
cat >test.hex <<X
|
||||
:20010000C3AB014D4943524F434F534D204153534F43494154455320383038302F383038F6
|
||||
:20012000352043505520444941474E4F535449432056455253494F4E20312E3020284329D4
|
||||
:200140002031393830D5EB0E09CD0500D1C90E02CD0500C9F5CD64015FCD4E01F1CD6801F6
|
||||
:200160005FC34E010F0F0F0FE60FFE0AFA7101C607C630C90C0D0A20435055204953204F87
|
||||
:200180005045524154494F4E414C240C0D0A2043505520484153204641494C4544212045DA
|
||||
:2001A00052524F5220455849543D2431AD06E600CAB601CD8906D2BC01CD8906EAC201CD33
|
||||
:2001C0008906F2C801CD8906C2D701DAD701E2D701FAD701C3DA01CD8906C606C2E201CD69
|
||||
:2001E0008906DAEB01E2EB01F2EE01CD8906C670E2F601CD8906FAFF01CAFF01D20202CDCD
|
||||
:200200008906C681FA0A02CD8906CA1302DA1302E21602CD8906C6FEDA1E02CD8906CA2777
|
||||
:2002200002E22702FA2A02CD8906FE00DA4202CA4202FEF5DA4202C24202FEFFCA4202DA09
|
||||
:200240004502CD8906CE0ACE0AFE0BCA5102CD8906D60CD60FFEF0CA5D02CD8906DEF1DEE2
|
||||
:200260000EFEF0CA6902CD8906E655FE50CA7302CD8906F63AFE7ACA7D02CD8906EE0FFE85
|
||||
:2002800075CA8702CD8906E600DC8906E48906FC8906C48906FE00CA9D02CD8906D677D4B4
|
||||
:2002A0008906EC8906F48906CC8906FE89CAB302CD8906E6FFE4C002FED9CA1D03CD89064C
|
||||
:2002C000E8C610ECCC02C602E0CD8906E0C620FCD802C604E8CD8906F0C680F4E402C680A2
|
||||
:2002E000F8CD8906F8C640D4F002C640F0CD8906D8C68FDCFC02D602D0CD8906D0C6F7C438
|
||||
:200300000803C6FED8CD8906C8C601CC1403C6D0C0CD8906C0C647FE47C8CD89063E773C8F
|
||||
:200320004704480D515A636C7D3D4F596B4550627C57146A4D0C614405587B5F1C43602476
|
||||
:200340004C6955157A67255442682C5D1D4B796F2D655C534A4178FE77C48906AF06010ED1
|
||||
:200360000316071E0F261F2E3F80818283848587FEF0C48906909192939495FE78C489066F
|
||||
:2003800097C489063E808706010E0216031E0426052E0688068080808980808A80808B8051
|
||||
:2003A000808C80808D80808FFE37C489063E808706019806FF8099809A809B809C809DFE1F
|
||||
:2003C000E0C489063E80879FFEFFC489063EFF06FE0EFC16EF1E7F26F42EBFA7A1A2A3A491
|
||||
:2003E000A5A7FE24C48906AF06010E0216041E0826102E20B0B1B2B3B4B5B7FE3FC489063C
|
||||
:200400003E00268F2E4FA8A9AAABACADFECFC48906AFC4890606440E4516461E4726062E93
|
||||
:20042000A6700600463E44B8C48906721600563E46BAC48906731E005E3E47BBC489067468
|
||||
:2004400026062EA6663E06BCC489067526062EA66E3EA6BDC4890626062EA63E3277BEC4A3
|
||||
:20046000890686FE64C48906AF7EFE32C4890626062EA67E96C489063E80878EFE33C4894A
|
||||
:20048000063E80879EFECDC48906A6C489063E25B6FE37C48906AEFE05C4890636553435C3
|
||||
:2004A00086FE5AC4890601FF1211FF1221FF120313233E13B8C48906BAC48906BCC48906F4
|
||||
:2004C0003E00B9C48906BBC48906BDC489060B1B2B3E12B8C48906BAC48906BCC489063EAE
|
||||
:2004E000FFB9C48906BBC48906BDC4890632A606AF3AA606FEFFC489062AA40622A6063A34
|
||||
:20050000A406473AA606B8C489063AA506473AA706B8C489063EAA32A606444DAF0AFEAA23
|
||||
:20052000C489063C023AA606FEABC489063E7732A6062AA406110000EBAF1AFE77C4890654
|
||||
:20054000AF8485C489063ECC123AA606FECC123AA606FECCC48906217777293EEEBCC48942
|
||||
:2005600006BDC4890621555501FFFF093E55D48906BCC489063E54BDC4890621AAAA113332
|
||||
:2005800033193EDDBCC48906BDC4890637D489063FDC89063EAA2FFE55C48906B727FE55A3
|
||||
:2005A000C489063E888727FE76C48906AF3EAA27D48906FE10C48906AF3E9A27D48906C456
|
||||
:2005C0008906373E4207DC890607D48906FE09C489060FD489060FFE42C489061717D48900
|
||||
:2005E00006FE08C489061F1FDC8906FE02C4890601341211AAAA215555AFC5D5E5F5010005
|
||||
:20060000001100002100003EC0C6F0F1E1D1C1DC8906C48906E48906FC89063E12B8C4897F
|
||||
:20062000063E34B9C489063EAABAC48906BBC489063E55BCC48906BDC48906210000392205
|
||||
:20064000AB0631AA063B3B333B3E5532A8062F32A906C1B8C489062FB9C4890621AA06F9D0
|
||||
:200660002133773B3BE33AA906FE77C489063AA806FE33C489063E55BDC489062FBCC4895E
|
||||
:20068000062AAB06F9219B06E9218B01CD4501E37CCD54017DCD5401C30000217401CD458A
|
||||
:0D06A00001C30000A60600000000000000DD
|
||||
:00000001FF
|
||||
X
|
||||
gobjcopy -I ihex test.hex -O binary test.com
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,81 @@
|
|||
use crate::memory;
|
||||
use crate::memory::GRAPHIC_MEMORY_SIZE;
|
||||
|
||||
use wasm_bindgen::prelude::*;
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub struct SharedState {
|
||||
display: bool,
|
||||
megahertz: f64,
|
||||
in_1: u8,
|
||||
in_2: u8,
|
||||
is_paused: bool,
|
||||
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
impl SharedState {
|
||||
pub fn new() -> SharedState {
|
||||
SharedState {
|
||||
display: false,
|
||||
megahertz: 2.0,
|
||||
in_1: 8, // bit 3 is always 1
|
||||
in_2: 0,
|
||||
is_paused: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl SharedState {
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
pub fn graphic_memory(&self) -> [u8; GRAPHIC_MEMORY_SIZE] {
|
||||
let mut result: [u8; GRAPHIC_MEMORY_SIZE] = [0; GRAPHIC_MEMORY_SIZE];
|
||||
let memory = memory::STATIC_MEMORY.read().unwrap();
|
||||
result.clone_from_slice(&memory[0x2400..0x2400 + GRAPHIC_MEMORY_SIZE]);
|
||||
result
|
||||
}
|
||||
|
||||
fn set_vbl(&mut self, value: bool) {
|
||||
self.display = value;
|
||||
}
|
||||
|
||||
fn is_vbl(&self) -> bool { self.display }
|
||||
|
||||
pub fn set_megahertz(&mut self, mhz: f64) {
|
||||
self.megahertz = mhz;
|
||||
}
|
||||
|
||||
pub fn get_megahertz(&self) -> f64 {
|
||||
self.megahertz
|
||||
}
|
||||
|
||||
pub fn set_bit_in_1(&mut self, bit: u8, value: bool) {
|
||||
let mask = 1 << bit;
|
||||
if value {
|
||||
self.in_1 |= mask;
|
||||
} else {
|
||||
self.in_1 &= ! mask;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_in_1(&self) -> u8 {
|
||||
self.in_1
|
||||
}
|
||||
|
||||
pub fn set_bit_in_2(&mut self, bit: u8, value: bool) {
|
||||
let mask = 1 << bit;
|
||||
if value {
|
||||
self.in_2 |= mask;
|
||||
} else {
|
||||
self.in_2 &= ! mask;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_in_2(&self) -> u8 {
|
||||
self.in_2
|
||||
}
|
||||
|
||||
pub fn is_paused(&self) -> bool { self.is_paused }
|
||||
pub fn pause(&mut self) { self.is_paused = true; }
|
||||
pub fn unpause(&mut self) { self.is_paused = false; }
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
pub mod emulator;
|
||||
pub mod memory;
|
||||
pub mod state;
|
||||
pub mod emulator_state;
|
||||
pub mod opcodes;
|
||||
mod test;
|
||||
|
||||
const VERBOSE: bool = false;
|
||||
static mut VERBOSE_DISASSEMBLE: bool = false;
|
||||
const VERBOSE_GRAPHIC: bool = true;
|
||||
const VERBOSE_DISASSEMBLE_SECTION: bool = false;
|
||||
const DISASSEMBLE_SECTION_START: usize = 0x1439;
|
||||
const DISASSEMBLE_SECTION_END: usize = 0x1447;
|
||||
// const DISASSEMBLE_SECTION_START: usize = 0x1439;
|
||||
// const DISASSEMBLE_SECTION_END: usize = 0x1447;
|
||||
const VERBOSE_MEMORY: bool = false;
|
||||
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use crate::state::State;
|
||||
use crate::opcodes::Opcode;
|
||||
use std::sync::{Mutex, RwLock};
|
||||
use lazy_static::lazy_static;
|
||||
use crate::emulator_state::SharedState;
|
||||
|
||||
const MEMORY_SIZE: usize = 0x10000;
|
||||
pub const SCREEN_WIDTH: usize = 0x20; // 0x20 bytes (256 pixels)
|
||||
pub const SCREEN_HEIGHT: usize = 0xe0;
|
||||
pub const GRAPHIC_MEMORY_SIZE: usize = SCREEN_WIDTH * SCREEN_HEIGHT;
|
||||
|
||||
pub trait GraphicRenderer: Send {
|
||||
fn draw(&mut self, x: u8, y: u8, value: u8);
|
||||
fn color(&self, x: u8, y: u8) -> u8;
|
||||
fn display(&self);
|
||||
}
|
||||
|
||||
static _STATIC_MEMORY: [u8; MEMORY_SIZE] = [0; MEMORY_SIZE];
|
||||
|
||||
lazy_static! {
|
||||
pub(crate) static ref STATIC_MEMORY: RwLock<[u8; MEMORY_SIZE]> = RwLock::new(_STATIC_MEMORY);
|
||||
}
|
||||
|
||||
pub struct Memory {
|
||||
pub verbose: bool,
|
||||
}
|
||||
|
||||
impl Memory {
|
||||
pub fn new() -> Self {
|
||||
Memory {
|
||||
verbose: false,
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn set_verbose(&mut self, v: bool) {
|
||||
self.verbose = v;
|
||||
}
|
||||
|
||||
pub fn read_file(&mut self, file_name: &str, start: usize) {
|
||||
let mut file = File::open(file_name).expect("Couldn't open file");
|
||||
let mut buffer = Vec::new();
|
||||
file.read_to_end(&mut buffer).expect("Couldn't read file");
|
||||
|
||||
let mut state = State::default();
|
||||
state.pc = start;
|
||||
|
||||
let mut i: usize = 0;
|
||||
for byte in buffer {
|
||||
self.write(i + state.pc, byte);
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn write(&mut self, address: usize, value: u8) {
|
||||
STATIC_MEMORY.write().unwrap()[address] = value;
|
||||
if self.verbose {
|
||||
println!(" mem[{:04x}={:02X}]", address, value );
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn read(&self, i: usize) -> u8 {
|
||||
STATIC_MEMORY.read().unwrap()[i]
|
||||
}
|
||||
|
||||
pub(crate) fn read_word(&self, b0: u8, b1: u8) -> u8 {
|
||||
STATIC_MEMORY.read().unwrap()[Memory::to_word(b0, b1)]
|
||||
}
|
||||
|
||||
pub(crate) fn write_word(&mut self, b0: u8, b1: u8, value: u8) {
|
||||
let address = Memory::to_word(b0, b1);
|
||||
STATIC_MEMORY.write().unwrap()[address] = value;
|
||||
}
|
||||
|
||||
pub(crate) fn disassemble(&self, opcode: &Opcode, pc: usize) -> (String, usize) {
|
||||
let formatted_opcode = match opcode.size {
|
||||
1 => opcode.display1(),
|
||||
2 => opcode.display2(self.read(pc + 1)),
|
||||
_ => opcode.display3(self.read(pc + 1), self.read(pc + 2)),
|
||||
};
|
||||
let result = format!("{:04x}: {}", pc, formatted_opcode);
|
||||
(result, opcode.size)
|
||||
}
|
||||
|
||||
pub(crate) fn to_word(b1: u8, b2: u8) -> usize {
|
||||
return ((b2 as u16) << 8 | b1 as u16) as usize;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,543 @@
|
|||
use std::collections::HashMap;
|
||||
use crate::memory::Memory;
|
||||
use lazy_static::lazy_static;
|
||||
|
||||
pub struct Opcode {
|
||||
opcode: u8,
|
||||
pub(crate) size: usize,
|
||||
name: &'static str
|
||||
}
|
||||
|
||||
impl Opcode {
|
||||
fn new(opcode: u8, size: usize, name: &'static str) -> Opcode {
|
||||
Opcode { opcode, size, name }
|
||||
}
|
||||
|
||||
pub(crate) fn display1(&self) -> String {
|
||||
let s = self.name;
|
||||
format!("{:02x} {:14}", self.opcode, s)
|
||||
}
|
||||
|
||||
pub(crate) fn display2(&self, byte1: u8) -> String {
|
||||
let s = format!("{} {:02x}", self.name, byte1);
|
||||
format!("{:02x} {:02x} {:14}", self.opcode, byte1, s)
|
||||
}
|
||||
|
||||
pub(crate) fn display3(&self, byte1: u8, byte2: u8) -> String {
|
||||
let s = format!("{} {:04x}", self.name, Memory::to_word(byte1, byte2));
|
||||
format!("{:02x} {:02x} {:02x} {:14}", self.opcode, byte1, byte2, s)
|
||||
}
|
||||
}
|
||||
|
||||
pub const NOP: u8 = 0x00;
|
||||
pub const LXI_B: u8 = 0x01;
|
||||
pub const STAX_B: u8 = 0x02;
|
||||
pub const INX_B: u8 = 0x03;
|
||||
pub const INR_B: u8 = 0x04;
|
||||
pub const DCR_B: u8 = 0x05;
|
||||
pub const MVI_B: u8 = 0x06;
|
||||
pub const RLC: u8 = 0x07;
|
||||
pub const DAD_B: u8 = 0x09;
|
||||
pub const LDAX_B: u8 = 0x0a;
|
||||
pub const DCX_B: u8 = 0x0b;
|
||||
pub const RRC: u8 = 0x0f;
|
||||
pub const LXI_D: u8 = 0x11;
|
||||
pub const STAX_D: u8 = 0x12;
|
||||
pub const INX_D: u8 = 0x13;
|
||||
pub const INR_C: u8 = 0x0c;
|
||||
pub const DCR_C: u8 = 0x0d;
|
||||
pub const MVI_C: u8 = 0x0e;
|
||||
pub const INR_D: u8 = 0x14;
|
||||
pub const DCR_D: u8 = 0x15;
|
||||
pub const MVI_D: u8 = 0x16;
|
||||
pub const RAL: u8 = 0x17;
|
||||
pub const DAD_D: u8 = 0x19;
|
||||
pub const LDAX_D: u8 = 0x1a;
|
||||
pub const DCX_D: u8 = 0x1b;
|
||||
pub const INR_E: u8 = 0x1c;
|
||||
pub const DCR_E: u8 = 0x1d;
|
||||
pub const MVI_E: u8 = 0x1e;
|
||||
pub const RAR: u8 = 0x1f;
|
||||
pub const LXI_H: u8 = 0x21;
|
||||
pub const SHLD: u8 = 0x22;
|
||||
pub const INX_H: u8 = 0x23;
|
||||
pub const INR_H: u8 = 0x24;
|
||||
pub const DCR_H: u8 = 0x25;
|
||||
pub const MVI_H: u8 = 0x26;
|
||||
pub const DAA: u8 = 0x27;
|
||||
pub const DAD_H: u8 = 0x29;
|
||||
pub const LHLD: u8 = 0x2a;
|
||||
pub const DCX_H: u8 = 0x2b;
|
||||
pub const INR_L: u8 = 0x2c;
|
||||
pub const DCR_L: u8 = 0x2d;
|
||||
pub const MVI_L: u8 = 0x2e;
|
||||
pub const CMA: u8 = 0x2f;
|
||||
pub const LXI_SP: u8 = 0x31;
|
||||
pub const STA: u8 = 0x32;
|
||||
pub const INX_SP: u8 = 0x33;
|
||||
pub const INR_M: u8 = 0x34;
|
||||
pub const DCR_M: u8 = 0x35;
|
||||
pub const MVI_M: u8 = 0x36;
|
||||
pub const STC: u8 = 0x37;
|
||||
pub const DAD_SP: u8 = 0x39;
|
||||
pub const LDA: u8 = 0x3a;
|
||||
pub const DCX_SP: u8 = 0x3b;
|
||||
pub const INR_A: u8 = 0x3c;
|
||||
pub const DCR_A: u8 = 0x3d;
|
||||
pub const MVI_A: u8 = 0x3e;
|
||||
pub const CMC: u8 = 0x3f;
|
||||
|
||||
pub const MOV_B_B: u8 = 0x40;
|
||||
pub const MOV_B_C: u8 = 0x41;
|
||||
pub const MOV_B_D: u8 = 0x42;
|
||||
pub const MOV_B_E: u8 = 0x43;
|
||||
pub const MOV_B_H: u8 = 0x44;
|
||||
pub const MOV_B_L: u8 = 0x45;
|
||||
pub const MOV_B_M: u8 = 0x46;
|
||||
pub const MOV_B_A: u8 = 0x47;
|
||||
|
||||
pub const MOV_C_B: u8 = 0x48;
|
||||
pub const MOV_C_C: u8 = 0x49;
|
||||
pub const MOV_C_D: u8 = 0x4a;
|
||||
pub const MOV_C_E: u8 = 0x4b;
|
||||
pub const MOV_C_H: u8 = 0x4c;
|
||||
pub const MOV_C_L: u8 = 0x4d;
|
||||
pub const MOV_C_M: u8 = 0x4e;
|
||||
pub const MOV_C_A: u8 = 0x4f;
|
||||
|
||||
pub const MOV_D_B: u8 = 0x50;
|
||||
pub const MOV_D_C: u8 = 0x51;
|
||||
pub const MOV_D_D: u8 = 0x52;
|
||||
pub const MOV_D_E: u8 = 0x53;
|
||||
pub const MOV_D_H: u8 = 0x54;
|
||||
pub const MOV_D_L: u8 = 0x55;
|
||||
pub const MOV_D_M: u8 = 0x56;
|
||||
pub const MOV_D_A: u8 = 0x57;
|
||||
|
||||
pub const MOV_E_B: u8 = 0x58;
|
||||
pub const MOV_E_C: u8 = 0x59;
|
||||
pub const MOV_E_D: u8 = 0x5a;
|
||||
pub const MOV_E_E: u8 = 0x5b;
|
||||
pub const MOV_E_H: u8 = 0x5c;
|
||||
pub const MOV_E_L: u8 = 0x5d;
|
||||
pub const MOV_E_M: u8 = 0x5e;
|
||||
pub const MOV_E_A: u8 = 0x5f;
|
||||
|
||||
pub const MOV_H_B: u8 = 0x60;
|
||||
pub const MOV_H_C: u8 = 0x61;
|
||||
pub const MOV_H_D: u8 = 0x62;
|
||||
pub const MOV_H_E: u8 = 0x63;
|
||||
pub const MOV_H_H: u8 = 0x64;
|
||||
pub const MOV_H_L: u8 = 0x65;
|
||||
pub const MOV_H_M: u8 = 0x66;
|
||||
pub const MOV_H_A: u8 = 0x67;
|
||||
|
||||
pub const MOV_L_B: u8 = 0x68;
|
||||
pub const MOV_L_C: u8 = 0x69;
|
||||
pub const MOV_L_D: u8 = 0x6a;
|
||||
pub const MOV_L_E: u8 = 0x6b;
|
||||
pub const MOV_L_H: u8 = 0x6c;
|
||||
pub const MOV_L_L: u8 = 0x6d;
|
||||
pub const MOV_L_M: u8 = 0x6e;
|
||||
pub const MOV_L_A: u8 = 0x6f;
|
||||
|
||||
pub const MOV_M_B: u8 = 0x70;
|
||||
pub const MOV_M_C: u8 = 0x71;
|
||||
pub const MOV_M_D: u8 = 0x72;
|
||||
pub const MOV_M_E: u8 = 0x73;
|
||||
pub const MOV_M_H: u8 = 0x74;
|
||||
pub const MOV_M_L: u8 = 0x75;
|
||||
pub const MOV_M_A: u8 = 0x77;
|
||||
|
||||
pub const MOV_A_B: u8 = 0x78;
|
||||
pub const MOV_A_C: u8 = 0x79;
|
||||
pub const MOV_A_D: u8 = 0x7a;
|
||||
pub const MOV_A_E: u8 = 0x7b;
|
||||
pub const MOV_A_H: u8 = 0x7c;
|
||||
pub const MOV_A_L: u8 = 0x7d;
|
||||
pub const MOV_A_M: u8 = 0x7e;
|
||||
|
||||
pub const ADD_B: u8 = 0x80;
|
||||
pub const ADD_C: u8 = 0x81;
|
||||
pub const ADD_D: u8 = 0x82;
|
||||
pub const ADD_E: u8 = 0x83;
|
||||
pub const ADD_H: u8 = 0x84;
|
||||
pub const ADD_L: u8 = 0x85;
|
||||
pub const ADD_M: u8 = 0x86;
|
||||
pub const ADD_A: u8 = 0x87;
|
||||
|
||||
pub const ADC_B: u8 = 0x88;
|
||||
pub const ADC_C: u8 = 0x89;
|
||||
pub const ADC_D: u8 = 0x8a;
|
||||
pub const ADC_E: u8 = 0x8b;
|
||||
pub const ADC_H: u8 = 0x8c;
|
||||
pub const ADC_L: u8 = 0x8d;
|
||||
pub const ADC_M: u8 = 0x8e;
|
||||
pub const ADC_A: u8 = 0x8f;
|
||||
|
||||
pub const SUB_B: u8 = 0x90;
|
||||
pub const SUB_C: u8 = 0x91;
|
||||
pub const SUB_D: u8 = 0x92;
|
||||
pub const SUB_E: u8 = 0x93;
|
||||
pub const SUB_H: u8 = 0x94;
|
||||
pub const SUB_L: u8 = 0x95;
|
||||
pub const SUB_M: u8 = 0x96;
|
||||
pub const SUB_A: u8 = 0x97;
|
||||
|
||||
pub const SBB_B: u8 = 0x98;
|
||||
pub const SBB_C: u8 = 0x99;
|
||||
pub const SBB_D: u8 = 0x9a;
|
||||
pub const SBB_E: u8 = 0x9b;
|
||||
pub const SBB_H: u8 = 0x9c;
|
||||
pub const SBB_L: u8 = 0x9d;
|
||||
pub const SBB_M: u8 = 0x9e;
|
||||
pub const SBB_A: u8 = 0x9f;
|
||||
|
||||
pub const ORA_B: u8 = 0xb0;
|
||||
pub const ORA_C: u8 = 0xb1;
|
||||
pub const ORA_D: u8 = 0xb2;
|
||||
pub const ORA_E: u8 = 0xb3;
|
||||
pub const ORA_H: u8 = 0xb4;
|
||||
pub const ORA_L: u8 = 0xb5;
|
||||
pub const ORA_M: u8 = 0xb6;
|
||||
pub const ORA_A: u8 = 0xb7;
|
||||
|
||||
pub const CMP_B: u8 = 0xb8;
|
||||
pub const CMP_C: u8 = 0xb9;
|
||||
pub const CMP_D: u8 = 0xba;
|
||||
pub const CMP_E: u8 = 0xbb;
|
||||
pub const CMP_H: u8 = 0xbc;
|
||||
pub const CMP_L: u8 = 0xbd;
|
||||
pub const CMP_M: u8 = 0xbe;
|
||||
pub const CMP_A: u8 = 0xbf;
|
||||
|
||||
pub const ANA_B: u8 = 0xa0;
|
||||
pub const ANA_C: u8 = 0xa1;
|
||||
pub const ANA_D: u8 = 0xa2;
|
||||
pub const ANA_E: u8 = 0xa3;
|
||||
pub const ANA_H: u8 = 0xa4;
|
||||
pub const ANA_L: u8 = 0xa5;
|
||||
pub const ANA_M: u8 = 0xa6;
|
||||
pub const ANA_A: u8 = 0xa7;
|
||||
|
||||
pub const XRA_B: u8 = 0xa8;
|
||||
pub const XRA_C: u8 = 0xa9;
|
||||
pub const XRA_D: u8 = 0xaa;
|
||||
pub const XRA_E: u8 = 0xab;
|
||||
pub const XRA_H: u8 = 0xac;
|
||||
pub const XRA_L: u8 = 0xad;
|
||||
pub const XRA_M: u8 = 0xae;
|
||||
pub const XRA_A: u8 = 0xaf;
|
||||
|
||||
pub const RNZ: u8 = 0xc0;
|
||||
pub const POP_B: u8 = 0xc1;
|
||||
pub const JNZ: u8 = 0xc2;
|
||||
pub const JMP: u8 = 0xc3;
|
||||
pub const CNZ: u8 = 0xc4;
|
||||
pub const PUSH_B: u8 = 0xc5;
|
||||
pub const ADI: u8 = 0xc6;
|
||||
pub const RZ: u8 = 0xc8;
|
||||
pub const RET: u8 = 0xc9;
|
||||
pub const JZ: u8 = 0xca;
|
||||
pub const CZ: u8 = 0xcc;
|
||||
pub const CALL: u8 = 0xcd;
|
||||
pub const ACI: u8 = 0xce;
|
||||
pub const RST_1: u8 = 0xcf;
|
||||
pub const RNC: u8 = 0xd0;
|
||||
pub const POP_D: u8 = 0xd1;
|
||||
pub const JNC: u8 = 0xd2;
|
||||
pub const OUT: u8 = 0xd3;
|
||||
pub const CNC: u8 = 0xd4;
|
||||
pub const PUSH_D: u8 = 0xd5;
|
||||
pub const SUI: u8 = 0xd6;
|
||||
pub const RST_2: u8 = 0xd7;
|
||||
pub const RC: u8 = 0xd8;
|
||||
pub const JC: u8 = 0xda;
|
||||
pub const IN: u8 = 0xdb;
|
||||
pub const CC: u8 = 0xdc;
|
||||
pub const SBI: u8 = 0xde;
|
||||
pub const RPO: u8 = 0xe0;
|
||||
pub const POP_H: u8 = 0xe1;
|
||||
pub const JPO: u8 = 0xe2;
|
||||
pub const XTHL: u8 = 0xe3;
|
||||
pub const CPO: u8 = 0xe4;
|
||||
pub const PUSH_H: u8 = 0xe5;
|
||||
pub const ANI: u8 = 0xe6;
|
||||
pub const RPE: u8 = 0xe8;
|
||||
pub const PCHL: u8 = 0xe9;
|
||||
pub const JPE: u8 = 0xea;
|
||||
pub const XCHG: u8 = 0xeb;
|
||||
pub const CPE: u8 = 0xec;
|
||||
pub const XRI: u8 = 0xee;
|
||||
pub const RP: u8 = 0xf0;
|
||||
pub const POP_PSW: u8 = 0xf1;
|
||||
pub const JP: u8 = 0xf2;
|
||||
pub const DI: u8 = 0xf3;
|
||||
pub const CP: u8 = 0xf4;
|
||||
pub const PUSH_PSW: u8 = 0xf5;
|
||||
pub const ORI: u8 = 0xf6;
|
||||
pub const RM: u8 = 0xf8;
|
||||
pub const SPHL: u8 = 0xf9;
|
||||
pub const JM: u8 = 0xfa;
|
||||
pub const EI: u8 = 0xfb;
|
||||
pub const CM: u8 = 0xfc;
|
||||
pub const CPI: u8 = 0xfe;
|
||||
pub const RST_7: u8 = 0xff;
|
||||
|
||||
fn init_opcodes() -> HashMap<u8, Opcode> {
|
||||
// Opcode, size, disassembly name, cycles (appendix B of the ref manual)
|
||||
let ops: Vec<(u8, usize, &str)> = vec![
|
||||
(NOP, 1, "NOP"),
|
||||
(LXI_B, 3, "LD BC,"),
|
||||
(STAX_B, 1, "STA (BC)"),
|
||||
(INX_B, 1, "INC (BC)"),
|
||||
(INR_B, 1, "INR B"),
|
||||
(DCR_B, 1, "DEC B"),
|
||||
(MVI_B, 2, "LD B,"),
|
||||
(RLC, 1, "RLC"),
|
||||
(DAD_B, 1, "ADD HL,BC"),
|
||||
(LDAX_B, 1, "LD A,(BC)"),
|
||||
(DCX_B, 1, "DEC (BC)"),
|
||||
(INR_C, 1, "INR C"),
|
||||
(DCR_C, 1, "DEC C"),
|
||||
(MVI_C, 2, "LD C,"),
|
||||
(RRC, 1, "RRC"),
|
||||
(LXI_D, 3, "LD DE,"),
|
||||
(STAX_D, 1, "STA (DE)"),
|
||||
(INX_D, 1, "INC (DE)"),
|
||||
(INR_D, 1, "INR D"),
|
||||
(DCR_D, 1, "DEC D"),
|
||||
(MVI_D, 2, "LD D,"),
|
||||
(RAL, 1, "RAL"),
|
||||
(DAD_D, 1, "ADD HL,DE"),
|
||||
(LDAX_D, 1, "LD A,(DE)"),
|
||||
(DCX_D, 1, "DC (DE)"),
|
||||
(INR_E, 1, "INR E"),
|
||||
(DCR_E, 1, "DEC E"),
|
||||
(MVI_E, 2, "LD E,"),
|
||||
(RAR, 1, "RAR"),
|
||||
(LXI_H, 3, "LD HL,"),
|
||||
(SHLD, 3, "SHLD"),
|
||||
(INX_H, 1, "INC (HL)"),
|
||||
(INR_H, 1, "INR H"),
|
||||
(DCR_H, 1, "DEC HL"),
|
||||
(MVI_H, 2, "MOV H,"),
|
||||
(DAA, 1, "DAA"),
|
||||
(DAD_H, 1, "ADD HL,HL"),
|
||||
(LHLD, 3, "LHLD"),
|
||||
(DCX_H, 1, "DEC (HL)"),
|
||||
(INR_L, 1, "INR L"),
|
||||
(DCR_L, 1, "DEC L"),
|
||||
(MVI_L, 2, "LD L,"),
|
||||
(CMA, 1, "CMA"),
|
||||
(LXI_SP, 3, "LD SP,"),
|
||||
(STA, 3, "STA"),
|
||||
(INX_SP, 1, "INC (SP)"),
|
||||
(INR_M, 1, "INC (HL)"),
|
||||
(DCR_M, 1, "DEC (HL)"),
|
||||
(MVI_M, 2, "MV (HL),"),
|
||||
(STC, 1, "STC"),
|
||||
(DAD_SP, 1, "ADD HL,SP"),
|
||||
(0x3a, 3, "LDA"),
|
||||
(DCX_SP, 1, "DEC (SP)"),
|
||||
(INR_A, 1, "INR A"),
|
||||
(DCR_A, 1, "DEC A"),
|
||||
(MVI_A, 2, "LD A,"),
|
||||
(CMC, 1, "CMC"),
|
||||
(MOV_B_C, 1, "MOV B,C"),
|
||||
(MOV_B_D, 1, "MOV B,D"),
|
||||
(MOV_B_E, 1, "MOV B,E"),
|
||||
(MOV_B_H, 1, "MOV B,H"),
|
||||
(MOV_B_L, 1, "MOV B,L"),
|
||||
(MOV_B_M, 1, "MOV B,M"),
|
||||
(MOV_B_A, 1, "MOV B,A"),
|
||||
(MOV_C_B, 1, "MOV C,B"),
|
||||
(MOV_C_C, 1, "MOV C,C"),
|
||||
(MOV_C_D, 1, "MOV C,D"),
|
||||
(MOV_C_E, 1, "MOV C,E"),
|
||||
(MOV_C_H, 1, "MOV C,H"),
|
||||
(MOV_C_L, 1, "MOV C,L"),
|
||||
(MOV_C_M, 1, "MOV C,M"),
|
||||
(MOV_C_A, 1, "MOV C,A"),
|
||||
(MOV_D_B, 1, "MOV D,B"),
|
||||
(MOV_D_C, 1, "MOV D,C"),
|
||||
(MOV_D_D, 1, "MOV D,D"),
|
||||
(MOV_D_E, 1, "MOV D,E"),
|
||||
(MOV_D_H, 1, "MOV D,H"),
|
||||
(MOV_D_L, 1, "MOV D,L"),
|
||||
(MOV_D_M, 1, "MOV D,M"),
|
||||
(MOV_D_A, 1, "MOV D,A"),
|
||||
(MOV_E_B, 1, "MOV E,B"),
|
||||
(MOV_E_C, 1, "MOV E,C"),
|
||||
(MOV_E_D, 1, "MOV E,D"),
|
||||
(MOV_E_E, 1, "MOV E,E"),
|
||||
(MOV_E_H, 1, "MOV E,H"),
|
||||
(MOV_E_L, 1, "MOV E,L"),
|
||||
(MOV_E_M, 1, "MOV E,M"),
|
||||
(MOV_E_A, 1, "MOV E,A"),
|
||||
(MOV_H_B, 1, "MOV H,B"),
|
||||
(MOV_H_C, 1, "MOV H,C"),
|
||||
(MOV_H_D, 1, "MOV H,D"),
|
||||
(MOV_H_E, 1, "MOV H,E"),
|
||||
(MOV_H_H, 1, "MOV H,H"),
|
||||
(MOV_H_L, 1, "MOV H,L"),
|
||||
(MOV_H_M, 1, "MOV H,M"),
|
||||
(MOV_H_A, 1, "MOV H,A"),
|
||||
(MOV_L_B, 1, "MOV L,B"),
|
||||
(MOV_L_C, 1, "MOV L,C"),
|
||||
(MOV_L_D, 1, "MOV L,D"),
|
||||
(MOV_L_E, 1, "MOV L,E"),
|
||||
(MOV_L_H, 1, "MOV L,H"),
|
||||
(MOV_L_L, 1, "MOV L,L"),
|
||||
(MOV_L_M, 1, "MOV L,M"),
|
||||
(MOV_L_A, 1, "MOV L,A"),
|
||||
(MOV_M_B, 1, "LD (HL),B"),
|
||||
(MOV_M_C, 1, "LD (HL),C"),
|
||||
(MOV_M_D, 1, "LD (HL),D"),
|
||||
(MOV_M_E, 1, "LD (HL),E"),
|
||||
(MOV_M_H, 1, "LD (HL),H"),
|
||||
(MOV_M_L, 1, "LD (HL),L"),
|
||||
(MOV_M_A, 1, "LD (HL),A"),
|
||||
(MOV_A_B, 1, "MOV A,B"),
|
||||
(MOV_A_C, 1, "MOV A,C"),
|
||||
(MOV_A_D, 1, "MOV A,D"),
|
||||
(MOV_A_E, 1, "MOV A,E"),
|
||||
(MOV_A_H, 1, "MOV A,H"),
|
||||
(MOV_A_L, 1, "MOV A,L"),
|
||||
(MOV_A_M, 1, "MOV A,(HL)"),
|
||||
(ADD_B, 1, "ADD B"),
|
||||
(ADD_C, 1, "ADD C"),
|
||||
(ADD_D, 1, "ADD D"),
|
||||
(ADD_E, 1, "ADD E"),
|
||||
(ADD_H, 1, "ADD H"),
|
||||
(ADD_L, 1, "ADD L"),
|
||||
(ADD_M, 1, "ADD M"),
|
||||
(ADD_A, 1, "ADD A"),
|
||||
(ADC_B, 1, "ADC B"),
|
||||
(ADC_C, 1, "ADC C"),
|
||||
(ADC_D, 1, "ADC D"),
|
||||
(ADC_E, 1, "ADC E"),
|
||||
(ADC_H, 1, "ADC H"),
|
||||
(ADC_L, 1, "ADC L"),
|
||||
(ADC_M, 1, "ADC M"),
|
||||
(ADC_A, 1, "ADC A"),
|
||||
(SUB_B, 1, "SUB B"),
|
||||
(SUB_C, 1, "SUB C"),
|
||||
(SUB_D, 1, "SUB D"),
|
||||
(SUB_E, 1, "SUB E"),
|
||||
(SUB_H, 1, "SUB H"),
|
||||
(SUB_L, 1, "SUB L"),
|
||||
(SUB_M, 1, "SUB M"),
|
||||
(SUB_A, 1, "SUB A"),
|
||||
(SBB_B, 1, "SBB B"),
|
||||
(SBB_C, 1, "SBB C"),
|
||||
(SBB_D, 1, "SBB D"),
|
||||
(SBB_E, 1, "SBB E"),
|
||||
(SBB_H, 1, "SBB H"),
|
||||
(SBB_L, 1, "SBB L"),
|
||||
(SBB_M, 1, "SBB M"),
|
||||
(SBB_A, 1, "SBB A"),
|
||||
(ANA_B, 1, "AND B"),
|
||||
(ANA_C, 1, "AND C"),
|
||||
(ANA_D, 1, "AND D"),
|
||||
(ANA_E, 1, "AND E"),
|
||||
(ANA_H, 1, "AND H"),
|
||||
(ANA_L, 1, "AND L"),
|
||||
(ANA_M, 1, "AND M"),
|
||||
(ANA_A, 1, "AND A"),
|
||||
(ORA_B, 1, "ORA B"),
|
||||
(ORA_C, 1, "ORA C"),
|
||||
(ORA_D, 1, "ORA D"),
|
||||
(ORA_E, 1, "ORA E"),
|
||||
(ORA_H, 1, "ORA H"),
|
||||
(ORA_L, 1, "ORA L"),
|
||||
(ORA_M, 1, "ORA M"),
|
||||
(ORA_A, 1, "ORA A"),
|
||||
(CMP_B, 1, "CMP B"),
|
||||
(CMP_C, 1, "CMP C"),
|
||||
(CMP_D, 1, "CMP D"),
|
||||
(CMP_E, 1, "CMP E"),
|
||||
(CMP_H, 1, "CMP H"),
|
||||
(CMP_L, 1, "CMP L"),
|
||||
(CMP_M, 1, "CMP M"),
|
||||
(CMP_A, 1, "CMP A"),
|
||||
(XRA_B, 1, "XRA B"),
|
||||
(XRA_C, 1, "XRA C"),
|
||||
(XRA_D, 1, "XRA D"),
|
||||
(XRA_E, 1, "XRA E"),
|
||||
(XRA_H, 1, "XRA H"),
|
||||
(XRA_L, 1, "XRA L"),
|
||||
(XRA_M, 1, "XRA M"),
|
||||
(XRA_A, 1, "XRA A"),
|
||||
(RNZ, 1, "RNZ"),
|
||||
(POP_B, 1, "POP BC"),
|
||||
(JNZ, 3, "JNZ"),
|
||||
(JMP, 3, "JMP"),
|
||||
(CNZ, 3, "CNZ"),
|
||||
(PUSH_B, 1, "PUSH BC"),
|
||||
(ADI, 2, "ADI"),
|
||||
(RZ, 1, "RZ"),
|
||||
(RET, 1, "RET"),
|
||||
(JZ, 3, "JZ"),
|
||||
(CZ, 3, "CZ"),
|
||||
(CALL, 3, "CALL"),
|
||||
(ACI, 2, "ACI"),
|
||||
(RNC, 1, "RNC"),
|
||||
(POP_D, 1, "POP DE"),
|
||||
(JNC, 3, "JNC"),
|
||||
(OUT, 2, "OUT"),
|
||||
(CNC, 3, "CNC"),
|
||||
(PUSH_D, 1, "PUSH DE"),
|
||||
(SUI, 2, "SUI"),
|
||||
(RC, 1, "RC"),
|
||||
(JC, 3, "JC"),
|
||||
(IN, 2, "IN"),
|
||||
(CC, 3, "CC"),
|
||||
(SBI, 2, "SBI"),
|
||||
(RPO, 1, "RPO"),
|
||||
(POP_H, 1, "POP HL"),
|
||||
(JPO, 3, "JPO"),
|
||||
(XTHL, 1, "XTHL"),
|
||||
(CPO, 3, "CPO"),
|
||||
(PUSH_H, 1, "PUSH HL"),
|
||||
(ANI, 2, "ANI"),
|
||||
(RPE, 1, "RPE"),
|
||||
(PCHL, 1, "PCHL"),
|
||||
(JPE, 3, "JPE"),
|
||||
(XCHG, 1, "EX DE,HL"),
|
||||
(CPE, 3, "CPE"),
|
||||
(XRI, 2, "XRI"),
|
||||
(RP, 1, "RP"),
|
||||
(POP_PSW, 1, "POP PSW"),
|
||||
(JP, 3, "JP"),
|
||||
(CP, 3, "CP"),
|
||||
(PUSH_PSW, 1, "PUSH PSW"),
|
||||
(ORI, 2, "ORI"),
|
||||
(RM, 1, "RM"),
|
||||
(SPHL, 1, "SPHL"),
|
||||
(JM, 3, "JM"),
|
||||
(CM, 3, "CM"),
|
||||
(EI, 1, "EI"),
|
||||
(DI, 1, "DI"),
|
||||
(CPI, 2, "CPI"),
|
||||
(RST_1, 2, "RST 1"),
|
||||
(RST_2, 2, "RST 2"),
|
||||
(RST_7, 2, "RST 7"),
|
||||
];
|
||||
let mut result: HashMap<u8, Opcode> = HashMap::new();
|
||||
for op in ops {
|
||||
if result.get(&op.0).is_some() {
|
||||
panic!("REPEATED OPCODE {:02x}", op.0);
|
||||
}
|
||||
result.insert(op.0, Opcode::new(op.0, op.1, op.2));
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
pub(crate) static ref OPCODES: HashMap<u8, Opcode> = init_opcodes();
|
||||
}
|
||||
|
||||
// fn insert(map: &mut HashMap<u8, Opcode>, opcode: u8, size: usize, name: &'static str) {
|
||||
// map.insert(opcode, Opcode::new(opcode, size, name));
|
||||
// }
|
|
@ -0,0 +1,186 @@
|
|||
use crate::memory::Memory;
|
||||
|
||||
#[derive(Default)]
|
||||
pub(crate) struct Psw {
|
||||
pub a: u8,
|
||||
pub sign: bool,
|
||||
pub zero: bool,
|
||||
pub auxiliary_carry: bool,
|
||||
pub parity: bool,
|
||||
pub carry: bool,
|
||||
}
|
||||
|
||||
/*
|
||||
* PSW is: A for the high byte and the flags for the low byte, in order,
|
||||
* sign, zero, auxiliary carry, parity, carry:
|
||||
*
|
||||
* Bit: 7 6 5 4 3 2 1 0
|
||||
* Flag: S Z 0 AC 0 P 1 C
|
||||
*/
|
||||
impl Psw {
|
||||
pub(crate) fn to_u8(f: bool) -> u16 { if f { 1 } else { 0 } }
|
||||
pub(crate) fn to_bool(v: u8) -> bool { if v == 0 { false } else { true }}
|
||||
|
||||
pub(crate) fn set_flags(&mut self, value: u8) {
|
||||
self.sign = Psw::to_bool(value & (1 << 7));
|
||||
self.zero = Psw::to_bool(value & (1 << 6));
|
||||
self.auxiliary_carry = Psw::to_bool(value & (1 << 4));
|
||||
self.parity = Psw::to_bool(value & (1 << 2));
|
||||
self.carry = Psw::to_bool(value & 1);
|
||||
}
|
||||
|
||||
pub(crate) fn value(&self) -> u16 {
|
||||
(self.a as u16) << 8 |
|
||||
Psw::to_u8(self.sign) << 7 |
|
||||
Psw::to_u8(self.zero) << 6 |
|
||||
Psw::to_u8(self.auxiliary_carry) << 4 |
|
||||
Psw::to_u8(self.parity) << 2 |
|
||||
1 << 1 |
|
||||
Psw::to_u8(self.carry)
|
||||
}
|
||||
|
||||
pub(crate) fn disassemble(&self) -> String {
|
||||
format!("[C={} P={} S={} Z={}]",
|
||||
Psw::to_u8(self.carry),
|
||||
Psw::to_u8(self.parity),
|
||||
Psw::to_u8(self.sign),
|
||||
Psw::to_u8(self.zero))
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub(crate) struct State {
|
||||
pub b: u8,
|
||||
pub c: u8,
|
||||
pub d: u8,
|
||||
pub e: u8,
|
||||
pub h: u8,
|
||||
pub l: u8,
|
||||
pub psw: Psw,
|
||||
pub pc: usize,
|
||||
pub sp: usize,
|
||||
pub enable_interrupts: bool,
|
||||
}
|
||||
|
||||
impl State {
|
||||
pub(crate) fn new(pc: usize) -> State {
|
||||
State {
|
||||
pc,
|
||||
.. Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn m(&self) -> usize {
|
||||
Memory::to_word(self.l, self.h)
|
||||
}
|
||||
|
||||
pub fn disassemble(&self) -> String {
|
||||
format!("a:{:02x} b:{:02x} c:{:02x} d:{:02x} e:{:02x} lh:{:04x} pc:{:04x} sp:{:04x} {}",
|
||||
self.psw.a, self.b, self.c, self.d, self.e, ((self.h as u16) << 8) | self.l as u16,
|
||||
self.pc, self.sp,
|
||||
self.psw.disassemble())
|
||||
}
|
||||
|
||||
pub fn set_logic_flags(&mut self, value: i16) {
|
||||
self.psw.zero = value == 0;
|
||||
self.psw.sign = 0x80 == (value & 0x80);
|
||||
self.psw.parity = (value & 0xff).count_ones() % 2 == 0;
|
||||
self.psw.carry = false;
|
||||
// state.psw.auxiliary_carry = (state.psw.a < byte1);
|
||||
}
|
||||
|
||||
pub fn set_arithmetic_flags(&mut self, value: i16) {
|
||||
self.psw.zero = (value & 0xff) == 0;
|
||||
self.psw.sign = 0x80 == (value & 0x80);
|
||||
self.psw.parity = (value & 0xff).count_ones() % 2 == 0;
|
||||
self.psw.carry = value < 0 || value > 0xff;
|
||||
self.psw.auxiliary_carry = self.psw.carry;
|
||||
}
|
||||
|
||||
pub fn jump_if_flag(&mut self, word: usize, flag: bool) -> bool {
|
||||
if flag {
|
||||
self.pc = word;
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
pub fn call(&mut self, memory: &mut Memory, target_pc: usize) {
|
||||
let ret = self.pc + 3;
|
||||
memory.write(self.sp - 1, ((ret >> 8) as u8) & 0xff);
|
||||
memory.write(self.sp - 2, (ret & 0xff) as u8);
|
||||
self.sp -= 2;
|
||||
self.pc = target_pc;
|
||||
}
|
||||
|
||||
pub fn ret(&mut self, memory: &Memory, flag: bool) -> bool {
|
||||
if flag {
|
||||
self.pc = Memory::to_word(memory.read(self.sp), memory.read(self.sp + 1));
|
||||
self.sp += 2;
|
||||
}
|
||||
flag
|
||||
}
|
||||
|
||||
pub fn dec(&mut self, n: u8) -> u8 {
|
||||
let value = if n == 0 {
|
||||
self.psw.carry = true;
|
||||
self.psw.auxiliary_carry = true;
|
||||
0xff
|
||||
} else {
|
||||
n - 1
|
||||
};
|
||||
self.set_arithmetic_flags(value as i16);
|
||||
value
|
||||
}
|
||||
|
||||
pub fn xra(&mut self, value: u8) -> u8 {
|
||||
let value = self.psw.a ^ value;
|
||||
self.set_arithmetic_flags(value as i16);
|
||||
value
|
||||
}
|
||||
|
||||
pub fn and(&mut self, value: u8) -> u8 {
|
||||
let value = self.psw.a & value;
|
||||
self.set_arithmetic_flags(value as i16);
|
||||
value
|
||||
}
|
||||
|
||||
pub fn or(&mut self, value: u8) -> u8 {
|
||||
let value = self.psw.a | value;
|
||||
self.set_arithmetic_flags(value as i16);
|
||||
value
|
||||
}
|
||||
|
||||
pub fn add(&mut self, value: u8, carry: u16) {
|
||||
let value = self.psw.a as u16 + value as u16 + carry;
|
||||
self.set_arithmetic_flags(value as i16);
|
||||
self.psw.a = value as u8 & 0xff;
|
||||
}
|
||||
|
||||
pub fn sub(&mut self, value: u8, carry: u16) {
|
||||
let value = self.psw.a as i16 - value as i16 - carry as i16;
|
||||
self.set_arithmetic_flags(value as i16);
|
||||
self.psw.a = value as u8 & 0xff;
|
||||
}
|
||||
|
||||
pub fn cmp(&mut self, n: u8) {
|
||||
let value: i16 = self.psw.a as i16 - n as i16;
|
||||
self.set_arithmetic_flags(value);
|
||||
}
|
||||
|
||||
pub fn inr(&mut self, n: u8) -> u8 {
|
||||
let value = if n == 0xff { 0 } else { n + 1 };
|
||||
self.set_arithmetic_flags(value as i16);
|
||||
value
|
||||
}
|
||||
|
||||
pub fn add_hl(&mut self, b0: u8, b1: u8) {
|
||||
let hl = Memory::to_word(self.l, self.h) as u32;
|
||||
let v = Memory::to_word(b0, b1) as u32;
|
||||
let result: u32 = hl + v;
|
||||
self.psw.carry = result > 0xffff;
|
||||
self.h = ((result & 0xff00) >> 8) as u8;
|
||||
self.l = (result & 0xff) as u8;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
#[cfg(test)]
|
||||
mod test {
|
||||
use crate::memory::Memory;
|
||||
use crate::emulator::{Emulator, StepResult, StepStatus};
|
||||
|
||||
#[test]
|
||||
fn run_cpu_diag() {
|
||||
let mut memory = Memory::new();
|
||||
let start = 0x100;
|
||||
memory.read_file("cpudiag.bin", start);
|
||||
let mut computer = Emulator::new(Box::new(memory), start as usize);
|
||||
let mut result = StepResult { status: StepStatus::Continue, cycles: 0 };
|
||||
unsafe {
|
||||
while result.status == StepStatus::Continue {
|
||||
result = computer.step(true);
|
||||
}
|
||||
}
|
||||
match result.status {
|
||||
StepStatus::Success(s) => {
|
||||
println!("Success: {}", s)
|
||||
},
|
||||
StepStatus::Failure(s) => {
|
||||
panic!(s);
|
||||
},
|
||||
_ => {
|
||||
println!("Something went wrong");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
struct Foo {}
|
||||
|
||||
fn main() {
|
||||
let foo = Foo{};
|
||||
thread::spawn(move || {
|
||||
println!("Here is foo {}", foo);
|
||||
})
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
@ -0,0 +1,76 @@
|
|||
|
||||
const MEMORY_SIZE: usize = 260;
|
||||
|
||||
use lazy_static::lazy_static;
|
||||
use std::sync::RwLock;
|
||||
use std::sync::Mutex;
|
||||
use std::time::Duration;
|
||||
use std::thread;
|
||||
use emulator::opcodes::STA;
|
||||
use crate::log_time;
|
||||
use once_cell::sync::Lazy;
|
||||
|
||||
struct State {
|
||||
memory: Vec<u8>,
|
||||
input_1: u8,
|
||||
}
|
||||
|
||||
static SHARED_STATE: Lazy<RwLock<State>> = Lazy::new(|| {
|
||||
RwLock::new(State {
|
||||
memory: vec![0; MEMORY_SIZE],
|
||||
input_1: 0,
|
||||
})
|
||||
});
|
||||
|
||||
trait Emulator {
|
||||
fn run_one_frame(&self);
|
||||
fn write_memory(&mut self, address: usize, value: u8);
|
||||
fn memory(&self) -> Vec<u8>;
|
||||
fn set_input_1(&mut self, value: u8);
|
||||
fn input_1(&self) -> u8;
|
||||
}
|
||||
struct Runner{}
|
||||
|
||||
impl Emulator for Runner {
|
||||
fn run_one_frame(&self) {
|
||||
println!("Running one frame");
|
||||
std::thread::sleep(Duration::from_millis(500));
|
||||
}
|
||||
|
||||
fn write_memory(&mut self, address: usize, value: u8) {
|
||||
SHARED_STATE.write().unwrap().memory[address] = value;
|
||||
}
|
||||
|
||||
fn memory(&self) -> Vec<u8> {
|
||||
SHARED_STATE.read().unwrap().memory.to_vec()
|
||||
}
|
||||
|
||||
fn set_input_1(&mut self, value: u8) {
|
||||
SHARED_STATE.write().unwrap().input_1 = value;
|
||||
}
|
||||
|
||||
fn input_1(&self) -> u8 {
|
||||
SHARED_STATE.read().unwrap().input_1
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn main() {
|
||||
let mut e2 = Runner{};
|
||||
let mut e3 = Runner{};
|
||||
let t = thread::spawn(move || {
|
||||
let mut i = 0;
|
||||
loop {
|
||||
e2.run_one_frame();
|
||||
println!("Writing {}, input_1: {}", i, e2.input_1());
|
||||
e2.write_memory(0, i);
|
||||
i += 1;
|
||||
}
|
||||
});
|
||||
loop {
|
||||
let value = e3.memory()[0];
|
||||
let s = format!("============= Memory: {:02x}", value);
|
||||
e3.set_input_1(value);
|
||||
log_time(&s);
|
||||
thread::sleep(Duration::from_millis(500));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
use emulator::emulator_state::SharedState;
|
||||
|
||||
use std::time::{UNIX_EPOCH, SystemTime};
|
||||
|
||||
mod sdl2;
|
||||
|
||||
fn main() -> Result<(), String> {
|
||||
sdl2::sdl2()
|
||||
}
|
||||
|
||||
pub fn log_time(s: &str) {
|
||||
println!("{} {}", SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis() % 100000, s);
|
||||
}
|
|
@ -0,0 +1,196 @@
|
|||
use std::time::{Duration, SystemTime};
|
||||
use sdl2::event::Event;
|
||||
use sdl2::pixels::Color;
|
||||
use sdl2::keyboard::Keycode;
|
||||
use sdl2::rect::Rect;
|
||||
use emulator::memory::Memory;
|
||||
use std::thread;
|
||||
use std::sync::Mutex;
|
||||
use emulator::emulator::{Emulator, WIDTH, HEIGHT};
|
||||
use emulator::emulator_state::SharedState;
|
||||
|
||||
// I replaced GREEN with blue color and WHITE with red color.
|
||||
// I also made RECTANGLE_SIZE double of it's original value cuz window was too small in my opinion. -Biterr
|
||||
const RECTANGLE_SIZE: u32 = 4;
|
||||
const WHITE: Color = Color::RGB(128,0,0);
|
||||
const BLACK: Color = Color::RGB(0, 0, 0);
|
||||
const RED: Color = Color::RGB(255, 0, 0);
|
||||
const GREEN: Color = Color::RGB(0, 0, 255);
|
||||
|
||||
pub fn sdl2() -> Result<(), String> {
|
||||
let sdl_context = sdl2::init()?;
|
||||
let video_subsystem = sdl_context.video()?;
|
||||
let window = video_subsystem
|
||||
.window("", WIDTH as u32 * RECTANGLE_SIZE, HEIGHT as u32 * RECTANGLE_SIZE)
|
||||
.position_centered()
|
||||
.resizable()
|
||||
.build()
|
||||
.map_err(|e| e.to_string())?;
|
||||
|
||||
let mut canvas = window.into_canvas().build().map_err(|e| e.to_string())?;
|
||||
|
||||
canvas.clear();
|
||||
canvas.present();
|
||||
|
||||
//
|
||||
// Spawn the game logic in a separate thread. This logic will communicate with the
|
||||
// main thread (and therefore, the actual graphics on your screen) via the `SHARED_STATE`
|
||||
// object returned by the start of the emilator.
|
||||
//
|
||||
let shared_state = Emulator::start_emulator();
|
||||
// Hehe
|
||||
println!("Recolorised and resized by Biterr");
|
||||
|
||||
canvas.clear();
|
||||
canvas.present();
|
||||
|
||||
// Only update the title every one second or so
|
||||
let mut last_title_update = SystemTime::now();
|
||||
|
||||
// Main game loop
|
||||
let mut event_pump = sdl_context.event_pump()?;
|
||||
'running: loop {
|
||||
for event in event_pump.poll_iter() {
|
||||
|
||||
//
|
||||
// Read the keyboard
|
||||
//
|
||||
match event {
|
||||
Event::Quit { .. } | Event::KeyDown { keycode: Some(Keycode::Escape), .. }
|
||||
=> break 'running,
|
||||
// Pause / unpause ('p')
|
||||
Event::KeyDown { keycode: Some(Keycode::P), .. } => {
|
||||
let mut l = shared_state.lock().unwrap();
|
||||
if l.is_paused() {
|
||||
l.unpause();
|
||||
} else {
|
||||
l.pause();
|
||||
}
|
||||
},
|
||||
|
||||
// Insert coin
|
||||
Event::KeyDown { keycode: Some(Keycode::C), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_1(0, true);
|
||||
},
|
||||
Event::KeyUp { keycode: Some(Keycode::C), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_1(0, false);
|
||||
},
|
||||
// Start 2 players
|
||||
Event::KeyDown { keycode: Some(Keycode::Num2), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_1(1, true);
|
||||
},
|
||||
Event::KeyUp { keycode: Some(Keycode::Num2), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_1(1, false);
|
||||
},
|
||||
// Start 1 player
|
||||
Event::KeyDown { keycode: Some(Keycode::Num1), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_1(2, true);
|
||||
},
|
||||
Event::KeyUp { keycode: Some(Keycode::Num1), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_1(2, false);
|
||||
},
|
||||
// Player 1 shot
|
||||
Event::KeyDown { keycode: Some(Keycode::Space), .. } => {
|
||||
if shared_state.lock().unwrap().is_paused() {
|
||||
shared_state.lock().unwrap().unpause();
|
||||
} else {
|
||||
shared_state.lock().unwrap().set_bit_in_1(4, true);
|
||||
}
|
||||
},
|
||||
Event::KeyUp { keycode: Some(Keycode::Space), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_1(4, false);
|
||||
},
|
||||
// Player 1 move left
|
||||
Event::KeyDown { keycode: Some(Keycode::Left), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_1(5, true);
|
||||
},
|
||||
Event::KeyUp { keycode: Some(Keycode::Left), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_1(5, false);
|
||||
},
|
||||
// Player 1 move right
|
||||
Event::KeyDown { keycode: Some(Keycode::Right), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_1(6, true);
|
||||
},
|
||||
Event::KeyUp { keycode: Some(Keycode::Right), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_1(6, false);
|
||||
},
|
||||
|
||||
// Player 2 shot ('s')
|
||||
Event::KeyDown { keycode: Some(Keycode::S), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_2(4, true);
|
||||
},
|
||||
Event::KeyUp { keycode: Some(Keycode::S), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_2(4, false);
|
||||
},
|
||||
// Player 2 move left ('a')
|
||||
Event::KeyDown { keycode: Some(Keycode::A), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_2(5, true);
|
||||
},
|
||||
Event::KeyUp { keycode: Some(Keycode::A), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_2(5, false);
|
||||
},
|
||||
// Player 2 move right ('d')
|
||||
Event::KeyDown { keycode: Some(Keycode::D), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_2(6, true);
|
||||
},
|
||||
Event::KeyUp { keycode: Some(Keycode::D), .. } => {
|
||||
shared_state.lock().unwrap().set_bit_in_2(6, false);
|
||||
},
|
||||
// If the emulator is paused, any key will unpause it
|
||||
Event::KeyDown { .. } => {
|
||||
if shared_state.lock().unwrap().is_paused() {
|
||||
shared_state.lock().unwrap().unpause();
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 30));
|
||||
|
||||
canvas.clear();
|
||||
|
||||
//
|
||||
// Draw the graphic
|
||||
// Simply map the listener's frame buffer (updated by the main logic in a separate thread)
|
||||
// to the SDL canvas
|
||||
//
|
||||
let graphic_memory = shared_state.lock().unwrap().graphic_memory();
|
||||
let mut i: usize = 0;
|
||||
for ix in 0..WIDTH {
|
||||
for iy in (0..HEIGHT).step_by(8) {
|
||||
let mut byte = graphic_memory[i];
|
||||
i += 1;
|
||||
for b in 0..8 {
|
||||
let x: i32 = ix as i32 * RECTANGLE_SIZE as i32;
|
||||
let y: i32 = (HEIGHT as i32 - (iy as i32+ b)) * RECTANGLE_SIZE as i32;
|
||||
let color = if byte & 1 == 0 { BLACK } else {
|
||||
if iy > 200 && iy < 220 { RED }
|
||||
else if iy < 80 { GREEN }
|
||||
else { WHITE }
|
||||
};
|
||||
byte >>= 1;
|
||||
|
||||
canvas.set_draw_color(color);
|
||||
canvas.fill_rect(Rect::new(x, y, RECTANGLE_SIZE as u32, RECTANGLE_SIZE as u32))
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if last_title_update.elapsed().unwrap().gt(&Duration::from_millis(1000)) {
|
||||
let paused = if shared_state.lock().unwrap().is_paused() { " - Paused" } else { "" };
|
||||
canvas.window_mut().set_title(
|
||||
format!("Space Invaders in Rust - Hacked by Biterr - {:.2} Mhz{}",
|
||||
shared_state.lock().unwrap().get_megahertz(),
|
||||
paused)
|
||||
.as_str()).unwrap();
|
||||
last_title_update = SystemTime::now();
|
||||
}
|
||||
|
||||
canvas.present();
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue