Como hacer tus cambios en la ROM del Spectrum

Aquí solo proyectos que incluyan el código fuente

Moderador: Fundadores

Reglas del Foro
Si no se incluyen los fuentes, se debe usar el foro de proyectos de software generales
Avatar de Usuario
stratotrasto
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 2494
Registrado: 20 Feb 2014, 17:23
Ubicación: Abula

Como hacer tus cambios en la ROM del Spectrum

Mensaje por stratotrasto »

Bueno, abro este post para continuar con esto:

http://www.va-de-retro.com/foros/viewto ... &start=180

La idea es que usando un ensamblador y conociendo lo que hace cada parte de la ROM original hagamos nuestros cambios y demás. Además de empezar a usar un ensamblador y me imagino que aprender un poco de código máquina del Z80. Mi gran asignatura pendiente desde mi infancia.

Así que, queda abierto el post.

Empecemos....

La cosa empezó por aquí:
antoniovillena escribió:La gosh wonderful es una modificación de Geoff Wearmouth que aparte de tokenizar tiene otras mejoras, aquí tienes una lista:

http://www.wearmouth.demon.co.uk/gw03/gw03info.htm

Si quieres una ROM tokenizada lo más compatible con la ROM original puedes añadirle tú mismo el código. A mí me lo explicó el propio Geoff y la verdad es que no era muy complicado. Los cambios están indicados en este archivo con la constante de ensamblado condicional "easy":

http://sourceforge.net/p/emuscriptoria/ ... leches.asm
stratotrasto escribió:
antoniovillena escribió:La gosh wonderful es una modificación de Geoff Wearmouth que aparte de tokenizar tiene otras mejoras, aquí tienes una lista:

http://www.wearmouth.demon.co.uk/gw03/gw03info.htm

Si quieres una ROM tokenizada lo más compatible con la ROM original puedes añadirle tú mismo el código. A mí me lo explicó el propio Geoff y la verdad es que no era muy complicado. Los cambios están indicados en este archivo con la constante de ensamblado condicional "easy":

http://sourceforge.net/p/emuscriptoria/ ... leches.asm
Me sobre estimas, algún día entenderé que es todo esto.... Pero gracias!
antoniovillena escribió:
stratotrasto escribió: Me sobre estimas, algún día entenderé que es todo esto.... Pero gracias!
Si te apetece te lo explico, no es muy complicado. Como dice flopping los cambios están en el código fuente de CargandoLeches.

La ROM original del 48K tiene muchos bugs, y hay muchas modificaciones con remiendos. Pero desgraciadamente mientras más se modifique la ROM, más incompatibilidad presenta la misma en la carga de juegos.

La ROM de la Gosh Wonderful lleva muchas modificaciones, y es propensa a que no te cargue bien algunos juegos. Lo que te decía es que si quieres una ROM que tokenize lo que escribas, puedes copiar parte del código de CargandoLeches a la ROM original. De esta forma la diferencia entre la ROM original será mínima y será más compatible con los juegos.

Ahora bien, para hacer los cambios necesitas dos cosas:
-un ensamblador
-saber hacer las inserciones

Lo segundo quiere decir que si metes instrucciones nuevas, la ROM te ocupará más de 16K. Por lo tanto tienes que conseguir que el tamaño sea correcto, borrando bytes libres por otro lado. Para esto te recomiendo que compares ambas ROMs con un editor hexadecimal.

Si todo esto te sigue sonando a chino, pues nada. Si te interesa te puedo ayudar a que lo hagas.
Pues eso, que me interesa y seguro que a muchos de aquí también!
Si me muero no dejéis a mi mujer vender mis cacharros por lo que le dije que me costaron...
Avatar de Usuario
antoniovillena
Demonio segundo orden
Demonio segundo orden
Mensajes: 1596
Registrado: 02 Abr 2013, 19:06
Been thanked: 1 time

Re: Como hacer tus cambios en la ROM del Spectrum

Mensaje por antoniovillena »

Bueno primero de todo nos bajamos un ensamblador. Yo uso SjAsmPlus para todo, aunque podéis usar el que queráis siempre que adaptéis los fuentes.

http://sourceforge.net/projects/sjasmplus/

Segundo paso es bajarse la ROM del 48K. Los mejores fuentes que hay en internet son estos, están ultracomentados:

http://www.wearmouth.demon.co.uk/zx82.htm

