Como hallar el punto de entrada de un juego en formato Z80

Foro dedicado a la emulación de sistemas clásicos en el PC o en otros sistemas.
Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 596
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 13 veces
Gracias recibidas: 19 veces

Como hallar el punto de entrada de un juego en formato Z80

Mensajepor Bubu » 06 Oct 2018, 23:58

¡Jarl, torpedos!

Resulta que me estoy haciendo por curiosidad un emulaor de Spectrum, y pa catarlo le quiero meter algunos juegos, que están en formato Z80 (el snap de Spectrum). Y la pregunta es: dado un archivo .z80, ¿cómo sé en qué dirección RAM se carga el primer byte? ¿Y en qué dirección empieza la ejecución?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
explorer
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 244
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias recibidas: 49 veces
Contactar:

Re: Como hallar el punto de entrada de un juego en formato Z80

Mensajepor explorer » 07 Oct 2018, 02:05

El formato del archivo .z80 almacena los 48 kB de la memoria del ZX Spectrum, así que es de suponer que el primer byte que se mete en la memoria lo hace en la dirección 0x4000.

Y el programa empieza en la dirección indicada por el contador de programa, que está en el byte 6 de la cabecera del archivo. Salvo... si el formato del archivo es 2 o 3, en cuyo caso los bytes 6 y 7 de la cabecera son 0, por lo que el verdadero valor del PC se coloca en la cabecera secundaria, en el byte 32.

Formato del archivo .z80
Última edición por explorer el 07 Oct 2018, 17:09, editado 3 veces en total.

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 648
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 32 veces

Re: Como hallar el punto de entrada de un juego en formato Z80

Mensajepor Namek » 07 Oct 2018, 02:33

explorer escribió:El formato del archivo .z80 almacena los 48 kB de la memoria del ZX Spectrum, así que es de suponer que el primer byte que se mete en la memoria lo hace en la dirección 0x0000.
En la direccion 0 no se carga nada porque es ROM, los Snapshots del 48k se cargan a partir de 16384... :roll:

Avatar de Usuario
robcfg
Amiga 1200
Amiga 1200
Mensajes: 1939
Registrado: 07 May 2009, 15:34
Sistema Favorito: Amstrad CPC
primer_sistema: Atari 800XL/600XL
Ubicación: Estocolmo
Gracias dadas: 299 veces
Gracias recibidas: 89 veces

Re: Como hallar el punto de entrada de un juego en formato Z80

Mensajepor robcfg » 07 Oct 2018, 09:21

Namek escribió:
explorer escribió:El formato del archivo .z80 almacena los 48 kB de la memoria del ZX Spectrum, así que es de suponer que el primer byte que se mete en la memoria lo hace en la dirección 0x0000.
En la direccion 0 no se carga nada porque es ROM, los Snapshots del 48k se cargan a partir de 16384... :roll:


Eso no es correcto. En al especificación aparecen dos bytes que indican si los bloques 0-8192 y 8193-16384 son rom o ram. También puedes tener un Spectrum con una rom modificada o de otra país, con lo que seguramente quieras grabar el contenido para asegurarte que ese archivo .z80 es reproducible.

Aparte, el hecho de que lo que se graba son los 48Kb de la memoria:
After this header block of 30 bytes the 48K bytes of Spectrum memory follows...


Con lo que se tiene que cargar desde la posición 0 porque si no, te dejas 16Kb fuera.

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 596
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 13 veces
Gracias recibidas: 19 veces

Re: Como hallar el punto de entrada de un juego en formato Z80

Mensajepor Bubu » 07 Oct 2018, 09:45

Pero entóns, ¿por qué los .z80 no tienen todos 48KB? De hecho ninguno lo tiene. Aquí tengo uno con 6KB. ¿Hay compresión de datos?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
robcfg
Amiga 1200
Amiga 1200
Mensajes: 1939
Registrado: 07 May 2009, 15:34
Sistema Favorito: Amstrad CPC
primer_sistema: Atari 800XL/600XL
Ubicación: Estocolmo
Gracias dadas: 299 veces
Gracias recibidas: 89 veces

Re: Como hallar el punto de entrada de un juego en formato Z80

Mensajepor robcfg » 07 Oct 2018, 09:49

Si que la tienen, si:

