De momento, mientras me llega una placa de desarrollo voy a ir preparando el software.
Mi intención es hacer algo similar al DivIDE con esxDOS, es decir, extender los comandos de la ROM interceptando comandos que empiezan con punto. Para no reinventar la rueda, me voy a basar en el hardware del DivIDE y para poder probarlo, voy a usar el emulador ZX-Spin que emula dicho hardware.
Primer paso: Preparando la ROM alternativa
Para empezar, voy a preparar una ROM que permita arrancar el Spectrum con el DivUSB conectado, de forma que cuando se activa el mapeado automático del HW se restaura la ROM original.
El procedimiento es el siguiente. El HW detecta cuando se ejecuta una instrucción en seis direcciones de la ROM: 0000h (reset), 0008h (error), 0038h (int), 0066h (nmi), 04c6h (save) y 0562h (load). Esa instrucción se ejecuta normalmente pero la siguiente, en vez de leerse en la ROM original, se lee en la ROM alternativa. Para volver a la ROM original hay que ejecutar alguna instrucción en las direcciones $1ff8 a $1fff.
Este es el código de la ROM alternativa:
Código: Seleccionar todo
org $0000 ; $00 : reset
;
di ; la misma instrucción que en la ROM original, la siguiente instrucción es la que se ejecuta realmente
ld hl,$0001 ; se continuará la ejecución a partir de la dirección $0001
jp $1ff9 ; restauramos la ROM original
org $0008 ; $08 : error
;
ld hl,(0x5c5d) ; la misma instrucción que en la ROM original, la siguiente instrucción es la que se ejecuta realmente
push hl ; guardamos HL en el stack
ld hl,$000b ; se continuará la ejecución a partir de la dirección $000b
ex (sp),hl ; intercambiamos el contenido del stack por HL (restauramos HL a su valor original y metemos en el stack la dirección de salto)
jp $1ff8 ; restauramos la ROM original
org $0038 ; $38 : int
;
push af ; la misma instrucción que en la ROM original, la siguiente instrucción es la que se ejecuta realmente
push hl ; igual que $08 pero saltamos a $0039
ld hl,$0039
ex (sp),hl
jp $1ff8
org $0066 ; $66 : nmi
;
push af ; la misma instrucción que en la ROM original, la siguiente instrucción es la que se ejecuta realmente
push hl ; igual que $08 pero saltamos a $0071
ld hl,$0071
ex (sp),hl
jp $1ff8
org $1ff8 ; retorno a la ROM original
;
ret ; $1ff8 : salimos volviendo a la dirección guardada en el stack
jp (hl) ; $1ff9 : salimos saltando a la dirección indicada por HL
nop
nop
nop
nop
nop
nop
- El método más sencillo es salir saltando a $1ff9. Previamente habremos guardado en HL la dirección por la que continuará la ejecución.
- Si necesitamos preservar el valor de HL salimos por $1ff8. Previamente tenemos que haber guardado en el stack la dirección por la que continuará el programa.
Ensamblamos con: PASMO --bin usb.s usb.bin
Y para probar configuramos en zx-Spin:
- En Hardware/Peripherals marcamos 'DivIDE'.
- En Hardware/ROM Images seleccionamos usb.bin como DivIDE firmware.
Arrancamos y vemos que no hace nada de especial. Para comprobar que funciona simulamos una NMI (F5) y veremos que no pasa nada
Con la ROM original se resetearía el Spectrum y con la ROM del FATware o del esxDOS saldría la pantalla de detección de discos al arrancar y, si tenemos algún disco, la de selección de archivos al activar la NMI.
En el próximo capítulo intentaré que salga algo en pantalla para que no se a tan soso.
Continuara...