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.

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.
SAVEescribeprofiles/NOMBRE.CFG— texto planoKEY=VALUEde ocho y tres — ySET DEFAULTdeja ese perfil apuntado enprofiles/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 / PROFILESen caliente.


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.

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

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