commit
01cc63c7f1
16 changed files with 2240 additions and 0 deletions
@ -0,0 +1 @@ |
|||
/target |
@ -0,0 +1,8 @@ |
|||
# Default ignored files |
|||
/shelf/ |
|||
/workspace.xml |
|||
# Datasource local storage ignored files |
|||
/dataSources/ |
|||
/dataSources.local.xml |
|||
# Editor-based HTTP Client requests |
|||
/httpRequests/ |
@ -0,0 +1,8 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="ProjectModuleManager"> |
|||
<modules> |
|||
<module fileurl="file://$PROJECT_DIR$/.idea/side.iml" filepath="$PROJECT_DIR$/.idea/side.iml" /> |
|||
</modules> |
|||
</component> |
|||
</project> |
@ -0,0 +1,12 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<module type="WEB_MODULE" version="4"> |
|||
<component name="Go" enabled="true" /> |
|||
<component name="NewModuleRootManager"> |
|||
<content url="file://$MODULE_DIR$"> |
|||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> |
|||
<excludeFolder url="file://$MODULE_DIR$/target" /> |
|||
</content> |
|||
<orderEntry type="inheritedJdk" /> |
|||
<orderEntry type="sourceFolder" forTests="false" /> |
|||
</component> |
|||
</module> |
@ -0,0 +1,7 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="VcsDirectoryMappings"> |
|||
<mapping directory="$PROJECT_DIR$" vcs="Git" /> |
|||
<mapping directory="$PROJECT_DIR$/font8x8" vcs="Git" /> |
|||
</component> |
|||
</project> |
@ -0,0 +1,903 @@ |
|||
# This file is automatically @generated by Cargo. |
|||
# It is not intended for manual editing. |
|||
version = 3 |
|||
|
|||
[[package]] |
|||
name = "adler" |
|||
version = "1.0.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" |
|||
|
|||
[[package]] |
|||
name = "aho-corasick" |
|||
version = "0.7.18" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" |
|||
dependencies = [ |
|||
"memchr", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "ansi_term" |
|||
version = "0.11.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" |
|||
dependencies = [ |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "atty" |
|||
version = "0.2.14" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" |
|||
dependencies = [ |
|||
"hermit-abi", |
|||
"libc", |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "autocfg" |
|||
version = "1.0.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" |
|||
|
|||
[[package]] |
|||
name = "bindgen" |
|||
version = "0.56.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "2da379dbebc0b76ef63ca68d8fc6e71c0f13e59432e0987e508c1820e6ab5239" |
|||
dependencies = [ |
|||
"bitflags", |
|||
"cexpr", |
|||
"clang-sys", |
|||
"clap", |
|||
"env_logger", |
|||
"lazy_static", |
|||
"lazycell", |
|||
"log", |
|||
"peeking_take_while", |
|||
"proc-macro2", |
|||
"quote", |
|||
"regex", |
|||
"rustc-hash", |
|||
"shlex", |
|||
"which", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "bitflags" |
|||
version = "1.2.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" |
|||
|
|||
[[package]] |
|||
name = "bumpalo" |
|||
version = "3.8.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" |
|||
|
|||
[[package]] |
|||
name = "cc" |
|||
version = "1.0.71" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "79c2681d6594606957bbb8631c4b90a7fcaaa72cdb714743a437b156d6a7eedd" |
|||
|
|||
[[package]] |
|||
name = "cexpr" |
|||
version = "0.4.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" |
|||
dependencies = [ |
|||
"nom 5.1.2", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "cfg-if" |
|||
version = "0.1.10" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" |
|||
|
|||
[[package]] |
|||
name = "cfg-if" |
|||
version = "1.0.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" |
|||
|
|||
[[package]] |
|||
name = "clang-sys" |
|||
version = "1.3.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "fa66045b9cb23c2e9c1520732030608b02ee07e5cfaa5a521ec15ded7fa24c90" |
|||
dependencies = [ |
|||
"glob", |
|||
"libc", |
|||
"libloading", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "clap" |
|||
version = "2.33.3" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" |
|||
dependencies = [ |
|||
"ansi_term", |
|||
"atty", |
|||
"bitflags", |
|||
"strsim", |
|||
"textwrap", |
|||
"unicode-width", |
|||
"vec_map", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "cmake" |
|||
version = "0.1.46" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "b7b858541263efe664aead4a5209a4ae5c5d2811167d4ed4ee0944503f8d2089" |
|||
dependencies = [ |
|||
"cc", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "crc32fast" |
|||
version = "1.2.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" |
|||
dependencies = [ |
|||
"cfg-if 1.0.0", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "downcast-rs" |
|||
version = "1.2.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" |
|||
|
|||
[[package]] |
|||
name = "encoding_rs" |
|||
version = "0.8.29" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "a74ea89a0a1b98f6332de42c95baff457ada66d1cb4030f9ff151b2041a1c746" |
|||
dependencies = [ |
|||
"cfg-if 1.0.0", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "env_logger" |
|||
version = "0.8.4" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" |
|||
dependencies = [ |
|||
"atty", |
|||
"humantime", |
|||
"log", |
|||
"regex", |
|||
"termcolor", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "filetime" |
|||
version = "0.2.15" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" |
|||
dependencies = [ |
|||
"cfg-if 1.0.0", |
|||
"libc", |
|||
"redox_syscall", |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "flate2" |
|||
version = "1.0.22" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" |
|||
dependencies = [ |
|||
"cfg-if 1.0.0", |
|||
"crc32fast", |
|||
"libc", |
|||
"miniz_oxide", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "font8x8" |
|||
version = "0.3.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "875488b8711a968268c7cf5d139578713097ca4635a76044e8fe8eedf831d07e" |
|||
|
|||
[[package]] |
|||
name = "getrandom" |
|||
version = "0.2.3" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" |
|||
dependencies = [ |
|||
"cfg-if 1.0.0", |
|||
"libc", |
|||
"wasi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "glob" |
|||
version = "0.3.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" |
|||
|
|||
[[package]] |
|||
name = "hermit-abi" |
|||
version = "0.1.19" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" |
|||
dependencies = [ |
|||
"libc", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "humantime" |
|||
version = "2.1.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" |
|||
|
|||
[[package]] |
|||
name = "js-sys" |
|||
version = "0.3.55" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" |
|||
dependencies = [ |
|||
"wasm-bindgen", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "lazy_static" |
|||
version = "1.4.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" |
|||
|
|||
[[package]] |
|||
name = "lazycell" |
|||
version = "1.3.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" |
|||
|
|||
[[package]] |
|||
name = "libc" |
|||
version = "0.2.107" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" |
|||
|
|||
[[package]] |
|||
name = "libloading" |
|||
version = "0.7.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "c0cf036d15402bea3c5d4de17b3fce76b3e4a56ebc1f577be0e7a72f7c607cf0" |
|||
dependencies = [ |
|||
"cfg-if 1.0.0", |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "log" |
|||
version = "0.4.14" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" |
|||
dependencies = [ |
|||
"cfg-if 1.0.0", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "memchr" |
|||
version = "2.4.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" |
|||
|
|||
[[package]] |
|||
name = "memoffset" |
|||
version = "0.6.4" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" |
|||
dependencies = [ |
|||
"autocfg", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "minifb" |
|||
version = "0.19.3" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "7b6e41119d1667465608d36488fa5dcd228057a26c156e25f17f492f38435124" |
|||
dependencies = [ |
|||
"cc", |
|||
"orbclient", |
|||
"raw-window-handle", |
|||
"tempfile", |
|||
"wayland-client", |
|||
"wayland-cursor", |
|||
"wayland-protocols", |
|||
"winapi", |
|||
"x11-dl", |
|||
"xkb", |
|||
"xkbcommon-sys", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "minimal-lexical" |
|||
version = "0.2.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" |
|||
|
|||
[[package]] |
|||
name = "miniz_oxide" |
|||
version = "0.4.4" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" |
|||
dependencies = [ |
|||
"adler", |
|||
"autocfg", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "nix" |
|||
version = "0.20.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "f5e06129fb611568ef4e868c14b326274959aa70ff7776e9d55323531c374945" |
|||
dependencies = [ |
|||
"bitflags", |
|||
"cc", |
|||
"cfg-if 1.0.0", |
|||
"libc", |
|||
"memoffset", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "nom" |
|||
version = "5.1.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" |
|||
dependencies = [ |
|||
"memchr", |
|||
"version_check", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "nom" |
|||
version = "7.1.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" |
|||
dependencies = [ |
|||
"memchr", |
|||
"minimal-lexical", |
|||
"version_check", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "once_cell" |
|||
version = "1.8.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" |
|||
|
|||
[[package]] |
|||
name = "orbclient" |
|||
version = "0.3.31" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "0c976c5018e7f1db4359616d8b31ef8ae7d9649b11803c0b38fff67fd2999fc8" |
|||
dependencies = [ |
|||
"libc", |
|||
"raw-window-handle", |
|||
"redox_syscall", |
|||
"sdl2", |
|||
"sdl2-sys", |
|||
"wasm-bindgen", |
|||
"web-sys", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "peeking_take_while" |
|||
version = "0.1.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" |
|||
|
|||
[[package]] |
|||
name = "pkg-config" |
|||
version = "0.3.22" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" |
|||
|
|||
[[package]] |
|||
name = "ppv-lite86" |
|||
version = "0.2.15" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" |
|||
|
|||
[[package]] |
|||
name = "proc-macro2" |
|||
version = "1.0.32" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" |
|||
dependencies = [ |
|||
"unicode-xid", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "quote" |
|||
version = "1.0.10" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" |
|||
dependencies = [ |
|||
"proc-macro2", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "rand" |
|||
version = "0.8.4" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" |
|||
dependencies = [ |
|||
"libc", |
|||
"rand_chacha", |
|||
"rand_core", |
|||
"rand_hc", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "rand_chacha" |
|||
version = "0.3.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" |
|||
dependencies = [ |
|||
"ppv-lite86", |
|||
"rand_core", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "rand_core" |
|||
version = "0.6.3" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" |
|||
dependencies = [ |
|||
"getrandom", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "rand_hc" |
|||
version = "0.3.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" |
|||
dependencies = [ |
|||
"rand_core", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "raw-window-handle" |
|||
version = "0.3.3" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "0a441a7a6c80ad6473bd4b74ec1c9a4c951794285bf941c2126f607c72e48211" |
|||
dependencies = [ |
|||
"libc", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "redox_syscall" |
|||
version = "0.2.10" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" |
|||
dependencies = [ |
|||
"bitflags", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "regex" |
|||
version = "1.5.4" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" |
|||
dependencies = [ |
|||
"aho-corasick", |
|||
"memchr", |
|||
"regex-syntax", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "regex-syntax" |
|||
version = "0.6.25" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" |
|||
|
|||
[[package]] |
|||
name = "remove_dir_all" |
|||
version = "0.5.3" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" |
|||
dependencies = [ |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "rustc-hash" |
|||
version = "1.1.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" |
|||
|
|||
[[package]] |
|||
name = "sdl2" |
|||
version = "0.34.5" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "deecbc3fa9460acff5a1e563e05cb5f31bba0aa0c214bb49a43db8159176d54b" |
|||
dependencies = [ |
|||
"bitflags", |
|||
"lazy_static", |
|||
"libc", |
|||
"raw-window-handle", |
|||
"sdl2-sys", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "sdl2-sys" |
|||
version = "0.34.5" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "41a29aa21f175b5a41a6e26da572d5e5d1ee5660d35f9f9d0913e8a802098f74" |
|||
dependencies = [ |
|||
"cfg-if 0.1.10", |
|||
"cmake", |
|||
"flate2", |
|||
"libc", |
|||
"tar", |
|||
"unidiff", |
|||
"version-compare", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "shlex" |
|||
version = "0.1.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" |
|||
|
|||
[[package]] |
|||
name = "side" |
|||
version = "0.1.0" |
|||
dependencies = [ |
|||
"font8x8", |
|||
"minifb", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "smallvec" |
|||
version = "1.7.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" |
|||
|
|||
[[package]] |
|||
name = "strsim" |
|||
version = "0.8.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" |
|||
|
|||
[[package]] |
|||
name = "syn" |
|||
version = "1.0.81" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "f2afee18b8beb5a596ecb4a2dce128c719b4ba399d34126b9e4396e3f9860966" |
|||
dependencies = [ |
|||
"proc-macro2", |
|||
"quote", |
|||
"unicode-xid", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "tar" |
|||
version = "0.4.37" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d6f5515d3add52e0bbdcad7b83c388bb36ba7b754dda3b5f5bc2d38640cdba5c" |
|||
dependencies = [ |
|||
"filetime", |
|||
"libc", |
|||
"xattr", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "tempfile" |
|||
version = "3.2.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" |
|||
dependencies = [ |
|||
"cfg-if 1.0.0", |
|||
"libc", |
|||
"rand", |
|||
"redox_syscall", |
|||
"remove_dir_all", |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "termcolor" |
|||
version = "1.1.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" |
|||
dependencies = [ |
|||
"winapi-util", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "textwrap" |
|||
version = "0.11.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" |
|||
dependencies = [ |
|||
"unicode-width", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "unicode-width" |
|||
version = "0.1.9" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" |
|||
|
|||
[[package]] |
|||
name = "unicode-xid" |
|||
version = "0.2.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" |
|||
|
|||
[[package]] |
|||
name = "unidiff" |
|||
version = "0.3.3" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d8a62719acf1933bfdbeb73a657ecd9ecece70b405125267dd549e2e2edc232c" |
|||
dependencies = [ |
|||
"encoding_rs", |
|||
"lazy_static", |
|||
"regex", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "vec_map" |
|||
version = "0.8.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" |
|||
|
|||
[[package]] |
|||
name = "version-compare" |
|||
version = "0.0.10" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1" |
|||
|
|||
[[package]] |
|||
name = "version_check" |
|||
version = "0.9.3" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" |
|||
|
|||
[[package]] |
|||
name = "wasi" |
|||
version = "0.10.2+wasi-snapshot-preview1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" |
|||
|
|||
[[package]] |
|||
name = "wasm-bindgen" |
|||
version = "0.2.78" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" |
|||
dependencies = [ |
|||
"cfg-if 1.0.0", |
|||
"wasm-bindgen-macro", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "wasm-bindgen-backend" |
|||
version = "0.2.78" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" |
|||
dependencies = [ |
|||
"bumpalo", |
|||
"lazy_static", |
|||
"log", |
|||
"proc-macro2", |
|||
"quote", |
|||
"syn", |
|||
"wasm-bindgen-shared", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "wasm-bindgen-macro" |
|||
version = "0.2.78" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" |
|||
dependencies = [ |
|||
"quote", |
|||
"wasm-bindgen-macro-support", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "wasm-bindgen-macro-support" |
|||
version = "0.2.78" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" |
|||
dependencies = [ |
|||
"proc-macro2", |
|||
"quote", |
|||
"syn", |
|||
"wasm-bindgen-backend", |
|||
"wasm-bindgen-shared", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "wasm-bindgen-shared" |
|||
version = "0.2.78" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" |
|||
|
|||
[[package]] |
|||
name = "wayland-client" |
|||
version = "0.28.6" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "e3ab332350e502f159382201394a78e3cc12d0f04db863429260164ea40e0355" |
|||
dependencies = [ |
|||
"bitflags", |
|||
"downcast-rs", |
|||
"libc", |
|||
"nix", |
|||
"wayland-commons", |
|||
"wayland-scanner", |
|||
"wayland-sys", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "wayland-commons" |
|||
version = "0.28.6" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "a21817947c7011bbd0a27e11b17b337bfd022e8544b071a2641232047966fbda" |
|||
dependencies = [ |
|||
"nix", |
|||
"once_cell", |
|||
"smallvec", |
|||
"wayland-sys", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "wayland-cursor" |
|||
version = "0.28.6" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "be610084edd1586d45e7bdd275fe345c7c1873598caa464c4fb835dee70fa65a" |
|||
dependencies = [ |
|||
"nix", |
|||
"wayland-client", |
|||
"xcursor", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "wayland-protocols" |
|||
version = "0.28.6" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "286620ea4d803bacf61fa087a4242ee316693099ee5a140796aaba02b29f861f" |
|||
dependencies = [ |
|||
"bitflags", |
|||
"wayland-client", |
|||
"wayland-commons", |
|||
"wayland-scanner", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "wayland-scanner" |
|||
version = "0.28.6" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "ce923eb2deb61de332d1f356ec7b6bf37094dc5573952e1c8936db03b54c03f1" |
|||
dependencies = [ |
|||
"proc-macro2", |
|||
"quote", |
|||
"xml-rs", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "wayland-sys" |
|||
version = "0.28.6" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d841fca9aed7febf9bed2e9796c49bf58d4152ceda8ac949ebe00868d8f0feb8" |
|||
dependencies = [ |
|||
"pkg-config", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "web-sys" |
|||
version = "0.3.55" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" |
|||
dependencies = [ |
|||
"js-sys", |
|||
"wasm-bindgen", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "which" |
|||
version = "3.1.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" |
|||
dependencies = [ |
|||
"libc", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "winapi" |
|||
version = "0.3.9" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" |
|||
dependencies = [ |
|||
"winapi-i686-pc-windows-gnu", |
|||
"winapi-x86_64-pc-windows-gnu", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "winapi-i686-pc-windows-gnu" |
|||
version = "0.4.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" |
|||
|
|||
[[package]] |
|||
name = "winapi-util" |
|||
version = "0.1.5" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" |
|||
dependencies = [ |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "winapi-x86_64-pc-windows-gnu" |
|||
version = "0.4.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" |
|||
|
|||
[[package]] |
|||
name = "x11-dl" |
|||
version = "2.19.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" |
|||
dependencies = [ |
|||
"lazy_static", |
|||
"libc", |
|||
"pkg-config", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "xattr" |
|||
version = "0.2.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" |
|||
dependencies = [ |
|||
"libc", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "xcursor" |
|||
version = "0.3.4" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" |
|||
dependencies = [ |
|||
"nom 7.1.0", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "xkb" |
|||
version = "0.2.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "aec02bc5de902aa579f3d2f2c522edaf40fa42963cbaffe645b058ddcc68fdb2" |
|||
dependencies = [ |
|||
"bitflags", |
|||
"libc", |
|||
"xkbcommon-sys", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "xkbcommon-sys" |
|||
version = "0.7.5" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "59a001b79d45b0b4541c228a501177f2b35db976bf7ee3f7fce8fa2381554ab5" |
|||
dependencies = [ |
|||
"bindgen", |
|||
"libc", |
|||
"pkg-config", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "xml-rs" |
|||
version = "0.8.4" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" |
@ -0,0 +1,10 @@ |
|||
[package] |
|||
name = "side" |
|||
version = "0.1.0" |
|||
edition = "2018" |
|||
|
|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
|||
|
|||
[dependencies] |
|||
minifb = "0.19.3" |
|||
font8x8 = "0.3.1" |
@ -0,0 +1,178 @@ |
|||
# Philosophy of Boo OS |
|||
|
|||
> Operating System: An operating system is a collection of things that don't fit into a language. There shouldn't be one. - [Design Principles Behind Smalltalk](https://www.cs.virginia.edu/~evans/cs655/readings/smalltalk.html) |
|||
|
|||
Boo OS is a meditation on recursive complexity and the curse of simplicity. In an age where computers are so powerful, it is sometimes healing to start again. |
|||
|
|||
I have often been stuck between my desire to build either an operating system, a shell, a language or an ide. None |
|||
of those categories ever quite fit the hole I was intending them to fill. |
|||
|
|||
After much introspection and research I finally decided that what I really needed was something different. |
|||
|
|||
Inspired by smalltalk, Boo OS is "image" based, the entire system can be dumped and reloaded to the same state. |
|||
|
|||
Eventually my plan is that Boo OS contain all the essentials necessary for **self modification**. It should be possible to (safely) modify the operating system from within the operating system and have the changes take effect. |
|||
|
|||
How that will look is undecided. For now, Boo OS is coded entirely in Boo Bytecode Assembly Language and assembled |
|||
using a Rust based assembler. One of my first targets for a real application is an Assembler written in Boo Bytecode, |
|||
run on BooOS and outputting a Boo Bytecode image. |
|||
|
|||
## BooVM |
|||
|
|||
Boo OS is written in Boo Bytecode which is run by the Boo Virtual Machine (BooVM). BooVM and Boo Bytecode is inspired |
|||
by various retro computing architectures with minimal instructions, but a focus on integrating with the core |
|||
systems. |
|||
|
|||
As such. the BooVM offers minimal integration with the outside world. Interaction is limited to: |
|||
|
|||
- Reading and Writing BooVM images to/from the Host OS |
|||
- Exposing The State of the Keyboard and Mouse |
|||
- Offering a Framebuffer for Display Output |
|||
- (Provisional) Reading and Writing "Files" from the Host OS OR Loading and Interacting with a generalized |
|||
File System that can be loaded by both operating systems (i.e. some kind of virtual disk image) |
|||
|
|||
### Why Write a Custom VM? |
|||
|
|||
Why Not? This is a meditation on recursive complexity. I was already set on writing a new language and building one from the ground up on a custom instruction set seemed like a great idea. |
|||
|
|||
The longer version is that I looked into many options for the base of this project. They fell into |
|||
two main categories: |
|||
|
|||
The first featured existing ISA emulations (e.g. QEMU) and existing production ready language virtual machines (e.g. JVM, Lua) - I decided that using an existing architecture wasn't in the spirit of the project. Further, both of these options |
|||
would require extra work to integrate a framebuffer display and input up to the extent where I would be writing an OS |
|||
for an existing architecture. I wanted to keep the wrapping interface to the host OS as simple as possible. |
|||
|
|||
The second category featured older reto architectures, emulators and the like. I rejected this approach because |
|||
there are some details I don't want to care about, like scanlines and cartridge layouts. This approach would also |
|||
make interaction with the Host OS a project in itself likely requiring forking and significant rework resulting in |
|||
a custom emulator any way. |
|||
|
|||
After research, designing and implementing an assembler for some custom bytecode and building a small VM to run |
|||
it seemed to be the simplest option and provides me with a lot of freedom moving forward, and lends itself to |
|||
infinite experimentation. |
|||
|
|||
## TODO List |
|||
|
|||
The below represents some ideas for projects to tackle within Boo OS. |
|||
|
|||
- [x] Print Strings to the FrameBuffer |
|||
- [x] Set Framebuffer Position Helper Function |
|||
- [x] `put_char` Helper Function |
|||
- [ ] Memory Management |
|||
- [ ] Heap Design |
|||
- [ ] Implement Helper Functions `alloc` and `free` |
|||
- [ ] Memory Safety |
|||
- [ ] Keyboard Input |
|||
- [ ] Designing Input Interaction (poll v.s. interrupts) |
|||
- [ ] Create a Console Shell to Interact with the System |
|||
- [ ] At first this shell will be limited to pre-programmed commands |
|||
- [ ] But, it should quickly all the construction of new commands from old ones |
|||
- [ ] Finally, the shell should facilitate saving and loading of images |
|||
- [ ] Write a Bootstrapped Assembler Application in Boo Bytecode Assembly |
|||
|
|||
|
|||
|
|||
# Formal Reqs |
|||
|
|||
|
|||
Run time: |
|||
- Memory needs R/W/E flags - 3 bits |
|||
- Mapping Memory before handing off to lesser privileged processes |
|||
- Needs some understanding off operating mode |
|||
|
|||
|
|||
- Never attempt to pop an empty stack |
|||
|
|||
|
|||
|
|||
Memory |
|||
|
|||
We treat each 64 chunks of memory as a single page: |
|||
|
|||
0x0000 4800 Pages of Write only Display Memory |
|||
0x4B000 1 Page of Registers [rip, mode, display, rax, r2, r3, r4, r5, r6, r7, r8] |
|||
0x4B040 1 Page of Call Stack |
|||
0x4B080 1 Page of Input Flags (Keys Down etc) |
|||
0x4B0C0 Dynamic Memory Begins |
|||
|
|||
|
|||
## Instructions |
|||
|
|||
All instructions are fixed length. |
|||
|
|||
|
|||
## Meta Instructions |
|||
|
|||
0x00 - Nop |
|||
0x01 - Update Display |
|||
0x0F - HLT |
|||
|
|||
## Dynamic Instructions |
|||
|
|||
Prefix 0x1#,0x2#,0x3# are given to dynamin register based commands |
|||
|
|||
- 0x1n STORE(n) $Addr (R(n)) -> Addr) |
|||
- 0x2n LOAD(n) $Addr (Addr -> R(n)) |
|||
- 0x3n LOADI(n) IMM (Immediate -> R(n)) |
|||
- 0x4n INC(n) |
|||
- 0x5n DEC(n) |
|||
- 0x6n ISTORE(n) |
|||
- 0x7n x LDSTORE Load the Address Stored in n into reg(x) |
|||
- 0x8n x Transfer R(n) to R(x) |
|||
|
|||
|
|||
- 0x9n Shift |
|||
|
|||
## Arithmetic |
|||
|
|||
Prefix 0xa# is given to arithmetic functions |
|||
|
|||
- 0xa1 ADD (R2 + R3 -> RAX) |
|||
- 0xa2 SUB (R2 - R3 -> RAX) |
|||
- 0xa3 MUL (R2 * R3 -> RAX) |
|||
- 0xa4 DIV (R2 / R3 -> RAX) |
|||
- 0xa5 SHIFT (R2 >> R3 -> RAX) |
|||
- 0xa6 AND (R2 & R3 -> RAX) |
|||
|
|||
|
|||
# Stack |
|||
|
|||
Prefix 0xc# allows call stack manipulation. The machine denotes 64 memory addresses at memoo |
|||
|
|||
- 0xc0 RET |
|||
- 0xc1 PUSH Call Stack |
|||
|
|||
# Jumps and Branches (0x5#) |
|||
|
|||
- 0xE0 JMP $Addr - Unconditional jump to $Addr |
|||
- 0xE1 JMPEQ $Addr (if R1 == R2 jmp $Addr else ) |
|||
- 0xE2 JMPNEQ $Addr (if R1 != R2 jmp $Addr else ) |
|||
- 0xE3 JMPGT $Addr (if R1 > R2 jmp $Addr else ) |
|||
- 0xE4 JMPLT $Addr (if R1 < R2 jmp $Addr else ) |
|||
- 0xE5 JMPGEQ $Addr (if R1 >= R2 jmp $Addr else ) |
|||
- 0xE6 JMPLEQ $Addr (if R1 <= R2 jmp $Addr else ) |
|||
|
|||
## Admin Mode Instructions |
|||
|
|||
Instructions prefixed with 0xF are admin instructions |
|||
|
|||
- 0xF0 UNSET_R $Addr (Sets the 64 addresses after $Addr as Not Readable) |
|||
- 0xF1 SET_R $Addr (Sets the 64 addresses after $Addr as Readable) |
|||
|
|||
- 0xF2 UNSET_W $Addr (Sets the 64 addresses after $Addr as Not Writable) |
|||
- 0xF3 SET_W $Addr (Sets the 64 addresses after $Addr as Writable) |
|||
|
|||
- 0xF4 UNSET_X $Addr (Sets the 64 addresses after $Addr as Not Executable) |
|||
- 0xF5 SET_X $Addr (Sets the 64 addresses after $Addr as Executable) |
|||
|
|||
- 0xFF DROP_MODE $Addr - Drops from Admin Mode into User Mode (No access to Admin mode instructions) |
|||
|
|||
|
|||
|
|||
0: LOAD_IMM 10 |
|||
1: NOP |
|||
2: DEC(1) |
|||
3: JNEQ |
|||
|
|||
|
|||
## |
@ -0,0 +1,290 @@ |
|||
label char_space: |
|||
$00000000 |
|||
$00000000 |
|||
label char_!: |
|||
$183c3c18 |
|||
$18001800 |
|||
label char_": |
|||
$36360000 |
|||
$00000000 |
|||
label char_#: |
|||
$36367f36 |
|||
$7f363600 |
|||
label char_$: |
|||
$0c3e031e |
|||
$301f0c00 |
|||
label char_%: |
|||
$00633318 |
|||
$0c666300 |
|||
label char_&: |
|||
$1c361c6e |
|||
$3b336e00 |
|||
label char_': |
|||
$06060300 |
|||
$00000000 |
|||
label char_(: |
|||
$180c0606 |
|||
$060c1800 |
|||
label char_): |
|||
$060c1818 |
|||
$180c0600 |
|||
label char_*: |
|||
$00663cff |
|||
$3c660000 |
|||
label char_+: |
|||
$000c0c3f |
|||
$0c0c0000 |
|||
label char_,: |
|||
$00000000 |
|||
$000c0c06 |
|||
label char_-: |
|||
$0000003f |
|||
$00000000 |
|||
label char_.: |
|||
$00000000 |
|||
$000c0c00 |
|||
label char_/: |
|||
$6030180c |
|||
$06030100 |
|||
label char_0: |
|||
$3e63737b |
|||
$6f673e00 |
|||
label char_1: |
|||
$0c0e0c0c |
|||
$0c0c3f00 |
|||
label char_2: |
|||
$1e33301c |
|||
$06333f00 |
|||
label char_3: |
|||
$1e33301c |
|||
$30331e00 |
|||
label char_4: |
|||
$383c3633 |
|||
$7f307800 |
|||
label char_5: |
|||
$3f031f30 |
|||
$30331e00 |
|||
label char_6: |
|||
$1c06031f |
|||
$33331e00 |
|||
label char_7: |
|||
$3f333018 |
|||
$0c0c0c00 |
|||
label char_8: |
|||
$1e33331e |
|||
$33331e00 |
|||
label char_9: |
|||
$1e33333e |
|||
$30180e00 |
|||
label char_:: |
|||
$000c0c00 |
|||
$000c0c00 |
|||
label char_;: |
|||
$000c0c00 |
|||
$000c0c06 |
|||
label char_<: |
|||
$180c0603 |
|||
$060c1800 |
|||
label char_=: |
|||
$00003f00 |
|||
$003f0000 |
|||
label char_>: |
|||
$060c1830 |
|||
$180c0600 |
|||
label char_?: |
|||
$1e333018 |
|||
$0c000c00 |
|||
label char_@: |
|||
$3e637b7b |
|||
$7b031e00 |
|||
label char_A: |
|||
$0c1e3333 |
|||
$3f333300 |
|||
label char_B: |
|||
$3f66663e |
|||
$66663f00 |
|||
label char_C: |
|||
$3c660303 |
|||
$03663c00 |
|||
label char_D: |
|||
$1f366666 |
|||
$66361f00 |
|||
label char_E: |
|||
$7f46161e |
|||
$16467f00 |
|||
label char_F: |
|||
$7f46161e |
|||
$16060f00 |
|||
label char_G: |
|||
$3c660303 |
|||
$73667c00 |
|||
label char_H: |
|||
$3333333f |
|||
$33333300 |
|||
label char_I: |
|||
$1e0c0c0c |
|||
$0c0c1e00 |
|||
label char_J: |
|||
$78303030 |
|||
$33331e00 |
|||
label char_K: |
|||
$6766361e |
|||
$36666700 |
|||
label char_L: |
|||
$0f060606 |
|||
$46667f00 |
|||
label char_M: |
|||
$63777f7f |
|||
$6b636300 |
|||
label char_N: |
|||
$63676f7b |
|||
$73636300 |
|||
label char_O: |
|||
$1c366363 |
|||
$63361c00 |
|||
label char_P: |
|||
$3f66663e |
|||
$06060f00 |
|||
label char_Q: |
|||
$1e333333 |
|||
$3b1e3800 |
|||
label char_R: |
|||
$3f66663e |
|||
$36666700 |
|||
label char_S: |
|||
$1e33070e |
|||
$38331e00 |
|||
label char_T: |
|||
$3f2d0c0c |
|||
$0c0c1e00 |
|||
label char_U: |
|||
$33333333 |
|||
$33333f00 |
|||
label char_V: |
|||
$33333333 |
|||
$331e0c00 |
|||
label char_W: |
|||
$6363636b |
|||
$7f776300 |
|||
label char_X: |
|||
$6363361c |
|||
$1c366300 |
|||
label char_Y: |
|||
$3333331e |
|||
$0c0c1e00 |
|||
label char_Z: |
|||
$7f633118 |
|||
$4c667f00 |
|||
label char_[: |
|||
$1e060606 |
|||
$06061e00 |
|||
label char_\: |
|||
$03060c18 |
|||
$30604000 |
|||
label char_]: |
|||
$1e181818 |
|||
$18181e00 |
|||
label char_^: |
|||
$081c3663 |
|||
$00000000 |
|||
label char__: |
|||
$00000000 |
|||
$000000ff |
|||
label char_`: |
|||
$0c0c1800 |
|||
$00000000 |
|||
label char_a: |
|||
$00001e30 |
|||
$3e336e00 |
|||
label char_b: |
|||
$0706063e |
|||
$66663b00 |
|||
label char_c: |
|||
$00001e33 |
|||
$03331e00 |
|||
label char_d: |
|||
$3830303e |
|||
$33336e00 |
|||
label char_e: |
|||
$00001e33 |
|||
$3f031e00 |
|||
label char_f: |
|||
$1c36060f |
|||
$06060f00 |
|||
label char_g: |
|||
$00006e33 |
|||
$333e301f |
|||
label char_h: |
|||
$0706366e |
|||
$66666700 |
|||
label char_i: |
|||
$0c000e0c |
|||
$0c0c1e00 |
|||
label char_j: |
|||
$30003030 |
|||
$3033331e |
|||
label char_k: |
|||
$07066636 |
|||
$1e366700 |
|||
label char_l: |
|||
$0e0c0c0c |
|||
$0c0c1e00 |
|||
label char_m: |
|||
$0000337f |
|||
$7f6b6300 |
|||
label char_n: |
|||
$00001f33 |
|||
$33333300 |
|||
label char_o: |
|||
$00001e33 |
|||
$33331e00 |
|||
label char_p: |
|||
$00003b66 |
|||
$663e060f |
|||
label char_q: |
|||
$00006e33 |
|||
$333e3078 |
|||
label char_r: |
|||
$00003b6e |
|||
$66060f00 |
|||
label char_s: |
|||
$00003e03 |
|||
$1e301f00 |
|||
label char_t: |
|||
$080c3e0c |
|||
$0c2c1800 |
|||
label char_u: |
|||
$00003333 |
|||
$33336e00 |
|||
label char_v: |
|||
$00003333 |
|||
$331e0c00 |
|||
label char_w: |
|||
$0000636b |
|||
$7f7f3600 |
|||
label char_x: |
|||
$00006336 |
|||
$1c366300 |
|||
label char_y: |
|||
$00003333 |
|||
$333e301f |
|||
label char_z: |
|||
$00003f19 |
|||
$0c263f00 |
|||
label char_{: |
|||
$380c0c07 |
|||
$0c0c3800 |
|||
label char_|: |
|||
$18181800 |
|||
$18181800 |
|||
label char_}: |
|||
$070c0c38 |
|||
$0c0c0700 |
|||
label char_~: |
|||
$6e3b0000 |
|||
$00000000 |
|||
label char_delete: |
|||
$00000000 |
|||
$00000000 |
|||
|
|||
data ascii HEX_TABLE 0123456789ABCDEF |
@ -0,0 +1,5 @@ |
|||
label set_pos: |
|||
loadi 2 $280 |
|||
mul $2 $A $2 ; Mul Y * 640 |
|||
add $2 $9 $B ; + X = VBUF POS |
|||
ret |
@ -0,0 +1,71 @@ |
|||
@ $00000: |
|||
label vbuf: |
|||
|
|||
@ $4B000: |
|||
$5B000 ; Set Instruction Pointer to $5B000 |
|||
label RAX: |
|||
$0000000 ; RAX |
|||
$0000000 ; R2 - Temp Scratch |
|||
$0000000 ; R3 - Temp Scratch |
|||
$0000000 ; R4 - ARG 1 |
|||
$0000000 ; R5 - ARG 2 |
|||
$0000000 ; R6 - ARG 3 |
|||
$0000000 ; R7 - ARG 4 |
|||
$0000000 ; R8 - ARG 5 |
|||
$0000000 ; RX |
|||
$0000000 ; RY |
|||
$0000000 ; RVBUF (RY * 640) + RX |
|||
|
|||
@ $4B0C0: |
|||
|
|||
import display.asm |
|||
import charset.asm |
|||
import strings.asm |
|||
import util.asm |
|||
|
|||
; Common Strings |
|||
data ascii HelloWorld Welcome to Boo OS Running on Boo Byte Code! |
|||
data ascii Welcome !@#$%^&*()_+=-0987654321 |
|||
data ascii Introspection We Can Now Do Introspection: |
|||
data ascii label_rax RAX: |
|||
data ascii label_rip RIP: |
|||
data ascii label_cycles Instruction Count: |
|||
|
|||
|
|||
; Kernel Begins |
|||
@ $5B000: |
|||
loadi $9 1; |
|||
loadi $A 1; |
|||
call set_pos |
|||
|
|||
loadi $4 HelloWorld |
|||
call draw_string; |
|||
|
|||
loadi $9 1; |
|||
loadi $A 10; |
|||
call set_pos |
|||
|
|||
loadi $4 Welcome |
|||
call draw_string; |
|||
|
|||
; OK! Time for some self referencing!! |
|||
loadi $9 1; |
|||
loadi $A 20; |
|||
call set_pos |
|||
|
|||
loadi $4 Introspection |
|||
call draw_string; |
|||
|
|||
loadi $9 1; |
|||
loadi $A 30; |
|||
call set_pos |
|||
|
|||
loadi $4 label_cycles |
|||
call draw_string; |
|||
|
|||
loadi $4 $4B000 |
|||
loadi $2 $40 |
|||
add $2 $4 $4 |
|||
call print_addr |
|||
updsp |
|||
jmp $5B000; |
@ -0,0 +1,280 @@ |
|||
use crate::{Machine, MEMORY}; |
|||
use std::collections::HashMap; |
|||
use std::fs::read_to_string; |
|||
|
|||
pub struct ImageAssembler { |
|||
memory: [u32; MEMORY], |
|||
ptr: usize, |
|||
labels: HashMap<String, usize>, |
|||
} |
|||
|
|||
impl ImageAssembler { |
|||
pub fn new() -> ImageAssembler { |
|||
ImageAssembler { |
|||
memory: [0; MEMORY], |
|||
ptr: 0, |
|||
labels: HashMap::new(), |
|||
} |
|||
} |
|||
|
|||
pub fn extract(self) -> Machine { |
|||
let mut machine = Machine::new(); |
|||
machine.memory = self.memory; |
|||
return machine; |
|||
} |
|||
|
|||
pub fn assemble(&mut self, filename: &str) { |
|||
let asm = read_to_string(filename).unwrap_or_default(); |
|||
let lines = asm.split('\n'); |
|||
for line in lines { |
|||
let parts = line.split_once(';'); |
|||
|
|||
let command = match parts { |
|||
Some((command, _comment)) => command.trim(), |
|||
_ => line.trim(), |
|||
}; |
|||
|
|||
let command_parts = command.split_whitespace().collect::<Vec<&str>>(); |
|||
|
|||
if command_parts.is_empty() { |
|||
continue; |
|||
} |
|||
|
|||
if command_parts.len() == 1 { |
|||
match command_parts[0] { |
|||
"nop" => { |
|||
self.memory[self.ptr] = 0x00000000; |
|||
self.ptr += 1; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
} |
|||
"ret" => { |
|||
self.memory[self.ptr] = 0xC0000000; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"hlt" => { |
|||
self.memory[self.ptr] = 0x0F000000; |
|||
self.ptr += 1; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
} |
|||
"inc1" => { |
|||
self.memory[self.ptr] = 0x41000000; |
|||
self.ptr += 1; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
} |
|||
"inc2" => { |
|||
self.memory[self.ptr] = 0x42000000; |
|||
self.ptr += 1; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
} |
|||
"inc3" => { |
|||
self.memory[self.ptr] = 0x43000000; |
|||
self.ptr += 1; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
} |
|||
"updsp" => { |
|||
self.memory[self.ptr] = 0x01000000; |
|||
self.ptr += 1; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
} |
|||
_ => { |
|||
let data = self.parse_addr(command_parts[0]); |
|||
self.memory[self.ptr] = data; |
|||
self.ptr += 1; |
|||
} |
|||
} |
|||
} else if command_parts.len() == 2 && command_parts[0] != "data" { |
|||
match command_parts[0] { |
|||
"label" => { |
|||
self.labels |
|||
.insert(command_parts[1].replace(":", ""), self.ptr); |
|||
} |
|||
"@" => { |
|||
self.ptr = self.parse_addr(command_parts[1]) as usize; |
|||
println!("Setting addr to ${:X}", self.ptr); |
|||
} |
|||
"inc" => { |
|||
let num = self.parse_addr(command_parts[1]); |
|||
let inst = 0x40 + num; |
|||
self.memory[self.ptr] = inst << 24; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"dec" => { |
|||
let num = self.parse_addr(command_parts[1]); |
|||
let inst = 0x50 + num; |
|||
self.memory[self.ptr] = inst << 24; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"jmp" => { |
|||
let addr = self.parse_addr(command_parts[1]); |
|||
self.memory[self.ptr] = 0xE0000000 + addr; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"jneq" => { |
|||
let addr = self.parse_addr(command_parts[1]); |
|||
self.memory[self.ptr] = 0xE2000000 + addr; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"call" => { |
|||
let addr = self.parse_addr(command_parts[1]); |
|||
self.memory[self.ptr] = 0xC1000000 + addr; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"import" => { |
|||
self.assemble(command_parts[1]); |
|||
} |
|||
_ => { |
|||
panic!("Unknown Instruction: {:?}", command_parts) |
|||
} |
|||
} |
|||
} else if command_parts.len() == 3 && command_parts[0] != "data" { |
|||
match command_parts[0] { |
|||
"ldstore" => { |
|||
// Load Immediate
|
|||
let target_reg = self.parse_addr(command_parts[1]); |
|||
let inst = (0x70 + target_reg) << 24; |
|||
let imm = self.parse_addr(command_parts[2]); |
|||
self.memory[self.ptr] = inst + imm; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"loadi" => { |
|||
// Load Immediate
|
|||
let target_reg = self.parse_addr(command_parts[1]); |
|||
let inst = (0x30 + target_reg) << 24; |
|||
let imm = self.parse_addr(command_parts[2]); |
|||
self.memory[self.ptr] = inst + imm; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"load" => { |
|||
// Load Immediate
|
|||
let target_reg = self.parse_addr(command_parts[1]); |
|||
let inst = (0x20 + target_reg) << 24; |
|||
let reg = self.parse_addr(command_parts[2]); |
|||
self.memory[self.ptr] = inst + reg; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"store" => { |
|||
// Load Immediate
|
|||
let target_reg = self.parse_addr(command_parts[1]); |
|||
let inst = (0x10 + target_reg) << 24; |
|||
let reg = self.parse_addr(command_parts[2]); |
|||
self.memory[self.ptr] = inst + reg; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"rstore" => { |
|||
// Load Immediate
|
|||
let target_reg = self.parse_addr(command_parts[1]); |
|||
let inst = (0x60 + target_reg) << 24; |
|||
let reg = self.parse_addr(command_parts[2]); |
|||
self.memory[self.ptr] = inst + reg; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"tx" => { |
|||
let target_reg = self.parse_addr(command_parts[1]); |
|||
let inst = (0x80 + target_reg) << 24; |
|||
let reg = self.parse_addr(command_parts[2]); |
|||
self.memory[self.ptr] = inst + reg; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
_ => { |
|||
panic!("unknown opcpde {}", command_parts[0]) |
|||
} |
|||
} |
|||
} else if command_parts.len() == 4 && command_parts[0] != "data" { |
|||
// Every Instruction with 3 is [INST] [Source Reg] [Target Addr / Reg]
|
|||
let a_reg = self.parse_addr(command_parts[1]); |
|||
let b_reg = self.parse_addr(command_parts[2]); |
|||
let result_reg = self.parse_addr(command_parts[3]); |
|||
match command_parts[0] { |
|||
"add" => { |
|||
self.memory[self.ptr] = |
|||
(0xa1 << 24) + (a_reg << 16) + (b_reg << 8) + result_reg; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"sub" => { |
|||
self.memory[self.ptr] = |
|||
(0xa2 << 24) + (a_reg << 16) + (b_reg << 8) + result_reg; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"mul" => { |
|||
self.memory[self.ptr] = |
|||
(0xa3 << 24) + (a_reg << 16) + (b_reg << 8) + result_reg; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"shift" => { |
|||
self.memory[self.ptr] = |
|||
(0xa5 << 24) + (a_reg << 16) + (b_reg << 8) + result_reg; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
"and" => { |
|||
self.memory[self.ptr] = |
|||
(0xa6 << 24) + (a_reg << 16) + (b_reg << 8) + result_reg; |
|||
println!("{:X}: {:X}", self.ptr, self.memory[self.ptr]); |
|||
self.ptr += 1; |
|||
} |
|||
_ => { |
|||
panic!("Unknown Instruction: {:?}", command_parts) |
|||
} |
|||
} |
|||
} else { |
|||
match command_parts[0] { |
|||
"data" => match command_parts[1] { |
|||
"ascii" => { |
|||
self.labels |
|||
.insert(command_parts[2].replace(":", ""), self.ptr); |
|||
let data = command_parts |
|||
.iter() |
|||
.skip(3) |
|||
.map(|x| String::from(*x)) |
|||
.collect::<Vec<String>>() |
|||
.join(" "); |
|||
for char in data.chars() { |
|||
self.memory[self.ptr] = char as u32; |
|||
self.ptr += 1; |
|||
} |
|||
self.memory[self.ptr] = 0x00; |
|||
self.ptr += 1; |
|||
} |
|||
_ => { |
|||
panic!("unknown type {}", command_parts[1]) |
|||
} |
|||
}, |
|||
_ => { |
|||
panic!("unknown command {}", command_parts[0]) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
fn parse_addr(&self, input: &str) -> u32 { |
|||
match u32::from_str_radix(input.replace("$", "").replace(":", "").as_str(), 16) { |
|||
Ok(addr) => { |
|||
return addr; |
|||
} |
|||
_ => match self.labels.get(input) { |
|||
Some(addr) => { |
|||
return addr.clone() as u32; |
|||
} |
|||
_ => { |
|||
panic!("Not a Hex Encoded Address {:?}", input) |
|||
} |
|||
}, |
|||
} |
|||