[ATARI] Copiador SITRE para juegos en cassette

Software y Juegos para retro-computadores, bueeeno... casi puros juegos :-)
Avatar de Usuario
Poltergeist
Mensajes: 964
Registrado: Mié Nov 13, 2013 4:36 pm

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por Poltergeist » Dom Feb 22, 2015 12:47 pm

Nes_milio escribió:
vitoco escribió:... En un caso en particular, eso me trajo indirectamente problemas con Rod Rubber de LaserGame en Santiago, lo cual es otra historia.
Suena a buena historia.
Y no me extraña... al parecer con varios tuvo problemas... :D

Avatar de Usuario
fcatrin
Mensajes: 655
Registrado: Jue Ene 24, 2013 2:19 pm
Ubicación: Quilpué
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por fcatrin » Dom Feb 22, 2015 7:42 pm

vitoco escribió:
fcatrin escribió:Que buena!! Me gustó que hayas partido con la historia de SITRE, es uno de los cargadores famosos de esa época. Creo que fue el segundo cargador de ese tipo que vi, y eso de poner un nombre en base a una sigla después lo copié en CAIN :-)
No sabía que fuera tan "famoso" mi cargador. No tengo idea de cuántos juegos se habrán vendido que estuvieran grabados con SITRE, ni cuáles habrán funcionado OK en este cargador y no en otro.
Me llegaron varias copias de juegos con SITRE. Acá en la región siempre se propaga desde Valpo al Interior, así que todo lo que se hacía en Valpo o Viña llegaba a Quilpué y Villa Alemana
vitoco escribió:
fcatrin escribió:Ahora me dieron ganas de copiarte la idea de este post también, para que quede documentada la historia antes de que se nos olvide, como le pasa a Parche Negro :-)
Sería bastante bueno que lo hicieras. Documentarás un poco la retro-historia que nos entretiene.
Lo haré entonces! Tengo hasta los cuadernos que usaba en esos tiempos.

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por vitoco » Dom Feb 22, 2015 7:55 pm

fcatrin escribió:
vitoco escribió:
fcatrin escribió:Ahora me dieron ganas de copiarte la idea de este post también, para que quede documentada la historia antes de que se nos olvide, como le pasa a Parche Negro :-)
Sería bastante bueno que lo hicieras. Documentarás un poco la retro-historia que nos entretiene.
Lo haré entonces! Tengo hasta los cuadernos que usaba en esos tiempos.
Ja, ja, ja... parte de lo que he recapitulado de SITRE lo he sacado de mi cuaderno naranja. Intenté sacarle fotos a algunas páginas para ponerlas acá y no se cacha nada, pues todo lo escribía con lápiz grafito, y ahora además las hojas están amarillentas (Retr0bright no aplica en ellas). Intentaré escanear en alto contraste o con filtros.

También sería bueno convencer a Parche para que haga su parte para reconstruir y preservar la historia... :mrgreen:

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por vitoco » Mié Feb 25, 2015 2:40 am

Ufff... Costó, pero creo que lo logré. Pude grabar el Goonies-130XE de 72.670 bytes en un .CAS usando SITRE modificado en el emulador Atari800-a8cas con 128K de RAM y posteriormente lo cargué en Altirra con 320K. Va el adjunto para que lo prueben. Si alguien lo puede pasar a WAV y cargar en un Atari 130XE real o en 800XL con 256K, sería genial que compartiera la experiencia. Pero le advierto que son 18 minutos de carga!!!

Grabando:
Imagen
Cargando:
Imagen
Después del pito lento, se instala la presentación propia:
Imagen
Forzando un error moviendo el control del .CAS un poco más adelante de donde iba:
Imagen
Carga finalizada:
Imagen

¿Y cómo logré esto? Vamos a lo técnico...

Hasta ahora no me había referido a los internals de SITRE, pero llegó el momento, y voy a comenzar con el cargador (loader), pues es lo primero que modifiqué.

El cargador de SITRE consta de 4 partes que se graban a cinta antes que el XEX:
  1. Boot record: Es un registro de formato estándar que no tiene código a ejecutar, sino que sólo se usa para cargar en memoria los vectores de ejecución de SITRE. Si alguien lee la cinta usando un copiador en BASIC, lo que verá es sólo un mensaje de relleno indicando que se trata de SITRE. Pude haber puesto ahí también el nombre del juego grabado, pero ya no fue.
  2. Registro EOF (falso): En cassette se requiere un bloque extra al final de la grabación. Normalmente ese bloque está vacío, pero en el caso de SITRE va la rutina de inicialización, la cual queda en el buffer de cassette estándar en memoria. Esta rutina carga el 3er bloque y le pasa el control.
  3. Primera etapa de carga turbo: Este bloque carga en página 6 y ahí está contenida la pantalla de característica de SITRE. Si el XEX que se cargue tiene su propia pantalla de presentación (usualmente son los juegos que requieren pitos lentos), la de SITRE será reemplazada, incluso si carga en la misma página 6. Este bloque tiene además la rutina que carga el 4to bloque y principal de SITRE.
  4. Segunda etapa turbo: Este bloque entra en página 7 y contiene el cargador de SITRE. Aquí está el código para la carga del XEX, incluyendo las rutinas de carga de bloques, de su validación y reintentos. También contiene la pantalla de reintentos en caso de error y el mensaje "quedan XXX bloques" que se muestra además en la pantalla cargada en la primera etapa; el mensaje va aquí por seguridad, pues si un XEX carga código en página 6, SITRE podría corromper código válido al decrementar el contador.
A continuación van los bloques de XEX, los cuales tienen la siguiente estructura:
  • 2 bytes para ajuste de velocidad (BAUD). Son constantes y ambos tienen el valor $55 (en binario son unos y ceros alternados).
  • 1 byte para indicar el número del bloque. En SITRE, los números van en orden decreciente, siendo el bloque 0 el último en cargar. De esta forma se permitía cargar hasta 256 bloques.
  • 1 byte para indicar la cantidad de bytes en el bloque. Esto fue pensado para permitir la carga de bloques parciales y facilitar la funcionalidad de pitos lentos, pero finalmente no fue necesario, excepto para el último bloque que sí puede traer pocos bytes. A diferencia de otros cargadores que he visto, no se requiere de bytes de control adicionales para indicar el término del XEX.
  • 256 bytes de datos. Los bytes que no se usan a la cola (indicado por el byte anterior) son considerados basura.
  • 1 byte de checksum, puesto por la rutina SIO del sistema al momento de grabar y controlado también por SIO al momento de leer el bloque. Si no calzan, se activa la pantalla con efecto rainbow solicitando rebobinar para reintentar.
Finalmente, en la cinta se graba el registro EOF real, a velocidad normal (no turbo) y que fue simulado en el segundo bloque al grabar. Este bloque no es leído por SITRE, pues la cinta es detenida justo antes para pasarle el control al XEX.

