Skip to content

Casso 1.23.0

Choose a tag to compare

@github-actions github-actions released this 06 Sep 10:52

Added

  • A speech demo disk, in hi-res and double hi-res: three film lines and
    Daisy Bell through the SSI 263A, under a HAL 9000 panel whose eye pulses on
    each syllable. Boot Apple2/Demos/mockingboard-speech-demo-dhgr.dsk.
  • The assembler writes its binary straight into a disk image. --disk <image> places the object on a volume instead of a host file, --startup
    runs it at boot, and the origin comes from the assembly rather than a
    restated --load. Source to a running machine in three commands, not six.
  • Casso detects external changes to mounted disk images. A build writing
    onto a mounted image reaches the running guest with no eject and re-insert.
    --on-change reload|reboot, on both assembler dialects and on disk put,
    specifies what happens; without it you get a prompt. The drive door reacts
    with its sounds as it does to a disk swapped by hand.
  • Conflict resolution when a mounted disk changes on both sides. The
    external changes are kept, Casso's own writes are saved to a timestamped
    copy alongside, and Casso asks which to mount.
  • A disk whose file is deleted or becomes unreadable offers to save what is
    still in memory.
    Casso writes a complete image wherever you choose and the
    drive keeps running on it. Decline and the drive is emptied.
  • Merlin gains SAV, multiple DSK directives and TYP, so one assembly
    can produce several binaries, each with its own ProDOS file type. An
    assembly with several outputs now produces a listing per object, named after
    the binary it describes and holding that object's code and equates.
  • GH #132: screenshots are saved to a file, and can be taken of the
    CRT-processed picture rather than only the raw framebuffer.
    The camera
    button, Edit > Copy screenshot and Ctrl+Alt+C write a PNG into
    Pictures\Casso Screenshots as well as copying to the clipboard. A capture
    mode on Settings > Printing and Screenshots chooses among the full scene,
    the screen alone with its CRT effects applied, and the raw 560x384 image at
    native resolution. Each PNG carries the machine, the monitor, the CRT
    parameters and the scene pose in its own metadata, and never a filesystem
    path or anything identifying the host. Saving can be turned off and the
    folder changed.
  • Theme and monitor-color pickers on the command bar, beside Settings.
    Both preview live as you move down the menu, by mouse or by arrow key, and
    put back what was there if you dismiss it. The pick is remembered.
  • A full screen button on the command bar, before Screenshot, which reads
    "Exit full screen" once you are in it.
  • Frame rate and scene pose readouts on the View menu, off by default.

