Proyecto, un juego para Dragon 32

Avatar de Usuario
Chema
Mensajes: 2664
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 3190 veces
Agradecimiento recibido: 926 veces
Contactar:

Re: Proyecto, un juego para Dragon 32

Mensajepor Chema » 07 Mar 2017 20:35

Último mensaje de la página anterior:

jaja... me alegro pere!

No es una solución mía, en realidad. Como todo lo aprendí de los programadores de juegos de antaño. Cuando estaba desarrollando Space:1999 me fijé en que los sprites de los juegos de spectrum como Knight Lore sólo estaban mirando en una dirección y que los invertían sobre la marcha. No recuerdo quién sugirió hacerlo con una tabla o si se me ocurrió a mí, la verdad. Al fin y al cabo cuando te das cuenta de que todo lo que puedas has de hacerlo con tablas porque merece la pena, pues... :)

Avatar de Usuario
kikems
Mensajes: 5502
Registrado: 30 May 2013 19:23
Agradecido : 2638 veces
Agradecimiento recibido: 3112 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor kikems » 08 Mar 2017 12:10

No me he enterado de nada, pero mola un montón este hilo :D . Como "presta" ver que el intercambio de ideas y conceptos entre desarrolladores se ve reflejado paso a paso y materializado en un juego para micros de 8 bits.

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor pser1 » 14 Mar 2017 13:30

Hola,
donde dije DIGO, digo DIEGO -banghead
Conforme he ido avanzando, al hacer pruebas en la pantalla "comisaría", detecté que al
mover Brody detrás del mostrador hacia la derecha no pasa nada, pero al moverlo
hacia la izquierda, sus piernas se ven (parpadeando)!
De entrada vi que había olvidado poner en el movimiento a izquierda la sincronización
con el final de pantalla y el paso a doble velocidad ...
Lo añadí pero entonces se veían trazos en la parte superior de pantalla, no muchas líneas
pero suficientes para molestar. Esto indica que el proceso completo supera el número de
ciclos disponibles entre fin de pantalla e inicio del siguiente cuadro ...
Estuve a punto de volver atrás e incluir de nuevo los cinco sprites orientados hacia la
izquierda y recuperar el código anterior ... Se me ocurrió mover la parte de redibujar
el objeto en primer plano fuera del bucle de doble velocidad y va y funciona -thumbup
Está claro que en algún momento voy a dedicarle un tiempo a reducir ciclos del movimiento
a la izquierda, pero de momento sigo tal como está.

Una idea podría ser usar acceso directo con el registro DP (página directa) que permite
reducir las direcciones a un byte en lugar de dos. Como se procesan 5 bytes por linea
y se hacen dos operaciones (AND para aplicar mascara y OR para poner el Sprite), con
cada una puedo ahorrar un ciclo, o sea 2x5x56=560 ciclos. No estaría nada mal, tengo que hacer la prueba ...
saludos
pere

Avatar de Usuario
kikems
Mensajes: 5502
Registrado: 30 May 2013 19:23
Agradecido : 2638 veces
Agradecimiento recibido: 3112 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor kikems » 14 Mar 2017 13:55

Una solución muy interesante, hay que probar, ya sabemos que de la teoría a la práctica ya un buen trecho :D .

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor pser1 » 14 Mar 2017 15:19

pues ... yo no he podido esperar mas, y lo he modificado y realmente usa 560 ciclos menos.
Resultado, Brody se mueve bien hacia la izquierda detrás del mostrador ... pero
En la barandilla a la salida de la comisaría, al andar hacia la izquierda se ven algunas miserables
rayas parpadeando levemente en la parte superior de pantalla.
O sea que a pesar de la reducción de 560 ciclos, todavía afecta las tres-cuatro primeras lineas de pantalla
Cada linea tiene 57 ciclos visibles mas 14 en los bordes, así que aun le sobran 4x71=284 ciclos (por lo menos)
O sea aproximadamente la mitad de los ya ahorrados -banghead
Habrá que seguir investigando como reducir código o bien como optimizarlo, aunque ahora ya no parece
un tema tan urgente
saludos
pere

