diff --git a/Cargo.lock b/Cargo.lock index e19586d..30baf0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,6 +5,16 @@ name = "ansi_term" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "as-slice" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "atty" version = "0.2.2" @@ -30,6 +40,11 @@ name = "bufstream" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bzip2" version = "0.3.2" @@ -105,6 +120,7 @@ dependencies = [ "pbr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", + "urpc 0.1.0-alpha.1", "zip 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -113,6 +129,41 @@ name = "gcc" version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "generic-array" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "generic-array" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hash32" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "heapless" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "as-slice 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash32 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ioctl-rs" version = "0.1.5" @@ -254,6 +305,38 @@ name = "podio" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "postcard" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "heapless 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "postcard-cobs 0.1.5-pre (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "postcard-cobs" +version = "0.1.5-pre" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "proc-macro2" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quote" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rand" version = "0.3.16" @@ -281,6 +364,24 @@ name = "rustc-serialize" version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "serde" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_derive" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "serial" version = "0.4.0" @@ -319,11 +420,26 @@ dependencies = [ "serial-core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "stable_deref_trait" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "strsim" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "syn" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (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 = "term_size" version = "0.3.0" @@ -372,6 +488,11 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "typenum" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unicode-segmentation" version = "1.2.0" @@ -382,6 +503,20 @@ name = "unicode-width" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "urpc" +version = "0.1.0-alpha.1" +dependencies = [ + "heapless 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "postcard 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "vec_map" version = "0.8.0" @@ -411,10 +546,12 @@ dependencies = [ [metadata] "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" +"checksum as-slice 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "37dfb65bc03b2bc85ee827004f14a6817e04160e3b1a28931986a666a9290e70" "checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159" "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" "checksum bufstream 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f382711e76b9de6c744cc00d0497baba02fb00a787f088c879f01d09468e32" +"checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" "checksum bzip2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3eafc42c44e0d827de6b1c131175098fe7fb53b8ce8a47e65cb3ea94688be24" "checksum bzip2-sys 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "98ce3fff84d4e90011f464bbdf48e3428f04270439f703868fd489d2aaedfc30" "checksum clap 2.26.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2267a8fdd4dce6956ba6649e130f62fb279026e5e84b92aa939ac8f85ce3f9f0" @@ -423,6 +560,10 @@ dependencies = [ "checksum enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" "checksum flate2 0.2.19 (registry+https://github.com/rust-lang/crates.io-index)" = "36df0166e856739905cd3d7e0b210fe818592211a008862599845e012d8d304c" "checksum gcc 0.3.53 (registry+https://github.com/rust-lang/crates.io-index)" = "e8310f7e9c890398b0e80e301c4f474e9918d2b27fca8f48486ca775fa9ffc5a" +"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +"checksum generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0ed1e761351b56f54eb9dcd0cfaca9fd0daecf93918e1cfc01c8a3d26ee7adcd" +"checksum hash32 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d4041af86e63ac4298ce40e5cca669066e75b6f1aa3390fe2561ffa5e1d9f4cc" +"checksum heapless 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10b591a0032f114b7a77d4fbfab452660c553055515b7d7ece355db080d19087" "checksum ioctl-rs 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c733bd6be680c4365bfeb89ac48d4c39ee2c47d933da3601689131471aaf3267" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum libc 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)" = "2370ca07ec338939e356443dac2296f581453c35fe1e3a3ed06023c49435f915" @@ -439,22 +580,32 @@ dependencies = [ "checksum num-traits 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "99843c856d68d8b4313b03a17e33c4bb42ae8f6610ea81b28abe076ac721b9b0" "checksum pbr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "deb73390ab68d81992bd994d145f697451bb0b54fd39738e72eef32458ad6907" "checksum podio 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e5422a1ee1bc57cc47ae717b0137314258138f38fd5f3cea083f43a9725383a0" +"checksum postcard 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f61f42c9617f3d7b447ee300bf80cb16c7cd7b28ca88555822793f073f69719f" +"checksum postcard-cobs 0.1.5-pre (registry+https://github.com/rust-lang/crates.io-index)" = "7c68cb38ed13fd7bc9dd5db8f165b7c8d9c1a315104083a2b10f11354c2af97f" +"checksum proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435" +"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" "checksum rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "eb250fd207a4729c976794d03db689c9be1d634ab5a1c9da9492a13d8fecbcdf" "checksum redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "8dde11f18c108289bef24469638a04dce49da56084f2d50618b226e47eb04509" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" +"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" +"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" "checksum serial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1237a96570fc377c13baa1b88c7589ab66edced652e43ffb17088f003db3e86" "checksum serial-core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f46209b345401737ae2125fe5b19a77acce90cd53e1658cda928e4fe9a64581" "checksum serial-unix 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f03fbca4c9d866e24a459cbca71283f545a37f8e3e002ad8c70593871453cab7" "checksum serial-windows 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15c6d3b776267a75d31bbdfd5d36c0ca051251caafc285827052bc53bcdc8162" +"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694" +"checksum syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)" = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859" "checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" "checksum termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a" "checksum textwrap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f728584ea33b0ad19318e20557cb0a39097751dbb07171419673502f848c7af6" "checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520" +"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" "checksum unicode-segmentation 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8083c594e02b8ae1654ae26f0ade5158b119bd88ad0e8227a5d8fcd72407946" "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" +"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/Cargo.toml b/Cargo.toml index a7d0776..1e6474c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,3 +12,6 @@ enum_primitive = "*" time = "0.1" zip = "0.2.6" pbr = "1.0.1" + +[dependencies.urpc] +path = "/home/dev/git/urpc" diff --git a/diff_tetris.html b/diff_tetris.html new file mode 100644 index 0000000..418f7e9 --- /dev/null +++ b/diff_tetris.html @@ -0,0 +1,277 @@ + + + + + + + + + /usr/bin/diffoscope --no-progress mario_00.gb /home/dev/git/miniBoy/roms/Super Mario Land.gb --html diff_tetris.html + + + +
+
+
+
274 KB
+
mario_00.gb vs.
+
/home/dev/git/miniBoy/roms/Super Mario Land.gb + +
+
+ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Offset 2045, 2052 lines modifiedOffset 2045, 2052 lines modified
00007fc0:​·​0000·​0000·​0000·​0000·​0000·​0000·​0000·​0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00007fc0:​·​0000·​0000·​0000·​0000·​0000·​0000·​0000·​0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00007fd0:​·​0000·​0000·​0000·​0000·​0000·​0000·​0000·​0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00007fd0:​·​0000·​0000·​0000·​0000·​0000·​0000·​0000·​0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00007fe0:​·​0000·​0000·​0000·​0000·​0000·​0000·​0000·​0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00007fe0:​·​0000·​0000·​0000·​0000·​0000·​0000·​0000·​0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00007ff0:​·​0000·​0000·​0000·​0000·​0000·​0000·​0000·​4700··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​G.​00007ff0:​·​0000·​0000·​0000·​0000·​0000·​0000·​0000·​4700··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​G.​
00008000:​·​9261·​b761·​da61·​9261·​b761·​da61·​9261·​b761··​.​a.​a.​a.​a.​a.​a.​a.​a00008000:​·​9261·​b761·​da61·​9261·​b761·​da61·​9261·​b761··​.​a.​a.​a.​a.​a.​a.​a.​a
00008010:​·​da61·​9261·​b761·​da61·​9061·​0260·​7360·​fe60··​.​a.​a.​a.​a.​a.​`s`.​`00008010:​·​da61·​9261·​b761·​da61·​9061·​0260·​7360·​fe60··​.​a.​a.​a.​a.​a.​`s`.​`
00008020:​·​0260·​7360·​fe60·​0260·​7360·​fe60·​0260·​7360··​.​`s`.​`.​`s`.​`.​`s`00008020:​·​0260·​7360·​fe60·​0260·​7360·​fe60·​0260·​7360··​.​`s`.​`.​`s`.​`.​`s`
00008030:​·​fe60·​0000·1f18·3b30·3720·3f27·3a2a·3929··​.​`.​.​.​.​;​07·​?':​*9)​00008030:​·​fe60·​0000·0000·0000·0000·0303·0707·0f0e··​.​`.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008040:​·3f26·f0f0·d838·ec1c·f40c·f4ec·545c·949c··?&.​.​.​8.​.​.​.​.​.​T\.​.​00008040:​·1f1b·0000·0000·0000·0000·8080·f0f0·e040··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​@
00008050:​·​f46c·​0000·​0f0f·3f38·7b60·7740·7f47·7a4a··​.​l.​.​.​.​?8{`w@.​GzJ00008050:​·​f000·​0000·​0000·0000·0101·0303·0707·0f0d··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008060:​·7949·​0000·f0f0·fc1c·f60e·​fa06·​fae6·5a56··yI.​.​.​.​.​.​.​.​.​.​.​.​ZV00008060:​·0f0c·​0000·0000·0000·c0c0·​f8f8·​f020·f880··.​.​.​.​.​.​.​.​.​.​.​.​.​·​.​.​
00008070:​·9a96·​0000·​0303·​0707·​0c0c·121e·3c3c·e3ff··​.​.​.​.​.​.​.​.​.​.​.​.​<<.​.​00008070:​·f830·​0000·​0000·​0000·​0303·0707·0f0e·1f1b··​.​0.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008080:​·4343·​0000·f8f8·80c0·e0e0·86e6·​ebe9·1df1··CC.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008080:​·1f18·​0000·0000·0000·8080·f0f0·​e040·f000··.​.​.​.​.​.​.​.​.​.​.​.​.​@.​.​
00008090:​·7d61·​0101·​0303·​0606·​0b0f·1e1e·717f·2626··}a.​.​.​.​.​.​.​.​.​.​q.​&&00008090:​·f060·​0000·​0000·​0000·​0202·0f09·0d00·1810··.​`.​.​.​.​.​.​.​.​.​.​.​.​.​.​
000080a0:​·​0f08·fcfc·c0e0·7070·4070·7878·​ace4·f4c4··​.​.​.​.​.​.​pp@pxx.​.​.​.​000080a0:​·​0c08·0303·3c3f·437c·9ce0·b0c0·​a0c0·90e0··​.​.​.​.​<?C|.​.​.​.​.​.​.​.​
000080b0:​·7444·1f1f·3233·7a5b·f392·ff8c·7c70·​7040··tD.​.​23z[.​.​.​.​|pp@000080b0:​·5060·0000·0000·0000·0000·0303·0707·0f0e··P`.​.​.​.​.​.​.​.​.​.​.​.​.​.​
000080c0:​·3f3f·c6c6·2eea·7efa·bea2·baa2·7a7a·6a6a··??.​.​.​.​~.​.​.​.​.​zzjj000080c0:​·1f1b·0000·0000·0000·0e00·8e80·fcfc·ec4c··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​L
000080d0:​·8686·​0000·​0707·181f·2738·2f30·5c60·5860··​.​.​.​.​.​.​.​.​'8/​0\`X`000080d0:​·fc0c·​0000·​0000·0000·0303·1f1f·0f04·1f02··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
000080e0:​·5860·​0000·​0000·​0303·​0c0f·131c·1718·2e30··X`.​.​.​.​.​.​.​.​.​.​.​.​.​0000080e0:​·0f0c·​0000·​0000·​0000·8080·e0e0·f0f0·f8a0··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
000080f0:​·2c30·​0000·​0000·​0000·0000·0000·0000·0000··,​0.​.​.​.​.​.​.​.​.​.​.​.​.​.​000080f0:​·f820·​0707·​0f0f·​0f0f·1f1f·1f1e·3f3e·3f3e··.​·.​.​.​.​.​.​.​.​.​.​?>?>
00008100:​·0000·0000·0000·0000·0000·0000·0000·0000··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008100:​·3f3f·e0e0·f0f0·f0d0·e000·f040·e000·e000··??.​.​.​.​.​.​.​.​.​@.​.​.​.​
00008110:​·0000·​0101·​0302·​0707·​0808·​0d0d·​1f1f·fff0··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008110:​·c040·​0000·​0000·​0000·​0000·​0000·​1c1c·3e3e··​.​@.​.​.​.​.​.​.​.​.​.​.​.​>>
00008120:​·bf80·f8f8·e020·f898·f090·f888·​f030·e020··​.​.​.​.​.​·.​.​.​.​.​.​.​0.​·00008120:​·7f7f·0000·0000·0000·​0303·1707·3f0a·3f1c··​.​.​.​.​.​.​.​.​.​.​.​.​?.​?.​
00008130:​·f030·​1f10·​0f09·1f11·​171c·​1d1f·​1f15·1d17··​.​0.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008130:​·1f1b·​1f18·​0700·0d0f·​1d1f·​1c05·​1807·0606··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008140:​·​0f0d·c838·d0b0·f888·f838·b8e8·e8b8·b8e8··​.​.​.​8.​.​.​.​.​8.​.​.​.​.​.​00008140:​·​0e0e·f060·e000·80c0·b0f0·38b0·18e0·6060··​.​.​.​`.​.​.​.​.​.​8.​.​.​``
00008150:​·f0b0·3f26·1f10·7f61·dfb8·fbb7·bcf4·7e5a··.​.​?&.​.​.​a.​.​.​.​.​.​~Z00008150:​·7070·0300·0f0f·3f0f·3707·000f·101f·181c··pp.​.​.​.​?.​7.​.​.​.​.​.​.​
00008160:​·2424·​f46c·e818·fe86·fb1d·dfed·3d2f·7e5a··$$.​l.​.​.​.​.​.​.​.​=/​~Z00008160:​·0e0e·​f000·40c0·7ce0·3c70·08c8·18f8·1878··.​.​.​.​@.​|.​<p.​.​.​.​.​x
00008170:​·2424·​0302·​0302·0302·0101·​0808·​0c0c·​0407··$$.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008170:​·0000·​0700·​0e0f·1e1f·​1e18·​041b·​000f·​0707··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008180:​·​0303·bf21·be3e·b030·f878·80f8·f8f8·00f0··​.​.​.​!.​>.​0.​x.​.​.​.​.​.​00008180:​·​0707·e000·8080·c0c0·00a0·00e0·c0c0·e0e0··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008190:​·c0c0·0f08·​0f08·​0f08·0704·2323·​3131·181f··​.​.​.​.​.​.​.​.​.​.​##11.​.​00008190:​·8080·1f18·​0700·​0f0f·1f0f·​300f·101f·313d··​.​.​.​.​.​.​.​.​.​.​0.​.​.​1=
000081a0:​·0f0f·7c44·7878·7070·​f070·80f0·f0f0·00e0··.​.​|Dxxpp.​p.​.​.​.​.​.​000081a0:​·2121·f060·e000·58c0·​f8c0·00e0·00c0·8080··!!.​`.​.​X.​.​.​.​.​.​.​.​.​
000081b0:​·​c0c0·3f3f·7969·fd8d·​7969·1f16·0f08·1c10··​.​.​??yi.​.​yi.​.​.​.​.​.​000081b0:​·​c0c0·1f18·0700·1d1f·​7c3f·600e·501f·383f··​.​.​.​.​.​.​.​.​|?`.​P.​8?
000081c0:​·7f7f·e0e0·1bfb·2fed·​cf49·cd4d·2b2b·3838··.​.​.​.​.​.​/​.​.​I.​M++88000081c0:​·2026·f878·f010·a0e0·​c4e4·​0cdc·0cfc·00c0···​&.​x.​.​.​.​.​.​.​.​.​.​.​.​
000081d0:​·c0c0·0000·0000·0000·​0000·​0000·​0000·​0101··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000081d0:​·0000·1f18·1f1f·1f1f·​0e0f·​0103·​0103·​0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
000081e0:​·​0706·​0000·3f3f·7e46·7f79·8e8a·dfd9·fef6··​.​.​.​.​??~F.​y.​.​.​.​.​.​000081e0:​·​0000·​00e0·c030·8070·e0f0·c0e0·a8e8·78f8··​.​.​.​.​.​0.​p.​.​.​.​.​.​x.​
000081f0:​·fc04·0000·0000·0101·​0101·​0202·​0f0c·b7b1··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000081f0:​·7070·3c3f·3b3c·1211·​0304·​010e·​011e·003f··pp<?;​<.​.​.​.​.​.​.​.​.​?
00008200:​·7e7e·fcc4·f888·7808·f010·e020·c040·8080··~~.​.​.​.​x.​.​.​.​·.​@.​.​00008200:​·007f·40a0·00e0·00c0·00e0·8060·8070·00f0··.​.​@.​.​.​.​.​.​.​.​`.​p.​.​
00008210:​·​0000·5f4f·​f1f1·0e0e·​1918·1010·1010·1918··​.​.​_O.​.​.​.​.​.​.​.​.​.​.​.​00008210:​·​00f0·ffff·7f7f·3e3e·​1c1c·0000·0000·0000··​.​.​.​.​.​.​>>.​.​.​.​.​.​.​.​
00008220:​·​0706·f6f6·fdad·f517·fd0f·ea1e·ea1e·cb3f··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​?00008220:​·​0000·0f08·0d0e·212f·383d·383f·0007·0000··​.​.​.​.​.​.​!/​8=8?.​.​.​.​
00008230:​·9b7f·​0404·8e8a·8e8a·dfd1·ffaf·f595·b191··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008230:​·0000·​0707·0f0f·0f0c·1f16·3f30·3f30·0f08··​.​.​.​.​.​.​.​.​.​.​?0?0.​.​
00008240:​·bf8f·1818·7c64·fea2·​feae·b595·b191·9f8f··​.​.​.​.​|d.​.​.​.​.​.​.​.​.​.​00008240:​·0b0f·c0c0·f0f0·e080·​f800·f840·f0f0·e000··​.​.​.​.​.​.​.​.​.​.​.​@.​.​.​.​
00008250:​·7e7e·​0000·​0000·​0000·​0000·​0000·0000·0000··~~.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008250:​·80c0·​0000·​0303·​0707·​0706·​0f0b·1f18·1f18··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008260:​·​0000·​0000·0000·0000·0000·0000·0000·0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008260:​·​0704·​0000·e0e0·f8f8·f040·fc00·fc20·f878··​.​.​.​.​.​.​.​.​.​@.​.​.​·.​x
00008270:​·0000·​0000·​0707·​090e·​1a1c·2624·2e2c·2624··​.​.​.​.​.​.​.​.​.​.​&$.​,​&$00008270:​·f000·​0707·​0f0f·​0f0c·​1f16·3f30·3f30·0f08··​.​.​.​.​.​.​.​.​.​.​?0?0.​.​
00008280:​·3f3f·0000·e0e0·9070·5838·6424·7434·6424··??.​.​.​.​.​pX8d$t4d$00008280:​·1f1f·c0c0·f0f0·e080·f800·f840·f0f0·e000··.​.​.​.​.​.​.​.​.​.​.​@.​.​.​.​
00008290:​·fcfc·​0707·​090e·1a1c·2624·2e2c·2624·3f3f··.​.​.​.​.​.​.​.​&$.​,​&$??00008290:​·40c0·​0000·​0000·0000·0000·0000·1c1c·223e··@.​.​.​.​.​.​.​.​.​.​.​.​.​">
000082a0:​·0000·e0e0·9070·5838·6424·7434·6424·fcfc··.​.​.​.​.​pX8d$t4d$.​.​000082a0:​·4973·b1c1·5963·223e·1c1c·0000·0000·0000··Is.​.​Yc">.​.​.​.​.​.​.​.​
000082b0:​·​0000·​0000·​0000·​0000·​0000·0000·0000·0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000082b0:​·​0000·​0000·​0707·​0f0f·​0f0c·1f16·3f30·3f30··​.​.​.​.​.​.​.​.​.​.​.​.​?0?0
000082c0:​·​0000·​0000·0000·0000·0000·0000·0000·0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000082c0:​·​0f0c·​0e00·dec8·fef0·fe9e·fe06·fc44·fcfc··​.​.​.​.​.​.​.​.​.​.​.​.​.​D.​.​
000082d0:​·0000·1f1c·​1711·​0a0a·0c0c·0303·0d0c·1110··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000082d0:​·f818·0707·​1f1f·​0f02·1f00·3f06·3f0c·0f01··​.​.​.​.​.​.​.​.​.​.​?.​?.​.​.​
000082e0:​·2120·fe06·​fb8b·b1d1·a9e1·5bc1·79c7·b987··!·.​.​.​.​.​.​.​.​[.​y.​.​.​000082e0:​·1d1f·8080·​f8f0·fc60·ccb0·c020·c0f0·e038··.​.​.​.​.​.​.​`.​.​.​·.​.​.​8
000082f0:​·f28e·2020·2020·3131·3939·3f26·1f10·​0f0f··​.​.​····​1199?&.​.​.​.​000082f0:​·e018·0000·0000·0000·0000·0000·0000·​0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008300:​·​0000·bc84·fcc4·bc84·fccc·​7808·f070·c0c0··​.​.​.​.​.​.​.​.​.​.​x.​.​p.​.​00008300:​·​0000·0000·0707·8f88·d8d0·​7878·6eee·fbe3··​.​.​.​.​.​.​.​.​.​.​xxn.​.​.​
00008310:​·0000·​0707·​0101·​0101·​0101·0000·0000·0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008310:​·ff60·​0000·​0303·​0707·​0f0f·1f1f·1f1e·3f3e··​.​`.​.​.​.​.​.​.​.​.​.​.​.​?>
00008320:​·0000·fdff·793f·713f·667a·​eef2·8ef2·5e62··.​.​.​.​y?q?fz.​.​.​.​^b00008320:​·3f3e·0000·e0e0·f0f0·f0d0·​e000·f040·e000··?>.​.​.​.​.​.​.​.​.​.​.​@.​.​
00008330:​·7e46·7e7e·1010·7c7c·1010·7c7c·3838·4444··~F~~.​.​||.​.​||88DD00008330:​·e000·1b1f·3b3f·383b·3807·1807·001e·1c1c··.​.​.​.​;​?8;​8.​.​.​.​.​.​.​
00008340:​·7c7c·1010·7c7c·1010·7c7c·1010·2828·4444··||.​.​||.​.​||.​.​((DD00008340:​·3c3c·a0e0·b0f0·38b8·38c0·30c0·00f0·7070··<<.​.​.​.​8.​8.​0.​.​.​pp
00008350:​·​7c7c·​0000·0000·​0000·0000·0000·0000·0000··||.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008350:​·​7878·​0b0f·131f·​031f·303f·303f·303c·2020··xx.​.​.​.​.​.​0?0?0<··
00008360:​·​0000·​0000·0000·0000·0000·0000·​0000·0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008360:​·​0000·​00c0·d8c0·fce0·fce0·80e0·​00e0·7070··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​pp
00008370:​·0000·323c·725c·d2bc·b2fc·dfdf·141c·746c··.​.​2<r\.​.​.​.​.​.​.​.​tl00008370:​·7878·171f·071f·001f·000f·010f·0507·0e0e··xx.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008380:​·546c·4c3c·4e3a·4b3d·4d3f·fbfb·2838·2e36··TlL<N:​K=M?.​.​(8.​600008380:​·0707·c080·e080·6080·00e0·80e0·c0c0·4040··.​.​.​.​.​.​`.​.​.​.​.​.​.​@@
00008390:​·2a36·dfdf·f2bc·b2dc·527c·3f3f·0a0e·3a36··*6.​.​.​.​.​.​R|??.​.​:​600008390:​·0000·0f0f·1f1f·3807·3007·181f·181f·1818··.​.​.​.​.​.​8.​0.​.​.​.​.​.​.​
000083a0:​·2a36·fbfb·4f3d·4d3b·4a3e·fcfc·5070·5c6c··*6.​.​O=M;​J>.​.​Pp\l000083a0:​·0c0c·5ce0·5ce0·0868·38f8·38f8·38b8·0000··.​.​\.​\.​.​h8.​8.​8.​.​.​
000083b0:​·546c·0707·191e·2a2c·3f3f·b6d8·ffff·141c··Tl.​.​.​.​*,​??.​.​.​.​.​.​000083b0:​·0000·3e3f·3e37·3c23·1c07·667f·637f·607e··​.​.​>?>7<#.​.​f.​c.​`~
000083c0:​·546c·e0e0·9878·5434·fcfc·6d1b·ffff·2838··Tl.​.​.​xT4.​.​m.​.​.​(8000083c0:​·4040·b0f0·a0f0·0272·06fe·06fe·86fe·0000··@@.​.​.​.​.​r.​.​.​.​.​.​.​.​
000083d0:​·2a36·2720·2f20·3f20·3e21·3c33·181f·​0f0f··*6'·​/​·​?·​>!<3.​.​.​.​000083d0:​·0000·1f1f·1e1f·080f·0007·0003·0000·​0000··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
000083e0:​·​0303·​c4bc·f8f8·​70f0·30f0·70f0·d8e8·9ce4··​.​.​.​.​.​.​p.​0.​p.​.​.​.​.​000083e0:​·​0000·​c030·60e0·​78f8·f8c8·f282·4ebe·3c7c··​.​.​.​0`.​x.​.​.​.​.​N.​<|
000083f0:​·​3cc4·0000·0000·0000·0000·0000·0000·0000··<.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000083f0:​·​3838·bfa9·ebbf·bcfc·ffff·cfcb·1f10·1f11··88.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008400:​·0000·​0100·​0300·​0500·0900·0100·0300·0500··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008400:​·1e1e·​00ff·​0000·​0f0f·f8ff·feff·ff7f·8383··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008410:​·​0900·ff3c·ff7e·ffff·ffff·ffff·ffff·ffff··​.​.​.​<.​~.​.​.​.​.​.​.​.​.​.​00008410:​·​0000·7f7f·787b·0102·0102·0007·000f·001f··​.​.​.​.​x{.​.​.​.​.​.​.​.​.​.​
00008420:​·ffff·0000·0000·​0101·0706·0e08·1f1f·1c10··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008420:​·003f·c040·40a0·00e0·​b040·f000·00e0·00e0··​.​?.​@@.​.​.​.​@.​.​.​.​.​.​
00008430:​·1f1f·3c3c·564e·ffff·3907·7c03·ffff·fc03··​.​.​<<VN.​.​9.​|.​.​.​.​.​00008430:​·00f0·0000·0000·0000·0000·0000·0707·0f0f··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008440:​·ffff·​0000·​0000·8080·e0e0·70f0·f8f8·38f8··​.​.​.​.​.​.​.​.​.​.​p.​.​.​8.​00008440:​·0f0c·​0000·​0000·0000·0000·0000·c0c0·f0f0··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008450:​·f8f8·​1e16·​1919·​1919·1e16·1c10·1c10·3f3f··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​??00008450:​·e080·​1f16·​1f10·​1f18·3738·3b33·3827·1c1f··​.​.​.​.​.​.​.​.​78;​38'.​.​
00008460:​·ddcc·7e19·6625·6625·7e19·7e01·7e01·ffff··.​.​~.​f%f%~.​~.​~.​.​.​00008460:​·3c3c·f800·f840·f0f0·f818·b8a8·18e0·38f8··<<.​.​.​@.​.​.​.​.​.​.​.​8.​
00008470:​·ef63·78f8·9898·9898·78f8·38f8·​38f8·fcfc··.​cx.​.​.​.​.​x.​8.​8.​.​.​00008470:​·3c3c·0000·0707·0f0f·0f0c·1f16·​3f30·3f30··<<.​.​.​.​.​.​.​.​.​.​?0?0
00008480:​·1fff·​0303·​0704·0f08·1f10·1e10·3c20·3f3f··​.​.​.​.​.​.​.​.​.​.​.​.​<·​??00008480:​·0f09·​0000·c0c0·​f0f0·e080·f800·f840·​fef0··​.​.​.​.​.​.​.​.​.​.​.​.​.​@.​.​
00008490:​·2020·ffff·c300·8700·​0f00·​0f00·​1f00·​ffff····​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008490:​·fcf0·0b0f·010f·​001f·001f·​607f·​607e·​606c··​.​.​.​.​.​.​.​.​.​.​`.​`~`l
000084a0:​·0000·ffff·c13f·e01f·f00f·f807·fc03·ffff··.​.​.​.​.​?.​.​.​.​.​.​.​.​.​.​000084a0:​·4040·e0e0·80c0·00c0·40e0·​80e0·00e0·7070··@@.​.​.​.​.​.​@.​.​.​.​.​pp
000084b0:​·0000·c0c0·​e0e0·70f0·38f8·​38f8·1cfc·fcfc··.​.​.​.​.​.​p.​8.​8.​.​.​.​.​000084b0:​·7878·​0707·0f0f·1f1f·1f1c·​3f3d·3f3c·7f7c··xx.​.​.​.​.​.​.​.​?=?<.​|
000084c0:​·1c7c·407f·7f7f·8080·80ff·​ffff·1010·​0c0c··​.​|@.​.​.​.​.​.​.​.​.​.​.​.​.​000084c0:​·7f7f·c0c0·e0e0·f070·f010·​f050·f010·e080··​.​.​.​.​.​.​.​p.​.​.​P.​.​.​.​
000084d0:​·​0303·00ff·ffff·​0000·​00ff·ffff·​0838·30f0··​.​.​.​.​.​.​.​.​.​.​.​.​.​80.​000084d0:​·c040·797a·3037·​0601·​0708·001f·​003f·007f··​.​@yz07.​.​.​.​.​.​.​?.​.​
000084e0:​·c0c0·00ff·ffff·0000·00ff·ffff·1010·​0c0c··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000084e0:​·00ff·c420·1ce0·30c0·c000·00c0·00e0·​00e0··​.​.​.​·.​.​0.​.​.​.​.​.​.​.​.​
000084f0:​·​0303·​0efe·fefe·073f·07ff·ffff·0838·30f0··​.​.​.​.​.​.​.​?.​.​.​.​.​80.​000084f0:​·​00e0·​0000·​e0e0·f090·8888·8484·​8c8c·fafa··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008500:​·c0c0·ffff·ff00·​ff00·ff00·ff00·​ff00·​ffff··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008500:​·fd11·3dd1·7d53·​f997·13ff·1efe·​fcfc·​f0f0··​.​.​=.​}S.​.​.​.​.​.​.​.​.​.​
00008510:​·​0000·​0000·​0000·​0303·0c0c·​1010·2020·2020··​.​.​.​.​.​.​.​.​.​.​.​.​····00008510:​·​0000·​0707·​0f0f·​0f0f·1f1c·​1f1d·3f3c·3f3c··​.​.​.​.​.​.​.​.​.​.​.​.​?<?<
00008520:​·4040·0000·0000·8080·4040·2424·1a1a·0101··@@.​.​.​.​.​.​@@$$.​.​.​.​00008520:​·3f3f·1e1e·1111·1e10·1f13·1c14·cccf·ffbf··??.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008530:​·0600·0000·0000·0000·​0000·​0000·​0000·8080··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008530:​·afa8·3d3e·383f·1e19·​0304·​010e·​001f·003f··​.​.​=>8?.​.​.​.​.​.​.​.​.​?
00008540:​·4040·​0101·0202·0404·0f08·0704·​0302·​0101··@@.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008540:​·007f·c020·​00f0·​30c0·​6080·​c020·​00f0·​00f0··.​.​.​·.​.​0.​`.​.​·.​.​.​.​
00008550:​·​0000·8080·0000·c100·f700·ff00·ff40·ffe3··​.​.​.​.​.​.​.​.​.​.​.​.​.​@.​.​00008550:​·​00f0·fefe·fe82·feee·3828·3828·3828·3828··​.​.​.​.​.​.​.​.​8(8(8(8(
00008560:​·​3e3e·1300·9900·c100·e300·​ff00·ff80·7f41··>>.​.​.​.​.​.​.​.​.​.​.​.​.​A00008560:​·​3838·eeee·eeaa·feba·fe82·​feba·eeaa·eeaa··88.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008570:​·3e3e·4040·a020·e020·c040·c040·8080·0000··>>@@.​·.​·.​@.​@.​.​.​.​00008570:​·eeee·fefe·fe82·​febe·​fc84·fcbc·febe·fe82··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008580:​·0000·0000·0000·0010·0028·0010·0000·0000··​.​.​.​.​.​.​.​.​.​(.​.​.​.​.​.​00008580:​·fefe·f6f6·fe9a·fe9a·feaa·fea2·feb2·eeaa··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008590:​·0000·00ff·00ff·00ff·00ff·00ff·00ff·00ff··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008590:​·eeee·fcfc·fe86·feb2·eeaa·eeaa·feb2·fe86··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
000085a0:​·00ff·​00ff·0000·00ff·0000·00ff·0000·0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000085a0:​·fcfc·​0000·2222·5555·5555·5555·5555·2222··​.​.​.​.​""UUUUUUUU""
000085b0:​·​0000·​0000·0000·0000·0000·0003·000c·0010··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000085b0:​·​0000·​0000·2020·5050·5050·5050·5050·2020··​.​.​.​.​··​PPPPPPPP··
000085c0:​·​0020·​0052·0052·004c·00ff·0000·0000·0000··​.​·.​R.​R.​L.​.​.​.​.​.​.​.​000085c0:​·​0000·​0000·1212·3535·1515·1515·1515·1212··​.​.​.​.​.​.​55.​.​.​.​.​.​.​.​
000085d0:​·​0000·​004a·004a·0032·00ff·0000·0000·0000··​.​.​.​J.​J.​2.​.​.​.​.​.​.​.​000085d0:​·​0000·​0000·2222·5555·1515·2525·4545·7272··​.​.​.​.​""UU.​.​%%EErr
000085e0:​·​0000·​0000·0000·0000·0000·00c0·0030·0008··​.​.​.​.​.​.​.​.​.​.​.​.​.​0.​.​000085e0:​·​0000·​0000·a2a2·a5a5·a5a5·f5f5·2525·2222··​.​.​.​.​.​.​.​.​.​.​.​.​%%""
000085f0:​·​0004·​0040·0040·003f·0040·003f·0010·0008··​.​.​.​@.​@.​?.​@.​?.​.​.​.​000085f0:​·​0000·​0000·7272·4545·6565·1515·1515·6262··​.​.​.​.​rrEEee.​.​.​.​bb
00008600:​·​0007·​0000·0000·00ff·0000·00ff·0048·0084··​.​.​.​.​.​.​.​.​.​.​.​.​.​H.​.​00008600:​·​0000·​0000·6262·9595·6565·b5b5·9595·6262··​.​.​.​.​bb.​.​ee.​.​.​.​bb
00008610:​·​0003·​0000·0000·00ff·0000·00ff·0012·0021··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​!00008610:​·​0000·​0000·6e6e·eeee·6e6e·6e6e·6f6f·6767··​.​.​.​.​nn.​.​nnnnoogg
00008620:​·​00c0·​0002·0002·00fc·0002·00fc·0008·0010··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008620:​·​0000·​0000·bebe·b9b9·b9b9·bebe·b8b8·3838··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​88
00008630:​·​00e0·​0001·0002·000f·0010·003f·0040·007f··​.​.​.​.​.​.​.​.​.​.​.​?.​@.​.​00008630:​·​0000·​0000·3c3c·6666·5e5e·5e5e·7e7e·3c3c··​.​.​.​.​<<ff^^^^~~<<
00008640:​·​004c·​0080·​0040·​00f0·​0008·00fc·0002·00fe··​.​L.​.​.​@.​.​.​.​.​.​.​.​.​.​00008640:​·​0000·​0000·​0000·​0303·​0c0c·1010·2020·2020··​.​.​.​.​.​.​.​.​.​.​.​.​····
00008650:​·0032·fdfb·fdfb·fdfb·fdfb·fdfb·fdfb·fdfb··.​2.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008650:​·4040·0000·0000·1818·3c24·7a56·3c0c·0818··@@.​.​.​.​.​.​<$zV<.​.​.​
00008660:​·fd03·​0000·​0000·​0018·​0024·​0024·​0018·0000··​.​.​.​.​.​.​.​.​.​$.​$.​.​.​.​00008660:​·0000·​0000·​0000·​0000·​0000·​0303·​0707·6464··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​dd
00008670:​·0000·​00ff·ffff·​0000·​00ff·ffff·0000·e718··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008670:​·5455·​0000·0000·​0000·​0000·e0e0·f0f0·f0a0··TU.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008680:​·0000·e718·0000·e718·0000·e718·0000·e718··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008680:​·f880·7757·7b78·4f4f·7c7c·3838·1f1f·0707··​.​.​wW{xOO||88.​.​.​.​
00008690:​·​0000·8000·8000·8000·8000·8000·8000·8000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008690:​·​0101·f830·f000·f8f8·1c14·7f7d·ccfc·19f9··​.​.​.​0.​.​.​.​.​.​.​}.​.​.​.​
000086a0:​·8000·0020·0050·0090·00a0·0090·0090·004a··​.​.​.​·.​P.​.​.​.​.​.​.​.​.​J000086a0:​·f1f1·f830·f101·f9f9·1c14·7f7d·ccfc·18f8··​.​.​.​0.​.​.​.​.​.​.​}.​.​.​.​
000086b0:​·004d·​0055·​0049·​0029·002a·002a·0014·0014··​.​M.​U.​I.​)​.​*.​*.​.​.​.​000086b0:​·f0f0·​0000·​0707·​0f0f·c9c9·a9ab·efaf·e7a7··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
000086c0:​·000c·​0083·00c6·006d·​00ff·00ff·​00ff·00ff··​.​.​.​.​.​.​.​m.​.​.​.​.​.​.​.​000086c0:​·f390·​0000·e0e0·f0f0·f040·fc00·fc20·f878··​.​.​.​.​.​.​.​.​.​@.​.​.​·.​x
000086d0:​·00ff·00f7·00e3·00c1·0000·0000·0000·​0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000086d0:​·f000·ffff·8f8f·f8f8·e0e0·6f7f·3c3f·​0f0f··​.​.​.​.​.​.​.​.​.​.​o.​<?.​.​
000086e0:​·​0000·0000·0000·0000·0000·0000·0000·0000··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000086e0:​·​0303·fcfc·f7f5·1f15·fcfc·8bfb·1bfb·f3f0··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
000086f0:​·0000·1f1f·7f7f·​ffff·​ffff·​ffff·9999·9999··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​000086f0:​·c3c3·0000·e0e0·​f0f0·​f040·​ff03·ff20·fb7b··​.​.​.​.​.​.​.​.​.​@.​.​.​·.​{
00008700:​·e6e6·​ffff·​ffff·ffff·​ffff·ffff·9999·9999··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008700:​·f303·​fcfc·​f7f5·1f15·​fcfc·88f8·18f8·f0f0··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008710:​·6666·​0000·0000·0000·0000·0000·0000·0000··ff.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008710:​·c0c0·​0000·3c3c·6e6e·5e5e·5e5e·7e7e·3c3c··.​.​.​.​<<nn^^^^~~<<
00008720:​·​0000·f8f8·fefe·ffff·ffff·ffff·9999·9999··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008720:​·​0000·0000·0000·8080·4040·2424·1a1a·0101··​.​.​.​.​.​.​.​.​@@$$.​.​.​.​
00008730:​·6767·eeee·eeee·eeee·eeee·eeee·eeee·​0000··gg.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008730:​·0600·0000·0000·0000·0303·0404·0909·​0b0b··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008740:​·​0000·7f7f·c0c0·a0a0·9f9f·9898·9494·​ffff··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008740:​·​0f0e·0000·0000·0000·​fcfc·e2e2·fdfd·​f991··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​
00008750:​·​ffff·fefe·​0303·​0707·fbfb·1b1b·3b3b·ffff··​.​.​.​.​.​.​.​.​.​.​.​.​;​;​.​.​00008750:​·​fdc1·0f0e·​0908·​0f0f·6764·6464·1417·0303··​.​.​.​.​.​.​.​.​gddd.​.​.​.​
00008760:​·ffff·7f7f·c0c0·a0a0·9f9f·9898·9494·9393··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008760:​·0000·fd19·f901·f9f9·d656·7f3f·7df9·f9fd··​.​.​.​.​.​.​.​.​.​V.​?}.​.​.​
00008770:​·9292·fefe·​0303·​0707·fbfb·1b1b·3b3b·dbdb··​.​.​.​.​.​.​.​.​.​.​.​.​;​;​.​.​00008770:​·fefe·0f0e·​0908·​0f0f·0704·0404·1417·6363··​.​.​.​.​.​.​.​.​.​.​.​.​.​.​cc
00008780:​·dbdb·9393·9393·9494·9f9f·9f9f·a0a0·ffff··.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​.​00008780:​·6060·0f0f·1313·2727·2726·2f2b·3f38·3f38··``.​.​.​.​'''&/​+?8?8
00008790:​·7f7f·dbdb·dbdb·3b3b·​fbfb·​fbfb·0707·​ffff··.​.​.​.​.​.​;​;​.​.​.​.​.​.​.​.​00008790:​·2724·fcfc·e2e2·f9f9·​f141·​fd01·fd21·​f979··'$.​.​.​.​.​.​.​A.​.​.​!.​y
000087a0:​·​fefe·0083·00c6·006d·00ff·00ff·00ff·​00ff··​.​.​.​.​.​.​.​m.​.​.​.​.​.​.​.​000087a0:​·​f101·3f3f·dfd4·d4d4·d4df·343f·1f1f·​0f0f··​.​.​??.​.​.​.​.​.​4?.​.​.​.​
+Max diff block lines reached; 140415/280927 bytes (49.98%) of diff not shown. +
+ + + + diff --git a/src/main.rs b/src/main.rs index 447d7ef..4e61082 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,9 @@ #![allow(dead_code)] #![allow(unused_variables)] +#[macro_use] +extern crate urpc; + #[macro_use] extern crate enum_primitive; extern crate bufstream; @@ -26,6 +29,8 @@ use std::process::Command; use std::thread; use std::time::Duration; +use urpc::{client, consts, OptBufNo, OptBufYes}; + use bufstream::BufStream; use clap::{App, Arg, ArgMatches, SubCommand}; use num::iter::range_step; @@ -69,6 +74,103 @@ enum Memory { Ram, } +mod rpc { + rpc_client_io! { + Client; + client_requests; + (0, ping, Ping([u8; 4], OptBufNo, [u8; 4], OptBufNo)), + (1, send_bytes, SendBytes((), OptBufYes, (), OptBufNo)), + (2, add, Add((u8, u8), OptBufNo, u8, OptBufNo)), + (3, recv_bytes, RecvBytes((), OptBufNo, (), OptBufYes)), + (4, send_recv, SendRecv((), OptBufYes, (), OptBufYes)), + (5, gb_read, GBRead((u16, u16), OptBufNo, (), OptBufYes)), + (6, gb_mode, GBMode((), OptBufNo, bool, OptBufNo)) + } +} + +// struct RpcClientIO { +// client: client::RpcClient, +// stream: S, +// pub stream_buf: Vec, +// pub body_buf: Option>, +// pub opt_buf: Option>, +// } +// +// #[derive(Debug)] +// enum RpcError { +// Io(io::Error), +// Urpc(urpc::client::Error), +// } +// +// impl From for RpcError { +// fn from(err: io::Error) -> Self { +// Self::Io(err) +// } +// } +// +// impl From for RpcError { +// fn from(err: urpc::client::Error) -> Self { +// Self::Urpc(err) +// } +// } +// +// impl RpcClientIO { +// pub fn new(stream: S, buf_len: usize) -> Self { +// Self { +// client: client::RpcClient::new(), +// stream: stream, +// stream_buf: vec![0; buf_len], +// body_buf: Some(vec![0; buf_len]), +// opt_buf: Some(vec![0; buf_len]), +// } +// } +// +// fn request(&mut self, chan_id: u8, write_len: usize) -> Result<(), RpcError> { +// self.stream.write_all(&self.stream_buf[..write_len])?; +// self.stream.flush()?; +// +// let mut pos = 0; +// let mut read_len = consts::REP_HEADER_LEN; +// loop { +// let mut buf = &mut self.stream_buf[..read_len]; +// self.stream.read_exact(&mut buf)?; +// read_len = match self.client.parse(&buf)? { +// (n, None) => n, +// (n, Some(_chan_id)) => { +// if _chan_id == chan_id { +// return Ok(()); +// } +// n +// } +// } +// } +// } +// } +// +// struct RpcClient { +// rpc: RpcClientIO, +// } +// +// impl RpcClient { +// pub fn new(stream: S, buf_len: usize) -> Self { +// Self { +// rpc: RpcClientIO::new(stream, buf_len), +// } +// } +// pub fn add(&mut self, arg: (u8, u8)) -> Result { +// let mut req = rpc::Add::new(arg); +// let write_len = req.request( +// &mut self.rpc.client, +// self.rpc.body_buf.take().unwrap(), +// &mut self.rpc.stream_buf, +// )?; +// self.rpc.request(req.chan_id(), write_len)?; +// let (r, body_buf) = req.take_reply(&mut self.rpc.client).unwrap()?; +// self.rpc.body_buf = Some(body_buf); +// Ok(r) +// } +// } + fn main() { let arg_file = Arg::with_name("file") .help("Set the file to read/write for the cartridge ROM/RAM") @@ -166,7 +268,9 @@ fn main() { SubCommand::with_name("read") .about("read Gameboy ROM test") .arg(arg_file.clone()), - SubCommand::with_name("new_test").about("test urpc"), + SubCommand::with_name("new_test") + .about("test urpc") + .arg(arg_file.clone()), ]); let matches = app.clone().get_matches(); if matches.subcommand_name() == None { @@ -274,6 +378,21 @@ impl Device { } } +impl io::Read for Device { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + self.port.read(buf) + } +} + +impl io::Write for Device { + fn write(&mut self, buf: &[u8]) -> io::Result { + self.port.write(buf) + } + fn flush(&mut self) -> io::Result<()> { + self.port.flush() + } +} + struct Gb { dev: Device, } @@ -553,11 +672,14 @@ fn run_subcommand(matches: ArgMatches) -> Result<(), Error> { ("read", Some(_)) => "", ("read_GBA_test", Some(_)) => "", ("write_GBA_test", Some(_)) => "", - ("new_test", Some(_)) => "", + // ("new_test", Some(_)) => "", (_, Some(sub_m)) => sub_m.value_of("file").unwrap(), _ => unreachable!(), }); + // let mut rpc_client = client::RpcClient::new(); + let mut rpc_client = rpc::Client::new(device, 0x4000); + let result = match matches.subcommand() { ("read_ROM", Some(_)) => { unimplemented!() @@ -615,31 +737,50 @@ fn run_subcommand(matches: ArgMatches) -> Result<(), Error> { // write_ram(&mut port, &rom) } ("read_GBA_ROM", Some(sub_m)) => { - println!("Reading GBA cartridge ROM into {}", path.display()); - let file = OpenOptions::new().write(true).create_new(true).open(path)?; - let size = sub_m.value_of("size").map(|s| s.parse::().unwrap()); - gba_read_rom(&mut Gba::new(device)?, &file, size) + unimplemented!() + // println!("Reading GBA cartridge ROM into {}", path.display()); + // let file = OpenOptions::new().write(true).create_new(true).open(path)?; + // let size = sub_m.value_of("size").map(|s| s.parse::().unwrap()); + // gba_read_rom(&mut Gba::new(device)?, &file, size) } ("read_GBA_test", Some(_)) => { - println!("Reading GBA cartridge ROM into stdout"); - gba_read_test(&mut Gba::new(device)?) + unimplemented!() + // println!("Reading GBA cartridge ROM into stdout"); + // gba_read_test(&mut Gba::new(device)?) } ("write_GBA_test", Some(_)) => { - println!("Writing and reading GBA cartridge data, showing result in stdout"); - gba_write_test(&mut Gba::new(device)?) + unimplemented!() + // println!("Writing and reading GBA cartridge data, showing result in stdout"); + // gba_write_test(&mut Gba::new(device)?) } ("write_GBA_ROM_test", Some(_)) => { - println!("Writing {} into cartridge GBA ROM", path.display()); - let mut rom = Vec::new(); - OpenOptions::new() - .read(true) - .open(path)? - .read_to_end(&mut rom)?; - write_gba_rom_test(&mut Gba::new(device)?, &rom) + unimplemented!() + // println!("Writing {} into cartridge GBA ROM", path.display()); + // let mut rom = Vec::new(); + // OpenOptions::new() + // .read(true) + // .open(path)? + // .read_to_end(&mut rom)?; + // write_gba_rom_test(&mut Gba::new(device)?, &rom) } ("new_test", Some(_)) => { - println!("OK"); - Ok(()) + // let r = rpc_client.ping([0, 1, 2, 3]).unwrap(); + // let r = rpc_client.send_bytes((), &[0, 1, 2, 3]).unwrap(); + // let r = rpc_client.add((3, 2)).unwrap(); + // let r = rpc_client.recv_bytes(()).unwrap(); + // let r = rpc_client.send_recv((), &[1, 2, 3, 4]).unwrap(); + // + //println!("Reading cartridge ROM into {}", path.display()); + let file = OpenOptions::new().write(true).create_new(true).open(path)?; + + rpc_client.gb_mode(()).unwrap(); + println!("GB Mode Set"); + thread::sleep(Duration::from_millis(500)); + // let (_, buf) = rpc_client.gb_read((0x0000, 0x4000)).unwrap(); + // println!("reply: {:?}", buf); + // print_hex(&buf, 0x0000); + // Ok(()) + read(&mut rpc_client, &file, Memory::Rom) } // UPDATE // ("erase", Some(_)) => erase(&mut port), @@ -657,12 +798,114 @@ fn run_subcommand(matches: ArgMatches) -> Result<(), Error> { Some("read_ROM") => fs::remove_file(path).unwrap_or(()), Some("read_RAM") => fs::remove_file(path).unwrap_or(()), Some("read_GBA_ROM") => fs::remove_file(path).unwrap_or(()), + Some("new_test") => fs::remove_file(path).unwrap_or(()), _ => (), } } result } +fn read( + mut rpc_client: &mut rpc::Client, + mut file: &File, + memory: Memory, +) -> Result<(), Error> { + // Read Bank 00 + println!("Reading ROM bank 000"); + let addr_start = 0x0000 as u16; + let size = 0x4000 as u16; + let (_, buf) = rpc_client.gb_read((addr_start, size)).unwrap(); + + println!(); + //print_hex(&buf[0x0000..0x0200], 0x0000); + //println!(); + + let header_info = match parse_header(&buf) { + Ok(header_info) => header_info, + Err(e) => { + return Err(Error::Generic(format!( + "Error parsing cartridge header: {:?}", + e + ))); + } + }; + + let header_checksum = header_checksum(&buf); + + print_header(&header_info); + println!(); + + if header_info.checksum != header_checksum { + return Err(Error::Generic(format!( + "Header checksum mismatch: {:02x} != {:02x}", + header_info.checksum, header_checksum + ))); + } + + // let mut mem = Vec::new(); + // match memory { + // Memory::Rom => { + // mem.extend_from_slice(&buf); + // let addr_start = 0x4000 as u16; + // let addr_end = 0x8000 as u16; + // for bank in 1..(header_info.rom_banks + 1) { + // // Pipeline requests and reads + // if bank != header_info.rom_banks { + // println!("Switching to ROM bank {:03}", bank); + // switch_bank(&mut port, &header_info.mem_controller, &memory, bank)?; + // println!("Reading ROM bank {:03}", bank); + // port.write_all(cmd_gb_read(addr_start, addr_end).as_slice())?; + // port.flush()?; + // } + // if bank != 1 { + // let mut buf = vec![0; (addr_end - addr_start) as usize]; + // port.read_exact(&mut buf)?; + // mem.extend_from_slice(&buf); + // } + // } + // println!(); + // let global_checksum = global_checksum(&mem); + // if header_info.global_checksum != global_checksum { + // println!( + // "Global checksum mismatch: {:02x} != {:02x}", + // header_info.global_checksum, global_checksum + // ); + // } else { + // println!("Global checksum verification successfull!"); + // } + // } + // Memory::Ram => { + // ram_enable(&mut port)?; + // let addr_start = 0xA000 as u16; + // let addr_end = if header_info.ram_size < 0x2000 { + // 0xA000 + header_info.ram_size as u16 + // } else { + // 0xC000 as u16 + // }; + // for bank in 0..(header_info.ram_banks + 1) { + // // Pipeline requests and reads + // if bank != header_info.ram_banks { + // println!("Switching to RAM bank {:03}", bank); + // switch_bank(&mut port, &header_info.mem_controller, &memory, bank)?; + // println!("Reading RAM bank {:03}", bank); + // port.write_all(cmd_gb_read(addr_start, addr_end).as_slice())?; + // port.flush()?; + // } + // if bank != 0 { + // let mut buf = vec![0; (addr_end - addr_start) as usize]; + // port.read_exact(&mut buf)?; + // mem.extend_from_slice(&buf); + // } + // } + // println!(); + // ram_disable(&mut port)?; + // } + // } + // println!("Writing file..."); + // file.write_all(&mem)?; + Ok(()) +} + // UPDATE // fn read( // mut port: &mut BufStream,