After this header block of 30 bytes the 48K bytes of Spectrum memory follows in a compressed format (if bit 5 of byte 12 is set). The compression method is very simple: it replaces repetitions of at least five equal bytes by a four-byte code ED ED xx yy, which stands for "byte yy repeated xx times". Only sequences of length at least 5 are coded. The exception is sequences consisting of ED's; if they are encountered, even two ED's are encoded into ED ED 02 ED. Finally, every byte directly following a single ED is not taken into a block, for example ED 6*00 is not encoded into ED ED ED 06 00 but into ED 00 ED ED 05 00. The block is terminated by an end marker, 00 ED ED 00.


Viene todo en la especificación del formato que ha enlazado Explorer.

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2617
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 43 veces
Gracias recibidas: 169 veces
Contactar:

Re: Como hallar el punto de entrada de un juego en formato Z80

Mensajepor zup » 07 Oct 2018, 09:56

Especificación de los ficheros z80 (en WOS)

Correcto. Los z80 pueden llevar compresión (ver bit 5 del byte 12 de la primera cabecera). Lo de pueden llevar es un eufemismo, prácticamente todos lo llevan.

Aparte, los z80 también pueden ser de 16, 128 o 256k (solo los de las versiones 2 y 3), con lo que amplías el abanico de posibilidades.

En el caso más sencillo (48k, versión 1) los datos se cargan siempre a partir de 16384, y el punto de entrada está en los bytes 6 y 7 de la cabecera del fichero.

Si quieres algo más sencillo y rápido de implementar, te recomendaría que empieces con el formato sna de 48k. El único "truco" es que PC está contenido en la pila... tienes que poner SP como te indica la cabecera y después ejecutar una instrucción RETN para poner en marcha el programa (hay uno en la dirección 114 de la ROM standard).
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 596
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 13 veces
Gracias recibidas: 19 veces

Re: Como hallar el punto de entrada de un juego en formato Z80

Mensajepor Bubu » 07 Oct 2018, 10:56

Esto es un poco liosillo. A ver, he cogido un .z80 y lo he abierto con un editor hexadecimal, y empieza así:

z80hex.png
z80hex.png (15.2 KiB) Visto 476 veces


Como veis, en la posición 6 que es donde se guarda P.C., hay un 0x0000. Y en la posición 30 que es donde se indica la versión del archivo, hay un 0x36 = 0x0036 = 54, por lo que es versión 3. Esto sisnifica que la cabecera del .z80 va del byte 0 al 86.
Si ahora miro la posición 32 ¿otro P.C.? Resulta que el valor almacenado ahí es 0x0038, que es la rutina de la ROM del BASIC que se ejecuta constantemente para leer el teclado.

Entóns, ¿esto es así? ¿Si yo cargo ese juego en .z80, el emulador se va a la ROM? Entiendo que este juego a lo mejor no usa IM2 ni deshabilita las interrupciones con DI, y entóns es la ROM quien toma el control, el cual intentará ejecutar el pograma BASIC que haya en RAM, que a lo mejor tiene un RANDOMIZE USR con lo que así es como entra en el juego.

¿Pué ser?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2617
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 43 veces
Gracias recibidas: 169 veces
Contactar:

Re: Como hallar el punto de entrada de un juego en formato Z80

Mensajepor zup » 07 Oct 2018, 11:08

Prueba rápida:
- Abre ZX Spin y pulsa TAB (para que salte el debugger).
- Sin cerrar el debugger, arrastra el z80 a la ventana del ZX Spin.

El programa se carga, el debugger se actualiza y tienes PC (y todos los registros) justo en el mismo sitio donde están en el Z80.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 596
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 13 veces
Gracias recibidas: 19 veces

Re: Como hallar el punto de entrada de un juego en formato Z80

Mensajepor Bubu » 07 Oct 2018, 11:14

Muy buena prueba, zup, así se aclara todo, efestivamente :D

Pos sí, al cargar así el .z80 lo primero que ejecuta es la ROM en 0x0038. Qué curioso...
Además, veo que carga tamién la pantalla (V-RAM), por lo que entiendo que este .z80 ocupa toda la RAM, desde 16384 hasta 65535. OK, voy a hacer pruebas, muchas gracias, torpedo.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!


Volver a “Emuladores”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados