ZXUC como dot command
ZXUC como dot command
Hola,
En este fichero hay dos ficheros para meter en la carpeta BIN de vuestra SD del ZX-Uno. Una vez metidos podréis hacer .ZXUC para cargar ZXUC en lugar de tener que tirar del .TAP.
ZXUC para el que no lo sepa es una utilidad con GUI para cambiar settings del ZX-Uno con el ZX-Uno ya arrancado, sin tener que tocar la BIOS, y de manera temporal (un hard reset lo desactiva). Es cómodo por ejemplo en estos casos:
1) Probar frecuencias de pantalla para ver cual es la que mejor nos va, antes de grabarlas en la BIOS
2) Cambiar la emulación de joystick a otra que nos vienen bien para un juego concreto sin tener que hacer el cambio permanente.
3) Desactivar los modos Timex para jugar a MadMixGame sin tener que desactivarlos de manera general en la BIOS.
etc.
ZXUC tiene las mismas opciones de la herramienta .ZXUNOCFG y más, y es interactivo (no necesitas escribir ni saberte parámetros, va por menús).
La explicación técnica de por qué hay dos ficheros, para el que le interese, es esta:
ZXUC está hecho con el compilador ZX Basic de Boriel. La razón para usar este compilador es muy sencilla: me apetecía hacer una herramienta para configurar ZX-Uno y a la vez me apetecía probar ZX-Basic
El caso es que con eso pude generar un ZXUC.TAP que se ha venido usando hasta ahora, pero algunas personas, incluido yo mismo, pensábamos que sería mejor tener un comando de ESXDOS, algo como .ZXUC, pero los intentos de crearlo tal cual han sido infructuosos.
Al final si no me equivoco estas son las razones por las que no puede funcionar:
1) Tamaño: ZXUC ocupa 11k con la máxima optimización, y un comando de ESXDOS no puede pasar de 8K
2) Llamadas a la ROM: cuando se ejecuta un comando ESXDOS se mapea la ROM de ESXDOS y la ROM del Spectrum deja de estar accesible, por lo que si se llama a la ROM de Spectrum y en su lugar está otra lo más posible es cuelgue.
Solución:
No hacer exactamente un "dot command", sino un mini dot command que cargue un fichero en RAM y lo ejecute. El fichero ZXUC.BIN es el mismo fichero que el ZXUC.TAP pero en RAW, y con ORG 45000 (lo puse mas alto para apurar, pero se cuelga, así que supongo que ZXBasic usa memoria por encima del código, para variables y eso). El fichero ZXUC es el dot command, que carga en memoria (en 45000) el fichero BIN, y luego lo llama no sin antes forzar que se vuelva a paginar la ROM normal de Spectrum, para que funcione correctamente (porque llama a la ROM normal del Spectrum).
Los dos juntos dan la apariencia de un dot command normal ".ZXUC", con la ventaja de poder ocupar mas de 8K, y la desventaja de machacar la RAM por encima de la dirección 45000.
En este fichero hay dos ficheros para meter en la carpeta BIN de vuestra SD del ZX-Uno. Una vez metidos podréis hacer .ZXUC para cargar ZXUC en lugar de tener que tirar del .TAP.
ZXUC para el que no lo sepa es una utilidad con GUI para cambiar settings del ZX-Uno con el ZX-Uno ya arrancado, sin tener que tocar la BIOS, y de manera temporal (un hard reset lo desactiva). Es cómodo por ejemplo en estos casos:
1) Probar frecuencias de pantalla para ver cual es la que mejor nos va, antes de grabarlas en la BIOS
2) Cambiar la emulación de joystick a otra que nos vienen bien para un juego concreto sin tener que hacer el cambio permanente.
3) Desactivar los modos Timex para jugar a MadMixGame sin tener que desactivarlos de manera general en la BIOS.
etc.
ZXUC tiene las mismas opciones de la herramienta .ZXUNOCFG y más, y es interactivo (no necesitas escribir ni saberte parámetros, va por menús).
La explicación técnica de por qué hay dos ficheros, para el que le interese, es esta:
ZXUC está hecho con el compilador ZX Basic de Boriel. La razón para usar este compilador es muy sencilla: me apetecía hacer una herramienta para configurar ZX-Uno y a la vez me apetecía probar ZX-Basic
El caso es que con eso pude generar un ZXUC.TAP que se ha venido usando hasta ahora, pero algunas personas, incluido yo mismo, pensábamos que sería mejor tener un comando de ESXDOS, algo como .ZXUC, pero los intentos de crearlo tal cual han sido infructuosos.
Al final si no me equivoco estas son las razones por las que no puede funcionar:
1) Tamaño: ZXUC ocupa 11k con la máxima optimización, y un comando de ESXDOS no puede pasar de 8K
2) Llamadas a la ROM: cuando se ejecuta un comando ESXDOS se mapea la ROM de ESXDOS y la ROM del Spectrum deja de estar accesible, por lo que si se llama a la ROM de Spectrum y en su lugar está otra lo más posible es cuelgue.
Solución:
No hacer exactamente un "dot command", sino un mini dot command que cargue un fichero en RAM y lo ejecute. El fichero ZXUC.BIN es el mismo fichero que el ZXUC.TAP pero en RAW, y con ORG 45000 (lo puse mas alto para apurar, pero se cuelga, así que supongo que ZXBasic usa memoria por encima del código, para variables y eso). El fichero ZXUC es el dot command, que carga en memoria (en 45000) el fichero BIN, y luego lo llama no sin antes forzar que se vuelva a paginar la ROM normal de Spectrum, para que funcione correctamente (porque llama a la ROM normal del Spectrum).
Los dos juntos dan la apariencia de un dot command normal ".ZXUC", con la ventaja de poder ocupar mas de 8K, y la desventaja de machacar la RAM por encima de la dirección 45000.
Última edición por Uto el 08 Oct 2016, 11:00, editado 1 vez en total.
Re: ZXUC como dot command
Por cierto, para el que no lo sepa (a mi me ha llevado algunas horas de ingenieria inversa para saberlo), para llamar a la ROM original (o a un programa en RAM que necesite la ROM original) desde un comando dot de ESXDOS hay que hacer:
Eso forzará el mapeado de la ROM normal antes de saltar a la dirección en concreto,y el mapeado de la ROM de ESXDOS cuando volvamos de la misma con un RET.
Obviamente si la rutina en cuestión necesita que determinados registros tengan determinados valores, hay que asignarlos antes del RST.
Código: Seleccionar todo
RST $18
DW <direccion de la ROM o RAM a la que saltar>
Obviamente si la rutina en cuestión necesita que determinados registros tengan determinados valores, hay que asignarlos antes del RST.
Última edición por Uto el 08 Oct 2016, 11:00, editado 1 vez en total.
Re: ZXUC como dot command
Genial, muchas gracias Uto !!!!!
Re: ZXUC como dot command
Esta genial, sobre todo el tema de poder ejecutar binarios con comandos "."
Es posible ver el codigo fuente del .ZXUC?
Es posible ver el codigo fuente del .ZXUC?
Re: ZXUC como dot command
Uto, desde que puedo lo añado. Me parece una idea genial poder hacer comandos de ese tipo tan potentes y tan fáciles de usar.
Re: ZXUC como dot command
BCH escribió:Esta genial, sobre todo el tema de poder ejecutar binarios con comandos "."
Es posible ver el codigo fuente del .ZXUC?
Claro. Ayer acabé tarde y hoy llevo todo el día fuera, pero en los próximos días lo subiré al github ZXUC.
Lo próximo que tengo en mente es poder grabar y cargar configuraciones, es decir, que desde ZXUC se pueda decir "grabar setup" y te pida un nombre, por ejemplo "test1" y luego poder hacer
.zxuc test1
y que cargue ese setup sin abrir el GUI siquiera.
Re: ZXUC como dot command
Como ando ya modificando el .zxuc para cargar y grabar configuraciones, no voy a subir a Github código a medias. Pero aquí dejo lo básico para cargar un .BIN en memoria RAM desde un dot command y ejecutarlo:
Código: Seleccionar todo
; --- ESXDOS FUNCTIONS
M_GETSETDRV equ $89
F_OPEN equ $9a
F_CLOSE equ $9b
F_READ equ $9d
F_WRITE equ $9e
; --- FILE OPEN MODES
FA_READ equ $01
org $2000
Main:
; --- Set default disk
xor a
rst $08
db M_GETSETDRV
ret c
; --- Open ZXCU.BIN file
ld b, FA_READ
ld hl, zxucbinfile
rst $08
db F_OPEN
ret c
; --- Load ZXCU.BIN at address 45000
ld (FHandle),a
ld HL, 45000
ld bc, 16384 ; bc=longitud del fichero, en exceso, por asegurar
ld a,(FHandle)
rst $08
db F_READ ; Leer archivo
ret c
; --- Close file
ld a,(FHandle)
rst $08
db F_CLOSE
ret c
; --- Jump to address 45000 forcing exit from ESXDOS ROM so standard ROM is avaliable
rst $18
dw 45000
ret
;--- Variables
FHandle: db 0
zxucbinfile: db "/BIN/ZXUC.BIN"
db 0
Última edición por Uto el 09 Oct 2016, 14:18, editado 1 vez en total.
- mcleod_ideafix
- Mensajes: 831
- Registrado: 27 Sep 2015, 00:14
- Ubicación: Jerez de la Frontera
- Contactar:
Re: ZXUC como dot command
Pregunta: ¿no debería estar terminado el nombre del fichero por un byte a 0, como en C?
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA
Re: ZXUC como dot command
Sí, de hecho lo está, lo que ha fallado es el cortar/pegar que me he dejado la última linea.mcleod_ideafix escribió:Pregunta: ¿no debería estar terminado el nombre del fichero por un byte a 0, como en C?
Acabo de arreglarlo, gracias por darte cuenta
Re: ZXUC como dot command
Genial, muchas gracias!Uto escribió:Como ando ya modificando el .zxuc para cargar y grabar configuraciones, no voy a subir a Github código a medias. Pero aquí dejo lo básico para cargar un .BIN en memoria RAM desde un dot command y ejecutarlo:
Esto deberia funcionar de igual forma en un divide con ESXDOS verdad? Lo digo por el tema de probar el codigo en un emulador