From: Daniel Liu Date: Sat, 19 Jun 2021 18:54:18 +0000 (-0400) Subject: starting on repl X-Git-Url: https://git.danieliu.xyz/?a=commitdiff_plain;h=0af29f26ae69ba0ba9c5088612f0c537a20c0344;p=sped.git starting on repl --- diff --git a/fileutils.S b/fileutils.S index 178bca4..7ce6be3 100644 --- a/fileutils.S +++ b/fileutils.S @@ -3,5 +3,6 @@ %define __FILEUTILS_S__ extern readFile +extern readLine %endif diff --git a/fileutils.asm b/fileutils.asm index 1d96aa0..0f829f5 100644 --- a/fileutils.asm +++ b/fileutils.asm @@ -6,6 +6,7 @@ extern free extern memset global readFile +global readLine section .data wrongfile_str db `unable to open file, error code: %i\n`, 0x00 @@ -65,8 +66,8 @@ readFile: mov esi, eax mov [ebp-IS_EOF], ebx - push esi - call printf + ; push esi + ; call printf ; make string buffer bigger mov eax, DWORD [ebp-LINES_READ] @@ -113,6 +114,7 @@ readFile: ; return: ; eax: location to buffer ; ebx: contains eof +; ecx: number of chars read readLine: %define _FILE_HANDLE 8 %define CHAR_COUNT 4 ; count number of characters read @@ -178,6 +180,12 @@ readLine: _readLine_exit: + mov eax, [ebp-BLOCK_COUNT] + mov ecx, 63 + mul ecx + add eax, [ebp-CHAR_COUNT] + mov ecx,eax + mov eax, DWORD [ebp-STR_PTR] %undef _FILE_HANDLE diff --git a/sped.asm b/sped.asm index 110bf98..1e20038 100644 --- a/sped.asm +++ b/sped.asm @@ -5,10 +5,29 @@ global main extern printf +extern fflush +extern stdout + +; macros +%macro write_str 2 + mov eax, 4 + mov ebx, 1 + mov ecx, %1 + mov edx, %2 + int 0x80 +%endmacro section .data banner_str db `SPED - the stupidly pointless editor\n`, 0x00 nofile_str db `no file provided\n`, 0x00 + prompt_str db `sped > `, 0x00 + invalidcommand_str db `invalid command\n`, 0x00 + charcount_str db `read %i chars\n`, 0x00 + +section .bss + buffer resb 4 + buffer_lines resb 4 + cur_line resb 4 section .text main: @@ -35,6 +54,12 @@ main: push DWORD [ebx] call readFile + mov [buffer], eax + mov [buffer_lines], ebx + mov DWORD [cur_line], 0x00 + + call repl + mov eax, 0 jmp _main_exit @@ -46,3 +71,59 @@ main: pop ebp ret +; prompt for user +; no args - reads from globals +repl: + + %define CMDSTR 4 ; the previous line read from user + + push ebp + mov ebp, esp + + sub esp, 4 + + _repl_loop: + + ; print the prompt + push prompt_str + call printf + push DWORD [stdout] + call fflush + + ; read line from stdin + push 0 + call readLine + + mov DWORD [ebp-CMDSTR], eax + + ; commands are single char for now + cmp ecx, 1 + jne _repl_invalid + + ; 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: + + + _repl_invalid: + push invalidcommand_str + call printf + + _repl_continue: + jmp _repl_loop + + _repl_exit: + + %undef CMDSTR + + mov esp, ebp + pop ebp + ret +