jltursan
Mensajes: 5619
Registrado: 20 Sep 2011 13:59
Ubicación: Madrid
Agradecido : 990 veces
Agradecimiento recibido: 2040 veces
Contactar:

Re: Proyecto, un juego para Dragon 32

Mensajepor jltursan » 14 Mar 2017 20:46

Llegados a este punto, ¿no sería más práctico enmascarar el problema rediseñando un poco la pantalla de manera que el sprite no deba de moverse por la parte superior (o al menos no tan arriba)?

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor pser1 » 14 Mar 2017 22:25

@jltursan
El personaje se mueve por la parte media-inferior de pantalla.
El parpadeo de las primeras lineas se debe a que yo hago el equivalente de POKE&HFFD9,0
con lo cual se pierde la imagen de pantalla, pero lo hago durante el retrazado de cuadro
o sea después del IRQ de FS. Resulta que el total de ciclos necesarios para todo el proceso de
mover a Brody y repintar el objeto de mayor prioridad excede de lo que tarda en empezar
un nuevo cuadro. No es mucho, pero se notaba en unas pocas lineas de arriba.
Ahora ya no se nota en absoluto!
saludos
pere

jltursan
Mensajes: 5619
Registrado: 20 Sep 2011 13:59
Ubicación: Madrid
Agradecido : 990 veces
Agradecimiento recibido: 2040 veces
Contactar:

Re: Proyecto, un juego para Dragon 32

Mensajepor jltursan » 15 Mar 2017 19:35

Aja, lo que parpadea entonces es el propio escenario, no ningún sprite específico.

¡Que fiera con esa solución centella!, ¿como has conseguido rascar los últimos 284 ciclos?

Y si aun así apareciese alguna que otra línea con problemas, la solución de retocar el escenario es igual de buena, eliminad las 3 ó 4 lineas (a negro todas ellas) que ofendan :-)

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor pser1 » 16 Mar 2017 13:29

jltursan escribió:Aja, lo que parpadea entonces es el propio escenario, no ningún sprite específico.
¡Que fiera con esa solución centella!, ¿como has conseguido rascar los últimos 284 ciclos?
Y si aun así apareciese alguna que otra línea con problemas, la solución de retocar el escenario es igual de buena, eliminad las 3 ó 4 lineas (a negro todas ellas) que ofendan :-)

No he reducido los últimos 284 ciclos por ahora, me he limitado a sacar *fuera* del bloque de doble velocidad la parte que *repone* el objeto de mayor prioridad.
El proceso de redibujado de pantalla se lleva a cabo mientras *NO* se está mostrando la pantalla, o sea desde el IRQ de final de pantalla hasta el IRQ de inicio del siguiente cuadro (frame). Esto equivale en sistemas PAL a 120 lineas, cada una de ellas de 71 ciclos, lo cual da 120x71=8.520 ciclos, pero como ya además habilito la doble velocidad (perdiendo control de la imagen) son 17.040 ciclos en total.

Si el programa requiere algo mas de estos 17.040 (a doble velocidad), entonces todo lo que exceda de ésto se dibuja *YA* con la pantalla visible, pero el POKE hace que la pantalla muestre basura, desde arriba hacia abajo hasta que se ejecuta POKE&HFFD8,0 volviendo a velocidad normal.
Digamos que ahora el dibujado de objetos de mayor prioridad lo estoy haciendo a velocidad normal, lo cual *NO* produce efectos secundarios.
Para ver el efecto *raro*, puedes probar este sencillo programa Basic
100 PMODE4,1:PCLS1:SCREEN1,1
110POKE&HFFD9,0
120FORI=1TO5000:NEXT
130POKE&HFFD8,0

saludos
pere

Avatar de Usuario
Chema
Mensajes: 2664
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 3190 veces
Agradecimiento recibido: 926 veces
Contactar:

Re: Proyecto, un juego para Dragon 32

Mensajepor Chema » 16 Mar 2017 14:53

Doble velocidad? En fin, se nota que yo de Dragon cero patatero :)

En todo caso genial que lo hayas resuelto. Esto tiene pinta de ser la bomba!!!

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor pser1 » 16 Mar 2017 15:54

