PROYECTO: Carga de programas en Atari desde DVD

Para comentar los proyectos de hardware presentados en la web.
xt5
expert
expert
Mensajes: 512
Registrado: Mar Sep 18, 2007 1:16 am
Reputación: 0
Contactar:

Re: PROYECTO: Carga de programas en Atari desde DVD

Mensaje por xt5 »

vitoco escribió:Ahora tengo una nueva duda: si los sistemas como el Injector requieren una modificación en hardware de la cassetera para trabajar en PWM, ¿eso quiere decir que un cassette normal de Atari no cargaría en una XC12 modificada? Que yo recuerde eso no pasaba. ¿Cómo lo hace entonces? ¿Son compatibles?
el modo injektor/turbo/whatever se habilita con la linea command en el caso del MegaCD por lo menos, el injektor tiene que hacer algo similar, mientras ese modo no esta habilitado sigue funcionando como cassettera normal. en otras palabras la linea command actua como conmutador entre la señal normal y la que pasa por el comparador de voltaje.
vitoco escribió:Volviendo a este proyecto, lo que habría que lograr es meter un canal de audio del DVD en el puerto serial (usando cualquiera de los filtros: FSK ó PWM), usando el protocolo que maneja SIO para cassette, y por lo que cacho no es complicado por que no es tan "protocolo" (de partida sería unidireccional en la carga).
aqui en realidad no hay opciones, no puede ser PWM porque los sistemas de carga turbo decodifican el PWM por software (no se el caso de Inkjektor de Turbosoftware, pero me imagino que es lo mismo ya que no tiene sentido decodificarlo por hardware, ademas que te queda una señal asincronica y necesitas mas pines del SIO)... o sea hay que convertir la señal de audio a datos en serie de toda la vida y a 600bps (o lo mas que aguante la autodeteccion)
vitoco escribió:Otro tema: estaba pensando que en la etapa de carga del juego estamos hablando de 30fps * 192bpf = 5760bps, es decir, si en un segundo y medio entran 8K, ¿por qué no "pre-armar" la memoria completa del juego tal como quedaría en la RAM y grabar eso al video? Así se ahorra tiempo para el manejo de los bloques durante la carga porque no se usaría buffer intermedio ni se interpretaría la información de la estructura binaria de los archivos. En el peor de los casos, un programa de 48K entraría en menos de 9 segundos... bueno, eso sin contar el tiempo fijo que tome la carga inicial del loader
aqui es donde es facil confundirse entre lo que es un "frame" para el A8 y un "frame" para el DVD-Video.

lo que muestra el atari son 60 frames por segundo (no entrelazados), lo que muestra un DVD-Video son 30 frames por segundo, pero entrelazados. al final la cantidad de informacion es exactamente la misma, pero lo que el atari llama 1 frame el DVD lo llama 2 fields. creo que para simplicidad y en esta etapa donde no estamos muy preocupados de la generacion del video es mejor llamar frame a lo que el GTIA escupe 60 veces en un segundo.

teniendo eso en cuenta, el ancho de banda de un cart v1 es: 64 Bytes * 3 bloques * 60 frames = 11520Bps (o 92160bps) asi que un juego de 48KB deberia cargar en un poco mas de 4 segundos (lo mismo del calculo de vitoco, pero en realidad tenemos 60 frames desde el punto de vista del A8)

lo de prearmar yo ya lo hago en mi genenerador, y me imagino que Turbosoftware tambien lo hacia, no tiene sentido no hacerlo, el id de bloque y el checksum no varian nunca y cada bloque es 64byte que se ajusta facil a un bloque de disquetera o lo que sea.
ademas en mi caso tengo que transponer bloques de bytes en grupos de 8, por la forma en que genero las barras, y en realidad el A8 no aguanta hacer la transposicion en tiempo real, para esta tasa de transferencia nisiquiera aguanta buffers intermedios, todo tiene que ser bastante optimo (por ejemplo yo utilizo loops desenrollados para la copia, o sino no simplemente no da), aun asi logro quedar con el 50% de la CPU libre :P
Avatar de Usuario
vitoco
expert
expert
Mensajes: 869
Registrado: Mié Nov 08, 2006 7:25 pm
Reputación: 5
Contactar:

Re: PROYECTO: Carga de programas en Atari desde DVD

Mensaje por vitoco »

xt5 escribió:aqui es donde es facil confundirse entre lo que es un "frame" para el A8 y un "frame" para el DVD-Video.
Tienes razón... Y en mis cálculos, estaba usando "b" para bytes y no bits... :8-
xt5 escribió:lo de prearmar yo ya lo hago en mi genenerador,
No me refiero a prearmar la imagen de video con la data del binario, sino que a simular como quedaría la memoria después de cargar el binario, y grabar el rango completo como buffer, obviamente llevándolo a bloques de video, tal vez incluyendo la dirección de memoria donde debe caer cada bloque completo (en caso de no ser bloques secuenciales). Esto ya es "protocolo"...

Para el video en sí, estoy pensando en una técnica usando DLIs a tiempo real (esto bajo el supuesto que toda la generación del video y audio se hará desde el A8 mismo), lo que no requeriría prearmado de la imagen. Claro que es una apuesta, aún no hago pruebas para calcular los ciclos de CPU requeridos. XD

Una consulta respecto de la señal de video: ¿Cómo hace el cartucho para distinguir cuándo comienza un frame? ¿Es algo que se identifica en la señal o simplemente buscando GAPs?

++V
xt5
expert
expert
Mensajes: 512
Registrado: Mar Sep 18, 2007 1:16 am
Reputación: 0
Contactar:

Re: PROYECTO: Carga de programas en Atari desde DVD

Mensaje por xt5 »

vitoco escribió: No me refiero a prearmar la imagen de video con la data del binario, sino que a simular como quedaría la memoria después de cargar el binario, y grabar el rango completo como buffer, obviamente llevándolo a bloques de video, tal vez incluyendo la dirección de memoria donde debe caer cada bloque completo (en caso de no ser bloques secuenciales). Esto ya es "protocolo"...
a ver si te entiendo bien: quieres generar como un blob de como queda la memoria entre $2000??? y $D800??? (supongo?) despues desde que se cargo el ultimo bloque de un ejecutable, luego leerlo de posicionar un puntero en $2000??? y simplemente avanzar el llenado a medida que se lee de la señal y al final saltar al entry point

de ser eso lo que propones pregunto: que pasa si con una carga como esta?
$4000-$4100: datos con DL
$230-$231: .word $4000 ; muestra nuestra display list (shadow)
$D402-$D403: .word $4000 ; muestra nuestra display list (shadow)
$2000-$2100: codigo xxx
$2E2-$2E3: .word $2000 ; llama a una funcion
$2000-$7fff: codigo yyy
$2E0-$2E1: .word $2000 ; salta al entry point

donde muchas direcciones de memoria tienen distinto contenido a lo largo del proceso de carga.

si no es eso lo que planteabas: detallalo un poco mas porque no entendi...

una pregunta: los cargadores asumen que esta el sistema operativo habilitado? o asume ademas el caso que no este habilitado?

vitoco escribió:Para el video en sí, estoy pensando en una técnica usando DLIs a tiempo real (esto bajo el supuesto que toda la generación del video y audio se hará desde el A8 mismo), lo que no requeriría prearmado de la imagen. Claro que es una apuesta, aún no hago pruebas para calcular los ciclos de CPU requeridos. XD
yo tambien utilize DLIs, creo que no hay muchas otras alternativas, por lo menos hay que usar la interrupcion vertical, pero talvez no da el tiraje.
vitoco escribió:Una consulta respecto de la señal de video: ¿Cómo hace el cartucho para distinguir cuándo comienza un frame? ¿Es algo que se identifica en la señal o simplemente buscando GAPs?
simplemente no distingue entre frames, busca los bloques donde sea, podrian venir solo 2 bloques por frame y funcionaria igual. lo que hace para chequear el inicio es buscar un periodo "largo" de la señal en negro
Avatar de Usuario
Marcelo-Z
expert
expert
Mensajes: 675
Registrado: Sab Nov 11, 2006 12:48 am
Reputación: 2

