From 1b51632360c4ab84b7a8abffd9c38ea163f381c9 Mon Sep 17 00:00:00 2001 From: Lynn Leichtle Date: Wed, 18 Sep 2024 21:45:04 +0200 Subject: [PATCH] clean up usage for repl --- src/main.zig | 80 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 6 deletions(-) diff --git a/src/main.zig b/src/main.zig index 9786406..80cde3b 100644 --- a/src/main.zig +++ b/src/main.zig @@ -17,7 +17,29 @@ const std = @import("std"); const mem = @import("memory.zig"); const cpu_ = @import("cpu.zig"); + var long_prompt = false; + +const TOO_MANY_ARGUMENTS = "Wrong number of arguments"; +const WRONG_ARGUMENT = "Invalid argument"; +// COMMAND +const PROMPT_COMMAND = "prompt"; +const SEGMENT_REGISTER_COMMAND = "sr"; +const REGISTER_COMMAND = "reg"; +const CLEAR_COMMAND = "cls"; +const HELP_COMMAND = "?"; +// DESCRIPTION +const PROMPT_DESCRIPTION = "Change the prompt between Long-mode or Short-mode."; +const REGISTER_DESCRIPTION = "Print the current values for Registers."; +const SEGMENT_REGISTER_DESCRIPTION = "Print the current values for Segment Registers."; +const CLEAR_DESCRIPTION = "Clears the screen."; +// USAGE +const PROMPT_USAGE = "prompt {short|long}"; +const REGISTER_USAGE = "reg"; +const SEGMENT_REGISTER_USAGE = "sr"; +const HELP_USAGE = "?"; +const CLEAR_USAGE = "cls"; + pub fn main() !void { var memory = mem.Memory.init(); var cpu = cpu_.Cpu.init(); @@ -58,7 +80,11 @@ pub fn main() !void { try handleSegmentRegisterCommand(&cpu, &it); } else if (std.mem.eql(u8, first_argument, "prompt")) { try handlePromptCommand(&it); - } else if (std.mem.eql(u8, first_argument, "?")) {} + } else if (std.mem.eql(u8, first_argument, "?")) { + try handleHelpCommand(&it); + } else if (std.mem.eql(u8, first_argument, CLEAR_COMMAND)) { + try handleClearScreenCommand(&it); + } } else { // noop } @@ -113,6 +139,28 @@ fn printSr(cpu: *cpu_.Cpu) void { }); } +fn handleHelpCommand(it: anytype) !void { + if (it.next()) |_| { + std.debug.print( + \\{s}. {s} + \\ + , .{ TOO_MANY_ARGUMENTS, HELP_USAGE }); + } else { + std.debug.print( + \\{s: <20} {s} + \\{s: <20} {s} + \\{s: <20} {s} + \\{s: <20} {s} + \\ + , .{ + PROMPT_USAGE, PROMPT_DESCRIPTION, + REGISTER_USAGE, REGISTER_DESCRIPTION, + SEGMENT_REGISTER_USAGE, SEGMENT_REGISTER_DESCRIPTION, + CLEAR_USAGE, CLEAR_DESCRIPTION, + }); + } +} + fn handlePromptCommand(it: anytype) !void { if (it.next()) |next_argument| { if (std.mem.eql(u8, next_argument, "long")) { @@ -121,22 +169,42 @@ fn handlePromptCommand(it: anytype) !void { long_prompt = false; } else { std.debug.print( - \\Invalid argument. Usage: prompt + \\{s}, usage: {s} \\ - , .{}); + , .{ WRONG_ARGUMENT, PROMPT_USAGE }); } } else { std.debug.print( - \\Invalid number of arguments. Usage: prompt + \\{s}, usage: {s} \\ - , .{}); + , .{ TOO_MANY_ARGUMENTS, PROMPT_USAGE }); } } +fn handleRegisterCommand(cpu: *cpu_.Cpu, it: anytype) !void { + _ = cpu; + _ = it; +} + fn handleSegmentRegisterCommand(cpu: *cpu_.Cpu, it: anytype) !void { if (it.next()) |_| { - std.debug.print("Wrong number of arguments.\n", .{}); + std.debug.print( + \\{s}, usage: {s} + \\ + , .{ TOO_MANY_ARGUMENTS, SEGMENT_REGISTER_USAGE }); } else { printSr(cpu); } } + +fn handleClearScreenCommand(it: anytype) !void { + var output = std.io.getStdOut().writer(); + if (it.next()) |_| { + std.debug.print( + \\{s}, usage: {s} + \\ + , .{ TOO_MANY_ARGUMENTS, CLEAR_USAGE }); + } else { + try output.writeAll("\x1B[2J\x1B[H"); + } +}