Dado todo lo anterior, se puede observar que hay una restricción en el tamaño máximo del XEX: 256 bloques por 256 bytes permiten 65.536 bytes (64K). Por lo tanto, para poder cargar XEX de mayor tamaño, se requerió modificar el loader. Pensé en incorporar 1 byte adicional para el contador de bloques en la data del XEX o en reemplazar la funcionalidad del byte del tamaño del bloque (como sólo es relevante en el último bloque, se podíra almacenar por separado junto al loader), pero como quería tocar lo menos posible el código original, me aproveché de las características del álgebra binaria en complemento a 2 y no fue necesario modificar los bloques del XEX. Simplemente comparé un registro de 8 bits con el LSB de uno de 16 bits. Este cambio agregó unos pocos bytes al 4to segmento, pero eso impactó al 3ro, pues se corrieron algunos vectores, lo que de paso afectó al 2do. El 1ro no se salvó porque ahí iba la fecha de la versión de SITRE que tenía el bug Y2K, así que la cambié por la fecha de hoy.

Pero para poder llevar el cargador a cinta, fue necesario modificar el copiador. Mi intensión era modificar lo menos posible y mantener la concepción origina de SITRE, pero creo que debo haber cambiado como un tercio del programa BASIC. Si bien no modifiqué la estructura y conserve el orden, los nombres de las variables y hasta los números de línea, varias cosas debieron ser cambiadas radicalmente.

Detalles técnicos del por qué en el spoiler...
Spoiler: MOSTRAR
La memoria de un 130XE o un 800XL modificado tiene más o menos la siguiente estructura:
  1. $0000 - $06FF: casi 2K para registros del HW, de BASIC y de DOS. Algunos bytes en página cero y la página 6 completa pueden ser usados por los programas como SITRE.
  2. $0700 - $1FFF: Poco más 6K utilizados por el DOS. El límite superior es variable y depende de la versión del DOS de turno. Es importante señalar que SITRE es incompatible con cualquier RAMDISK.
  3. $2000 - $3FFF: 8K disponibles para programas en BASIC.
  4. $4000 - $7FFF: Ventana de 16K para acceder a los bancos de memoria extendida. Si el programa en BASIC no va a utilizar directamente los bancos, están completamente disponibles para él.
  5. $8000 - $9FFF: 8K disponibles para programas en BASIC, pero que incluyen la memoria de la pantalla en la parte finaldependiendo del modo gráfico utilizado. En modo de texto se reserva poco más de 1K.
  6. $A000 - $BFFF: 8K correspondientes a la ROM de BASIC.
  7. $C000 - $FFFF: 16K con la ROM del sistema operativo y algunos registros para el control del hardware.
Si no se usan los bancos, un programa BASIC tiene disponibles aproximadamente 8K+16K+8K-1K=31K de memoria contigua.

Un programa en BASIC se estructura de la siguiente forma:
  1. Nombres de las variables.
  2. Valores de las variables numéricas y punteros a los arreglos y cadenas.
  3. Instrucciones del programa (en formato de token).
  4. Valores de las cadenas y los arreglos, dispuestos según el orden de las instrucciones DIM.
Se puede decir que las 3 primeras partes ocupan una cantidad fija de memoria, como por ejemplo cuando el programa se graba en disco, y el área de cadenas (strings) y arreglos y matrices numéricas se asignan dinámicamente cuando el programa se ejecuta, y posteriormente se le asignan valores.
El programa original de SITRE en BASIC incluía todas las rutinas en lenguaje de máquina como asignaciones a cadenas empotradas en el código, incluyendo las 4 etapas del cargador, con la consecuencia que cuando el programa iniciaba, todas ellas quedaban duplicadas en memoria (en el área de código y en el área de valores).

Así, la cantidad de memoria total que utilizaba SITRE era muy cercano al límite de 8K. Para poder grabar más de 64K (256 bloques), era necesario hacer crecer algunos buffers, en particular la tabla para marcar los pitos lentos (64 bytes por cada banco extra), y no era posible crecer sin chocar con la zona para el acceso a los bancos de memoria.

Por lo tanto, el primer paso fue cambiar la forma en que se accedían a las rutinas USR: en lugar de asignarlas a variables de tipo cadena, se cambiaron a variables numéricas, y se les asignó como valor la dirección de la cadena directamente en el área de instrucciones. Es decir:

Código: Seleccionar todo

10 DIM RUTINA$(47)
20 RUTINA$="CARACTERES ATASCII REPRESENTANDO CODIGO BINARIO"
30 U=USR(ADR(RUTINA$),1,2,3)
se cambió por:

Código: Seleccionar todo

10 RUTINA=ADR("CARACTERES ATASCII REPRESENTANDO CODIGO BINARIO")
30 U=USR(RUTINA,1,2,3)
El segundo paso fue mover los buffers que estaban en otras variables de tipo cadena hacia el área de memoria disponible sobre la zona de acceso a los bancos. Ahí hay sobre 6K disponibles para todos ellos, y a la tabla de pitos lentos le asigné tranquilamente 2K.

Ya con memoria suficiente para trabajar en las cosas nuevas, introduje la nueva forma de operar con los bancos. Originalmente utilizaba el mecanismo de usar un valor base para asignar al registro PORTB y a ese sumarle el número del banco a seleccionar, pero ahora utiliza el esquema de valores predefinidos que propuse en otro hilo, a recordar en el siguiente spoiler.
Spoiler: MOSTRAR
El acceso a la memoria extendida del 130XE y del 800XL modificado se realiza a través de bancos de memoria de 16K cada uno, accesibles a través de una zona fija de memoria ($4000-$7FFF) que es reemplazada por el banco. Para activar un banco específico, se debe modificar algunos bits en el registro de hardware denominado PORTB (dirección de memoria 54017). La combinación de bits requerida para cada banco es la siguiente:

Código: Seleccionar todo

       | POKE  | Banco real | D=0     V=0 E=0         B=0 R=1
 Banco | 54017 | 130XE 256K |  7   6   5   4   3   2   1   0 
-------|-------|------------|---------------------------------
   0   |  177  |  RAM   RAM |  1   0   1   1   0   0   0   1 
   1   |  161  |   0     4  |  1   0   1   0   0   0   0   1 
   2   |  165  |   1     5  |  1   0   1   0   0   1   0   1 
   3   |  169  |   2     6  |  1   0   1   0   1   0   0   1 
   4   |  173  |   3     7  |  1   0   1   0   1   1   0   1 
   5   |  193  |         8  |  1   1   0   0   0   0   0   1 
   6   |  197  |         9  |  1   1   0   0   0   1   0   1 
   7   |  201  |        10  |  1   1   0   0   1   0   0   1 
   8   |  205  |        11  |  1   1   0   0   1   1   0   1 
   9   |  225  |        12  |  1   1   1   0   0   0   0   1 
  10   |  229  |        13  |  1   1   1   0   0   1   0   1 
  11   |  233  |        14  |  1   1   1   0   1   0   0   1 
  12   |  237  |        15  |  1   1   1   0   1   1   0   1 
-------|-------|------------|---------------------------------
  13   |  129  |         0  |  1   0   0   0   0   0   0   1 
  14   |  133  |         1  |  1   0   0   0   0   1   0   1 
  15   |  137  |         2  |  1   0   0   0   1   0   0   1 
  16   |  141  |         3  |  1   0   0   0   1   1   0   1 
