Compare commits
90 Commits
d35463e195
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
562d5ceee9 | ||
|
|
a2d66bbb4d | ||
|
|
3a6275fc53 | ||
|
|
0e423fa763 | ||
|
|
34b11aabe5 | ||
|
|
767453bd55 | ||
|
|
df8e04ce63 | ||
|
|
a8bf6749b8 | ||
|
|
e8c1313ece | ||
|
|
c1463e1fef | ||
|
|
57f8f5a118 | ||
|
|
793677a2da | ||
|
|
16f26fd552 | ||
|
|
91a609040f | ||
|
|
8f3d6b91f9 | ||
|
|
18125e6b20 | ||
|
|
395c42dff4 | ||
|
|
ad9be1029c | ||
|
|
0c7418b293 | ||
|
|
a0a99e3116 | ||
|
|
7a3e1fc37c | ||
|
|
f789d49e8a | ||
|
|
b1e7d2e3d5 | ||
|
|
d51de0cc1d | ||
|
|
9becdea2b9 | ||
|
|
2960c1b795 | ||
|
|
31a438d1ee | ||
|
|
20162ab02c | ||
|
|
121a0df8e4 | ||
|
|
74fc57cdfc | ||
|
|
26b6b44caf | ||
|
|
8b0e4759be | ||
|
|
b607bd13f3 | ||
|
|
40be72a5c3 | ||
|
|
f4f0f50d80 | ||
|
|
9233ca421b | ||
|
|
9a88a859cf | ||
|
|
75e9c27dda | ||
|
|
b952210561 | ||
|
|
50e635332c | ||
|
|
cab89cdd2b | ||
|
|
55c426631b | ||
|
|
73ea2bb2b5 | ||
|
|
a5fd811b3f | ||
|
|
ad6a79d937 | ||
|
|
ac0a10fafd | ||
|
|
2e222c304a | ||
|
|
ec88bd7381 | ||
|
|
d5c2dde221 | ||
|
|
de60e52c5a | ||
|
|
17a0a1a406 | ||
|
|
e79a30ba71 | ||
|
|
0160d2e127 | ||
|
|
c05adee382 | ||
|
|
64d3e4f635 | ||
|
|
238069aa0d | ||
|
|
4a3350fe4e | ||
|
|
0ee8ff7914 | ||
|
|
bc19d760b9 | ||
|
|
065a746ca4 | ||
|
|
1b93cab4f6 | ||
|
|
9e68a6bb6e | ||
|
|
c003e63d62 | ||
|
|
e775b05f85 | ||
|
|
a84f2d7453 | ||
|
|
e6d7cb2f21 | ||
|
|
08c39a2bd8 | ||
|
|
a972f38bb6 | ||
|
|
869420ef7a | ||
|
|
33710a8ebe | ||
|
|
0b7526661c | ||
|
|
76e9cc4cd7 | ||
|
|
002100bd70 | ||
|
|
e10d771743 | ||
|
|
172566dfe3 | ||
|
|
f4cadcfff9 | ||
|
|
d90c39b6bc | ||
|
|
0d66e77976 | ||
|
|
63e3a1ea7e | ||
|
|
19a3e4ff5b | ||
|
|
50964e945e | ||
|
|
46bdc91966 | ||
|
|
7df3d25727 | ||
|
|
30a7b5cb34 | ||
|
|
e1822da600 | ||
|
|
444e85e30c | ||
|
|
00be2cc545 | ||
|
|
e5c715d54f | ||
|
|
42003df415 | ||
|
|
9c65697dd8 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
result*
|
result*
|
||||||
|
.bootle*
|
||||||
|
|||||||
12
README.md
12
README.md
@@ -1,17 +1,13 @@
|
|||||||
Call me Terry Davis because... actually please don't. I have visions: aspirations, not hallucinations :p
|
Call me Terry Davis because... actually please don't. I have visions: aspirations, not hallucinations :p
|
||||||
|
|
||||||
# bootle
|
|
||||||
|
|
||||||
hobby kernel
|
|
||||||
|
|
||||||
status: basically nothing, come back later
|
|
||||||
|
|
||||||
# bootler
|
# bootler
|
||||||
|
|
||||||
hobby 1-stage legacy mode bootloader
|
hobby 1-stage legacy mode bootloader
|
||||||
|
|
||||||
status: gets to long mode, loads+jumps to kernel, starts idt and gdt... :)
|
status: gets to long mode, loads+jumps to kernel, starts idt and gdt... :)
|
||||||
|
|
||||||
---
|
# twasm
|
||||||
|
|
||||||
this project follows [Common Changelog](https://common-changelog.org) guidelines
|
hobby self-hosted assembler
|
||||||
|
|
||||||
|
status: tokenises a lot of common stuff, compiles a lot of common stuff... not good enough for anything real-world yet. It can assemble its own print function!!!
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
[build]
|
|
||||||
target = "x86_64-unknown-none"
|
|
||||||
rustflags = [
|
|
||||||
"-Crelocation-model=static"
|
|
||||||
]
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
|
|
||||||
## [0.1.0] - 2026-03-05
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- CHANGELOG.md
|
|
||||||
359
bootle/Cargo.lock
generated
359
bootle/Cargo.lock
generated
@@ -1,359 +0,0 @@
|
|||||||
# This file is automatically @generated by Cargo.
|
|
||||||
# It is not intended for manual editing.
|
|
||||||
version = 4
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "addr2line"
|
|
||||||
version = "0.25.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9acbfca36652500c911ddb767ed433e3ed99b032b5d935be73c6923662db1d43"
|
|
||||||
dependencies = [
|
|
||||||
"cpp_demangle",
|
|
||||||
"fallible-iterator",
|
|
||||||
"gimli",
|
|
||||||
"memmap2",
|
|
||||||
"object",
|
|
||||||
"rustc-demangle",
|
|
||||||
"smallvec",
|
|
||||||
"typed-arena",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "adler2"
|
|
||||||
version = "2.0.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "allocator-api2"
|
|
||||||
version = "0.2.21"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bootle"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"addr2line",
|
|
||||||
"cfg-if",
|
|
||||||
"dlmalloc",
|
|
||||||
"fortanix-sgx-abi",
|
|
||||||
"getopts",
|
|
||||||
"hashbrown",
|
|
||||||
"hermit-abi",
|
|
||||||
"object",
|
|
||||||
"r-efi",
|
|
||||||
"r-efi-alloc",
|
|
||||||
"rustc-demangle",
|
|
||||||
"rustc-literal-escaper",
|
|
||||||
"unwinding",
|
|
||||||
"wasi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cfg-if"
|
|
||||||
version = "1.0.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cpp_demangle"
|
|
||||||
version = "0.4.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crc32fast"
|
|
||||||
version = "1.5.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "dlmalloc"
|
|
||||||
version = "0.2.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "fa3a2dbee57b69fbb5dbe852fa9c0925697fb0c7fbcb1593e90e5ffaedf13d51"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if",
|
|
||||||
"libc",
|
|
||||||
"windows-sys",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "equivalent"
|
|
||||||
version = "1.0.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "fallible-iterator"
|
|
||||||
version = "0.3.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "flate2"
|
|
||||||
version = "1.1.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
|
|
||||||
dependencies = [
|
|
||||||
"crc32fast",
|
|
||||||
"miniz_oxide",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "foldhash"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "fortanix-sgx-abi"
|
|
||||||
version = "0.6.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "5efc85edd5b83e8394f4371dd0da6859dff63dd387dab8568fece6af4cde6f84"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "getopts"
|
|
||||||
version = "0.2.23"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1"
|
|
||||||
dependencies = [
|
|
||||||
"unicode-width",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "gimli"
|
|
||||||
version = "0.32.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7"
|
|
||||||
dependencies = [
|
|
||||||
"fallible-iterator",
|
|
||||||
"stable_deref_trait",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "hashbrown"
|
|
||||||
version = "0.15.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
|
|
||||||
dependencies = [
|
|
||||||
"allocator-api2",
|
|
||||||
"equivalent",
|
|
||||||
"foldhash",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "hermit-abi"
|
|
||||||
version = "0.5.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "libc"
|
|
||||||
version = "0.2.182"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "memchr"
|
|
||||||
version = "2.8.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "memmap2"
|
|
||||||
version = "0.9.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "miniz_oxide"
|
|
||||||
version = "0.8.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
|
|
||||||
dependencies = [
|
|
||||||
"adler2",
|
|
||||||
"simd-adler32",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "object"
|
|
||||||
version = "0.37.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "03fd943161069e1768b4b3d050890ba48730e590f57e56d4aa04e7e090e61b4a"
|
|
||||||
dependencies = [
|
|
||||||
"flate2",
|
|
||||||
"memchr",
|
|
||||||
"ruzstd",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "r-efi"
|
|
||||||
version = "5.3.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "r-efi-alloc"
|
|
||||||
version = "2.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dc2f58ef3ca9bb0f9c44d9aa8537601bcd3df94cc9314a40178cadf7d4466354"
|
|
||||||
dependencies = [
|
|
||||||
"r-efi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustc-demangle"
|
|
||||||
version = "0.1.25"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustc-literal-escaper"
|
|
||||||
version = "0.0.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "e4ee29da77c5a54f42697493cd4c9b9f31b74df666a6c04dfc4fde77abe0438b"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ruzstd"
|
|
||||||
version = "0.8.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01"
|
|
||||||
dependencies = [
|
|
||||||
"twox-hash",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "simd-adler32"
|
|
||||||
version = "0.3.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "smallvec"
|
|
||||||
version = "1.15.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "stable_deref_trait"
|
|
||||||
version = "1.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "twox-hash"
|
|
||||||
version = "2.1.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "typed-arena"
|
|
||||||
version = "2.0.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-width"
|
|
||||||
version = "0.2.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unwinding"
|
|
||||||
version = "0.2.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7d80f6c2bfede213d9a90b4a14f3eb99b84e33c52df6c1a15de0a100f5a88751"
|
|
||||||
dependencies = [
|
|
||||||
"gimli",
|
|
||||||
"libc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasi"
|
|
||||||
version = "0.11.1+wasi-snapshot-preview1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows-sys"
|
|
||||||
version = "0.59.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
|
|
||||||
dependencies = [
|
|
||||||
"windows-targets",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows-targets"
|
|
||||||
version = "0.52.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
|
||||||
dependencies = [
|
|
||||||
"windows_aarch64_gnullvm",
|
|
||||||
"windows_aarch64_msvc",
|
|
||||||
"windows_i686_gnu",
|
|
||||||
"windows_i686_gnullvm",
|
|
||||||
"windows_i686_msvc",
|
|
||||||
"windows_x86_64_gnu",
|
|
||||||
"windows_x86_64_gnullvm",
|
|
||||||
"windows_x86_64_msvc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_aarch64_gnullvm"
|
|
||||||
version = "0.52.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_aarch64_msvc"
|
|
||||||
version = "0.52.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_i686_gnu"
|
|
||||||
version = "0.52.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_i686_gnullvm"
|
|
||||||
version = "0.52.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_i686_msvc"
|
|
||||||
version = "0.52.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_x86_64_gnu"
|
|
||||||
version = "0.52.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_x86_64_gnullvm"
|
|
||||||
version = "0.52.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_x86_64_msvc"
|
|
||||||
version = "0.52.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "bootle"
|
|
||||||
version = "0.1.0"
|
|
||||||
edition = "2024"
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
crate-type = ["staticlib"]
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
|
|
||||||
[profile.release]
|
|
||||||
panic = "abort"
|
|
||||||
opt-level = 'z'
|
|
||||||
debug = false
|
|
||||||
|
|
||||||
[profile.dev]
|
|
||||||
panic = "abort"
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# bootle
|
|
||||||
|
|
||||||
hobby kernel written in rust. It's just for playing around... for now :p
|
|
||||||
|
|
||||||
run with `nix run git+https://git.mtgmonkey.net/andromeda/bootler#bootle`
|
|
||||||
|
|
||||||
### memory map
|
|
||||||
|
|
||||||
```
|
|
||||||
+------ 0x00100000 ------+
|
|
||||||
| hardware, bios stuff |
|
|
||||||
+------ 0x00080000 ------+
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
+------ 0x00010200 ------+
|
|
||||||
| kernel |
|
|
||||||
+------ 0x00010000 ------+
|
|
||||||
| bootloader stuff |
|
|
||||||
| includes stack, gdt, |
|
|
||||||
| idt for the time being |
|
|
||||||
+------ 0x00000500 ------+
|
|
||||||
| bios stuff |
|
|
||||||
+------ 0x00000000 ------+
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
this project follows [Common Changelog](https://common-changelog.org) guidelines
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
{
|
|
||||||
callPackage,
|
|
||||||
rust-bin,
|
|
||||||
naersk,
|
|
||||||
bootler,
|
|
||||||
qemu,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
rust-toolchain = rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
|
|
||||||
naersk' = callPackage naersk {
|
|
||||||
cargo = rust-toolchain;
|
|
||||||
rustc = rust-toolchain;
|
|
||||||
clippy = rust-toolchain;
|
|
||||||
};
|
|
||||||
in (naersk'.buildPackage {
|
|
||||||
src = ./.;
|
|
||||||
|
|
||||||
# deps for rust-src
|
|
||||||
additionalCargoLock = "${rust-toolchain.availableComponents.rust-src}/lib/rustlib/src/rust/library/Cargo.lock";
|
|
||||||
|
|
||||||
# just library build
|
|
||||||
copyBins = false;
|
|
||||||
copyLibs = true;
|
|
||||||
release = true;
|
|
||||||
|
|
||||||
# build std
|
|
||||||
cargoBuildOptions = x:
|
|
||||||
x
|
|
||||||
++ [
|
|
||||||
"-Zbuild-std"
|
|
||||||
];
|
|
||||||
|
|
||||||
postInstall = ''
|
|
||||||
ld --oformat binary \
|
|
||||||
-o kernel.bin \
|
|
||||||
-T src/linker.ld \
|
|
||||||
-e _start \
|
|
||||||
target/x86_64-unknown-none/release/libbootle.a
|
|
||||||
|
|
||||||
dd if=/dev/zero of=disk bs=512 count=2
|
|
||||||
dd if=${bootler}/bin/boot.bin of=disk conv=notrunc
|
|
||||||
dd if=kernel.bin of=disk bs=512 seek=1 conv=notrunc
|
|
||||||
|
|
||||||
mkdir -p $out/lib
|
|
||||||
mkdir -p $out/bin
|
|
||||||
|
|
||||||
cat<<EOF>$out/bin/bootle
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
mkdir -p ./.bootle
|
|
||||||
cp $(echo $out)/bin/disk ./.bootle/disk
|
|
||||||
chmod a+w ./.bootle/disk
|
|
||||||
|
|
||||||
${qemu}/bin/qemu-system-x86_64 \
|
|
||||||
-nographic \
|
|
||||||
-drive file=./.bootle/disk,format=raw,index=0,media=disk
|
|
||||||
|
|
||||||
rm ./.bootle -r
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
||||||
chmod +x $out/bin/bootle
|
|
||||||
|
|
||||||
cp target/x86_64-unknown-none/release/libbootle.a $out/lib
|
|
||||||
cp kernel.bin $out/bin
|
|
||||||
cp disk $out/bin
|
|
||||||
'';
|
|
||||||
})
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
[toolchain]
|
|
||||||
channel = "nightly"
|
|
||||||
components = ["rust-src"]
|
|
||||||
targets = ["x86_64-unknown-none"]
|
|
||||||
profile = "default"
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
#![no_std]
|
|
||||||
#![no_main]
|
|
||||||
|
|
||||||
use core::panic::PanicInfo;
|
|
||||||
|
|
||||||
#[unsafe(no_mangle)]
|
|
||||||
pub extern "C" fn _start() -> ! {
|
|
||||||
welcome_serial();
|
|
||||||
halt()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn print_serial(s: &str) {
|
|
||||||
let mut bytes = s.bytes();
|
|
||||||
while let Some(b) = bytes.next() {
|
|
||||||
unsafe {
|
|
||||||
core::arch::asm!(
|
|
||||||
"out dx, al"
|
|
||||||
, in("al") b
|
|
||||||
)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn println_serial(s: &str) {
|
|
||||||
print_serial(s);
|
|
||||||
print_serial("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
fn welcome_serial() {
|
|
||||||
print_serial(ANSI_PINK);
|
|
||||||
println_serial("\nWelcome to Bootle OS");
|
|
||||||
println_serial("All code GPL licensed and freely available on git.mtgmonkey.net");
|
|
||||||
print_serial("Enjoy your time! Press ");
|
|
||||||
print_serial(ANSI_RED);
|
|
||||||
print_serial("ctrl+a x");
|
|
||||||
print_serial(ANSI_PINK);
|
|
||||||
println_serial(" to escape Qemu");
|
|
||||||
print_serial(ANSI_CLEAR);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[panic_handler]
|
|
||||||
fn panic(_: &PanicInfo) -> ! {
|
|
||||||
print_serial("panicked");
|
|
||||||
halt()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn halt() -> ! {
|
|
||||||
unsafe { core::arch::asm!("hlt") };
|
|
||||||
halt()
|
|
||||||
}
|
|
||||||
|
|
||||||
const ANSI_CLEAR: &str = "\x1b[0m";
|
|
||||||
const ANSI_RED: &str = "\x1b[31m";
|
|
||||||
const ANSI_PINK: &str = "\x1b[35m";
|
|
||||||
const ANSI_GREEN: &str = "\x1b[32m";
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
SECTIONS
|
|
||||||
{
|
|
||||||
. = 0x00010000;
|
|
||||||
.text : {
|
|
||||||
*(.text._start)
|
|
||||||
*(.text*)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
LOAD_ADDR equ 0x7C00
|
LOAD_ADDR equ 0x7C00
|
||||||
|
|
||||||
KERNEL_START equ 2 ; first sector on disk to load kernel from; 1 indexed
|
KERNEL_START equ 2 ; first sector on disk to load kernel from; 1 indexed
|
||||||
KERNEL_SIZE equ 1 ; length of kernel in sectors
|
KERNEL_SIZE equ 32 ; length of kernel in sectors
|
||||||
KERNEL_LOAD_ADDR_ES equ 0x1000 ; kernel to be loaded at es * 0x10 + 0x0000
|
KERNEL_LOAD_ADDR_ES equ 0x1000 ; kernel to be loaded at es * 0x10 + 0x0000
|
||||||
|
|
||||||
PAGE_TABLE_LOAD_ADDR equ 0x1000 ; start of page table; 4 * pt size
|
PAGE_TABLE_LOAD_ADDR equ 0x1000 ; start of page table; 4 * pt size
|
||||||
|
|||||||
@@ -14,14 +14,13 @@ in
|
|||||||
${nasm}/bin/nasm asm/boot.asm -o boot.bin
|
${nasm}/bin/nasm asm/boot.asm -o boot.bin
|
||||||
${nasm}/bin/nasm asm/kernel.asm -o dummy.bin
|
${nasm}/bin/nasm asm/kernel.asm -o dummy.bin
|
||||||
|
|
||||||
dd if=/dev/zero of=${bootImg} bs=512 count=2
|
dd if=/dev/zero of=${bootImg} bs=512 count=2880
|
||||||
dd if=boot.bin of=${bootImg} conv=notrunc
|
dd if=boot.bin of=${bootImg} conv=notrunc
|
||||||
dd if=dummy.bin of=${bootImg} bs=512 seek=1 conv=notrunc
|
dd if=dummy.bin of=${bootImg} bs=512 seek=1 conv=notrunc
|
||||||
'';
|
'';
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
mkdir -p $out/bin
|
mkdir -p $out/bin
|
||||||
cp boot.bin $out/bin
|
cp boot.bin $out/bin
|
||||||
cp dummy.bin $out/bin
|
|
||||||
cp ${bootImg} $out/bin
|
cp ${bootImg} $out/bin
|
||||||
|
|
||||||
# create emulation binary
|
# create emulation binary
|
||||||
|
|||||||
90
flake.lock
generated
90
flake.lock
generated
@@ -1,55 +1,12 @@
|
|||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
"fenix": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"naersk",
|
|
||||||
"nixpkgs"
|
|
||||||
],
|
|
||||||
"rust-analyzer-src": "rust-analyzer-src"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1752475459,
|
|
||||||
"narHash": "sha256-z6QEu4ZFuHiqdOPbYss4/Q8B0BFhacR8ts6jO/F/aOU=",
|
|
||||||
"owner": "nix-community",
|
|
||||||
"repo": "fenix",
|
|
||||||
"rev": "bf0d6f70f4c9a9cf8845f992105652173f4b617f",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-community",
|
|
||||||
"repo": "fenix",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"naersk": {
|
|
||||||
"inputs": {
|
|
||||||
"fenix": "fenix",
|
|
||||||
"nixpkgs": [
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1769799857,
|
|
||||||
"narHash": "sha256-88IFXZ7Sa1vxbz5pty0Io5qEaMQMMUPMonLa3Ls/ss4=",
|
|
||||||
"owner": "nix-community",
|
|
||||||
"repo": "naersk",
|
|
||||||
"rev": "9d4ed44d8b8cecdceb1d6fd76e74123d90ae6339",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-community",
|
|
||||||
"repo": "naersk",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1772173633,
|
"lastModified": 1774701658,
|
||||||
"narHash": "sha256-MOH58F4AIbCkh6qlQcwMycyk5SWvsqnS/TCfnqDlpj4=",
|
"narHash": "sha256-CIS/4AMUSwUyC8X5g+5JsMRvIUL3YUfewe8K4VrbsSQ=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "c0f3d81a7ddbc2b1332be0d8481a672b4f6004d6",
|
"rev": "b63fe7f000adcfa269967eeff72c64cafecbbebe",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -61,46 +18,7 @@
|
|||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"naersk": "naersk",
|
"nixpkgs": "nixpkgs"
|
||||||
"nixpkgs": "nixpkgs",
|
|
||||||
"rust-overlay": "rust-overlay"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rust-analyzer-src": {
|
|
||||||
"flake": false,
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1752428706,
|
|
||||||
"narHash": "sha256-EJcdxw3aXfP8Ex1Nm3s0awyH9egQvB2Gu+QEnJn2Sfg=",
|
|
||||||
"owner": "rust-lang",
|
|
||||||
"repo": "rust-analyzer",
|
|
||||||
"rev": "591e3b7624be97e4443ea7b5542c191311aa141d",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "rust-lang",
|
|
||||||
"ref": "nightly",
|
|
||||||
"repo": "rust-analyzer",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rust-overlay": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1772507320,
|
|
||||||
"narHash": "sha256-GdGXniFvtIfRiakc+ncdQYnoQjKbTCv9Imjfl4ggquI=",
|
|
||||||
"owner": "oxalica",
|
|
||||||
"repo": "rust-overlay",
|
|
||||||
"rev": "1775eafa1879ac098ee436849bc9c3d963206f89",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "oxalica",
|
|
||||||
"repo": "rust-overlay",
|
|
||||||
"type": "github"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
23
flake.nix
23
flake.nix
@@ -1,40 +1,23 @@
|
|||||||
{
|
{
|
||||||
inputs = {
|
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
|
||||||
naersk = {
|
|
||||||
url = "github:nix-community/naersk";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
rust-overlay = {
|
|
||||||
url = "github:oxalica/rust-overlay";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
outputs = {
|
outputs = {
|
||||||
nixpkgs,
|
nixpkgs,
|
||||||
naersk,
|
|
||||||
rust-overlay,
|
|
||||||
self,
|
self,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
pkgs = nixpkgs.legacyPackages.${system};
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
pkgsWithRustOverlay = import nixpkgs {
|
|
||||||
inherit system;
|
|
||||||
overlays = [(import rust-overlay)];
|
|
||||||
};
|
|
||||||
in {
|
in {
|
||||||
packages.${system} = {
|
packages.${system} = {
|
||||||
bootler = pkgs.callPackage ./bootler/package.nix {};
|
bootler = pkgs.callPackage ./bootler/package.nix {};
|
||||||
bootle = pkgsWithRustOverlay.callPackage ./bootle/package.nix {
|
twasm = pkgs.callPackage ./twasm/package.nix {
|
||||||
naersk = naersk;
|
|
||||||
bootler = self.packages.${system}.bootler;
|
bootler = self.packages.${system}.bootler;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
devShells.${system}.default = pkgs.mkShell {
|
devShells.${system}.default = pkgs.mkShell {
|
||||||
inputsFrom = [
|
inputsFrom = [
|
||||||
self.packages.${system}.bootle
|
|
||||||
self.packages.${system}.bootler
|
self.packages.${system}.bootler
|
||||||
|
self.packages.${system}.twasm
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
529
twasm/README.md
Normal file
529
twasm/README.md
Normal file
@@ -0,0 +1,529 @@
|
|||||||
|
# twasm
|
||||||
|
|
||||||
|
this will be a self hosted, very minimal subset of nasm-style 64 bit asm
|
||||||
|
|
||||||
|
### goals
|
||||||
|
|
||||||
|
I want to compile Bootler and Twasm with the Twasm assembler
|
||||||
|
|
||||||
|
### reading
|
||||||
|
|
||||||
|
- [instructions](https://www.felixcloutier.com/x86/)
|
||||||
|
- [opcodes,ModR/M,SIB](http://ref.x86asm.net/coder64.html) (no secure site available)
|
||||||
|
- [calling conventions](https://wiki.osdev.org/Calling_Conventions); I try to use System V
|
||||||
|
|
||||||
|
### tokeniser
|
||||||
|
|
||||||
|
whitespace is ignored for the sake of readability; it can go between pretty much anything
|
||||||
|
|
||||||
|
```
|
||||||
|
------------------------
|
||||||
|
tokeniser
|
||||||
|
------------------------
|
||||||
|
byte(s) -> next byte(s)
|
||||||
|
------------------------
|
||||||
|
Newline -> Label
|
||||||
|
-> Newline
|
||||||
|
-> Komment
|
||||||
|
-> Operator
|
||||||
|
-> Directive
|
||||||
|
|
||||||
|
Label -> Newline
|
||||||
|
|
||||||
|
Komment -> Newline
|
||||||
|
|
||||||
|
Operator -> Newline
|
||||||
|
-> Komment
|
||||||
|
-> Operand
|
||||||
|
|
||||||
|
Operand -> Newline
|
||||||
|
-> Komment
|
||||||
|
-> Comma
|
||||||
|
|
||||||
|
Comma -> Operand
|
||||||
|
|
||||||
|
Directive -> Newline
|
||||||
|
-> Komment
|
||||||
|
-> Operator
|
||||||
|
------------------------
|
||||||
|
```
|
||||||
|
|
||||||
|
### memory map
|
||||||
|
|
||||||
|
```
|
||||||
|
+------ 0x00100000 ------+
|
||||||
|
| hardware, bios stuff |
|
||||||
|
+------ 0x00080000 ------+
|
||||||
|
| output binary |
|
||||||
|
+------ 0x00070000 ------+
|
||||||
|
| token table |
|
||||||
|
+------ 0x00060000 ------+
|
||||||
|
| test arena |
|
||||||
|
+------ 0x00050000 ------+
|
||||||
|
| label table |
|
||||||
|
+------ 0x00040000 ------+
|
||||||
|
| awaiting label table |
|
||||||
|
+------ 0x00030000 ------+
|
||||||
|
| stack (rsp) |
|
||||||
|
+------------------------+
|
||||||
|
| input |
|
||||||
|
+------------------------+
|
||||||
|
| assembler |
|
||||||
|
+------ 0x00010000 ------+
|
||||||
|
| bootloader, bios, etc. |
|
||||||
|
+------------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
each word represents a token on the token table.
|
||||||
|
|
||||||
|
#### token table (TT)
|
||||||
|
|
||||||
|
each token gets loaded into the token table with the following form:
|
||||||
|
|
||||||
|
```
|
||||||
|
2 bytes
|
||||||
|
+----------+
|
||||||
|
| 15 0 |
|
||||||
|
+----------+
|
||||||
|
| token id |
|
||||||
|
+----------+
|
||||||
|
```
|
||||||
|
|
||||||
|
#### label table (LT)
|
||||||
|
|
||||||
|
label definitions are stored and recalled from this table. The memory addresses are relative to the start of the program
|
||||||
|
|
||||||
|
```
|
||||||
|
16 bytes
|
||||||
|
+----------+---------+
|
||||||
|
| 127 96 | 95 64 |
|
||||||
|
+----------+---------+
|
||||||
|
| reserved | address |
|
||||||
|
+----------+---------+
|
||||||
|
| 63 0 |
|
||||||
|
+--------------------+
|
||||||
|
| hash |
|
||||||
|
+--------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
#### awaiting label table (ALT)
|
||||||
|
|
||||||
|
forward references are stored in this table to be filled in after assembly is otherwise complete. The memory addresses are relative to the start of the program
|
||||||
|
|
||||||
|
```
|
||||||
|
16 bytes
|
||||||
|
+----------+----------+------------------+---------+
|
||||||
|
| 127 101 | 100 | 99 96 | 95 64 |
|
||||||
|
+----------+----------+------------------+---------+
|
||||||
|
| reserved | abs flag | # bytes reserved | address |
|
||||||
|
+----------+----------+------------------+---------+
|
||||||
|
| 63 0 |
|
||||||
|
+--------------------------------------------------+
|
||||||
|
| hash |
|
||||||
|
+--------------------------------------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
### internal data structures
|
||||||
|
|
||||||
|
#### `tokens.[operators|registers]`
|
||||||
|
|
||||||
|
contains tokens by their type. Intended to be searched by token name to get the token's ID.
|
||||||
|
|
||||||
|
each entry is in the following form:
|
||||||
|
|
||||||
|
```
|
||||||
|
6 bytes
|
||||||
|
+----------+--------------------------------+
|
||||||
|
| 47 32 | 31 0 |
|
||||||
|
+----------+--------------------------------+
|
||||||
|
| token ID | string without null terminator |
|
||||||
|
+----------+--------------------------------+
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
note that tokens longer than 4 bytes are problematic :/
|
||||||
|
|
||||||
|
#### `tokens.by_id`
|
||||||
|
|
||||||
|
contains some tokens with their metadata. Some tokens have embedded information (`0x10XX` for instance). Those do not have entries in this table, being handled instead inside the assemble function itself.
|
||||||
|
|
||||||
|
metadata about some tokens in the following form:
|
||||||
|
|
||||||
|
```
|
||||||
|
4 bytes
|
||||||
|
+----------------+----------+-------+----------+
|
||||||
|
| 31 24 | 23 20 | 19 16 | 15 0 |
|
||||||
|
+----------------+----------+-------+----------+
|
||||||
|
| typed metadata | reserved | type | token ID |
|
||||||
|
+----------------+----------+-------+----------+
|
||||||
|
```
|
||||||
|
|
||||||
|
the `type` hex digit is defined as the following:
|
||||||
|
|
||||||
|
| hex | meaning | examples |
|
||||||
|
|-----|-----------------|-|
|
||||||
|
| 0x0 | ignored | |
|
||||||
|
| 0x1 | operator | `mov`, `hlt` |
|
||||||
|
| 0x2 | register | `rsp`, `al` |
|
||||||
|
| 0x3 | pseudo-operator | `db` |
|
||||||
|
| 0xF | unknown | any token ID not represented in the lookup table |
|
||||||
|
|
||||||
|
type metadata for the different types is as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
1 byte
|
||||||
|
+----------+
|
||||||
|
| type 0x0 |
|
||||||
|
+----------+
|
||||||
|
| 31 24 |
|
||||||
|
+----------+
|
||||||
|
| reserved |
|
||||||
|
+----------+
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
1 byte
|
||||||
|
+-------------------------------+
|
||||||
|
| type 0x1 |
|
||||||
|
+----------+--------------------+
|
||||||
|
| 31 26 | 25 24 |
|
||||||
|
+----------+--------------------+
|
||||||
|
| reserved | number of operands |
|
||||||
|
+----------+--------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
1 byte
|
||||||
|
+------------------------------+
|
||||||
|
| type 0x2 |
|
||||||
|
+----------+-----------+-------+
|
||||||
|
| 31 29 | 28 26 | 25 24 |
|
||||||
|
+----------+-----------+-------+
|
||||||
|
| reserved | reg value | width |
|
||||||
|
+----------+-----------+-------+
|
||||||
|
|
||||||
|
; reg is the value that cooresponds to the register in the ModR/M byte
|
||||||
|
|
||||||
|
; width:
|
||||||
|
00b ; 8 bit
|
||||||
|
01b ; 16 bit
|
||||||
|
10b ; 32 bit
|
||||||
|
11b ; 64 bit
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
1 byte
|
||||||
|
+----------+
|
||||||
|
| type 0x3 |
|
||||||
|
+----------+
|
||||||
|
| 31 24 |
|
||||||
|
+----------+
|
||||||
|
| reserved |
|
||||||
|
+----------+
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `opcodes.by_id`
|
||||||
|
|
||||||
|
entries are as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
16 bytes
|
||||||
|
+------------------------------+
|
||||||
|
| 0 operand operators |
|
||||||
|
+---------+--------------------+
|
||||||
|
| 127 120 | 119 96 |
|
||||||
|
+---------+--------------------+
|
||||||
|
| flags | reserved |
|
||||||
|
+---------+--------------------+
|
||||||
|
| 95 64 |
|
||||||
|
+------------------------------+
|
||||||
|
| reserved |
|
||||||
|
+------------------------------+
|
||||||
|
| 63 32 |
|
||||||
|
+------------------------------+
|
||||||
|
| reserved |
|
||||||
|
+----------+--------+----------+
|
||||||
|
| 31 24 | 23 16 | 15 0 |
|
||||||
|
+----------+--------+----------+
|
||||||
|
| reserved | opcode | token ID |
|
||||||
|
+----------+--------+----------+
|
||||||
|
|
||||||
|
16 bytes
|
||||||
|
+------------------------------------------+
|
||||||
|
| 1 operand operators |
|
||||||
|
+----------+----------+----------+---------+
|
||||||
|
| 127 120 | 119 112 | 111 104 | 103 96 |
|
||||||
|
+----------+----------+----------+---------+
|
||||||
|
| flags | reserved | flags5 | flags4 |
|
||||||
|
+----------+----------+----------+---------+
|
||||||
|
| 95 88 | 87 80 | 79 72 | 71 64 |
|
||||||
|
+----------+----------+----------+---------+
|
||||||
|
| flags3 | flags2 | reserved | flags0 |
|
||||||
|
+----------+----------+----------+---------+
|
||||||
|
| 63 56 | 55 48 | 47 40 | 39 32 |
|
||||||
|
+----------+----------+----------+---------+
|
||||||
|
| opcode | opcode | opcode | opcode |
|
||||||
|
| dst=rel8 | dst=rel | dst=imm8 | dst=imm |
|
||||||
|
+----------+----------+----------+---------+
|
||||||
|
| 31 24 | 23 16 | 15 0 |
|
||||||
|
+----------+----------+--------------------+
|
||||||
|
| opcode+r | opcode | token ID |
|
||||||
|
| dst=r | dst=r/m | |
|
||||||
|
+----------+----------+--------------------+
|
||||||
|
|
||||||
|
16 bytes
|
||||||
|
+-----------------------------------------------+
|
||||||
|
| 2 operand operators |
|
||||||
|
+---------+-------------------------------------+
|
||||||
|
| 127 120 | 119 96 |
|
||||||
|
+---------+-------------------------------------+
|
||||||
|
| flags | reserved |
|
||||||
|
+---------+----------+--------------------------+
|
||||||
|
| 95 88 | 87 80 | 79 64 |
|
||||||
|
+---------+----------+--------------------------+
|
||||||
|
| flags3 | flags2 | reserved |
|
||||||
|
+---------+----------+-------+-------+----------+
|
||||||
|
| 63 48 | 47 40 | 39 32 |
|
||||||
|
+--------------------+---------------+----------+
|
||||||
|
| reserved | opcode | opcode |
|
||||||
|
| | dst=r/m | dst=r/m |
|
||||||
|
| | src=imm8 | src=imm |
|
||||||
|
+---------+----------+---------------+----------+
|
||||||
|
| 31 24 | 23 16 | 15 0 |
|
||||||
|
+---------+----------+--------------------------+
|
||||||
|
| opcode | opcode | token ID |
|
||||||
|
| dst=r | dst=r/m | |
|
||||||
|
| src=r/m | src=r | |
|
||||||
|
+---------+----------+--------------------------+
|
||||||
|
|
||||||
|
1 byte
|
||||||
|
+-----------------+
|
||||||
|
| flags byte |
|
||||||
|
+----------+------+
|
||||||
|
| 95 89 | 88 |
|
||||||
|
+----------+------+
|
||||||
|
| reserved | 8bit |
|
||||||
|
+----------+------+
|
||||||
|
|
||||||
|
1 byte
|
||||||
|
+--------------------------------------------------------------+
|
||||||
|
| flagsX byte |
|
||||||
|
+----------+---------+-----------+-------------+---------------+
|
||||||
|
| 7 6 | 5 | 4 | 3 | 2 0 |
|
||||||
|
+----------+---------+-----------+-------------+---------------+
|
||||||
|
| reserved | +r flag | no ModR/M | 0x0F prefix | operator flag |
|
||||||
|
+----------+---------+-----------+-------------+---------------+
|
||||||
|
|
||||||
|
; flags key:
|
||||||
|
8bit ; tte has opcodes for r/m8 and r8 instead of r/m and r respectively
|
||||||
|
|
||||||
|
; flagsX key:
|
||||||
|
+r flag ; there is a +r variation of this opcode
|
||||||
|
no ModR/M ; there is no ModR/M byte for this opcode
|
||||||
|
0x0F prefix ; there is a 0x0F prefix for this opcode
|
||||||
|
operator flag ; contents of `reg` if applicable
|
||||||
|
|
||||||
|
; key:
|
||||||
|
r/m ; r/m 16/32/64
|
||||||
|
r/m8 ; r/m 8
|
||||||
|
r ; r 16/32/64
|
||||||
|
r8 ; r 8
|
||||||
|
imm ; imm 16/32
|
||||||
|
imm8 ; imm 8
|
||||||
|
rel ; rel 16/32
|
||||||
|
rel8 ; rel 8
|
||||||
|
```
|
||||||
|
|
||||||
|
note much room to expand. If an opcode doesn't exist, it should be 0x00
|
||||||
|
|
||||||
|
### token IDs
|
||||||
|
|
||||||
|
supported tokens are listed below
|
||||||
|
|
||||||
|
| token | id | notes |
|
||||||
|
|-------|--------|-|
|
||||||
|
| rax | 0x0000 | register |
|
||||||
|
| rbx | 0x0001 | register |
|
||||||
|
| rcx | 0x0002 | register |
|
||||||
|
| rdx | 0x0003 | register |
|
||||||
|
| rsi | 0x0004 | register |
|
||||||
|
| rdi | 0x0005 | register |
|
||||||
|
| rsp | 0x0006 | register |
|
||||||
|
| rbp | 0x0007 | register |
|
||||||
|
| r8 | 0x0008 | unimplemented |
|
||||||
|
| r9 | 0x0009 | unimplemented |
|
||||||
|
| r10 | 0x000A | unimplemented |
|
||||||
|
| r11 | 0x000B | unimplemented |
|
||||||
|
| r12 | 0x000C | unimplemented |
|
||||||
|
| r13 | 0x000D | unimplemented |
|
||||||
|
| r14 | 0x000E | unimplemented |
|
||||||
|
| r15 | 0x000F | unimplemented |
|
||||||
|
| eax | 0x0010 | register |
|
||||||
|
| ebx | 0x0011 | register |
|
||||||
|
| ecx | 0x0012 | register |
|
||||||
|
| edx | 0x0013 | register |
|
||||||
|
| esi | 0x0014 | register |
|
||||||
|
| edi | 0x0015 | register |
|
||||||
|
| esp | 0x0016 | register |
|
||||||
|
| ebp | 0x0017 | register |
|
||||||
|
| r8d | 0x0018 | unimplemented |
|
||||||
|
| r9d | 0x0019 | unimplemented |
|
||||||
|
| r10d | 0x001A | unimplemented |
|
||||||
|
| r11d | 0x001B | unimplemented |
|
||||||
|
| r12d | 0x001C | unimplemented |
|
||||||
|
| r13d | 0x001D | unimplemented |
|
||||||
|
| r14d | 0x001E | unimplemented |
|
||||||
|
| r15d | 0x001F | unimplemented |
|
||||||
|
| ax | 0x0020 | register |
|
||||||
|
| bx | 0x0021 | register |
|
||||||
|
| cx | 0x0022 | register |
|
||||||
|
| dx | 0x0023 | register |
|
||||||
|
| si | 0x0024 | register |
|
||||||
|
| di | 0x0025 | register |
|
||||||
|
| sp | 0x0026 | register |
|
||||||
|
| bp | 0x0027 | register |
|
||||||
|
| r8w | 0x0028 | unimplemented |
|
||||||
|
| r9w | 0x0029 | unimplemented |
|
||||||
|
| r10w | 0x002A | unimplemented |
|
||||||
|
| r11w | 0x002B | unimplemented |
|
||||||
|
| r12w | 0x002C | unimplemented |
|
||||||
|
| r13w | 0x002D | unimplemented |
|
||||||
|
| r14w | 0x002E | unimplemented |
|
||||||
|
| r15w | 0x002F | unimplemented |
|
||||||
|
| al | 0x0030 | register |
|
||||||
|
| bl | 0x0031 | register |
|
||||||
|
| cl | 0x0032 | register |
|
||||||
|
| dl | 0x0033 | register |
|
||||||
|
| sil | 0x0034 | register |
|
||||||
|
| dil | 0x0035 | register |
|
||||||
|
| spl | 0x0036 | register |
|
||||||
|
| bpl | 0x0037 | register |
|
||||||
|
| r8b | 0x0038 | unimplemented |
|
||||||
|
| r9b | 0x0039 | unimplemented |
|
||||||
|
| r10b | 0x003A | unimplemented |
|
||||||
|
| r11b | 0x003B | unimplemented |
|
||||||
|
| r12b | 0x003C | unimplemented |
|
||||||
|
| r13b | 0x003D | unimplemented |
|
||||||
|
| r14b | 0x003E | unimplemented |
|
||||||
|
| r15b | 0x003F | unimplemented |
|
||||||
|
| ah | 0x0040 | unimplemented |
|
||||||
|
| bh | 0x0041 | unimplemented |
|
||||||
|
| ch | 0x0042 | unimplemented |
|
||||||
|
| dh | 0x0043 | unimplemented |
|
||||||
|
| cs | 0x0044 | unimplemented |
|
||||||
|
| ds | 0x0045 | unimplemented |
|
||||||
|
| es | 0x0046 | unimplemented |
|
||||||
|
| fs | 0x0047 | unimplemented |
|
||||||
|
| gs | 0x0048 | unimplemented |
|
||||||
|
| ss | 0x0049 | unimplemented |
|
||||||
|
| cr0 | 0x004A | unimplemented |
|
||||||
|
| cr2 | 0x004B | unimplemented |
|
||||||
|
| cr3 | 0x004C | unimplemented |
|
||||||
|
| cr4 | 0x004D | unimplemented |
|
||||||
|
| cr8 | 0x004E | unimplemented |
|
||||||
|
| hlt | 0x004F | operator |
|
||||||
|
| int3 | 0x0050 | operator |
|
||||||
|
| | 0x0051 | deprecated; formerly `[`. Now `0x10XX` is used. |
|
||||||
|
| | 0x0052 | deprecated; formerly `]`. |
|
||||||
|
| xor | 0x0053 | operator |
|
||||||
|
| inc | 0x0054 | operator |
|
||||||
|
| dec | 0x0055 | operator |
|
||||||
|
| mov | 0x0056 | operator |
|
||||||
|
| add | 0x0057 | operator |
|
||||||
|
| sub | 0x0058 | operator |
|
||||||
|
| call | 0x0059 | operator |
|
||||||
|
| ret | 0x005A | operator |
|
||||||
|
| cmp | 0x005B | operator |
|
||||||
|
| jmp | 0x005C | operator |
|
||||||
|
| je | 0x005D | operator |
|
||||||
|
| jne | 0x005E | operator |
|
||||||
|
| push | 0x005F | operator |
|
||||||
|
| pop | 0x0060 | operator |
|
||||||
|
| out | 0x0061 | operator |
|
||||||
|
| db | 0x0100 | pseudo-operator |
|
||||||
|
| | 0x10XX | some memory address; `XX` is as specified below |
|
||||||
|
| | 0x20XX | some constant; `XX` is as specified below |
|
||||||
|
| | 0x3XXX | some label; `XXX` is its entry index in the label table |
|
||||||
|
| | 0xFEXX | used to pass some raw value `XX` in place of a token id to a couple of functions that mention this as a feature. If the function doesn't mention it, it will lead to undefined behaviour |
|
||||||
|
| | 0xFFFF | unrecognised token |
|
||||||
|
|
||||||
|
values of `XX` in `0x10XX`:
|
||||||
|
|
||||||
|
| XX | description |
|
||||||
|
|------|-------------|
|
||||||
|
| 0x00 | following word is the token ID of some register |
|
||||||
|
|
||||||
|
values of `XX` in `0x20XX`:
|
||||||
|
|
||||||
|
| XX | description |
|
||||||
|
|------|-------------|
|
||||||
|
| 0x00 | following 8 bytes are the constant's value |
|
||||||
|
|
||||||
|
### example program
|
||||||
|
|
||||||
|
#### program in assembly
|
||||||
|
|
||||||
|
this program doesn't do anything useful, it's just a test
|
||||||
|
|
||||||
|
```nasm
|
||||||
|
xor eax, eax
|
||||||
|
inc rax ; inline comment
|
||||||
|
; one line comment
|
||||||
|
mov rdx, [rax]
|
||||||
|
mov [rax], rdx
|
||||||
|
hlt
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### tokenization
|
||||||
|
|
||||||
|
```nasm
|
||||||
|
0x0053 ; xor
|
||||||
|
0x0010 ; eax
|
||||||
|
0x0010 ; eax
|
||||||
|
0x0054 ; inc
|
||||||
|
0x0000 ; rax
|
||||||
|
0x0056 ; mov
|
||||||
|
0x0003 ; rdx
|
||||||
|
0x1000 ; memory address: register
|
||||||
|
0x0000 ; rax
|
||||||
|
0x0056 ; mov
|
||||||
|
0x1000 ; memory address: register
|
||||||
|
0x0000 ; rax
|
||||||
|
0x0003 ; rdx
|
||||||
|
0x004F ; hlt
|
||||||
|
```
|
||||||
|
|
||||||
|
#### nasm output with the above example program, bits 64
|
||||||
|
|
||||||
|
```nasm
|
||||||
|
0x31 ; XOR r/m16/32/64 r16/32/64
|
||||||
|
0xC0 ; ModR/M byte
|
||||||
|
; mod 11b ; directly address the following:
|
||||||
|
; reg 000b ; EAX
|
||||||
|
; r/m 000b ; EAX
|
||||||
|
|
||||||
|
0x48 ; 64 Bit Operand Size prefix
|
||||||
|
0xFF ; with `reg` from ModR/M byte 000b:
|
||||||
|
; INC r/m16/32/64
|
||||||
|
0xC0 ; ModR/M byte
|
||||||
|
; mod 11b ; direct addressing
|
||||||
|
; reg 000b ; RAX
|
||||||
|
; r/m 000b ; RAX
|
||||||
|
|
||||||
|
0x48 ; 64 Bit Operand Size prefix
|
||||||
|
0x8B ; MOV r16/32/64 r/m16/32/64
|
||||||
|
0x10 ; ModR/M byte
|
||||||
|
; mod 00b ; indirect addressing, no displacement
|
||||||
|
; reg 010b ; RDX
|
||||||
|
; r/m 000b ; [RAX]
|
||||||
|
|
||||||
|
0x48 ; 64 Bit Operand Size prefix
|
||||||
|
0x89 ; MOV r/m16/32/64 r16/32/64
|
||||||
|
0x10 ; ModR/M byte
|
||||||
|
; mod 00b ; indirect addressing, no displacement
|
||||||
|
; reg 010b ; RDX
|
||||||
|
; r/m 000b ; [RAX]
|
||||||
|
|
||||||
|
0xF4 ; HLT
|
||||||
|
```
|
||||||
3340
twasm/asm/main.asm
Normal file
3340
twasm/asm/main.asm
Normal file
File diff suppressed because it is too large
Load Diff
668
twasm/asm/tests.asm
Normal file
668
twasm/asm/tests.asm
Normal file
@@ -0,0 +1,668 @@
|
|||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; tests
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; run_tests
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; runs all tests
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
run_tests:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
|
||||||
|
call test_completeness
|
||||||
|
|
||||||
|
call clear_test_arena
|
||||||
|
call test_djb2
|
||||||
|
|
||||||
|
call clear_test_arena
|
||||||
|
call test_elemb
|
||||||
|
|
||||||
|
call clear_test_arena
|
||||||
|
call test_get_tte_type
|
||||||
|
|
||||||
|
call clear_test_arena
|
||||||
|
call test_get_tte_typed_metadata
|
||||||
|
|
||||||
|
call clear_test_arena
|
||||||
|
call test_get_opcode
|
||||||
|
|
||||||
|
call clear_test_arena
|
||||||
|
call test_get_reg_bits
|
||||||
|
|
||||||
|
call clear_test_arena
|
||||||
|
call test_evaluate_constant
|
||||||
|
|
||||||
|
call clear_test_arena
|
||||||
|
call test_identify_register
|
||||||
|
|
||||||
|
call clear_test_arena
|
||||||
|
call test_identify_operator
|
||||||
|
|
||||||
|
call clear_test_arena
|
||||||
|
call test_evaluate_operand
|
||||||
|
|
||||||
|
ret
|
||||||
|
.msg db "running test suite...", 0x0A, 0x00
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_completeness
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; visual confirmation of binary integrity
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_completeness:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
mov rsi, .msg_content
|
||||||
|
call print
|
||||||
|
mov rsi, msg_end
|
||||||
|
call print
|
||||||
|
mov rsi, .msg_confirm
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.msg db "test_completeness...", 0x0A, 0x00
|
||||||
|
.msg_content db " here is the ", 0x00
|
||||||
|
.msg_confirm db " here is the end of the binary ->|", 0x0A, " assert: the previous 2 lines are identical", 0x0A, 0x00
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_elemb
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; tests elemb described functionality
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_elemb:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
|
||||||
|
; [0]
|
||||||
|
mov rdi, 5
|
||||||
|
mov rsi, .case1
|
||||||
|
mov dl, [.case1]
|
||||||
|
call elemb
|
||||||
|
cmp al, 1
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; [n - 1]
|
||||||
|
mov rdi, 5
|
||||||
|
mov rsi, .case1
|
||||||
|
mov dl, [.case1 + 4]
|
||||||
|
call elemb
|
||||||
|
cmp al, 1
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; [1]
|
||||||
|
mov rdi, 5
|
||||||
|
mov rsi, .case1
|
||||||
|
mov dl, [.case1 + 1]
|
||||||
|
call elemb
|
||||||
|
cmp al, 1
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; not present
|
||||||
|
mov rdi, 5
|
||||||
|
mov rsi, .case1
|
||||||
|
mov dl, 0xDA
|
||||||
|
call elemb
|
||||||
|
cmp al, 0
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; 0 length list
|
||||||
|
mov rdi, 0
|
||||||
|
mov rsi, .case0
|
||||||
|
mov dl, 0x34
|
||||||
|
call elemb
|
||||||
|
cmp al, 0
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
.pass:
|
||||||
|
mov rsi, msg_pass
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
mov rsi, msg_fail
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.case0: ; [This Page Intentionally Left Blank]
|
||||||
|
.case1 db 0x54, 0x00, 0x21, 0x20, 0x34
|
||||||
|
.msg db "test_elemb...", 0x00
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_djb2
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; tests djb2 described functionality
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_djb2:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
|
||||||
|
mov rsi, .case0
|
||||||
|
mov rdi, 0
|
||||||
|
call djb2
|
||||||
|
cmp rax, 5381
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov rsi, .case1
|
||||||
|
mov rdi, 1
|
||||||
|
call djb2
|
||||||
|
cmp rax, 177670
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov rsi, .case2
|
||||||
|
mov rdi, 2
|
||||||
|
call djb2
|
||||||
|
cmp rax, 5863208
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; why am I testing this, of course it's without side effects xD
|
||||||
|
|
||||||
|
mov rsi, .case0
|
||||||
|
mov rdi, 0
|
||||||
|
call djb2
|
||||||
|
cmp rax, 5381
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov rsi, .case1
|
||||||
|
mov rdi, 1
|
||||||
|
call djb2
|
||||||
|
cmp rax, 177670
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov rsi, .case2
|
||||||
|
mov rdi, 2
|
||||||
|
call djb2
|
||||||
|
cmp rax, 5863208
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
.pass:
|
||||||
|
mov rsi, msg_pass
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
mov rsi, msg_fail
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.case0 db ""
|
||||||
|
.case1 db "a"
|
||||||
|
.case2 db "ab"
|
||||||
|
.msg db "test_djb2...", 0x00
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_get_tte_type
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; tests get_tte_type described functionality
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_get_tte_type:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
|
||||||
|
mov di, 0x0053 ; xor
|
||||||
|
call get_tte_type
|
||||||
|
cmp al, 0x01 ; operator
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0003 ; rdx
|
||||||
|
call get_tte_type
|
||||||
|
cmp al, 0x02 ; register
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0056 ; mov
|
||||||
|
call get_tte_type
|
||||||
|
cmp al, 0x01 ; operator
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0xFFFF ; unrecognised token
|
||||||
|
call get_tte_type
|
||||||
|
cmp al, UNRECOGNISED_ID_TYPE
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
.pass:
|
||||||
|
mov rsi, msg_pass
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
mov rsi, msg_fail
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.msg db "test_get_tte_type...", 0x00
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_get_tte_typed_metadata
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; tests get_tte_typed_metadata described functionality
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_get_tte_typed_metadata:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
|
||||||
|
mov di, 0x0053 ; xor
|
||||||
|
call get_tte_typed_metadata
|
||||||
|
cmp al, 0x02 ; # operands
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x004F ; hlt
|
||||||
|
call get_tte_typed_metadata
|
||||||
|
cmp al, 0x00 ; # operands
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0003 ; rdx
|
||||||
|
call get_tte_typed_metadata
|
||||||
|
cmp al, 00001011b ; reg: 010b
|
||||||
|
; width: 11b (64 bits)
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0056 ; mov
|
||||||
|
call get_tte_typed_metadata
|
||||||
|
cmp al, 0x02 ; # operands
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0xFFFF ; unrecognised token
|
||||||
|
call get_tte_typed_metadata
|
||||||
|
cmp al, UNRECOGNISED_ID_METADATA
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
.pass:
|
||||||
|
mov rsi, msg_pass
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
mov rsi, msg_fail
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.msg db "test_get_tte_typed_metadata...", 0x00
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_get_opcode
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; tests get_opcode described functionality
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_get_opcode:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
|
||||||
|
mov di, 0x0053 ; xor
|
||||||
|
mov sil, 0
|
||||||
|
mov bl, 0
|
||||||
|
call get_opcode
|
||||||
|
cmp al, 0x31
|
||||||
|
jne .fail
|
||||||
|
cmp dl, 0q0
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0053 ; xor
|
||||||
|
mov sil, 1
|
||||||
|
mov bl, 0
|
||||||
|
call get_opcode
|
||||||
|
cmp al, 0x33
|
||||||
|
jne .fail
|
||||||
|
cmp dl, 0q0
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0053 ; xor
|
||||||
|
mov sil, 2
|
||||||
|
mov bl, 0
|
||||||
|
call get_opcode
|
||||||
|
cmp al, 0x81
|
||||||
|
jne .fail
|
||||||
|
cmp dl, 0q6
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0053 ; xor
|
||||||
|
mov sil, 3
|
||||||
|
mov bl, 0
|
||||||
|
call get_opcode
|
||||||
|
cmp al, 0x83
|
||||||
|
jne .fail
|
||||||
|
cmp dl, 0q6
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0054 ; inc
|
||||||
|
mov sil, 0
|
||||||
|
mov bl, 0
|
||||||
|
call get_opcode
|
||||||
|
cmp al, 0xFF
|
||||||
|
jne .fail
|
||||||
|
cmp dl, 0q0
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0055 ; dec
|
||||||
|
mov sil, 0
|
||||||
|
mov bl, 0
|
||||||
|
call get_opcode
|
||||||
|
cmp al, 0xFF
|
||||||
|
jne .fail
|
||||||
|
cmp dl, 0q1
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x004F ; hlt
|
||||||
|
mov sil, 0
|
||||||
|
mov bl, 0
|
||||||
|
call get_opcode
|
||||||
|
cmp al, 0xF4
|
||||||
|
jne .fail
|
||||||
|
cmp dl, 0q0
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0059 ; call
|
||||||
|
mov sil, 0q0
|
||||||
|
mov bl, 0
|
||||||
|
call get_opcode
|
||||||
|
cmp al, 0xFF
|
||||||
|
jne .fail
|
||||||
|
cmp dl, 0q2
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0003 ; rdx (not an operator)
|
||||||
|
mov sil, 0q0
|
||||||
|
mov bl, 0
|
||||||
|
call get_opcode
|
||||||
|
cmp al, UNRECOGNISED_ID_OPCODE
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
.pass:
|
||||||
|
mov rsi, msg_pass
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
mov rsi, msg_fail
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.msg db "test_get_opcode...", 0x00
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_get_reg_bits
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; tests get_reg_bits described functionality
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_get_reg_bits:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
|
||||||
|
mov di, 0x0000 ; rax
|
||||||
|
call get_reg_bits
|
||||||
|
cmp al, 000b
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0010 ; eax
|
||||||
|
call get_reg_bits
|
||||||
|
cmp al, 000b
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov di, 0x0003 ; rdx
|
||||||
|
call get_reg_bits
|
||||||
|
cmp al, 010b
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
.pass:
|
||||||
|
mov rsi, msg_pass
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
mov rsi, msg_fail
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.msg db "test_get_reg_bits...", 0x00
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_evaluate_constant
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; tests evaluate_constant described funtionality
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_evaluate_constant:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
|
||||||
|
; just numerals
|
||||||
|
mov rdi, .case0h ; addr of constant
|
||||||
|
mov rsi, 8 ; length of constant
|
||||||
|
call evaluate_constant
|
||||||
|
cmp rax, [.case0h_solution]
|
||||||
|
jne .fail
|
||||||
|
cmp rdx, 0x00
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; just chars
|
||||||
|
mov rdi, .case1h ; addr of constant
|
||||||
|
mov rsi, 8 ; length of constant
|
||||||
|
call evaluate_constant
|
||||||
|
cmp rax, [.case1h_solution]
|
||||||
|
jne .fail
|
||||||
|
cmp rdx, 0x00
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; just chars
|
||||||
|
mov rdi, .case2h ; addr of constant
|
||||||
|
mov rsi, 12 ; length of constant
|
||||||
|
call evaluate_constant
|
||||||
|
cmp rax, [.case2h_solution]
|
||||||
|
jne .fail
|
||||||
|
cmp rdx, 0x00
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; PI x
|
||||||
|
mov rdi, .case3h ; addr of constant
|
||||||
|
mov rsi, 18 ; length of constant
|
||||||
|
call evaluate_constant
|
||||||
|
cmp rax, [.case3h_solution]
|
||||||
|
jne .fail
|
||||||
|
cmp rdx, 0x00
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; PI q
|
||||||
|
mov rdi, .case0q
|
||||||
|
mov rsi, 16
|
||||||
|
call evaluate_constant
|
||||||
|
cmp rax, [.case0q_solution]
|
||||||
|
jne .fail
|
||||||
|
cmp rdx, 0x01
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; PI b
|
||||||
|
mov rdi, .case0b
|
||||||
|
mov rsi, 66
|
||||||
|
call evaluate_constant
|
||||||
|
cmp rax, [.case0b_solution]
|
||||||
|
jne .fail
|
||||||
|
cmp rdx, 0x02
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; char
|
||||||
|
mov rdi, .case0c
|
||||||
|
mov rsi, 6
|
||||||
|
call evaluate_constant
|
||||||
|
cmp rax, [.case0c_solution]
|
||||||
|
jne .fail
|
||||||
|
cmp rdx, 0x03
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
.pass:
|
||||||
|
mov rsi, msg_pass
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
mov rsi, msg_fail
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.msg db "test_evaluate_constant...", 0x00
|
||||||
|
.case0h db "0x012390"
|
||||||
|
.case0h_solution dq 0x012390
|
||||||
|
.case1h db "0xABCDEF"
|
||||||
|
.case1h_solution dq 0xABCDEF
|
||||||
|
.case2h db "0x1234567890"
|
||||||
|
.case2h_solution dq 0x1234567890
|
||||||
|
.case3h db "0x243F6A8885A308D3"
|
||||||
|
.case3h_solution dq 0x243F6A8885A308D3
|
||||||
|
.case0c db '"char"'
|
||||||
|
.case0c_solution dq "char"
|
||||||
|
.case1c db '"chars"'
|
||||||
|
.case1c_solution dq "chars"
|
||||||
|
; " wow my editor really doesn't like highlighting quotes correctly
|
||||||
|
|
||||||
|
.case0q db "0q31103755242102"
|
||||||
|
.case0q_solution dq 0q31103755242102
|
||||||
|
|
||||||
|
.case0b db "0b0110011001101001011100100111001101110100001000000011011000110100"
|
||||||
|
.case0b_solution dq 0b0110011001101001011100100111001101110100001000000011011000110100
|
||||||
|
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_identify_register
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; tests identify_register described funtionality
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_identify_register:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
|
||||||
|
mov edi, "rcx"
|
||||||
|
call identify_register
|
||||||
|
cmp ax, 0x0002
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov edi, "RaNd"
|
||||||
|
call identify_register
|
||||||
|
cmp ax, UNRECOGNISED_TOKEN_ID
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov edi, ""
|
||||||
|
call identify_register
|
||||||
|
cmp ax, UNRECOGNISED_TOKEN_ID
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
.pass:
|
||||||
|
mov rsi, msg_pass
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
mov rsi, msg_fail
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.msg db "test_identify_register...", 0x00
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_identify_operator
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; tests identify_operator described funtionality
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_identify_operator:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
|
||||||
|
mov edi, "xor"
|
||||||
|
call identify_operator
|
||||||
|
cmp ax, 0x0053
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov edi, [tokens.operators_end]
|
||||||
|
call identify_operator
|
||||||
|
cmp ax, UNRECOGNISED_TOKEN_ID
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov edi, "RaNd"
|
||||||
|
call identify_operator
|
||||||
|
cmp ax, UNRECOGNISED_TOKEN_ID
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov edi, ""
|
||||||
|
call identify_operator
|
||||||
|
cmp ax, UNRECOGNISED_TOKEN_ID
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
.pass:
|
||||||
|
mov rsi, msg_pass
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
mov rsi, msg_fail
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.msg db "test_identify_operator...", 0x00
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_evaluate_operand
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; tests evaluate_operand described funtionality
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_evaluate_operand:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print.test
|
||||||
|
|
||||||
|
mov rdi, .case0
|
||||||
|
mov rsi, 3
|
||||||
|
call evaluate_operand
|
||||||
|
cmp dl, 0x00
|
||||||
|
jne .fail
|
||||||
|
cmp ax, 0x0000
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov rdi, .case1
|
||||||
|
mov rsi, 0
|
||||||
|
call evaluate_operand
|
||||||
|
cmp dl, 0xFF
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov rdi, .case2
|
||||||
|
mov rsi, 3
|
||||||
|
call evaluate_operand
|
||||||
|
cmp dl, 0x00
|
||||||
|
jne .fail
|
||||||
|
cmp ax, 0x0003
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov rdi, .case3
|
||||||
|
mov rsi, 5
|
||||||
|
call evaluate_operand
|
||||||
|
cmp dl, 0x10
|
||||||
|
jne .fail
|
||||||
|
cmp ax, 0x0003
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
.pass:
|
||||||
|
mov rsi, msg_pass
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
mov rsi, msg_fail
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.case0 db "rax"
|
||||||
|
.case1: ; intentionally blank
|
||||||
|
.case2 db "rdx"
|
||||||
|
.case3 db "[rdx]"
|
||||||
|
.msg db "test_evaluate_operand...", 0x00
|
||||||
|
|
||||||
|
msg_pass:
|
||||||
|
db 0x0A
|
||||||
|
times (TEST_LINE_LENGTH + .start - .end) db " ", ; right align
|
||||||
|
db 0x1B, "[32m"
|
||||||
|
.start db "passed."
|
||||||
|
.end db 0x1B, "[0m", 0x0A, 0x00
|
||||||
|
msg_fail:
|
||||||
|
db 0x0A
|
||||||
|
times (TEST_LINE_LENGTH + .start - .end) db " ",
|
||||||
|
db 0x1B, "[31m"
|
||||||
|
.start db "failed."
|
||||||
|
.end db 0x1B, "[0m", 0x0A, 0x00
|
||||||
46
twasm/package.nix
Normal file
46
twasm/package.nix
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
bootler,
|
||||||
|
stdenv,
|
||||||
|
nasm,
|
||||||
|
qemu,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
pname = "twasm";
|
||||||
|
version = "0.1.0";
|
||||||
|
src = ./.;
|
||||||
|
buildPhase = ''
|
||||||
|
${nasm}/bin/nasm \
|
||||||
|
asm/main.asm \
|
||||||
|
-o out.bin \
|
||||||
|
-w+all \
|
||||||
|
-w-reloc-abs
|
||||||
|
'';
|
||||||
|
installPhase = ''
|
||||||
|
dd if=/dev/zero of=disk bs=512 count=2880
|
||||||
|
dd if=${bootler}/bin/boot.bin of=disk conv=notrunc
|
||||||
|
dd if=out.bin of=disk bs=512 seek=1 conv=notrunc
|
||||||
|
|
||||||
|
mkdir -p $out/bin
|
||||||
|
|
||||||
|
cat<<EOF>$out/bin/twasm
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
mkdir -p ./.bootle
|
||||||
|
cp $(echo $out)/bin/disk ./.bootle/disk
|
||||||
|
chmod a+w ./.bootle/disk
|
||||||
|
|
||||||
|
${qemu}/bin/qemu-system-x86_64 \
|
||||||
|
-nographic \
|
||||||
|
-s \
|
||||||
|
-drive file=./.bootle/disk,format=raw,index=0,media=disk
|
||||||
|
|
||||||
|
rm ./.bootle -r
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x $out/bin/twasm
|
||||||
|
|
||||||
|
cp out.bin $out/bin
|
||||||
|
cp disk $out/bin
|
||||||
|
'';
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user