Yo mismo he adaptado ese mismo fichero para que ensamble con SjAsmPlus sin errores. También podéis hacerlo vosotros corrigiendo poco a poco los errores que vayan saliendo. Aquí tenéis el archivo.
48.zip
Ahora os vais a la carpeta donde tengáis el ejecutable SjAsmPlus.exe, copiáis el 48.asm y escribís bajo línea de comandos lo siguiente:

Código: Seleccionar todo

SjAsmPlus 48.asm
Esto ensamblará el archivo y generará 48.rom en la misma carpeta, y si hay errores de ensamblado los mostrará. Para verificar que todo ha ido bien podéis comparar el archivo binariamente con el original, que podéis encontrar en la carpeta roms de cualquier emulador.

Código: Seleccionar todo

fc /b 48.rom c:\ruta\emulador\roms\48.rom
Si todo va bien debéis ver un mensaje que pone FC: no se han encontrado diferencias.

Mañana sigo con la siguiente lección. Espero que los que me sigáis hayáis llegado hasta este punto.
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Avatar de Usuario
flopping
Fundador
Fundador
Mensajes: 9971
Registrado: 29 Mar 2013, 15:26
Ubicación: Valencia
Been thanked: 122 times
Contactar:

Re: Como hacer tus cambios en la ROM del Spectrum

Mensaje por flopping »

Pues si que interesa el tema y mucho, en mi caso no es quiera modificar en exceso la ROM original, pero si que quiero hacerme unas roms de testeo de memoria, ULA y cosas así, ya que mi idea es hacerme un interface para testear equipos y saber que puede estar fallando sin demasiadas complicaciones, así que Antonio, te necesito, jejejeejeje...
No me hago responsable de mis post pues estan escritos bajo la influencia del alcohol y drogas psicotropicas, por la esquizofrenia paranoide.
(C) 1982-2024, 42 años de ZX Spectrum.
http://www.va-de-retro.com/ un foro "diferente".

Mi juego, que puedes descargar desde aqui
Avatar de Usuario
elfoscuro
Demonio segundo orden
Demonio segundo orden
Mensajes: 1825
Registrado: 01 Abr 2013, 22:00
Been thanked: 25 times

Re: Como hacer tus cambios en la ROM del Spectrum

Mensaje por elfoscuro »

Recordad que la ROM del spectrum no está llena, por lo que igual no es necesario hacer nada de esto.

Creo recordar que hay más de 1K de RAM al final de la ROM (antes de la dirección 16384) que si la idea es ponerle una EPROM, se puede aprovechar. Yo la he usado en algún emulador para tener un juego de caracteres alternativo, sin eliminar el original.

1K y pico en ASM puro y duro, dan mucho de si :-), y para añadir cuatro cosas que puedas necesitar sin perder la compatibilidad te vale.

Eso si, a nivel educativo, hacer una ROM propia desde el fichero ASM para compilar, es un buen ejercicio.

Un saludo.
Fin de impresión
Avatar de Usuario
antoniovillena
Demonio segundo orden
Demonio segundo orden
Mensajes: 1596
Registrado: 02 Abr 2013, 19:06
Been thanked: 1 time

Re: Como hacer tus cambios en la ROM del Spectrum

Mensaje por antoniovillena »

Exacto, hay poco más de 1K antes del juego de caracteres $3d00. Concretamente va desde $386e hasta $3cff. Aunque por motivos de compatibilidad no es recomendable modificar los primeros y últimos bytes de cada página (una página son 256 bytes, por ejemplo la página $3900 va desde $3900 hasta $39ff).

Para seguir esta guía no es imprescindible saber ensamblador, pero no está demás saber algo. La primera modificación que voy a hacer es un simple snippet que cambia el color del borde.

Código: Seleccionar todo

        ld      a, $01
        out     ($fe), a
        ret
Lo pegamos justo en la dirección que he dicho antes. En el fuente de la ROM, las direcciones vienen indicadas con etiquetas que empiezan por L y tienen un número hexadecimal. Así que desde nuestro editor le damos a la función buscar y ponemos la cadena L386E. Cuando la hayamos encontrado, insertamos el snippet:

Código: Seleccionar todo

;; spare
L386E:  

        ld      a, $01
        out     ($fe), a
        ret

        DEFB    $FF, $FF        ;


        DEFB    $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF;
        DEFB    $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF;
        DEFB    $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF;