En la tabla puse los bancos ordenados de forma que sean compatibles un 130XE con un 800XL con el mod de Claus Bushholz o RAMBO (XL o 320K), en que el banco 0 representa la memoria real, los bancos 1 al 4 a los bancos del 130XE, los 5 al 12 al 800XL con mod, y del 13 al 16 los de RAMBO-320K. Esto se puede extender a 16 valores más para un mod de 512K, en que se repiten los valores anteriores, pero con el bit 7 en cero (se resta 128 a los valores de los bancos 1 al 16 para habilitar del 17 al 32).

Para acceder a cada banco en forma simple, basta asignar un arreglo con los valores establecidos, y usar esos valores para modificar PORTB. En BASIC, sería de la siguiente forma:

Código: Seleccionar todo

1 M=16:DIM B(M+1):FOR I=0 TO M:READ X:B(I)=X:NEXT I
2 DATA 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141
La variable M indica cuántos bancos se podrían utilizar. El arreglo B tiene los M+1 valores posibles, partiendo de 0 para memoria real hasta el máximo banco M.

Para determinar en forma dinámica cuánta memoria extra dispone el programa, es decir, cuantos bancos están disponibles dependiendo del tipo de computador o modificación, se puede usar el siguiente código que ajusta M al máximo posible:

Código: Seleccionar todo

3 FOR I=M TO 1 STEP -1:POKE 54017,B(I):POKE 16384,B(I):NEXT I
4 FOR I=1 TO M:POKE 54017,B(I):IF PEEK(16384)=B(I) THEN NEXT I
5 IF I<=M THEN M=I-1:POP
6 PRINT M
La línea 3 marca cada banco con un valor individual, y las líneas 4 y 5 determinan cuál es el mayor banco utilizable.
Como consecuencia del cambio para manipular bancos, tuve que cambiar el proceso de carga del XEX, el de análisis para descubrir dónde aplicar pitos lentos y la rutina de grabación de bloques en cinta. Sin embargo, me impresionó lo simple que quedó con el arreglo de valores predefinidos para PORTB. Pero debo hacer notar algo relevante: los valores del arreglo habilitan los respectivos bancos, pero suponen que el bit 1 del registro está encendido, es decir, que está presente la ROM del S.O., lo cual no es siempre cierto en SITRE; cuando se graba en modalidad turbo, se están usando las rutinas modificadas de SIO, por lo que la ROM debe estar desactivada, y en ese caso los bancos se activan con:

Código: Seleccionar todo

POKE 54017,B(I)-1
Como consecuencia del nuevo tamaño de la tabla de pitos lentos, decidí que la rutina utilizara sólo el rango asignado a los bloques de la página que se está grabando, por lo que las marcas ya no se están almacenando en orden invertido como comenté en un post anterior. Mientras acomodaba el código para trabajar con la porción correspondiente, me di cuenta que sí se estaba considerando la duración de las pausas en forma individual, es decir, no se estaba ignorando ese dato como también lo aseguré en ese post.

En la pasada se fueron a la basura:
  • Una rutina USR para acceder a los bancos de memoria como si se tratara de memoria lineal y simular un PEEK sobre ella, pues estaba restringida a 64K, y no tenía sentido cambiarla porque me toparía con el ERROR 3 si intentaba pasar en un parámetro un valor mayor a 65535. Como debía separar el valor de la dirección en 2 valores de 16 bits, en realidad no costaba nada hacer el cambio de banco y leer el valor deseado en la misma subrutina. Como la rutina USR también permitía hacer POKE, la nueva rutina se clonó para habilitar esa funcionalidad.
  • Una rutina USR que limpiaba los 4 bancos de memoria del 130XE antes de cargar el XEX. Como ahora podría haber más de 4 bancos, y a cinta se van los datos que se carguen del XEX, no era necesario inicializar la memoria, salvo para el último bloque, pero ya dije que el cargador ignorará eso. De todos modos es una mejora pendiente.
  • La antigua rutina que verificaba que se trate de un 130XE. Fue reemplazado por una optimización del esquema para detectar los bancos disponibles, y ahora en vez de bloquearse, indica cuántos bancos hay disponibles para copiar, que puede ser sólo 1 en el caso de un 800XL estándar.
Lo que va quedando pendiente:
  • Rutina en Assembler para inicializar los buffers. Actualmente la tabla de pitos lentos no se limpia si se copian varios XEX en la misma sesión y las marcas se van acumulando. Nada grave por cierto, pero usar un ciclo FOR-NEXT para 2000 iteraciones introduce una latencia innecesaria.
  • Hacer algún cambio para que el último bloque no contenga basura, lo que se produciría cuando se graba un XEX más pequeño que otro grabado anteriormente en la misma sesión. Para ello hay alternativas sin tener que limpiar todos los bancos antes de cargar un XEX, por ejemplo borrar sólo los bytes siguientes al último byte cargado del XEX hasta completar la página de 256 bytes, o bien modificar la rutina de grabación para que cuando se vaya a grabar el bloque con identificador cero (el último), se rellenen los bytes mayores al largo de registro.
  • Restringir el número máximo de bloques a grabar en cinta a 999 o cambiar el contador a 4 dígitos. 999 bloques son 255.744 bytes, para los cuales se necesitan algo más de 15 bancos. Lo más simple es restringir el M a 15, aunque en el MOD de Bushholz sólo hay 12+1=13. Con 15 bancos, el contador llegaría a 960, y serían 59 minutos de carga... pero no he visto un XEX de 245K, eso es casi un diskette de densidad ampliada grabado por los 2 lados!!!
  • Permitir la lectura de XEX desde unidades de disco distintos de "D1:". Cuando desarrollé SITRE, pocos tenían más de una disketera.
Espero tener un poco de tiempo para estos ajustes...
Adjuntos
goonies.zip
The Goonnies (modificado para 130XE) y grabado con SITRE en formato .CAS
(43.41 KiB) Descargado 333 veces

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por dogdark » Mié Feb 25, 2015 7:53 am

muy bueno pues vitoco, si quieres probar un juego larrgooooo para ver el banco de memoria disponible completo realizalo con el comando para 256k ahí si que se demora. sería una buena prueba, claro que este viene en disco de doble densidad.

Avatar de Usuario
NicolasBeg
Mensajes: 418
Registrado: Lun Feb 11, 2013 1:04 am

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por NicolasBeg » Mié Feb 25, 2015 1:43 pm

No se por que me meto aqui, si no entiendo ni una "Rechascapiscas que me lleve el del moño"...

haber: esto puede servir para que los demas tambien entiendan;

1.- yo en tiempos de ataños juege el Goonies en cassette, y recuerdo perfectamente que en cada pantalla tenia que cargar por independiente, si perdia cargaba denuevo la primera pantalla, asi lo termine en un 130XE

2.-entonce ahora se puede cargar completamente de un paraguazo aprovechando la memoria completa del 130XE???

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por vitoco » Mié Feb 25, 2015 3:39 pm

NicolasBeg escribió:No se por que me meto aqui, si no entiendo ni una "Rechascapiscas que me lleve el del moño"...

haber: esto puede servir para que los demas tambien entiendan;

1.- yo en tiempos de ataños juege el Goonies en cassette, y recuerdo perfectamente que en cada pantalla tenia que cargar por independiente, si perdia cargaba denuevo la primera pantalla, asi lo termine en un 130XE

2.-entonce ahora se puede cargar completamente de un paraguazo aprovechando la memoria completa del 130XE???
La idea es que todos aprendamos. A lo mejor no he sido muy claro o quizás demasiado técnico y tal vez sólo Franco y dogdark me sigan. Pero efectivamente el CAS publicado carga de cinta el juego The Goonies completamente en memoria extendida, y las etapas son rescatadas de ahí, como si se tratara de un RAMDISK. Pero esa no es una gracia de SITRE, sino que del XEX en sí... SITRE sólo permitió ponerlo en cinta (y obviamente cargarlo desde ahí).
dogdark escribió:muy bueno pues vitoco, si quieres probar un juego larrgooooo para ver el banco de memoria disponible completo realizalo con el comando para 256k ahí si que se demora. sería una buena prueba, claro que este viene en disco de doble densidad.
Si no me pones un enlace al XEX o ATR, me obligas a buscarlo en la red. El primero que encontré es el Commando original, pero es en formato cartucho ROM de 128K... next! Luego encontré un ATR con el Commando+256K en formato ATR, que si bien contiene un XEX, no está en formato DOS, así que tuve que extraer el XEX... pero me llamó la atención que está modificado respecto del original. Busqué otras alternativas y encontré 2 XEX más, uno para Atari con ampliación de 192K y otro para 320K. Este último es el mismo que el XEX extraído, en tanto que el para 192K se ve idéntico al ROM. Como todos los XEX eran similares en contenido y pesaban casi los mismos 128K, y además tenían los mismos créditos, opté por hacer la prueba con el que era más parecido al ROM. Sin embargo, noté que no pasaría la frontera de los 128K, sino que sólo usaría 506 bloques, por lo que cambié de opción y me pasé al que extraje del ATR, porque ocuparía más de 512 bloques.

Pero como lo necesitaba dentro de un ATR formateado con algún DOS para poder leerlo con SITRE en el emulador atari800-a8cas con ampliación 320K-RAMBO, tal como mencionaste, tuve que crear uno de doble densidad con MyDOS y poner ahí el XEX.

Esto me sirvió además para probar que SITRE funciona OK en otro DOS (sólo lo había usado en DOS 2.5). Un cambio que hice en SITRE y que no mencioné en mi post anterior es que valida que no se choque el programa BASIC con la ventana para el acceso a los bancos de memoria extendida, haciéndolo un poco más independiente del DOS o de las extensiones que éste tenga y que le quiten un poco de memoria a BASIC.

El resultado fue el siguiente: SITRE cargó en memoria los 131.588 bytes y realizó el análisis en busca de las pausas para pitos lentos y detectar posibles bloqueos durante la carga. Pasó OK la prueba y encontró varios bloques que requerían pitos lentos (aproximadamente cada 16K, es decir, pareciera ser que carga tramos de 16K directamente en cada banco). En total, se necesitaron 515 bloques en cinta y poco más de media hora de grabación:
Imagen

Inicié el CAS generado en Altirra con ampliación 320-RAMBO, y apareció SITRE:
Imagen

Este era el momento de hacer pruebas con el control de errores en la carga. Como se está utilizando un contador de 8 bits, el número máximo de bloque representado es el 255, por lo tanto existía la posibilidad que mi teroría de complemento a 2 fallara por comparar sólo los LSB (bytes de menor relevancia) en la frontera de los bloques múltiplos de 256, donde se incluye el 512. Así que apenas comenzó la carga, forcé una caída adelantando y retrocediendo repetidamente la cinta en el emulador. Pude comprobar que todo operó bien antes de 512, en los 512 y después de los 512:
Imagen (antes)
Imagen (durante)
Imagen (después)

Mirando esas 3 pantallas, se puede apreciar algo que comenté en un post anterior: entre las pruebas del control de errores hubo un pito lento, y apareció la pantalla de presentación propia del XEX. Como esta rutina cambia el modo gráfico de 40 a 32 caracteres (20 a 16 caracteres en modo 1 y 2), y esa característica no es alterada por SITRE, se provocó el corrimiento de los mensajes. También se ve que el texto cambió de color por el mismo motivo.

La pantalla de carga propia es la siguiente. Aparentemente hay manejo de interrupciones en pantalla (DLI), porque se puede apreciar que el texto no respeta una matriz, y hay líneas que están corridas medio caracter hacia un costado, para mantener centrado el texto de cada línea en la pantalla:
Imagen

Alrededor de los 3 minutos, en otro pito lento, algo hace el loader internamente con lo que va cargado hasta el momento:
Imagen

Después de media hora, el mensaje de la pantalla cambió:
Imagen

Prersionando una tecla comienza el juego:
Imagen

Pantalla de presentación del juego (modificada respecto de la que muestra la ROM):
Imagen

Comienza la acción:
Imagen

No hay caso, para mí es inmanejable sin un joystick... No puedo probar que no esté corrupto intentando pasar niveles:
Imagen

Repetí la prueba, pero emulando un 130XE. Apareció un mensaje diciendo que no había suficiente memoria extendida:
Imagen

Pero no me quedé tranquilo, e hice la prueba con el XEX parq equipos con 192K. También funcionó en forma muy similar (hartos pitos lentos repartidos y un rutina de inicialización con los créditos similares). Pero la pantalla de presentación del juego es la misma del cartucho:
Imagen "Commando"
Spoiler: MOSTRAR
Imagen "Commando+ (256)" (para comparar)
No sé si sólo modificaron la imagen y la música de la presentación o si hay algo más, pero se me ocurre que no, ya que en ambos casos los créditos son de Fandal.

Van adjuntos ambos CAS... Porfa, si alguien puede probarlos en Cassette y Atari reales, que comente su experiencia aquí mismo. 8-)
Adjuntos
Commando-SITRE.zip
Commando y Commando+ en formato CAS con SITRE.
(117.84 KiB) Descargado 330 veces

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por dogdark » Mié Feb 25, 2015 7:46 pm

vitoco zorry, se me olvido colocar el link del xex, es que llegue a las 8 de la mañana de la pega, se me fué, el cas no lo puedo pasar a wav para probarlo en el atari real, podrías crear estos con el a8cas, te dejo el link del emulador para grabarlo en wav directamente, este emulador es el que uso yo para crea juegos en wav

a8cas

ahora deje convirtiendo el cas en wav a ver si funciona y lo probaré en el atari real y te cuento como saldrá todo. se demora porque tengo win 8 y tengo que emular el DOS para la conversión y el juego es larguiiiiisimo, un abrazo.

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por vitoco » Mié Feb 25, 2015 8:19 pm

El emulador atari800-a8cas puede grabar directamente en WAV, pero no lo hice porque es media hora!!! La primeros bloques estaban ocupando varios megas, así que lo cancelé y cambié a CAS, total los emuladores lo transforman automáticamente a WAV cuando no se usa el SIO patch. Así fue como hice mis pruebas.

Ojalá alguien pueda hacer la conversión a WAV y grabar en cinta para probar en Atari real.

Avatar de Usuario
fcatrin
Mensajes: 655
Registrado: Jue Ene 24, 2013 2:19 pm
Ubicación: Quilpué
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por fcatrin » Mié Feb 25, 2015 8:24 pm

Primero, felicitaciones por las modificaciones a SITRE. Si no me equivoco, este sería el primer copiador con turbo y recuperación de errores con soporte de más de 64KB!


Segundo, había olvidado comentar esto:
vitoco escribió: Después de entregar esa última versión para copiar hasta 64K, me quedé con las ganas de poder hacerlo en el 800XL... lo que intenté fue modificar el copiador para que grabara por etapas, es decir, cargaba un trozo del XEX, grababa en cinta el cargador seguido del trozo de XEX, luego detenía la cinta y cargaba otro trozo en memoria, para luego encender la cinta otra vez y continuar la grabación. Hasta donde recuerdo, no tuve problemas con la grabación, pero durante la carga, al llegar al corte, siempre fallaba la carga... no sé qué habré hecho mal o si me faltó investigar algo.
Difícilmente iba a funcionar. Cuando se detiene el motor, la cinta sigue girando después de que se ha detenido la grabación, por lo que quedarás con un espacio sin grabar, con ruido. En el momento de la carga, cada vez que se encuentra en un IRG, se espera que aparezca el primer "1" de la secuencia 0x5555 para calcular la velocidad. Si hay un trozo no grabado, es muy probable que parte de ese ruido se interpretara como "1" haciendo fallar el cálculo.

Una alternativa sería que el cargador descartara "1"s falsos, o tuviera una especie de timeout, pero eso sería muy complejo. Otra alternativa, menos compleja pero más manual sería dejar un IRG muy largo al final, luego rebobinar la cinta y dejarla lista para grabar partiendo encima de ese IRG, pero siempre estaría el riesgo de tener un ruido por ahí.

Saludos

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por dogdark » Mié Feb 25, 2015 8:49 pm

aca les dejo el sitre en wav para el uso posterior. ahora lo probare en el atari real a ver como nos va, el juego por lo menos cargo bien en el emulador a8cas
Adjuntos
Sitre_comando256k.rar
comando256ksitrewav
(783.89 KiB) Descargado 189 veces

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por vitoco » Mié Feb 25, 2015 10:16 pm

fcatrin escribió:Primero, felicitaciones por las modificaciones a SITRE. Si no me equivoco, este sería el primer copiador con turbo y recuperación de errores con soporte de más de 64KB!
Pero si es cuando más se necesita!!!! Sin un cargador que reintente, no es lo mismo tener que cargar todo otra vez si falla a los 5 minutos que a los 25...
fcatrin escribió:Segundo, había olvidado comentar esto:
vitoco escribió:Después de entregar esa última versión para copiar hasta 64K, me quedé con las ganas de poder hacerlo en el 800XL... lo que intenté fue modificar el copiador para que grabara por etapas, es decir, cargaba un trozo del XEX, grababa en cinta el cargador seguido del trozo de XEX, luego detenía la cinta y cargaba otro trozo en memoria, para luego encender la cinta otra vez y continuar la grabación. Hasta donde recuerdo, no tuve problemas con la grabación, pero durante la carga, al llegar al corte, siempre fallaba la carga... no sé qué habré hecho mal o si me faltó investigar algo.
Difícilmente iba a funcionar. Cuando se detiene el motor, la cinta sigue girando después de que se ha detenido la grabación, por lo que quedarás con un espacio sin grabar, con ruido. En el momento de la carga, cada vez que se encuentra en un IRG, se espera que aparezca el primer "1" de la secuencia 0x5555 para calcular la velocidad. Si hay un trozo no grabado, es muy probable que parte de ese ruido se interpretara como "1" haciendo fallar el cálculo.

Una alternativa sería que el cargador descartara "1"s falsos, o tuviera una especie de timeout, pero eso sería muy complejo. Otra alternativa, menos compleja pero más manual sería dejar un IRG muy largo al final, luego rebobinar la cinta y dejarla lista para grabar partiendo encima de ese IRG, pero siempre estaría el riesgo de tener un ruido por ahí.
Sí, tienes razón en que esos fueron los síntomas. Fíjate que intenté lo de los gaps, tanto antes como después de la detención de la cinta, pero siempre quedaba un ruido que si bien no era un "tic", variaba el tono producto de la desaceleración y la aceleración de la cinta en el cabezal de grabación. Creo que lo último que propones sufrirá del mismo síntoma que describo. Ahora pienso otras combinaciones o mecanismos para ignorar esa situación en el medio de una carga, pero ya no sé si valga la pena intentarlo. Ya es más fácil acceder a equipos con más memoria o basta usar emuladores que superan cualquier mod físico para generar un WAV. Incluso podría reescribir el copiador SITRE como un simple script en lenguaje perl para pasar cualquier XEX directamente a CAS sin usar bibliotecas de audio ni emuladores, y los usuarios no se darían ni cuenta.
dogdark escribió:aca les dejo el sitre en wav para el uso posterior. ahora lo probare en el atari real a ver como nos va, el juego por lo menos cargo bien en el emulador a8cas
¡Gracias! Vi que el WAV quedó de 800MB, pero no sabía que se podía comprimir tanto. :shock:
Espero el resultado de tu prueba.

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por vitoco » Jue Feb 26, 2015 7:21 pm

vitoco escribió:Lo que va quedando pendiente:
  1. Rutina en Assembler para inicializar los buffers. Actualmente la tabla de pitos lentos no se limpia si se copian varios XEX en la misma sesión y las marcas se van acumulando. Nada grave por cierto, pero usar un ciclo FOR-NEXT para 2000 iteraciones introduce una latencia innecesaria.
  2. Hacer algún cambio para que el último bloque no contenga basura, lo que se produciría cuando se graba un XEX más pequeño que otro grabado anteriormente en la misma sesión. Para ello hay alternativas sin tener que limpiar todos los bancos antes de cargar un XEX, por ejemplo borrar sólo los bytes siguientes al último byte cargado del XEX hasta completar la página de 256 bytes, o bien modificar la rutina de grabación para que cuando se vaya a grabar el bloque con identificador cero (el último), se rellenen los bytes mayores al largo de registro.
  3. Restringir el número máximo de bloques a grabar en cinta a 999 o cambiar el contador a 4 dígitos. 999 bloques son 255.744 bytes, para los cuales se necesitan algo más de 15 bancos. Lo más simple es restringir el M a 15, aunque en el MOD de Bushholz sólo hay 12+1=13. Con 15 bancos, el contador llegaría a 960, y serían 59 minutos de carga... pero no he visto un XEX de 245K, eso es casi un diskette de densidad ampliada grabado por los 2 lados!!!
  4. Permitir la lectura de XEX desde unidades de disco distintos de "D1:". Cuando desarrollé SITRE, pocos tenían más de una disketera.
Hecho... Respectivamente:
  1. Escribí una pequeña rutina USR que inicializa un tramo de memoria al valor indicado (asume cero si se omite). Además, dejé la tabla de pausas de tamaño variable, dependiendo del número máximo de bancos disponibles, por lo que a la rutina de inicialización se le pasan esos datos.
  2. Utilicé la misma rutina de inicialización del punto anterior para completar el último bloque en caso que tenga menos de 256 bytes, reemplazando posible basura que haya quedado ahí. Así no es necesario inicializar todos los bancos.
  3. Decidí restringir el número de bancos a lo especificado por el mod de Buchholz, es decir, dividir los 256K en 4 bancos para memoria real (64K) y 12 bancos para memora extendida (192K), por lo que SITRE cuenta sólo con 13 bancos en total para cargar un XEX (208K). Así, el valor máximo del contador será 832. El motivo para no usar los 4 bancos extra del mod 320K-RAMBO es porque no es 100% estándar o compatible con RAMBO/XL, y en algunos casos habilitar por ejemplo al banco 16, en realidad se estaría poniendo la copia que modifiqué del S.O. en la ventana de bancos, y si meto ahí un trozo de XEX, simplemente me quedo sin S.O.... ¡¡¡Crash!!!
  4. Ahora se permite especificar la unidad desde donde se va a leer el archivo. Si se omite, asume "D:" (disco 1). Además, si no se indica un nombre del archivo, se lista el directorio de la unidad especificada.
A diferencia de mi proyecto de juego, en que todo el desarrollo está siendo realizado en PC (ensamblador MADS, tracker RMT, editor de fonts y emuladores para probar el XEX resultante), en el caso de SITRE he trabajado a la usanza antigua, aunque no con Atari físico ni diskettes reales, sino que emuladores y ATRs. Esto me ha significado trabajar en una ventanita (o varias a la vez) del emulador, montando y desmontando los ATR de los respaldos de mis antiguos diskettes, y utilizar varios de mis utilitarios escritos en BASIC (la mayoría con rutinas USR empotradas) y el ensamblador MAC/65.

La consecuencia es que me he demorado más de lo presupuestado, ya que editar programas largos en ventanitas de 40x24 caracteres y con todas las líneas numeradas obliga a ejecutar comandos como LIST algunos cientos de veces para hacerse la idea de cómo va la cosa. Además, ante un error en una rutina USR, me veo obligado a ir al emulador donde tengo corriendo MAC/65, montar el ATR, modificar, compilar, desmontar, ir al emulador donde estan mis utilitarios, montar ahí el ATR con la modificación en formato binario, procesarla para generar código BASIC, desmontar, ir al emulador donde está SITRE, montar el resultado final, incorporar la modificación al programa y probar. Si algo salió mal... repetir!!!

Al menos al tener varias ventanas de emuladores no necesito estar booteando cada vez para cada cosa, pero en parte está así porque para la mayoría de las actividades estoy usando Altirra, en cambio para SITRE estoy usando atari800-a8cas, ya que es el más estable para generar archivos CAS y WAV. No estoy usando el emulador Atari800WinPLus para el desarrollo porque no deja tener 2 ventanas de sí mismo a la vez, pero eventualmente hago pruebas con él, porque es el que está por defecto al hacer doble clic en los XEX, ATR, CAS, etc...

Como no es seguro que 2 emuladores usen el mismo ATR a la vez, un problema en común que tengo con todos los emuladores es que no es simple montar y desmontar los ATR, pues debo usar distintas combinaciones de teclas para llegar a los respectivos menús, y hacer más de una acrobacia para abrir el ATR correcto. Un drag&drop no sirve porque el emulador se reinicia con el ATR que le caiga en la ventana, cuando lo que quiero es montarlo como segunda o tercera unidad en usa sesión activa. Se me ocurrió que cada emulador debiera tener íconos representando cada dispositivo habilitado, ya sea en la barra de estado, en una botonera o en una ventanita externa, y que sea posible arrastrar hacia ellos para montar sin reiniciar y presionarlos para desmontar/desactivar, y si se presionan cunado no tienen nada, que aparezca la ventana estándar para abrir. Pero eso escapa de este hilo.

¿Alguien tiene alguna idea de cómo seguir probando la nueva versión de SITRE? ¿Algún juego (con link) que en su oportunidad haya sido complicado pasar a cinta?

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por dogdark » Jue Feb 26, 2015 8:20 pm

primeramente, agradecido por el aporte, pasamos a contar mi experiencia

al colocar el atari 800 256k, lo encendí primero con el archivo del cas que el vitoco adjunto en la web, desde el aspqt vía usb para probarlo, dándome el error en el sector 2 de inicio de carga donde se cuelga y no pasa, dije, caspitas si en el emulador funciona porque no con el atari real, realice la siguiente prueba para ver cuantos bancos cuenta mi atari, tome un código que entrego vitoco para ver la cantidad de bancos que cuenta mi atari.

Código: Seleccionar todo

1 M=16:DIM B(M+1):FOR I=0 TO M:READ X:B(I)=X:NEXT I
2 DATA 177,161,165,169,173,193,197,201,205,225,229,233,237,129,133,137,141
3 FOR I=M TO 0 STEP -1:POKE 54017,B(I):POKE 22222,B(I):NEXT I
4 FOR I=1 TO M:POKE 54017,B(I):IF PEEK(22222)=B(I) THEN NEXT I
5 IF I<=M THEN M=I-1:POP
6 PRINT M
el resultado me arroja 13 bancos, mmmm estamos bien, no pasa por eso.

decidí tomar mi casetera xc12 con injektor más el adapter cassette y probaré con el wav que hice, conecto el audio desde mi note hacia el casette, pruebo con winamp, enciendo y veamos....

carga. aparece la bienvenida

Imagen

después aparece la portada del commando

Imagen

la diferencia es que en esta foto aparecen 256k en el mio solo salen 192k yyyyyyy, problema, en esta parte el irg que esta como espacio para reaunar la carga, me dio problemas por que como se detiene el motor el audio de la note sigue, tuve que retroceder para volver a recargar y a la primera error de nuevo, a la segunda paso sin ningún problema, continuamos con la carga, segundo pito sin problemas y de ahí para adelante los pitos largos que estan entremedio no causaron problemas porque no pide la detención del motor de la casetera, al llegar al final cruzando los dedos, esperando que todo cargue bien, aparece el mensaje del juego y urraaaaa cargo sin ningún problema, pude jugar jajjaja lo que no lograba con el aspqt, en resumen funciona de mil maravillas el juego.

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por vitoco » Vie Feb 27, 2015 1:10 pm

dogdark escribió:al colocar el atari 800 256k, lo encendí primero con el archivo del cas que el vitoco adjunto en la web, desde el aspqt vía usb para probarlo, dándome el error en el sector 2 de inicio de carga donde se cuelga y no pasa,
No me había dado cuenta que el AspeQt también emula casseteras con WAV. Qué bueno saberlo. Respecto de tu problema en este intento, vi que AspeQt puede ignorar/customizar las tasas de transferencia respecto de lo que dice el .CAS, y no sé si eso habrá provocado la caída. Tal vez no sea capaz de manejar bloques de largo distino al estándar y lleguen bloques cortados. En todo caso, veo que no es práctico por ahora para los sistemas con recuperación de errores, ya que la documentación dice clarito:
The cassette emulation does not support rewinding or seeking in the images. This may change in the future versions.
dogdark escribió:decidí tomar mi casetera xc12 con injektor más el adapter cassette y probaré con el wav que hice, conecto el audio desde mi note hacia el casette, pruebo con winamp, enciendo y veamos....

carga. aparece la bienvenida

Imagen

después aparece la portada del commando

Imagen

la diferencia es que en esta foto aparecen 256k en el mio solo salen 192k
Entonces la versión que tenías es la que no modifica la presentación:

Imagen
dogdark escribió:yyyyyyy, problema, en esta parte el irg que esta como espacio para reaunar la carga, me dio problemas por que como se detiene el motor el audio de la note sigue, tuve que retroceder para volver a recargar y a la primera error de nuevo, a la segunda paso sin ningún problema, continuamos con la carga, segundo pito sin problemas y de ahí para adelante los pitos largos que estan entremedio no causaron problemas porque no pide la detención del motor de la casetera, al llegar al final cruzando los dedos, esperando que todo cargue bien, aparece el mensaje del juego y urraaaaa cargo sin ningún problema, pude jugar jajjaja lo que no lograba con el aspqt, en resumen funciona de mil maravillas el juego.
Eso que se detenga el motor y no se pueda poner automáticamente en pausa el audio externo es una complicación. En realidad en todas las pausas (pitos lentos) se detiene el motor, se pasa el control al programa, y a la vuelta se enciende otra vez para continuar la carga.

En el caso de Commando+, en las primeras pausas el programa se dedica a buscar los bancos de memoria extendida que están disponibles usando las 256 combinaciones de bits posibles en PORTB, tal vez buscando la mayor cantidad de mods compatibles, y así se arma su propia tablita de bancos en forma dinámica. También activa las pantallas de carga, y todo eso le toma tiempo. Si no fallaron las restantes pausas es porque el tamaño de la pausa fue suficientemente larga como para que el programa active el primer banco encontrado usando un código de apenas 3 instrucciones, y luego cargar un bloque de 8K, después usa 3 instrucciones más para activar el siguiente banco de la tabla y despues carga 8K más, y así... 16 veces en total cargando bancos de 8K, totalizando 128K. ¡Pero son 16! Eso es más que los 12 ya discutidos (descontando los 4 bancos que representan los 64K de memoria real), por lo que pienso que en caso de un Atari real, se está cargando datos en la memoria real a través del banco. Además, los bancos no se usan completos, sino que sólo los primeros 8K de sus 16K. Estoy pensando que intenta emular lo que haría el cartucho del juego original, en que los 128K los divide en bancos de 8K, por lo que completa los 2dos 8K con los mismos datos que corresponden a esa parte de la memoria... si cambia el banco, en la práctica el juego ve que cambiaron 8K y no 16K.
Spoiler: MOSTRAR
Analizando "COMM256K.XEX"...
65535 [$FFFF] (binhead)
8192-8756 [$2000-$2234] (565) PROG/DATA : busca bancos disponibles y activa pantalla de carga
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
10240-10448 [$2800-$28D0] (209) PROG/DATA :
12288-12337 [$3000-$3031] (50) PROG/DATA
32768-40956 [$8000-$9FFC] (8189) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 10240 [$2800]
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-22064 [$4000-$5630] (5681) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-16921 [$4000-$4219] (538) PROG/DATA
17587-24575 [$44B3-$5FFF] (6989) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16522-23632 [$408A-$5C50] (7111) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-24575 [$4000-$5FFF] (8192) PROG/DATA
8192-8198 [$2000-$2006] (7) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 8192 [$2000]
16384-17750 [$4000-$4556] (1367) PROG/DATA
19842-21368 [$4D82-$5378] (1527) PROG/DATA
22528-23201 [$5800-$5AA1] (674) PROG/DATA
736-737 [$02E0-$02E1] (2) -> 10346 [$286A]
A diferencia de Commando+, en la carga del Goonies 130XE hay bloques de 1 byte justo sobre el registro PORTB (54017) como si el loader hiciera un POKE, activando uno de los bancos, y luego carga otro bloque de casi 16K directamente sobre el banco, e itera para llenar los 4 bancos, luego desactiva los bancos de la misma forma y termina de cargar en memoria real. Salvo para la pantalla de carga personalizada al comienzo, no requiere de más pitos lentos. Si bien usa bancos preestablecidos, me llamó la atención que usa los que yo designé como 9, 10, 11 y 12, pues el bit 6 de PORTB lo mantiene siempre encendido. Eso no afecta al 130XE porque ese bit no se usa, y se mapean a los bancos 1, 2, 3 y 4. Pero como dije, los bancos son bancos y da lo mismo cuáles o el orden en que se usen, mientras siempre pueda obtener el banco N cuando requiera los datos que previamente guardé en N.
Spoiler: MOSTRAR
Analizando "GOONIESX.XEX"...
65535 [$FFFF] (binhead)
47872-48089 [$BB00-$BBD9] (218) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 47872 [$BB00]
65535 [$FFFF] (binhead)
38656-39167 [$9700-$98FF] (512) PROG/DATA
65535 [$FFFF] (binhead)
39424-39543 [$9A00-$9A77] (120) PROG/DATA
54017-54017 [$D301-$D301] (1) $E3 "11100011"
65535 [$FFFF] (binhead)
16384-31487 [$4000-$7AFF] (15104) PROG/DATA
54017-54017 [$D301-$D301] (1) $E7 "11100111"
65535 [$FFFF] (binhead)
16384-27135 [$4000-$69FF] (10752) PROG/DATA
54017-54017 [$D301-$D301] (1) $EB "11101011"
65535 [$FFFF] (binhead)
16384-32383 [$4000-$7E7F] (16000) PROG/DATA
54017-54017 [$D301-$D301] (1) $EF "11101111"
65535 [$FFFF] (binhead)
16384-25983 [$4000-$657F] (9600) PROG/DATA
54017-54017 [$D301-$D301] (1) $FF "11111111"
65535 [$FFFF] (binhead)
24576-38655 [$6000-$96FF] (14080) PROG/DATA
65535 [$FFFF] (binhead)
5888-12031 [$1700-$2EFF] (6144) PROG/DATA
65535 [$FFFF] (binhead)
1536-1578 [$0600-$062A] (43) PROG/DATA
736-737 [$02E0-$02E1] (2) -> 1536 [$0600]
De todos modos me alegro que haya funcionado la prueba, aunque la tecnología más moderna no te haya acompañado... Parece que hay que usar esos viejos Maxell, TDK o Sony de 45 minutos por lado para probar el Commando+ :lol:

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por dogdark » Vie Feb 27, 2015 8:51 pm

no me acuerdo que versión fue la que pase a wav, fue una de las dos cas que subiste,
No me había dado cuenta que el AspeQt también emula casseteras con WAV
en realidad lo que hace el aspqt es tomar una imagen cas y trabajarla como audio hacia el atari, pero no funciona con los copiadores nhp stac etc, solo con archivos sin preload, o sea normales.