Chema escribió:Doble velocidad? En fin, se nota que yo de Dragon cero patatero :)
En todo caso genial que lo hayas resuelto. Esto tiene pinta de ser la bomba!!!

Hola Chema,
el 6809 dentro del Dragón funciona a 0,89MHz cuando accede a posiciones de RAM.
Existe la posibilidad de ponerlo a doble velocidad en dos variantes:
- la segura, que solo se aplica al código que reside en ROM (no conflictos con la RAM)
- la *peligrosa*, que entra en conflicto con el generador de imagen (VDG)
¿Cómo funciona la SAM (synchronous address multiplexer) para permitir ésto?
Digamos que durante el periodo positivo del reloj, se permite acceso a RAM por parte de programas
pero en el periodo negativo (valor cero) de reloj, es el generador de video el único que está
autorizado a leer la RAM para mostrar la imagen en pantalla (multiplexado de clientes de la RAM)
De esta forma el programa espera medio ciclo para acceder a RAM si cuando quiere hacerlo es el VDG
quien está autorizado. No hay problemas ya que esperar medio ciclo para ejecutar un opcode que puede
requerir entre 2 y 12 ciclos casi no afecta.
Si cambias la configuración con el poke rápido POKE&HFFD7,0 lo que haces es permitir que la ROM
sea accedida a 1,78MHz por lo que los programas Basic que tiran de la ROM se aceleran bastante.
Si configuras que la RAM se pueda acceder en los dos semiperíodos del reloj (POKE&HFFD9,0) entonces
quien se queda sin acceso a la RAM es el VDG lo cual implica quedarte sin pantalla, que pasa a mostrar
basura aleatoria hasta que reconfiguras velocidad normal (POKE&HFFD8,0)
Está claro que si puedes (y tu Dragón lo soporta) es mejor currar a doble velocidad, pero *SOLAMENTE*
puedes hacerlo si no necesitas la imagen en pantalla para nada.
Si tuvieras que realizar unos cálculos complejos y largos, podrías habilitar la doble velocidad, lanzar los
cálculos y volver a velocidad normal. Obtendrías el resultado en la *MITAD* del tiempo!
saludos
pere

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor pser1 » 22 Mar 2017 18:54

pser1 escribió:pues ... yo no he podido esperar mas, y lo he modificado y realmente usa 560 ciclos menos.
Resultado, Brody se mueve bien hacia la izquierda detrás del mostrador ... pero
En la barandilla a la salida de la comisaría, al andar hacia la izquierda se ven algunas miserables
rayas parpadeando levemente en la parte superior de pantalla.
O sea que a pesar de la reducción de 560 ciclos, todavía afecta las tres-cuatro primeras lineas de pantalla
Cada linea tiene 57 ciclos visibles mas 14 en los bordes, así que aun le sobran 4x71=284 ciclos (por lo menos)
O sea aproximadamente la mitad de los ya ahorrados -banghead
Habrá que seguir investigando como reducir código o bien como optimizarlo, aunque ahora ya no parece
un tema tan urgente
saludos
pere

CORRECCION (para puntualizar)
el Dragon funciona a 0,89MHz y muestra 50 imagenes por segundo, cada una con 312 lineas (PAL)
por lo tanto 890000 / 50 / 312 = 57 ciclos por cada linea a velocidad std
NADA de AÑADIR 14 mas en los Bordes, ésto fue un error por mi parte!
Las líneas a doble velocidad permiten ejecutar 2x57 = 114 ciclos de reloj

Por tanto si solo se movían 3-4 lineas era tema de 4x57 (velocidad normal) = 228 ciclos solamente

Saludos
pere

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor pser1 » 22 Mar 2017 19:00

@desarrolladores de aventuras gráficas
Estoy empezando a llegar al límite de la RAM disponible debido a la cantidad de diálogos del juego.
¿Alguno de vosotros ha implementado algún sistema de diccionario?
¿Ha probado alguien a comprimir las frases y descomprimirlas en tiempo real?
No lo veo complicado si no fuera por el rollo de que ahora tengo un puntero a cada frase
y si descomprimo sobre un área fija, tendrá que ser fija la dirección también ... muchos cambios a la vista.
Se aceptan ideas de cualquier tipo
Posiblemente no sea imprescindible para el Proyecto Tiburón, pero seria bueno disponer de alguna
alternativa que permitiera aumentar la verbosidad del juego si hiciera falta.
Gracias de antemano
pere

