bunch of stuff idek
This commit is contained in:
32
twasm/README.md
Normal file
32
twasm/README.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# twasm
|
||||
|
||||
this will be a self hosted, very minimal subset of 64 bit asm
|
||||
|
||||
### goals
|
||||
|
||||
I want to compile Bootler and Twasm with the Twasm assembler
|
||||
|
||||
### memory map
|
||||
|
||||
```
|
||||
+------ 0x00100000 ------+
|
||||
| hardware, bios stuff |
|
||||
+------ 0x00080000 ------+
|
||||
| output binary |
|
||||
+------ 0x00070000 ------+
|
||||
| token table |
|
||||
+------ 0x00060000 ------+
|
||||
| |
|
||||
| |
|
||||
+------------------------+
|
||||
| input |
|
||||
+------------------------+ this is lined up to a sector
|
||||
| | and this is less than a sector
|
||||
+------------------------+
|
||||
| assembler |
|
||||
+------ 0x00010000 ------+
|
||||
| bootloader, bios, etc. |
|
||||
+------------------------+
|
||||
```
|
||||
|
||||
each word represents a token on the token table.
|
||||
161
twasm/asm/main.asm
Normal file
161
twasm/asm/main.asm
Normal file
@@ -0,0 +1,161 @@
|
||||
LOAD_ADDR equ 0x00010000 ; address this program is loaded at
|
||||
|
||||
TOKEN_TABLE_ADDR equ 0x00060000 ; address the token table is loaded at
|
||||
TOKEN_TABLE_SIZE equ 0x1000 ; max length of table
|
||||
|
||||
TEST_ARENA_ADDR equ 0x00060000 ; address to run tests at
|
||||
TEST_ARENA_SIZE equ 0x1000 ; maximum size tests can use
|
||||
|
||||
OUTPUT_ADDR equ 0x00070000 ; address of outputed binary
|
||||
OUTPUT_SIZE equ 0x1000 ; max length of outputed binary
|
||||
|
||||
[bits 64]
|
||||
[org LOAD_ADDR]
|
||||
|
||||
start:
|
||||
mov rsi, msg_welcome
|
||||
call print
|
||||
|
||||
call run_tests
|
||||
|
||||
jmp halt
|
||||
|
||||
;
|
||||
; tokenising
|
||||
;
|
||||
|
||||
; copy_token
|
||||
;
|
||||
; description:
|
||||
; copies a token from one spot in memory to another
|
||||
; and returns metadata about that token
|
||||
;
|
||||
; parameters:
|
||||
; rdi -> start of asm command to be read
|
||||
; rsi -> start of buffer to be written
|
||||
;
|
||||
; returned:
|
||||
copy_token:
|
||||
mov rax, rdi
|
||||
.loop:
|
||||
cmp al, " "
|
||||
je .continue
|
||||
jne .break
|
||||
.continue:
|
||||
call copy_byte
|
||||
.break:
|
||||
inc rax
|
||||
ret
|
||||
|
||||
; copy_byte
|
||||
;
|
||||
; description:
|
||||
; copies a byte from one spot in memory to another
|
||||
;
|
||||
; parameters:
|
||||
; rdi -> word to be read
|
||||
; rsi -> word to be written
|
||||
;
|
||||
; returned:
|
||||
; al = byte that was read
|
||||
copy_byte:
|
||||
mov al, [rdi]
|
||||
mov [rsi], al
|
||||
ret
|
||||
|
||||
;
|
||||
; utilities
|
||||
;
|
||||
|
||||
; print
|
||||
;
|
||||
; description:
|
||||
; prints a null-terminated string
|
||||
;
|
||||
; parameters:
|
||||
; rsi -> start of null-terminated string
|
||||
; dx = port to output to
|
||||
print:
|
||||
.loop:
|
||||
mov al, [rsi]
|
||||
test al, al
|
||||
jz .done
|
||||
out dx, al
|
||||
inc rsi
|
||||
jmp .loop
|
||||
.done:
|
||||
ret
|
||||
|
||||
; halt
|
||||
;
|
||||
; description:
|
||||
; halts the program, silly :)
|
||||
halt:
|
||||
mov rsi, msg_halt
|
||||
call print
|
||||
hlt
|
||||
jmp halt
|
||||
|
||||
;
|
||||
; tests
|
||||
;
|
||||
|
||||
; run_tests
|
||||
;
|
||||
; description:
|
||||
; runs all tests
|
||||
;
|
||||
; parameters:
|
||||
; dx = port to output to
|
||||
run_tests:
|
||||
mov rsi, .msg
|
||||
call print
|
||||
|
||||
call test_copy_byte
|
||||
|
||||
ret
|
||||
.msg db "running test suite...", 0x0D, 0x0A, 0x00
|
||||
|
||||
; test_copy_byte
|
||||
;
|
||||
; description:
|
||||
; makes sure copy_byte function works by testing the following
|
||||
; - that it copies one byte to a specified memory address
|
||||
; - that it returns the copied byte in al
|
||||
;
|
||||
; parameters:
|
||||
; dx = port to output to
|
||||
test_copy_byte:
|
||||
mov rsi, .msg
|
||||
call print
|
||||
|
||||
mov rdi, test_byte ; byte to be copied
|
||||
mov rsi, TEST_ARENA_ADDR ; location of test
|
||||
call copy_byte
|
||||
|
||||
mov cx, [rsi]
|
||||
cmp ax, cx ; compare returned byte to copied byte
|
||||
jne .fail
|
||||
je .pass
|
||||
|
||||
.pass:
|
||||
mov rsi, msg_pass
|
||||
call print
|
||||
ret
|
||||
.fail:
|
||||
mov rsi, msg_fail
|
||||
call print
|
||||
ret
|
||||
.msg db "test_copy_byte...", 0x00
|
||||
|
||||
;
|
||||
; data
|
||||
;
|
||||
|
||||
msg_welcome db "Welcome to Twasm", 0x0D, 0x0A, 0x00
|
||||
msg_halt db "halted.", 0x0D, 0x0A, 0x00
|
||||
msg_pass db "passed.", 0x0D, 0x0A, 0x00
|
||||
msg_fail db "failed.", 0x0D, 0x0A, 0x00
|
||||
|
||||
test_byte db "T"
|
||||
test_token db "Test Token" ; two tokens, one followed by a space and one by nothing
|
||||
41
twasm/package.nix
Normal file
41
twasm/package.nix
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
bootler,
|
||||
stdenv,
|
||||
nasm,
|
||||
qemu,
|
||||
...
|
||||
}:
|
||||
stdenv.mkDerivation {
|
||||
pname = "twasm";
|
||||
version = "0.1.0";
|
||||
src = ./.;
|
||||
buildPhase = ''
|
||||
${nasm}/bin/nasm asm/main.asm -o out.bin
|
||||
'';
|
||||
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 \
|
||||
-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