sábado, octubre 14, 2006

Diferencias entre Timex Computer 2048 y Sinclair ZX Spectrum (Parte 2)

Amigos,

Esta es la segunda parte de mi artículo sobre las direncias entre el Timex Computer 2048 y el Sinclair ZX Spectrum. La primera parte trataba los 1) Los diferentes modos de video y 2) La sincronización de video mediante el empleo de IN(255).

Continuamos con:

3.- Lectura del puerto FEh (254)

El puerto FEh es utilizado para leer el teclado y el puerto EAR para carga desde cinta. En ambos casos se lee la información de salida de la ULA.

En el TC2048 sólo se puede usar el puerto FEh para estos fines, en el ZX Spectrum, en cambio, todos los puertos pares son direccionados hacia la ULA por lo que se puede ocupar cualquier valor múltiplo de dos para leer el puerto FEh.

Al hacer IN al puerto 254, se obtiene el siguiente octeto:


B7-E-B5-k4-k3-k2-k1-k0



Donde:

  • E=Bit del estado de EAR (entrada de audio para carga desde cinta)
  • K4-k3-k2-k1-k0: bits que entregan la fila del teclado escaneada.
  • B7 y B5: bits que dependen de la arquitectura del microcomputador.



Los bits que dependen de la arquitectura tiene los siguientes valores:


  • En el ZX Spectrum B5=1 y B7=1
  • En el TC2048 B5=0 y B7=0


Esta diferencia puede ocasionar problemas de compatibilidad en algoritmos de carga turbo o de velocidad superior.

Tal es el caso de las Ultracargas desarrolladas por Antonio Villena Godoy que requieren una versión especial para el TC2048. Ver artículo sobre ultracargas.

Otro caso emblemático es URIDIUM. La versión oficial no es compatible con el TC2048. Para hacerlo compatible basta cambiar un byte!!!

ORG 9AFD
LD C,0 ; En C deja las teclas presionadas
LD B,1FH ; Valor para enmascarar (sólo deja las teclas)
LD A,BFH ; Fila: Enter-L-K-J-H
IN A,(FEH) ; Lee puerto
CPL ; complementa (1 apretado, 0 no)
RRA ; Lo rota a la derecha y deja el valor de “Enter” en el flag de carrier
RL C ; Deja el valor de “Enter” en el bit 0 de C
AND B ; Enmascara los 5 últimos bits
CP A,1H ; Compara con uno. Pero en TC2048 uno de los bits diferentes se propago
; debido a la rotación de A. Para hacerlo compatible se hace:
; CP A,11H <— cambio en TC2048
CCF ; Complementa el flag de carrier (1 si está apretada “L”, o no)
RL C ; Pone el valor de “L” en el bit 0 de C, en el bit 1 está “Enter”.


La versión parchada para TC2048 la pueden descargar en este post.


4.- Diferencias en la ROM

La ROM del TC2048 es diferente a la ROM del ZX Spectrum. La diferencia es que durante la inicialización se cambia el modo de pantalla a 0, mediante la instrucción out 255,0.

Para esto se crea una rutina en la zona de SPARE de la ROM y se reemplaza el llamado al despliegue del mensaje (PO_MSG) por el llamado a esta rutina (que a su vez llama a PO_MSG).

ZX Spectrum:

RAM_SET:
0x1219
...
0X1295 AF XOR A
0X1296 113815 LD DE,1538H
0x1299 CD0A0C CALL 0C0AH,PO_MSG
...
SPARE:
0x386E FFFFFFFFFFF



TC2048:

RAM_SET:
0X1219
...
0X1295 AF XOR A
0X1296 113815 LD DE,1538H
0x1299 CD6E38 CALL 386EH,SPARE
...
SPARE:
0x386E D4FF OUT (255),A
0X3870 CD0A0C CALL 0C0AH,PO_MSG
0X3873 C9 RET


Problemas de compatibilidad: Para aquellas aplicaciones que utilizan los códigos FF en la zona de SPARE en las primeras direcciones.