Re: PROYECTO: Carga de programas en Atari desde DVD

Mensaje por Marcelo-Z »

Chalo_mhz escribió:El sistema injektor es chileno y del año 1998??? 8-|
es chileno y es del 1992 + -, pero no del 1998.


saludos
Avatar de Usuario
vitoco
expert
expert
Mensajes: 869
Registrado: Mié Nov 08, 2006 7:25 pm
Reputación: 5
Contactar:

Re: PROYECTO: Carga de programas en Atari desde DVD

Mensaje por vitoco »

xt5 escribió:a ver si te entiendo bien: quieres generar como un blob de como queda la memoria entre $2000??? y $D800??? (supongo?) despues desde que se cargo el ultimo bloque de un ejecutable, luego leerlo de posicionar un puntero en $2000??? y simplemente avanzar el llenado a medida que se lee de la señal y al final saltar al entry point
Sí, esa es una alternativa (*). Aquí nos estamos metiendo en el tema del protocolo.
xt5 escribió:de ser eso lo que propones pregunto: que pasa si con una carga como esta?
$4000-$4100: datos con DL
$230-$231: .word $4000 ; muestra nuestra display list (shadow)
$D402-$D403: .word $4000 ; muestra nuestra display list (shadow)
$2000-$2100: codigo xxx
$2E2-$2E3: .word $2000 ; llama a una funcion
$2000-$7fff: codigo yyy
$2E0-$2E1: .word $2000 ; salta al entry point

donde muchas direcciones de memoria tienen distinto contenido a lo largo del proceso de carga.
Aquí hago notar 2 cosas: en primer lugar, no tiene sentido cargar una pantalla "splash" de presentación que muestre algo que casi no se va a ver (duraría menos que un candy en pantalla) y que probablemente además se cargue con DMA desactivado (pantalla en negro), por lo que esa etapa simplemente no sería grabada en video (a menos que tenga código usado por el resto de la carga una vez finalizada).

En segundo lugar, un archivo binario con data cargada de a pedacitos se puede acomodar en un blob como indicaste, y después se graba el blob completo del menor tamaño posible si identificaste las direcciones de los extremos. No tiene por qué ser toda la RAM. Estoy asumiendo que a lo más hay un entry point de inicialización (INITAD=$2E2) además del de partida (RUNAD=$2E0), y que ambos fueron descubiertos mientras se preparaba el blob y que se ejecutarán una vez terminada la carga completa (o sea, no se necesita pasar esa info en la data binaria para cargar en memoria).

Otra alternativa a (*) sería hacer un poco más rebuscado el protocolo y hacer cosas como que un bloque (frame de video) tenga una estructura ad-hoc, dependiendo del tipo de bloque (datos, INITAD, RUNAD=fin), por ejemplo:

1 byte: correlativo de carga
1 byte: indicador de tamaño del bloque en memoria = N
X bytes: data del bloque
1 byte: checksum

En los bloques de datos (N>0), los X bytes contendrían:
2 bytes: dirección de memoria de inicio del bloque
N bytes: data del bloque
X-N-2 bytes: filler (padding)

En los bloques de control (N=0);
2 bytes: dirección de inicialización (INITAD)
2 bytes: dirección de partida (RUNAD)
X-4 bytes: filler (padding)

O sea, los bloques serían de B=X+3 bytes de largo, y dependerá de cuánta data podamos manejar durante la carga... en principio los 192 bytes de la versión 1 del cartucho (o sea, 187 bytes de datos del programa por pantallazo).

Probablemente sea interesante poner otros tipos de bloques como por ejemplo marcas de relleno al estilo de pitos lentos para sí implementar INITAD y pantallas splash, y no tener que adaptar la mayoría de los juegos.
xt5 escribió:una pregunta: los cargadores asumen que esta el sistema operativo habilitado? o asume ademas el caso que no este habilitado?
Si te refieres al OS de la ROM, yo creo que en general sí, porque usan rutinas de ahí, como SIOV, por lo que si un programa requiere poner cosas en la RAM bajo ella, él mismo se encarga (con una rutina de inicialización, je, je, je).

