Skip to content

SpecTalkZX 1.3.9: Juno

Choose a tag to compare

@IgnacioMonge IgnacioMonge released this 28 Aug 19:26
· 7 commits to main since this release

[v1.3.9] - Juno - Release Notes

This release is the main development line after v1.3.8: Hermes. The headline
is native support for the SpectraNext cartridge (the Spectranet/XFS cart,
not the ZX Spectrum Next), delivered as a second compile-time build. The
Classic divMMC + ESP-AT product is unchanged: same screens, same IRC commands,
same three runtime files. Everything below is new or fixed since the published
1.3.8 tag.

The in-app What's New screen (!changelog) is headed 1.3.9. Juno and lists:

  • Native SpectraNext support
  • Guided SpectraNext installer
  • More reliable UART transfers
  • Safe recovery from UDP failures
  • Reliable configuration loading
  • Safer friend and ignore lists
  • File access preserves the interface
  • More robust About/Earth screen
  • Interrupt-safe chat scrolling
  • Clearer registration errors
  • Polished clock and status UI
  • And much, much more!

The rest of this section is that list expanded against the actual 1.3.8 → 1.3.9
work.

Final release-profile verification recorded on 2026-08-28:

  • Command: make release NO_COLOR=1
  • Classic TAP: 35,386 bytes.
  • Classic BSS guard: 0xEFDD < 0xF500, 1,315 bytes free before
    ring_buffer.
  • Classic overlays: 1700 / 1902 / 1739 / 1745 / 1934 / 1798 / 1816 /
    1893 bytes
    .
  • Classic packed SPECTALK.OVL: 14,591 bytes.
  • SpectraNext TAP: 36,474 bytes.
  • SpectraNext BSS guard: 0xF3F5 < 0xF500, 267 bytes free before
    ring_buffer.
  • SpectraNext overlays: 1700 / 1902 / 1787 / 1828 / 1490 / 1920 / 1816 /
    1885 bytes
    .
  • SpectraNext packed SPECTALK.OVL: 14,392 bytes.
  • Shared SPECTALK.DAT: 16,469 bytes.
  • Installer: SPECTALK.INS 3,247 bytes, SPECTALK.PKG 43,670 bytes,
    loading screen 6,912 bytes.
  • Published 1.3.8 Classic TAP: 36,181 bytes.
  • Published 1.3.8 SPECTALK.DAT: 15,704 bytes.
  • Net Classic TAP delta: -795 bytes, despite the SpectraNext platform
    seams, UART/UDP recovery, configuration and About hardening, and the new
    What's New artwork stored in DAT.

User-visible features

Native SpectraNext support

  • Added a dedicated PLATFORM=spectranext build for ZX Spectrum models that
    the SpectraNext cartridge supports.
  • IRC uses the cartridge ROM sockets and DNS directly. This binary does not
    link UART, ESP-AT, or a runtime backend selector.
  • Configuration lives in local XFS as /CFG/SPECTALK.CFG and survives
    power-off. Classic still uses /SYS/CONFIG/SPECTALK.CFG with /SYS/ as
    fallback.
  • All five bookmark slots persist on the cartridge as /CFG/SPTBM1.CFG
    through /CFG/SPTBM5.CFG. Classic remains /SYS/CONFIG/SPTBM1.CFG through
    SPTBM5.CFG.
  • The displayed clock is UDP/SNTP (pool.ntp.org) with the configured numeric
    timezone, taken before the IRC TCP socket opens.
  • The cartridge exposes no RTC syscall to Z80 software. !tz rtc therefore
    falls back to the last numeric timezone; time still comes from SNTP.
  • SpecTalkZX owns one cartridge socket at a time, so clock sync only runs
    while IRC is closed. A retry also waits if another overlay currently owns
    the shared buffer.
  • Startup detection reports REQUIRES SPECTRANEXT! instead of
    REQUIRES DIVMMC!.
  • The title banner is target-specific: Classic remains “IRC Client for ZX
    Spectrum”; the cartridge build reports “IRC Client for Spectranext”.
  • !init closes the active cartridge socket and reinitializes the native
    backend. It does not send ESP-AT text into the IRC stream.
  • IRC is plaintext on the configured server port. Cartridge TLS is a fixed
    port-443 service, so there is no IRC TLS on 6697.

