The decisions, in brief
Every structural choice in the project is recorded in a decision record (an ADR, for Architecture Decision Record). Here are the first 27, each summed up in one sentence, with the article that tells its story.
On this page
The foundations (13 October 2026)
| No. | Decision | Article |
|---|---|---|
| 0001 | Write an entirely new firmware, without building on Morpheus | The idea |
| 0002 | Put the whole kernel in the RP2040; leave the 6502 only a 2-byte call gate and its vectors | System calls |
| 0003 | Try an MMU in the bus controller — dropped after measurement (−34% speed) | The idea |
| 0004 | Write the HDMI and USB drivers for the project, without PicoDVI or TinyUSB | Video |
| 0005 | Run the RP2040 at 252 MHz by default — clock replaced by 270 MHz (0027) | The bus |
| 0006 | Serve the bus through PIO + DMA, with the address read in the low phase | The bus |
| 0007 | Produce DVI line by line, with no frame in memory; text read directly from the 6502’s memory | Video |
| 0008 | Read the USB keyboard with an in-house driver and deliver it to the 6502 without a system call | Keyboard and USB |
| 0009 | Read and write the USB stick’s blocks directly in the 6502’s memory | Keyboard and USB |
| 0010 | Read FAT32 with an in-house module and run programs from the USB stick | Files |
| 0011 | Describe the API in a single source, from which the documentation and the library are produced | System calls |
| 0012 | Write FAT32 through the kernel, at the 6502’s request, in a cautious order | Files |
| 0013 | Handle FAT12, FAT16 and FAT32 in a single module, for floppy disks | Files |
The system grows (14 October 2026)
| No. | Decision | Article |
|---|---|---|
| 0014 | Hibernate by taking a snapshot of memory and resume in the manner of setjmp/longjmp | Hibernation |
| 0015 | Cooperative multitasking with two 64 KiB spaces — partly replaced by 0018 | Multitasking |
| 0016 | Pre-empt through the NMI, borrowing 16 bytes for the duration of the interrupt | Multitasking |
| 0017 | Put the shell outside the firmware, and Ctrl+Tab switching in the kernel | Multitasking |
| 0018 | Divide process memory into 4 KiB pages, swapped at switching time | Multitasking |
| 0019 | Put to sleep processes waiting for a key or a timeout | Multitasking |
| 0020 | Run the real kernel on the PC, with Phosphoneo’s 65C02 core | The emulator |
| 0021 | Model the board’s PIO + DMA bus in the emulator | The emulator |
| 0022 | Simulate the video: the real DVI driver facing a simulated screen | The emulator |
| 0023 | Simulate the USB: the real driver facing simulated devices | The emulator |
| 0024 | Open an SDL2 window through a second executable, in 64 bits and in real time | The emulator |
| 0025 | Graphics as tile layers and sprites, with video memory outside the 6502 | Graphics |
| 0026 | Make the cores work together: core 0 draws, core 1 encodes | Graphics |
One signal (15 October 2026)
| No. | Decision | Article |
|---|---|---|
| 0027 | One signal for every mode: 720 × 480 at 60 Hz, RP2040 at 270 MHz from power-up to shutdown | Video |
What these decisions have in common
- Preserving the 6502’s memory. Almost every decision seeks to reserve nothing on its side: a 2-byte gate, text and graphics read in place, the keyboard in a queue in the program, an NMI that borrows its bytes and then gives them back.
- Measuring before adopting. The MMU was set aside on the strength of a figure; copying pages by DMA, which is faster, remained an option because it made a video line drop at start-up, one time in two, with no cause found.
- Not betraying the hardware. When the emulator could not run the real video driver in 64 bits, it was the emulator that changed (compiled as 32-bit), not the driver.