veré si logro conseguir un cassette de 90 minutos para pasar el audio, porque solo tengo de 60. espero ver algún día el código en asm para aprender mas del funcionamiento del copiador y sus bancos. se agradece por tu aporte a los que aun, nos gusta usar la casetera como medio de carga, o simplemente para aquellos que no cuentan con disketera y solo usan el periferico de cinta para cargar sus juegos.

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por vitoco » Dom Mar 01, 2015 2:55 am

No me había dado cuenta de lo que yo mismo dije... efectivamente se necesita un cassette de 90 minutos para poder grabar los 130K, ya que es poco más de media hora y no sirve un cassette de 60 minutos. Pero lo que no había calculado es que en 45 minutos se pueden meter máximo 186K de los 208K disponibles (730 de 832 bloques) que indiqué anteriormente, y eso son sólo 12 de los 13 bancos disponibles. Bueno, 12 bancos son justo los que están disponibles en la ampliación , pero en fin, es una restricción física fuera del Atari... al menos yo no conozco cintas de 60 minutos por lado. Se me ocurrió hacer una mejora que permita grabar un juego largo en 2 partes, una en cada lado de la cinta, pero pensé que tendría el mismo problema discutido antes de las interrupciones.

Pero volviendo a la prueba original, quise hacerla yo mismo en el Atari real de 256K que tengo en la casa, así que escarbé en mis viejos casstettes y encontré algunas cintas de 90 minutos que podría usar. Puse los ATR de SITRE y COMMANDO+ en la tarjeta SD que uso en la SIO2SD y cargué SITRE. Aquí me llevé una sorpresa: sólo se reconocieron 9 bancos. Nueve!!!! ¿Qué onda? Cargué un programita de FANDAL para identificar los bancos y él pilló 13... los 4 adicionales son los que dejé al final de mi tabla, los que descarté por ser los mismos que la memoria real.

Se me ocurrió probar si podía cargar el XEX del COMMANDO+ directamente desde SIO2SD con su XEX-Loader incorporado (es como darle doble-clic a un XEX y este carga directo en el emulador), y me apareció el mensaje de que se requieren 256K... Shuuuuuu.... Es decir, ni el juego detectó toda la memoria.

Creo que llegó el momento de abrir el 800XL para ver qué tipo de ampliación tiene. Descubrí que no era el mod de Buchholz, sino que la ampliación de memoria de Newell Industries (el que publicó Z). Pero no está funcionando, no se le puede reconocer toda la memoria disponible al Atari, sólo está reconociendo los bancos 0 y del 5 al 16, siendo que para ese mod los bancos debieran ser del 0 al 4 y del 8 al 16, y eso debiera ser sin contar los 64K de la memoria real. Me di cuenta que había un cable del mod que debería ir soldado a un pin de un chip y que estaba suelto, apenas insertado en el socket junto a la patita del chip. Lo volví a soldar donde iba y no cambió en nada. Quedé pillo.

No puede haber chips de memoria malos, ya que si falla uno, falla toda la memoria, pues son 8 chips en que cada uno guarda un bit de cada byte, y no podría desaparecer un banco completo. A menos que sean los chips de lógica los que están fallando. Eso ya enreda más las cosas.

Quise hacer más pruebas, pero me falló la tarjeta SD... El SIO2SD dejé de reconocerla. Después de echar hartos pericos y gugliar por algunas horas, me chorié y me dio sueño. Al menos volví a armar el Atari y lo dejé en su lugar, pero es en la pieza de los niños y ellos ahora duermen y no puedo molestar. A ver si mañana retomo.

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por dogdark » Lun Mar 02, 2015 6:37 am

jajja que soy quemao vitoco, bueno como te comentaba antes cuando use tu código para ver cuantos bancos me reconocía, en el mio y reconoció 13 bancos, y en el 130 lo hizo con 4, creo que deberías revisar muy bien esa expansión, hay algo malo por ahí, yo esa que tienes tu, nunca la pude echar andar, por eso arme la de space invaders, e incluso por algunas consultas que me respondió el gentilmente, funcionó a la primera, el único problema que se me genera es la cargar por el siousb, por que con el juego comando a través del usb no carga, pero cuando probé con el wav que hicimos la prueba con el sitre, lo cargue por audio y partió altiro, aunque no los creas lo e cargado ya como 4 veces para jugarlo. y otra cosa, aun hay cassettes de 120 minutos jijiji como dato, pero es muyyyyyy difícil encontrar, el que tenia me lo echaron pala basura ya no daba más. veré si pillo en san diego si queda alguno por ahi.

Avatar de Usuario
SpaceInvader
Mensajes: 217
Registrado: Jue Jul 17, 2014 4:01 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por SpaceInvader » Lun Mar 02, 2015 8:07 pm

Probé el Commando 192K en mi Atari expandido, cargué el wav con casete adaptador en una XL12. La carga funciona, tal cual en el emulador, se para al principio un par de veces, pide retroceder, y sigue cargando, hasta que dice "presione cualquier tecla para jugar". Aquí mi Atari muestra pura basura en pantalla, y el juego no funciona. Pero, esto es normal, mi expansion hace tiempo que está con algunos problemas, algunas cosas cargan y otras no, tengo que revisarla. Pero el cargador Sitre hace su trabajo correctamente, sin errores.
Última edición por SpaceInvader el Lun Mar 02, 2015 10:17 pm, editado 1 vez en total.

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] Copiador SITRE para juegos en cassette

Mensaje por vitoco » Lun Mar 02, 2015 10:02 pm

dogdark: en el 130XE debió reconocerte 5 bancos (4 de memoria expandida y 1 de real). Las cintas de 90 minutos son más delicadas que las de 60 porque son más finas para meter más metros en el mismo espacio... las de 120 deben ser delicadísimas!!! En todo caso, me hiciste recordarlas... sí las había visto en marca SONY. Las rojas eran de 60 minutos, las verdes de 90... y las de 120 eran ¿¿¿azules???

SpaceInvader: Yo intenté en el Atari real algunas variantes de Commando de 192K que Fandal publicó en AtariAge, y hubo una en particular que logró cargar, pero al partir el juego también mostró basura en la pantalla. Es como que estuviera sacando la data del playfield desde el banco equivocado. Obviamente no es jugable. Es por eso que pienso que deberías correr los tests que pusiste en tu página, a ver si algo ha cambiado. A propósito, yo no alcancé a hacer las pruebas hoy en el Atari real.

¡Gracias muchachos por las pruebas!

En SITRE yo asumí sólo 2 tipos de memoria extendida: 130XE y Buschholz/RAMBO-XL, y los valores predefinidos son compatibles con ambas expansiones, puestos en un orden conveniente para ello. Después de descubrir que el Atari que tengo en casa venía el mod Newell, me di cuenta que los valores en PORTB para activar cada banco no son los mismos aunque usen los mismos bits (daría igual si fuesen los mismos valores en otro orden). Eso me lleva a intentar un cambio en el algoritmo, es decir, no tener la tabla de valores precalculados en duro, sino que descubrirlos en una rutina de inicialización al igual que lo hace Fandal en la adaptación del juego Commando. Veré eso en paralelo a la prueba física de la memoria en el Atari real.

Responder