# Dusk OS changelog Because Dusk OS is designed to mainly be used after civilizational collapse, the idea of having versions for it doesn't make much sense. After all, the only version the operator will ever need is the latest she manages to have before she makes it hers. However, during the development of this project, it's still useful to identify some point in time where things are relatively stable and where QA (see [deploy/README]) has been done. At these points in time, we assign a number and we release a tarball of that code for archival purposes. These points are also good reference to produce patches against (ie. "here's a patch against Dusk v34"). This version number is a simple integer being bumped up at semi regular intervals. Something like a release per month sounds good. There's never a sub-numbered version. If a particular version turns out to have a big bug in it, we simply release a new version quickly. There is no particular effort to maintain backward compatibility of the API. We don't change it gratuitously, but we don't maintain compatibility layers either. If you look the the history of the project, you'll see that some APIs have been there for longer than others, indicating the likeliness of their future change. The changelog below isn't meant to be a mirror of the git commit. Minor bug fixing isn't indicated. The goal of this changelog is to facilitate transition of dependent code to a subsequent version. It therefore lists API addition, change and removal. A good way to know more about the context of a particular changelog entry is to use "git blame" and look the the commit that added this entry. Dusk's git commit messages often contains the context and rationale to a particular change. ## v1 - 2024/01/03 * Initial release. ## v2 - 2024/01/25 * Remove RPi build scripts (but keep kernels). These now live in "duskos-deployments". * lib/bit: add bitflag. * asm/halo: Introducing the HAL Overdrive * Add to& to| and to^ as well as their companion and! or! and xor!. * Remove DuskBSD. I hit significant roadblocks in its development and the amount work is required to make it work outweighs the value of the tool. I give up. * pc * add [drv/pc/int10h.fs], a new driver for emitting through the BIOS. * Change approach to PIC preservation during int13h/int10h calls. Instead of doing a $08/$70 <--> $20/$28 remapping on each call (very bug prone, especially if the PIT is activated), we copy entries for the IVT during setup and only map to $20/$28 once. See [doc/hw/i386/pc/kernel]. * Set the PIT on mode 2 instead of mode 0. * Make range words binary modulable, thus changing their semantics. See [doc/usage/lit]. To keep previous semantics, those changes have to be made: * move --> cmove * fill --> cfill * []= --> c[]= * usermode: * Separate "kernel" from "payload". * Replace the "callback" struct with a "interopzone" struct which lives in Dusk's memory space. * The wrapper now has the ability to supply any payload address through boot args. * Memory size for Dusk is now dynamic, supplied through boot args. * Hand over main() control to Dusk packages, giving them much more flexibility. * common_main() has been split in two: common_setup() and common_exec(). * There are now 256 cbfuncs slots. * It's now possible to "freeze" executable for faster startup time. * Add StdIO struct to common API. ## v3 - 2024/02/23 * core: * add ll>data. * add cells/. * hal: * add s>>, operator. * *, is now guaranteed to preserve the S register. * new units: asm/dis lib/exec lib/psrs mem/endian * asm/halm: Rename "HAL Overdrive" to "HAL Macros", along with lessened ambitions. The most ambitious ideas I had for HALO turned out to be problematic and the name "Overdrive" becomes a misnomer. It's now only a collection of useful HAL-related macros. * comp/c: * Complete overhaul of the expression resolution mechanism and CDecl (now CType and Symbol) structure. Regressions might pop up here and there, but otherwise it's a drop-in replacement. * Typecasting is now stricter and needs to be done more explicitly. For example, if "c" is a char, "c << 8" will always yield 0. "(int)(c << 8)" needs to be typed. Comparison operators need matching types. * Allow creation of incomplete structs, thus allowing circular references in structs. * Reverse the order of arguments in calling convention. Previously, last argument was top of PS, now, first argument is top of PS. This affects only calls from C to Forth and from Forth to C. The API for a C function calling a C function stays the same. * Change semantics of fread() and fwrite() to target IO :read and IO :write rather than IO :read# and IO :write#. In effect, it transforms their void return type into int and they don't abort anymore on partial read/write. * The ">>" operator on signed integers now does an arithmetic shift right. * Add the #const, #forth and #include pre-processor directives. * Replace calias with #calias, #calias16, #calias8 and #caliasns. * Change lifetime rules of types, symbols and constants. They are now entirely cleared before compiling a C unit. This brings DuskCC closer to the "traditional header #include" pattern. See commit message for rationale. * comp/c/lib: * add uint allot(uint n) * add uint allot0(uint n) * add void memcpy(void *dst, void* src, uint n) * comp/tok: Change semantics of "tonws<". When no WS char is consumed before yielding c, lastws is LF instead of 0. * lib/accel: Move the "Core words accelerator" part of the late asm/halo into a more aptly named unit. * lib/fmt: add sprintf. * lib/math: add log2mod. * lib/str: add startswith? and endswith?. * lib/tree: remove * /mem: new top level directory, with these units moved to it: * lib/alloc * lib/arena * lib/array * lib/dict * lib/here * lib/ll * lib/malloc * lib/scratch * lib/stack * mem/alloc: add Allocator :allot0 * posix/fd * Change the DataIO into a parametrizable FDIO and create a new stdio structbind that wraps FDs 0 and 1. * Have this new wrapper replace error (-1) return values from fdread and fdwrite to zero. * sys/file: add Path :exec< and exec<<. * sys/io: Change the semantics of :read and :write. To keep previous semantics, those changes have to be made: * :read --> :read# * :write --> :write# * usermode * Remove the newly added stdio structbind in favor of the one now included in posix/fd (which usermode already includes). * Expose the wantstofreeze global variable in common.h. * Have ABORTPTR hook to bye by default. This doesn't affect interactive mode, which uses sys/rdln which rehooks ABORTPTR. ## v4 - 2024/03/21 * core: add showprogress and ?progress>. * hal: add "field+)" * new units: drv/rpi/break drv/rpi/gpio drv/rpi/intr drv/rpi/pwr drv/rpi/screen * asm/arm * Add a big bunch of convenience macros. * Add mcrr). * comp/c * Enforce strict type matching all binary operators, return statement and function call arguments. * Bring Forth's immediate superpowers to C with #immediate! * Perform sign extension when typecasting a signed type to a larger type. * Add #if/#else/#endif directives. * comp/c/lib * Add strequal() and assert(). * Move formerly built-in pspush() and pspop() into stdlib. * Add immediate function nbelem(). * Add DSTYPE/DPRINTF/DCPRINTF macros. * comp/tok: add n>tok. * drv/rpi/emmc: add write support * drv/usb: port USB stack from Plan 9. * drv/usb/kbd: replace old implementation with port from Plan 9. * drv/usb/uhci: temporarily remove. Will soon replace with Plan 9 port. * lib/macro: add the %- argument placeholder type. * lib/math * Add log2#, roundpow2, sex8 and sex16. * Add /lib/math.h to expose some words to C. * mem/alloc: add :alignto, allowing allocators to align to something else than 4 bytes. ## v5 - 2024/04/10 * core: * Make INSZ cell into insz value and add inptr @value to INPTR. * Lower kernel requirements for in< and word. * Change fstructbind signature from ( "structname" "bindname" -- ) to ( "fieldname" "structname" "bindname" -- ). * Make ARCH into an integer constant described in doc/kernel. * Guarantee the 3 bytes before the dictionary length field to be stable, that is, zero-padded if the name is shorter than 3 characters. * Move alignhere from xcomp/boot to kernels. * hal: * add popexit,. * change arguments of branch! ( tgt br -- ) to branch! ( br tgt -- ). * new units: drv/arm/exc drv/arm/psr drv/arm/sccp emul/oberon fs/fatt lib/arch * fs/fat * Merge with fs/fatlo, which disappears. * Move newFAT and related words to the new fs/fatt. * gr/color: add rgb888>rgb565 ( n -- n ). * gr/plane: make blt, bltfill and bltpixel into proper methods. * lib/drivelo: merge contents with sys/file. * sys/file * Simplify the boot process of systems involving filesystems. * Lower the API requirements for structs extending File. * Replace Filesystem :iter with a simpler Filesystem :children. * Replace Path :iter with Path :children. * Add Path :bi. * sys/kbd: complete rewrite * sys/ps2: move to drv/ps2 and have it follow the new sys/kbd API. * wasm: Remove and put in its own repository * xcomp/boot: Move IO struct to sys/io and File, Filesystem and FSInfo to sys/file. xcomp/boot is now IO-less and FS-less. ## v6 - 2024/05/13 * big changes: * add special treatment for double quotes (") and mustache ({) in word parsing logic. This means, for example, that the string literal previously constructed as " foobar" is now constructed as "foobar". * remove "to" semantics and replace it with Big Moustache. * remove binary width modulation in favor of moustaches. * core: * added words: * consts * wordorquote * variable * removed words: * all field words * nscompile * structbind and fstructbind * rebind' and [rebind'] * [rallot] and [rfree] * struct[ and ]struct * @@+ and @!+ * and!, or! and xor! * 1+! and 1-! * All to words except the straight to * '" and -cmove, * add PSSZ sysvar and have stack? check for PS overflow. * move HEREMAX out of SYSVARS and into a regular cell in xcomp/boot. * move scnt and rcnt from lib/diag to xcomp/boot. * add the concept of "quit hooks" * replace "< litrepl and litrepl? with str<. * rename S" to " and ,S" to ,str". * move STR_MAXSZ and strmove from lib/str to xcomp/boot. * replace MAXWORDSZ with STR_MAXSZ. * move endian-ness related words to mem/endian. * change echoin and '~ values into variables. * hal: * add ifz, and ifnz, macros. * remove [@+],, [!+], and (split. * new units: lib/memfile text/gedx * comp/c: * macros arguments can now optionally be placed inside parentheses. * remove CType :export. * drv/pc/ioport: * add the p@{} and p!{} moustache actions. * remove the "to-obeying" ioport in favor of the new moustaches. * drv/usb: * Rename a few C structs and members: * Usbdev --> IDev * Ep --> IEp * KEp --> Ep * Dev.usb --> Dev.info * fs/fatt: replace fatops structbind with FatOpts namespace containing moustache fields. * lib/bm: new Big Moustache unit. * lib/exec: move contents to xcomp/boot. * lib/drive: remove unused DriveIO. * lib/macro: * now uses wordorquote for argument parsing. * rename macro" to macro. * lib/math: * replace roundpow2 ( n pow -- n ) by the more general roundup ( n div -- n ). * add rounddown ( n div -- n ). * add abs ( n -- n ). * lib/psrs: * add ps[] ( ... n -- ... a u ) * add ndrop ( ... n -- ) * remove PS1 to PS4 in favor of their moustache counterparts. * lib/secld: don't depend on the Drive struct. * lib/str: * add bounds[] ( a u -- lo hi ). * rename intersect[] to cintersect[] without changing semantics. * add swap[] ( a u -- ). * lib/wordtbl: * replace wordtbl, :w and 'w semantics with wordtbl[, ]wordtbl and :> * add lookuptbl[, ]lookuptbl and ?lexec. * sys/file: * remove the "path drive letter" concept. * remove the Path struct. * add Filesystem finddir and Filesystem :exec<. * plug f<< and ?f<< on Filesystem :exec< thus allowing dependency declarations in units to use relative paths. * move to Drive struct from xcomp/boot to here. * remove FSInfo and change Filesystem :info semantics. * decouple File from SectorWindow. * move SectorWindow (back!) to lib/drive. * sys/io: * remove unused SumIO and SerialIO. * remove MemIO in favor of lib/memfile. * IO structs are not seekable anymore, nor do they have a size. It is now a File property. * remove unused IO :readall. * sys/kbd: * add :melt ( nkc self -- nkc ) ## v7 - 2024/06/03 * big changes: * Add the concept of unit. * "de-namespace", that is, remove the namespaces around the structures, in the new spirit of "unit bubbling", for the following units: * ar/tar * emul/cpu * emul/6502 * emul/virtio * fs/core * fs/tar * fs/fat * fs/fatt * fs/memfile * io/grid * io/secwin * io/stream * text/ed * core: * add readline< and readline<# * add []>r r>[] str>r r>str * usermode: * add the "raw" flavor * hal: * add dropf, * new units: asm/armd io/drive text/help text/ts * lib/bm: * add = <> < > <= and >= actions * remove smethod * add k (keep) modifier * lib/context: remove. needs rendered it useless * lib/drive: rename to io/secwin * lib/memfile: rename to fs/memfile * lib/secld: rename to io/secld * lib/str: * replace rmatch and rfind with rmatch" and rfind" * mem/dict: * change forget semantics * add unitofentry * sys/file: * rename to fs/core * remove "floaded" mechanism and replace ?f<< with needs * remove file bind * add closeall * remove unused drv and flags filesystem fields * replace findfreecursor with ?reusefile * remove unused newcursor filesystem method * add lookuprel * remove curdir, finddir and fsexec * sys/grid: rename to io/grid * sys/io: * rename to io/stream * add exec1< * change readline semantics to fit readline< * add readline# * sys/kbd: * add control character support to the :melt process * text/ed: * replace edload with edload<< and add edsaveto * add multiple buffers support * add wordundercursor ## v8 - 2024/06/26 * core * add addquithook scry ?abort" * change semantics of '~ bubbleup cmove" * change booting sequence so that it doesn't end with init, but quit * remove llfindprev in favor of llfind moved from mem/ll * move s, from lib/str to core * allow units to be nested * move readline< up to io/stream * rename -^ to swap- * replace :compiling with compileonly * remove entry metadata system * hal * add swap-, * remove -W, * add if* (example if=) and while* macros * fs/core * now depends on lib/str * gr/cursor: De-namespace Cursor * gr/plane: De-namespace Plane * gr/rect: De-namespace Rect * io/stream * change readline< semantics slightly * lib/bm * add n, s ~ and @ modifiers * add [] action * add ){ * rename -^ action to swap- * remove the @Ainc action * restrict interpret-mode support to only @ ! and @! actions * formalize "low level" API better for better mix-and-match of moustaches and HAL code * lib/match * new unit extracting rmatch" and rfind" from lib/str * add =anyof" * lib/str * replace static strbuf with the concept of "string pool" * remove unused strmove" * add str>pool * mem/endian * preserve the A register throughout the unit * add lib/bm actions le@{} le!{} be@{} and be!{} * mem/ll * change llitern semantics * move llfind to core, also changing its semantics * io/stream * now depends on lib/str * sys/kbd * rename to io/kbd * De-namespace Keyboard and Keys * sys/mouse * rename to io/mouse * De-namespace Mouse * sys/rdln: rename to io/prompt and change semantics * sys/screen * rename to io/screen * De-namespace Screen ## v9 - 2024/07/31 * core * replace findentrycomp with the FINDMASK sysvar * replace runword with run1 * add entry[] and samecode * add setters mechanism * remove unused compword * add NEWHERE reserve CURALLOC * replace SYSCONTEXT and CURCONTEXT with SYSDICT * posix+usermode: * add the -e -c -f command line flags * remove the dataio binding * hal * have &) implicitly call 32b) * rename branch, --> br, branchC, --> brc, branchR, --> brr, and change semantics * remove branchA, which is replaced by "A) &) br," * add fbr, fbrc, bbr, bbrc, execute, * new unit: io/drvstr * drv/pc/ioport * add ioport{} * remove runtime ability of p@{} and p!{} * drv/usb/kbd * replace Plan 9 port with a homegrown Forth driver. * drv/usb/uhci * re-add unit removed in v4. It's not from Plan 9 after all, it's homegrown. * fs/core * add ?child and ?lookup * change semantics of ?newfile ?newdir * io/grid * make all words implicitly target the grid global value. * the grid struct is no longer a stream * add gridstream * remove spitpos spiton spitoff * io/kbd * move keyboard layouts to new data dir data/kbdl * io/secwin * make sector windows comply to io/drive semantics * move the "buffer" part of the unit to io/drvstr * lib/bit * replace &bit> and &bit< with bitfield * lib/bm * have ++ copy over indirection field * remove "to" implementation in favor of the new "setters" in core * remove bind{} * add }value * lib/ns: remove unit * mem/alloc mem/scratch mem/arena * complete rewrite around CURALLOC * mem/array * de-namespace * mem/dict * move e>wlen entrylen entryname[] to core * mem/endian * add littleendian{} and bigendian{} * remove runtime ability of le@{} le!{} be@{} and be!{} * sys/timer * add ?timeoutus" ?timeoutms" ## v10 - 2024/08/21 *If Forth and Lisp had a baby, would they name it Alia?* * hal * add C) NC) ifc, ifnc, * have <<, >>, s>>, set the C and Z flags * new units: comp/lisp drv/sunxi/smhc mem/cons * comp/tok * add isChar? * io/grid * add pcell!+ * lib/psrs * add rs[] ## v11 - 2024/09/24 * core * move string pool from lib/str to core * remove ,[ ,] ,str" * add newstr endstr strallot * rename cmove, --> cmoveallot * hal * add fill, move, []=, idx, * new units: gr/damage gr/font/cos gr/pix gr/pmap gr/varvara * drv/pc/vesa * remove VESA 1.2 implementation * fs/core * replace ?lookup with ensurepath * change semantics of ?newfile ?newdir * gr/color * add colorwriter colorbytes * gr/cursor * add cursor handlemouse showmouse hidemouse * gr/plane: remove, superseded by gr/pix * gr/rect: remove unit * io/grid * make the grid buffered * add scroll rawcell! * lib/bm * add offset{ * lib/wordtbl: * add code> ## v12 - 2024/10/21 * core * add Dynamic SYSVARS concept * replace "compileonly" and "setter" with "findselector" * new units: drv/arm/cache fs/search gr/font gr/font/ufx gr/icn hal/bwr hal/opq hal/ops hal/muldiv hal/range hal/vreg mem/range xcomp/i386/pc/deploy xcomp/arm/rpi/deploy * asm/halm: split to hal/opq and hal/muldiv * drv/pc/vesa * change API so it fits well with io/screen mode management * fs/core * add lookuprel# loadpath * fs/memfile * add writtenrange * gr/font/cos: remove unit * gr/pix * replace damageptr with invalidate * add bufsz pixsrcdst! drawnrect ?resize resize# * change semantics of mappixels newpixbuf * gr/pmap: remove unit * hal * add sys) * io/fbgrid * use gr/font to draw any font, not just 8x8 cells * io/drvstr * rename seek to window * io/screen * add "Mode management" concept * io/stream * add nullstream * lib/arch * add familyname * lib/bm * move the [] action to hal/muldiv * lib/str * extract range-related words to mem/range * sys/timer: * rename to drv/timer * add ifelapsedus and ifelapsedms * text/ed * the convenience layer doesn't implicitly call "s" anymore * text/help * change helppath semantics ## v13 - 2024/11/09 * core * have kernels implement parsehex instead of parsedec * rename << >> cells cells/ --> 2* 2/ 4* 4/ * remove cell * add 2+ 2- 4+ 4- 8+ 8- 8* 8/ * rename ^ --> inv * add invand * remove ability for units to nest * posix VM * Complete rewrite. Instead of having its own frankenstein bytecode, it now partially emulates ARMv4 and its HAL generates the same code as ARM kernels. * Add "curses" and "sdl" flavors. Exactly like in usermode, but easier to build, albeit slower. * new unit: bin/gbe * asm/arm * rename rTOP --> rW * comp/c * change #include semantics * move comp/c/cc.fs to comp/c.fs * drv/ata: remove NetBSD ATA driver port * drv/pc/ata: bring back from the dead * drv/timer * add snooze * drv/usb * move drv/usb/usb.fs to drv/usb.fs * remove sub-unit usage in drv/usb/struct.fs * gr/color * add rgbwhite, rgbblue ... constants * add rgbdarker rgblighter colormaker * io/fbgrid * change fbgrid$ semantics * io/grid * de-structify the grid. newgrid becomes grid$ * stop implicitly calling cursor! on gridemit * add defcursor! clear at-xy * remove gridstream pcell! pcell!+ highlight! grid grid# pos linefeed * add the concept of per-cell colors * io/prompt * add waitkey * io/screen * de-structify screen * change newscreen into screen$ * add >screencolor ## v14 - 2024/11/28 * core * add RISC-V support! * add AMD64 support! * Bring back deployments in Dusk itself * new units: asm/riscv hal/bit hal/shim * asm/i386 * rename to asm/x86 * add 64-bit mode support * add SIB support as r+) 2r+) 4r+) and 8r+) * split jmp, into jmp,/jmpr, * split call, into call,/callr, * asm/i386d * rename to asm/x86d * hal * remove C) NC) ifc, ifnc, * rename pushret, --> pushlr, popret, --> poplr, * add popret ## v15 - 2024/12/27 * core * add align * rename PSTOP --> PSORIGIN * rename RSTOP --> RSORIGIN * new units: drv/efi drv/efi/blkio drv/efi/devpath drv/efi/gop drv/efi/grid drv/efi/image drv/efi/kbd drv/efi/uga * deploy/efi: new deployment * gr/color * rename COLOR_RGB888 --> COLOR_RGB24 >rgb888 --> >rgb24 rgb888>rgb565 --> rgb24>rgb565 * add COLOR_RGB32 * io/drive * add alignment requirements for src/dst buffers * io/stream * add herestream spitclose * mem/alloc * rename alignn --> alignheren and move it to core ## v16 - 2025/01/20 * Remove Collapse OS which now lives in its own repository * core * items below can be summarized as introducing the concept of "rest of line" * replace PREVWS logic with peekback * add eol? * change r>str semantics * add sysdict * change consts semantics * add enum * remove nc, * add n< map< * new units: drv/efi/kbdex drv/efi/mouse drv/efi/timer * asm/6502: copy from Collapse OS * asm/arm * rename 8b) --> byte) to avoid shadowing HAL words * asm/x86 * renames to avoid shadowing HAL words: * i) --> imm) * m) --> abs) * 8b) --> byte) * 16b) --> word) * 32b) --> dword) * fs/core * change semantics of lookup lookup# openpath loadpath p" * add mapfs pathfs * hal/ops * rename to hal/instr * deploy/mac68k: new deployment (WIP) * deploy/pc * rename from deploy/pc-piix and merge with deploy/pc-bios * add a floppy.img target for booting from 1.44M floppy * drv/efi * add reboot * drv/pc/fdc: full rewrite, essentially a new unit * lib/str * change stringlist semantics * remove unused expectchar toword * io/grid * add poscnt * io/kbd * remove KBD_EVENT_ prefix to event constants * io/stream * change readline< semantics * lib/bm * add support for the k flag to the @!{} action * custom actions are now also applied during @{} and !{} * change }value semantics ## v17 - 2025/03/01 * m68k port complete! * core * unit words are no longer immediates * remove and? or? * rename =><= --> within? * rename e>w w>e --> e>xt xt>e * add formatdec formathex formathex2 formathex1 * move create from xcomp/boot to kernels * remove for for2 next * add do loop +loop -loop * new units: ar/tarp asm/m68k com/xmodem lib/struct (well, resuscitated) * ar/tar * remove the "record navigating" part of the API, keeping only the record parsing part. * deploy/mac68k: still a WIP, but has prompt and grid! * drv/pc/com * rename com>? --> ?com> and change semantics * fs/core * change child ?child newfile newdir ensurepath semantics * rename ?newfile ?newdir --> ensurefile ensuredir and change semantics * hal * remove ifXX and whileXX immediate macros * io/prompt * change semantics slightly to allow usage on the barest of systems * io/stream * add spitcloseboth spitn * lib/bm * remove offset{} create{} method{} * remove @ ++ >> '@ and ~ modifiers * lib/crc * add support for CRC16-XMODEM * lib/str * add lowcase strings< z[] c[] do[] * remove rfor * mem/endian * remove littleendian{} bigendian{} * add fieldle fieldwle fieldbe fieldwbe * sys/loop: rename to lib/loop * sys/replay: rename to io/replay * text/clip * add clipset * xcomp/tools * add orgifydictbe ## v18 - 2025/04/04 * core * new concept: tagged addresses * change EMIT mechanics for RTYPE ones * remove unused ztype * rename bi+ to dupbi * change "scry" semantics * move le@ wle@ be@ wbe@ le! wle! be! wbe! le, wle, be, wbe, from mem/endian * rename insz to INSZ * move setter semantics from lib/bm to core * move value from lib/bm to core * add FINDSTR sysvar * remove curword shortcut word. CURWORD is still there * new units: comp/sig comp/sym lib/tagl lib/type * asm/uxntal * add the "~ bin" directive. * comp/c * have types and signatures live in permanent memory * this means removing #include and adding needsh * replace sequenced expressions system with an AST using mem/cons * remove the "immediate" flag for C function signatures * have forward declarations be done with #forward instead of static * comp/c/lib * remove scanf fscanf sscanf * remove pspush() pspop() * comp/infix: remove unused unit * comp/oberon: new (WIP) unit * comp/tok * add peektok< * drv/pc/ioport * remove ioport{} p@{} p!{} * add ioport ioportw ioportb * emul/uxn * add [dev@] [dev2@] [dev!] [dev2!] [devk!] [dev2k!] * hal * add le@, be@, u@, * hal/muldiv * add [*n] [*n+] * remove []{} * hal/vreg * add ?saveR0, ?saveR1, ?restoreR0, ?restoreR1, * io/stream * remove console * lib/bm * remove custom actions mechanism * remove the "s" and "n" modifiers. use lib/struct's array instead. * remove value{} * move le@{} be@{} le!{} be!{} from mem/endian * de-document all "internal" words. lib/bm is not meant to be used as a "moustache library" anymore. * lib/diag * add squarespit * lib/str * add slistlen * lib/struct * Structures are now Types from lib/type * change method semantics * move fieldle fieldwle fieldbe fieldwbe from mem/endian * fieldle fieldwle fieldbe and fieldwbe are no longer moustache fields, but regular getters/setters ("to" semantics). * mem/cons * rename decons ?decons --> carcdr ?carcdr * add cdrcar ?cdrcar * mem/dict * add entrytag findtagged extractdict reserveentry * mem/endian: remove unit * mem/range * rename rtrimleft --> ltrim[] and change signature * rename rtrimright --> rtrim[] and change signature * oberon: Porting started! ## v19 - 2025/05/01 * new units: comp/w mem/mark mem/kv mem/pool mem/sort * deploy/pc * merge pc-alix into it. * comp/oberon: * Not a WIP anymore. It's still rough around the edges, but all the parts are there. * comp/tok * add err" ?err" * drv/pc/int13h: * split into two units, int13hl (LBA) and int13hc (CHS) * hal/opq * add (&? (src (dst src) dst) nb) .hal * hal/muldiv * add modorand, * io/stream * re-add console, but write-only * add gets * lib/arch * rename FAMILY_x86 --> FAMILY_i386 * add isx86? * lib/struct * add containsstruct? findfield * lib/tagl * add createtagd settag * lib/type * add typealign * lib/wordtbl * rename lookuptbl[ ]lookuptbl ?lexec --> kvtbl[ ]kvtbl ?kvexec and move them to mem/kv * oberon: Still a WIP... * text/pager * slightly change semantics * xcomp/i386/pc/pbr: new bootloader ## v20 - 2025/06/14 * core * remove unused :override * make ~ into a proper findselector * remove '~ which became spurious now that we can do "' ~" * add formatdecu CONSOLETYPE console! * new unit: asm/riscvd * bin/gbe * have the address column display relative offsets * hal * add testz, * tighten "32-bit arithmetic on 8b) and 16b)" logic * rename <>) --> dir) * rename Z) NZ) --> =) <>) * add invcond * remove compare, * replace brc, with ?br, * replace C>W, with bool, * add if, ?brz, ?brnz, * replace dropf, with dropz, * 8b) 16b) or 32b) applied after &) is now defined behavior * hal/opq * remove unused nb) * io/grid * have clear also reset position * lib/bm * move local variables to xcomp/boot * lib/match * remove unused =anyof" * lib/type * add type) * mem/ll * remove ll>data llnext * oberon * Almost looks like a working system, but still a WIP * text/ed * remove nextws * add prevword * text/ged * remove s keybinding * rebind H to C+h L to C+l and w to L * add H J K g W Z and C+q keybindings * add a gutter ## v21 - 2025/07/03 * core * slightly tweak string escaping rules * add align# e>xtsel ?scryentry scryentry# * new unit: io/part/mbr * comp/c: almost a complete rewrite * types and structs fully integrated with lib/type and lib/struct * can reference any word annotated through comp/sig * all functions and symbols are added to sysdict, directly accessible through regular Forth semantics * add backtick escape for referencing non-ident names * static is gone * comp/c/lib: remove unit * comp/sig * add varargs? varargs! fixedargs! * add annotate@ annotate< * comp/sym * replace tagglobalsymbol with addglobalsymbol * comp/w * add ?PSP+4 ?2>W * deploy/sunxi/pine64-lts: new Pine64 deployment * drv/timer * change initialization semantics * hal * make +) non-destructive for HAL bank slots * remove hbank+ * remove wordmark, * hal/opq * add signedcond swappedcond (dir? * rename hslot --> (slot * add slot) (bank bank) * lib/type * add untyped forwardtype ?addtype ## v22 - 2025/07/31 * core * add entryalias * new units: gr/font/bit gr/rdwr * gr/color * change color constants numbering scheme * remove COLOR_ prefix from color constants * remove unused colorwriter * add colordepthidx idx>bpp * gr/cursor: remove unused unit * gr/damage: complete rewrite * gr/font: significantly change semantics * gr/font/ufx: replace with gr/font/uf1 and gr/font/uf2 * gr/icn: remove unused unit * gr/pix: full rewrite, rename to gr/buf * hal: * add ale@, abe@, * hal/bwr: remove unused unit * io/fbgrid: rename to gr/grid and change semantics * io/screen: remove unused unit * lib/bit * add swapbits8 * lib/bm * add ){ * lib/struct * all fields now come with a "Prefixed Alias" * mem/dict * remove dictlink ## v23 - 2025/09/02 * core * add bind> * new units: drv/arm/mmu drv/mac68k/mouse drv/mac68k/screen drv/mac68k/timer gr/turye io/key io/ride io/roll io/wait text/ansi * asm/uxntal * add uxntallen findLabel findLabel# findunused * drv/pc/com * rewrite receiving logic to an interrupt-based one * remove >com com> ?com> * drv/rpi/uart * remove uart! uart@ uart@? * add uart0 stream * add ability to handle IRQs on receiving data * drv/rpi/vcore * add getclock getmaxclock setclock * drv/timer * add elapsedus elapsedms * gr/buf * replace Pixbuf.bpp with Pixbuf.depth * add depth>idx depth>bpp and all the XBPP constants * change newpixbuf and configurebuf signature to add depth * gr/color: pretty much a complete rewrite * gr/rdwr * change semantics of the compiler API * io/grid * change how it emits ASCII control characters * add insertlines deletelines * io/mouse * remove mouse@ mouseabs@ * make update into a method * mem/alloc * rename activate --> alloc[ * rename bindactivate --> bindalloc[ * add ]alloc sys[ * mem/here * make into a proper allocator mem/alloc * remove here$ lockhere unlockhere herefree# * mem/range * add split[] ## v24 - 2025/10/03 * core * remove unused align2# align4# * comp/oberon * add obcode :ob * add the backtick operator * automatically create Forth type entries for Oberon types * automatically create Forth words for Oberon procedures * remove obtype obalias * gr/font * add getfont getfont# registerfont findfont addfontloader glyphwidth glyphwidth, widths * rename Font.width --> Font.maxwidth * hal * add signed) working with ?br, if, bool, >>, /mod, * remove s<) s>) s<=) s>=) s>>, * hal/opq * remove signedcond * lib/struct * add fieldt fieldst fieldtref * struct now automatically resolves forward references * lib/type * change ?addtype semantics * oberon/arg: new module * oberon/system * add CompileModule ## v25 - 2025/11/09 * core * add n,@ * remove "curses" POSIX/Usermode flavors * new units: lib/double oberon/clipboar * comp/oberon * make IMPORT map to lowercase file names * comp/sym * add savesymstate restoresymstate * emul/cpu * remove CPU.unhalt CPU.hook * emul/virtio * significantly change how the whole thing runs * io/ride * stop riding when target stream spits ASCII EOT * lib/loop: rename to lib/idle * mem/pool * remove unused syspool * mem/range * add map[] wmap[] cmap[] * oberon/system * add RunForth RunForthLine * oberon/textfram * move global selection concept to oberon/texts * oberon/texts * add concept of "global selection" * add AsStream SelectionAsStream ReadBackwards ## v26 - 2025/12/10 * core * change r>[] semantics * remove wmove showprogress ?progress> * make cmove "smart" (cmove, stays dumb) * new units: bench/fdc drv/mac68k/xpram io/blk oberon/convertp oberon/draw oberon/dumpfont oberon/fontsubs oberon/growfont oberon/optimize xcomp/m68k/cpusel xcomp/m68k/mac/bootdbg * asm/label * add resetasm * asm/m68k * remove cpush, * add movec, * comp/w * add ?PSP+n * remove ?PSP+4 * drv/mac68k/qd * "downgrade" into a much lower level unit * drv/efi/grid * semantics changed due to io/grid rewrite. * drv/pc/vga * semantics changed due to io/grid rewrite. * drv/pc/fdc * add a whole bunch of words to open up the API to FDC's innards * fs/core * move the following fields/methods from File to Stream io/stream: pos size resize flush * move seek maxn truncate to io/stream * remove File structure. Files are Streams now * rename FS.open --> FS.openfile and slightly change its semantics. open becomes a regular word with the same semantics as before. * add FS.initfilestruct method * add ensurepathrel * fs/fat * add fatstorage! * fs/memfile * rename to mem/stream * have it extend Stream io/stream instead of File * hal/range: remove unused unit * io/drive: remove unit in favor of io/blk * io/drvstr: remove unit in favor of io/blk * io/grid: complete rewrite * io/secwin: rename to io/part * io/stream * downgrade the lifetime guarantees of readbuf's result * add ?grow fillstream seekrel rewind1 * io/memdrive: rename to mem/blk * lib/idle * add .. * lib/str * add 32SPCS * mem/malloc: move to mem/reuse and change semantics * mem/range * remove unused bounds[] * rename cintersect[] --> intersect[] * add glue[] * text/ansi * complete rewrite * add ability to encode ANSI escape codes (previously was decode-only) * text/clip * add clipensure * xcomp/deploy * replace copyall1440 with copylist * xcomp/i386/pc/deploy * add copyfloppy * xcomp/tools * remove kernel kernellen * add kernel[] xcompbegin xcompend xcomp[] ## v27 - 2025/12/28 * core * slightly change unit semantics * remove unitalias SYSTEMUNIT * add needs" * rename system unit to xcomp/boot * new units: app/gcon bench/mouse fs/sh fs/utag io/search lib/coop * bin/gbe: rename to app/bed * fs/core * move copyfile copydir listdir to new fs/sh unit * gr/turye: rename to app/turye * io/grid * add Grid.pixw Grid.pixh * add xyptr xypix xypixpos line[] ?showmarker * io/kbd * change loadkbdl semantics * io/key: merge contents into io/kbd * io/mouse * add xy evxy Ldown? Rdown? Mdown? Lup? Rup? Mup? drawmousecursor * io/replay: remove unused unit * lib/idle * change semantics of idle * lib/str * add []>pool * mem/range * add ?[] * oberon * rename oberonloop --> oberon * text/ed * add bounds * text/ged * rename to app/ed * add textsel[] zoom * text/gedx: rename to app/edx * text/help: remove unit, moved most logic to fs/utag * text/pager remove unused unit ## v28 - 2026/01/30 * core * add MAINLOOP doto oover compsel to' * add A> >A A! @Ac@ @A@ @Ac! @A! * replace getsetter, with getset, * remove unused align2 wfill widx w[]= * remove special treatment of the { character in word * new units: bench/fat drv/sunxi/timer drv/sunxi/usb drv/usb/blk drv/usb/ehci lib/ival * drv/pc/ioport * add PORTX IQUAL entries for lib/ival * drv/pci * change how initialization is done * add pcifilter pcifilter1 * drv/usb/uhci * support systems with more than one UHCI controller * hal * add -n, * io/kbd * slightly change the meaning of the Passthrough NKC flag * lib/bm: remove unit * lib/crc * change crc16 crc32 semantics * lib/diag * add dumpn * lib/psrs * change roll roll> semantics * add rollk rollk> * lib/str * add consume[] * lib/struct * remove absstruct, replaced by lib/ival * add offsetof * mem/ll * remove unused llappend llprepend * text/ed * add words[] wordunder ## v29 - 2026/03/07 * core * remove immdoes> * add 16* 16/ 256* 256/ * new units: asm/x87 bench/udp com/arp com/ether com/ip4 com/link com/net com/slip com/udp drv/nic/rtl8169 hal/common hal/float num/float num/xxhash * asm/x86 * change mode changing semantics * add 64bmode livemode * change abs) behavior under 64bmode * add ?d+bp) ?bp+, ?bp-, * drv/pci * add busdescendants .pciall pcifiltervendor pcifilterdevice * fs/core * add parent * move ensurepath ensurepathrel ensurefile ensuredir p" f" to fs/sh * fs/fat * change FSID encoding * fs/sh * introduce the concept of global source and destination * change semantics of copyfile copydir * add path filesonly dirsonly ncopy pf" pd" * hal/shim: remove unused unit * mem/kv * replace kv@, with kv', * add kv! kvreplace * lib/bit * add lrot rrot * lib/crc: rename to num/crc * lib/double: rename to num/double * lib/math: rename to num/math * lib/psrs * add nconcat nfirst nsame * lib/str * add rcidx ## v30 - 2026/04/04 * core * add "arch" top-level directory * change bind and bind> signature * new units: app/gmux app/prompt app/udc bench/coop bench/uxn (merging bunny and uxn* benches) io/typeln num/chacha * com/arp * add arprequest * com/link * change recvlink to curlink * fs/core * huge refactoring: FSIDs are gone, replaced by the concept of walking * fs/sh * complete rewrite following fs/core's refactoring. * hal/bit: remove, merging into lib/bit * hal/opq * add (signed? -&) -dir) -signed) * hal/vreg * add REGR0 REGR1 * io/grid * add alldirty * io/prompt: remove unit in favor of app/prompt * lib/arch: * rename to arch/core * add archlookup arch<< needsasm * lib/coop * replace the Event Context structures with ivalmaps * remove the Application structure * change event handle signature from ( event -- ) to ( -- ) * add the concept of "background application", along with .bg and bgdispatch * lib/idle: remove unit, having lib/coop take care of realiasing idle * lib/ival * add the XT qualifier * lib/str * add string []strmove upstr lowstr ## v31 - 2026/04/30 * core: * change signature of findselectors * move not and bool to kernels * asm/6502 * rename <> --> <0+> * new units: bench/gr (replacing tests/manual directory) com/dhcp lib/time * deploy/m68k-virt: new deployment * drv/pc/rtc: rewrite for lib/time * drv/pc/ps28042 * add Scan Code Set auto-detection through 8042scancodeset * drv/ps2 * replace newps2set1kbd newps2set2kbd with newps2kbd * emul/cpu * rename run1 --> step runN --> stepN * hal/opq * move (&? -&) (dir? -dir) (signed? -signed) to core HAL * lib/ival * change semantics of ivalue ivalmap absvalmap * add ivalmapfrom * lib/struct * Change structure declaration syntax * lib/type * adopt comp/c type names, that is, replace DWord Word Byte with uint ushort uchar and add int short char * change the way .type prints its types * remove the principles of type categories. Types are now flat structures. * move the signature type from comp/sig to this unit * add type< * mem/range * add rslide- ## v32 - 2026/06/07 * core: * add ZERO ONE * add lrot rrot * hal: * add lrot, rrot, !n, * posix: * implement lib/time's now * new unit: drv/nic/loop * app/ed * Improve usability with the introduction of the Normal/Insert/InsertLine/Replace modes * app/edx: merge into app/ed * asm/x86d * add 64-bit decoding mode * com/link * change readframe beginframe semantics * add frametype global value * add frame logging mechanism * com/net * add .frame * fs/core * add writefsnode walkmtime walkdepth * fs/sh * remove copyfiles copydirs * add copyfile. .walk walkdo walkdoboth * hal/instr * add multibyte operations * add d*, * io/roll * rename to mem/roll * add newroller reset writeahead advancewindow * io/stream * remove unused readline words * remove unused capture * add incposk * lib/coop * add context[ ]context * add background tasks control words * lib/psrs * add ndup * lib/time * add minutes hours days ago * text/ed * Transform Edbuf struct into an ivalmap, thus modifying the API of the whole unit. Now, all words implicitly target the active edbuf. * Rather than extending Stream like the former Edbuf did, we provide a separate edstream that wraps the active edbuf into stream semantics. ## v33 - 2026/07/02 * core * add to{ ?nip * code inside doto templates targeting struct fields must now preserve the A register * replace break and broke? with traditional unloop * remove unused needs" * hal * add (8b? (16b? * new units: asm/m68kd drv/sunxi/emac drv/sunxi/intr lib/func * deploy/sunxi/orangepi-pc: new Orange Pi deployment * drv/pc/ioport * remove ioport ioportw ioportb * drv/timer * add a default timer implementation * don't snooze on "waitus", only "waitms" * fs/fat * add .fat * fs/search * change search semantics * hal/opq * move (bank bank) (sz (i? to core HAL * move (src src) (dst dst) to core HAL, renaming them * io/stream * add stream$ * lib/ival: remove unit * lib/struct * add the "bound structs" concept * add the "base offset" concept * add method and smethod types * move addrof here from lib/ival * lib/time * change initialization semantics * lib/type * remove xt, replaced by method from lib/struct * mem/dict * add ?var>e var>e# * mem/roll * revert additions made in v32 (but kept the rename) ## v34 - 2026/08/05 * core * replace idle with flush. * add zfill * hal * remove wmove, wfill, widx, w[]=, * rename move, to move[], fill, to fill[], idx, to idx[], * new units: bench/tcp io/log mem/logroll mem/timetbl num/poly1305 * asm/riscv * change how forward branches are made * add 2p) 3p) * com/net * replace NetIncoming with net$ * gr/varvara * replace setvpalette with vpalette and updatevpalette * io/kbd * change newstreamkbd semantics * lib/str * move nspcs from text/ts * add rtypeleft rtyperight capture * mem/blk * add bufmemblk * mem/dict * add enumrev * mem/sort * add bisect bisectpairs bisectleft bisectpairsleft sortpairs * remove sort@ * num/chacha: complete rewrite * text/ansi * replace ansirtype with ansitgt * text/ts: remove unit ## v35 - 2026/08/28 * core * add \b \t \v \f to string escapes * posix: new "H:" host FS mapping * new unit: text/diff * comp/c * widen the range of valid declarations, namely the "int (*x)[42]" form * the ""0 null-terminated string literal now yields a char* instead of uchar* * allow "->" and "." expressions in sizeof() * the "= {0}" pattern to initialize a variable to zero now works * allow anonymous nested structs and unions * lib/type * add reftype! * mem/dict * add deleteall * mem/timetbl * change semantics of sorttbl .sortedtimetbl .timetbl * num/crc * expose new byte-by-byte API ## v36 - 2026/09/24 * core * replace PREVRESERVE with PREVHERE * hal * add ps-, rs-, * limit conditional branching to 21-bit offsets * new units: comp/reg comp/mem drv/acpi emul/aml * removed unit: comp/w * comp/c * big refactoring, expression codegen is now based on comp/reg * implement integer promotion rules minus the signed/unsigned part * hal/muldiv * add (one? ?shiftable ?modmask * hal/opq * add ?be+) * lib/coop * add launchbgtask * mem/arena * add newlockedarena withinarena? * mem/alloc * add bindrun1r * mem/cons * change append leak * add tail ensureleakspace * mem/mark * add ?mark * num/math * add pow2? ## v37 - Brewing...