Proyecto, un juego para Dragon 32

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

Último mensaje de la página anterior:

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:53

Mira en el repositorio http://miniserve.defence-force.org/svn/ ... %20source/

En la carpeta tools está el compresor ejecutable y en él raíz el bat que usaba para llamarlo y comprimir el archivo strings.s y generar stringsc.s, ambos los tienes ahí para que veas lo que se genera. Al final del archivo con las cadenas comprimidas, está la tabla diccionario.

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 22:35

Hola Chema,
muchísimas gracias por la explicación y las direcciones.
Echaré una ojeada aunque sea solamente por aprender otra forma de hacer las cosas.
Es muy probable por los cálculos que estoy haciendo ahora que me pueda ahorrar esta
parte de comprimir texto para este proyecto aunque será por los pelos!
También había pensado en utilizar el sistema empleado en The Hobbit, pero me parece
mucho trabajo para no tanto texto ...
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 » 23 Mar 2017 12:52

Chema escribió:Mira en el repositorio http://miniserve.defence-force.org/svn/ ... %20source/
En la carpeta tools está el compresor ejecutable y en él raíz el bat que usaba para llamarlo y comprimir el archivo strings.s y generar stringsc.s, ambos los tienes ahí para que veas lo que se genera. Al final del archivo con las cadenas comprimidas, está la tabla diccionario.

Hola Chema,
copio una parte del fichero string.s que esta en esta dirección

Código: Seleccionar todo

Helena_spch_2
    .byt 3
    .asc "Thank you, John."
    .byt 0
    .asc "I need to get back to my laboratory"
    .byt 0
    .asc "to prepare the medicine."
    .byt 0

Veo que los títulos (cabecera) de cada parrafada no se comprimen y quedan como etiquetas ...
El primer byte indica el número de líneas que siguen.
Parece como que el byte cero lo estás usando como final de linea (Intro)
En mi caso, utilizo 13d ($0d) y un cero ($00) indica final de frase.
Como solamente se están comprimiendo los textos que siguen a .asc,
¿Podría eliminar el primer byte y sustituir todos los byt 0 por 13 excepto el último sin afectar al compresor?
muchas gracias
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 » 23 Mar 2017 13:12

@Chema
probado ... y funciona perfectamente -thumbup
Ahora veré el tema de lectura directa de las frases comprimidas al-vuelo
consultando la tabla grammar del final del fichero resultante, aunque parece
bastante claro, ya te iré contando

saludos
pere

Avatar de Usuario
Nandove
Mensajes: 1567
Registrado: 10 Ene 2011 12:16
Agradecido : 613 veces
Agradecimiento recibido: 418 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor Nandove » 23 Mar 2017 13:14

desde casi mi nula ignorancia... por programa poner una letra en pantalla, ¿ocupa lo mismo que hacer el peek/poke de la direccion de memoria para ponerla en pantalla?

Si a nivel de memoria ocupa menos... ¿se podría hacer un programita en pc que hiciera una macro sustitución de toda la parte "textil" de cada letra y posición por cada poke correspondiente, y después pasar ese bloque infumable a un emulador? ¿ahorraría memoria?

No se si es una burrada lo que digo, o si me explico bien...

Avatar de Usuario
minter
Mensajes: 4826
Registrado: 22 Jul 2014 18:51
Agradecido : 6762 veces
Agradecimiento recibido: 2602 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor minter » 23 Mar 2017 14:44

minter_spch_1
.byt 6
.asc "Minter§vi…„vent“‘anas׌fŸmPuto"
__grammar_start
Grammar
.string 1, "Puto"
.string 3, "Windows"
.string 5, "10"
.string 7, "que"
.string 11, "no"
.string 13, "me"
.string 17, "deja"
.string 19, "ejecutar"
.string 23, "el"
.string 29, "compresor"
__grammar_end
-507

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 » 23 Mar 2017 16:01

Uf, que no había visto el mensaje. Veo que ya lo pillaste... Solo comprime las cadenas entre comillas (no recuerdo si busca el .asc) el resto no lo toca, así que puedes hacer lo que quieras. No hace falta que sigas ese formato. De hecho lo de numero de líneas y luego el texto es para ciertos casos en este juego.

