Skip to content
Eliott65wiki
Contents

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.DecisionArticle
0001Write an entirely new firmware, without building on MorpheusThe idea
0002Put the whole kernel in the RP2040; leave the 6502 only a 2-byte call gate and its vectorsSystem calls
0003Try an MMU in the bus controller — dropped after measurement (−34% speed)The idea
0004Write the HDMI and USB drivers for the project, without PicoDVI or TinyUSBVideo
0005Run the RP2040 at 252 MHz by default — clock replaced by 270 MHz (0027)The bus
0006Serve the bus through PIO + DMA, with the address read in the low phaseThe bus
0007Produce DVI line by line, with no frame in memory; text read directly from the 6502’s memoryVideo
0008Read the USB keyboard with an in-house driver and deliver it to the 6502 without a system callKeyboard and USB
0009Read and write the USB stick’s blocks directly in the 6502’s memoryKeyboard and USB
0010Read FAT32 with an in-house module and run programs from the USB stickFiles
0011Describe the API in a single source, from which the documentation and the library are producedSystem calls
0012Write FAT32 through the kernel, at the 6502’s request, in a cautious orderFiles
0013Handle FAT12, FAT16 and FAT32 in a single module, for floppy disksFiles

The system grows (14 October 2026)

No.DecisionArticle
0014Hibernate by taking a snapshot of memory and resume in the manner of setjmp/longjmpHibernation
0015Cooperative multitasking with two 64 KiB spaces — partly replaced by 0018Multitasking
0016Pre-empt through the NMI, borrowing 16 bytes for the duration of the interruptMultitasking
0017Put the shell outside the firmware, and Ctrl+Tab switching in the kernelMultitasking
0018Divide process memory into 4 KiB pages, swapped at switching timeMultitasking
0019Put to sleep processes waiting for a key or a timeoutMultitasking
0020Run the real kernel on the PC, with Phosphoneo’s 65C02 coreThe emulator
0021Model the board’s PIO + DMA bus in the emulatorThe emulator
0022Simulate the video: the real DVI driver facing a simulated screenThe emulator
0023Simulate the USB: the real driver facing simulated devicesThe emulator
0024Open an SDL2 window through a second executable, in 64 bits and in real timeThe emulator
0025Graphics as tile layers and sprites, with video memory outside the 6502Graphics
0026Make the cores work together: core 0 draws, core 1 encodesGraphics

One signal (15 October 2026)

No.DecisionArticle
0027One signal for every mode: 720 × 480 at 60 Hz, RP2040 at 270 MHz from power-up to shutdownVideo

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.

Sources in the repository : docs/adr/.