Un truco que se utilizaba frecuentemente y que hacía uso de esta zona de memoria es como sigue:

En el modo de interrupción IM2 cuando se produce una interrupción se ejecuta la subrutina de atención de interrupciones en la posición de memoria indicada por: 256*I+[Contenido del bus de datos] y el byte siguiente.

I corresponde al registro I.

Estos dos bytes se conocen como el vector de interrupciones.

Dado que el ZX Spectrum (o el TC2048) no contiene el hardware para poner un byte en el bus de datos en estas condiciones, este valor es siempre FFh. Por lo tanto la subrutina se ubica en las direcciones apuntada por:

256*I+255 y 256*I+256.


Lamentablemente si existe un periférico adicional este podría poner un dato en el bus de datos diferente a 255, es por esto que las aplicaciones más avanzadas utilizaban la siguiente técnica para asegurarse que la rutina de atención de interrupciones fuera llamada independiente del contenido del bus de datos:

Estos programas contenían una tabla de 257 posiciones de memoria comenzando en 256*I+0 que contenían el mismo valor: FFh. Entonces independiente del valor del bus de datos se lee la dirección FFFFh.

En la dirección FFFFh se pone el valor 18h equivalente a la instrucción JR. El siguiente valor leído es el contenido de 0000h (ROM) que corresponde a F3h (DI). Por lo tanto se realiza un salto equivalente a JR FFF4h. En esta posición (FFF4h) se pone un JP a la rutina real de atención de interrupciones.

Para ahorrase esta tabla, algunos programas usan la ROM. Como ya se vio la ROM del ZX Spectrum contiene los valores FF entre 386Eh (14446) y 3CFFh (15615). Dado lo anterior I s se podría cargar con 39,3A ó 3B. Dado que el TC2048 tiene estos valores con FF no existen problemas de compatibilidad, no así con el Microdigital TK90X que si presenta este problema .

Un ejemplo de esto ocurre en el juego Turbo Esprit:

E42C 3E3B LD A,3BH
E42E ED47 LD I,A
E430 ED5E IM2

FFF4 C322E6 JP E622H

FFFF 18F4 JR FFF4H


En este caso si se produce el problema y es necesario parchar el juego para cargarlo en el Microdigital TK 90X.


----------------------------------------------------------

Otras diferencias en investigación son:


  • Puerto 244 para selección de banco de memoria. Este valor no es borrado por un reset
  • Puerto de joystick kempston puesto a +5V y no a tierra como otros.




Saludos

JF

Sinclair ZX Interface 2

La "Sinclar ZX Interface 2" es un periférico que se instala en el slot de expansión del ZX Specrum y que provee dos puertos para joysticks y un conector para los ROM Cartridges.


Adicionalmente se provee la extensión del puerto de expansión pero únicamente para la conexión de la impresora "ZX Printer" .

La ZX Interface 2 se empezó a comercializar el año 1983 y costaba GB 19.95. Los cartridges costaban inicialmente GB 14.95.

Los puertos de joystick correspondían al estándar Sinclair que mapeaba los joysticks a las teclas numéricas en el siguiente orden: izquierda, derecha, abajo, arriba y disparo.:

  • Puerto 1: 6,7,8,9,0
  • Puerto 2: 1,2,3,4,5

El ROM cartridge estaba limitado a 16KB y se mapeba directamente a las direcciones 0 a 16383 que corresponden al espacio de memoria que ocupa la ROM del ZX Spectrum. No se provee ningún mecanismo de paging para pasar del cartridge a la ROM original y por lo tanto es imposible acceder a las rutinas de la ROM cuando se utiliza un cartridge.


Los juegos en cartridge por lo tanto debían ser de 16KB y no debían ocupar ninguna rutina de la ROM. Los juegos disponibles en formaton ROM catridge fueron los siguientes:


En el año 2005, Droy de "El Trastero del Spectrum" diseñó un cartridge de 512KB compatible con la ZX IF2: El ZX Flash Cart.

Este cart permite cargar hasta 10 juegos de 48KB en forma inmediata en el ZX Spectrum mediante una EPROM de 512KB.