Guided SpectraNext installer

  • Public install is an HTTPS resource. Do not copy the Classic GitHub Release
    zip onto an SD card for this target.
  • Canonical root: https://ignaciomonge.github.io/SpecTalkZX/.
  • At the BASIC prompt:
%umount 2
%mount 2, "https://ignaciomonge.github.io/SpecTalkZX/"
%fs 2
%cat
%load "boot.zx"
  • boot.zx is tokenized BASIC. Do not %tapein it.
  • The loading screen keeps the installer panel at the bottom of the display.
  • The installer validates the package, writes SPECTALK.tap, SPECTALK.OVL,
    SPECTALK.DAT and SPECTALK.ZX to local XFS slot 0, then launches.
  • SPECTALK.ZX is created on the cartridge during install; it is not a hosted
    file. Afterwards start that local copy from XFS.
  • A later %load "boot.zx" from the same HTTPS root replaces the program
    files and leaves /CFG/SPECTALK.CFG and the five bookmark files alone.
  • A GitHub Release zip is not a mountable SpectraNext resource.

More reliable UART transfers

  • Classic UART byte send no longer spins forever if TX-ready never arrives.
    After about 16 ms (192 port polls) a stuck UART drops that byte and returns
    to the caller.
  • A missed PONG still disconnects as usual; the timeout only covers a stuck
    BUSY line, not a healthy transfer.
  • ESP-AT command writes use a bounded busy wait as well.
  • Hardware check of the UART timeout: no behaviour change in normal operation.

Safe recovery from UDP failures

  • The Classic raw-UDP path (NTP/AT over UART) uses a bounded transmission
    wait instead of an open-ended spin.
  • If a datagram is only partly sent, SpecTalkZX stops and recovers. 1.3.8
    could keep writing and emit a truncated NTP or AT frame.
  • On SpectraNext, SNTP rejects a short packet, a reply from the wrong host, a
    kiss-of-death / invalid-stratum reply, and a zero transmit timestamp. A zero
    timestamp would have locked the clock at midnight.

Reliable configuration loading

  • Config keys must match in full against the 23 real names: nick,
    nickpass, nickcolor, nickserv, server, port, pass, theme,
    autojoin, autoconnect, autoaway, friends, ignores, channels,
    countsync, beep, click, traffic, ts, tz, tzlast, divider,
    notif.
  • 1.3.8 accepted a truncated prefix. The nick-family keys all started with
    ni, so a short or mistyped key could apply the wrong setting. A truncated
    or unknown key is now ignored.

Safer friend and ignore lists

  • The !config Friends row wraps at two nicks per line instead of running
    off the 64-column display.
  • The Ignores row wraps at three names per line.
  • Empty lists still show the established “not set” placeholder.

File access preserves the interface

  • After every runtime esxDOS/XFS file call the keyboard input cache is
    invalidated, so the next keypress is not a leftover from the file
    operation.
  • On SpectraNext, saving config or bookmarks no longer lets directory scratch
    wipe live UI state (theme, PM state, render cache).
  • Overlay exit still discards reused parser/ring memory so loaded overlay
    bytes are not parsed as IRC.

More robust About/Earth screen

  • Earth frame and attribute packets from SPECTALK.DAT are bounds-checked
    before they can be painted. A short or corrupt packet is rejected instead
    of being drawn.
  • DAT reads during the animation run with interrupts off, matching the
    esxDOS RST 8 contract.
  • On SpectraNext, About used to issue up to 128 cartridge ROM calls per
    animation frame. The pump is now at most eight calls per frame. Connected
    About no longer stutters that way on hardware.
  • PING/PONG, peer close and keepalive still run while About owns the screen.

Interrupt-safe chat scrolling

  • Chat scroll no longer parks the CPU stack in display RAM to blit rows. An
    NMI during that fake stack could previously corrupt the copy.
  • The visible chat area still scrolls the same rows; only the implementation
    changed.

Clearer registration errors

  • A server ERROR during nick registration is recognised as the whole
    five-byte token, followed by end-of-line or a space.
  • 1.3.8 looked at E, R and a later R, so other words could be treated
    as a failed register, and a real ERROR without the extra byte was missed.
    Failed register now shows “Server error”.

