Started work on tui debugger!
This commit is contained in:
parent
b1b9c64468
commit
0ec54d6672
|
@ -2,6 +2,24 @@
|
|||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "ahash"
|
||||
version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
"version_check",
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "allocator-api2"
|
||||
version = "0.2.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
|
||||
|
||||
[[package]]
|
||||
name = "anstream"
|
||||
version = "0.6.13"
|
||||
|
@ -117,6 +135,21 @@ version = "3.14.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
|
||||
|
||||
[[package]]
|
||||
name = "cassowary"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
|
||||
|
||||
[[package]]
|
||||
name = "castaway"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a17ed5635fc8536268e5d4de1e22e81ac34419e5f052d4d51f4e01dcc263fcc"
|
||||
dependencies = [
|
||||
"rustversion",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.83"
|
||||
|
@ -178,6 +211,44 @@ version = "1.0.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
|
||||
|
||||
[[package]]
|
||||
name = "compact_str"
|
||||
version = "0.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f"
|
||||
dependencies = [
|
||||
"castaway",
|
||||
"cfg-if",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"static_assertions",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossterm"
|
||||
version = "0.27.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df"
|
||||
dependencies = [
|
||||
"bitflags 2.4.2",
|
||||
"crossterm_winapi",
|
||||
"libc",
|
||||
"mio",
|
||||
"parking_lot",
|
||||
"signal-hook",
|
||||
"signal-hook-mio",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossterm_winapi"
|
||||
version = "0.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
|
||||
dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cty"
|
||||
version = "0.2.2"
|
||||
|
@ -199,6 +270,12 @@ version = "1.2.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.1"
|
||||
|
@ -324,7 +401,9 @@ dependencies = [
|
|||
"bdf",
|
||||
"bitvec",
|
||||
"clap",
|
||||
"crossterm",
|
||||
"minifb",
|
||||
"ratatui",
|
||||
"serde",
|
||||
"toml",
|
||||
]
|
||||
|
@ -334,6 +413,10 @@ name = "hashbrown"
|
|||
version = "0.14.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"allocator-api2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
|
@ -363,6 +446,21 @@ dependencies = [
|
|||
"web-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.67"
|
||||
|
@ -402,7 +500,7 @@ checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607"
|
|||
dependencies = [
|
||||
"bitflags 2.4.2",
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
"redox_syscall 0.4.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -411,12 +509,31 @@ version = "0.4.13"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"scopeguard",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
|
||||
|
||||
[[package]]
|
||||
name = "lru"
|
||||
version = "0.12.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc"
|
||||
dependencies = [
|
||||
"hashbrown",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.7.1"
|
||||
|
@ -458,6 +575,18 @@ dependencies = [
|
|||
"x11-dl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mio"
|
||||
version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"log",
|
||||
"wasi",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nix"
|
||||
version = "0.24.3"
|
||||
|
@ -488,6 +617,35 @@ dependencies = [
|
|||
"sdl2-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.12.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
|
||||
dependencies = [
|
||||
"lock_api",
|
||||
"parking_lot_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot_core"
|
||||
version = "0.9.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"redox_syscall 0.5.2",
|
||||
"smallvec",
|
||||
"windows-targets 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "paste"
|
||||
version = "1.0.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
version = "0.2.13"
|
||||
|
@ -530,6 +688,26 @@ version = "0.7.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
|
||||
|
||||
[[package]]
|
||||
name = "ratatui"
|
||||
version = "0.26.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f44c9e68fd46eda15c646fbb85e1040b657a58cdc8c98db1d97a55930d991eef"
|
||||
dependencies = [
|
||||
"bitflags 2.4.2",
|
||||
"cassowary",
|
||||
"compact_str",
|
||||
"crossterm",
|
||||
"itertools",
|
||||
"lru",
|
||||
"paste",
|
||||
"stability",
|
||||
"strum",
|
||||
"unicode-segmentation",
|
||||
"unicode-truncate",
|
||||
"unicode-width",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "raw-window-handle"
|
||||
version = "0.4.3"
|
||||
|
@ -548,6 +726,15 @@ dependencies = [
|
|||
"bitflags 1.3.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd"
|
||||
dependencies = [
|
||||
"bitflags 2.4.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "0.38.31"
|
||||
|
@ -561,12 +748,30 @@ dependencies = [
|
|||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
|
||||
|
||||
[[package]]
|
||||
name = "scoped-tls"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "sdl2"
|
||||
version = "0.35.2"
|
||||
|
@ -619,6 +824,36 @@ dependencies = [
|
|||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"signal-hook-registry",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-mio"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"mio",
|
||||
"signal-hook",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-registry"
|
||||
version = "1.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "slab"
|
||||
version = "0.4.9"
|
||||
|
@ -634,12 +869,50 @@ version = "1.13.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
|
||||
|
||||
[[package]]
|
||||
name = "stability"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2ff9eaf853dec4c8802325d8b6d3dffa86cc707fd7a1a4cdbf416e13b061787a"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "static_assertions"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||
|
||||
[[package]]
|
||||
name = "strum"
|
||||
version = "0.26.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29"
|
||||
dependencies = [
|
||||
"strum_macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strum_macros"
|
||||
version = "0.26.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"rustversion",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.48"
|
||||
|
@ -665,7 +938,7 @@ checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa"
|
|||
dependencies = [
|
||||
"cfg-if",
|
||||
"fastrand",
|
||||
"redox_syscall",
|
||||
"redox_syscall 0.4.1",
|
||||
"rustix",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
@ -730,6 +1003,28 @@ version = "1.0.12"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-segmentation"
|
||||
version = "1.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-truncate"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a5fbabedabe362c618c714dbefda9927b5afc8e2a8102f47f081089a9019226"
|
||||
dependencies = [
|
||||
"itertools",
|
||||
"unicode-width",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-width"
|
||||
version = "0.1.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d"
|
||||
|
||||
[[package]]
|
||||
name = "utf8parse"
|
||||
version = "0.2.1"
|
||||
|
@ -742,6 +1037,18 @@ version = "0.1.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.9.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.11.0+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.90"
|
||||
|
@ -1085,3 +1392,23 @@ name = "xml-rs"
|
|||
version = "0.8.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a"
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
|
|
@ -10,6 +10,8 @@ anyhow = "1.0.81"
|
|||
bdf = "0.6.0"
|
||||
bitvec = "1.0.1"
|
||||
clap = { version = "4.5.4", features = ["derive"] }
|
||||
crossterm = "0.27.0"
|
||||
minifb = "0.25.0"
|
||||
ratatui = "0.26.3"
|
||||
serde = { version = "1.0.197", features = ["serde_derive", "derive"] }
|
||||
toml = "0.8.12"
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
char_rom = "./src/roms/cozette.rom"
|
||||
rom = "./src/roms/george.rom"
|
||||
rom = "./src/roms/test.rom"
|
||||
|
||||
|
|
2
run.sh
2
run.sh
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
vasm6502_oldstyle ./src/george.asm -dotdir -wdc02 -ldots -Fbin -o ./src/george.rom;
|
||||
vasm6502_oldstyle ./src/roms/george.asm -dotdir -wdc02 -ldots -Fbin -o ./src/roms/george.rom;
|
||||
cargo run;
|
||||
# hexdump -C ./cpu_dump.bin;
|
||||
|
|
23
src/cpu.rs
23
src/cpu.rs
|
@ -1,8 +1,9 @@
|
|||
// use crate::error::{ExecutionError, GeorgeError, GeorgeErrorKind, MemoryError};
|
||||
use crate::instructions::{get_instruction, Instruction};
|
||||
use crate::memory::Mem;
|
||||
use crate::types::{Byte, Word};
|
||||
use std::cell::RefCell;
|
||||
use std::path::PathBuf;
|
||||
use std::rc::Rc;
|
||||
use std::str::FromStr;
|
||||
use std::sync::mpsc::Receiver;
|
||||
use std::sync::Arc;
|
||||
|
@ -157,9 +158,9 @@ impl Cpu {
|
|||
sleep(Duration::from_nanos(100));
|
||||
self.pending_cycles -= 1;
|
||||
}
|
||||
if !self.get_flag(StatusFlag::IrqDisable) && self.irq.recv().unwrap() {
|
||||
self.interrupt();
|
||||
}
|
||||
// if !self.get_flag(StatusFlag::IrqDisable) && self.irq.recv().unwrap() {
|
||||
// self.interrupt();
|
||||
// }
|
||||
let opcode = match self.read(self.pc) {
|
||||
Ok(byte) => byte,
|
||||
Err(_) => {
|
||||
|
@ -170,12 +171,12 @@ impl Cpu {
|
|||
let instruction = get_instruction(opcode);
|
||||
match instruction {
|
||||
Instruction::Valid(valid_instruction) => {
|
||||
//println!("a: {a:#04x}, x: {x:#04x}, y: {y:#04x}, pc: {pc:#06x}, sp: {s:#04x}, sr: {p:#010b}, irq: {irq:?}, nmi: {nmi:?}", a = self.a, x = self.x, y = self.y, pc = self.pc, s = self.s, p = self.p, irq = self.irq, nmi = self.nmi);
|
||||
//println!(
|
||||
// "Instruction: {:?}, {:#04x}",
|
||||
// valid_instruction.opcode, opcode
|
||||
//);
|
||||
//println!("");
|
||||
// println!("a: {a:#04x}, x: {x:#04x}, y: {y:#04x}, pc: {pc:#06x}, sp: {s:#04x}, sr: {p:#010b}, irq: {irq:?}, nmi: {nmi:?}", a = self.a, x = self.x, y = self.y, pc = self.pc, s = self.s, p = self.p, irq = self.irq, nmi = self.nmi);
|
||||
// println!(
|
||||
// "Instruction: {:?}, {:#04x}",
|
||||
// valid_instruction.opcode, opcode
|
||||
// );
|
||||
// println!("");
|
||||
self.pc += 1;
|
||||
match valid_instruction.opcode.call(self) {
|
||||
Ok(_) => {
|
||||
|
@ -196,7 +197,7 @@ impl Cpu {
|
|||
}
|
||||
};
|
||||
|
||||
println!("a: {a:#04x}, x: {x:#04x}, y: {y:#04x}, pc: {pc:#06x}, sp: {s:#04x}, sr: {p:#010b}, irq: {irq:?}, nmi: {nmi:?}", a = self.a, x = self.x, y = self.y, pc = self.pc, s = self.s, p = self.p, irq = self.irq.try_recv().unwrap_or_default(), nmi = self.nmi);
|
||||
// println!("a: {a:#04x}, x: {x:#04x}, y: {y:#04x}, pc: {pc:#06x}, sp: {s:#04x}, sr: {p:#010b}, irq: {irq:?}, nmi: {nmi:?}", a = self.a, x = self.x, y = self.y, pc = self.pc, s = self.s, p = self.p, irq = self.irq.try_recv().unwrap_or_default(), nmi = self.nmi);
|
||||
memory
|
||||
.dump(PathBuf::from_str("./cpu_dump.bin").unwrap())
|
||||
.unwrap();
|
||||
|
|
|
@ -1,10 +1,5 @@
|
|||
use minifb::{InputCallback, Key};
|
||||
use std::{
|
||||
path::PathBuf,
|
||||
process::exit,
|
||||
str::FromStr,
|
||||
sync::{Arc, Mutex},
|
||||
};
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use crate::memory::Mem;
|
||||
|
||||
|
|
66
src/main.rs
66
src/main.rs
|
@ -5,6 +5,7 @@ mod error;
|
|||
mod instructions;
|
||||
mod keyboard;
|
||||
mod memory;
|
||||
mod tui;
|
||||
mod types;
|
||||
mod video;
|
||||
|
||||
|
@ -13,18 +14,28 @@ use crate::keyboard::Keyboard;
|
|||
use crate::memory::Mem;
|
||||
use crate::video::Crtc;
|
||||
|
||||
use clap::Parser;
|
||||
// use clap::Parser;
|
||||
use minifb::{Scale, ScaleMode, Window, WindowOptions};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use std::process::exit;
|
||||
use std::str::FromStr;
|
||||
use std::sync::{mpsc, Mutex};
|
||||
use std::{path::PathBuf, sync::Arc, thread};
|
||||
use std::{
|
||||
fs::File,
|
||||
io::{stdout, Read, Result},
|
||||
path::PathBuf,
|
||||
str::FromStr,
|
||||
sync::{mpsc, Arc, Mutex},
|
||||
thread,
|
||||
};
|
||||
|
||||
use toml::Table;
|
||||
use crossterm::{
|
||||
event::{self, KeyCode, KeyEventKind},
|
||||
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
|
||||
ExecutableCommand,
|
||||
};
|
||||
|
||||
use ratatui::prelude::{CrosstermBackend, Terminal};
|
||||
|
||||
// use toml::Table;
|
||||
|
||||
//#[derive(Parser)]
|
||||
//struct Cli {
|
||||
|
@ -39,16 +50,21 @@ struct Config {
|
|||
rom: String,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
fn main() -> Result<()> {
|
||||
stdout().execute(EnterAlternateScreen)?;
|
||||
enable_raw_mode()?;
|
||||
let mut terminal = Terminal::new(CrosstermBackend::new(stdout()))?;
|
||||
terminal.clear()?;
|
||||
|
||||
let config: Config = match File::open("./config.toml") {
|
||||
Ok(mut file) => {
|
||||
let mut string = String::new();
|
||||
file.read_to_string(&mut string).unwrap();
|
||||
toml::from_str(string.as_str()).unwrap()
|
||||
}
|
||||
Err(_) => return,
|
||||
Err(_) => return Ok(()),
|
||||
};
|
||||
println!("{config:#?}");
|
||||
|
||||
let mut memory = Mem::new();
|
||||
let rom = match std::fs::File::open(config.rom) {
|
||||
Ok(file) => file,
|
||||
|
@ -58,23 +74,18 @@ fn main() {
|
|||
println!("{:?}", error);
|
||||
};
|
||||
|
||||
let (interrupt_tx, interrupt_rx) = mpsc::channel();
|
||||
let (window_tx, window_rx) = mpsc::channel();
|
||||
|
||||
memory
|
||||
.dump(PathBuf::from_str("./coredump.bin").unwrap())
|
||||
.unwrap();
|
||||
|
||||
let shared_memory = Arc::new(Mutex::new(memory));
|
||||
|
||||
let cpu_memory = shared_memory.clone();
|
||||
let display_memory = shared_memory.clone();
|
||||
let keyboard_memory = shared_memory.clone();
|
||||
|
||||
thread::spawn(move || {
|
||||
let mut cpu = Cpu::new(cpu_memory, interrupt_rx);
|
||||
cpu.reset().unwrap();
|
||||
cpu.execute();
|
||||
});
|
||||
let (interrupt_tx, interrupt_rx) = mpsc::channel();
|
||||
let (window_tx, window_rx) = mpsc::channel();
|
||||
|
||||
thread::spawn(move || {
|
||||
let mut screen = Crtc::new(
|
||||
|
@ -105,8 +116,23 @@ fn main() {
|
|||
|
||||
window.set_input_callback(Box::new(Keyboard::new(keyboard_memory)));
|
||||
|
||||
while window.is_open() {
|
||||
let cpu = Cpu::new(cpu_memory, interrupt_rx);
|
||||
let mut tui = tui::App::new(cpu);
|
||||
tui.init();
|
||||
|
||||
loop {
|
||||
if event::poll(std::time::Duration::from_millis(16))? {
|
||||
if let event::Event::Key(key) = event::read()? {
|
||||
if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
let buffer = window_rx.recv().unwrap();
|
||||
window.update_with_buffer(&buffer, 512, 380).unwrap();
|
||||
tui.update(&mut terminal)?;
|
||||
}
|
||||
stdout().execute(LeaveAlternateScreen)?;
|
||||
disable_raw_mode()?;
|
||||
Ok(())
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -10,7 +10,7 @@ cursor = $202
|
|||
|
||||
char_buffer = $300 ; 256 byte character buffer
|
||||
|
||||
kb_row = $4400 ; keyboard hardware register, there are 5 more but i can just increment from here
|
||||
kb_row = $4400 ; keyboard hardware register
|
||||
kb_row_cache = $203 ; cache
|
||||
|
||||
.org $8000
|
||||
|
@ -34,32 +34,188 @@ cleardisplay:
|
|||
sta $6700,y ; this goes slightly over but it's fine
|
||||
iny
|
||||
bne cleardisplay
|
||||
cli
|
||||
; cli
|
||||
|
||||
main:
|
||||
jsr draw
|
||||
jsr keyboard
|
||||
; key_zero:
|
||||
; stz keyboard_cache, x
|
||||
; dex
|
||||
; bpl key_zero
|
||||
; fim:
|
||||
; cli
|
||||
; bra fim
|
||||
; jsr kitty_keys
|
||||
jmp main
|
||||
|
||||
; ; copying @smal rn: https://github.com/smaldragon/KittyEMU/blob/main/roms/foxmon.asm
|
||||
; char_timer = $10
|
||||
; line_buffer = $0200
|
||||
; char_cur = $11
|
||||
; line_buffer_i = $12
|
||||
; line_buffer_l = $13
|
||||
|
||||
; keyboard_cache = $14
|
||||
; line_cur = $20
|
||||
|
||||
; irq:
|
||||
|
||||
; lda line_buffer_i
|
||||
; lda $e0
|
||||
; lda $6f
|
||||
; sei
|
||||
; stz char_cur
|
||||
; lda line_buffer_i
|
||||
; sta line_buffer_l
|
||||
; ldx #4
|
||||
|
||||
; kitty_keys: ; reads pressed key and writes keymap value to char_cur
|
||||
; phx
|
||||
; txa
|
||||
; asl
|
||||
; asl
|
||||
; asl
|
||||
; asl
|
||||
; asl ; i think this is supposed to be once for every keyboard row
|
||||
; tax
|
||||
; lda kb_row, x
|
||||
; plx
|
||||
|
||||
; pha
|
||||
; cmp keyboard_cache, x
|
||||
; bne change
|
||||
; jmp nochange
|
||||
; change:
|
||||
; bit7:
|
||||
; asl keyboard_cache, x
|
||||
; bcs bit6
|
||||
; bit #0b10000000
|
||||
; beq bit6
|
||||
; pha
|
||||
; lda keymap_7, x
|
||||
; sta char_cur
|
||||
; pla
|
||||
; bit6:
|
||||
; asl keyboard_cache, x
|
||||
; bcs bit5
|
||||
; bit #0b01000000
|
||||
; beq bit5
|
||||
; pha
|
||||
; lda keymap_6, x
|
||||
; sta char_cur
|
||||
; pla
|
||||
; bit5:
|
||||
; asl keyboard_cache, x
|
||||
; bcs bit4
|
||||
; bit #0b00100000
|
||||
; beq bit4
|
||||
; pha
|
||||
; lda keymap_5, x
|
||||
; sta char_cur
|
||||
; pla
|
||||
; bit4:
|
||||
; asl keyboard_cache, x
|
||||
; bcs bit3
|
||||
; bit #0b00010000
|
||||
; beq bit3
|
||||
; pha
|
||||
; lda keymap_4, x
|
||||
; sta char_cur
|
||||
; pla
|
||||
; bit3:
|
||||
; asl keyboard_cache, x
|
||||
; bcs bit2
|
||||
; bit #0b00001000
|
||||
; beq bit2
|
||||
; pha
|
||||
; lda keymap_3, x
|
||||
; sta char_cur
|
||||
; pla
|
||||
; bit2:
|
||||
; asl keyboard_cache, x
|
||||
; bcs bit1
|
||||
; bit #0b00000100
|
||||
; beq bit1
|
||||
; pha
|
||||
; lda keymap_2, x
|
||||
; sta char_cur
|
||||
; pla
|
||||
; bit1:
|
||||
; asl keyboard_cache, x
|
||||
; bcs bit0
|
||||
; bit #0b00000010
|
||||
; beq bit0
|
||||
; pha
|
||||
; lda keymap_1, x
|
||||
; sta char_cur
|
||||
; pla
|
||||
; bit0:
|
||||
; asl keyboard_cache, x
|
||||
; bcs bitend
|
||||
; bit #0b00000001
|
||||
; beq bitend
|
||||
; pha
|
||||
; lda keymap_0, x
|
||||
; sta char_cur
|
||||
; pla
|
||||
; bitend:
|
||||
; nochange:
|
||||
; pla
|
||||
; sta keyboard_cache, x
|
||||
; dex
|
||||
; bmi keyend
|
||||
; jmp kitty_keys
|
||||
; keyend:
|
||||
|
||||
; write:
|
||||
; lda char_cur
|
||||
; ldy cursor
|
||||
; sta $6000, y
|
||||
; inc cursor
|
||||
; rts
|
||||
|
||||
|
||||
; ; col = keyboard row, row = keyboard bit placement inverted
|
||||
; keymap_0:
|
||||
; .byte "??????"
|
||||
; keymap_1:
|
||||
; .byte "wqdzx "
|
||||
; keymap_2:
|
||||
; .byte "esvfc "
|
||||
; keymap_3:
|
||||
; .byte "rghbn?"
|
||||
; keymap_4:
|
||||
; .byte "tykjm?"
|
||||
; keymap_5:
|
||||
; .byte "ui?l??"
|
||||
; keymap_6:
|
||||
; .byte "op?21?"
|
||||
; keymap_7:
|
||||
; .byte "??a43?"
|
||||
;
|
||||
;
|
||||
keyboard:
|
||||
ldy #0
|
||||
x
|
||||
|
||||
not_keyboard:
|
||||
ldy #0
|
||||
.loop: ; loop through each row
|
||||
.check_row: ; loop through each row
|
||||
lda kb_row, y
|
||||
beq .skip ; if row has no key pressed, skip checking which key
|
||||
beq .skip_row ; if row has no key pressed, skip checking which key
|
||||
sta kb_row_cache, y ; if key pressed, cache it
|
||||
lda kb_row, y
|
||||
cmp kb_row_cache, y ; has key changed?
|
||||
beq key_down
|
||||
.skip:
|
||||
.skip_row:
|
||||
iny
|
||||
cpy #5
|
||||
bne .loop
|
||||
bne .check_row
|
||||
rts
|
||||
|
||||
key_down: ; a is loaded with the row byte
|
||||
sty key_row ; store character row
|
||||
inc cursor
|
||||
pha
|
||||
phy
|
||||
sty key_row ; store character row
|
||||
ldy #0
|
||||
.find_col: ; test each row bit, store column if key pressed
|
||||
lsr ; test bit 7
|
||||
|
@ -90,12 +246,12 @@ keymap_index:
|
|||
lda 0, x
|
||||
tay
|
||||
|
||||
do_something_w_key: ; we've stored the character position, now let's
|
||||
print: ; we've stored the character position, now let's
|
||||
lda keymap, y
|
||||
ldy cursor
|
||||
sta $6000, y
|
||||
inc cursor
|
||||
ply
|
||||
pla
|
||||
rts
|
||||
|
||||
keymap:
|
||||
|
@ -107,9 +263,9 @@ keymap:
|
|||
.byte "????? m"
|
||||
|
||||
draw:
|
||||
push_coords #0, #0
|
||||
push_char #$00
|
||||
jsr draw_char
|
||||
; push_coords #0, #0
|
||||
; push_char #$00
|
||||
; jsr draw_char
|
||||
rts
|
||||
|
||||
draw_char: ; draw a character c at (x, y) (n1: x n2: y n3: c -- )
|
||||
|
@ -151,7 +307,7 @@ isr: ; interrupt service routine
|
|||
pha
|
||||
phx
|
||||
phy
|
||||
jsr keyboard
|
||||
; jsr irq
|
||||
ply
|
||||
plx
|
||||
pla
|
||||
|
|
Binary file not shown.
|
@ -26,7 +26,7 @@
|
|||
dex
|
||||
.endm
|
||||
|
||||
.macro push_char, char ; pushes an ascii character code onto the stack
|
||||
.macro push_char, char; pushes an ascii character code onto the stack
|
||||
lda \char
|
||||
push
|
||||
sta 0, x ; char low byte
|
||||
|
|
|
@ -0,0 +1,150 @@
|
|||
// use std::time::Duration;
|
||||
|
||||
mod tabs;
|
||||
mod term;
|
||||
use std::{io::Result, time::Duration};
|
||||
|
||||
use crossterm::event::{self, poll, Event, KeyCode, KeyEvent, KeyEventKind};
|
||||
use ratatui::{
|
||||
prelude::*,
|
||||
widgets::{Block, Cell, Paragraph, Row, Table, TableState},
|
||||
};
|
||||
|
||||
use crate::cpu::Cpu;
|
||||
|
||||
pub struct App {
|
||||
cpu: Cpu,
|
||||
running: bool,
|
||||
table_state: TableState,
|
||||
}
|
||||
|
||||
impl App {
|
||||
pub fn new(cpu: Cpu) -> Self {
|
||||
Self {
|
||||
cpu,
|
||||
running: true,
|
||||
table_state: TableState::default(),
|
||||
}
|
||||
}
|
||||
pub fn init(&mut self) {
|
||||
let _ = self.cpu.reset();
|
||||
}
|
||||
pub fn update(&mut self, terminal: &mut Terminal<impl Backend>) -> Result<()> {
|
||||
self.draw(terminal)?;
|
||||
self.handle_events()?;
|
||||
self.handle_cpu()?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_cpu(&mut self) -> Result<()> {
|
||||
if self.running {
|
||||
self.cpu.cycle();
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Draw a single frame of the app.
|
||||
fn draw(&self, terminal: &mut Terminal<impl Backend>) -> Result<()> {
|
||||
terminal
|
||||
.draw(|frame| {
|
||||
frame.render_widget(self, frame.size());
|
||||
})
|
||||
.unwrap();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_events(&mut self) -> Result<()> {
|
||||
if poll(Duration::from_secs_f32(1.0 / 25.0))? {
|
||||
match event::read()? {
|
||||
Event::Key(key) if key.kind == KeyEventKind::Press => self.handle_key_press(key),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_key_press(&mut self, key: KeyEvent) {
|
||||
match key.code {
|
||||
KeyCode::Enter => {
|
||||
if !self.running {
|
||||
self.cpu.cycle()
|
||||
}
|
||||
}
|
||||
KeyCode::Char(' ') => {
|
||||
self.running = !self.running;
|
||||
}
|
||||
_ => {}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// Implement Widget for &App rather than for App as we would otherwise have to clone or copy the
|
||||
/// entire app state on every frame. For this example, the app state is small enough that it doesn't
|
||||
/// matter, but for larger apps this can be a significant performance improvement.
|
||||
impl Widget for &App {
|
||||
fn render(self, area: Rect, buf: &mut Buffer) {
|
||||
let [cpu_area, memory_area] =
|
||||
Layout::horizontal([Constraint::Percentage(50), Constraint::Fill(1)]).areas(area);
|
||||
|
||||
let cpu_info = format!("a: {a:#04x}, x: {x:#04x}, y: {y:#04x}, pc: {pc:#06x}, sp: {s:#04x}, sr: {p:#010b}, irq: {irq:?}, nmi: {nmi:?}", a = self.cpu.a, x = self.cpu.x, y = self.cpu.y, pc = self.cpu.pc, s = self.cpu.s, p = self.cpu.p, irq = self.cpu.irq, nmi = self.cpu.nmi);
|
||||
|
||||
Paragraph::new(cpu_info)
|
||||
.block(Block::bordered().title("cpu info!"))
|
||||
.render(cpu_area, buf);
|
||||
|
||||
let memory = self.cpu.memory.lock().unwrap();
|
||||
let table_height = memory_area.rows().count() - 2;
|
||||
let rows: Vec<Row> = memory.data[0..table_height * 16]
|
||||
.chunks(16)
|
||||
.map(|chunk| {
|
||||
chunk
|
||||
.iter()
|
||||
.map(|content| Cell::from(Text::from(format!("{content:#02}"))))
|
||||
.collect::<Row>()
|
||||
})
|
||||
.collect();
|
||||
let widths = vec![Constraint::Length(2); 16];
|
||||
Widget::render(
|
||||
Table::new(rows, widths)
|
||||
.header(
|
||||
Row::new(vec![
|
||||
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e",
|
||||
"f",
|
||||
])
|
||||
.style(Style::new().bold())
|
||||
// To add space between the header and the rest of the rows, specify the margin
|
||||
.bottom_margin(1),
|
||||
)
|
||||
.block(Block::bordered().title("memory!")),
|
||||
memory_area,
|
||||
buf,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// impl Widget for App {
|
||||
// fn render_title_bar(&self, area: Rect, buf: &mut Buffer) {
|
||||
// // let layout = Layout::horizontal([Constraint::Min(0), Constraint::Length(43)]);
|
||||
// // let [title] = layout.areas(area);
|
||||
|
||||
// Span::styled("Ratatui", Style::default()).render(area, buf);
|
||||
// // let titles = Tab::iter().map(Tab::title);
|
||||
// // Tabs::new(titles)
|
||||
// // .style(THEME.tabs)
|
||||
// // .highlight_style(THEME.tabs_selected)
|
||||
// // .select(self.tab as usize)
|
||||
// // .divider("")
|
||||
// // .padding("", "")
|
||||
// // .render(tabs, buf);
|
||||
// }
|
||||
|
||||
// // fn render_selected_tab(&self, area: Rect, buf: &mut Buffer) {
|
||||
// // match self.tab {
|
||||
// // Tab::About => self.about_tab.render(area, buf),
|
||||
// // Tab::Recipe => self.recipe_tab.render(area, buf),
|
||||
// // Tab::Email => self.email_tab.render(area, buf),
|
||||
// // Tab::Traceroute => self.traceroute_tab.render(area, buf),
|
||||
// // Tab::Weather => self.weather_tab.render(area, buf),
|
||||
// // };
|
||||
// // }
|
||||
// }
|
19
src/video.rs
19
src/video.rs
|
@ -3,12 +3,9 @@ use std::{
|
|||
fs::File,
|
||||
io::Read,
|
||||
path::Path,
|
||||
sync::{
|
||||
mpsc::{Sender, SyncSender},
|
||||
Arc, Mutex,
|
||||
},
|
||||
sync::{mpsc::Sender, Arc, Mutex},
|
||||
thread::sleep,
|
||||
time::{Duration, Instant},
|
||||
time::Duration,
|
||||
};
|
||||
|
||||
const FG_COLOR: u32 = 0xFFCC00;
|
||||
|
@ -31,7 +28,7 @@ where
|
|||
let mut file = File::open(path).unwrap();
|
||||
let mut bin = vec![0; 0x8000];
|
||||
file.read_exact(&mut bin).unwrap();
|
||||
println!("reading char rom");
|
||||
// println!("reading char rom");
|
||||
bin
|
||||
}
|
||||
None => include_bytes!("./roms/cozette.rom").to_vec(),
|
||||
|
@ -65,7 +62,9 @@ impl Crtc {
|
|||
return;
|
||||
}
|
||||
};
|
||||
// the rest of this function is arcane wizardry based on the specifics of george's weird
|
||||
|
||||
// the rest of this function is arcane wizardry
|
||||
// based on the specifics of george's weird
|
||||
// display and characters... don't fuck around w it
|
||||
let mut i = 0;
|
||||
for char_row in 0..29 {
|
||||
|
@ -88,15 +87,15 @@ impl Crtc {
|
|||
|
||||
let buffer = self.buffer.to_owned();
|
||||
|
||||
self.window.send(buffer).unwrap();
|
||||
let _ = self.window.send(buffer);
|
||||
}
|
||||
|
||||
pub fn run(&mut self) {
|
||||
loop {
|
||||
self.interrupt.send(false).unwrap();
|
||||
let _ = self.interrupt.send(false);
|
||||
sleep(Duration::from_millis(16));
|
||||
self.draw();
|
||||
self.interrupt.send(true).unwrap();
|
||||
let _ = self.interrupt.send(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue