• La de 48k también, carga todos los eventos de una y corre por evento y no por día. Me parece que cuando Ariel se refiere al "día" es los días que probó el cassette en la 2068, cuando lo probó la primera vez anduvo pero la segunda vez no.

    kasalewa

    Ehhh... no, la de 48K son dos partes, ese es el chiste de la versión 128, que es solo una parte con todo (y algo de música con el chip AY)

    Hernán


    Ah, pense que se referia a que el juego pasaba por "dias" y no por "eventos", ahora entendi a que se referian, mala mia.
     

  • Earth Light. Juego arcade con el original para ZX Spectrum (Earthlight48.tap.zip) y la versión adaptada para Timex Sinclair 2068 (EarthLight_TS2068.rar)
     

  • Header Maker

    Crea cabeceras para programas grabados en cintas (hoy en día en wav, mp3, tzx) y poder cargar directamente el cuerpo o datos del programa, sin el comando LOAD del Basic.
    Por ejemplo, si queremos cargar una pantalla sin cabecera en la Sinclair, debemos generar lo siguiente desde el programa.
    Sabemos que la dirección de comienzo de memoria de la pantalla en la Sinclair es 16384 y su longitud son 6912 bytes. En caso de desconocerlo, se puede obtener con el Analizador de Tapes que publique al principio de este foro.

    LD DE, 6912 (El registro DE es la longitud en bytes)
    LD IX 16384 (El registro IX marca la posición de comienzo de memoria)
    LD SP, (En este caso presionamos la tecla ENTER para ANULAR este comando, debido a que no se moverá el STACK de la PILA)
    LD A, (Presionamos ENTER ya que tomara el flag estándar 255. Se usa otros valores cuando se personaliza el programa, previamente grabado con otro valor de flag.)
    JP (Si no vamos a ejecutar otro programa en assembler luego de la carga de la pantalla, presionan ENTER para generar el comando RET que retorna del Assembler a Basic)
    Luego Ingresan el nombre del programa que genera la cabecera (10 caracteres).
    Confirman si los datos son correctos para generar el código máquina.
    Grabamos el programa.
    Generamos otra cabecera o salimos del sistema.

    El programa se graba dentro de la zona de memoria de la impresora 23300. Si queremos cargar la pantalla sin cabecera, escribimos los siguientes comandos.
    LOAD “” CODE : RANDOMIZE USER 23300

    El programa header-maker.tzx es compatible para TS2068 y ZX48k. Cuando este programa genera el código máquina , lo realiza según en la plataforma que esté corriendo (obteniendo ese dato desde las variables de sistemas)
    A modo de ejemplo, les dejo los archivos ejemplos de cabeceras header_Screen_TS.tzx y header_Screen_ZX.tzx para Timex Sinclair y Spectrum respectivamente y un archivo de pantalla sin cabecera del juego Crazy Bugs screen_crazy_bugs.tzx. Este juego no tiene pantalla de carga, y lo obtuve con un save.screen desde adentro del programa (esto lo explicaré en la próxima publicación con otras rutias de programación que tendrá relación con este).

    Otro ejemplo, es cargar un programa sin cabecera y ejecutarlo directamente sin que retorne al Basic.
    Los siguientes datos son del último juego Earth Ligth publicado, el cual el programa del juego comienza en la dirección 24501 y una longitud de 41035 bytes. Nuevamente estos datos se obtienen con el programa Analizador de Tapes publicado al principio de este foro.
    Debido a que la zona de Basic en la TS2068 comienza en la dirección 26710, el juego puede cargar con un LOAD ””, pero no retornaría correctamente al Basic para continuar con la siguiente instrucción RANDOMIZE USR 24576 para ejecutar el Juego.

    LD DE, 41035 (El registro DE es la longitud en bytes)
    LD IX, 24501 (El registro IX marca la posición de comienzo de memoria)
    LD SP, 23500 (Mover el STACK de la PILA. Por default la Timex comienza en la dirección 24576 )
    LD A, (Presionamos ENTER ya que tomara el flag estándar 255)
    JP 24576 (Equivalente a un RANDOMIZE USR 24576)
    Luego Ingresan el nombre del programa que genera la cabecera (10 caracteres).
    Confirman si los datos son correctos para generar el código máquina.
    Grabamos el programa.
    Generamos otra cabecera o salimos del sistema.

    Ya tenemos el programa cabecera para cargar el juego. Si bien su dirección estándar está dentro del buffer de la impresora 23300, también se lo puede reubicar en otra dirección de memoria, siendo este totalmente transportable.
    Esta es una de las tantas técnicas para poder compatibilizar programas de Spectrum con TS2068. (Cada programa es un mundo y el trabajo es bastante manual).

    También se puede crear cabeceras con el programa Analizador de Tapes, en la opción de Ver /Modificar Cabecera. La diferencia que estas cabeceras no son programas para ejecutar (USR xxxxx). Son audios para cargar como cabecera y luego el audio del programa (para usar con los comandos LOAD “” o LOAD “” CODE).
     

  • Grabar Pantallas Por Vector de Interrupción Enmascarados

    Este es un programa residente que se instala / carga en memoria RAM en la TS2068 (archivo TS2068_SaveScreen_IM2.tzx) o en la ZX Spectrum (archivo ZX_SaveScreen_IM2.tzx) el cual nos permite realizar un SAVE SCREEN$ en cualquier momento, presionando las teclas Symbol-Shift + SPACE . Al presionar estas dos teclas, automáticamente graba la pantalla por la salida de audio de las Sinclair.

    A tener en cuenta que este tipo de SAVE SCREEN$, son sin los datos de cabecera. Solo el cuerpo de datos que está almacenado en la memoria de pantalla, por lo cual, para poder cargar este archivo, es necesario crear una cabecera, ya sea con el programa Header – Maker (mencionado en mi publicación anterior) o con el Analizador de Tapes (1era publicación). Otra opción es usar los archivos cabeceras publicados header_Screen_TS.tzx y header_Screen_ZX.tzx para Timex Sinclair y Spectrum respectivamente

    Técnicamente el programa consiste en el manejo de interrupción por software (interrupciones enmascaradas), el cual ocupa la dirección de memoria #5B5B (23387) para la rutina que graba una pantalla (save screen) mas 45 bytes según la versión TS o ZX. Y la zona de memoria para almacenar el vector de interrupción que va desde #FE00 hasta #FF01.
    Al cargar el programa, automáticamente queda instalado el programa residente en memoria el cual es ejecutado en código máquina en la dirección 65000. A partir de ese momento, presionando las teclas Symbol-Shift + SPACE o BREAK corre la rutina de Save Screen.

    Comportamiento en BASIC: Estando con el cursor para escribir comandos en Basic, o dentro de un programa que está corriendo en BASIC, se podrá grabar pantallas presionando las teclas mencionadas en todo momento. También podrán presionar la tecla BREAK para interrumpir el proceso sin inconvenientes.

    Comportamiento en Código Máquina: Para los programas comerciales como ser los juegos, también funcionará la rutina para grabar pantallas, salvo que el programa comercial ocupe las zonas de memoria de los vectores de interrupción (#FE00 - #FF01) y/o la zona de memoria de la impresora (#5B00 – #5C00). También podrán presionar la tecla BREAK para interrumpir el proceso, pero quizás con los inconvenientes de retornar al BASIC en un mal momento o no.

    Pruebas realizadas en Programas Comerciales: Subo un par de pantallas que obtuve desde adentro del juego Crazy Bugs (archivo screen_crazy_bugs.tzx) y Casino (archivo screen_casino.tzx). El proceso de interrupción se puede dar en ciertas pantallas, ya que el programa del juego puede estar utilizando en ese momento sus propios vectores de interrupción, con lo cual anulan momentáneamente o en forma definitiva el vector del llamado a la rutina Save Screen.
    Pongo como ejemplo el Juego Flight Simulator. Solo se puede grabar las pantallas del menú de selección (En Vuelo, Despegue, Acercamiento A la Pista). Durante el juego del vuelo no se acciona, ya que el Flight Simulator en esas pantallas tiene sus propios manejos de interrupciones enmascaradas.
    Igualmente, esto se soluciona utilizando Interrupción NO Enmascarados que son por hardware donde sí o sí interrumpen cualquier proceso para ejecutar una rutina (En la próxima publicación explicaré y subiré la rutina SAVE SCREEN para ser ejecutada desde una NMI)

    Modo de Uso: Primero se debe cargar el programa TS2068_SaveScreen_IM2.tzx o ZX_SaveScreen_IM2.tzx según corresponda a la máquina que usemos, y luego el programa propio o comercial que deseamos capturar la grabación de pantalla.

    Si bien hoy en día los emuladores de Sinclair cuentan con herramientas propias para capturar pantallas, estos son ejemplos para utilizar con hardware real, al igual de todo los programas que he subido hasta ahora, homologándolos en máquinas físicas (como si estuviéramos en 1985  ).
     

  • NMI: Grabar Pantallas Por Vector de Interrupción NO Enmascarados

    A diferencia de las interrupciones por Software IM2, las interrupciones no enmascaradas NMI, pueden interrumpir en cualquier momento la ejecución de un programa, dando prioridad a que se ejecute una rutina.
    Esta función está ubicada en la ROM dentro de la dirección #0066 hasta 00#73 donde obtiene el valor de salto a una rutina cuando se presiona el botón NMI dentro de las variables del sistema 23728 y 23729 (#5CB0 y #5CB1). Si ambos valores son ceros, entonces el ordenador se resetea. Si contiene un valor distinto de cero, no hace nada, porque esta función está bloqueada para las Sinclair. Algunos pensaban que era un bug de la ROM, pero en realidad es una protección a pedidos de los fabricantes de software comerciales, para que nadie pueda tomar el control por medio de este tipo de interrupciónes.
    En este caso vamos a forzar a cambiar esta condición JR NZ, #0070 por JR Z, #0070 (sería un equivalente a un POKE 109,40). Obviamente que en la ROM no se pueden alterar valores, (salvo que reescribamos la ROM en una EPROM con este cambio). por lo que haremos todos estos ensayos con un emulador FUSE, el cual yo elegí para el botón NMI y configurar la escritura en la ROM.

    Cargando los programas savescreenTS2068_NMI.tzx o savescreenzx_NMI.tzx (Timex Sinclair o Spectrum respectivamente) , automáticamente queda instalado el programa residente en memoria el cual es ejecutado en código máquina en la dirección de memoria #5B04 (23300). A partir de ese momento, presionando el botón NMI del emulador, corre la rutina de Save Screen.

    Al igual que en la publicación anterior, hay que tener en cuenta que este tipo de SAVE SCREEN$, son sin los datos de cabecera. Solo el cuerpo de datos que está almacenado en la memoria de pantalla, por lo cual, para poder cargar este archivo, es necesario crear una cabecera, ya sea con el programa Header – Maker (ya explicado anteriormente) o con el Analizador de Tapes (1era publicación). Otra opción es usar los archivos cabeceras publicados header_Screen_TS.tzx y header_Screen_ZX.tzx para Timex Sinclair y Spectrum respectivamente

    Comportamiento en BASIC: Estando con el cursor para escribir comandos en Basic, o dentro de un programa que está corriendo en BASIC, se podrá grabar pantallas, presionando el botón NMI del emulador. También podrán presionar la tecla BREAK para interrumpir el proceso sin inconvenientes.

    Comportamiento en Código Máquina: Para los programas comerciales como ser los juegos, también funcionará la rutina para grabar pantallas (presionando el botón NMI del emulador). Accionando la tecla BREAK podrán interrumpir el proceso, pero quizás con los inconvenientes de retornar al BASIC en un mal momento o no.

    Pruebas realizadas en Programas Comerciales: Subo como primer ejemplo una pantalla salvada desde adentro del juego Flight Simulator (archivo screen_flightsimulator.tzx) en pleno vuelo.
    Otra pantalla salvada es para el juego Manic Miner (archivo screen_manic_miner.tzx). Aquí no solo es necesario escribir en la ROM el byte 40 en la dirección de memoria 109, si no también debemos redirigir la lectura de donde vamos a obtener la dirección de salto, debido a que este juego sobre escribe la zona de memoria #5CB0. Deberíamos cambiar LD HL, (#5CB0) por LD HL, (#5B00) escribiendo los siguientes comandos POKE 105,0 : POKE 106,91. La rutina savescreen está en la dirección de memoria #5B04 (puede ser reubicable a cualquier parte de la memoria si el juego ocupara la zona de buffer de impresión) , por lo que debemos asignar estos valores al vector #5B00 con los siguientes comandos pokes.
    POKE 23296,04: POKE 23297,91
    El proceso de interrupción se puede dar normalmente en cualquier pantalla. Quizás no se pueda repetir el proceso varias veces, debido a que estas interrupciones son muy invasivas y podemos llegar a colgar el programa. En ese caso debemos realizar nuevamente el proceso de carga y dirigirnos a la pantalla deseada.

    Modo de Uso: Primero debemos habilitar la escritura en la ROM, luego cargar el programa savescreenTS2068_NMI.tzx o savescreenzx_NMI.tzx según corresponda a la máquina que usemos, volver a deshabilitar la escritura de la ROM y por último cargamos el programa propio o comercial que deseamos capturar la grabación de pantalla.

    Con estas tres publicaciones, concluimos las herramientas relacionadas para generar cabeceras de programas, grabar pantallas u otra cosa que queramos salvar, por medio de interrupciones. (Espero no haberlos mareado demasiado)
    En el futuro usaré las interrupciones NMI, para poder salvar juegos ya cargados en memoria y probar de correrlos, en los casos que estos mismos cuenten con protecciones severas de varios módulos de carga, el cual se hace bastante tedioso hacer el debug y seguimiento del proceso.
     

  • Continuamos con Juegos a compatibilizar.
    Pro Go Kart Simulatorr: . La versión original de ZX 48k y la versión adaptada de carga para TS2068
     
  •  

  • [b]Emilio_Sanchez_Vicario_Grand_Slam :[/b] Otro mas de tenis original de ls Spectrum, también con su carga adaptada para la TS2068
     

  • EXTREME: Otro juego mas con el archivo compatible para la Timex Sinclair
     
  •  

Moderador (s): homecomputer, Selandari, pastbytes, Palamar, phd, Durandal