Minimize size further and fix bug where . used stdin instead of stdout

This commit is contained in:
Juhani Krekelä 2021-05-12 17:36:43 +03:00
parent e6b09df3d7
commit 5fe5b58147
1 changed files with 46 additions and 38 deletions

View File

@ -46,49 +46,50 @@ _start:
mov rdi, rsp
.copy_header:
mov rsi, $$
mov rcx, headers_length
mov esi, $$
mov ecx, headers_length
rep movsb
.copy_init:
mov rsi, init_code
mov rcx, init_code_length
mov esi, init_code
mov ecx, init_code_length
rep movsb
mov rbp, rdi
mainloop:
; Read one byte
mov rax, 0
mov rdi, 0
xor eax, eax
xor edi, edi
mov rsi, rbp
mov rdx, 1
xor edx, edx
inc edx
syscall
.was_eof:
test rax, rax
test eax, eax
jz end
mov al, [rbp]
mov rcx, 8
mov rbx, command_table
xor rdx, rdx
mov ecx, 8
mov ebx, command_table
xor edx, edx
.table_find:
mov dl, [rbx+1]
cmp al, [rbx]
mov dl, [ebx+1]
cmp al, [ebx]
je .table_found
add dl, 2
add rbx, rdx
add ebx, edx
loop .table_find
xor rdx, rdx
xor edx, edx
.table_found:
lea rsi, [rbx + 2]
lea esi, [ebx + 2]
mov rdi, rbp
mov rcx, rdx
mov ecx, edx
rep movsb
mov rbp, rdi
@ -96,9 +97,9 @@ mainloop:
end:
.copy_end_code:
mov rsi, end_code
mov esi, end_code
mov rdi, rbp
mov rcx, end_code_length
mov ecx, end_code_length
rep movsb
mov rbp, rdi
@ -143,10 +144,10 @@ end:
stosd
; Jumping backwards, we need to invert the displacement and then account for the size of the [
neg rax
xor rbx, rbx
neg eax
xor ebx, ebx
mov byte bl, [while_length]
sub rax, rbx
sub eax, ebx
; Store in our displacement field
mov rdi, rsi
@ -159,24 +160,25 @@ end:
.fixup_done:
xor rbx, rbx
xor ebx, ebx
.output_loop:
mov rsi, rsp
add rsi, rbx
cmp rsi, rbp
je .exit
mov rax, 1
mov rdi, 1
mov rdx, 1
xor eax, eax
inc eax
mov edi, eax
mov edx, eax
syscall
inc rbx
inc ebx
jmp .output_loop
.exit:
mov rax, 60
xor rdi, rdi
mov eax, 60
xor edi, edi
syscall
command_table:
@ -204,32 +206,38 @@ command_table:
times 3 db 0
getc: db ',', putc - $ - 2
mov byte [rbx], 0
mov rax, 0
mov rdi, 0
xor eax, eax
xor edi, edi
mov rsi, rbx
mov rdx, 1
xor edx, edx
inc edx
syscall
putc: db '.', ._end - $ - 2
mov rax, 1
mov rdi, 0
xor eax, eax
inc eax
mov edi, eax
mov rsi, rbx
mov rdx, 1
mov edx, eax
syscall
._end:
init_code:
mov rcx, 0x10000 ; 64KiB of memory
mov ecx, 0x10000 ; 64KiB of memory
; Clear out the memory
sub rsp, rcx
mov rdi, rsp
mov rbx, rdi
xor al, al
rep stosb
; Initialize tape head
mov rbx, rsp
init_code_length equ $ - init_code
end_code:
mov rax, 60
xor rdi, rdi
xor edi, edi
syscall
end_code_length equ $ - end_code