Nota: Las fotos fueron sacadas del sitio sobre la ZX IF2 de Paul Farrow, el sitio más completo sobre la "ZX Interface 2" de Internet, del Trastero del Spectrum y de Planet Sinclair.

domingo, octubre 08, 2006

Ultracargas para Timex Computer 2048

Categorías: Timex Computer 2048 Sinclair ZX Spectrum

Amigos,

Las ultracargas son un método de carga para ZX Spectrum creado por Antonio Villena Godoy. Con las ultracargas es posible cargar un juego en el Spectrum vía la entrada de audio en menos de 30 segundos.

Ésta es la versión para Timex Computer 2048 a la que Antonio le realizó los cambios necesarios para funcionar en TC 2048 después que mi amigo Cristian González y yo lo contactamos y le explicamos las diferencias entre el el ZX Spectrum y el TC 2048: En el TC 2048 los bits 7 y 5 del puerto 254 son siempre 0.

La pueden descargar desde aquí. Esta versión es incompatible con el Sinclair ZX Spectrum.

El uso es extremadamente sencillo: ejecuten desde una ventana DOS:


sna2wav.com nombre_del_archivo.sna

El resultado es un archivo wav con el mismo nombre del archivo sna.


A mí sólo me ha funcionado cargar usando el wav resultante en Windows Media Player.

Cristián González ha conseguido cargar los wavs usando MP3 Player que soporta el formato wav directamente (duplicando el volumen previamente con GoldWave). Recuerden usar un cable mono para conectar el TC 2048 con la tarjeta de sonido del PC.

Saludos

JF

martes, octubre 03, 2006

Nintendo Wii: La consola virtual soportará juegos de Commodore 64

Categorías: Nintendo Wii Consola Virtual Juegos Commodore 64 Emulación
Amigos,

Una excelente noticia para los amantes de los video juegos clásicos.

Se ha confirmado que al menos una compañía (System 3 dueña de los derechos de los juegos de Epyx), publicará juegos clásicos de Commodore 64 para la consola virtual de Nintendo Wii.

En principio los juegos son:


Impossible Mission (Epyx, 1984)

California Games (Epyx, 1987)


The Last Ninja (System 3, 1987)


Fuente: Gamasutra

Saludos

JF

domingo, octubre 01, 2006

Mi nuevo juego para Atari 2600: Las Vizcachas 2006

Categorías: Juegos Atari 2600 Atari

Hola amigos,

Un nuevo juego para Atari 2600 creada usando el excelente compilador BATARI.

Mientras investigaba algunas cosas mejoras para Estar Guars se me ocurrió hacer este juego: Las Vizcachas 2006. Las Vizcachas es un centro de recreación y una pista de carreras ubicada en Chile. Más información en: http://www.lasvizcachas.cl/

Para jugarlo recomiendo Stella o en un Atari 2600 real mediante un cart programable.

Las instrucciones:

1.- En la pantalla inicial presionar fuego en el joystick para comenzar. La música durante esta pantalla es una variación de un tema conocido para los videojugadores.



2.- Durante el juego te mueves en la carretera. El objetivo es evitar los automóviles contrarios y las barreras que aparecen en la pista. Mientrás más avanzas vas tomando más velocidad. Los puntos aumentan dependiendo cuánto avanzas y a qué velocidad. Puedes tocas la bocina con el botón de fuego del joystick, pero como en la vida real, no te va a servir de mucho ;)



3.- Cuando chocas con otro autómovil o con una barrera pierdes una vida. Tienes 3 vidas en total.



4.- Pierdes cuando se te acaban todas las vidas. La pantalla de juego terminado muestra abajo el puntaje final. Para ir a la pantalla inicial, presiona el botón de fuego del joystick.



Espero que lo disfruten. Lo pueden descargar aquí.

Datos técnicos del juego:

  • Juego de 4KB
  • Música (melodía) durante inicio y final del juego.
  • Scroll horizontal
  • Sprites multicolores
  • Playfield multicolor
  • Uso de sprites: player0, player1 y ball

Saludos,

JF