JESVS

BMAmiga deja de ser una sola Amiga: selector de máquina, perfiles y la primera RAM Zorro

Ayer les contaba que BMAmiga arrancaba siendo una Amiga: 1 MB de chip RAM, 512 KB de trapdoor, un Kickstart horneado dentro de la imagen y punto. Hoy la enciendes y lo primero que pregunta es cuál Amiga quieres ser.

El selector al encendido, sin ninguna configuración guardada: la alineación inicial

Lo que ves arriba no es un mockup: es el renderizador real del menú — la misma fuente de 3×5 píxeles, los mismos colores, el mismo código de framebuffer que corre en la Pi — disparado en el host contra el código de menú tal cual vive en el repositorio. Cada screenshot de este post salió de compilar src/plat/menu.c en mi Mac y pasear el cursor por él.

Qué hay ahora

  • Selector de máquina al encendido. La alineación inicial es la era OCS: A1000, A500 y A2000. Cada una es un preset coherente — la A1000 con 256 KB de chip RAM, la A500 como la máquina que este proyecto siempre fue (1 MB + 512 KB), la A2000 con 1 MB y 2 MB de fast RAM Zorro II.
  • Editor de configuración. Modelo, ROM (de roms/ en la tarjeta, o la embebida), chip/slow/fast RAM, disco duro, disquete en DF0 y nombre. Todo se cicla con Enter desde el teclado USB.
  • Perfiles guardados. SAVE escribe profiles/NOMBRE.CFG — texto plano KEY=VALUE de ocho y tres — y SET DEFAULT deja ese perfil apuntado en profiles/DEFAULT, que es el que la Pi bootea sola. “GAMING 500” con su Kickstart 1.3 y su disco; “WORK 2000” con 2 MB de fast y Workbench desde el disco duro. Guardas tantas como quieras.
  • Left Ctrl al encender te salta el arranque automático y te deja en el selector. También F12 → MACHINE / PROFILES en caliente.

Con un DEFAULT en la tarjeta: dos segundos de gracia y bootea ese perfil

El editor con el perfil GAME500 cargado

Y la promesa de compatibilidad hacia atrás, que me pareció innegociable: una tarjeta sin profiles/ arranca idéntica a la de ayer — la ventana nunca se abre, no se agrega ni un milisegundo al camino de boot. El dev-loop de chainboot por UART ni se entera.

La parte que dolió (como siempre)

RAM dimensionada en caliente

Los tamaños de RAM eran constantes de compilación (CHIP_SIZE, máscaras de potencia de dos esparcidas por seis funciones de decode más las inlines del DMA de copper, blitter, bitplanes y sprites). Ahora son variables de runtime con una máscara chip_mask en el camino caliente de cada palabra que mueve el chipset — el único cambio de rendimiento de todo el feature, y el banco de pruebas dirá si se nota. La migaja que más me gustó escribir: con 256 KB de chip, una escritura en $40000 se lee en $0 — el espejo que hace una A1000 real con su Agnus temprano, gratis por la máscara.

La placa Zorro II (o: aprendí el protocolo autoconfig)

El slow RAM del trapdoor funciona sin autoconfig porque Kickstart sondea $C00000 directamente. La fast RAM no: vive en $200000 y el ROM solo la encuentra si algo responde el handshake de autoconfig en $E80000. Así que escribí una placa — src/amiga/autoconf.c — portada byte por byte de WinUAE/expansion.cpp, que es la referencia que vive en el repo precisamente para esto. El protocolo es delicioso de retro: cada byte lógico va partido en nibbles en los offsets 4n y 4n+2, y casi todos los campos se guardan complementados porque así los codificaba la ROM de autoconfig del Zorro. Mi placa se presenta como la RAM anónima de WinUAE: fabricante 2011 (“test cards”), producto 81, y Kickstart 1.3 y 3.1 la montan sin chistar.

La verificación no fue “parece que sí”: el harness de host bootea el Kickstart real y ahora camina la lista de memoria del exec. Con 2 MB configurados:

[mem] 200020-400000 F-P C00020-C80000 F-P 000420-100000 -CP ...
[exec] ExecBase=200810

