Phosphoric — funciones detalladas
Emulador ORIC-1 / Atmos de ciclo exacto · escrito en C11 · licencia MIT
Esta página recoge todas las funciones de Phosphoric, con una explicación de cada una y las opciones de línea de comandos correspondientes. El repositorio GitHub es la referencia actualizada; la documentación técnica detalla cada subsistema.
Índice
- 1. Núcleo de emulación
- 2. Periféricos y tarjetas
- 3. Modelos ORIC-1 y Atmos
- 4. Joystick, impresora, plóter
- 5. Estados guardados
- 6. Depurador interactivo
- 7. Control y automatización
- 8. Emisión Chromecast / Google Cast
- 9. Pantalla y capturas
- 10. ULA-NG (nueva generación)
- 11. Traza, perfilado, análisis de ROM
- 12. Sistemas operativos
- 13. Comodidad y portabilidad
- 14. Serie: chips × transportes
- 15. Atajos de teclado
- 16. Compilación
1. Núcleo de emulación
El núcleo reproduce la máquina ciclo a ciclo: cada chip avanza al mismo ritmo que el silicio original, condición indispensable para ejecutar las demos y el código sensible al barrido de vídeo.
CPU MOS 6502
Emulación de ciclo exacto de los 151 opcodes oficiales, 13 modos de direccionamiento, aritmética decimal (BCD) e interrupciones IRQ por nivel. La batería de pruebas cubre también los opcodes ilegales NMOS.
Memoria de 64 KB
RAM $0000-$BFFF, ROM $C000-$FFFF, gestión de bancos y enrutamiento de E/S fiel a
la organización de memoria del Oric.
VIA 6522
16 registros, Timers 1 y 2, interrupciones IFR/IER, matriz de teclado, registro de desplazamiento (8 modos), conteo de pulsos en T2, modos PCR CA2/CB2 completos (flancos de entrada, interrupciones independientes, handshake — CB2 solo escritura como el silicio —, pulso de un ciclo, modo manual) y enclavamiento de las entradas IRA/IRB (bits 0-1 del ACR).
Vídeo ULA
Modo texto (40×28) y HIRES (240×200), atributos serie, timing PAL (312 líneas × 64 ciclos).
PSG AY-3-8910
3 canales de tono, ruido, 16 formas de envolvente, salida de audio SDL2.
2. Periféricos y tarjetas
Microdisc (controlador WD1793)
FDC WD1793, 4 unidades (A-D), ROM de overlay, arranque Sedoric. Timing mecánico real por defecto (velocidades de paso 6/12/20/30 ms, latencia rotacional a 300 rpm, Record-Not-Found tras 5 pulsos de índice, pulso de índice Type I en vivo). Inyección de sectores defectuosos para probar la robustez: el defecto sigue al medio a través de los cambios de unidad y se conserva en los estados guardados.
- --disk-rom ARCHIVO · --disk / --disk1/2/3 unidades A a D
- --fdc-timing real (por defecto) | fast · --disk-writeback · --bad-sector [D:]S:T:N
Casete (formato TAP)
CLOAD/CSAVE mediante parcheo de la ROM, carga rápida, multibloque, reencadenado tras CLOAD, y
lectura a nivel de señal (--tape-signal: onda VIA CB1 real leída por la ROM, para
cargadores personalizados o protegidos).
- --tape ARCHIVO · --fast-load · --tape-signal
ACIA 6551 (serie)
Controlador serie en $031C-$031F ($0380 bajo LOCI). Transportes loopback / TCP /
PTY / puerto COM / archivo, y backends de protocolo (módem AT, PicoWiFiModemUSB), modo V23 (Minitel /
Digitelec). Véase la matriz chips × transportes.
Digitelec DTL 2000
Tarjeta módem fiel PIA 6821 + ACIA 6850 en $03F8-$03FD (registros verificados por OCR sobre la
documentación de época), V23 75/1200 y 1200 simétrico, control de línea/portadora, IRQ cableada. Validada frente
al terminal OTRM de la época.
- --dtl2000 TRANSPORTE · --dtl2000-addr XXXX
MIDI Mageco / ORICON
ACIA MC6850 que gobierna los conectores DIN MIDI (31250 baudios, 8-N-1). Dos diseños del foro Oric: la
tarjeta Mageco original en $03FE-$03FF (--mageco) y la reedición
moderna ORICON en $031C-$031D + generador de reloj, compatible con LOCI
(--oricon). Captura/reproducción del flujo MIDI en bruto, reproducción de un Standard MIDI File
dentro del Oric (a tempo), o — en compilación MIDI=1 — puerto MIDI del host en vivo (ALSA /
CoreMIDI / WinMM) para gobernar FluidSynth o un secuenciador.
- --mageco file:in[:out] | smf:ARCHIVO[:loop] | midi[:DESTINO] | loopback | tcp | pty · --oricon TRANSPORTE
PicoWiFiModemUSB
Emulación del módem WiFi de sodiumlb (Pico W, USB CDC ↔ WiFi) expuesto por LOCI como ACIA en
$0380. Juego de comandos AT v0.1.0 completo; WiFi simulado, conexiones de datos por TCP real.
- --serial picowifi[:SSID[:PASS]]
LOCI — Lovely Oric Computer Interface
Interfaz de sodiumlb (2024): bus MIA $03A0-$03BF, 36/36 operaciones de la API (ABI conforme al
firmware), USB HID, WD1793 de ciclo exacto, imagen SD FAT16/32, intercambio de ROM en caliente. Botón
Acción (F8): pulsación corta → instantánea de sesión + menú LOCI; pulsación larga (≥ 2 s) → ROM de
diagnóstico de Mike Brown. Sirve llaves USB reales del host al Oric, timing del bus MIA ajustable. Arranca un
máster Sedoric V4 completo mediante el firmware LOCI.
- --loci · --loci-flash DIR · --loci-sdimg RUTA · --loci-usb DIR|none
- --loci-mia-window LO-HI · --loci-irq-latency US
3. Modelos ORIC-1 y Atmos
Detección automática del modelo
Distingue el BASIC 1.0 (ORIC-1) del 1.1 (Atmos) por la cabecera de la ROM, con las direcciones de parcheo de casete correctas para cada versión. El modelo también puede forzarse.
- --model oric1 | atmos | 1.0 | 1.1
4. Joystick, impresora, plóter
Joystick IJK
Interfaz IJK (el adaptador más común, activo a nivel bajo en el puerto A del PSG), en modo teclado (flechas + RCtrl/RAlt como disparo) o gamepad SDL2 (cruceta, stick analógico, botones A/B/X), con conexión en caliente. Las señales de joystick y teclado se combinan en el puerto A.
- --joystick keys | gamepad
Impresora Centronics y plóter MCP-40
Captura LPRINT/LLIST a un archivo de texto, o emulación del plóter de 4 colores MCP-40 (comandos H/D/M/J/P/L, framebuffer 480×400, trazado de líneas de Bresenham, fuente 5×7, exportación BMP). Protocolo Centronics vía puerto A de la VIA + flanco CA2 (STROBE).
- --printer ARCHIVO · --printer-type text (por defecto) | mcp40
5. Estados guardados
Formato .ost
Estado binario completo con control de integridad CRC32, repartido en 13 secciones (CPU, MEM, VIA, PSG, VID, KBD, FDC, MDC, DSK, BAD, TAP, SER, META). Las secciones desconocidas se ignoran: el formato es compatible hacia atrás y hacia adelante.
- --save-state ARCHIVO · --load-state ARCHIVO · teclas F2 (guardar) / F4 (cargar)
6. Depurador interactivo
Puntos de ruptura y watchpoints
Hasta 16 puntos de ruptura de PC, condicionales (b ADDR if EXPR), 8 puntos de ruptura por línea
de raster, 8 watchpoints de escritura en memoria.
Ejecución e inspección
step, next, step-out, continue, undo (rebobinado de 16 instantáneas CPU+RAM),
registros, desensamblado paginado con operandos resueltos por símbolos, volcado/edición de memoria,
ensamblador en línea (a ADDR MNEMO [operando]), búsqueda en memoria
(find bytes o texto), pila. Inspección en vivo de los periféricos (via, psg,
disk, acia, tape, loci).
Símbolos, TUI y GDB
Carga de tablas de símbolos (.sym/.lab/EQU/VICE), interfaz TUI ncurses
de 6 paneles (compilación TUI=1), y sobre todo un stub GDB remoto para depurar el 6502
desde gdb, lldb o un IDE (VS Code, CLion) mediante el protocolo RSP — ningún otro emulador Oric lo
ofrece.
- --debug · --break ADDR · --symbols ARCHIVO · --tui · --gdb[=PUERTO]
7. Control y automatización
Modo control IPC OricForge
Con --control, Phosphoric habla un protocolo de texto por stdin/stdout (logs en stderr): más de 40
comandos (hello, regs, read, write, peek,
break, step, load-tap, load-rom, load-disk…) y 3
tipos de eventos. Pausa asíncrona durante la ejecución, negociación de capacidades. Pensado para el IDE OricForge.
API HTTP (REST)
El mismo juego de comandos expuesto por HTTP/JSON (compilación HTTPAPI=1, puerto 8888 por defecto)
para scripting, paneles de navegador y pruebas de extremo a extremo. Endpoints GET /hello /regs /mem
/peek/… y POST /reset /mem /keys /tape /disk /exec/…. Se puede escribir en el teclado a
distancia (POST /keys con text=…). Enlaza a 127.0.0.1 por defecto,
las operaciones de archivo se limitan a un directorio sandbox.
- --http-api[=PUERTO] · --http-api-bind DIRECCIÓN · --http-api-root DIR
Grabación / reproducción determinista («TAS movie»)
Grabación de las entradas de teclado y reproducción determinista a nivel de bit: ejecuciones asistidas (tool-assisted), reproducción de bugs, regresiones en CI. Ningún otro emulador Oric lo ofrece.
- --record ARCHIVO · --replay ARCHIVO
Auto-escritura de teclado
Simulación de pulsaciones con escapes (\n Return, \e Esc, flechas, \Cx
Ctrl+x, \Fx Funct+x…). El ritmo se sincroniza con el escáner de teclado real (barrido
de matriz VIA PB3): ninguna tecla se pierde. Puede armarse sobre un estado de memoria en vez de un ciclo adivinado.
- --type-keys N:TEXTO · --type-keys-when A:V:TEXTO
8. Emisión Chromecast / Google Cast
Emitir a un televisor Google Cast
Phosphoric puede emitir la pantalla y el sonido del Oric a un dispositivo Chromecast / Google
Cast. Servidor MJPEG HTTP (flujo de vídeo /stream, 720×672, ampliación ×3),
audio WAV en tiempo real del PSG (/audio), control CASTV2 nativo (el
protocolo Google Cast) y descubrimiento mDNS de los dispositivos de la red. Requiere una
compilación CAST=1.
- --cast-server[=PUERTO] servidor MJPEG (8080 por defecto)
- --cast-to[=DISPOSITIVO] emitir a un Chromecast · --cast-discover listar dispositivos
9. Pantalla y capturas
Escalado
Escalado entero ×1 (240×224) a ×4 (960×896), vecino más próximo (pixel-perfect, sin difuminado), conmutable en caliente con F3.
- --scale 1 | 2 | 3 (por defecto) | 4 · --keyboard qwerty | azerty · --fullscreen (F11)
Capturas y vídeo
Capturas PPM / BMP / PNG — al salir, en un ciclo dado, o disparadas por un estado de memoria
(RAM[A]==V). Volcado de texto de pantalla (ASCII) o del framebuffer en ANSI a color. Grabación de vídeo
Motion-JPEG AVI (pista de audio incluida en modo GUI). Captura de audio PSG en WAV, testeable en CI
sin pantalla.
- --screenshot[-at/-text/-ansi/-when] · --dump-ram-when A:V:ARCHIVO
- --video ARCHIVO · --video-fps N · --video-quality N · --audio-wav ARCHIVO
10. ULA-NG (nueva generación)
Referencia software para una ULA FPGA
Modelo de referencia para una futura ULA en Verilog/FPGA (Sipeed Tang Primer 20K / GW2A-18). Ventana de
registros $0340-$035F, bloqueada al reset → idéntica bit a bit a una HCS 10017
original hasta que un programa la desbloquea ('N','G' en $0340). 8 funciones: indirección
de paleta (LUT 16×12 bits), IRQ de raster, dirección de inicio (doble buffer / scroll), copper por scanline, scroll
fino X/Y, atributos paralelos (tinta+papel por celda, sin color clash), 16 sprites
por hardware 16×16 con prioridad y colisión, y modos chunky 4bpp (320×224, 16 colores) /
texto de 80 columnas. Se incluye una demo por función.
- --ula-ng-poke "340=4E,340=47,341=05,…" (inyección al arranque)
11. Traza, perfilado, análisis de ROM
Traza de instrucciones de CPU
Registra cada instrucción con desensamblado y estado de los registros
(CICLOS PC BYTES DESENS A= X= Y= SP= P=).
- --trace ARCHIVO · --trace-max N
Perfilador de rendimiento
Conteo por dirección y ciclos sobre los 64 KB, histograma de los 256 opcodes, informe de los 20 puntos calientes.
- --profile ARCHIVO
Análisis de ROM
Extracción de vectores (RESET, NMI, IRQ), mapa de subrutinas (destinos JSR/JMP con contador de referencias), detección de cadenas ASCII, estadísticas de uso (código / datos / relleno), búsqueda de patrones.
- --rom-info [ARCHIVO]
12. Sistemas operativos admitidos
Phosphoric funciona de forma nativa en los tres grandes sistemas de escritorio, en el navegador y en modo headless para la automatización. El mismo código produce una salida idéntica en todas partes.
| Sistema | Cómo | Notas |
|---|---|---|
| Linux | compilación nativa SDL2 (make SDL2=1) | Plataforma de desarrollo principal. Todas las funciones: MIDI ALSA, Cast, stub GDB, serie TCP/PTY/COM. |
| Windows 11 (nativo) | .exe (CI o MinGW-w64, make WIN=1 SDL2=1) | Límites v1: serie tcp/pty/modem/com/picowifi, --gdb, --control (pausa asíncrona), Cast y MIDI del host son solo Linux. |
| Windows 11 (WSL2) | compilación Linux bajo WSLg | Compilación Linux completa, todas las funciones. |
| macOS | compilación nativa SDL2 | MIDI del host vía CoreMIDI. |
| Navegador | WebAssembly (make wasm) | Multiplataforma (Chrome, Firefox, Safari, Edge), sin instalación. Sockets/hilos nativos como no-op; núcleo, vídeo, audio, teclado, casete y disco funcionan. Véase la guía de navegador. |
| CI / servidor | modo headless (make SDL2=0, --headless) | Sin pantalla: pruebas, automatización, capturas, audio WAV testeable. |
13. Comodidad y portabilidad
Multiplataforma
Compilación nativa SDL2 en Linux, Windows y macOS; en Windows 11: compilación navegador (WebAssembly, sin instalación), .exe nativo (CI o MinGW-w64) o WSL2 (compilación Linux completa bajo WSLg). Detalles en la sección Sistemas operativos.
Compilación WebAssembly
La máquina completa funciona en una pestaña sobre un <canvas> (Web Audio, arrastrar y soltar
.tap/.dsk, selector de ROM, filtro CRT, estados .ost, LED de actividad de
casete/disco, teclado ORIC-1/Atmos en pantalla). Salida idéntica byte a byte a la nativa. Es esta compilación la
que impulsa el botón «Ejecutar en línea» del sitio.
Herramientas de conversión y varios
Herramientas bas2tap, bin2tap, tap2sedoric (inyección de archivos Sedoric),
sedoric-info (inspector de disquete). Distribuciones de teclado QWERTY/AZERTY, modo
headless (CI/automatización), compartición del sistema de archivos del host (--hostfs).
- --headless · --hostfs DIR · --cycles N · make tools
14. Comunicación serie: chips × transportes
Phosphoric separa el UART que el programa Oric gobierna (un chip mapeado en memoria) del transporte que lleva los bytes en el host. Se elige un chip y se le da un transporte.
Chips (donde el programa lee/escribe):
| Opción | Chip | Dirección | Hardware real |
|---|---|---|---|
--serial | ACIA 6551 (MOS) | $031C ($0380 bajo --loci) | Módem V23 Oric, Telestrat |
--dtl2000 | PIA 6821 + ACIA 6850 | $03F8 | Tarjeta Digitelec DTL 2000 |
--mageco | ACIA 6850 | $03FE | Interfaz MIDI Mageco (31250 baudios) |
--oricon | ACIA 6850 + gen. reloj | $031C | MIDI ORICON (compatible LOCI) |
--loci | LOCI MIA | $03A0-$03BF | Interfaz LOCI (sodiumlb) |
Transportes (adónde van los bytes). Transparente = tubería de bytes en bruto; protocolo = inyecta su propia capa de comandos/UART:
| Transporte | Tipo | Notas |
|---|---|---|
loopback | transparente | TX realimentado a RX (pruebas) |
tcp:H:P | transparente | BBS / Minitel / telnet / router MIDI por TCP |
pty | transparente | pseudoterminal POSIX (minicom, screen) |
com:B,D,P,S,DEV | transparente | puerto serie real (termios) |
file:IN[:OUT] | transparente | reproducción (RX) / captura (TX) determinista; captura MIDI |
midi[:DESTINO] | transparente | puerto MIDI del host en vivo (MIDI=1) |
smf:ARCHIVO[:loop] | transparente | Standard MIDI File → MIDI IN a tempo |
modem[:H:P] | protocolo | intérprete Hayes AT (solo --serial) |
digitelec:H:P | protocolo | Obsoleto → usar --dtl2000 |
picowifi[:…] | protocolo | módem WiFi PicoWiFiModemUSB (solo --serial) |
Opciones de ajuste de --serial: --serial-v23 (modo asimétrico 1200/75
Minitel), --serial-buffer N, --serial-baud N, --serial-irq-on-rdrf (modo IRQ
WDC 65C51), --serial-trace, --serial-tcp-backpressure, --acia-addr.
15. Atajos de teclado
| Tecla | Función |
|---|---|
| F2 | Guardado rápido de estado |
| F3 | Cambiar la escala de pantalla (×1→×2→×3→×4) |
| F4 | Carga rápida de estado |
| F5 | Reset en caliente |
| F6 | OSD — cambiar el casete/disquete en caliente |
| F7 | Volcado de memoria (64 KB de RAM a un .bin con marca de tiempo) |
| F8 | Botón Acción LOCI — pulsación corta: instantánea + menú; ≥ 2 s: ROM de diagnóstico |
| F9 | Entrar en el depurador |
| F10 | Salir |
| F11 | Pantalla completa |
| F12 | Captura PNG (con marca de tiempo si ya existe) |
16. Compilación
make # compilación estándar con SDL2 (por defecto)
make SDL2=0 # compilación headless (sin SDL2, para CI/automatización)
make DEBUG=1 # compilación debug (-g -O0)
make CAST=1 # con soporte Chromecast / Google Cast
make MIDI=1 # con MIDI del host en tiempo real (ALSA/CoreMIDI/WinMM)
make wasm # compilación WebAssembly / navegador (requiere Emscripten)
make tools # herramientas de conversión (bas2tap, bin2tap, tap2sedoric, sedoric-info)
sudo make install # instala en /usr/local
Requisitos (Debian/Ubuntu): sudo apt install build-essential libsdl2-dev
(y libssl-dev para Chromecast). Véase la documentación para los
detalles por plataforma.