Tachibana

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

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.

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).

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.

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.

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.

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.

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.

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.

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).

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.

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.

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.

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.

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.

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.

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.

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.

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.

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=).

Perfilador de rendimiento

Conteo por dirección y ciclos sobre los 64 KB, histograma de los 256 opcodes, informe de los 20 puntos calientes.

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.

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.

SistemaCómoNotas
Linuxcompilació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 WSLgCompilación Linux completa, todas las funciones.
macOScompilación nativa SDL2MIDI del host vía CoreMIDI.
NavegadorWebAssembly (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 / servidormodo 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).

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ónChipDirecciónHardware real
--serialACIA 6551 (MOS)$031C ($0380 bajo --loci)Módem V23 Oric, Telestrat
--dtl2000PIA 6821 + ACIA 6850$03F8Tarjeta Digitelec DTL 2000
--magecoACIA 6850$03FEInterfaz MIDI Mageco (31250 baudios)
--oriconACIA 6850 + gen. reloj$031CMIDI ORICON (compatible LOCI)
--lociLOCI MIA$03A0-$03BFInterfaz LOCI (sodiumlb)

Transportes (adónde van los bytes). Transparente = tubería de bytes en bruto; protocolo = inyecta su propia capa de comandos/UART:

TransporteTipoNotas
loopbacktransparenteTX realimentado a RX (pruebas)
tcp:H:PtransparenteBBS / Minitel / telnet / router MIDI por TCP
ptytransparentepseudoterminal POSIX (minicom, screen)
com:B,D,P,S,DEVtransparentepuerto serie real (termios)
file:IN[:OUT]transparentereproducción (RX) / captura (TX) determinista; captura MIDI
midi[:DESTINO]transparentepuerto MIDI del host en vivo (MIDI=1)
smf:ARCHIVO[:loop]transparenteStandard MIDI File → MIDI IN a tempo
modem[:H:P]protocolointérprete Hayes AT (solo --serial)
digitelec:H:PprotocoloObsoleto → usar --dtl2000
picowifi[:…]protocolomó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

TeclaFunción
F2Guardado rápido de estado
F3Cambiar la escala de pantalla (×1→×2→×3→×4)
F4Carga rápida de estado
F5Reset en caliente
F6OSD — cambiar el casete/disquete en caliente
F7Volcado de memoria (64 KB de RAM a un .bin con marca de tiempo)
F8Botón Acción LOCI — pulsación corta: instantánea + menú; ≥ 2 s: ROM de diagnóstico
F9Entrar en el depurador
F10Salir
F11Pantalla completa
F12Captura 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.

← Volver a Phosphoric · Documentación técnica →