mirror of
https://github.com/mre/mos6502.git
synced 2025-02-17 17:30:43 +00:00
Make code more idiomatic
This commit is contained in:
commit
587fa91bae
377
Cargo.lock
generated
377
Cargo.lock
generated
@ -1,81 +1,74 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "backtrace"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "backtrace-sys"
|
||||
version = "0.1.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "0.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "bytecount"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "cargo_metadata"
|
||||
version = "0.5.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
name = "autocfg"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "backtrace"
|
||||
version = "0.3.38"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "backtrace-sys"
|
||||
version = "0.1.31"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "bytecount"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "cargo_metadata"
|
||||
version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "error-chain"
|
||||
version = "0.11.0"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"backtrace 0.3.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fuchsia-zircon"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fuchsia-zircon-sys"
|
||||
version = "0.3.3"
|
||||
name = "fuchsia-cprng"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
@ -85,30 +78,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "0.4.3"
|
||||
version = "0.4.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.43"
|
||||
version = "0.2.62"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.6"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mos6502"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"skeptic 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"skeptic 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -116,110 +109,140 @@ name = "num"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"num-complex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-rational 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-complex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-iter 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-complex"
|
||||
version = "0.2.1"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-integer"
|
||||
version = "0.1.39"
|
||||
version = "0.1.41"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.37"
|
||||
version = "0.1.39"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-rational"
|
||||
version = "0.2.1"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.6"
|
||||
version = "0.2.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "0.4.20"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pulldown-cmark"
|
||||
version = "0.1.2"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "0.6.9"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.4.3"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "rdrand"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "remove_dir_all"
|
||||
version = "0.5.1"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc-demangle"
|
||||
version = "0.1.9"
|
||||
version = "0.1.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "0.2.6"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "same-file"
|
||||
version = "1.0.4"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -228,7 +251,7 @@ version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -238,52 +261,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.80"
|
||||
version = "1.0.101"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.80"
|
||||
version = "1.0.101"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.15.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.32"
|
||||
version = "1.0.41"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "skeptic"
|
||||
version = "0.13.3"
|
||||
version = "0.13.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bytecount 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cargo_metadata 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bytecount 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cargo_metadata 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pulldown-cmark 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"walkdir 2.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "0.15.18"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -291,28 +314,33 @@ name = "tempdir"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.1.0"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "walkdir"
|
||||
version = "2.2.6"
|
||||
version = "2.2.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.6"
|
||||
version = "0.3.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -326,10 +354,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-util"
|
||||
version = "0.1.1"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -338,46 +366,49 @@ version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[metadata]
|
||||
"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a"
|
||||
"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0"
|
||||
"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
|
||||
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
|
||||
"checksum bytecount 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f861d9ce359f56dbcb6e0c2a1cb84e52ad732cadb57b806adeb3c7668caccbd8"
|
||||
"checksum cargo_metadata 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1efca0b863ca03ed4c109fb1c55e0bc4bbeb221d3e103d86251046b06a526bd0"
|
||||
"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16"
|
||||
"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
|
||||
"checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3"
|
||||
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
|
||||
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
|
||||
"checksum autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875"
|
||||
"checksum backtrace 0.3.38 (registry+https://github.com/rust-lang/crates.io-index)" = "690a62be8920ccf773ee00ef0968649b0e724cda8bd5b12286302b4ae955fdf5"
|
||||
"checksum backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "82a830b4ef2d1124a711c71d263c5abdc710ef8e907bd508c88be475cebc422b"
|
||||
"checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2"
|
||||
"checksum bytecount 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b92204551573580e078dc80017f36a213eb77a0450e4ddd8cfa0f3f2d1f0178f"
|
||||
"checksum cargo_metadata 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e5d1b4d380e1bab994591a24c2bdd1b054f64b60bef483a8c598c7c345bc3bbe"
|
||||
"checksum cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "4fc9a35e1f4290eb9e5fc54ba6cf40671ed2a2514c3eeb2b2a908dda2ea5a1be"
|
||||
"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||
"checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9"
|
||||
"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
||||
"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
|
||||
"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b"
|
||||
"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d"
|
||||
"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6"
|
||||
"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
|
||||
"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba"
|
||||
"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
|
||||
"checksum num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cf4825417e1e1406b3782a8ce92f4d53f26ec055e3622e1881ca8e9f5f9e08db"
|
||||
"checksum num-complex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "107b9be86cd2481930688277b675b0114578227f034674726605b8a482d8baf8"
|
||||
"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
|
||||
"checksum num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "af3fdbbc3291a5464dc57b03860ec37ca6bf915ed6ee385e7c6c052c422b2124"
|
||||
"checksum num-rational 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e96f040177bb3da242b5b1ecf3f54b5d5af3efbbfb18608977a5d2767b22f10"
|
||||
"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
|
||||
"checksum proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "3d7b7eaaa90b4a90a932a9ea6666c95a389e424eff347f0f793979289429feee"
|
||||
"checksum pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d6fdf85cda6cadfae5428a54661d431330b312bc767ddbc57adbedc24da66e32"
|
||||
"checksum quote 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "63b5829244f52738cfee93b3a165c1911388675be000c888d2fae620dee8fa5b"
|
||||
"checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd"
|
||||
"checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5"
|
||||
"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395"
|
||||
"checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7"
|
||||
"checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267"
|
||||
"checksum num-complex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fcb0cf31fb3ff77e6d2a6ebd6800df7fdcd106f2ad89113c9130bcd07f93dffc"
|
||||
"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09"
|
||||
"checksum num-iter 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "76bd5272412d173d6bf9afdf98db8612bbabc9a7a830b7bfc9c188911716132e"
|
||||
"checksum num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2885278d5fe2adc2f75ced642d52d879bffaceb5a2e0b1d4309ffdfb239b454"
|
||||
"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32"
|
||||
"checksum proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90cf5f418035b98e655e9cdb225047638296b862b42411c4e45bb88d700f7fc0"
|
||||
"checksum pulldown-cmark 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eef52fac62d0ea7b9b4dc7da092aa64ea7ec3d90af6679422d3d7e0e14b6ee15"
|
||||
"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
|
||||
"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
|
||||
"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
|
||||
"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
|
||||
"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
|
||||
"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e"
|
||||
"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
|
||||
"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997"
|
||||
"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
|
||||
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
|
||||
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||
"checksum serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "15c141fc7027dd265a47c090bf864cf62b42c4d228bbcf4e51a0c9e2b0d3f7ef"
|
||||
"checksum serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "225de307c6302bec3898c51ca302fc94a7a1697ef0845fcee6448f33c032249c"
|
||||
"checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce"
|
||||
"checksum skeptic 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c4474d6da9593171bcb086890fc344a3a12783cb24e5b141f8a5d0e43561f4b6"
|
||||
"checksum syn 0.15.18 (registry+https://github.com/rust-lang/crates.io-index)" = "90c39a061e2f412a9f869540471ab679e85e50c6b05604daf28bc3060f75c430"
|
||||
"checksum serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd"
|
||||
"checksum serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "4b133a43a1ecd55d4086bd5b4dc6c1751c68b1bfbeba7a5040442022c7e7c02e"
|
||||
"checksum serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)" = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2"
|
||||
"checksum skeptic 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6fb8ed853fdc19ce09752d63f3a2e5b5158aeb261520cd75eb618bd60305165"
|
||||
"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
|
||||
"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
|
||||
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
||||
"checksum walkdir 2.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0ffb549f212c31e19f3667c55a7f515b983a84aef10fd0a4d1f9c125425115f3"
|
||||
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
|
||||
"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
|
||||
"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
|
||||
"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e"
|
||||
"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
|
||||
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab"
|
||||
"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
|
||||
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
|
@ -39,7 +39,7 @@ build = "build.rs"
|
||||
name = "mos6502"
|
||||
|
||||
[dependencies]
|
||||
bitflags = "0.9.1"
|
||||
bitflags = "1"
|
||||
log = "0.4.6"
|
||||
|
||||
[dependencies.num]
|
||||
|
@ -73,21 +73,19 @@ impl Add<CheckedAddressDiff> for Address {
|
||||
}
|
||||
|
||||
impl Address {
|
||||
pub fn to_u16(&self) -> u16 {
|
||||
match *self {
|
||||
Address(address_) => address_,
|
||||
}
|
||||
pub fn to_u16(self) -> u16 {
|
||||
self.0
|
||||
}
|
||||
|
||||
pub fn to_usize(&self) -> usize {
|
||||
pub fn to_usize(self) -> usize {
|
||||
self.to_u16() as usize
|
||||
}
|
||||
|
||||
pub fn get_page_number(&self) -> u8 {
|
||||
pub fn get_page_number(self) -> u8 {
|
||||
(self.to_u16() & 0xff00 >> 8) as u8
|
||||
}
|
||||
|
||||
pub fn get_offset(&self) -> u8 {
|
||||
pub fn get_offset(self) -> u8 {
|
||||
(self.to_u16() & 0x00ff) as u8
|
||||
}
|
||||
}
|
||||
|
365
src/cpu.rs
365
src/cpu.rs
@ -30,9 +30,6 @@ use instruction;
|
||||
use instruction::{DecodedInstr, Instruction, OpInput};
|
||||
use memory::Memory;
|
||||
use registers::{Registers, StackPointer, Status, StatusArgs};
|
||||
use registers::{
|
||||
PS_CARRY, PS_DECIMAL_MODE, PS_DISABLE_INTERRUPTS, PS_NEGATIVE, PS_OVERFLOW, PS_ZERO,
|
||||
};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct CPU {
|
||||
@ -137,7 +134,7 @@ impl CPU {
|
||||
let bit6 = 0 != (0x40 & res);
|
||||
|
||||
self.registers.status.set_with_mask(
|
||||
PS_ZERO | PS_NEGATIVE | PS_OVERFLOW,
|
||||
Status::PS_ZERO | Status::PS_NEGATIVE | Status::PS_OVERFLOW,
|
||||
Status::new(StatusArgs {
|
||||
zero: is_zero,
|
||||
negative: bit7,
|
||||
@ -169,16 +166,16 @@ impl CPU {
|
||||
}
|
||||
|
||||
(Instruction::CLC, OpInput::UseImplied) => {
|
||||
self.registers.status.and(!PS_CARRY);
|
||||
self.registers.status.and(!Status::PS_CARRY);
|
||||
}
|
||||
(Instruction::CLD, OpInput::UseImplied) => {
|
||||
self.registers.status.and(!PS_DECIMAL_MODE);
|
||||
self.registers.status.and(!Status::PS_DECIMAL_MODE);
|
||||
}
|
||||
(Instruction::CLI, OpInput::UseImplied) => {
|
||||
self.registers.status.and(!PS_DISABLE_INTERRUPTS);
|
||||
self.registers.status.and(!Status::PS_DISABLE_INTERRUPTS);
|
||||
}
|
||||
(Instruction::CLV, OpInput::UseImplied) => {
|
||||
self.registers.status.and(!PS_OVERFLOW);
|
||||
self.registers.status.and(!Status::PS_OVERFLOW);
|
||||
}
|
||||
|
||||
(Instruction::CMP, OpInput::UseImmediate(val)) => {
|
||||
@ -348,13 +345,13 @@ impl CPU {
|
||||
}
|
||||
|
||||
(Instruction::SEC, OpInput::UseImplied) => {
|
||||
self.registers.status.or(PS_CARRY);
|
||||
self.registers.status.or(Status::PS_CARRY);
|
||||
}
|
||||
(Instruction::SED, OpInput::UseImplied) => {
|
||||
self.registers.status.or(PS_DECIMAL_MODE);
|
||||
self.registers.status.or(Status::PS_DECIMAL_MODE);
|
||||
}
|
||||
(Instruction::SEI, OpInput::UseImplied) => {
|
||||
self.registers.status.or(PS_DISABLE_INTERRUPTS);
|
||||
self.registers.status.or(Status::PS_DISABLE_INTERRUPTS);
|
||||
}
|
||||
|
||||
(Instruction::STA, OpInput::UseAddress(addr)) => {
|
||||
@ -419,7 +416,7 @@ impl CPU {
|
||||
let is_negative = value < 0;
|
||||
|
||||
status.set_with_mask(
|
||||
PS_ZERO | PS_NEGATIVE,
|
||||
Status::PS_ZERO | Status::PS_NEGATIVE,
|
||||
Status::new(StatusArgs {
|
||||
zero: is_zero,
|
||||
negative: is_negative,
|
||||
@ -434,7 +431,7 @@ impl CPU {
|
||||
let shifted = (*p_val & !(1 << 7)) << 1;
|
||||
*p_val = shifted;
|
||||
status.set_with_mask(
|
||||
PS_CARRY,
|
||||
Status::PS_CARRY,
|
||||
Status::new(StatusArgs {
|
||||
carry: is_bit_7_set,
|
||||
..StatusArgs::none()
|
||||
@ -448,7 +445,7 @@ impl CPU {
|
||||
let is_bit_0_set = (*p_val & mask) == mask;
|
||||
*p_val >>= 1;
|
||||
status.set_with_mask(
|
||||
PS_CARRY,
|
||||
Status::PS_CARRY,
|
||||
Status::new(StatusArgs {
|
||||
carry: is_bit_0_set,
|
||||
..StatusArgs::none()
|
||||
@ -458,13 +455,13 @@ impl CPU {
|
||||
}
|
||||
|
||||
fn rotate_left_with_flags(p_val: &mut u8, status: &mut Status) {
|
||||
let is_carry_set = status.contains(PS_CARRY);
|
||||
let is_carry_set = status.contains(Status::PS_CARRY);
|
||||
let mask = 1 << 7;
|
||||
let is_bit_7_set = (*p_val & mask) == mask;
|
||||
let shifted = (*p_val & !(1 << 7)) << 1;
|
||||
*p_val = shifted + if is_carry_set { 1 } else { 0 };
|
||||
status.set_with_mask(
|
||||
PS_CARRY,
|
||||
Status::PS_CARRY,
|
||||
Status::new(StatusArgs {
|
||||
carry: is_bit_7_set,
|
||||
..StatusArgs::none()
|
||||
@ -474,13 +471,13 @@ impl CPU {
|
||||
}
|
||||
|
||||
fn rotate_right_with_flags(p_val: &mut u8, status: &mut Status) {
|
||||
let is_carry_set = status.contains(PS_CARRY);
|
||||
let is_carry_set = status.contains(Status::PS_CARRY);
|
||||
let mask = 1;
|
||||
let is_bit_0_set = (*p_val & mask) == mask;
|
||||
let shifted = *p_val >> 1;
|
||||
*p_val = shifted + if is_carry_set { 1 << 7 } else { 0 };
|
||||
status.set_with_mask(
|
||||
PS_CARRY,
|
||||
Status::PS_CARRY,
|
||||
Status::new(StatusArgs {
|
||||
carry: is_bit_0_set,
|
||||
..StatusArgs::none()
|
||||
@ -519,12 +516,12 @@ impl CPU {
|
||||
}
|
||||
|
||||
fn add_with_carry(&mut self, value: i8) {
|
||||
if self.registers.status.contains(PS_DECIMAL_MODE) {
|
||||
if self.registers.status.contains(Status::PS_DECIMAL_MODE) {
|
||||
// TODO akeeton: Implement binary-coded decimal.
|
||||
debug!("binary-coded decimal not implemented for add_with_carry");
|
||||
} else {
|
||||
let a_before: i8 = self.registers.accumulator;
|
||||
let c_before: i8 = if self.registers.status.contains(PS_CARRY) {
|
||||
let c_before: i8 = if self.registers.status.contains(Status::PS_CARRY) {
|
||||
1
|
||||
} else {
|
||||
0
|
||||
@ -541,7 +538,7 @@ impl CPU {
|
||||
let did_overflow = (a_before < 0 && value < 0 && a_after >= 0)
|
||||
|| (a_before > 0 && value > 0 && a_after <= 0);
|
||||
|
||||
let mask = PS_CARRY | PS_OVERFLOW;
|
||||
let mask = Status::PS_CARRY | Status::PS_OVERFLOW;
|
||||
|
||||
self.registers.status.set_with_mask(
|
||||
mask,
|
||||
@ -565,7 +562,7 @@ impl CPU {
|
||||
|
||||
// TODO: Implement binary-coded decimal
|
||||
fn subtract_with_carry(&mut self, value: i8) {
|
||||
if self.registers.status.contains(PS_DECIMAL_MODE) {
|
||||
if self.registers.status.contains(Status::PS_DECIMAL_MODE) {
|
||||
debug!(
|
||||
"binary-coded decimal not implemented for \
|
||||
subtract_with_carry"
|
||||
@ -574,7 +571,7 @@ impl CPU {
|
||||
// A - M - (1 - C)
|
||||
|
||||
// nc -- 'not carry'
|
||||
let nc: i8 = if self.registers.status.contains(PS_CARRY) {
|
||||
let nc: i8 = if self.registers.status.contains(Status::PS_CARRY) {
|
||||
0
|
||||
} else {
|
||||
1
|
||||
@ -600,7 +597,7 @@ impl CPU {
|
||||
|
||||
let did_overflow = over || under;
|
||||
|
||||
let mask = PS_CARRY | PS_OVERFLOW;
|
||||
let mask = Status::PS_CARRY | Status::PS_OVERFLOW;
|
||||
|
||||
self.registers.status.set_with_mask(
|
||||
mask,
|
||||
@ -624,7 +621,7 @@ impl CPU {
|
||||
let is_zero = value_new == 0;
|
||||
|
||||
self.registers.status.set_with_mask(
|
||||
PS_NEGATIVE | PS_ZERO,
|
||||
Status::PS_NEGATIVE | Status::PS_ZERO,
|
||||
Status::new(StatusArgs {
|
||||
negative: is_negative,
|
||||
zero: is_zero,
|
||||
@ -643,43 +640,43 @@ impl CPU {
|
||||
}
|
||||
|
||||
fn branch_if_carry_clear(&mut self, addr: Address) {
|
||||
if !self.registers.status.contains(PS_CARRY) {
|
||||
if !self.registers.status.contains(Status::PS_CARRY) {
|
||||
self.registers.program_counter = addr;
|
||||
}
|
||||
}
|
||||
|
||||
fn branch_if_carry_set(&mut self, addr: Address) {
|
||||
if self.registers.status.contains(PS_CARRY) {
|
||||
if self.registers.status.contains(Status::PS_CARRY) {
|
||||
self.registers.program_counter = addr;
|
||||
}
|
||||
}
|
||||
|
||||
fn branch_if_equal(&mut self, addr: Address) {
|
||||
if self.registers.status.contains(PS_ZERO) {
|
||||
if self.registers.status.contains(Status::PS_ZERO) {
|
||||
self.registers.program_counter = addr;
|
||||
}
|
||||
}
|
||||
|
||||
fn branch_if_minus(&mut self, addr: Address) {
|
||||
if self.registers.status.contains(PS_NEGATIVE) {
|
||||
if self.registers.status.contains(Status::PS_NEGATIVE) {
|
||||
self.registers.program_counter = addr;
|
||||
}
|
||||
}
|
||||
|
||||
fn branch_if_positive(&mut self, addr: Address) {
|
||||
if !self.registers.status.contains(PS_NEGATIVE) {
|
||||
if !self.registers.status.contains(Status::PS_NEGATIVE) {
|
||||
self.registers.program_counter = addr;
|
||||
}
|
||||
}
|
||||
|
||||
fn branch_if_overflow_clear(&mut self, addr: Address) {
|
||||
if !self.registers.status.contains(PS_OVERFLOW) {
|
||||
if !self.registers.status.contains(Status::PS_OVERFLOW) {
|
||||
self.registers.program_counter = addr;
|
||||
}
|
||||
}
|
||||
|
||||
fn branch_if_overflow_set(&mut self, addr: Address) {
|
||||
if self.registers.status.contains(PS_OVERFLOW) {
|
||||
if self.registers.status.contains(Status::PS_OVERFLOW) {
|
||||
self.registers.program_counter = addr;
|
||||
}
|
||||
}
|
||||
@ -693,22 +690,22 @@ impl CPU {
|
||||
// The N flag contains most significant bit of the subtraction result.
|
||||
fn compare(&mut self, r: i8, val: u8) {
|
||||
if r as u8 >= val as u8 {
|
||||
self.registers.status.insert(PS_CARRY);
|
||||
self.registers.status.insert(Status::PS_CARRY);
|
||||
} else {
|
||||
self.registers.status.remove(PS_CARRY);
|
||||
self.registers.status.remove(Status::PS_CARRY);
|
||||
}
|
||||
|
||||
if r as i8 == val as i8 {
|
||||
self.registers.status.insert(PS_ZERO);
|
||||
self.registers.status.insert(Status::PS_ZERO);
|
||||
} else {
|
||||
self.registers.status.remove(PS_ZERO);
|
||||
self.registers.status.remove(Status::PS_ZERO);
|
||||
}
|
||||
|
||||
let diff: i8 = r.wrapping_sub(val as i8);
|
||||
if diff < 0 {
|
||||
self.registers.status.insert(PS_NEGATIVE);
|
||||
self.registers.status.insert(Status::PS_NEGATIVE);
|
||||
} else {
|
||||
self.registers.status.remove(PS_NEGATIVE);
|
||||
self.registers.status.remove(Status::PS_NEGATIVE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -775,71 +772,71 @@ mod tests {
|
||||
|
||||
cpu.add_with_carry(1);
|
||||
assert_eq!(cpu.registers.accumulator, 1);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.add_with_carry(-1);
|
||||
assert_eq!(cpu.registers.accumulator, 0);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.add_with_carry(1);
|
||||
assert_eq!(cpu.registers.accumulator, 2);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
let mut cpu = CPU::new();
|
||||
|
||||
cpu.add_with_carry(127);
|
||||
assert_eq!(cpu.registers.accumulator, 127);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.add_with_carry(-127);
|
||||
assert_eq!(cpu.registers.accumulator, 0);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.registers.status.remove(PS_CARRY);
|
||||
cpu.registers.status.remove(Status::PS_CARRY);
|
||||
cpu.add_with_carry(-128);
|
||||
assert_eq!(cpu.registers.accumulator, -128);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.add_with_carry(127);
|
||||
assert_eq!(cpu.registers.accumulator, -1);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
let mut cpu = CPU::new();
|
||||
|
||||
cpu.add_with_carry(127);
|
||||
assert_eq!(cpu.registers.accumulator, 127);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.add_with_carry(1);
|
||||
assert_eq!(cpu.registers.accumulator, -128);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), true);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -849,26 +846,26 @@ mod tests {
|
||||
cpu.registers.accumulator = 0;
|
||||
cpu.and(-1);
|
||||
assert_eq!(cpu.registers.accumulator, 0);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
|
||||
cpu.registers.accumulator = -1;
|
||||
cpu.and(0);
|
||||
assert_eq!(cpu.registers.accumulator, 0);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
|
||||
cpu.registers.accumulator = -1;
|
||||
cpu.and(0x0f);
|
||||
assert_eq!(cpu.registers.accumulator, 0x0f);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
|
||||
cpu.registers.accumulator = -1;
|
||||
cpu.and(-128);
|
||||
assert_eq!(cpu.registers.accumulator, -128);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -880,55 +877,55 @@ mod tests {
|
||||
|
||||
cpu.subtract_with_carry(1);
|
||||
assert_eq!(cpu.registers.accumulator, -1);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.execute_instruction((Instruction::SEC, OpInput::UseImplied));
|
||||
cpu.registers.accumulator = -128;
|
||||
cpu.subtract_with_carry(1);
|
||||
assert_eq!(cpu.registers.accumulator, 127);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), true);
|
||||
|
||||
cpu.execute_instruction((Instruction::SEC, OpInput::UseImplied));
|
||||
cpu.registers.accumulator = 127;
|
||||
cpu.subtract_with_carry(-1);
|
||||
assert_eq!(cpu.registers.accumulator, -128);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), true);
|
||||
|
||||
cpu.execute_instruction((Instruction::CLC, OpInput::UseImplied));
|
||||
cpu.registers.accumulator = -64;
|
||||
cpu.subtract_with_carry(64);
|
||||
assert_eq!(cpu.registers.accumulator, 127);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), true);
|
||||
|
||||
cpu.execute_instruction((Instruction::SEC, OpInput::UseImplied));
|
||||
cpu.registers.accumulator = 0;
|
||||
cpu.subtract_with_carry(-128);
|
||||
assert_eq!(cpu.registers.accumulator, -128);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), true);
|
||||
|
||||
cpu.execute_instruction((Instruction::CLC, OpInput::UseImplied));
|
||||
cpu.registers.accumulator = 0;
|
||||
cpu.subtract_with_carry(127);
|
||||
assert_eq!(cpu.registers.accumulator, -128);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -940,25 +937,25 @@ mod tests {
|
||||
|
||||
cpu.decrement_memory(addr);
|
||||
assert_eq!(cpu.memory.get_byte(addr), 4);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
|
||||
cpu.decrement_memory(addr);
|
||||
assert_eq!(cpu.memory.get_byte(addr), 3);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
|
||||
cpu.decrement_memory(addr);
|
||||
cpu.decrement_memory(addr);
|
||||
cpu.decrement_memory(addr);
|
||||
assert_eq!(cpu.memory.get_byte(addr), 0);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
|
||||
cpu.decrement_memory(addr);
|
||||
assert_eq!(cpu.memory.get_byte(addr) as i8, -1);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -969,34 +966,34 @@ mod tests {
|
||||
cpu.execute_instruction((Instruction::LDA, OpInput::UseImmediate(0)));
|
||||
cpu.execute_instruction((Instruction::LSR, OpInput::UseImplied));
|
||||
assert_eq!(cpu.registers.accumulator, 0);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.execute_instruction((Instruction::LDA, OpInput::UseImmediate(1)));
|
||||
cpu.execute_instruction((Instruction::LSR, OpInput::UseImplied));
|
||||
assert_eq!(cpu.registers.accumulator, 0);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.execute_instruction((Instruction::LDA, OpInput::UseImmediate(255)));
|
||||
cpu.execute_instruction((Instruction::LSR, OpInput::UseImplied));
|
||||
assert_eq!(cpu.registers.accumulator, 0x7F);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.execute_instruction((Instruction::LDA, OpInput::UseImmediate(254)));
|
||||
cpu.execute_instruction((Instruction::LSR, OpInput::UseImplied));
|
||||
assert_eq!(cpu.registers.accumulator, 0x7F);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -1005,25 +1002,25 @@ mod tests {
|
||||
|
||||
cpu.dec_x();
|
||||
assert_eq!(cpu.registers.index_x, -1);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.dec_x();
|
||||
assert_eq!(cpu.registers.index_x, -2);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.load_x_register(5);
|
||||
cpu.dec_x();
|
||||
assert_eq!(cpu.registers.index_x, 4);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.dec_x();
|
||||
cpu.dec_x();
|
||||
@ -1031,17 +1028,17 @@ mod tests {
|
||||
cpu.dec_x();
|
||||
|
||||
assert_eq!(cpu.registers.index_x, 0);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
|
||||
cpu.dec_x();
|
||||
assert_eq!(cpu.registers.index_x, -1);
|
||||
assert_eq!(cpu.registers.status.contains(PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(PS_OVERFLOW), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_CARRY), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_ZERO), false);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_NEGATIVE), true);
|
||||
assert_eq!(cpu.registers.status.contains(Status::PS_OVERFLOW), false);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -1086,7 +1083,7 @@ mod tests {
|
||||
cpu.branch_if_equal(Address(0xABCD));
|
||||
assert_eq!(cpu.registers.program_counter, Address(0));
|
||||
|
||||
cpu.registers.status.or(PS_ZERO);
|
||||
cpu.registers.status.or(Status::PS_ZERO);
|
||||
cpu.branch_if_equal(Address(0xABCD));
|
||||
assert_eq!(cpu.registers.program_counter, Address(0xABCD));
|
||||
}
|
||||
@ -1105,7 +1102,7 @@ mod tests {
|
||||
{
|
||||
let mut cpu = CPU::new();
|
||||
|
||||
cpu.registers.status.or(PS_NEGATIVE);
|
||||
cpu.registers.status.or(Status::PS_NEGATIVE);
|
||||
let registers_before = cpu.registers;
|
||||
|
||||
cpu.branch_if_minus(Address(0xABCD));
|
||||
@ -1118,11 +1115,11 @@ mod tests {
|
||||
fn branch_if_positive_test() {
|
||||
let mut cpu = CPU::new();
|
||||
|
||||
cpu.registers.status.insert(PS_NEGATIVE);
|
||||
cpu.registers.status.insert(Status::PS_NEGATIVE);
|
||||
cpu.branch_if_positive(Address(0xABCD));
|
||||
assert_eq!(cpu.registers.program_counter, Address(0));
|
||||
|
||||
cpu.registers.status.remove(PS_NEGATIVE);
|
||||
cpu.registers.status.remove(Status::PS_NEGATIVE);
|
||||
cpu.branch_if_positive(Address(0xABCD));
|
||||
assert_eq!(cpu.registers.program_counter, Address(0xABCD));
|
||||
}
|
||||
@ -1131,11 +1128,11 @@ mod tests {
|
||||
fn branch_if_overflow_clear_test() {
|
||||
let mut cpu = CPU::new();
|
||||
|
||||
cpu.registers.status.insert(PS_OVERFLOW);
|
||||
cpu.registers.status.insert(Status::PS_OVERFLOW);
|
||||
cpu.branch_if_overflow_clear(Address(0xABCD));
|
||||
assert_eq!(cpu.registers.program_counter, Address(0));
|
||||
|
||||
cpu.registers.status.remove(PS_OVERFLOW);
|
||||
cpu.registers.status.remove(Status::PS_OVERFLOW);
|
||||
cpu.branch_if_overflow_clear(Address(0xABCD));
|
||||
assert_eq!(cpu.registers.program_counter, Address(0xABCD));
|
||||
}
|
||||
@ -1147,7 +1144,7 @@ mod tests {
|
||||
cpu.branch_if_overflow_set(Address(0xABCD));
|
||||
assert_eq!(cpu.registers.program_counter, Address(0));
|
||||
|
||||
cpu.registers.status.insert(PS_OVERFLOW);
|
||||
cpu.registers.status.insert(Status::PS_OVERFLOW);
|
||||
cpu.branch_if_overflow_set(Address(0xABCD));
|
||||
assert_eq!(cpu.registers.program_counter, Address(0xABCD));
|
||||
}
|
||||
@ -1162,44 +1159,44 @@ mod tests {
|
||||
cpu.execute_instruction((load_instruction, OpInput::UseImmediate(127)));
|
||||
|
||||
compare(&mut cpu, 127);
|
||||
assert!(cpu.registers.status.contains(PS_ZERO));
|
||||
assert!(cpu.registers.status.contains(PS_CARRY));
|
||||
assert!(!cpu.registers.status.contains(PS_NEGATIVE));
|
||||
assert!(cpu.registers.status.contains(Status::PS_ZERO));
|
||||
assert!(cpu.registers.status.contains(Status::PS_CARRY));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||
|
||||
cpu.execute_instruction((load_instruction, OpInput::UseImmediate(127)));
|
||||
|
||||
compare(&mut cpu, 1);
|
||||
assert!(!cpu.registers.status.contains(PS_ZERO));
|
||||
assert!(cpu.registers.status.contains(PS_CARRY));
|
||||
assert!(!cpu.registers.status.contains(PS_NEGATIVE));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_ZERO));
|
||||
assert!(cpu.registers.status.contains(Status::PS_CARRY));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||
|
||||
cpu.execute_instruction((load_instruction, OpInput::UseImmediate(1)));
|
||||
|
||||
compare(&mut cpu, 2);
|
||||
assert!(!cpu.registers.status.contains(PS_ZERO));
|
||||
assert!(!cpu.registers.status.contains(PS_CARRY));
|
||||
assert!(cpu.registers.status.contains(PS_NEGATIVE));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_ZERO));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_CARRY));
|
||||
assert!(cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||
|
||||
cpu.execute_instruction((load_instruction, OpInput::UseImmediate(20)));
|
||||
|
||||
compare(&mut cpu, -50i8 as u8);
|
||||
assert!(!cpu.registers.status.contains(PS_ZERO));
|
||||
assert!(!cpu.registers.status.contains(PS_CARRY));
|
||||
assert!(!cpu.registers.status.contains(PS_NEGATIVE));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_ZERO));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_CARRY));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||
|
||||
cpu.execute_instruction((load_instruction, OpInput::UseImmediate(1)));
|
||||
|
||||
compare(&mut cpu, -1i8 as u8);
|
||||
assert!(!cpu.registers.status.contains(PS_ZERO));
|
||||
assert!(!cpu.registers.status.contains(PS_CARRY));
|
||||
assert!(!cpu.registers.status.contains(PS_NEGATIVE));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_ZERO));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_CARRY));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||
|
||||
cpu.execute_instruction((load_instruction, OpInput::UseImmediate(127)));
|
||||
|
||||
compare(&mut cpu, -128i8 as u8);
|
||||
assert!(!cpu.registers.status.contains(PS_ZERO));
|
||||
assert!(!cpu.registers.status.contains(PS_CARRY));
|
||||
assert!(cpu.registers.status.contains(PS_NEGATIVE));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_ZERO));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_CARRY));
|
||||
assert!(cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -1246,15 +1243,15 @@ mod tests {
|
||||
assert_eq!(cpu.registers.accumulator, a_after as i8);
|
||||
|
||||
if a_after == 0 {
|
||||
assert!(cpu.registers.status.contains(PS_ZERO));
|
||||
assert!(cpu.registers.status.contains(Status::PS_ZERO));
|
||||
} else {
|
||||
assert!(!cpu.registers.status.contains(PS_ZERO));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_ZERO));
|
||||
}
|
||||
|
||||
if (a_after as i8) < 0 {
|
||||
assert!(cpu.registers.status.contains(PS_NEGATIVE));
|
||||
assert!(cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||
} else {
|
||||
assert!(!cpu.registers.status.contains(PS_NEGATIVE));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1274,15 +1271,15 @@ mod tests {
|
||||
assert_eq!(cpu.registers.accumulator, a_after as i8);
|
||||
|
||||
if a_after == 0 {
|
||||
assert!(cpu.registers.status.contains(PS_ZERO));
|
||||
assert!(cpu.registers.status.contains(Status::PS_ZERO));
|
||||
} else {
|
||||
assert!(!cpu.registers.status.contains(PS_ZERO));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_ZERO));
|
||||
}
|
||||
|
||||
if (a_after as i8) < 0 {
|
||||
assert!(cpu.registers.status.contains(PS_NEGATIVE));
|
||||
assert!(cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||
} else {
|
||||
assert!(!cpu.registers.status.contains(PS_NEGATIVE));
|
||||
assert!(!cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -49,17 +49,11 @@ pub const IRQ_INTERRUPT_VECTOR_HI: Address = Address(0xFFFF);
|
||||
const MEMORY_SIZE: usize = (ADDR_HI_BARE - ADDR_LO_BARE) as usize + 1usize;
|
||||
|
||||
// FIXME: Should this use indirection for `bytes`?
|
||||
#[derive(Copy)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct Memory {
|
||||
bytes: [u8; MEMORY_SIZE],
|
||||
}
|
||||
|
||||
impl Clone for Memory {
|
||||
fn clone(&self) -> Self {
|
||||
*self
|
||||
}
|
||||
}
|
||||
|
||||
impl Memory {
|
||||
pub fn new() -> Memory {
|
||||
Memory { bytes: [0; MEMORY_SIZE] }
|
||||
@ -73,11 +67,8 @@ impl Memory {
|
||||
&mut self.bytes[address.to_usize()]
|
||||
}
|
||||
|
||||
pub fn get_slice(&self, Address(start): Address, AddressDiff(diff): AddressDiff) -> &[u8] {
|
||||
let start = start as usize;
|
||||
let diff = diff as usize;
|
||||
let end = start + diff;
|
||||
&self.bytes[start..end]
|
||||
pub fn get_slice(&self, start: Address, diff: AddressDiff) -> &[u8] {
|
||||
&self.bytes[start.to_usize()..(start + diff).to_usize()]
|
||||
}
|
||||
|
||||
// Sets the byte at the given address to the given value and returns the
|
||||
@ -88,20 +79,35 @@ impl Memory {
|
||||
old_value
|
||||
}
|
||||
|
||||
pub fn set_bytes(&mut self, Address(start): Address, values: &[u8]) {
|
||||
let start = start as usize;
|
||||
pub fn set_bytes(&mut self, start: Address, values: &[u8]) {
|
||||
let start = start.to_usize();
|
||||
|
||||
// This panics if the range is invalid
|
||||
let end = start + values.len();
|
||||
let slice = &mut self.bytes[start..end];
|
||||
|
||||
// JAM: Is this the best way to do this copy?
|
||||
for (dest, src) in slice.iter_mut().zip(values.iter()) {
|
||||
*dest = *src;
|
||||
}
|
||||
self.bytes[start..end].copy_from_slice(values);
|
||||
}
|
||||
|
||||
pub fn is_stack_address(address: &Address) -> bool {
|
||||
STACK_ADDRESS_LO <= *address && *address <= STACK_ADDRESS_HI
|
||||
pub fn is_stack_address(address: Address) -> bool {
|
||||
(STACK_ADDRESS_LO..=STACK_ADDRESS_HI).contains(&address)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_memory_set_bytes() {
|
||||
let mut memory = Memory::new();
|
||||
memory.set_bytes(Address(0x0100), &[1, 2, 3, 4, 5]);
|
||||
assert_eq!(memory.get_slice(Address(0x00FF), AddressDiff(7)), &[0, 1, 2, 3, 4, 5, 0]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_memory_overflow_panic() {
|
||||
let mut memory = Memory::new();
|
||||
memory.set_bytes(Address(0xFFFE), &[1, 2, 3]);
|
||||
}
|
||||
}
|
||||
|
@ -100,28 +100,28 @@ impl Status {
|
||||
let mut out = Status::empty();
|
||||
|
||||
if negative {
|
||||
out |= PS_NEGATIVE
|
||||
out |= Status::PS_NEGATIVE
|
||||
}
|
||||
if overflow {
|
||||
out |= PS_OVERFLOW
|
||||
out |= Status::PS_OVERFLOW
|
||||
}
|
||||
if unused {
|
||||
out |= PS_UNUSED
|
||||
out |= Status::PS_UNUSED
|
||||
}
|
||||
if brk {
|
||||
out |= PS_BRK
|
||||
out |= Status::PS_BRK
|
||||
}
|
||||
if decimal_mode {
|
||||
out |= PS_DECIMAL_MODE
|
||||
out |= Status::PS_DECIMAL_MODE
|
||||
}
|
||||
if disable_interrupts {
|
||||
out |= PS_DISABLE_INTERRUPTS
|
||||
out |= Status::PS_DISABLE_INTERRUPTS
|
||||
}
|
||||
if zero {
|
||||
out |= PS_ZERO
|
||||
out |= Status::PS_ZERO
|
||||
}
|
||||
if carry {
|
||||
out |= PS_CARRY
|
||||
out |= Status::PS_CARRY
|
||||
}
|
||||
|
||||
out
|
||||
@ -144,21 +144,18 @@ impl Status {
|
||||
pub struct StackPointer(pub u8);
|
||||
|
||||
impl StackPointer {
|
||||
pub fn to_address(&self) -> Address {
|
||||
let StackPointer(sp) = *self;
|
||||
STACK_ADDRESS_LO + AddressDiff(i32::from(sp))
|
||||
pub fn to_address(self) -> Address {
|
||||
STACK_ADDRESS_LO + AddressDiff(i32::from(self.0))
|
||||
}
|
||||
|
||||
// JAM: FIXME: Should we prevent overflow here? What would a 6502 do?
|
||||
|
||||
pub fn decrement(&mut self) {
|
||||
let StackPointer(val) = *self;
|
||||
*self = StackPointer(val - 1);
|
||||
self.0 -= 1;
|
||||
}
|
||||
|
||||
pub fn increment(&mut self) {
|
||||
let StackPointer(val) = *self;
|
||||
*self = StackPointer(val + 1);
|
||||
self.0 += 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user