Lo del cero como fin de string es porque yo uso la convención de C, pero puedes hacerlo como quieras, mi descompresión, que usa la pila, va tomando caracteres hasta encontrar un cero. También llama a una rutina de la librería de C (aunque pasé todo el juego a asm) para imprimir el carácter, por eso guarda el código ascii en la pila (sp),y y llama a _putchar. En otros juegos llamo a mi propia rutina de impresión.

Y probablemente no funcione en Windows 10 :) Ya te digo que es una chapuza de programa que compilé en su día para mi uso. Podría buscar él fuente a ver si lo tengo por algún sitio..

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 » 23 Mar 2017 16:21

Nandove escribió:desde casi mi nula ignorancia... por programa poner una letra en pantalla, ¿ocupa lo mismo que hacer el peek/poke de la direccion de memoria para ponerla en pantalla?
Si a nivel de memoria ocupa menos... ¿se podría hacer un programita en pc que hiciera una macro sustitución de toda la parte "textil" de cada letra y posición por cada poke correspondiente, y después pasar ese bloque infumable a un emulador? ¿ahorraría memoria?
No se si es una burrada lo que digo, o si me explico bien...

Ya nos gustaría a todos que así fuera!
En Dragón, en los modos gráficos NO HAY TEXTO, tienes que dibujarlo tu mismo, o sea unos 7-8 bytes para cada letra para 32 caracteres por linea
Trabajando con 42 letras por linea las cosas se complican ya que cada letra debe ocupar solo 6 pixels (6x42=252 que es casi el limite de pantalla)
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 » 23 Mar 2017 16:32

Chema escribió:Uf, que no había visto el mensaje. Veo que ya lo pillaste... Solo comprime las cadenas entre comillas (no recuerdo si busca el .asc) el resto no lo toca, así que puedes hacer lo que quieras. No hace falta que sigas ese formato. De hecho lo de numero de líneas y luego el texto es para ciertos casos en este juego.
Lo del cero como fin de string es porque yo uso la convención de C, pero puedes hacerlo como quieras, mi descompresión, que usa la pila, va tomando caracteres hasta encontrar un cero. También llama a una rutina de la librería de C (aunque pasé todo el juego a asm) para imprimir el carácter, por eso guarda el código ascii en la pila (sp),y y llama a _putchar. En otros juegos llamo a mi propia rutina de impresión.

El texto a comprimir me ocupa (de momento) 2.820 bytes. Una vez comprimido ocupa 1.617 + 256 de la gramática = 1.873 bytes
Esto implica un ahorro de 947 bytes (33,6%). El resultado sería mejor si hubiera mucho mas texto a comprimir ...
Tengo que añadir un sprite monstruoso, de unos 18x104 bytes, que requiere 1.872 bytes por lo que puede que ahorrarme la mitad en texto sea crucial para finalizar el proyecto sin sufrir mas de lo necesario -thumbup
La descompresión en asm va a ser divertida ya que, de entrada, parace que una rutina recursiva seria una buena solución. Pero nunca he implementado ninguna en ensamblador aunque si en Java y C++. Guerra en el stack!
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 » 23 Mar 2017 17:08

En el enlace al foro de Defence Force tienes mi rutina en ensamblador del 6502, que es fácil de traducir, porque es sencilla.

Y no comprime demasiado, la verdad, sobre todo si hay poco texto (solo la tabla ya es un buen porcentaje del texto total) pero a mí me vino fenomenal para lo que quería. Espero que a ti también :)

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 » 23 Mar 2017 17:20

Chema escribió: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.

MI problema de bajo rendimiento en la compresión (solo baja a un 66%) es debido a dos causas importantes:
- Utilizo acentos y los caracteres ñ y ¿
- Para modo baja resolución (texto estándar) todos los caracteres son en MAYUSCULAS
Ambos casos reducen mucho las posibilidades de repeticiones de caracteres, pero no está nada mal.
Ya tengo preparada la rutina recursiva, a ver si consigo añadirla en el programa sin romper nada
y puedo hacer ya las primeras pruebas explosivas -drinks
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 » 23 Mar 2017 19:26