Avatar de Usuario
ron
Mensajes: 21856
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 3862 veces
Agradecimiento recibido: 4754 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor ron » 22 Mar 2017 19:09

pese a todo Pser1, madre mía como se estiran y lo que dan de si 32K.
Creo que llegados a este punto, cualquier truco para ahorrar RAM y dejar el juego lo mejor posible es cuando deben usarse y si no hay sitio para más, pues GAME OVER y ya veremos que viene después.

Avatar de Usuario
wilco2009
Mensajes: 2141
Registrado: 07 Ene 2013 16:48
Ubicación: Valencia
Agradecido : 202 veces
Agradecimiento recibido: 384 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor wilco2009 » 22 Mar 2017 19:56

Se me ocurre la siguiente codificacion:
- todos los bytes que esten entre 0 y 31 son letra directa.(añadiendo el bit 6)
- los bytes entre 64 y 254 son para apuntar a una lista de palabras frecuentes.
- 255 mas un segundo byte es para una segunda lista de palabras menos frecuentes.
"Nada viaja a mayor velocidad que luz con la posible excepción de las malas noticias las cuales obedecen a sus propias leyes."

Douglas Adams. Guía de autoestopista galáctico.

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor pser1 » 22 Mar 2017 20:35

wilco2009 escribió:Se me ocurre la siguiente codificacion:
- todos los bytes que esten entre 0 y 31 son letra directa.(añadiendo el bit 6)
- los bytes entre 64 y 254 son para apuntar a una lista de palabras frecuentes.
- 255 mas un segundo byte es para una segunda lista de palabras menos frecuentes.

Muchas gracias por la idea.
El añadido del 255 como indicador de lista alternativa es interesante, pero utilizar dos bytes para
identificar a una palabra, se puede sustituir directamente por la dirección de inicio de dicha
palabra y te ahorras el peñazo de pasar por una tabla de direcciones ...
Otro tema es la cuestión de las Mayúsculas ...
En el fondo toda palabra de MAS de dos letras reduce espacio al sustituirla por su apuntador
El tema serán las palabras usadas solamente una vez
Voy a darle vueltas a la tuerca ;-) cuanto mas estandarizado mejor.
El rollo es hacer la lista de palabras y luego lo mismo para inglés -banghead
saludos
pere

Avatar de Usuario
Chema
Mensajes: 2664
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 3190 veces
Agradecimiento recibido: 926 veces
Contactar:

Re: Proyecto, un juego para Dragon 32

Mensajepor Chema » 22 Mar 2017 20:48

Yo me hice en su día un sistema así para Space:1999... Usaba el bit 7 para diferenciar caracteres de tokens. Los tokens siempre expandían según un diccionario en otros dos valores, que podían ser caracteres u otros tokens, vamos una gramática.

Luego tenía un programa externo que cogia el texto y generaba el diccionario (de 256 bytes) y el texto comprimido.

Ventajas: pasas un puntero al texto comprimido y lo puedes ir descomprimiendo sobre la marcha, sin usar bufer extra. Se mantiene la convención de acabar las cadenas con el código 0 como en C. Es muy rápido y puedes pasarle texto sin comprimir. Además tienes los códigos del 1 al 31 para casos especiales, si los necesitas, como retornos de carro tabuladores o cosas así.

Inconvenientes: toda la información la tengo en inglés aquí http://forum.defence-force.org/viewtopic.php?f=4&t=190, el programa que comprime también lo tengo pero es un hack súper cutre que toma un archivo con el formato del XA y comprime las cadenas que encuentra dentro, además de generar el diccionario también en formato del XA. Por último funciona mejor si le pasas todo el texto, no comprime a partir de un diccionario ya generado, yo lo invocaba al compilar.

Pero bueno, funciona muy bien, es rápido y conseguía dejar el texto en un 45%. Lo use también en Skool Daze, por cierto.


Volver a “Software Dragon”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados