diff --git a/cmd/meadow/main.ha b/cmd/meadow/main.ha index 1988f61..888a259 100644 --- a/cmd/meadow/main.ha +++ b/cmd/meadow/main.ha @@ -67,6 +67,7 @@ export fn main() void = { } ]; let state: *uxn::uxn = uxn::uxn_init(path)!; uxn::uxn_reset(state); + uxn::uxn_console_argument(state); let next_refresh: u64 = 0; const perf_freq: u64 = sdl3::GetPerformanceFrequency(); const frame_interval = perf_freq / 60; @@ -80,48 +81,38 @@ export fn main() void = { }else{ if(state.console_vector != 0){ // fmt::printf("Console!\n")!; - let args = os::args[2..]; - let i: u8 = 0; - let argcount = len(args): u8; - for (let arg .. args){ - // fmt::println("Console input args")!; - for(let char: u8 .. strings::toutf8(arg)){ - // fmt::printfln("Console input arg char: {:x}", char)!; - match (uxn::console_input(char,2,state)) { - case done => - yield done; - case let val: u8 => - fmt::fatalf("Unhandled Opcode: {:x}", val); - }; - }; - let ctype: u8 = if(i == (argcount - 1)){ - yield 4; - } else { - yield 3; - }; - match (uxn::console_input('\n',ctype,state)) { - case done => - yield done; - case let val: u8 => - fmt::fatalf("Unhandled Opcode: {:x}", val); - }; - i+=1; //TODO using i here seems inelegant - }; - const pollr = unix::poll::poll(consolefd, unix::poll::NONBLOCK); + const pollr: uint = match(unix::poll::poll(consolefd, unix::poll::NONBLOCK)){ + case let i: uint => + yield i; + case => + yield 0; + }; if(pollr > 0){ // fmt::println("Input!")!; let buf: [MAX_CONSOLE_INPUT]u8 = [0...]; io::read(os::stdin_file, buf)!; for( let b .. buf ){ - // fmt::printfln("Input: {}",buf[0])!; + // fmt::printfln("Input: {}",b: rune)!; + if(b == 0){ + // fmt::printfln("Ending stdin argument")!; + match (uxn::console_input('\n',4,state)) { + case done => + yield done; + case let val: u8 => + fmt::fatalf("Unhandled Opcode: {:x}", val); + }; + // fmt::printfln("Finished stdin argument")!; + break; + }; match (uxn::console_input(b,1,state)) { - case done => - yield done; - case let val: u8 => - fmt::fatalf("Unhandled Opcode: {:x}", val); - }; - // uxn::console_input(b,1,state); + case done => + yield done; + case let val: u8 => + fmt::fatalf("Unhandled Opcode: {:x}", val); + }; }; + + // fmt::printfln("Finished stdin argument")!; }; }; diff --git a/uxn/console.ha b/uxn/console.ha index 1e7d967..670478e 100644 --- a/uxn/console.ha +++ b/uxn/console.ha @@ -1,13 +1,27 @@ - +use fmt; export fn console_input(c: u8, ctype: u8, state: *uxn) (done | error) = { state.dev[0x12] = c; state.dev[0x17] = ctype; if(state.console_vector != 0){ - // fmt::println("Evaluating Console Vector")!; - uxn_eval(state.console_vector, state)?; - // fmt::println("Done Evaluating Console Vector")!; + // fmt::printfln("Evaluating Console Vector ctype: {:x} value: {:x}",ctype,c)!; + match(uxn_eval(state.console_vector, state)){ + case done => + state.dev[0x12] = 0; + state.dev[0x17] = 0; + return done; + case let err: error => + state.dev[0x12] = 0; + state.dev[0x17] = 0; + return err; + case => + state.dev[0x12] = 0; + state.dev[0x17] = 0; + return done; + }; }; //TODO implement eval + state.dev[0x12] = 0; + state.dev[0x17] = 0; return done; }; diff --git a/uxn/uxn.ha b/uxn/uxn.ha index df5de67..92c80c9 100644 --- a/uxn/uxn.ha +++ b/uxn/uxn.ha @@ -952,5 +952,48 @@ export fn uxn_init(path: str) ( *uxn | error ) = { }; export fn uxn_reset(state: *uxn) void = { state.running = true; + const args = os::args[2..]; + const argcount = len(args): u8; + if(argcount > 0){ + state.dev[0x17] = 1; + }else { + state.dev[0x17] = 0; + }; uxn_eval(reset_vector,state)!; + state.dev[0x17] = 0; +}; + +export fn uxn_console_argument(state: *uxn) void = { + // fmt::printf("Evaluating console arguments")!; + let args = os::args[2..]; + let i: u8 = 0; + let argcount = len(args): u8; + for (let arg .. args){ + // fmt::println("Console input args")!; + for(let char: u8 .. strings::toutf8(arg)){ + // fmt::printfln("Console input arg char: {}", char: rune)!; + match (console_input(char,2,state)) { + case done => + yield done; + case let val: u8 => + fmt::fatalf("Unhandled Opcode: {:x}", val); + case => + yield done; + }; + }; + let ctype: u8 = if(i == (argcount - 1)){ + yield 4; + } else { + yield 3; + }; + match (console_input('\n',ctype,state)) { + case done => + yield done; + case let val: u8 => + fmt::fatalf("Unhandled Opcode: {:x}", val); + case => + yield done; + }; + i+=1; //TODO using i here seems inelegant + }; };