From aab6303fb9c43a2d727774c25b3c50a4b1fcae8d Mon Sep 17 00:00:00 2001 From: Daniel Liu Date: Sat, 19 Jun 2021 16:57:28 -0400 Subject: [PATCH] more commands + readme --- README.md | 36 +++++++++++++++++++++++++++ fileutils.asm | 4 +++ sped.asm | 69 ++++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 103 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 13bcd24..0664806 100644 --- a/README.md +++ b/README.md @@ -1 +1,37 @@ ## SPED - the stupidly pointless editor + +**sped** is a line editor written in x86 assembly. Back in the day, before visual editors, line editors like **ed** were used. +This is my own stupid and pointless attempt at writing such line editor. + +### FEATURES/NON-FEATURES + + + +### INSTALLATION + +#### Build from source + +With `gcc` and `nasm` installed, you can simply run +``` +make +``` +to build the project + +### COMMANDS + +**p** - prints the contents of the current line + +**n** - prints the current line number + +**+/-** - moves up/down a line + +**g/G** - jumps to top/bottom of file + +**c** - change the contents of the current line + +### FAQ + +**are you insane** + +yes + diff --git a/fileutils.asm b/fileutils.asm index ad284b5..8596ff3 100644 --- a/fileutils.asm +++ b/fileutils.asm @@ -201,3 +201,7 @@ readLine: pop ebp ret +; writes contents of string array into file +; arg: filename, string array +; writeFile: + diff --git a/sped.asm b/sped.asm index 585697b..d7dcb8d 100644 --- a/sped.asm +++ b/sped.asm @@ -3,10 +3,12 @@ %include "fileutils.S" -global main extern printf extern fflush extern stdout +extern free + +global main ; macros %macro write_str 2 @@ -72,6 +74,10 @@ main: jmp _main_exit _main_exit: + + ; free string array + + %undef _ARGC %undef _ARGV @@ -112,14 +118,14 @@ repl: mov eax, DWORD [ebp-CMDSTR] mov eax, [eax] - ; q exists program + ; q exists program =-=-=-=-=-=-=-=-=-=-=-=-= mov eax, DWORD [ebp-CMDSTR] cmp BYTE [eax], 'q' jne _repl_cmd_quit_end jmp _repl_exit _repl_cmd_quit_end: - ; p prints current line + ; p prints current line =-=-=-=-=-=-=-=-=-=-= mov eax, DWORD [ebp-CMDSTR] cmp BYTE [eax], 'p' jne _repl_cmd_print_end @@ -134,7 +140,7 @@ repl: jmp _repl_continue _repl_cmd_print_end: - ; n prints the current line number + ; n prints the current line number =-=-=-=-=-=-=-= mov eax, DWORD [ebp-CMDSTR] cmp BYTE [eax], 'n' jne _repl_cmd_number_end @@ -146,7 +152,7 @@ repl: jmp _repl_continue _repl_cmd_number_end: - ; - goes to prev line + ; - goes to prev line =-=-=-=-=-=-=-=-=-=-=-=-= mov eax, DWORD [ebp-CMDSTR] cmp BYTE [eax], '-' jne _repl_cmd_decline_end @@ -162,7 +168,7 @@ repl: jmp _repl_continue _repl_cmd_decline_end: - ; + goes to next line + ; + goes to next line =-=-=-=-=-=-=-=-=-=-=-=-= mov eax, DWORD [ebp-CMDSTR] cmp BYTE [eax], '+' jne _repl_cmd_incline_end @@ -178,6 +184,57 @@ repl: jmp _repl_continue _repl_cmd_incline_end: + ; g goes to first line =-=-=-=-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'g' + jne _repl_cmd_jumptop_end + + mov DWORD [cur_line], 0x00 + + jmp _repl_continue + _repl_cmd_jumptop_end: + + ; G goes to last line =-=-=-=-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'G' + jne _repl_cmd_jumpbot_end + + mov eax, DWORD [buffer_lines] + sub eax, 1 + mov DWORD [cur_line], eax + + jmp _repl_continue + _repl_cmd_jumpbot_end: + + ; c changes the current line =-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'c' + jne _repl_cmd_change_end + + ; read a new line to use + push 0 + call readLine + + mov esi, eax + + ; free old string + mov eax, [cur_line] + mov ecx, 4 + mul ecx + add eax, [buffer] + push DWORD [eax] + call free + + ; insert new string + mov eax, [cur_line] + mov ecx, 4 + mul ecx + add eax, DWORD [buffer] + mov [eax], esi + + jmp _repl_continue + _repl_cmd_change_end: + jmp _repl_invalid_cmd -- 2.20.1