Polished clock and status UI

  • Status-bar clock shifted half a character to column 55, matching
    NetChessZX.
  • Successful status results keep the intended leading space. 1.3.8 could
    print [OK] or a clipped [ OK after a cache miss on that space.
  • The three established themes are unchanged.

Reliability and protocol fixes

  • Bounded Classic UART TX-ready polling; drop the byte on timeout rather than
    hang the machine.
  • Bounded ESP-AT and raw-UDP transmission waits; fail-stop on a partial UDP
    frame instead of sending a truncated datagram.
  • SpectraNext SNTP validation as above; clock retry defers while another
    overlay owns the shared buffer.
  • Exact configuration-key matching for all 23 keys.
  • Input-cache invalidate after every runtime file I/O path that touches
    esxDOS/XFS.
  • SpectraNext XFS scratch no longer clobbers live UI across config and
    bookmark saves.
  • About Earth packet bounds, plus DI around every About esxDOS call.
  • Registration ERROR token and boundary.
  • Status-result leading space preserved across the fast print path.
  • Persistent notification / NAMES state moved out of Printer RAM into
    compiler BSS, so it no longer sits in a firmware-sensitive window.

Performance, size, and architecture

  • Classic TAP 35,386 bytes versus 1.3.8 36,181 bytes (−795).
  • What's New streams a new 64×88 packed logo from SPECTALK.DAT (after the
    Earth block, 765 packed bytes) instead of consuming SPCTLK3 overlay code.
    Dense dither did not fit the overlay budget.
  • The twelve-line What's New list always ends with the magenta
    “And much, much more!” line.
  • Network and clock are compile-time platform files. Product IRC and UI stay
    shared; there is no runtime backend switch.
  • Memory-layout check refuses to ship a build whose BSS reaches
    ring_buffer, whose overlays exceed 2K, or whose Printer/CHANS / XFS
    scratch bindings overlap.
  • Classic leaves $5B80..$5BBF free. SpectraNext binds XFS state at
    $5B80..$5B93 and persistent theme/PM/render-cache at $5B94..$5BBE.
  • !tz rtc dispatch moved into the cold overlay to recover Classic TAP and
    BSS; the command itself is unchanged.
  • build/toolchain.version records the z88dk used. The tree no longer pins
    or rejects a particular z88dk release.
  • TAP, OVL and DAT from one build stay a set. Mixing 1.3.8 and 1.3.9 files
    will break help, About, bookmarks or What's New.

SpectraNext limits

  • IRC uses plaintext on the configured server port. There is no IRC TLS on
    6697.
  • tz=rtc is not a cartridge RTC.
  • One cartridge socket at a time: clock sync only while IRC is closed.
  • Successful config and bookmark saves persist. The compact XFS writer is not
    an atomic rollback if power or I/O fails during an existing-file overwrite.

Hardware status

Verified on a physical SpectraNext cartridge during release preparation:

  • Guided HTTPS install reaches and launches SpecTalkZX 1.3.9.
  • Updating preserves the existing /CFG/SPECTALK.CFG.
  • Saving configuration survives restart and reloads the expected settings.
  • The What's New artwork and twelve-line list render.
  • Connected About animation is smoother after the bounded ROM pump.

Classic UART TX timeout: hardware-checked with no behaviour change in normal
operation.

These observations do not silently promote untested UART BUSY/turbo fault
injection, long soak, every theme, maximum friend/ignore lists, unexpected
NMI, or a power-cut in the middle of an XFS overwrite.

Current release files

  • Classic (GitHub Release archive spectalk_divmmc_v1.3.9.zip), required
    together:
    • SpecTalkZX.tap
    • SPECTALK.OVL
    • SPECTALK.DAT
  • SpectraNext (GitHub Pages; not that zip):
    • https://ignaciomonge.github.io/SpecTalkZX/
    • hosted: boot.zx, SPECTALK.INS, SPECTALK.PKG, SPECTALK.SCR,
      package.json, index.txt
    • Pages-only extras, not listed in index.txt: index.html, .nojekyll
    • created on the cartridge during install: SPECTALK.ZX
  • Generated release metadata:
    • release/version.txt -> 1.3.9. Juno
    • release/changes.txt -> in-app What's New summary
    • overlay/whatsnew_data.h -> generated payload used by the overlay
  • README screenshots under images/ are cropped captures from this release.
    No 1.3.8 gallery image is reused.