Minimize size further and fix bug where . used stdin instead of stdout
This commit is contained in:
parent
e6b09df3d7
commit
5fe5b58147
84
minibfc.asm
84
minibfc.asm
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue