¡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?
Como hallar el punto de entrada de un juego en formato Z80
- Bubu
- Atari 1040 STf
- Mensajes: 886
- 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: 20 veces
- Gracias recibidas: 60 veces
Como hallar el punto de entrada de un juego en formato Z80
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!
- explorer
- MSX Turbo R
- Mensajes: 410
- 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 dadas: 2 veces
- Gracias recibidas: 142 veces
- Contactar:
Re: Como hallar el punto de entrada de un juego en formato Z80
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
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.
- Namek
- Atari 1040 STf
- Mensajes: 838
- Registrado: 11 Jul 2011, 13:13
- Gracias dadas: 18 veces
- Gracias recibidas: 63 veces
Re: Como hallar el punto de entrada de un juego en formato Z80
En la direccion 0 no se carga nada porque es ROM, los Snapshots del 48k se cargan a partir de 16384...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.
- robcfg
- Amiga 2500
- Mensajes: 2148
- Registrado: 07 May 2009, 15:34
- Sistema Favorito: Amstrad CPC
- primer_sistema: Atari 800XL/600XL
- Ubicación: Estocolmo
- Gracias dadas: 867 veces
- Gracias recibidas: 172 veces
- Contactar:
Re: Como hallar el punto de entrada de un juego en formato Z80
Namek escribió:En la direccion 0 no se carga nada porque es ROM, los Snapshots del 48k se cargan a partir de 16384...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.
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.
- Bubu
- Atari 1040 STf
- Mensajes: 886
- 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: 20 veces
- Gracias recibidas: 60 veces
Re: Como hallar el punto de entrada de un juego en formato Z80
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!!
- robcfg
- Amiga 2500
- Mensajes: 2148
- Registrado: 07 May 2009, 15:34
- Sistema Favorito: Amstrad CPC
- primer_sistema: Atari 800XL/600XL
- Ubicación: Estocolmo
- Gracias dadas: 867 veces
- Gracias recibidas: 172 veces
- Contactar:
Re: Como hallar el punto de entrada de un juego en formato Z80
Si que la tienen, si:
Viene todo en la especificación del formato que ha enlazado Explorer.
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.
- zup
- Amiga 2500
- Mensajes: 2973
- 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: 68 veces
- Gracias recibidas: 329 veces
- Contactar:
Re: Como hallar el punto de entrada de un juego en formato Z80
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).
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!
Además vendo cosas!
- Bubu
- Atari 1040 STf
- Mensajes: 886
- 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: 20 veces
- Gracias recibidas: 60 veces
Re: Como hallar el punto de entrada de un juego en formato Z80
Esto es un poco liosillo. A ver, he cogido un .z80 y lo he abierto con un editor hexadecimal, y empieza así:
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?
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!!
- zup
- Amiga 2500
- Mensajes: 2973
- 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: 68 veces
- Gracias recibidas: 329 veces
- Contactar:
Re: Como hallar el punto de entrada de un juego en formato Z80
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.
- 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!
Además vendo cosas!
- Bubu
- Atari 1040 STf
- Mensajes: 886
- 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: 20 veces
- Gracias recibidas: 60 veces
Re: Como hallar el punto de entrada de un juego en formato Z80
Muy buena prueba, zup, así se aclara todo, efestivamente
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.
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!!
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados