X-Git-Url: https://git.danieliu.xyz/?p=sped.git;a=blobdiff_plain;f=sped.asm;h=1e200387d1f3d269662b89ce5a589cb7246a8e57;hp=eda67b319c0ed0c03fbe20f546e5b2bf76db4752;hb=0af29f26ae69ba0ba9c5088612f0c537a20c0344;hpb=17adbf435e9341831aa580404d18d8caa7448ce2 diff --git a/sped.asm b/sped.asm index eda67b3..1e20038 100644 --- a/sped.asm +++ b/sped.asm @@ -1,6 +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 @@ -13,40 +19,111 @@ 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 + 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: + %define _ARGC 8 + %define _ARGV 12 + push ebp mov ebp, esp ; read command line args - mov ecx, [ebp+8] - + mov ecx, [ebp+_ARGC] cmp ecx, 1 - jg .readFile + jg _main_existing ; display error msg if no file push nofile_str call printf mov eax, 1 - jmp .exit - -.readFile: + jmp _main_exit - mov ebx, DWORD [ebp+12] - add ebx, 4 + _main_existing: + mov ebx, DWORD [ebp+_ARGV] + 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 .exit + jmp _main_exit + + _main_exit: + %undef _ARGC + %undef _ARGV -.exit: mov esp, ebp 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 +