Una entrada F-P (fast, pública) que cubre $200020-$400000 — el ROM ejecutó el handshake, programó la base en $200000 con su escritura al offset 0x48, y el exec se mudó a la fast RAM (ExecBase=$200810). Ese fue el momento “está vivo” de la semana.

Ctrl al encendido, sin despertar al monstruo

Quería que mantener Ctrl al encender abra el selector. El problema: el kernel deliberadamente no arma los handlers de USB HID antes de que la máquina esté arriba — un reporte temprano en contexto de IRQ estuvo implicado en un hang hace tiempo (kernel.cpp:744 tiene la advertencia en un comentario). Reabrir eso no era opción.

La solución fue no abrir nada: Run() resetea la máquina exactamente como siempre, y la ventana de selección vive dentro del FrameLoop, en la misma rama que estaciona la máquina cuando el menú F12 está abierto. Ahí el USB enumera con su ritmo natural, la pintura fluye por menu_frame(), las teclas llegan por el mismo camino de siempre — y boot_pump observa el byte de modificadores del último reporte: Left Ctrl abajo (bit 0; el Ctrl derecho ya tiene trabajo: activa el teclado-joystick) mantiene el selector abierto; sin él, pasados ~2 segundos bootea el DEFAULT. Sin teclado nunca: a los 5 segundos arranca igual, porque el banco no siempre tiene teclado.

Guardar en FAT sin mkdir

El walker FAT propio del proyecto (Circle solo lista el raíz) no crea directorios y solo escribe en clusters que un archivo ya posee. Guardar es el ciclo delete → create → write → verify — el mismo shape del motor de subidas. Un corte de luz a mitad de guardado pierde el perfil viejo en el peor caso; jamás corrompe la tarjeta. Y tools/flash.sh ahora crea profiles/ junto a roms/, disks/ y hds/ al flashear.

El menú F12 con el resumen de RAM y la fila nueva

¿Y la A1000?

La de hoy es la A1000 simplificada: 256 KB de chip, ROM desde la tarjeta. La A1000 real no tiene Kickstart en ROM — tiene 256 KB de WCS (control store escribible) y carga el Kickstart desde un disquete al encender. Ese camino de boot es un feature completo por sí mismo y queda en el roadmap honesto, no fingido.

El camino: toda la alineación Commodore

Este selector es la puerta de entrada a la meta declarada: emular la alineación completa de Commodore, de la 1000 a la 4000/060. En orden aproximado de dificultad:

Máquina Lo que pide
A1000 (1985) WCS + kick-disk al boot (el “someday” de arriba)
A500 / A2000 hoy — presets, fast RAM Zorro II, IDE
CDTV (1991) A500 + CD-ROM y el relojito del mando
A500+ / A600 ECS: Agnus de 2 MB, superhires, el gayle que ya medio vive en ide.c
A3000 ECS + 68030 + Zorro III + reloj en battería
A1200 (1992) AGA (256 colores, modos chunky) + 68020 + IDE
A4000/040 AGA + 68040 — el gran salto del chipset
A4000/060 la meta del reta: 68060 a 50 MHz sobre AGA

Cada escalón es un proyecto de verdad: ECS es registros y límites; AGA es el salto grande (el sequencer de bitplanes aprende modos que rompen todo lo que agnus.c asume); Zorro III es un autoconfig de 32 bits con burst; y cada CPU nueva duplica el trabajo de interpretación por instrucción — el 68060 con sus pipelines y caches superescalares es la razón por la que el intérprete de 68000 de hoy está escrito para crecer, no para quedarse. Pero la arquitectura ya lo admite: un mem_set_ram antes del reset, una placa que conteste el probe, y el selector que ya sabe preguntar.

El editor con el preset A2000: chip + fast Zorro

Estado

Todo el feature está verificado en el host: las 12 suites de make test (566 checks, dos nuevas — decode de RAM y parse/persistencia de perfiles), más los gates con Kickstart real (3.1 y 1.3 adoptando la placa Zorro, la A1000 de 256 KB llegando a la pantalla de insertar disco). La imagen de la Pi queda pendiente del ciclo de fotos del banco: sin perfiles debe booteársele idéntica, con DEFAULT debe respetarlo, y el Early Startup de la A2000 debe presumir sus 2 MB.

Una Amiga era un arranque fijo. Un surtido de Amigas es una pregunta al encender. Me gusta más.

← volver a posts
↑