Please Insert Disk
The moment the emulator produced the message every ASR-10 owner knows — the machine asking for its operating system disk. A milestone and a cliff.
The Message
After all the patches and mocks — the DOC/DSP bypass, the eight delay loop NOPs, the SCSI scan, the keyboard wait patch — we let the emulator run with no cycle limit. The virtual LCD captured every string the firmware sent to the display. And there it was:
The complete LCD output sequence, from power-on to prompt:
[boot +0.0s]ENSONIQ ASR-10[boot +0.1s]SCSI INSTALLED[boot +0.2s]SEARCHING FOR SCSI DEV[boot +0.4s]PLEASE INSERT DISK[boot +1.4s]PLEASE INSERT DISK[boot +2.4s]PLEASE INSERT DISK[boot +3.4s]PLEASE INSERT DISK...The firmware is alive. It has completed its entire hardware initialization sequence — configuring the 68302 SIM, scanning the SCSI bus, setting up the serial channels — and reached the point where it needs to load its operating system from floppy disk. This is exactly what the real ASR-10 does when you power it on without a disk inserted. The machine sits there, patiently repeating the request, waiting for someone to feed it the OS.
The Boot Log
Here is the complete execution trace from power-on reset to the disk prompt — every major milestone the CPU hit along the way:
MOVE #$2700, SR; power-on reset68302 SIM init; configure chip-selectsROM remap: 0x000000 -> 0xFFF80000; SRAM stub executesRAM test: 512 KB OK; memory validatedCS registers configured; full memory map activeBSR $FFF8A0AE -> NOP NOP; [PATCHED] skip DOC/DSP initSCC event clear: FC2079 = 0x00; serial channels idleDUART handshake: 0xE7 -> ACK; front panel respondsDUART handshake: 0x71 -> ACK; display readyLCD: "ENSONIQ ASR-10"; splash screenJSR $FFFB8D6C -> NOP x8; [PATCHED] skip delay loopsSCSI probe: 0x410000; controller detectedLCD: "SCSI INSTALLED"; SCSI confirmedLCD: "SEARCHING FOR SCSI DEV"; bus scanBEQ * at FFFBB26C -> NOP; [PATCHED] skip keyboard waitLCD: "PLEASE INSERT DISK"; OS loading prompt...LCD: "PLEASE INSERT DISK"; repeating...The Missing Interrupts
With the firmware in its "PLEASE INSERT DISK" loop, we analyzed the I/O log to understand what the floppy controller interaction looked like. We expected to find the firmware polling an FDC status register at 0x408000 — the address we'd identified back in the first article as the floppy disk controller space.
The I/O log showed something unexpected: zero new peripheral addresses were being accessed. During the entire "INSERT DISK" loop, the firmware was not polling any FDC register. No reads from 0x408000. No writes. Nothing. The CPU was just updating the LCD and looping.
$ grep "408" io_log.txt | wc -l
0$ grep "INSERT DISK" io_log.txt | head -5
[cycle 8,402,118] LCD write: "PLEASE INSERT DISK"
[cycle 9,506,442] LCD write: "PLEASE INSERT DISK"
[cycle 10,610,766] LCD write: "PLEASE INSERT DISK"
[cycle 11,715,090] LCD write: "PLEASE INSERT DISK"
[cycle 12,819,414] LCD write: "PLEASE INSERT DISK" ; No FDC access. No polling. No register reads.; The firmware is NOT checking the floppy controller.This told us something fundamental about the ASR-10's architecture: the floppy disk subsystem is entirely interrupt-driven. The firmware doesn't poll the FDC to check if a disk is inserted. Instead, the WD1772 (or compatible) floppy disk controller generates a hardware IRQ when the disk-change signal activates — when a disk is physically inserted into the drive and the motor spins up. The 68302's interrupt controller routes this IRQ to the CPU, which vectors to the FDC handler that begins reading the disk.
This is elegant engineering. Polling would waste CPU cycles checking a status register thousands of times per second for an event that happens maybe once a minute. An interrupt-driven design lets the CPU do useful work (or idle efficiently) until the hardware says "a disk just arrived." Ensoniq's firmware engineers knew their 68302 well.
The Story in the Strings
The ROM's string table tells us exactly what happens after the interrupt fires. The complete disk loading narrative, encoded in ASCII and waiting to be triggered:
; The floppy disk boot narrative -- in order of execution"PLEASE INSERT DISK"; waiting for OS disk"LOADING SYSTEM"; FDC interrupt fired, reading sectors"DISK OPERATION SUCCESS"; all 412 blocks read, checksum OK; Error paths:"DISK DRIVE NOT READY"; FDC not responding"DISK NOT FORMATTED"; no valid filesystem found"BAD DISK/NOT EPS DISK"; wrong format (not Ensoniq)"DISK DATA CORRUPTED"; checksum/validation failure"O.S. DISK"; directory label for bootable diskFrom "LOADING SYSTEM" to "DISK OPERATION SUCCESS" — that's the path the firmware takes when everything works. The OS loads into RAM, all 577 functions become active, the effects engine initializes, and the full user interface appears on the LCD. The machine transforms from a boot loader into a musical instrument.
The Last Gate
The next frontier is clear: implement the 68302's interrupt controller. On the real ASR-10, the hardware interrupt chain works like this:
- A floppy disk is inserted into the drive
- The WD1772 FDC detects the disk-change signal and asserts its IRQ line
- The 68302's interrupt controller sees the IRQ, determines its priority level, and signals the CPU core
- The CPU reads the interrupt vector from the controller and jumps to the corresponding handler in ROM
- The handler initializes the FDC, reads the disk directory, finds
"O.S. DISK", and begins loading the 412-block OS image sector by sector
In the emulator, we need to simulate this entire chain. The 68302's interrupt controller needs to accept a virtual IRQ from a virtual FDC, prioritize it, and deliver the correct vector to the CPU. The FDC mock needs to serve sectors from our os_disk.img file — the 1.6 MB disk image we extracted back in the first article.
Perspective
Step back and consider what the emulator has accomplished. Starting from nothing but two raw EPROM dumps and a disk image, it has traversed the entire ASR-10 boot sequence:
- 68302 SIM — chip-select configuration, ROM remapping, memory map setup
- ES5506 DOC — wavetable synthesis engine detected and bypassed
- ES5510 DSP — microcode upload protocol identified, 160 instructions captured
- 68681 DUART — front panel serial protocol decoded, handshake completed
- 68302 SCC — keyboard and MIDI channels initialized
- NCR 5380 SCSI — bus scan completed, device detection working
- LCD display — splash screen, status messages, disk prompt all rendering
Every peripheral along the way has been identified and mocked well enough for the firmware to reach this point. The 1.6 MB OS disk image sits ready in roms/os_disk.img. The interrupt controller is the last gate between the emulator and a fully loaded ASR-10 operating system.
Somewhere in that ROM, there's a function that reads the interrupt vector, jumps to the FDC handler, spins up the drive motor, steps the head to track zero, and begins reading sectors. Somewhere in the OS image, there are 577 functions waiting to wake up — the waveform editor, the effects engine, the sequence recorder, the MIDI processor, the entire musical brain of the ASR-10.
The machine is asking for its disk. We just need to teach the emulator how to hand it over.
This project is ongoing. The emulator has reached the OS loading prompt — the furthest any known ASR-10 emulation effort has gone. The interrupt controller implementation is next, followed by the FDC sector-serving protocol. Follow along as the ASR-10 comes back from the dead, one interrupt at a time.
