Skip to content

Latest commit

 

History

History
1927 lines (1752 loc) · 74.1 KB

VERSIONS.adoc

File metadata and controls

1927 lines (1752 loc) · 74.1 KB

Solo Forth version history

Version 0.14.0

To be released.

New

  • Add scr-fill-bench.

  • Add word-separator to make (.word configurable.

Fixes

  • Fix details of the documentation.

  • Fix requirement of the block editors.

  • Fix needing of r# and top.

Improvements

  • Improve the documentation.

  • Improve TR-DOS .step-rates.

Other changes

  • Deactivate assembler instructions stpx, and ftpx,, which need to be fixed.

  • Remove transfer-bytes from +3DOS.

  • Move TR-DOS .drives, .step-rates and .fda to the library.

  • Remove from the glossary the unfinished use-fly-index.

Background image

Title

Alonso Quijano prueba la celada (Alonso Quixano tries the helmet).

Illustrator

Pahissa Laporta, Jaime (1846-1928).

Engraver

Unknown.

Book

El ingenioso hidalgo don Quijote de La Mancha (The Ingenious Gentleman Don Quixote of La Mancha) (1605), by Miguel de Cervantes (1547-1616).

Edition

1897, Barcelona, El ingenioso hidalgo don Quijote de la Mancha (Centro Editorial Artístico de Miguel Seguí). Volume 1, chapter 1, page 21.

The ZX Spectrum image was created from image 5796 of the QBI image bank.

Version 0.14.0-rc.124

Released on 2020-11-23.

This is a release canditate of 0.14.0. It includes a manual with a full glossary, in EPUB, PDF and HTML.

New

  • Add frames converters: frames/second, frames>seconds, frames>cs, frames>ms.

  • Add gigatype-style to improve gigatype. Move the gigatype style from the stack to gigatype-style. This makes the usage simpler and compatible with the ordinary type. Update and improve documentation.

  • Add "The ultimate Forth Benchmark". Adapted from https://theultimatebenchmark.org/.

  • Add farfill, farerase.

  • Add far-memory variants of localized-string.

  • Add translation tools.

  • Add mim-rng-px-bench.

  • Add min>top, max>top, pair=.

  • Add toy the-matrix.

  • Add TR-DOS get-drive.

  • Add ?set-drive.

  • Add TR-DOS 3-block-drives and 4-block-drives. The TR-DOS version of the library has to be split in two disks, because the disk size is only 640 KiB (636 KiB usable for blocks). These words will be helpful for using it.

  • Add str<>.

  • Add +3DOS eof?, get-user and set-user.

  • Add clocal, 2local.

  • Add +3DOS flush-drive.

  • Add +3DOS drive-unused.

  • Add G+DOS tracks/disk, tracks/cat.

  • Add +3DOS write-line and read-line.

  • Add 0leave.

  • Add +3DOS write-byte and read-byte.

  • Add 'lf'.

  • Add emit-ascii.

  • Add eol?, newline.

  • Add +3DOS file-size.

  • Add os-prog, os-unused, ?os-unused, os-ramtop, os-stkend.

  • Add chan>, chan>id, stream>, stream?.

  • Add os-streams, .os-strms and .os-chans.

  • Add dfca and current-channel.

  • Add G+DOS ((cat.

  • Add array< and 2array<.

  • Add routines to save/restore the Forth IP in +3DOS. They will be needed to implement write-file and friends.

  • Add +3DOS bank-write-file and write-file.

  • Factor +3DOS default-1346 from cold.

  • Factor default-display from cold.

  • Add no-exit.

  • Factor d>str from d.r.

  • New words common to all display modes: form>xy, >form, form.

  • Add .2x1-udg.

  • Add csprite.

  • Add display>tape-file and tape-file>display.

  • Add the 64-cpl fonts of the 64#4 driver.

  • Add 8+ and 8- They will be useful for writing new variants of UDG sprites.

  • Add emit-udga.

  • Add #do.

  • Add +3DOS acat and wacat.

  • Add +3DOS full-cat flag.

  • Add home?.

  • Add /first-name.

  • Add i', j'', `k'.

  • Add -keys, new-key, new-key-.

  • Add 2-cell variants of ticks (old frames).

  • Add elapsed, delapsed, timer and dtimer.

  • Add expired and dexpired.

  • Add n>str.

  • Add ?depth.

  • Add cs-dup, cs-mark, cs-test.

  • Add 0repeat.

  • Add coff and c?.

  • Add ms>ticks.

  • Add >name/order.

  • Add >oldest-name/order.

  • Add >oldest-name and >oldest-name/fast.

  • Add empty-stack, a useful factor of (abort).

  • Add c@1+ and c@1-.

  • Add attr-wcls, wcolor.

  • Add x>gx and y>gy.

  • Add c@2+ and c@2-.

  • Add andif and orif.

  • Add ?c1-!.

  • Add 3*.

  • Add manual-see control to see.

  • Add ,udg-block, ,udg-block-test.

  • Add con.

  • Add assembler debug tools << and >>.

  • Add astack.

  • Add inversely.

  • Add key-graphics, key-true-video, key-inverse-video, key-caps-lock.

  • Add unpick.

  • Add 4dup.

  • Add 2-block-drives.

  • Add new tests.

  • Add +3DOS read-file and bank-read-file.

  • Add G+DOS -uifa and draft create-file.

  • Add G+DOS bin, r/o, w/o, r/w.

  • Add a G+DOS UFIA data structure. First step to implement file identifiers.

  • Add G+DOS create-file.

  • Add assembler ldar, and ldra,.

  • Add G+DOS sectors-used, sectors-used@, drive-used, drive-unused, sectors/disk, sectors/cat, sectors>capacity and max-disk-capacity.

  • Add /wordlist, wordlist>last.

  • Add dump-wordlists, dump-wordlists>, dump-wordlist.

  • Add anew.

Fixes

  • Make control-flow-stack words compile-only.

  • Fix needing of d0= and d=.

  • Fix needing of farcavariable.

  • Fix needing of needing.

  • Rewrite/fix +3DOS set-drive & transfer-sector. An important fix. Now +3DOS can use both drive units as block drives. Therefore 2-block-drives can be used.

  • Fix needing of G+DOS dfca.

  • Fix needing of c?; add 2?.

  • Fix eol?.

  • Fix +3DOS reposition-file.

  • Fix +3DOS file-position.

  • Fix d2/.

  • Fix needing of set-pixel.

  • Fix and finish +3DOS wcat.

  • Fix +3DOS .cat-entry.

  • Fix needing of thens.

  • Fix do-dos-open_.

  • Add default-mode & reset-default-mode to cold. This fixes an evident but subtle bug.

  • Fix needing of cs-roll and cs-pick.

  • Fix and improve needing of to.

  • Fix requirements of cs-test.

  • Fix needing of defer@.

  • Fix TR-DOS read-system-track.

  • Fix d2/.

  • Fix c@1+ and c@1-.

  • Fix requirement of >oldest-name.

  • Fix ?c1-!.

  • Fix/improve "kk" and other keyboard tools.

  • Fix port of key row Caps Shift-V.

  • Fix key-delete.

  • Fix unfit?.

  • Fix } in Hayes tester.

  • Fix marker.

  • Fix blk-line.

  • Fix requirement of 2value.

  • Fix requirement of [char].

  • Fix d2/.

  • Fix m*/.

  • Fix m+.

  • Fix requirement of index.

  • Fix catch and throw: make them save and restore the source specification.

  • Fix marker.

  • Make nest-source save the contents of input-buffer instead of the output of source. The old behaviour didn’t seem to cause any problem, but anyway it wasn’t right.

  • Fix far-localized, and make it accessible.

  • Fix the error marker position in where.

  • Fix one sm/rem test.

Improvements

  • Improve documentation. Almost all kernel definitions, and their library variants, are documented. Now all Forth words mentioned in the manual outside the glossary are linked to their corresponding glossary entries.

  • Make the manuals more DOS-specific.

  • Homogenize description of ior notation.

  • Rewrite d0= in Z80. Much faster, and only two more bytes needed.

  • Improve bench. to display seconds with hundrendths precision.

  • Rename and document the ROM calculator commands. Now all calculator commands and friends have a "|" prefix. This makes the code clearer, makes search order changes unnecessary and makes a single glossary possible

  • Improve quit. Now the return is stack is emptied only once instead of in the loop, following the standard. terminal>source was unnecessary, because it’s included in query.

  • Improve needing of G+DOS directory descriptions.

  • Improve the {if control structure.

  • Simplify where.

  • Improve the width of table columns in the manual.

  • Improve s, and fars,.

  • Simplify retry.

  • Improve extend and turnkey. Still under development, though.

  • Improve in-block-header?.

  • Make G+DOS get-drive return an I/O result. It’s a fake value, but it makes the word compatible with +3DOS and TR-DOS.

  • Rewrite ? in Z80 and combine it with .. This is faster and saves 4 bytes.

  • Make eol? check newline. This is more versatile.

  • Improve open-ot-file with ?fam, /w/o, /r/o.

  • Make G+DOS set-ot-file choose an unused stream.

  • Improve .os-chans.

  • Improve the 128K sound editor.

  • Make [needed] optional. It’s almost useless. No need to load it with the need tool.

  • Improve G+DOS get-drive.

  • Rewrite G+DOS back-from-dos-error_ with Z80 opcodes.

  • Improve TR-DOS cat.

  • Improve needing of y/n? module.

  • Improve next; remove push_hlde from the kernel. The next code (the inner interpreter) has been moved after exit and copied after do_colon. This reduces nesting time to 0.92. Jumps to push_hlde, which was a secondary entry of next, have been removed. Some benchmarks that use double-cell operations reduce its time to 0.99. These changes increase the size of the kernel by only 12 bytes.

  • Rewrite 0.r and 0d.r in Z80. Faster and smaller. 10 bytes are saved in total.

  • Rewrite cexchange and c!exchange in Z80.

  • Improve version and .version. One byte was too small for the prerelease counter. The improvements in .version save 12 bytes.

  • Update the Vim syntax highlighting.

  • Improve the text window implementation.

  • Improve transition between 32/64 CPL display modes. Now the cursor position is preserved across mode-32, mode-32-iso and mode-64o. Beside, mode-32-font and mode-32iso-font preserve the fonts of their corresponding modes.

  • Improve mode-32iso; add mode-32iso-output_.

  • Improve ocr-chars and ocr-first.

  • Improve and extend the window module. It’s still in an early stage of development, with limited features, but it can be used for basic things and finally it’s documented.

  • Update lastblk in (load) instead of load. This is more useful, since (load) is used by load, continued and load-program.

  • Improve ltype.

  • Make dticks>ms and set-time faster.

  • Rewrite +3DOS headed in Z80.

  • Use mode-64-font for both 64-cpl modes.

  • Adapt to the library all 64-cpl fonts from disk 0.

  • Init far-memory config in cold.

  • Make cold a code word with a high-level part. This change saves 47 bytes of data/code space, and makes the word more versatile for future improvements.

  • Improve doer-make.

  • Move / to the library. / is not used in the kernel. This change saves 9 bytes of code/data space and 7 bytes of name space.

  • Improve [if] and [else].

  • Move [defined] and [undefined] to the library. Also, simplify reducing their usage in the library.

  • Make push, and pop, accept register a. This change makes the syntax of pop, and push, regular with all registers.

  • Improve (;code) with latestxt.

  • Remove .system-time and .system-date. Not very useful. Beside, the names were almost longer than their definitions, which anyway are evident.

  • Rewrite ?repeat. Now its name is coherent with the rest of optional control-flow structures, included the new 0repeat.

  • Rewrite >name and move it to the library.

  • Make ;code standard. Now the data field address of the redefined word is not placed on the stack but moved to register HL.

  • Improve does>.

  • Improve default-stringer.

  • Make .sinclair-stripes and friends independent.

  • Improve see to support non-colon words. But only directly, not recursively in colon words yet.

  • Improve udg-block

  • Rewrite run-time code of values in Z80.

  • Improve error checking in (locate).

  • Improve g-emit-udg with last-font-char.

  • Restore default value of #block-drives in cold.

  • Improve xstack.

  • Make hook, and prt, optional.

  • Improve defined?.

  • Make lwidth a byte variable

  • Update stack notation "x y" to "col row" & "gx gy".

  • Make string checks of [if] [else] case-insensitive.

  • Make it possible to load both block editors and switch between them.

  • Move b/sector to the library.

  • Move name>str, name>strings and .name to the library.

  • Move depth to the library.

  • Move +loop to the library.

  • Move .unused and .words to the library.

  • Move 2variable to the library.

  • Replace r> drop with rdrop, except in benchmarks that would be affected.

  • Make ` chars>string, >bstring and 2>bstring to use the stringer instead of pad.

  • Make +3DOS cat-buffer (used by cat and acat) use the stringer instead of pad.

  • Add a new ?stringer to throw an error if a string is longer than the total capacity of the stringer. The old stringer was renamed to fit-stringer.

  • Make order,, @order, wordlists, and @wordlists independent from marker.

  • Move 0exit to the kernel; no data/code space needed, because of the space saved by using this word instead of 0= ?exit and if.

  • Make paren comments multiline in the Vim syntax file.

  • Make do_create and do_variable Z80 entries 8 T States faster, by moving them from the noop word to the next entry.

  • The sources searcher searches also the document sources. It’s renamed to <tools/seek>.

Other changes

  • Remove get-default-bank and set-default-bank.

  • Move bank-start and /bank to the library.

  • Rename display to terminal. Following the standard, "display" is used in the documentation as a generic term, valid for both the terminal and the printer.

  • Rename print to ltype. This word is a variant of type, like gigatype and others. Beside, "print" is used for words related to the printer.

  • Rename load-app to load-program.

  • Defer and factor ~~info; remove ~~app-info.

  • Move blocks speed test to benchmarks module.

  • Split TR-DOS library into two disks. This increases the maximum size of the library from 636 KiB (one TR-DOS disk, too small to fit the current library) to 719 KiB (one +3DOS disk).

  • Remove trailing closing paren from word names. This new convention is simpler. Beside it saves some bytes in name space and blocks.

  • Make (located) deferred; factor in-blk-header?. Multiline block headers are activated by default, but the method fails when the block has no paren comment as header.

  • Make ?locate consume its argument.

  • Remove +3DOS old set-drive & transfer-sector.

  • Make newline> a counted string; remove /newline.

  • Make /tabulate a byte variable.

  • Move fardump and farwdump to <tool.dump.fs>.

  • Rename printable-ascii-char to graphic-ascii-char. "graphic" is the standard notation for non-control characters. Old words affected: printable-ascii-char? default-printable-ascii-char?, >printable-ascii-char.

  • Rename >kk kk>kk.

  • Rename keys #kk.

  • Rename graphic "blocks" to "rectangles". "Rectangle" is a less confusing name, but it may be changed to "box", depending on the final word set, including words to draw line boxes in high resolution. Anyway, these words will be used as low-level procedures of the text windows.

  • Replace mode-64 with mode-64o. The code is identical (originally written by Andrew Owen), but now its source is integrated into the library. The name has changed because an improved variant mode-64s (adapted from code written by Einar Saukas) is under development.

  • Factor load-program into (load-program.

  • Replace "frames" names with "ticks". The OS variable used is called FRAMES, but ticks is the common name in Forth. All related words have been renamed.

  • Rename pause to basic-pause. pause is a common usage name in the Forth multitasker, which will be implemented.

  • Move cs-swap to the kernel.

  • Don’t make a +3DOS 180 KiB boot disk. Supporting only one disk format makes some things simpler on +3DOS.

  • Replace random-range with random-between and random-within.

  • Rename d/expired to d/past?.

  • Replace >name with >oldest-name in see.

  • Add suffix "-sound" to sound effects. Most names were too generic. The new names are clearer and prevent name clashes.

  • Remove jppushhl,. This word is useless, since it compiles push hl and jp (ix). But the pushhl constant is useful to make conditional exits in code words.

  • Rename ocr-charset to ocr-font.

  • Rename 1literal to xliteral, ]1l to ]xl, [1const] to [xconst]. The new names seem clearer, because an unknown cell is represented as "x" in the stack notation.

  • Make "[(un)needed]" nonimmediate "(un)needing".

  • Move blk-line to the library.

  • Move >in/l and →in/l to the kernel. →in/l is a factor of \.

  • Rename disk 2 to "programs".

  • Rename astack to estack, and so the related words.

  • Remove ?name-too-short. It was used only once, and it was too specific to be useful.

  • Remove the 5-second pause after displaying the background the first time.

  • Deactivate the documentation about G+DOS file-dir# and file-dirdesc, which don’t work fine yet because of a limitation in (file-status.

  • Remove c>bstring (improved to use the stringer, it did the same than the current char>string).

  • Rename ?stringer to fit-stringer.

  • Move ? to the library.

  • Rename latest-wordlist to last-wordlist.

  • Delete <memory.bank.fs> and move its contents to <memory.far.fs>.

  • Rename warn.throw to error-code-warn, warn-throw to error-warn and warn.message to message-warn.

Background image

Title

Alonso Quijano prueba la celada (Alonso Quixano tries the helmet).

Illustrator

Pahissa Laporta, Jaime (1846-1928).

Engraver

Unknown.

Book

El ingenioso hidalgo don Quijote de La Mancha (The Ingenious Gentleman Don Quixote of La Mancha) (1605), by Miguel de Cervantes (1547-1616).

Edition

1897, Barcelona, El ingenioso hidalgo don Quijote de la Mancha (Centro Editorial Artístico de Miguel Seguí). Volume 1, chapter 1, page 21.

The ZX Spectrum image was created from image 5796 of the QBI image bank.

Version 0.14.0-pre.209

Released on 2017-04-27.

Prerelease of 0.14.0 for the 18th annual European Vintage Computer Festival (April 29th and May 1st 2017, Munich).

This release is the first one that includes a manual and a glossary, in HTML. The documentation of the sources, from which the glossary is built, has been increased and improved a lot.

New

  • Add set-block-drives and related words.

  • Add get-block-drives.

  • Add G+DOS ufia1 and ufia2.

  • Add G+DOS file-status.

  • Add G+DOS and TR-DOS file-exists? (remove file?).

  • Add G+DOS file metadata words.

  • Add TR-DOS file metadata words.

  • Add G+DOS and TR-DOS find-file.

  • Add -do.

  • Support the memory paging of Scorpion ZS 256.

  • Build kernels and boot disks for Scorpion SZ 256, Pentagon 512 and Pentagon 1024.

  • Add banks.

  • Add type-udg.

  • Add ]1l and [1const].

  • Add ram.

  • Add ldd, and ldi, to the assembler.

  • Add outlet-autochars.

  • Add set-mixer and get-mixer.

  • Add words to support the ZX7 decompressor.

  • Add +3DOS rename-file.

  • Add +3DOS get-drive.

  • Finish +3DOS transfer-sector, transfer-block.

  • Add G+DOS >ufia1, >ufia2, >ufiax.

  • Add G+DOS rename-file, back-from-dos-error_.

  • Add TR-DOS >file and file>.

  • Add TR-DOS delete-file.

  • Add +3DOS delete-file.

  • Add TR-DOS dos-hl_ entry.

  • Add TR-DOS cat, undelete-file and related words.

  • Add TR-DOS rename-file, get-filename.

  • Add TR-DOS filename>filetype.

  • Add /bank.

  • Add x>gx, y>gy, gx>x, gy>y.

  • Remove begin-module.

  • Add seclusion and isolate.

  • Remove the save-display tool.

  • Add xy>r, r>xy.

  • Add udg-block, /udg, parse-name-thru, udg-group.

  • Remove udg-row[, udg[.

  • Add assembly sll, and sllx,.

  • Add last-tape-header and its fields.

  • Add l!, fix assembler’s aagain.

  • Add gigatype.

  • Add orthodraw and ortholine.

  • Add xy>gxy and xy>gxy176.

  • Add menu.

  • Add deferred sqrt to support its two variants.

  • Add cval and ctoval.

  • Add cvalue.

  • Add gigatype-title.

  • Add default-stringer, needed by cold.

  • Add mode32iso-emit.

  • Add mode-32iso.

Fixes

  • Fix loading of endm.

  • Fix TR-DOS cat (then rename it acat), -filename and file-status.

  • Fix relse and aelse.

  • Fix graphic block character 128.

  • Fix crnd.

  • Fix +3DOS set-drive.

  • Configure the memory banks for +3DOS.

  • Fix G+DOS cat and acat.

  • Clear previous error at dos.c TR-DOS entry.

  • Fix prerequisites to build the BASIC loaders.

  • Fix needing of /name and first-name.

  • Fix ?rel.

  • Fix ascii-char? and printable-ascii-char?.

  • Fix execute-hl.

  • Fix init of last-font-char.

  • Fix needing of [char].

Improvements

  • Rewrite read-mode and write-mode in Z80.

  • Improve: Use cconstant for G+DOS constants.

  • Simplify the loading of macro.

  • Fix and complete a G+DOS paging test.

  • Improve needing of G+DOS hook codes.

  • Make G+DOS set-drive return an error result.

  • Make G+DOS transfer-sector use the current drive.

  • Improve documentation of the G+DOS module.

  • Make needing of tape read/write words independent.

  • Improve all Plus D memory fetch/store words.

  • Improve G+DOS file>.

  • Make cold set the first drive as current.

  • Improve the conversion of TR-DOS error results.

  • Use cconstant in the assembler.

  • Improve get-order.

  • Make words that init the need tool optional.

  • Make unresolved optional and ?rel independent.

  • Improve the scripts to search the source files.

  • Improve/Fix paging on 128-KiB models.

  • Simplify the usage of DOS-selection kernel symbols.

  • Improve .unused.

  • Improve emit-udg.

  • Improve @p and !p.

  • Add a Vim filetype plugin.

  • Improve 128k sound words.

  • Start faster version of pixel-attr-addr.

  • Simplify TR-DOS sector-id.

  • Improve +3DOS calls.

  • Improve the set-block-drives tool.

  • Add Makefile rule to build only 128k TR-DOS disks.

  • Improve/fix list with a check.

  • Rename/change tape words after disk equivalents.

  • Improve G+DOS cat.

  • Improve +3DOS close-file.

  • Set the lowest origin for TR-DOS cat.

  • Improve the way TR-DOS calls return an error code.

  • Make assembler absolute control structures optional.

  • Halve the stringer and rename its main words.

  • Rewrite G+DOS rename-file in Z80 opcodes.

  • Improve the ~~ debug tool.

  • Support (abort") in see.

  • Improve case; remove all its alternative codings.

  • Improve local, arguments and anon.

  • Rewrite the implemetation of assembler labels.

  • Make cold set the default action of init-asm.

  • Improve environment?.

  • Make /hold a constant.

  • Improve to and remove the non-standard version.

  • Rewrite call-xt with Z80 opcodes.

  • Improve/fix needing of some memory and time words.

  • Convert mode32-max-char to last-font-char.

  • Improve mode32-emit.

  • Rename display modes words and modules consistently.

Other changes

  • Rename the DOS common module.

  • Reorganize and rename the disk images.

  • Change G+DOS notation "<file" to "file>".

  • Remove file-as-is>.

  • Replace the data: set with data and end-data.

  • Move do to the library.

  • Move ?( and str= to the kernel.

  • Rename all "csb" words to "stringer".

  • Change "hp" notation to "np".

  • Make G+DOS per-sector border color be the default attribute.

  • Change filename extension of library files to "fs".

  • Move get-font and rom-font to the fonts module.

  • Change naming convention of Z80-routines constants.

  • Don’t change the border during G+DOS disk access.

  • Rename G+DOS "plusd-in/out" words to "dos-in/out".

  • Move +3DOS close-file to the library.

  • Move +3DOS file-position and reposition-file to the library.

  • Rename factors of file-dir# and file-status.

  • Add mode debugging code to (located).

  • Rename <bin/sys/> to <bin/dos/>.

  • Change "rec" to "sector(s)"; "blk" to "block(s)".

  • Rename and factor sector-id.

  • Factor create c, to (c in the assembler.

  • Rename the graphic address conversion words.

  • Rename >defer to >action.

  • Rename screen filter words and module.

  • Rename and reorganize printing/display modules.

  • Move mode-32iso-emit to the library.

  • Prepare the two implementations of allocate.

  • Review and update the sample games.

  • Reorganize/improve/update benchmarks.

Background image

Title

Alonso Quijano prueba la celada (Alonso Quixano tries the helmet).

Illustrator

Pahissa Laporta, Jaime (1846-1928).

Engraver

Unknown.

Book

El ingenioso hidalgo don Quijote de La Mancha (The Ingenious Gentleman Don Quixote of La Mancha) (1605), by Miguel de Cervantes (1547-1616).

Edition

1897, Barcelona, El ingenioso hidalgo don Quijote de la Mancha (Centro Editorial Artístico de Miguel Seguí). Volume 1, chapter 1, page 21.

The ZX Spectrum image was created from image 5796 of the QBI image bank.

Version 0.13.0

Released on 2017-02-07.

Another version that includes more new features, bug fixes, improvements and changes than planned, having being heavily tested during the development of two game projects.

Some things are worth to be commented apart:

  • Only one assembler. The transition from the old assembler to the new one has been completed.

  • Full rewrite of the color management: the temporary attribute of the OS is manipulated directly. This method is much faster and more compact. Alternative words are provided to use the BASIC-like method (i.e., control characters).

  • Deep modification of the UDG management to use only the character range 0..255. Now the first UDG character is always character 0, in any context (so far, it could be 0 or 128, depending on the word used). Now the UDG code range of emit is coherent, and its default behaviour can be configured (by choosing the first character it will consider a UDG, instead of printing it through the ROM routine) Eventually this will be improved further in order to support 8-bit character sets.

  • Improved support to store data in far memory.

  • Finally, circle is included, and a very fast one.

  • Improved support to use bleep, and also to convert parameters of BASIC’s BEEP.

  • New standard tools to manipulate strings: replaces, substitute and unescape.

  • On TR-DOS, the library can be used on any disk. This makes the system actually usable on this DOS, and makes it possible to improve its support.

New

  • Add link>wid.

  • Add >true, 2>true, >false, 2>false.

  • Add (cursor-addr) and cursor-addr.

  • Add alternative cursor-addr and (cursor-addr).

  • Add basic words to store and compile strings in far memory: far,, fars,, farsconstant, farsconstants,, far,", /farsconstants and farsconstants-does>.

  • Add variants of the far-memory string arrays that return the strings in the circular string buffer: save-farstring, far>sconstants, /far>sconstants.

  • Add dot-quote-bench, to compare printing one single char with emit or .".

  • Add -1..1.

  • Add view.

  • Add ?seconds.

  • Add faravariable, far2avariable, farcavariable.

  • Add name>str, a factor of name>string.

  • Add name>name, an alternative >name and >name-bench. The current Z80 version of >name is not needed in the kernel. An alternative version in Forth is being tested.

  • Add #words.

  • Add /counted-string constant.

  • Add replaces.

  • Add substitute and unescape.

  • Add xt-replaces.

  • Add 1/string. A faster alternative for the low-level idiom 1 /string. Beside, it saves six bytes in the kernel.

  • Add g+dos, tr-dos and +3dos.

  • Add beep, dhz>bleep, middle-octave, /octave, octave-changer, beep>dhz, beep, and a new beep>bleep. The support of Sinclar BASIC’s BEEP is complete. The conversion of parameters from beep to bleep is fully factored and reusable.

  • Add ?shift.

  • Add u.s.

  • Add inverse-on and inverse-off.

  • Add overprint-on and overprint-off.

  • Add .words.

  • Add mask+attr! and mask+attr@.

  • Add circle.

  • Add noop-routine. A useful counterpart of noop, needed by the new implementation of a configurable circle.

  • Add blackout.

  • Add attr-cls. A useful factor of cls

  • Add ]cl and ]1l.

  • Add contrast.

  • Add attr>ink.

  • Add default-bank-routine and e-bank-routine.

  • Add lower-routine.

  • Add constants for attribute masks: bright-mask, unbright-mask, flash-mask, unflash-mask, ink-mask, unink-mask, paper-mask, unpaper-mask.

  • Add words to manipulate the graphic coordinates: g-xy, g-x, g-y, g-at-xy, g-at-x, g-at-y, g-home.

  • Add far>sconstant and farsconstants>.

  • Add os-sp.

  • Add g-type, g-emit, g-cr, etc. (They were almost finished but not tested).

  • Add mode32-max-char.

  • Add TR-DOS set-drive and related code. Finally, the library can be used on any TR-DOS disk drive.

Fixes

  • Fix storage of unresolved assembler references.

  • Fix runtil, auntil and ragain.

  • Fix sound effects laser-gun, ambulance and white-noise.

  • Fix scroll-1px-up.

  • Fix wordlists.

  • Fix erasing of esc-context.

  • Fix loading of see.

  • Fix find-name-from. A very subtle bug, first detected on 2016-12-06: When hp crossed the 16-KiB boundary, sometimes a previous word was not found. Finally, the error condition has been found out: a previous word of the same length than the latest one is not found after crossing the 16-KiB boundary…​ The reason was the difference between the actual nt and its converted version in paged memory, which was used for restoring.

  • Fix fartype.

  • Make s\" and .\" use standard escapes by default.

  • Add default-font for cold. cold didn’t set the default font. That was a subtle bug. In order to reuse code, set-font has been moved from the library to the kernel, but it has been rewritten is Z80 to save some bytes.

  • Fix and improve ocr.

  • Fix last-column and last-row.

  • Fix needing of ??.

  • Fix needing of 16hex..

  • Fix error>ordinal, which was not updated.

  • Fix and update fyi.

  • Fix fzx-emit.

  • Rename beep>bleep to hz>bleep. The word does not convert the parameters of BASIC’s beep, but hertzs.

  • Fix requirement of printable-ascii-char?.

  • Fix and improve where and list-lines.

  • Fix requirements of xdrop.

  • Fix parse-esc-string.

  • Fix (pixel-scroll-up.

  • Fix needing of G+DOS set-drive.

  • Fix loading of the Pong game.

Improvements

  • Write attr, attr-addr, and (attr-addr) in Z80 opcodes. No need to use the assembler for these small words.

  • Remove the old assembler (z80-asm). Update the new one (z80-asm,), move the assembler vocabulary to the library, in order to use need assembler to load the new assembler when needed. Convert all words to the new assembler.

  • Rewrite ndrop and 2ndrop with Z80 opcodes.

  • Improve words to page in and page out the Plus D: plusd-in, plusd-out, plusd-in,, plusd-out,.

  • Improve default-bank.

  • Improve loading of see-xt and see-body-from.

  • Improve find-name-from: 3 bytes less, 5% faster.

  • Improve create (2 bytes less).

  • Improve the word-lists interface. More coherent and less cryptic names and functions: Remove link>wid; remove wid>name; rename (wid>name to wordlist>name; rename wid>link to wordlist>link; rename .wid to .wordlist; rename wid>vocabulary to wordlist>vocabulary. add wordlist-name@ and wordlist-name!; rename wid-of to wordlist-of; rename named-wid to latest>wordlist

  • Improve papery, brighty, flashy.

  • Improve permcolor.

  • Rename pause to ?frames, and do-pause to frames. The name "pause" was taken from BASIC but the new names are clearer, and consistent with ms and seconds. Add a new pause after Sinclair BASIC. Just a convenience to adapt BASIC programs.

  • Improve see: type strings between quotes. This is clearer when they have leading or trailing spaces.

  • Improve needing of columns and rows.

  • Improve 2avariable.

  • Improve ?repeat.

  • Improve needing of words to print numbers in radix.

  • Improve needing of control flow stack words.

  • Change the behaviour of window and set-window. Now they are more versatile.

  • Document how data in headers space affect >name.

  • Replace xdepth. with .depth;rename .x to .xs.

  • Rewrite color! and color-mask! in Z80.

  • Rewrite set-udg,get-udg and get-font in Z80.

  • Improve needing of 128K sound words.

  • Restore default behaviour of .s. .s was provisionaly modified some time ago to print unsigned numbers. Now u.s does the job. Both words are in the kernel only during the development.

  • Improve needing symmetric/floored-division operators.

  • Rename words that store/fetch sys color attributes. Rename "color" prefix to "attr", "permcolor" prefix to "perm-attr".

  • Rewrite perm-attr! and perm-attr-mask! in Z80.

  • Rewrite attr@ and attr-mask@ in Z80.

  • Rewrite perm-attr@ and perm-attr-mask@ in Z80.

  • Make all attribute words accessible to need.

  • Improve the implementation of xstack. Rename set-xstack to xstack. Make allot-xstack and allocate-xstack more versatile: they don’t parse a name anymore, but simply return the address of the new stack. Remove xp@, xp! and xp+!. Fix xfree. Improve and complete documentation of all words. Make all words individually accessible to need.

  • Rewrite odd? and even? in Z80.

  • Rename paper!/paper@ and family to "set-/get-". The new names are more logical, because the values are not stored or fetched verbatim, but as bits of the temporary attribute. Beside, the new naming convention can be generalized and used also with the printing modes (inverse and overprint). Rewrite set-paper and set-ink in Z80.

  • Rename/modify paper and family to paper., etc. These names make clear what these words do. Beside, they don’t change the permanent attribute any more. Move paper., ink., bright. and flash. to the library. Improve bright. and flash. to accept a flag (so far they checked only bit 0 of the parameter; nowe any non-zero value turns them on, what is the usual behaviour in Forth) and color 8 (transparent).

  • Make cls use the temporary attribute. This behaviour is more logical and practical because the permanent attribute is not modified by other words any more.

  • Add decimal prefix to system variables addresses. This avoids problems.

  • Improve needing of color constants.

  • Rename the far-memory routines constants. A clearer convention is used for constants that return addresses of kernel routines.

  • Update needing of binary.

  • Rename and improve the scroll and pan words.

  • Rewrite spaces in Z80.

  • Rename the variants of type that print on fields. Rename type-left, type-right and type-center to type-left-field, type-right-field and type-center-field, because they erase the field with padding spaces, and there will be a parallel set of words that don’t. Improve type-center-field and type-right-field.

  • Improve mode32-emit to be configurable.

  • Rewrite bounds in Z80.

  • Convert all UDG words to the 0-index-only convention. All "0udg" words have been renamed after their "udg" counterparts, which have been removed. Other words have become useless too and have been removed.

  • Improve udg>, ocr-chars and ocr-first. Now ocr-chars and ocr-first are character variables. No need for a whole cell in this case.

  • Unify DOS symbols, notation and layout. Especially TR-DOS and +3DOS have some analogous routines, that have been named and arranged the same way.

Other changes

  • Rename test-pixel to get-pixel; also in mode 176.

  • Remove the old "system bank" code. The far-memory system made it unnecessary.

  • Convert voc-link to latest-wordlist. Now the wid is used as pointer to the previous word list. This method is simpler and clearer, and latest-wordlist is a better name than the old fig-Forth voc-link, which anyway relates to vocabularies.

  • Rename udg-chars to default-udg-chars.

  • Move far-memory string words to their own module.

  • Remove string arrays that don’t leave a count. There were two variants of each string array. It’s simpler to keep only the variant that returns the count of compiled strings, which is useful most of the times.

  • Benchmark and remove alternative m*.

  • Remove the kernel copy of where.

  • Remove exit after conditional intepretation. The objective of exit at the end of conditional comments (?\ and ?() was to interpret blocks faster, leaving the current block after the needed code had been interpreted. But the space in the block is more important.

  • Remove slower versions of rshift and lshift. They are only 3 bytes smaller, but much slower (1.33 and 1.69 the execution time of the faster default versions).

  • Move remaining tests to the tests module.

  • Remove permcolor and 2permcolor definers. Hardly useful.

  • Rename color definer to attr-setter, and 2color to mask+attr-setter.

  • Remove paper>attr. No need for this word. papery can be used instead.

  • Move span to the library.

  • Move !bank, c!bank, @bank and c@bank to the library.

  • Move upper, uppers, faruppers and lowers to the library.

  • Modify digit? to use the lower routine.

  • Remove old unused implementations of um*.

  • Move permanent-colors to the library and rename it to mask+attr>perm. This word is not needed in the kernel any more. The new name is consistent with the words that manipulate the current attribute.

  • Remove 0udg-at-xy-echo, at-xy-echo-0udg. No need for them in the kernel. They are already in the library, with different names, since 2017-01-09. They are still experimental.

  • Move read-block and write-block to the main file of the kernel, because they are identical in G+DOS, TR-DOS and +3DOS.

  • Move TR-DOS get-drive and cat to the library.

  • Move rec/track to the kernel.

  • Remove lib-order and family. These words were never used, because the method was not low-level enough: need had to be modified to use it explicitily. A better, transparent method to use several configurable library disks at the same time will be introduced in v0.14.0.

  • Rename the "modules" directories to "addons". The name was confusing because these directories contain code not integrated in the library yet, while in all the documentation the name "module" means a library file.

Background image

Title

Alonso Quijano limpia sus armas (Alonso Quixano cleans up his armour).

Illustrator

Doré, Gustave (1832-1883).

Engraver

Pisan, Héliodore Joseph (1822-1890).

Book

El ingenioso hidalgo don Quijote de La Mancha (The Ingenious Gentleman Don Quixote of La Mancha) (1605), by Miguel de Cervantes (1547-1616).

Edition

1863, Paris, L’ingénieux hidalgo Don Quichotte de la Manche (Hachette). Volume 1, chapter 1, page 13.

The ZX Spectrum image was created from image 879 of the QBI image bank.

Version 0.12.0

Released on 2016-12-31.

This version has more new features, bug fixes, improvements and changes than initially planned. The reason is it was heavily tested during the development of two game projects.

New

  • Port of the blocked editor, an alternative to the fig-Forth editor. Not fully tested yet.

  • const, cconst and 2const, to define constants that compile their values.

  • Add jp, to the assembler word list in the kernel, factored from defer.

  • Add farlimit, farunused; update .unused.

  • Add list-lines, list-line.

  • Add qx, a quick index tool extracted from the original blocked editor and improved to work with any editor and in any screen mode.

  • .line#, /line#.

  • Add /block# and .block#.

  • Add avariable, 2avariable, cavariable, 1-dimension arrays that work like variables.

  • Add bit-array, !bit, @bit.

  • Start supporting Gforth’s mini-oof.

  • Add see-xt, see-body-from.

  • Add -branch.

  • Add +if, +while, +until.

  • Add max-order and ?order. In order to check the search order in set-order…​

  • Add data:, 2data:, cdata:.

  • Add quotations: [: and ;].

  • Add enumcell.

  • Add dtimes.

  • Add ?rstack.

  • New word >printable-ascii-char, a factor of type-ascii and fartype-ascii. New faster and specific check printable-ascii-char?.

  • Add cenum.

  • Add #>kk.

  • Add ~~app-info. This makes ~~ easier to extend and customize by the application.

  • Add +perform.

  • Add -order, +order.

  • Add -1|1.

  • Add assembler labels.

  • Add switch, >cell-string.

  • Add c>bstring, 2>bstring.

  • Add hide-internal, to complete the old internal module.

  • Add VFX-like module. An implementation of VFX’s module by Ulrich Hoffmann in Forth-94.

  • Add SwiftForth’s package.

  • Add c!exchange, new exchange, cexchange.

  • Add sconstants, /sconstants.

  • Add u>str.

  • Add uppers1.

  • Add make-block-characters.

  • Add block-characters and 0udg>.

  • Add odd?.

  • Add set-font, get-font, set-udg, get-udg, rom-font.

  • Add even?.

  • Add case-sensitive, lower, lowers, farlowers.

  • Add udg-chars to define the default UDG 'A'..'U'.

  • Add case-sensitive escaped strings. This improvement makes the escaped strings Forth-2012 compliant, and compatible with the ZX Spectrum escaped UDG notation (uppercase '\A'..'\U').

  • Implement escaped strings search order. This method is analogous to the main search order, and lets the application configure the chars escaped by s\", .\" and other words.

  • Add window, a basic implementation of text windows.

  • Add constants for common control keys.

  • Add plot176.

  • Start the new rdraw (not finished yet).

  • Add more words to plot and draw in 255x176 mode. The graphic commands of Sinclair BASIC work in 255x176 instead of 255x191. Therefore words that use the same resolution and origin are useful to adapt BASIC programs. New words: (pixel-addr176), pixel-addr176, set-pixel176, reset-pixel176, toggle-pixel176, test-pixel176, set-save-pixel176, aline176.

  • Add fyi.

  • Add ifelse operator.

Fixes

  • Fix :noname with the new call,.

  • Fix needing d<>, trim, char, [char], word.

  • Fix +place.

  • Adapt module to far memory.

  • Make name<name compatible with far memory.

  • Fix search: empty substring caused crash.

  • Fix compilation of s\", .\": keep search order.

  • Fix bright!.

  • Load see (old decode) preserving the word lists config.

  • Fix conditional definition of /kk.

  • Fix privatize.

  • Fix u.r.

  • Fix /hold and floored environmental query strings.

  • Fix grep expression in fs2fba.sh.

  • Fix and improve several issues in both assemblers. Main changes, in the z80-asm, assembler: Fix jp>jr to manage also unconditional jumps; fix relse, rwhile and runtil.

  • Fix jp>jr.

  • Fix names of im1, and im2,.

  • Make inverse-cond and jp>jr z80-asm-safe. There were problems when z80-asm was loaded before z80-asm,, because z80-asm has words homonymous with Forth words.

  • Fix: Make cold reset the behaviour of warn.

  • Fix code typo in fast-(pixel-addr).

  • Fix rstep.

Improvements

  • Documentation of many words has been improved. All documentation is still in the sources, though.

  • The needing of many words has been improved, i.e., now they can be accessed individually by need.

  • Rename transient[ ]transient -transient to transient end-transient forget-transient and improve them.

  • Update the Vim syntax file.

  • Add Vim ftdetect file.

  • Make link@ an alias, for speed.

  • Make words and family configurable. Sometimes it’s useful to see more information in a listing of words. Now words, wordlist-words and words-like can be configured with a deferred word.

  • Add a configurable resume key to ~~control.

  • Rewrite lengths in Z80.

  • Improve and test [switch.

  • Improve does> with call,.

  • Use cell+ cell+ and cell- cell-. They are a little bit faster than [ 2 cells ] literal + and [ 2 cells ] literal - and save one cell.

  • Improve (located) to detect empty strings. Actually this was a bug: an empty string from need and family was accepted and looked for, and of course it matched the header of the first locatable block of the library.

  • Improve G+DOS transfer-block with literal.

  • Rewrite d- with Z80 opcodes, to make it independent from the assembler.

  • Improve kernel’s first-boot routine.

  • Improve +field: Make it a deferred word and add 3 implementations: +field-unopt, +field-opt-0 and +field-opt-0124.

  • Make negate 6 T faster and 2 B smaller.

  • Improve ~~control to accept also any resume key.

  • Rename paper> to attr>paper. Rename >paper to paper>attr. Rewrite them in Z80.

  • Increase return stack.

  • Define default /kk.

  • Improve switch: with character and 2-cell clauses.

  • Improve export with alias.

  • Rewrite ms.

  • Rewrite 8* in Z80.

  • Make escaped chars configurable in s\" and .\". Support escaped graphic chars (BASin notation).

  • Save one byte in find-name-from.

  • Improve ~~ with clearer output.

  • Improve du<.

  • Improve .depth: 4 bytes smaller.

Other changes

  • Store definition names in lowercase. This makes more sense, because this way words can be typed and interpreted in lowercase, which is the default in the sources, also when the new case-sensitive mode is activated.

  • Use ?( instead of [if] in the library. Compilation of standard [if] needs more data space and is slower than the conditional comment ?(, which is enough for all the conditional compilation needs of the library.

  • Split the indexer module. Part of the code can be shared with an alternative indexer under development.

  • Show version-specific background image at startup.

  • Improve the user module. Add conditional compilation.

  • Reorganize <make/> and <tools/>. Now <make/> contains the programs used by <Makefile>, and <tools/> will contain tools for the Forth programmer.

  • Move .line to its proper module.

  • Move code and list tools common to both editors to an independent module.

  • Rename Wong’s array to avalue and extend it.

  • Rename c!set-bits, c!reset-bits, c!toggle-bits to cset, creset, ctoggle.

  • Rename c@test-bits and c@test-bits? to c@and and c@and?.

  • Rename decode to see. The tool is not complete yet, but it fits the description of the standard word see, therefore there’s no need to keep its original name.

  • Rename -branch to +branch. The name was not consistent with ?branch and 0branch.

  • Move u.r to the library.

  • Prepare the implementation of use-fly-index, an alternative indexer.

  • Move storer, cstorer, 2storer to a module.

  • Remove old get-order and order@ from library.

  • Move seal to the library.

  • Move catch to the library.

  • Combine small control structures into one module.

  • Combine small definers into one module.

  • Move fartype and fartype-ascii to the library.

  • Move ?leave to the library.

  • Move warnings and family to the library.

  • Move search-wordlist to the library.

  • Remove blocks, a duplicate of blk/disk.

  • Move doer-test to the tests module.

  • Remove old unused bank-boundary?.

  • Replace scr with lastblk in load and reload.

  • Rename ~~show to ~~info.

  • Remove mutual needing of n>r, nr>.

  • Rename ?jr-range and ?page to ?rel. The word is common to both assemblers but had different names.

  • Rename module of switch:, after the usual convention.

  • Rename >cell-string to >bstring, which is completed with the new words c>bstring and 2>bstring.

  • Rename the internal module words to extend it: Old: internal, external, module New: internal, end-internal, unlink-internal

  • Rename "common" and "misc" module filenames. The change makes those modules more visible; besides, by default they are listed before their related modules.

  • Rename exchange to !exchange.

  • Rename the environment? module after the usual convention.

  • Remove (wait) from the kernel.

  • Rename jpnext, jppushhl: jpnext,, jppushhl,. The new names are consistent with the rest of similar words also defined in the kernel: jp, and call,. Beside, z80-asm,, which uses the comma suffix convention, will be the only assembler in a future version.

  • Rename rdraw, adraw to rdraw176, adraw176. These implementations use only 176 pixel rows of the screen, like Sinclair BASIC. They can be useful for conversions from BASIC.

  • Convert rdraw176 to the z80-asm, assembler.

  • Convert inkey, get-inkey to the z80-asm, assembler.

  • Move kernel aliases after the words they point to. This change makes the output of see clearer in certain cases, because >name searches the dictionary from oldest to newest definition. Anyway, this is the order aliases are defined outside the kernel.

  • Rename from to need-from. This word is seldom needed. from is a generic, more useful name in application context.

  • Change the assembler of pixel graphic words. Convert all of them from the deprecated z80-asm to z80-asm,.

  • Rename wait-for-key to discard-key.

  • Move s' from its own module to the misc strings module.

  • Improve the description of the Forth tools used by GNU make to build the Forth system.

  • Compact the library to fit the 636 KiB available in a TR-DOS disk image.

Background image

From version 0.12.0, Solo Forth shows a version-specific background image the first time it boots. The image of this version is the following:

Title

Alonso Quixano reading books of chavalry.

Author

Gustave Doré (1832-1883).

Book

El ingenioso hidalgo don Quijote de La Mancha (The Ingenious Gentleman Don Quixote of La Mancha) (1605), chapter 1, by Miguel de Cervantes (1547-1616).

The ZX Spectrum image was converted from the pictures scanned by Claudio Paganelli from the italian edition Don Chisciotte della Mancia, published by Edoardo Perino (Rome, 1888). Direct link to the image: https://www.h-net.org/~cervantes/doreimag/tav001.gif.

Version 0.11.0

Released on 2016-11-16.

The goal of this version was to implement a virtual 64-KiB continuous space built from 4 configurable memory banks, in order to increase the headers space of the Forth system (so far only one single 16-KiB bank was used for that), and also to provide the programmer an easy method to use all the paged memory. It has been called "far memory".

New

  • Far memory: A virtual 64-KiB continuous space, built from 4 configurable memory banks. It’s used by the Forth system to store the dictionary headers, and can be used transparently by the programmer.

  • Basic support for the far-memory system in the kernel: far-banks, far, ?next-bank, ?previous-bank, far@, far!, farc@, farc!, farplace, fartype, faruppers.

  • Optional library words to manage the far memory: far2@, far2!, far@`, `farc@, far2@`, `far!, farc+!, move>far, move<far, cmove>far, cmove<far, fartype-ascii, fardump, farwdump, farallot.

  • Add u>ud.

  • Add word-length-mask.

  • Try and document indexer. It did not work in previous versions because the old 16-KiB bank used to store the definition headers was not large enough: the index occupied 12 KiB, while the kernel definitions occupied 5 KiB. After implementing the 64-KiB far memory, the indexer works fine. Its usage has been documented in the source and the README.

Fixes

  • Fix description of the header structure.

  • Fix requiring gcd, % and u%.

  • Fix \, which used span instead of #tib. This bug has been invisible for a long time, because \ is not used in the command line.

  • Fix block title of the calculator module: it caused >= and other calculator operators be found by need instead of the integer ones, because the calculator module is before the integer operators in the library disk. This problem affected the "tt" sample game, which also lacked need randomize.

  • Fix conditional compilation of alias!.

  • Fix requiring `<⇒'.

Improvements

  • Update Vim syntax file.

  • Rewrite c!bank, !bank, @bank and c@bank in Z80.

  • Simplify home. No need for specific versions of home for the screen modes. Only at-xy has to be reconfigured by the screen modes, if needed.

  • Improve the address register module. The code still used direct jumps to pushhl instead of jppushhl, which is faster with no size penalty.

  • Improve documentation of the assert( tools.

  • Document the ~~ debugging tool.

  • Compact the assemblers, saving one block each.

  • Make all buffers contiguous. Now the circular string buffer can be configured to use the disk buffer and the terminal input buffer as extra space.

  • Improve documentation of dump and wdump.

  • Improve the default case with alias.

Other changes

  • Remove the old unused code of the old search order.

  • Make Z80 registers and flags uppercase in kernel’s comments.

  • Rename "names pointer" to "headers pointer". The whole header of the definition is stored at the pointed address, not just its name. Therefore the old np, np! and np@ have been renamed to hp, hp! and hp@.

  • Rename code-field, to call, in assembler. The old code-field,, needed in the kernel, does exactly the same as call, in the z80-asm, assembler. So it has been renamed, moved to the assembler word list and removed from the assembler.

  • Move 8* from the assemblers to the operators.

Version 0.10.0

Released on 2016-10-23.

Besides many new features, fixes, improvements and changes, this version includes disk images not only for G+DOS but also for TR-DOS and +3DOS. The support for TR-DOS and +3DOS is not finished: The TR-DOS version can access the library only from drive A, and it has no words to manage disk files; the +3DOS version can not use the library.

New

  • Add -1. -1 is defined with the former code of true, and true is converted to an alias. This saves 8 bytes in the kernel and makes any compiled -1 faster than a literal and one cell smaller.

  • Add '' and >>name. These words allow to get the execution token pointer of a name, and convert it to its associated name token; this makes it possible to get the actual name of an alias, what is impossible from its shared execution token.

  • Add [''].

  • Add gcd operator.

  • Add color constants and color modifiers.

  • Add a 128K sound editor. First version. It’s usable but needs improvements.

  • Support for TR-DOS (not finished: the library can be accesed only from drive A).

  • Add blks checker.

  • Add lib-order. So far the library must be one single disk. lib-order, set-lib-order and get-lib-order will make it possible to use several library disks and configure the order in which they are searched, up to the maximum allowed by the DOS. These words are not used by need yet, so they are useless at the moment.

  • Build disks for +3DOS (the library can not be accesed yet).

  • Add ref-xdpb to the +3DOS version.

  • Add first-udg and udg-row[.

  • Add exec-bench. This bench compares the execution time of executing two pieces of code depending on a flag, using three methods.

  • Add fetch-bench.

  • Add set-pixel-bench.

  • Add pixels-bench.

  • Add bitmap>attr-addr and pixel-attr-addr.

  • Add store-bench.

  • Add allot-xstack.

  • Add rec/track.

Fixes

  • Fix >body and body>. Their codes were exchanged when they were moved to the library.

  • Fix decode, which showed the usage instructions before checking the word.

  • Fix need-here.

  • Fix find-name with ?do.

  • Fix needing c@+.

  • Fix requiring c1+!, c1-!, 1+! and 1-!.

  • Fix G+DOS (cat); update the G+DOS module.

  • Fix conditional compilation of some library words. The conditional compilation of ]l, ]2l, exec ,eval, save-here and restore-here was wrong.

  • Fix requisite of "Siderator 2".

  • Fix load-app to be compatible with refill.

Improvements

  • Modify the structure of vocabularies. Now vocabularies don’t keep the data of a word list in their body. Instead, they create a wordlist and store only its address. This way, vocabulary can be moved to the library, even if there are three vocabularies in the kernel (root, forth and assembler). But the main advantage of this change is conversion can work in both directions: a word list identifier can be get from a vocabulary name, no matter if the vocabulary was created with vocabulary or out of an existent word list; and a vocabulary can be created from a word list, and its structure will be identical to those created by vocabulary.

  • Improve format of error messages. Now a backslash is printed after the error code, and only when text messages are active. This looks clearer and saves 2 bytes in the kernel.

  • Improve the decode tool. Improve the check in colon-cfa?. Compact decode-special.

  • Improve compilation of 8-bit literals. literal is replaced with the new word 1literal in interpret-table. This causes 8-bit literals will be compiled by cliteral instead of literal, what saves one byte of data space and is faster at run-time. cliteral was moved from the library to the kernel, and byte? was added in order to do the check. These changes add 31 bytes to the kernel, but they will make the programs smaller and faster.

  • Improve 0, 1 and 2. These byte constants have been rewritten as code words. This makes them faster.

  • Improve constant and cconstant. Now they are faster: their run-time code runs directly into @ and c@. This saves 8 bytes from the kernel.

  • Improve 2constant. Now its run-time code (instead that of 2>r, less used) runs directly into 2@. This makes double constants a bit faster and saves one byte from the kernel.

  • Improve needing of 128K sound effects. Now every sound effect can be required individually.

  • Improve definition of 128K sounds. Now sounds are created with sound instead of sound:, and when they are executed they just play instead of returning the address of its data.

  • Improve sector-id for G+DOS.

  • Improve needing of <is>, [is] and is. No <is> and [is] can be needed apart.

  • Improve pixels.

  • Improve documentation of attr and related words.

Other Changes

  • Move vocabulary to library; adapt assembler.

  • Use wordlist for parse-escaped-string. No need to use vocabulary for a standard tool.

  • Move there to the library.

  • Reuse the code of noop to save 2 bytes.

  • Reorganize the exception codes; add TR-DOS codes. In order to make calculations easier, all DOS will share the range of exception codes.

  • Start implementing ior to DOS calls. The goal is all Forth words that call any DOS routine return an ior error result.

  • Print DOS name in the greeting message.

  • Organize the disk images in directories.

  • Rename error-messages-block to errors-block. Also combine blocks of its module to save two of them.

  • Compact the library. The code of several modules has been compacted and reorganized in order to save blocks, because of the 636 KiB usable in TR-DOS disk images.

  • Split the tests and benchmarks into several disks, in order to make them fit 636-KiB TR-DOS disks.

  • Rename disk images. All disk image files have been renamed after a shorter and clearer format, easier to use with the SDL file interface of the Fuse emulator. Now disks are numbered the same way in every DOS, with an ordinal number instead the identifier of the drive it’s supposed to be used with.

  • Make G+DOS' transfer-sector return an ior.

  • Remove G+DOS' old set-library-disk. set-library-disk and get-library-disk are superseded by set-lib-order and get-lib-order, which are implemented but not used by locate yet.

  • Rename the disk files to fit any DOS. The filename format 4+3 fits G+DOS (10 chars), +3DOS (8+3 chars) and TR-DOS (8 chars). This is simpler than creating different names for every DOS, and makes code compatible.

  • Reuse code of invert. Currently, the HL register needs to be inverted from assembler, in two DOS operations. There’s no need to duplicate code. The fastest method is chosen, though the call makes invert a bit slower.

  • Free RAM page 1 in +3DOS. +3DOS uses RAM pages 1, 3, 4 and 6 as an array of 128 sector buffers (numbered 0…​127), each of 512 bytes, thus 32 buffers per RAM page. The cache and RAM disk occupy two separate (contiguous) areas of this array. In order to free RAM page 1 for Solo Forth, the default configuration must be modified, moving everything up and making the RAM disk 32 buffers smaller.

  • Complete the +3DOS exception codes.

  • Compact the source of located.

  • Improve the output of exec-bench.

  • Rename xstack to allocate-xstack.

  • Make (pixel-addr) deferred.

Version 0.9.0

Released on 2016-05-18.

Main changes

  • Finish refill, improve -→. Now refill supports blocks. -→ has been rewritten after it.

  • Fix [else] with refill: Now [if] can cross block boundaries.

  • Fix to, 2to and cto.

  • Add load-app.

  • Fix parse-all (was parse-line); finish execute-parsing.

  • Move evaluate and string>source to the library: These words are not used in the kernel, and evaluate can be rewritten after execute-parsing, which is in the library. This saves 28 bytes in the kernel.

  • Add !>, 2!> and c!>: Words that change the value of constants, inspired by IsForth’s !>.

  • Improve value, to and their variants: The default versions (standard value and to, and non-standard 2value, 2to, cvalue and cto) have been combined into one single module, rewritten as aliases and documented. The standard alternative versions of value, 2value and to have been documented.

  • Rename non-parsing value/to to val/toval.

Other changes

  • Fix harmless bug in locate-reneed.

  • Improve compilation of "memory.misc.fsb": Remove dependency on the assembler. Add conditional compilation. Compact the blocks. Remove unused code.

  • Rename @cell+ to @`, add `2@.

  • Fix !a, !a+, c@a+: The module of the address register has been compacted and documented. During the process three bugs, caused by wrong Z80 opcodes, were discovered and fixed.

  • Simplify the circular string buffer: So far the internal offset of the buffer was stored before the buffer data. It has been moved to >csb, which formerly was a fake variable, a constant that returned the address of the offset, and now is an actual variable. This saves a cell and is more versatile. In total, ten bytes are saved with some related changes.

  • Add 2storer.

  • Remove set-latest-lex: A factor of interpret and compile-only that was not useful, because there are no more flags to set. Removing it saves 5 bytes.

  • Improve hided.

  • Fix requirements of [cconst].

  • Add benchmark for `?throw'.

  • Document fill, erase, blank.

  • Shorten hex: A branch saves one cell, more important than speed in this case. hex and decimal have been documented.

  • Rename hided to the correct hidden.

  • Move >body and body> to the library.

  • Improve up: Now up is a variable, not a constant that returns the address where the value is stored. This change is necessary to implement multitasking, and it saves one cell.

  • Improve conditional compilation of word lists tools.

Version 0.8.0

Released on 2016-05-10.

Main changes

  • Add the Forth-94 core tests written by John Hayes.

Other changes

  • Improve compilation of the assemblers: Now the contents of base, the compilation word list and the search order are saved before compiling the assemblers, and restored at the end.

  • Add align and aligned.

  • Fix [char].

Version 0.7.0

Released on 2016-05-09.

Main changes

  • Fix header,: move current-latest back to the kernel.

  • Fix and improve search: 8 times faster code.

  • Fix mode42.

  • Make three library disks instead of one.

  • Rename s= to str=; add str<, str>.

  • Rename other> to othercase>; improve its doc.

  • Rename nextcase to repeatcase; improve its doc.

  • Rename set to storer and improve it.

  • Rename chan to channel.

  • Improve compare: faster code.

  • Improve and document overprint; move it to the library.

  • Improve and document inverse; move it to the library.

  • Improve paper and ink.

  • Improve the indexer tool: no data space used anymore.

  • Add ?(.

  • Add need-here.

  • Move warnings control to the library.

Other changes

  • Fix border and modify default-colors.

  • Fix code typos in "printing.cursor.fsb".

  • Fix the error of ?locate.

  • Add 0max.

  • Add <⇒.

  • Add ?ccase, ccase0, ccase.

  • Add alias!.

  • Add clshift, 8-bit version of lshift.

  • Add color, 2color and related words.

  • Add cstorer.

  • Add dup>r.

  • Add either and neither.

  • Add holds.

  • Add lineload.

  • Add ruler.

  • Add split and join.

  • Add string-parameter.

  • Add type-left, type-center, type-right.

  • Add warning".

  • Add words#.

  • Add color system variables.

  • Factor .unused from greeting.

  • Factor permanent-colors from ink.

  • Improve 0= and =.

  • Improve 2r>.

  • Improve default-colors.

  • Improve leave.

  • Improve need.

  • Improve u<.

  • Improve z80-asm,, the alternative assembler.

  • Improve compilation and documentation of alias.

  • Improve conditional compilation of printing control.

  • Improve printing of nameless word lists.

  • Improve documentation of ?repeat.

  • Improve documentation of create:.

  • Improve documentation of jppushl.

  • Improve documentation of options[.

  • Improve documentation of thiscase.

  • Make chars an alias of noop, not a deferred word.

  • Make from and locate optional.

  • Make pictured output string buffer configurable.

  • Make the faster < definitive.

  • Move [compile] to the library.

  • Move defer@ to the library.

  • Move printer to library.

  • Remove (i).

  • Remove transfer-mode.

  • Remove unnecessary space from .wid.

  • Rename and add color words.

  • Replace remaining [compile] with postpone.

  • Simplify cls.

  • Simplify default-colors.

  • Simplify type-right.

  • Test and document tabulate.

  • Fix description of ahead.

  • Compact the library.

Version 0.6.0

Released on 2016-04-27.

Main changes

  • Add marker.

  • Add modern latest (old fig-Forth latest is renamed to current-latest).

  • Add latestxt and lastxt.

  • Fix recurse and :noname, which used the old latest.

  • Add name>interpret, name>compile.

  • Add comp' and [comp'].

  • Fix restore-here.

  • Fix and improve compilation of literals.

  • Add char-position? and char-in-string?.

  • Rename ascii-type to type-ascii.

  • Improve definition of UDGs.

  • Improve printing of UDGs at graphic coordinates.

Other changes

  • Add /!, !, 2/!, 2!.

  • Move char and [char] to the library.

  • Move cliteral to the library.

  • Move ;code to the library.

  • Move 2rdrop to the library.

  • Move pick to the library.

  • Move nextname to the library.

  • Move :noname to the library.

  • Move get-default-bank and set-default-bank to the library.

  • Improve the error code of located.

  • Replace bs with backspace in dump.

  • Fix description of defined.

  • Clearer warning and exception messages.

  • Update the Pong game.

Version 0.5.0

Released on 2016-04-22.

Main changes

  • Add floating point support.

  • Add ROM calculator support.

  • Fix >name.

  • Improve alias.

  • Add user.

  • Add j and k.

Other changes

  • Add realias.

  • Improve dnegate.

  • Add wait-for-key.

  • Improve system-bank.

  • Improve upper.

  • Renamed the math library files with a common root.

  • Move recurse to the library.

  • Add (source-id).

  • Move !s and c!s to the library.

  • Add -!.

  • Add times.

  • Fix (;code).

  • Improve associative-list.

  • Fix dump.

  • Improve ascii-type.

  • Fix decode-compile.

  • Rename library files.

  • Documentation: Change the stack notation for flags.

Version 0.4.1

Released on 2016-04-11.

  • Fix and improve the tape support: The message "Start tape, then press any key" does not appear anymore.

  • The tape module is fully documented.

Version 0.4.0

Released on 2016-04-10.

  • Tape support.

  • New words: nonfull-display, full-display, save-display and restore-display.

Version 0.3.2

Released on 2016-04-09.

  • Fix, improve and finish the arguments implementation of locals.

  • Improve the documentation of some library modules.

Version 0.3.1

Released on 2016-04-09.

  • Split the assembler library module into three files: z80-asm assembler, z80-asm-comma assembler and common tools.

  • Fix the title of two 8-bit pseudo-random number generator benchmarks.

  • Fix the name of the base-execute library module.

Version 0.3.0

Released on 2016-04-03.

  • Adapt some library words to DTC.

  • Fix the DTC version of decode and remove its ITC version.

  • Add docolon to the kernel, needed by decode.

  • Add cslit and an alternative definition of csliteral to the library.

  • Improve decode with support for csliteral.

  • Change the stack notation "text<c>" to "ccc<char>", after the standard.

  • Fix number?: wrong numbers left a double cell on the stack under the TOS flag, and base was not restored.

  • Add number-punctuation? to check for valid punctuation in numbers.

  • Improve number? to recognize also comma, colon, plus, hyphen and slash as valid punctuation, any number of them, at any position. Formerly only one decimal point was allowed, at any position.

  • Add number to the library.

  • Make .\" independent from s\".

  • Replace Z80 jumps to the push_hl entry point of the inner interpreter with a push hl and the usual jp (ix) (jump to next). This saves 2 CPU cycles and needs no additional bytes. Benchmarks are 1% faster.

  • Add jppushhl to the assembler wordlist in the kernel and modify the library code words accordingly.

  • Make number? to reject initial or duplicated point.

  • Rename all occurrences of "punctuation" to "point".

  • Make number-point? match only the standard period. Add two alternatives to the library, which recognize more points.

  • Add there, which sets dp.

  • Convert the words compile,, begin, <mark, <resolve and then to aliases.

  • Remove next2, which is unnecessary in DTC; update pause and execute-hl accordingly.

  • Update some development benchmarks.

  • Reorganize the source, binary and temporary files into directories.

  • Add the bank-start constant.

  • Add save-here and restore-here.

  • Add the code-bank tool (not tested yet).

  • Modify the file words to return a standard ior.

  • Modify mode42 and mode64 to implement alternative versions that use the code bank.

  • Convert >wid and wid> to aliases.

  • Add +under.

  • Update the implementation of wordlist and vocabulary.

  • Replace get-order.

  • Add set-default-bank, get-default-bank and default-bank#.

  • Remove parens from names of the printing mode vectors.

  • Comment out the contrast ink calculation in border.

  • Remove the game Nuclear Invaders, which temporarily had been included in the library.

  • Split the library into files (151) and update the Makefile accordingly. This makes it possible to include only the modules needed by the user application.

  • Rename the interrupt-independent version of inkey to get-inkey.

  • Rename the two versions of key??, which are interrup-independent, to get-key? and fast-get-key?.

  • Fix -suffix.

  • Add for-i for the for step loop.

  • Rename di to dfor-i for the dfor dstep loop.

  • Rename the words of Wil Baden’s case structure to avoid name clash with the standard case.

  • Remove old fig-Forth loop indexes from the library.

  • Modify the license.

  • Update and complete all of the source file headers.

  • Add ?repeat.

  • Modify and factor wid>name.

  • Simplify the storage and printing of the version number, by making release candidates start from 1 instead of 0.

  • Include only the best implementations of pseudo-random number generators. Update the benchmarks of all of them.

  • Improve the documentation of many words.

  • Add indexer, a tool that indexes the library and makes need, needed, reneed and reneeded much faster.

  • Add cell/, d10* and bits to the library.

Version 0.2.0

Released on 2016-03-14.

  • The old alternative ITC code is removed.

Version 0.1.0

Released on 2016-03-14.

Many fixes, changes and improvements. See the development history.

  • The Vim syntax file for Solo Forth is included.

Version 0.0.0

Developed from 2015-06-02 to 2015-12-18.

During this long initial period of the development, Solo Forth grew from a small seed (the code of Abersoft Forth, a fig-Forth 1.1) to a disk-based system, with only some small traces of fig-Forth left, with many features of modern standard Forth systems and a huge library of optional code.

Version branch 0.0 was finished after replacing the fig-Forth do loop control structures with the Forth-83 version, adding a method to nest sources (nest-source and unnest-source) and writing evaluate.