Changed

  • Mockingboard speech runs at the rate the datasheet specifies. It ran 75%
    too slow, so any speech a title produces is faster and higher in tempo than
    in earlier releases. The speech smoke-test disk moves to the chip's slowest
    rate, the nearest the hardware reaches to its original pacing.
  • Direct-boot disks load about six times faster. disk create --boot laid
    the payload down in ascending sector order and the loader lost a revolution
    per sector; it now reads every other sector, so a track costs two
    revolutions instead of sixteen. A 38-sector demo boots in 4.2s, not 10.7s.
  • Merlin's -l listing flag takes multiple files, named after the binaries
    they generate. Listings no longer go to stdout.
  • The command bar narrows one button at a time. As the window shrinks,
    buttons drop their labels from the right, so the leftmost keep their names
    longest and nothing is pushed off the end. The input devices give up their
    LED row for a single icon at the same point, and the theme, monitor-color
    and input menus check the setting they are on, so a collapsed button still
    says where it stands.
  • 2D themes now use a richer drive widget. The disk name is the control,
    and its LED tracks where the head is sitting rather than only showing that
    the drive is busy. Clicking the name ejects the disk and offers a new one,
    which used to take a trip to the Disk menu.
  • Replaced the full screen icons with diagonal arrows.
  • The pointer-capture and screenshot notices moved out of the middle of
    the picture.
    Both were shadowed text across the bottom of the viewport,
    which read as a caption over a flat theme's black field and, over a
    screenshot, put the one part of the shot that is about Casso into the
    photograph. They are a message bar under the docked chrome now, hanging over
    the picture behind a thin scrim so the picture keeps its height. The desk
    scene keeps a shadowed caption for pointer capture, moved clear of the
    drives onto the lower part of the CRT.
  • Massively faster startup. Startup drops from ~20s (debug build) to under
    1s and the executable is ~80% smaller, by prebuilding object meshes,
    optimizing tessellation and precompiling shaders.
  • Casso's windows open next to the emulator rather than at a Windows
    cascade position. Settings and the disk picker sit against its left edge,
    the printer preview against its right, and dialogs open centered on it.
  • The keyboard map describes the machine you are running, in aligned
    columns,
    and carries only what the menus cannot say. Rows name only keys
    that machine actually has, so a ][+ is no longer told about the open Apple
    key, Delete or the arrows it lacks, and the dialog sizes itself to what is
    left. Gone are six accelerators the menus already print and the rows mapping
    keys to themselves.
  • Casso draws the Apple keys as the keycaps do. Wherever the chrome names
    the open or closed Apple key, the apple symbol now sits beside the words.
    The two keycaps differ only by fill, which no shipping font can express, so
    Casso embeds a two-glyph font of its own; the symbols are ordinary
    characters and work anywhere text does.
  • Ctrl+R no longer resets the machine. It duplicated the menu's
    Ctrl+Shift+R, and because the shell claimed the keystroke no Apple program
    could receive a Ctrl+R of its own.
  • The input mapping is remembered per machine rather than globally, so a
    //e set up for a joystick and a //c using its mouse each keep their own.
  • A machine's monitor key takes a vendor-qualified identifier.
    MonitorII and MonitorIIc are now AppleMonitorII and AppleMonitorIIc.
    A machine JSON carrying an old identifier falls back to the default monitor.
  • Themes are listed most skeuomorphic first in Settings rather than
    alphabetically.
  • Casso uses the show state passed by its launcher, so a background launch
    no longer takes the foreground, and window placement is saved only when the
    user moves or resizes the window.
  • A drive's door opens from anywhere in the finger notch. In the 3D themes
    the whole recess takes the click, on the Disk ][ and the Disk //c alike,
    rather than only the stretch of it the door covers.

Fixed

  • The synthesized voice was missing its fundamental. The glottal source
    broke at 805 Hz, inside the pitch range instead of well below it, so lip
    radiation tilted the output upward across the whole F1 region. Measured
    against a recording of a real SSI-263: the chip's voiced spectrum falls
    monotonically from the fundamental at about -8 dB/octave, ours was flat. The
    break now sits below the pitch range and follows the device rate, which also
    stops timbre depending on the listener's audio hardware.
  • Voiced fricatives came out as sonorants, so Z sounded like L. The
    phoneme table collapsed the chip's two source amplitudes into one, and
    frication was cascaded through the vowel formants, so Z's own F2 stood as a
    low-pass in front of its own hiss. Frication now runs in a parallel branch
    with the two amplitudes kept apart, putting 33 dB between Z and L where
    there had been none.
  • Fricatives were harsh, and the voice was too bright throughout. The
    noise source was smoothed only to 8 kHz, so it was very nearly white, and
    was then run through a high-pass that brightened it further. That high-pass
    is gone, the source is band-limited, and the output low-pass is tightened to
    match the real chip. Across six bands, mean error against that recording
    falls from 9.9 dB to 4.9 dB.
  • The voice chip's request line reaches the second 6522, not the first.
    Each speech socket interrupts through the other channel's VIA, so the chip
    at $Cn40 latches CA1 on the VIA at $Cn80-$CnFF. Casso raised it on the first
    one, where an interrupt-driven speech driver never looks, and where the
    speech writes would have clobbered the register it was watching.
  • The Mockingboard's speech registers no longer read back the voice chip.
    $Cn40-$Cn44 are decoded for writes only; a read returns the first 6522.
    Casso spliced the chip's request bit into D7, so software that polled for it
    worked here and hung on a real board. Reading it back is a Phasor facility.
  • Powering the voice chip down clicked. Its output was cut mid-cycle
    rather than falling over the release, so every spoken line ended on a click.
  • Eight-bit scratch buffers banded the picture's dark gradients into flat
    steps.
    The CRT chain ran up to eight full-screen passes through eight-bit
    intermediates, and a bloom halo falling off over hundreds of rows spans
    three or four code values, so the first pass to round it turned the ramp
    into that many full-width contours and every later pass inherited them.
    Fullscreen made each band wider. The chain now works in ten bits, which
    costs no extra bandwidth, and dithers once on the final blit; the desk
    scene's plates dither at their own eight-bit write, and blits that merely
    carry a finished plate leave it alone. Measured fullscreen on the boot
    screen, counting rows that are a single flat code across the full width: 582
    of 601 before, at most a handful now.
  • Bloom washed out dithered pictures. It was applied to every pixel rather
    than to bright ones, so on dithered artwork every dark gap had a lit
    neighbor and the gaps filled. Only pixels above a brightness threshold feed
    the bloom now, which is what a phosphor does.
  • Bloom and color bleed changed with the window size. Both were measured
    in output pixels, so the same settings tightened as the window grew. They
    are measured in pixels of the emulated screen now and cover the same share
    of the picture everywhere.
  • The bloom radius slider offered a range nobody could use, running to 10
    in whole steps where the useful span ends around 4. It runs 0.5 to 4.0 and
    drags in tenths. The color bleed width likewise rounded to whole pixels,
    which pinned every theme at 1 px; it reads and drags to a tenth.
  • Changing one CRT setting no longer freezes the others, and switching
    themes applies the new theme's CRT defaults. Touching any Display control
    used to pin the whole block as a user override, so every later theme change
    was ignored. Restore defaults also skipped the per-machine overrides merged
    on top of a theme's base values.
  • Double hi-res colors now match the hardware. The color clock runs one
    dot ahead of the byte boundary, so the last dot of a cell is the color's low
    bit; reading the dots as a plain binary number showed magenta as brown and
    orange as green, on every real double hi-res picture.
  • Lo-res, double hi-res and hi-res now share one palette. Colors 3, 6, 9
    and 12 were drawn differently by mode, and color 4 (Dark Green) drew very
    nearly black. The casso-rocks image was regenerated against the corrected
    palette.
  • 80-column text under mixed mode doubled the aux column while a program
    had PAGE2 on for its own aux writes. The overlay read main through the bus,
    which 80STORE bends to aux; it reads the bank directly now.
  • The wrong number of scanlines was drawn outside the 3D desk scene. The
    192 lines an Apple II draws were spread over the whole window rather than
    the picture, so the count followed the window size: 104 at 900 pixels, 141
    at 1500. Every presentation draws 192.
  • Full screen hid the top and bottom of the picture on a widescreen
    display.
    The camera was placed so the monitor's glass covered the screen,
    and the glass is about 1.4:1, so 16:9 cropped about a dozen scanlines at
    each end. The camera now moves back far enough to fit the whole picture;
    beyond about 3:2 only the tube is drawn, against black.
  • The //e and //c could not type lowercase. Every letter was folded to
    uppercase on its way to the keyboard latch, on machines whose whole keyboard
    advance was lowercase. Pasted text was folded the same way.
  • The ][ and ][+ received keys their keyboard has no way to send. Up and
    down arrows, TAB and DELETE all arrived with the //e. Pressing one is now a
    no-op: nothing latches, and $C010 no longer reports a key held. Which keys a
    machine has is asked of the key itself, so Ctrl+I, Ctrl+J and Ctrl+K keep
    working on a ][+.
  • A held key repeated far too fast above 1x speed, and at Maximum too fast
    to type against at all.
    Auto-repeat was counted in emulated cycles, so
    emulation speed dragged it along. It is timed in real seconds now, as the
    //e's own encoder is, so the ~0.5s delay and ~15 characters a second hold at
    every speed.
  • Ejecting or quitting could throw away writes while saying they were
    safe.
    If another program had rewritten a mounted image and Casso could not
    save your version beside it, the message said your writes were still in
    memory, and then the drive was emptied or the program exited. Both now offer
    to save the disk wherever you choose, and a decline says plainly that the
    changes are going.
  • Two Casso instances sharing a disk image could corrupt it. Saving writes
    a temporary beside the image and renames it over the original, and the
    temporary's name came from the image path alone, so both instances used the
    same one.
  • The same disk image could be mounted in both drives at once. Each drive
    held its own copy from that moment, so whichever wrote last overwrote the
    other. The second drive now refuses it and says which drive has it.
  • Answering the "disk modified outside Casso" question could act on the
    wrong disk,
    because the answer was carried out against whatever was in the
    drive. A question now holds the drive until it is answered, and the answer
    lands on whatever is on disk when it comes.
  • The question never appeared if any dialog was open. Settings, a file
    picker or the About box swallowed it, and that drive was never asked about
    again. Notifications and mount results went the same way, as did a question
    raised before the main window existed.
  • A dismissed question dated the next copy after it. Putting the question
    reserves the timestamped name a preserved copy would take, and waving it
    away left the name held, so a genuine conflict hours later filed the guest's
    disk under the old timestamp. A reservation no longer outlives the disk it
    was made for.
  • Pressing Enter on "mounted disk has been removed" discarded the disk, as
    did closing the dialog, when the copy in the drive was the only one left.
    Both now offer to save it, and only an explicit Discard lets it go.
  • A disk that could not be moved out of the way was sometimes announced with
    nowhere to go.
    When the rescue copy cannot be written Casso asks where to
    put it instead; it only asked when the change came from the file watcher,
    not when the guest's own write found it. A missing disk found partway
    through a reload likewise offered buttons that did nothing, because the
    offer went to the notice strip, which routes no answers.
  • The "disk modified outside Casso" notices were rewritten, and carried
    two false claims: a renamed copy that was never written, and CassoCli named
    as whatever program had changed the file. The disk and its drive now lead on
    a line of their own and all four notices report the copy the same way.
  • A settings file Casso could not read was overwritten anyway. It is saved
    as UserPrefs.<date-time>.original.json and a fresh one started; if it
    cannot be set aside, nothing is written over it.
  • Settings changes that could not be saved reported success. The sheet
    closed as though it had written them, leaving Cancel nothing to revert to.
  • Old settings files that could not be read cost you the ones that could.
    One unreadable file failed the whole upgrade. Casso now carries across what
    it can and reports what it left behind.
  • Global settings could be reset to defaults on launch. A remembered disk
    whose file was gone made startup rewrite the preferences to clear the stale
    path, and that write replaced the whole global section with defaults.
  • Pressing OK in Settings reset preferences that its pages do not show,
    including the //c case-switch positions. The volume and mute settings were
    not saved at all, and unchecking a second drive did not persist. The
    preferences file also grew a duplicate monitor-tilt entry on every save;
    existing files repair themselves on the next save.
  • Casso started up regardless of what was on its command line. A mistyped
    flag, a misspaced one, a stray disk image path and --help were all
    discarded in silence, so Casso --machine Apple2e --dsik1 work.dsk ran
    whatever disk was mounted last. An argument Casso cannot read now stops
    startup and shows the reason above the full usage text, and every form of
    --help shows that text and exits.
  • A failed stock boot-disk download is reported instead of exiting or doing
    nothing.
    The boot and insert disk pickers report the reason and come back.
    A startup failure that used to be queued for a window that never appeared is
    shown before Casso exits. The disk create --bootable diagnostic for a
    missing master now points at Casso's disk picker rather than a first run of
    the emulator, which downloads nothing.
  • GH #137: audio follows a change of the default output device. It was
    resolved once at startup, so selecting a different speaker left the sound on
    the old one until the next launch. Sounds are re-decoded when the new device
    runs at a different sample rate.
  • Audio broke up on interfaces running at very high sample rates. The
    pending-audio backlog is sized from the rate the endpoint reports, and that
    calculation overflowed above roughly 252 kHz, so 352.8 and 384 kHz wrapped
    it to about a third of the intended depth.
  • Full screen now hides the chrome in every theme. Dark Modern and Retro
    Terminal kept the caption, menu bar and drive bar around a stretched
    picture. They now collapse the way the desk scene does. The top-edge reveal
    also brought the toolbar without the menu bar, leaving it unreachable; the
    menu bar rides down above it now.
  • The flat themes drew a stale input-mode bar. The joystick, paddle and
    mouse selector moved to the command toolbar, but a second copy stayed in a
    band above the drive widgets. That band is gone, so the drives sit directly
    under the picture and the window is 43 dp shorter.
  • Settings text was white on the Retro Terminal and Dark Modern themes. A
    label built as a plain member and given its words afterward painted with a
    hard-coded white rather than the theme's own text color, and whole settings
    pages are built that way.
  • The input indicator dots stayed blue under every theme, painting from a
    hardcoded copy of the DarkModern palette while the drive LEDs beside them
    followed the theme. The input icons were also drawn larger than the rest of
    the command bar's, unlit LEDs were too dark to make out, and switching to an
    Apple //c through Settings left the mouse out of the row.
  • Tooltips kept the theme that was live when the window was built, could
    lose their last glyph to a balloon sized a hair too narrow, and the Reset
    and Power tips said only what the button said. The tips now name the machine
    they act on, and Reset gives the open-apple chord for a cold boot.
  • The scene compass and the 3D CRT monitor checkbox showed under the flat
    themes,
    which draw no desk for either to act on.
  • The mounted disk's name drew through the monitor's case. The name under
    each 3D drive was chrome painted after the scene, so nothing could stand in
    front of it. It is a camera-facing quad in the scene now, sized to a fixed
    number of screen pixels and depth tested like any other surface, so the case
    cuts it exactly where the case crosses it.
  • The input events panel's two paddle view combo boxes let the buttons
    behind them show through their open list.
    Their menus open in a top-level
    popup window, as every other combo box in Casso already did.
  • A window with no client area buried the screen in assertion dialogs.
    Every control laid out against a minimized window came out zero DIPs wide,
    and a text field insetting that by its own padding passed a negative width
    to DirectWrite, which refuses one. Being a paint, it failed again every
    frame. Text is no longer drawn into a box with no area, and a failed
    assertion is shown once per run and never on top of another one.
  • Ctrl+0 puts the whole view back: the window to 100%, the machine facing
    front, the scene at its default zoom and the bezel tilt reset. Resetting the
    window and resetting the scene used to be two commands on two chords, one of
    which did nothing at all under the flat themes.
  • The startup download dialog broke "OpenEmulator (GitHub)" across two
    lines.
    Its source column was a fixed width; it is measured from the labels
    the list carries now.
  • Monitor II model: tube-to-bezel gap at steep angles, the bezel opening's
    contour, power LED spill onto the case beside its notch, power button and
    funnel seating.
  • The write-protect padlock beside a disk's name in the 3D scene was
    distorted.
    It uses the emoji lock character now, to avoid conflicting with
    the text shadow effect. The 2D drive widget uses the same padlock.
  • Chrome text could be painted over by the controls under it.