ZXUC como dot command

Discursiones en general sobre el proyecto que no tienen cabida en otro foro / General discussion for uncateorized topics about the ZX-Uno project
Avatar de Usuario
Uto
Mensajes: 1394
Registrado: 17 Dic 2015, 16:39

ZXUC como dot command

Mensaje por Uto » 08 Oct 2016, 01:29

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.
Última edición por Uto el 08 Oct 2016, 11:00, editado 1 vez en total.

Avatar de Usuario
Uto
Mensajes: 1394
Registrado: 17 Dic 2015, 16:39

Re: ZXUC como dot command

Mensaje por Uto » 08 Oct 2016, 01:34

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:

Código: Seleccionar todo

RST $18
DW <direccion de la ROM o RAM a la que saltar>
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.
Última edición por Uto el 08 Oct 2016, 11:00, editado 1 vez en total.

Avatar de Usuario
carmeloco
Mensajes: 751
Registrado: 25 Dic 2015, 12:02

Re: ZXUC como dot command

Mensaje por carmeloco » 08 Oct 2016, 10:44

Genial, muchas gracias Uto !!!!!

BCH
Mensajes: 170
Registrado: 01 May 2016, 10:55

Re: ZXUC como dot command

Mensaje por BCH » 08 Oct 2016, 13:40

Esta genial, sobre todo el tema de poder ejecutar binarios con comandos "."
Es posible ver el codigo fuente del .ZXUC?

Avatar de Usuario
Lenko
Mensajes: 136
Registrado: 05 Oct 2015, 16:51

Re: ZXUC como dot command

Mensaje por Lenko » 08 Oct 2016, 18:57

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.

Avatar de Usuario
Uto
Mensajes: 1394
Registrado: 17 Dic 2015, 16:39

Re: ZXUC como dot command

Mensaje por Uto » 08 Oct 2016, 23:04

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.

Avatar de Usuario
Uto
Mensajes: 1394
Registrado: 17 Dic 2015, 16:39

Re: ZXUC como dot command

Mensaje por Uto » 09 Oct 2016, 13:50

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.

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: ZXUC como dot command

Mensaje por mcleod_ideafix » 09 Oct 2016, 14:09

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

Avatar de Usuario
Uto
Mensajes: 1394
Registrado: 17 Dic 2015, 16:39

Re: ZXUC como dot command

Mensaje por Uto » 09 Oct 2016, 14:19

mcleod_ideafix escribió:Pregunta: ¿no debería estar terminado el nombre del fichero por un byte a 0, como en C?
Sí, de hecho lo está, lo que ha fallado es el cortar/pegar que me he dejado la última linea. :roll:


Acabo de arreglarlo, gracias por darte cuenta :-)

BCH
Mensajes: 170
Registrado: 01 May 2016, 10:55

Re: ZXUC como dot command

Mensaje por BCH » 09 Oct 2016, 14:30

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:
Genial, muchas gracias!

Esto deberia funcionar de igual forma en un divide con ESXDOS verdad? Lo digo por el tema de probar el codigo en un emulador

Responder