X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;ds=sidebyside;f=sped.asm;h=1e200387d1f3d269662b89ce5a589cb7246a8e57;hb=0af29f26ae69ba0ba9c5088612f0c537a20c0344;hp=859d386ed7635ab529e75a097091bd730c906abd;hpb=f0c5604be9e918713786e0fdecd7efe1e3cea0ee;p=sped.git diff --git a/sped.asm b/sped.asm index 859d386..1e20038 100644 --- a/sped.asm +++ b/sped.asm @@ -1,8 +1,12 @@ ; sped - the stupidly pointless editor ; written by pinosaur +%include "fileutils.S" + global main extern printf +extern fflush +extern stdout ; macros %macro write_str 2 @@ -15,15 +19,15 @@ extern printf section .data banner_str db `SPED - the stupidly pointless editor\n`, 0x00 - readfile_str db `reading file %s\n`, 0x00 nofile_str db `no file provided\n`, 0x00 - argcount_str db `there are %d args\n`, 0x00 - wrongfile_str db `unable to open file, error code: %i\n`, 0x00 - char_str db `read this char: %i\n`, 0x00 - printfint_str db `int: %i\n`, 0x00 + prompt_str db `sped > `, 0x00 + invalidcommand_str db `invalid command\n`, 0x00 + charcount_str db `read %i chars\n`, 0x00 section .bss - read_buf resb 64 + buffer resb 4 + buffer_lines resb 4 + cur_line resb 4 section .text main: @@ -46,13 +50,16 @@ main: _main_existing: mov ebx, DWORD [ebp+_ARGV] - add ebx, 4 + add ebx, 4 ; first user arg is filename push DWORD [ebx] - ; push readfile_str - ; call printf - call readFile + mov [buffer], eax + mov [buffer_lines], ebx + mov DWORD [cur_line], 0x00 + + call repl + mov eax, 0 jmp _main_exit @@ -64,118 +71,59 @@ main: pop ebp ret +; prompt for user +; no args - reads from globals +repl: -; reads file line by line -; args: filename -; return: -; eax - pointer to mem -; ecx - lines read -readFile: - %define _FILE_NAME 8 - %define FILE_HANDLE 4 + %define CMDSTR 4 ; the previous line read from user push ebp mov ebp, esp - - ; allocate vars - sub esp, 4 - mov DWORD [ebp-FILE_HANDLE], 0x00 - ; open existing file - mov eax, 5 - mov ebx, [ebp+_FILE_NAME] - mov ecx, 0 - mov edx, 0777 - int 0x80 - mov [ebp-FILE_HANDLE], eax + sub esp, 4 - ; check if file was open successfully - cmp eax, 0 - jge _readFile_noerror - push eax - push wrongfile_str + _repl_loop: + + ; print the prompt + push prompt_str call printf - jmp _readFile_exit + push DWORD [stdout] + call fflush - _readFile_noerror: - push DWORD [ebp-FILE_HANDLE] - call readLine + ; read line from stdin + push 0 + call readLine - jmp _readFile_exit + mov DWORD [ebp-CMDSTR], eax - _readFile_exit: - ; close file - mov eax, 6 - mov ebx, [ebp-FILE_HANDLE] - int 0x80 + ; commands are single char for now + cmp ecx, 1 + jne _repl_invalid - %undef _FILE_NAME - %undef FILE_HANDLE - - mov esp, ebp - pop ebp - ret + ; parse commands + mov eax, DWORD [ebp-CMDSTR] + mov eax, [eax] + ; q exists program + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'q' + jne _repl_cmd_quit_end + jmp _repl_exit + _repl_cmd_quit_end: -; reads a line until newline character is reached -; args: file_handle -; return: -; location to buffer -; contains eof -readLine: - %define _FILE_HANDLE 8 - %define CHAR_PTR 4 - push ebp - mov ebp, esp - - sub esp, 4 - mov DWORD [ebp-CHAR_PTR], 0x00 - - _readLine_loop: - ; if buffer is full - cmp BYTE [ebp-CHAR_PTR], 64 - jne _readLine_notfull - jmp _readLine_exit - - _readLine_notfull: - ; read a single character - mov eax, 3 - mov ebx, [ebp+_FILE_HANDLE] - mov ecx, read_buf - add ecx, [ebp-CHAR_PTR] - mov edx, 1 - int 0x80 - - mov eax, 4 - mov ebx, 1 - mov ecx, read_buf - add ecx, [ebp-CHAR_PTR] - mov edx, 1 - int 0x80 + _repl_invalid: + push invalidcommand_str + call printf - ; check for newline - mov eax, read_buf - add eax, [ebp-CHAR_PTR] - cmp DWORD [eax], 0x0a - je _readLine_exit + _repl_continue: + jmp _repl_loop - ; check for eof - mov eax, read_buf - add eax, [ebp-CHAR_PTR] - cmp DWORD [eax], 0x05 - je _readLine_exit - - add DWORD [ebp-CHAR_PTR], 1 - - jmp _readLine_loop + _repl_exit: - _readLine_exit: - - %undef _FILE_HANDLE - %undef CHAR_PTR + %undef CMDSTR mov esp, ebp pop ebp ret - +