Ahora ensamblamos y si intentamos ejecutar el fichero en el emulador vemos que no lo carga. Lo que ha pasado es que las instrucciones que hemos añadido han engordado 5 bytes el fichero, que ahora ocupa 16389 en lugar de los 16384 que tenía que ocupar. Una solución sería recortar 5 bytes de las cadenas $FF que hay debajo, algo como esto:

Código: Seleccionar todo

;; spare
L386E:  

        ld      a, $01
        out     ($fe), a
        ret

        DEFB    $FF, $FF        ;


        DEFB    $FF, $FF, $FF
        DEFB    $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF;
        DEFB    $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF;
Ahora al ensamblar nos da el tamaño correcto. Pues bien como es un coñazo tener que recortar bytes $FF cada vez que insertamos algo, lo que yo hago es lo siguiente:

Código: Seleccionar todo

;; spare
L386E:  block   $3d00-$, $ff

; -------------------------------
; THE 'ZX SPECTRUM CHARACTER SET'
; -------------------------------

;; char-set

; $20 - Character: ' '          CHR$(32)

L3D00:  DEFB    %00000000
        DEFB    %00000000
La directiva block te rellena automáticamente con $FF los bytes que faltan hasta llegar a $3d00. Os adjunto el programa con este truco (sin el añadido de 5 bytes), aunque también podéis obtenerlo modificando del anterior.
48.zip
Por último, para probar el snippet supongo que lo sabéis ya pero lo digo. Antes de ejecutar la nueva ROM comprobad que vais por buen camino comparando con la ROM original con la orden "fc" que expliqué antes. Os debe salir algo así:

Código: Seleccionar todo

Comparando archivos 48.rom y ..\ROM\48.ROM
0000386E: 3E FF
0000386F: 01 FF
00003870: D3 FF
00003871: FE FF
00003872: C9 FF
Esto significa que hay sólo 5 bytes de diferencia entre una ROM y otra, lo que se corresponde con el cambio que hemos hecho. Lo siguiente es ejecutar la ROM modificada en emulador y lanzar el código del snippet.

Para ejecutar código máquina desde Basic se emplea USR x, siendo x la dirección en decimal a donde queremos saltar. Hay que poner algo antes del USR, yo suelo poner PRINT aunque normalmente se emplea un RANDOMIZE. Y calcular la x os lo dejo para vosotros. La propia calculadora de Windows tiene un conversor hexadecimal->decimal. Abrís la calculadora, pulsáis Alt+3 para ponerla en modo programador, pincháis en la opción Hexa e introducís el número 386e. Luego pincháis en Dec y allí tenéis el valor decimal que buscamos.

Pues desde basic escribís:
► Mostrar Spoiler
Tras lo cual debéis apreciar un cambio en el color del borde.

Bueno eso es todo por ahora, si veis algún fallo o tenéis alguna duda, preguntad.
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Última edición por antoniovillena el 29 Ene 2015, 01:59, editado 3 veces en total.
Avatar de Usuario
antoniovillena
Demonio segundo orden
Demonio segundo orden
Mensajes: 1596
Registrado: 02 Abr 2013, 19:06
Been thanked: 1 time

Re: Como hacer tus cambios en la ROM del Spectrum

Mensaje por antoniovillena »

Nota: Muchos emuladores (por ejemplo Spectaculator) permiten cargar una ROM simplemente arrastrando y pegando el archivo, lo cual es muy util si queréis probar una ROM sin tener que hacer un cambio permanente en la configuración. Esto lo hacen así supongo que para hacer fácil la carga de juegos en cartucho, que básicamente actúan como reemplazos de ROM.

Si no sabéis escribir los tokens, PRINT se escribe con P, y USR con Extend+L. El modo Extend se pone pulsando a la vez Caps Shift y Symbol Shift (también con la tecla Extend/Extra en los modelos plus y de 128K).
Avatar de Usuario
eltargui
Demonio tercer orden
Demonio tercer orden
Mensajes: 516
Registrado: 29 Abr 2014, 16:33

Re: Como hacer tus cambios en la ROM del Spectrum

Mensaje por eltargui »

Gracias. Muy interesante. Yo también quería meterme con esto.
ZX eltargui un blog dedicado a los micro-ordenadores Sinclair
Avatar de Usuario
antoniovillena
Demonio segundo orden
Demonio segundo orden
Mensajes: 1596
Registrado: 02 Abr 2013, 19:06
Been thanked: 1 time

Re: Como hacer tus cambios en la ROM del Spectrum

Mensaje por antoniovillena »

