THOREAU BASIC 3.4.1 - RELEASE NOTES =================================== Release date: 14 October 2026 Previous numbered release: 3.4, 13 October 2026 Version 3.4.1 is a maintenance release collecting the AUDIT correction and row,column TXTWINDOW update previously distributed in updated 3.4 packages. Programs already using those updates need no further coordinate changes. The other language features and platform requirements of 3.4 are unchanged. AUDIT CORRECTION ---------------- - Comparisons with INKEY$, CLIPBOARD$, DATE$, TIME$, ERROR$ and other built-in names no longer produce false scalar/function-name warnings. This includes comparisons in IF and WHILE conditions, PRINT expressions, assignment right-hand sides and function arguments. - Warnings remain enabled for actual scalar assignments that share function names, including LET, FOR/PARFOR counters and THEN/ELSE assignments. Existing array-name checks remain enabled. AUDIT still checks without running the program or consuming keyboard input. TEXT COORDINATES AND COMPATIBILITY --------------------------------- - Both TXTWINDOW forms use row,column pairs: TXTWINDOW row1,column1,row2,column2 TXTWINDOW @n,row1,column1,row2,column2 Corners are 1-based, inclusive positions on the whole-screen text grid. This retains the correction supplied in the latest 3.4 update. - When upgrading from a build with column-first TXTWINDOW, swap each coordinate pair and leave the @n window number in place. There is no automatic recognition of the old order. Programs already using row-first TXTWINDOW must not swap their arguments again. - SELECTBOX retains the row,column position introduced in 3.4. Calls from before that change need their first two arguments swapped. Its width,height dimensions and clickX,clickY pixel outputs keep their existing order. - LOCATE, ACCEPT AT and SCREEN(row,column) remain row-first. TXTWINDOW's window-relative cursor behavior is unchanged. Bare TXTWINDOW still removes only the default region; named windows and VIEW PRINT remain in effect. Graphics and mouse coordinates remain x,y, not row,column text cells. VERSION 3.4 CHANGES =================== This history includes the follow-up TXTWINDOW and AUDIT updates distributed under 3.4 before they were collected in 3.4.1. Release date: 13 October 2026 Previous release: 3.3, 11 October 2026 Version 3.4 collects the changes made after the original 3.3 release of 11 October 2026. It adds runtime expressions, indirect variable access, filesystem queries, resumable form input and UEFI display rotation, together with keyboard, menu, syntax and error-reporting improvements. COMPATIBILITY NOTES ------------------- - SELECTBOX now starts with row,column rather than column,row. Swap the first two arguments in older calls. There is no compatibility mode. All remaining arguments keep their order; mouse outputs remain clickX,clickY in pixels. - TXTWINDOW now uses row1,column1,row2,column2 for both the default region and the named @n form. Swap each coordinate pair in older calls; leave the window number in place. Both corners use 1-based, inclusive screen text cells. There is no old-order mode. Bare TXTWINDOW still restores ordinary full-screen output subject to VIEW PRINT; window-relative LOCATE behavior is unchanged. Text positions now consistently use row,column in LOCATE, ACCEPT AT, SCREEN(row,column), SELECTBOX and TXTWINDOW. Graphics remain x,y. - Identifier base names remain limited to 37 characters, excluding the type suffix. Longer names now raise an error instead of being silently shortened. - Re-create standalone EXE/EFI applications to include the 3.4 changes. KEYBOARD SHORTCUTS AND MENUS --------------------------- - On Windows, Alt+printable keys and previously silent Ctrl+digit or Ctrl+punctuation combinations now produce INKEY$ character events. The returned character follows the active layout, Shift and Caps Lock without adding a special modifier prefix. Pressing a modifier alone stays silent. - Ctrl+A through Ctrl+Z retain character codes 1..26. Supported function and navigation keys retain their existing two-byte INKEY$ results. Duplicate delivery of control characters, including Ctrl+H, Ctrl+I and Ctrl+M, is fixed. - Repeated application Alt shortcuts no longer trigger the unwanted Windows menu beep. Alt+Space still opens the system menu. Alt+F4, Alt+Tab, Alt+Escape, Windows-key shortcuts and Alt+numpad entry remain Windows-owned. AltGr text entry is preserved. F11/Alt+Enter remain fullscreen controls and F12 remains the debugger rather than an ordinary application key. - Custom KEYREPEAT timing applies to the new shortcut events. Releasing the key or leaving the application stops its repeat. KEYDOWN remains a live held-state query, not a saved modifier snapshot for an earlier INKEY$ event. - SELECTBOX uses CP437 CHR$(24) and CHR$(25) for its up/down scroll arrows in both frame styles. Menu-mode key$ can return the newly delivered shortcuts. - UEFI firmware input remains limited to keys and modifiers actually supplied by the firmware; the update cannot recover events a device never reports. ACCEPT FORMS AND RESTART ----------------------- - A comma or semicolon may separate ACCEPT options from the destination. The previous colon separator remains valid. Optional key$ and paired clickX,clickY outputs enable form input. - Form input can return on Enter, Tab, Shift+Tab, Up/Down, Page Up/Down, delivered function keys and shortcuts not used by the field editor. Tab returns CHR$(9); Shift+Tab returns CHR$(0)+CHR$(15). Existing selection, clipboard and other editing shortcuts continue to edit the field. - A left click inside the field positions the caret. An outside left click returns key$="MOUSE" and optional pixel coordinates. Escape or right-click returns CHR$(27) without changing the destination or invoking ON BREAK. Keyboard and cancellation returns set optional click coordinates to -1,-1. - Other form exits validate and commit the value. Malformed numeric text remains editable; overflow is an ordinary BASIC error. Form exits do not force a newline. Without key$, ordinary Enter/Escape and ON BREAK behavior remains unchanged. - Delivered Alt+character and Ctrl+printable shortcuts return to the form's caller rather than inserting text. AltGr printable input remains text. - RESTART restores the last yielded field's draft, caret, selection, horizontal position, insert/overwrite mode and one-level undo/redo state when the same ACCEPT statement, destination, options and geometry match. It requires key$ output. A first use or mismatch starts normal input. - Only the last yielded field is retained. Enter completes it; opening another field replaces it. RUN, NEW and CLEAR clear the saved state. A matching RESTART uses the saved draft, not a value subsequently assigned by the caller. To display that new value, start fresh with DEFAULT instead. FILES AND WINDOWS DRIVES ------------------------ - GETFILES adds an optional final skipped-count output: GETFILES names$(),count[,filespec$[,flags[,skipped]]] Supplying skipped lets a listing return representable names while counting eligible names that cannot be represented in BASIC. Without it, such a name remains an error. Supply filespec$ and flags to reach the skipped argument. - File masks are applied before filename conversion, so unrelated files with unrepresentable names no longer interrupt a listing. Included directories still bypass the file mask. Other errors and cancellation leave the old destination array and output values unchanged, rather than returning a partial successful result. Windows filenames remain CP437; UEFI filenames remain ASCII. No lossy replacement names are returned. - FILEATTR(path$) reads file/directory attributes on both platforms: 1 read-only, 2 hidden, 4 system, 16 directory and 32 archive. Normal attributes return 0; an unavailable query returns -1. Check for -1 before testing attribute bits. - Windows GETDRIVES roots$(),count returns drive-letter roots in alphabetical order. DRIVETYPE(root$) reports unknown, absent, removable, fixed, network, optical or RAM-disk classification. DRIVEPATH$(root$) returns a mapped network resource, or an empty string when no mapping is available. - Drive queries do not promise that media is ready or accessible. These three facilities are Windows-only; FILEATTR and GETFILES also work on UEFI. RUNTIME EXPRESSIONS AND INDIRECT VARIABLES ----------------------------------------- - EVAL(expr$) evaluates one complete expression held in a string, using current variables, arrays, functions and DEF FN definitions. Numeric, string and hypercomplex result types are preserved. Errors use the calling program's normal ERR, ERL, ERROR$ and ON ERROR handling. - EVAL accepts up to 4,095 bytes, 127 expression tokens and 16 nested EVAL calls, subject to the ordinary expression and function nesting limits. Statements, comments outside strings, embedded NUL/newlines and malformed expressions are rejected. It is not a general command-execution facility or a sandbox for untrusted input: called functions can have side effects. - GETVAR(name$[,indices...]) reads a scalar or existing array element by name. A missing scalar returns its typed zero or empty value without declaring it. Missing arrays, incorrect dimensions and out-of-range subscripts are errors. - SETVAR value,name$[,indices...] assigns indirectly with normal type conversion, creating a missing scalar when necessary. DCLVAL name$[,bounds...] declares a new scalar or an array with one to four dimensions. Duplicate declarations are errors. Arrays are not automatically created or enlarged by an indirect assignment, and runtime values such as ERR are excluded. - EVAL and indirect variable access work with JIT ON but are not available inside PARFOR. AUDIT reports PARFOR checks involving hidden dynamic dependencies as incomplete rather than claiming those dependencies are safe. IDENTIFIER SPELLING ------------------- - Names may begin with an underscore and contain underscores. They remain case-insensitive and retain the ordinary type suffixes. An underscore has no special meaning for scope or access. - An unsuffixed name beginning with underscore defaults to DOUBLE; DEFxxx letter ranges continue to apply to A-Z. Use a suffix for another type. FIND/REPLACE WORD, XREF, AUDIT, RENUM, DRAW substitutions and state schemas recognize the same identifier spelling. AUDIT, PARFOR AND ERROR REPORTING -------------------------------- - AUDIT no longer mistakes comparisons with INKEY$, CLIPBOARD$, DATE$, TIME$, ERROR$ or other built-in names for scalar assignments. Function-name warnings apply to actual assignment targets, including LET, FOR/PARFOR counters and assignments in THEN/ELSE branches. Genuine scalar/function-name conflicts and the existing array-name checks remain enabled. - AUDIT warns about possible unintended scalar accumulation inside PARFOR, identifying the variable, source location and enclosing loop. It considers assignments, branches and nested loops without running the program. Unsupported or ambiguous cases are reported as skipped or incomplete. - PARFOR scalar behavior is now explicit in the reference: numeric and hypercomplex scalars are private to each worker, not freshly reset for each iteration. Final private scalar values are not copied back, even with one worker, and there is no automatic sum or other reduction. This clarifies existing behavior; the new AUDIT warning does not change execution rules. - AUDIT accepts empty THEN and ELSE branches, matching program execution. Conditions and nonempty branches are still checked. IF ... GOTO still requires a target; nested ELSE binding is unchanged. - LOCATE now rejects semicolons and invalid trailing text consistently in direct mode and stored programs, with JIT either on or off, including named text windows. Errors can be trapped and RESUME NEXT continues normally. Valid omitted coordinates and legacy comma-separated extra fields remain accepted; a malformed LOCATE does not apply a partial cursor movement. - With JIT ON, malformed text on a later line no longer stops an earlier valid statement or gives that earlier line as the error location. An undefined jump target is reported at the jump; malformed text at an existing target is reported at that target when it is reached. UEFI DISPLAY ROTATION --------------------- - THOREAU.CFG beside the EFI accepts ROTATE = 0, 90, 180 or 270, in clockwise degrees. The default is 0. The setting can appear before or after KEYB. Change the file and restart the EFI to apply a new orientation. - Quarter turns swap logical screen width and height. SCREEN, mode queries, text, graphics, sprites, menus and the debugger use the rotated logical screen. Existing mode indices remain unchanged; no new physical modes are added. BASIC graphics and saved images keep their normal logical orientation. - Mouse positions and click outputs remain logical pixels. Relative movement is unchanged. Absolute input assumes panel-native firmware coordinates; device-specific touch orientation may need checking on the actual hardware. - Rotation also applies to newly created standalone EFI applications using their adjacent configuration file. Startup and SYSTEMINFO$(10) report the orientation and logical/native dimensions; ECONOMY includes display memory. - Rotation needs additional memory and display processing. It does not rotate firmware setup screens, early firmware text or the Windows desktop. Invalid settings produce a warning and disable rotation. See the manual for the configuration rules, memory requirements and hardware limitations.