Pero en nuestro caso, perfectamente podría estar deshabilitado, ya que creo que sólo nos estaríamos colgando del bit 4 de SKSTAT=$D20F (que está en el rango no modificable de la RAM/ROM), para leer la señal serial originada por el video.
xt5 escribió:(el cartucho) simplemente no distingue entre frames, busca los bloques donde sea, podrian venir solo 2 bloques por frame y funcionaria igual. lo que hace para chequear el inicio es buscar un periodo "largo" de la señal en negro
... además de ignorar el "ruido" al final de la pantalla (los créditos u otra info desplegada).
Marcelo-Z escribió:
Chalo_mhz escribió:El sistema injektor es chileno y del año 1998??? 8-|
es chileno y es del 1992 + -, pero no del 1998.
SITRE es del verano de 1989 ;) Imagino que STAC es anterior.

++Vitoco
Avatar de Usuario
vitoco
expert
expert
Mensajes: 869
Registrado: Mié Nov 08, 2006 7:25 pm
Reputación: 5
Contactar:

Re: PROYECTO: Carga de programas en Atari desde DVD

Mensaje por vitoco »

Sobre PWM y FSK, ¿qué es lo que se obtiene de una salida de audio del DVD? No encontré documentación, pero me tinca que es PWM. ¿Cómo quedaría entonces un filtro para eso? ¿Y qué tipo de señal es la de la salida de video compuesto?

A propósito, estaba pensando en negar los bits al procesar la señal de video, ya que preferiría meter el fondo blanco con negro para los "unos". ¿Por qué? Pienso que sería más fácil pillar los GAPs (vacíos) de inicio de un frame sin confundirse con los espacios en una pantalla de presentación con fondo negro real. ¿Comentarios?

Otra cosa: ¿será posible activar y desactivar la "cajita" vía comandos? Creo que sería necesario algo para activar o desactivar el streaming hacia el Atari y no interferir con otros dispositivos que pudiese tener conectado. Había pensado en usar el bit 3 de PACTL ($D302) que enciende y apaga el motor en las cassetteras, pero necesito otra cosa para indicar a la cajita que transmita la señal de audio o la de video.

++V
xt5
expert
expert
Mensajes: 512
Registrado: Mar Sep 18, 2007 1:16 am
Reputación: 0
Contactar:

Re: PROYECTO: Carga de programas en Atari desde DVD

Mensaje por xt5 »

vitoco escribió:Sobre PWM y FSK, ¿qué es lo que se obtiene de una salida de audio del DVD? No encontré documentación, pero me tinca que es PWM. ¿Cómo quedaría entonces un filtro para eso? ¿Y qué tipo de señal es la de la salida de video compuesto?
La salida de audio contiene una señal de audio de aproximadamente 2V pico-a-pico, el filtro para convertirlo a onda cuadrada es un "comparador" (el LM311 del Atari MegaCD por ejemplo). Aqui te hice un dibujo de lo que hace el comparador con una señal de sonido.
Imagen
señal verda: señal de sonido.
señal azul: señal de onda cuadrada (0 a 5V)
ciclos largos: 1
ciclos cortos: 0

En el fondo convierte una onda no cuadrada que esta en DC, a una onda cuadrada de 0 a 5V.
Ahora lo que contenga esa onda es responsabilidad nuestra, la de la imagen es una modulacion PWM donde los ciclos largos corresponden a un 1 y los cortos a ceros (esto es totalmente arbitrario claro esta).

En esa señal puedes poner FSK como en las cintas normales de A8, pero es un cuento totalmente aparte, es bastante mas complicado de demodular y se limita a un ancho de banda mucho menor...

En generar el PWM no hay ningun problema ya que es amistoso para los dispositivos que almacenan sondio, aunque la compresion le quita lo cuadrada a las ondas el comparador no tiene problema en reestablecerlas a cuadrado.

Entonces ya que sabemos lo que hace el comparador podriamos meterle la señal que espera desde la casetera con tan solo el comparador, pero aqui tengo algunas dudas, y creo que tendremos que hacer algunas pruebas, a ver que dice ZZT y los entendidos en electronica.

El PWM no tiene problema alguno para ser rescatado, ya que su voltaje promedio es cero, pero que pasa con el cargador inicial que no puede ser PWM???

Imagen

Si tengo una señal con ciclos que en promedio tienen 300Hz, y entre medio de eso un bloque con los datos 0xFF, 0xFF, 0xFF, 0xFF, .... 0xFF habria un largo tramo con la señal en 1 (sin contar bits de start ni stop)...
En otras palabras eso ya es DC... si la salida del reproductor tiene condensadores para eliminar DC estariamos jodidos, nuestra señal de sonido no es "AC amistosa".
La verdad desconosco como son las etapas de salidas de los reproductores, tal vez no tienen condensadores en serie...

Aunque tuviese esa limitiacion, se puede solucionar como lo hacen los discos opticos en sus capas mas bajas: usando scrambling, o sea haciendo que sus datos tengan mas entropias y evitar patrones de muchos altos o bajos seguidos, lo ideal es llegar a un DSV cercano a cero.
--
La señal de video tiene 700mV pico-a-pico.
vitoco escribió: A propósito, estaba pensando en negar los bits al procesar la señal de video, ya que preferiría meter el fondo blanco con negro para los "unos". ¿Por qué? Pienso que sería más fácil pillar los GAPs (vacíos) de inicio de un frame sin confundirse con los espacios en una pantalla de presentación con fondo negro real. ¿Comentarios?
creo que da exactamente lo mismo, con una linea del color contrario a la primera sincronizacion del frame basta, ademas si pones fondo negro seria lo mismo, excepto que no pusieras letras ni cachivaches.
vitoco escribió: Otra cosa: ¿será posible activar y desactivar la "cajita" vía comandos? Creo que sería necesario algo para activar o desactivar el streaming hacia el Atari y no interferir con otros dispositivos que pudiese tener conectado. Había pensado en usar el bit 3 de PACTL ($D302) que enciende y apaga el motor en las cassetteras, pero necesito otra cosa para indicar a la cajita que transmita la señal de audio o la de video.
Es lo que hace el MegaCD, usar la linea de comandos, el asunto es definir cuantos "comandos" utilizaremos, creo que solo bastaria manejar el switch que conmuta la señal de video.
No creo que sea una preocupacion no intervenir con mas dispositivos, no me imagino este dispositivo compartiendo el puerto SIO con otros porque pierde su gracia, si tengo acceso a la disquetera me dejo de joder y hago el loader inicial desde la misma disquetera jajajaja.
Avatar de Usuario
vitoco
expert
expert
Mensajes: 869
Registrado: Mié Nov 08, 2006 7:25 pm
Reputación: 5
Contactar:

Re: PROYECTO: Carga de programas en Atari desde DVD

Mensaje por vitoco »

xt5 escribió:Ahora lo que contenga esa onda es responsabilidad nuestra, la de la imagen es una modulacion PWM donde los ciclos largos corresponden a un 1 y los cortos a ceros (esto es totalmente arbitrario claro esta).
Excelente explicación, pero me perdí :8- No me calza con lo que había leído de PWM, y se parece más a una interpretación FSK, solo que según tu explicación, un bloque de sólo ceros mide la mitad de uno con sólo unos. ¿Eso querría decir que hay que poner dos ceros en vez de sólo uno para mantener el "ritmo" de la data? Eso es porque temo que el pin de clock-in no se usa.

Mmm... creo que ahora necesito saber como funciona SIO para entender la transformación que se necesita realizar. Lo que tengo hasta ahora es:
SIO transfers data at a rate of 19,200 baud on separate input and output lines. The data is sent one byte at a time, LSB first, in an asynchronous format. There are also clock-in and clock-out lines. There is a signal on the clock-out line but it is not used by any present devices. The clock-in line is available for synchronous transfer but is not used by the OS. The signal on the clock-out line goes high at the leading edge of each bit and goes low in the middle of each bit.

Código: Seleccionar todo

                        One byte of SIO data
 
               +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+
               | | | | | | | | | | | | | | | |        clock
  -------------+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +------

  ---------+       +---+   +-------+       +--------
           |     0 | 1 | 0 | 1   1 | 0   0 | 1        data
           +-------+   +---+       +-------+

             |                                    |

         start bit                            stop bit