En la lección de hoy vamos a aprender 2 cosas:
  • Utilizar ensamblado condicional para que cualquiera pueda configurar nuestra ROM con las constantes del principio de fichero.
  • Saltar a la rutina que hagamos de una forma más fácil que con PRINT USR x
El ensamblado condicional es un IF que en realidad pertenece al preprocesador, y si lo ponemos en función de constantes (definiendo las constantes al comienzo) podemos hacer que nuestro fichero ensamble unas partes u otras dependiendo de lo que le indiquemos al comienzo del archivo. Esto puede ser muy útil si por ejemplo queremos combinar varios parches, y queremos que estos se activen/desactiven por separado.

Vamos al lío. Partimos del snippet anterior, el que cambia el color del borde. Lo primero es definir las constantes al principio del archivo.

Código: Seleccionar todo

        DEFINE  borde
        DEFINE  bordecolor  3

        OUTPUT  48.rom

;************************************************************************
;** An Assembly File Listing to generate a 16K ROM for the ZX Spectrum **
;************************************************************************
Con la constante "borde" decimos si queremos o no que se inserte el snippet. Si no queremos insertarlo comentamos con punto y coma el comienzo del define, y cuando ensamble tendremos exactamente la ROM original del spectrum.

La constante "bordecolor" indica el color con el que se cambiará el borde en caso de que esté activado el snippet. Es más fácil tenerlo aquí como constante que tener que buscar la línea donde está el código para hacer la modificación.

El código del snippet (con ensamblado condicional) sería el siguiente:

Código: Seleccionar todo

;; spare
L386E:
      IFDEF borde
        ld      a, bordecolor
        out     ($fe), a
        ret
      ENDIF

        block   $3d00-$, $ff

; -------------------------------
; THE 'ZX SPECTRUM CHARACTER SET'
; -------------------------------
Ya está insertado el snippet. Ensamblamos con definición de constante "borde" sin comentar y con un PRINT USR 14446 lo podemos ejecutar.

Vamos ahora a la segunda parte de la lección. Queremos ejecutar nuestro snippet sin tener que recordar ningún número. Esto lo podemos hacer apuntando a nuestro snippet con comandos que en el 48K existan pero que estén sin implementar. Tenemos estos 4 para elegir: CAT, ERASE, FORMAT y MOVE. Yo suelo hacer esto con el CAT, que se escribe con Extend,Symbol Shift+9. Recuerda que el modo extendido se introduce con Caps Shift+Symbol Shift y debe cambiar el cursor por una E parpadeante.

Pues nos vamos a la zona en cuestión y escribimos esto:

Código: Seleccionar todo

;; P-CAT
L1B14:  DEFB    $00             ; Class-00 - No further operands.
      IFDEF borde
        DEFW    L386E           ; Address: $386E; cambia borde
      ELSE
        DEFW    L1793           ; Address: $1793; Address: CAT-ETC
      ENDIF
Ojo: cada vez que pongo un fragmento, en lugar de poner el número de línea donde está tenéis que buscar una cadena que nos sirva para localizarlo. Valdría "P-CAT" pero en este caso es más sencillo poner la etiqueta "L1B14".

Ensamblamos de nuevo y ejecutamos la ROM (recordad el truco de arrastrar y soltar el archivo a la ventana del emulador), con lo que ya tendríamos que ver el cambio de borde al escribir CAT+Enter desde Basic.
Avatar de Usuario
stratotrasto
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 2494
Registrado: 20 Feb 2014, 17:23
Ubicación: Abula

Re: Como hacer tus cambios en la ROM del Spectrum

Mensaje por stratotrasto »

Bueno, yo no he hecho los deberes. Llevo rol el día fuera de casa y llego ahora muerto
Ya mañana me pondré a ello. Muy interesante. Gracias por tu tiempo Antonio Villena.
Si me muero no dejéis a mi mujer vender mis cacharros por lo que le dije que me costaron...
Avatar de Usuario
antoniovillena
Demonio segundo orden
Demonio segundo orden
Mensajes: 1596
Registrado: 02 Abr 2013, 19:06
Been thanked: 1 time

Re: Como hacer tus cambios en la ROM del Spectrum

Mensaje por antoniovillena »

De nada. Lo estoy haciendo poco a poco para no resultar muy pesado. Es muy importante leerse el hilo completo desde el principio. A ver si mañana tengo tiempo y pongo el snippet tokenizador.
Responder

Volver a “Proyectos de software abiertos”