Ya está incorporado el sistema de textos comprimidos. Y además funciona -507
Ha costado mas de lo previsto debido a los dos sistemas de presentación de textos empleados:
- En la pantalla de texto estándar (16 lineas de 32 caracteres)
- En pantalla gráfica, zona baja 4 lineas de 42 caracteres (6 pixels de anchura por char)
Esta última rutina utiliza el stack en cantidad tanto para operaciones como para control, asi que no puedo
llamarla carácter a carácter ya que cada cuatro caracteres los mete en tres bytes (4 letras x 6 pixels = 3 bytes x 8 bits)
Por lo tanto, he decidido descomprimir sobre un buffer y hacer que la rutina eche mano del mismo.
Para no tener rutinas repetidas con distinto comportamiento, hago lo mismo para el modo texto.

@Chema
Muchísimas gracias por todas estas herramientas y consejos -thumbup

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 » 23 Mar 2017 22:00

Me alegro de que te sirva!

Avatar de Usuario
minter
Mensajes: 4826
Registrado: 22 Jul 2014 18:51
Agradecido : 6762 veces
Agradecimiento recibido: 2602 veces

Re: Proyecto, un juego para Dragon 32

Mensajepor minter » 24 Mar 2017 09:25

pser1 escribió:Ya está incorporado el sistema de textos comprimidos. Y además funciona -507
Ha costado mas de lo previsto debido a los dos sistemas de presentación de textos empleados:

¿Pero estamos locos o que?
¿Qué te ha costado? Pero si te ha llevado menos de 24 horas implementarlo!!!! -shock -shock -shock
Alucinante!!! -thumbup

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 » 24 Mar 2017 10:43

minter escribió:
pser1 escribió:Ya está incorporado el sistema de textos comprimidos. Y además funciona -507
Ha costado mas de lo previsto debido a los dos sistemas de presentación de textos empleados:

¿Pero estamos locos o que?
¿Qué te ha costado? Pero si te ha llevado menos de 24 horas implementarlo!!!! -shock -shock -shock
Alucinante!!! -thumbup

El tema costar depende de como lo vea quien lo implementa ...
Numero de intentos fallidos y detectar los errores de diseño / concepto / programación.
Todo se arregla con tiempo y de ésto, por el momento, dispongo de bastante -thumbup
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 » 28 Mar 2017 20:10

Hola,
ahora el descompresor ya no rellena un buffer como hacía hasta ahora.
Envía los caracteres conforme los descomprime hacia la rutina adecuada (llamada indirecta)
Tengo una rutina para imprimir en modo caracteres 16x32 (SG4 texto verde o naranja)
Y otra para alta resolución (PMode4 24x42).
Lo que me ha costado ha sido unificar las diversas formas de enviar el texto:
- Cuatro filas de texto PM4 a lo largo de la aventura (texto comprimido)
- Una sola fila PM4 para los créditos (texto comprimido)
- Una sola palabra hexadecimal PM4 para ver la posición de Brody (no comprimido)
- Una pantalla SG4 para explicaciones (texto comprimido)
- Una pantalla SG4 para presentación (no comprimido)
Lo mas fácil es lo que mas he tardado en descubrir -banghead
El proceso de una o varias lineas ha sido relativamente simple, pero el tema comprimido o no
no sabía como resolverlo ... hasta que he caído en la cuenta de que un texto *NO* comprimido
se puede procesar con la rutina descompresora que simplemente NO encuentra ningún token
para decodificar y se limita a ir enviando los caracteres ASCII de uno en uno a pantalla -thumbup
Es poco lo ahorrado (el buffer) pero era de 256 bytes para las pantallas de baja resolución.
Ya solo me falta el tema de la parte final del juego o sea la caza del tiburón.
Veremos cuanto espacio requieren los pantallazos finales ...
saludos
pere


Volver a “Software Dragon”

¿Quién está conectado?

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