; The OS/K Team licenses this file to you under the MIT license. ; See the LICENSE file in the project root for more information. argbuf.size := 256 argbuf = [argbuf.size] argv0 = [argbuf.size] argv1pos = 0 stdin_echoing = 1 ps1 = "C:\\> " main: .print_prompt: mov rcx, STRLEN_MAX mov rdx, ps1 prns.rep.nz rdx ; empty argbuf mov rcx, argbuf.size mov rdx, argbuf stosb.rep rdx, 0 ; iterator through argbuf xor rcx, rcx .input_loop: pause pause ; Fill .buf with user input scan rax b.z rax, 0, .input_loop ; backspace character? b.nz rax, 8, .handle_input ; anything to delete? b.z rcx, 0, .input_loop ; delete it dec rcx add rdx, rcx, argbuf mov b[rdx], 0 ; update screen cmp b[stdin_echoing], 1 prn.z 8 jmp .input_loop .handle_input: cmp b[stdin_echoing], 1 prn.z rax b.z rax, 10, .extract_argv0 ; when max line length is reached, ; force a newline b.z rcx, argbuf.size, .extract_argv0 ; add character to buffer and increase iterator (rcx) add rdx, rcx, argbuf mov b[rdx], rax inc rcx ; another one jmp .input_loop .extract_argv0: ; did we read anything at all? ; if not, just go back to waiting input b.z rcx, 0, .print_prompt ; find first whitespace or null-terminator mov rcx, argbuf.size mov rdx, argbuf scasb.rep.nz rdx, ' ' ; argv1 exists? if so, save its position ; (to do) ; empty argv0 mov rcx, argbuf.size mov rax, argv0 stosb.rep rax, 0 ; extract argv0 sub rcx, rdx, argbuf mov rdx, argbuf mov rax, argv0 movsb.rep rax, rdx .detect_builtin: .builtin_dir = "dir" mov ax0, argv0 mov ax1, .builtin_dir call strcmp b.z rax, 0, .handle_DIR ; fallthrough .exec_prog: ; fallthrough .not_found: mov rcx, STRLEN_MAX mov rdx, argv0 prns.rep.nz rdx mov rdx, .errmsg prns.rep.nz rdx jmp .print_prompt .errmsg = " : command not found\n" ; ; call builtins ; .handle_DIR: call builtins.dir jmp .print_prompt