Dokumentation › LOCI
LOCI — Lovely Oric Computer Interface
Emulation des LOCI-Geräts von Sodiumlightbaby (sodiumlb, 2024): eine RP2040-Cartridge, die auf den Bus des Oric gesteckt wird und Massenspeicher (USB / SD / interner Flash), USB-HID-Tastatur-Maus-Gamepads, ein WLAN-Modem (PicoWiFiModemUSB), ROM-Wechsel zur Laufzeit und ein integriertes Menü bietet.
Referenzen: loci-hardware · loci-firmware · loci-rom (Menü). Die Emulation ist auf die Firmware-Quelle abgestimmt (Referenz-Release: v0.3.1) und auf Hardware verifiziert; bekannte Abweichungen sind am Ende aufgeführt.
Schnellstart
# LOCI + picowifi-WLAN-Modem (ACIA 6551 bei $0380, adressiere $0380 NICHT $03A0)
./oric1-emu -r roms/basic11b.rom --loci --serial picowifi
# LOCI-Menü direkt beim Booten
./oric1-emu -r roms/loci/locirom --loci
# Rohes FAT16/32-SD-Image als Speicher
./oric1-emu -r roms/basic11b.rom --loci --loci-sdimg karte.img
Speicherkarte
| Fenster | Inhalt |
|---|---|
$0310-$031F | WD1793 + DSK-Steuerung (LOCI-Microdisc-Modus; $0319 = 'L') |
$0315-$0317 | Low-Level-TAP-Protokoll (PLAY/REC/READ_BIT, 14-Bit-Frame) |
$0380-$0383 | ACIA 6551 (picowifi-Modem) — Standard unter --loci |
$03A0-$03BF | MIA: UART-Konsole, API-Register (xstack $03AC, errno $03AD/E, op $03AF), Stub $03B0 (spin/BLOCKED), BUSY $03B2 Bit 7, Tasten-Trap $03BA-$03BF |
API (op $03AF) — 36/36 Ops implementiert
System (PIX_XREG, CPU_PHI2→1000 kHz, OEM_CODEPAGE, RNG_LRAND,
STDIN_OPT), Uhr (CLOCK, CLK_GET/SETTIME, GETRES), Dateien
(OPEN/CLOSE/READ/WRITE_XSTACK/XRAM/LSEEK/UNLINK/RENAME), Verzeichnisse
(OPENDIR/CLOSEDIR/READDIR/MKDIR/GETCWD), Mounten (MOUNT/UMOUNT, TAP
SEEK/TELL/READ_HEADER, UNAME), Boot/Tuning (MIA_BOOT, MAP_TUNE_*,
ADJ_SCAN), Sentinel $FF (exit → spin).
Firmware-konforme ABI (gegen die Quelle verifiziert)
- errno: Dateisystemfehler =
32 + FRESULTFatFS (fehlende Datei → 36, fehlendes Verzeichnis → 37, verweigert/nicht-leer/voll → 39, existiert bereits → 40…); Codes 1-18 sind für API-Fehler reserviert (EBADF,EMFILE,ENODEV,ENOSYS, Escape-Guard) — genau wie dieapi.hder Firmware. - Deskriptoren: Dateien 3-18 (FAT,
STD_FIL_OFFS=3), Verzeichnisse 64+ (FD_OFFS_FAT); der Geräte-Iterator ist fd 0 (FD_OFFS_DEV). - xstack: 512 Bytes, konforme Push/Pop und NUL-lose Strings.
MAP_TUNE_*: Wert im Register A; A ≤ 31 stellt die Verzögerung ein, jeder andere Wert ist eine Abfrage; die Op gibt stets den aktuellen Wert in AX zurück.ADJ_SCANscannt tior 0-31 (~100 ms + 5 ms/Schritt) mit im ROM-Byte$FFF0sichtbarem Fortschritt.
Speicher
Der echte LOCI hat drei Ebenen; ihre Entsprechungen in Phosphoric:
| Echte Hardware | Emulation |
|---|---|
Interner Flash (RP2040-LittleFS, vorbelegt mit basic11b.rom,
basic10.rom, microdis.rom, locirom) |
Flash-Root: --loci-flash DIR (Standard: aktuelles Verzeichnis). 0:- und
nackte Pfade. Im Flash-Root fehlende System-ROMs werden als Fallback im Ordner des -r-ROMs aufgelöst (also
roms/). |
| USB-Stick (FAT, Host-USB-Port) | --loci-usb DIR (wiederholbar, max. 4) oder Autoerkennung der in
/media/$USER und /run/media/$USER gemounteten Medien beim Start. Volumen-Pfade
1:-4:. Label + Größe im Menü. Kein Hot-Plug: vor dem Start einstecken. |
| SD-Karte (rohes Image) | --loci-sdimg PATH (FAT16/32). Wenn aktiv, besitzt dieses Backend alle Dateioperationen (USB-Sticks
bleiben gelistet, aber nicht navigierbar). |
Die Geräteliste (Menüauswahl) wird von opendir("") geliefert: „0: Internal storage
[15MB]“, dann eine Zeile pro USB-Gerät (der MSC-Stick, das picowifi „CDC modem mounted“), dann ein leerer Name.
Aktionstaste (F8)
Das Firmware-Verhalten (ext.c) wird reproduziert:
- Kurzer Druck: Sitzungs-Snapshot (→
<Flash-Root>/loci_resume.ost), IRQ-Trap$03BA, dann Boot des LOCI-Menüs (lociromaus dem Flash-Root, Fallbackroms/loci/locirom). Wie die echte Firmware werden die FW-Version (0.3.1) und die Timings ins ROM gepatcht, an den Platzhaltern$FFF7-9/$FFEF-F3. Der Resume-Eintrag des Menüs wechselt das vorherige ROM zurück und stellt den Snapshot wieder her. F8 im Menü wird ignoriert. - Langer Druck (≥ 2 s): Boot des Diagnose-ROMs von Mike Brown
(
roms/loci/test108k.rom, v1.08k, in echten Firmware-Builds mit seiner Erlaubnis enthalten). Schrittweiser CPU/ULA/DRAM/VIA/PSG-Test. - Im
--control-Modus: der Befehlloci-button [long]. - F5 = MIA-Reset (Register/xstack/op) unter Beibehaltung der Mounts, wie die Reset-Taste des Pico.
MIA-Bus-Timing
Die MIA tastet den 6502-Bus per PIO an von MAP_TUNE_* eingestellten Sub-Takt-Offsets ab. Ein falsch
abgestimmter tior beschädigt das ACIA-Fenster des picowifi — ein echtes Hardwaresymptom, reproduziert:
--loci-mia-window LO-HI definiert den zuverlässigen Bereich (Standard 0-31 = immer zuverlässig); außerhalb
des Fensters liest $0380 $FF und ignoriert Schreibvorgänge.
Bekannte Abweichungen (außerhalb des Umfangs)
- Interner LittleFS-Flash nicht als solcher emuliert — der Flash-Root übernimmt diese Rolle mit FAT-Semantik.
- Firmware-Dev-Verzeichnis „0“, der echte ULA-Pattern-Matcher, BUSY während einer langen Op beobachtbar.
- USB-Erkennung nur beim Start (kein Hot-Plug).
- Der
dsk_fdcvon LOCI bleibt bei schnellem FDC-Timing — getreu: Auf echter Hardware ist sein „Laufwerk“ der RP2040 + SD, ohne Mechanik (der Microdisc verwendet hingegen standardmäßig echtes mechanisches Timing).
Reproduziert aus docs/loci.md (maßgebliche, aktuelle Version auf GitHub).