Si no sabes cómo está estructurada la ROM de tu ZX Spectrum y no tienes ni idea de código máquina, este es tu hilo. Si ya tienes conocimientos, es mejor que consultes el hilo abierto por stratotrastro y antoniovillena aqui.
¿Qué necesitas?
1- El fichero de la ROM original del Spectrum. Puedes bajártelo del hilo anterior. Este fichero está comentado y te da explicaciones en cada instrucción.
2- Un programa ensamblador. Igualmente, recomiendo que te bajes el programa propuesto en el hilo anterior. Es el que yo he usado. La manera de ensamblar el fichero editado de la ROM se explica muy claramente en el hilo de antoniovillena y strato.
3- Un editor de textos. El que más te guste. Yo uso Notepad++, muy completo y potente.
4- Un emulador. Recomendable que tenga la opción de “Debugger” de manera que puedas incluso modificar la ROM una vez está corriendo en el emulador. Yo recomiendo Spectaculator y sobre todo, para este caso, ZX Spin.
Referencias:
1- Libro “The Complete Spectrum ROM Disassembly” de Dr. I. Logan y F. O´Hara. Ed. Melbourne House (1983). Puedes bajártelo en formato PDF de WOS.
2- Libro “Código Máquina del ZX Spectrum” de Jesús Alonso Rodriguez. Ed. Hobbypress SA (1986). Puedes bajártelo en formato PDF de WOS.
3- Las microfichas del curso de Código Máquina de Microhobby. Puedes bajártelo de la web de El Trastero.
La ROM del Spectrum en cuatro palabras
La ROM ocupa 16k, desde las direcciones 0000 a 16383 (3FFFh). Está estructura en 3 bloques principales y en este orden:
1- Sistema Operativo: 7k
2- Traductor BASIC: 8k
3- Juego de caracteres: 1k
En esos primeros 7k están almacenadas todas aquellas rutinas o grupos de órdenes que el micro utiliza para inicializar registros y datos, las rutinas de INPUT/OUTPUT (altavoz, casete, teclado, etc.), entre otros.
En la dirección 0000 comienza la rutina de arranque del ordenador “START” (al ponerlo en marcha o tras un reset).
Cambiar el BORDER
Al poco de iniciarse la rutina START, se salta a la rutina START/NEW en la dirección 11CBh. En la dirección 11CCh, se pueden identificar las siguientes instrucciones:
LD A, +07
Esta rutina carga en el registro del acumulador (A) el valor hexadecimal +07, o en binario 00000111. La siguiente instrucción es:
OUT (+FE), A
Esta instrucción envía el valor del acumulador A al puerto +FEh (puerto I/O de la ULA), que en decimal es 254. Los tres primeros bits almacenan el color del borde.
Pues si nos gusta tener el borde en color negro, no hay más que introducir su valor en hexadecimal al acumulador. El valor por defecto es +07h (00000111) que se corresponde con el color blanco. La codificación de colores que se ve en la tabla de la figura también nos servirá más adelante.
En binario: 00000000
En hexadecimal: 00h
Lo tendríamos cambiando la instrucción anterior por:
LD A, +00
Cambiar PAPER y el INK
Vamos a ver ahora cómo darle un aspecto retro total, poniendo el PAPER en color negro e INK en color blanco, justo a la inversa de cómo está por defecto.
En la dirección 1265h hay que buscar el siguiente grupo de instrucciones:
LD A, +38
LD (ATTR-P), A
LD (ATTR-T), A
LD (BORDCR), A
Estas instrucciones cargan el valor del acumulador (+38h, o en binario 00111000) en las variables del sistema ATTR-P, ATTR-T y BORDCR. La variable ATTR-P es para colores y atributos permanentes (PAPER, INK, FLASH y BRIGHT). ATTR-T es igual para uso temporal. Y BORDCR define los valores de atributos del borde en el área de edición, es decir, las dos últimas líneas.
Los atributos se fijan con un byte de la siguiente manera:
Bit 7: FLASH
Bit 6: BRIGHT
Bit 5-3: PAPER
Bit 2-0: INK
El valor por defecto es 00111000, lo cual significa que el FLASH y BRIGHT están desactivados (su bit con valor 0), el PAPER tiene el valor 111 que se corresponde con el color blanco, y finalmente el valor de INK es 000 que se corresponde con el color negro.
Poniendo el valor 00000111 (+7h) conseguimos el PAPER negro (000) e INK blanco (111). Por lo tanto no hay más que cambiar la siguiente instrucción de la rutina que estamos estudiando y ya lo tenemos:
LD A, +07
Cambiar el Mensaje de Copyright
Los mensajes del sistema se encuentran a partir de la dirección 1391h, y en particular en la dirección 1539h se encuentra el famoso mensaje del copyright. El mensaje ocupa 28 bytes (28 caracteres), por lo tanto ese es el espacio de que disponéis para poner vuestra presentación. Si es más largo habrá problemas de direccionamiento y no funcionará la ROM. Si es menos, no pasará nada.
Antes del mensaje de copyright, tenéis todos los mensajes de error. Seguro que alguno tiene la tentación de traducirlos o poner otros. Siempre hay que tener presente la longitud del original.
Por supuesto que una modificación mayor se puede hacer, pero ya no serías un principiante.
Cambiar el Juego de Caracteres
En realidad no vamos a cambiar el juego de caracteres, algo que es más laborioso, pero sí vamos a modificar un carácter. ¿Alguien ha usado el símbolo de libra para algo?. Pues yo prefiero tener la letra ñ. Aunque en la ROM hay espacio disponible, vamos a modificar el caracter para ver como se hace. El juego de caracteres está ubicado entre las direcciones 3D00h (15616) y la 3FFF (16383), que en la tabla ASCII son los caracteres desde el 32 al 127, ambos inclusive.
En el fichero ROM que te puedes descargar es muy fácil porque están “dibujados” los caracteres con 0 y 1, al final del fichero. El símbolo libra es el CHR$(96). Simplemente es modificar el patrón para tener una “ñ”, cambiando los 0 y los 1 “diseñando” nuestra letra. Si abres el fichero ROM en ZX Spin por ejemplo, tendrás que ir a la dirección 3F00h e introducir los códigos en hexadecimal 78, 00, 78, 44, 44, 44, 44 y 00, en lugar de los que están (00 1C 22 78 20 20 7E 00). Y al ejecutar la ROM tendrás una “ñ” al pulsar SS+x.
Sin embargo, el spectrum dispone de un espacio reservado para UDG al final de la memoria RAM física. En total son 168 bytes que se corresponden con 21 caracteres (21 x 8 = 168). La posición de memoria está apuntada por la variable del sistema UDG y que por defecto es a la dirección 65368. Es decir, después de la RAMTOP. Por lo que los últimos 168 bytes del spectrum están reservados para crear UDGs. Un CLEAR puede modificar este espacio. Estos 168 bytes no están vacíos, sino que se han volcado desde la ROM los caracteres de la A a la U en mayúsculas.
Espero que os sea de ayuda.