Hi folks,
Today, v1.3.6 of The HoneyCrisp Emulator has been released!This update to my ECMAScript APPLE-1 emulator is substantial and includes a lot of great improvements and bug fixes.Here's a changelog for those who are curious:
What's New
Microsoft BASIC ROM Support
A new "Enable Microsoft BASIC ROM" option has been added to Settings under BASIC ROM Options. When enabled, Microsoft BASIC occupies the $E000-$FFFF address space (8KB) and is launched with E000R. Because the two ROMs share the same address range, Microsoft BASIC and Integer BASIC cannot be enabled simultaneously. That said, enabling one automatically disables the other, both in settings and when loading a BASIC program from the Program Catalog that specifically requires Integer BASIC. In this situation, HoneyCrisp Emulator now temporarily and silently swaps in Integer BASIC to run the program, then automatically restores Microsoft BASIC the next time the system is reset (a small on-screen banner explains this when it happens, similar to how Enhanced BASIC swapping temporarily for AppleSoft BASIC has in the past)...
Fully Accurate BRK / IRQ Vectoring
BRK and IRQ no longer incorrectly vector into WOZMON at $FF00. CPU.BRK() has had its post-vector-fetch logic removed. Previously, after loading the PC from $FFFE/$FFFF, the emulator would detect PC === 0xFF00 and either rewrite the PC by scanning RAM for a non-zero byte, or force-set wozmonActive to TRUE. BRK now performs standard 6502 behavior exclusively, which is as follows: push PC+2, push status (B set), set I, load PC from $FFFE/$FFFF.The now-dead returnAddr variable has also been removed, as it's no longer needed...
WOZMON Vector Table No Longer Clobbered
loadWozmonROM() has had three lines removed that manually overwrote the NMI, RESET, and IRQ/BRK vectors at $3FA–$3FF to $FF00 after the WOZMON ROM was already loaded. The ROM image's own vector table (NMI=$0F00, RESET=$FF00, IRQ/BRK=$0000) is preserved as-is. A duplicate copy of the same override in the boot sequence's krusaderROMDisabled branch, has also been removed because it was re-stomping the vectors back to $FF00 a second time after loadWozmonROM() already ran.
POST Vector Test Corrected
The IRQ/BRK vector POST ROM test's expected value has been updated from "non-zero" to $0000, matching real hardware.The old test had been written to validate the incorrect $FF00 behavior described above.
Compatibility Layer for Older Browsers
Testing v1.3.6 surfaced a rendering issue on older browsers.... a broken layout was observed running on OS X 10.14 with Safari 14.1.2 which was caused by the interface's Tailwind CSS not being understood by browsers that predate Tailwind v4 CSS support. HoneyCrisp Emulator will now detect a "dated" browser and automatically load Tailwind CSS v3 instead of v4, restoring a usable layout for backwards compatibility.
New File Loader Formats: .apl, .hex, .woz, and .tur
The main file-loader has been expanded with support for several new file formats, in addition to TurboType's .tur files described below: .apl, .hex, and .woz. File-type detection and routing has also been consolidated into a new central dispatchProgramFile() router, with detectProgramType() and detectBasicVersion() helpers used to automatically identify what's being loaded. NOTE: .woz is not the Disk ][ formatted file type.In the context of APPLE-1 emulation, .woz files usually contain WOZMON hex listings
Intel HEX (.hex) File Support
Added a proper Intel HEX parser (parseIntelHex() / loadHexFile()), so .hex files can be loaded directly into the emulator, including support for extended linear/segment address records.
BASIC Interpreter Selection Prompt
When loading a program from the Program Catalog that requires a BASIC interpreter, HoneyCrisp now shows a "SELECT BASIC INTERPRETER" dialog letting you choose between Integer BASIC, Applesoft Lite, or Enhanced BASIC, instead of silently assuming Integer BASIC. (So programs written for different interpreters can run properly from drag+drop.)
Ctrl+C Break Shortcut (Microsoft BASIC only)
Pressing Ctrl+C now sends a Break signal, equivalent to clicking the BREAK button.This shortcut is only intended for, and only works with, Microsoft BASIC.As such, it has no effect on Integer BASIC programs.
Program Catalog: Local Downloads
Programs in the Program Catalog can now be downloaded straight to your computer instead of only being loadable into the emulator.(Finally brought this back. lol) Each catalog entry has a Download button alongside its existing favorite and run controls, which fetches the program's file and saves it locally.
Program Catalog: Delete Button for "Custom" programs
If you add a program via the "+ ADD YOUR OWN PROGRAM" button in the program catalog, a trash-can icon will appear to the right most side of the entry, allowing you to delete the program from the catalog if desired.
JMON ROM Storage Optimization
The JMON monitor's program data, previously stored as a large WOZMON hex dump, is now stored as a base64 blob and decoded at load time.
Smoother Character Output Pacing
Character-by-character screen output now uses an accumulator (charOutputAccumulator) for more accurate print pacing frame-to-frame, and pasted text is printed at roughly 10x the normal typing pace instead of the standard rate.
Minor UI & Housekeeping
- The CFFA1 "unsaved changes" indicator changed from a
●dot to a(!)for clarity. - Documentation PDF links were updated to the latest revision.
- The KIL-instruction console warning now logs only once instead of repeating on every occurrence.(Which originally caused major slowdowns on the page.)
Cursor Blink Rate Now Follows CPU Speed
The blink rate for both the text cursor and the _@ startup pattern was previously fixed at a constant 350ms regardless of the CPU Speed slider. It now scales with the selected speed multiplier, so the blink speeds up or slows down along with the emulated clock.
Blink Rate Safety Cap
To prevent the blink from scaling into a flicker range that could pose a photosensitive seizure risk at high CPU speeds, the blink interval is now clamped to a 250ms minimum (never faster than a 2Hz full on/off cycle), no matter how high the CPU Speed slider is set.
Uncle Bernie's TurboType Data Transfer Protocol
Added support for .tur files, implementing Uncle Bernie's TurboType two-phase loading protocol. .tur files are now routed to loadTurFile() from the main file-loader dispatcher, alongside the newly-added .apl and .hex handlers and the existing .bas handler.
- Phase 1: Emulator auto-types a "Stack Sanitizer" at
$0003, then the Turbo Loader at$0100, both via keystroke injections which matches how the loader is bootstrapped on real hardware. - Phase 2: once the loader is resident and running, the
T / Xpayload block is fed at full speed through the emulated UART ($C300/$C301), bypassing WOZMON's echo loop entirely for a faster transfer. - CRC-CCITT (XMODEM variant): this is the verification of data transfer. If CRC-CCIT fails, EE is displayed on the monitor.
- Loader residency tracking: a second
.turload in the same session detects that the Turbo Loader is already resident and skips straight to100Rinstead of re-typing it, matching real-hardware behavior. - Backward compatibility: plain address:bytes
.turfiles without explicitT/Xmarkers are automatically wrapped into a synthetic T-to-X block, so older files still load correctly.
Program Catalog Additions
- ASCII to HEX Printer (originally by Tom Owad)
- Apple Computer Letter (a digital letter to Apple Computer Company written by Dean W. Phillips)
- Intruder (originally by guibrush of applefritter.com)
- Pascal's Triangle Generator (originally by Landon J. Smith)
- Timberman (Tape) (originally by zapcurcuit of applefritter.com)
The HoneyCrisp Emulator Technical Documentation has been updated!
This revision (F4) of the technical documentation fixing minor formatting issues and changes out the ASCII map reference for the one featured in the SIGNETICS 2513 datasheet/manual.
It is included with this release of HoneyCrisp Emulator.
Bug Fixes
Clock Frequency Calculation
Fixed a bug in the Clock Frequency readout where the reported kHz value was computed directly from the raw cycle count without dividing by the actual elapsed time, skewing the displayed number whenever a measurement interval ran slightly long or short. The calculation is now properly normalized against elapsed seconds.
Clock Frequency Throttled During Rapid Printing
Fixed a bug where the emulator's actual execution speed and the displayed Clock Frequency would drop sharply (down to single-digit kHz) during any print-heavy output, such as the Apple 30th Anniversary program demo, regardless of the CPU Speed slider setting. This was caused by a fixed video-queue back-pressure cap (VIDEO_BACKPRESSURE_CAP) that stalled CPU execution almost immediately every frame once a couple of characters queued up, independent of the selected speed. The cap is now sized relative to the per-frame cycle budget instead of a fixed constant, so it only acts as a safety valve against genuinely runaway output rather than throttling normal execution at higher speeds.BIG shoutout to @UncleBernie! Without him, The HoneyCrisp Emulator would not have TURBOTYPE™! Big thanks to @egrath as well! He provided me with a compiled ROM of MS BASIC for use with HoneyCrisp.HoneyCrisp Emulator 1.3.6 on Github
HoneyCrisp Emulator v1.3.6 at landonjsmith.com
Cheers,
Landon