Skip to content

UltimateBasic 64 1.6.2

Choose a tag to compare

@zstarczali zstarczali released this 04 Oct 18:27
· 40 commits to main since this release
c00aaa3

Ultimate Basic v1.6.2 – Release Notes

2026-10-04 – Release 1.6.2: tracker instruments

New (tune ... end)

  • imod id, vibdelay, vibspeed, vibdepth, pwmspeed, pwmmin, pwmmax:
    instrument vibrato (triangle LFO after a delay, depth scaled to the
    note's semitone) and pulse width modulation between min and max.
  • ifilt id, cutend, sweep, pingpong: filter cutoff sweep from the inst
    cutoff toward cutend, sweep per frame, optionally back and forth.
  • igate id, gatetimer, hardrestart, firstwave: gate released gatetimer
    frames before the next note, hard restart also zeroes ADSR, firstwave
    is written on a note's first frame ($09 = test + gate).
  • itab id, speed, loop, "WW +n" / ".. -n" / "WW =n": wave / arpeggio
    table (up to 32 steps), one step every speed frames, loop step or 255.
  • inst ctrl may carry ring modulation ($04) / sync ($02); modevol bit 7
    = voice 3 off.
    Changed
  • The player now works every frame (tables, vibrato, PWM, gate timer,
    filter sweep). Filter routing is per voice: the voice that starts a
    filter-routed instrument owns cutoff / resonance / mode, $D417 routes
    every voice whose instrument is filter-routed. A tune blob is about
    2.5 KB of player code plus its data.
  • Same algorithm as the Visual Assembler SID editor's player; the new
    tests/tune_player.rs compares the SID registers frame by frame with
    a trace of the editor's engine.

2026-10-03 – Release 1.6.1: smooth scrolling maps

New

  • map view px, py: shows the loaded map at a pixel position, once per
    frame (instead of wait raster). XSCROLL / YSCROLL with 38 columns /
    24 rows, two screen buffers ($0400 / $3C00) swapped at char steps,
    the next char cell built two frames ahead, color RAM copied in two
    halves behind / ahead of the raster beam: smooth and tear-free in
    every direction. Sprite pointers are copied to both buffers.
  • map load reads a VisualAssembler Level Editor project (.bin) and
    composes its screens into one map (max 6x10 screens, 255x255 cells).
  • map load "file", addr: the map data goes to a fixed address (like
    incbin "file", addr) instead of inline in the code.
  • Compile errors: map view without map load, maps smaller than 40x25,
    program code reaching into $3C00-$3FFF.
  • Example: examples/level_scroll_demo.ub.

Fixes

  • A byte product or shift assigned to a word variable inside a sum
    was truncated to 8 bits (py = cy * 8 + fy gave 67 instead of 323
    for cy = 40, fy = 3); it is now computed in 16 bits, like a lone
    product. w = b shl n keeps 16 bits too.
  • A constant multiplier above 255 was cut to 8 bits (cy * 300); the
    16-bit operand now always takes the multiplicand side.