xt5 escribió:El PWM no tiene problema alguno para ser rescatado, ya que su voltaje promedio es cero, pero que pasa con el cargador inicial que no puede ser PWM???
El monito que puse acá es posible meter puros bytes ceros, por lo que habría que ver bien cómo se modulan esos 19200 baudios en SIO. Si bien va un bit cero y un bit uno delimitando cada byte, estamos hablando sólo de la parte del cargador. Es más, se me ocurre que sólo sirve para un mensaje SIO estándar, y no del controlador de cassette.
xt5 escribió:
vitoco escribió:A propósito, estaba pensando en negar los bits al procesar la señal de video, ya que preferiría meter el fondo blanco con negro para los "unos". ¿Por qué? Pienso que sería más fácil pillar los GAPs (vacíos) de inicio de un frame sin confundirse con los espacios en una pantalla de presentación con fondo negro real. ¿Comentarios?
creo que da exactamente lo mismo, con una linea del color contrario a la primera sincronizacion del frame basta, ademas si pones fondo negro seria lo mismo, excepto que no pusieras letras ni cachivaches.
El punto es encontrar esa primera sincronización... una pantalla con títulos tiene muchos espacios continuos del mismo valor y algunas líneas de texto con "ruido". Si ando buscando un primer frame, pienso que es más fácil buscar un área continua con el mismo valor, y que no puede ser el mismo de las áreas vacías de la presentación. Recuerda que no tengo forma exacta de saber cuándo comienza un frame. Lo otro que había pensado era poner un P/M al margen que corte toda la pantalla mientras dure la presentación, y retirarlo cuando comience la data (video), pero eso requiere un poco más de memoria.
xt5 escribió:
vitoco escribió: Otra cosa: ¿será posible activar y desactivar la "cajita" vía comandos? Creo que sería necesario algo para activar o desactivar el streaming hacia el Atari y no interferir con otros dispositivos que pudiese tener conectado. Había pensado en usar el bit 3 de PACTL ($D302) que enciende y apaga el motor en las cassetteras, pero necesito otra cosa para indicar a la cajita que transmita la señal de audio o la de video.
Es lo que hace el MegaCD, usar la linea de comandos, el asunto es definir cuantos "comandos" utilizaremos, creo que solo bastaria manejar el switch que conmuta la señal de video.
No creo que sea una preocupacion no intervenir con mas dispositivos, no me imagino este dispositivo compartiendo el puerto SIO con otros porque pierde su gracia, si tengo acceso a la disquetera me dejo de joder y hago el loader inicial desde la misma disquetera jajajaja.
En parte tienes razón, ¿pero si hubiera otra cosa como una impresora o un RS-232? De todos modos, la inquietud iba por el lado de cómo pasar comandos a un circuito simple que sólo actúa de filtro... ¿a un flip flop?

++V
Avatar de Usuario
fcatrin
hard player
hard player
Mensajes: 470
Registrado: Jue Abr 10, 2008 2:45 pm
Reputación: 5
Ubicación: Quilpué, Chile
Contactar:

Re: PROYECTO: Carga de programas en Atari desde DVD

Mensaje por fcatrin »

Sobre los sistemas de carga/grabación en cassette, al menos los que vi eran todos iguales respecto a la responsabilidad del software y el hardware. Las diferencias estaban en:
* largo de carrier de sincronización
* largo de IRG
* largo de bloque
* cifrado (opcional)
* bitrate

Todos los sistemas, incluyendo inyector, se apoyaban en el hardware para decodificar el audio y recibían el byte ya leído. Solo recuerdo que STAC tenía su propia lógica de detección de bitrate.

Esa detección era la pura parte de decodificacion por software. Al inicio de cada bloque venia una secuencia de unos y ceros que se grababa iniciando cada bloque con un par de bytes que generaban eso. Leyendo los bits directamente se contaba el tiempo y en base a eso se programaba el SIO para que leyera el resto a la velocidad calculada.

La excepción es inyector que usaba un frecuencia fija

Esto es a puro recuerdo, me encantaría volver a revisar ese código
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje