def edit(from_line, bytepos=None): """ Output program line to console and position cursor. """ if state.basic_state.protected: console.write(str(from_line)+'\r') raise error.RunError(error.IFC) # list line state.basic_state.bytecode.seek(state.basic_state.line_numbers[from_line]+1) _, output, textpos = tokenise.detokenise_line(state.basic_state.bytecode, bytepos) # no newline to avoid scrolling on line 24 console.list_line(str(output), newline=False) # find row, column position for textpos newlines, c = 0, 0 pos_row, pos_col = 0, 0 if not output: return for i, byte in enumerate(output): c += 1 if chr(byte) == '\n' or c > state.console_state.screen.mode.width: newlines += 1 c = 0 if i == textpos: pos_row, pos_col = newlines, c if textpos > i: pos_row, pos_col = newlines, c + 1 if bytepos: console.set_pos(state.console_state.row-newlines+pos_row, pos_col) else: console.set_pos(state.console_state.row-newlines, 1)
def edit(from_line, bytepos=None): """ Output program line to console and position cursor. """ if state.basic_state.protected: console.write(str(from_line) + '\r') raise error.RunError(error.IFC) # list line state.basic_state.bytecode.seek(state.basic_state.line_numbers[from_line] + 1) _, output, textpos = tokenise.detokenise_line(state.basic_state.bytecode, bytepos) # no newline to avoid scrolling on line 24 console.list_line(str(output), newline=False) # find row, column position for textpos newlines, c = 0, 0 pos_row, pos_col = 0, 0 for i, byte in enumerate(output): c += 1 if chr(byte) == '\n' or c > state.console_state.screen.mode.width: newlines += 1 c = 0 if i == textpos: pos_row, pos_col = newlines, c if textpos > i: pos_row, pos_col = newlines, c + 1 if bytepos: console.set_pos(state.console_state.row - newlines + pos_row, pos_col) else: console.set_pos(state.console_state.row - newlines, 1)
def list_lines(dev, from_line, to_line): """ List line range to console or device. """ if state.basic_state.protected: # don't list protected files raise error.RunError(5) # 65529 is max insertable line number for GW-BASIC 3.23. # however, 65530-65535 are executed if present in tokenised form. # in GW-BASIC, 65530 appears in LIST, 65531 and above are hidden if to_line == None: to_line = max_list_line # sort by positions, not line numbers! listable = sorted([ state.basic_state.line_numbers[num] for num in state.basic_state.line_numbers if num >= from_line and num <= to_line ]) for pos in listable: state.basic_state.bytecode.seek(pos + 1) _, line, _ = tokenise.detokenise_line(state.basic_state.bytecode) if dev == backend.devices['SCRN:']: console.list_line(str(line)) else: dev.write_line(str(line)) dev.close() flow.set_pointer(False)