Karoshi MSX Community
05 de Julio de 2021, 03:31:26 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2 3
  Imprimir  
Autor Tema: Inicializando la RAM  (Leído 14876 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« : 21 de Marzo de 2006, 05:08:46 pm »

Desarrollo con el RuMSX, y sucede que a veces, si hago un "soft reset", cuando la rom se vuelve a inicializar, algunos enemigos no aparecen o aparecen "glitches" en la pantalla. Tengo que hacer entonces un "hard-reset" (que se supone borra todo el contenido de la RAM) y el juego vuelve a comenzar bien. Pensé que era debido a que la RAM no se borraba al resetear y tal, pero mi sorpresa vino al probar en el blueMSX y comprobar que pasaba lo mismo, y además el blue no da opción (que yo sepa) de resetear borrando la RAM, con lo que me pregunto, ¿usáis alguna rutina que borre la RAm al principio de vuestros juegos?  Smiley
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #1 : 21 de Marzo de 2006, 05:17:42 pm »

Programando en ensamblador no vale hacer suposición alguna sobre el contenido de las posiciones de memoria. Por lo tanto, inicializa la RAM que vayas a utilizar siempre. Como medida higiénica, lo que hago es escribir ceros en toda la RAM utilizada por el programa. Para ello, puedes usar cualquier rutinilla con bucle. Por mi parte, uso algo parecido a lo siguiente:

Código:
ld hl,0C000h
ld bc,2000h
ld e,00h ; vamos a inicializar 8 KB de RAM a partir de la página 3 con el valor 0
@@ERASE:
ld [hl],e
inc hl
dec bc
ld a,b
or c
jr nz,@@ERASE

Si tienes prisa, también vale lo siguiente

Código:
ld hl,0C000h
ld a,0E0h
ld c,l
@@ERASE:
ld [hl],c
inc hl
cp h
jr nz,@@ERASE

Como siempre: cada vez que escribo un poco de código, se me ocurren mil formas mejores de hacerlo. De todos modos, es una mala cosa optimizar rutinas que no son críticas: uno se vuelve obsesivo y no consigue grandes mejoras. Vale, la segunda rutina ocupa sólo 11 bytes, mientras que la primera ocupa 15. Además, también es más rápida.
En línea
SapphiRe
Visitante
« Respuesta #2 : 21 de Marzo de 2006, 05:23:33 pm »

Pero Robsy, ¿no es mejor hacer lo siguiente?

Código:
xor a
ld hl, 0c000h
ld [hl],a
ld de, 0c001h
ld bc, 1FFFh
ldir

Bastante rápida y elegante, ¿no? Cheesy

Este es el típico problema de falta de inicialización de los valores de las variables Roll Eyes Roll Eyes
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #3 : 21 de Marzo de 2006, 05:33:08 pm »

Interesante técnica, sí señor. Copia sincrónica con arrastre del 0. El único problema -puesto a buscarle problemas- es que ocupa 13 bytes. Eso sí, supongo que es más rápida que la solución propuesta.

En cualquier caso, en lo que todos estamos de acuerdo es en que resulta imprescindible inicializar la RAM antes de hacer cualquier otra cosa en un programa.
 
En línea
SapphiRe
Visitante
« Respuesta #4 : 21 de Marzo de 2006, 05:48:05 pm »

Interesante técnica, sí señor. Copia sincrónica con arrastre del 0. El único problema -puesto a buscarle problemas- es que ocupa 13 bytes. Eso sí, supongo que es más rápida que la solución propuesta.

Pues la técnica la aprendí de un listado en CM que salió en alguna MSX-Extra ó MSX-Club Grin ¡Para que luego digan que no servían para nada esas revistas!

Por cierto he puesto en forma de Snippet la rutina que utilizo en el Namake's para rellenar una zona de memoria con determinado byte.

Saludos
--
SapphiRe
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #5 : 21 de Marzo de 2006, 05:49:50 pm »

Gracias por compartir código, Sap! Aprovecho para animaros a todos a escribir/mejorar/depurar/solicitar snippets.
En línea
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« Respuesta #6 : 21 de Marzo de 2006, 06:06:48 pm »

Citar

Pues la técnica la aprendí de un listado en CM que salió en alguna MSX-Extra ó MSX-Club Grin ¡Para que luego digan que no servían para nada esas revistas!

Acabo de leer en una msx-extra también que es mejor un simple bucle a ese método (lo siento, Sapphire, no me pegues) Wink Gracias por vuestras rápidas respuestas.

Sí,eso de dar por supuesto que la RAM va a estar lista para el abordaje me ha dado algún que otro susto. A partir de ahora lo evitaré, mil gracias a ambos Smiley
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
SapphiRe
Visitante
« Respuesta #7 : 21 de Marzo de 2006, 06:25:40 pm »

Acabo de leer en una msx-extra también que es mejor un simple bucle a ese método (lo siento, Sapphire, no me pegues) Wink Gracias por vuestras rápidas respuestas.

Si puedes decirme en qué MSX-Extra lo has leído te lo agradecería. De todas formas no me cuadra en absoluto, hagamos cuentas:

ldir consume 21 ciclos por cada byte que copia, menos por el último que consume sólo 16

ld [hl],r consume 19 ciclos
inc hl consume 6 ciclos
dec bc consume otros 6 ciclos
ld a,b consume 4 ciclos
or c consume 4 ciclos más...
jr consumiría 12 ciclos salvo si no se cumple que serían 7

sumando: 19+6+6+4+12 = 47 ciclos para todos los bytes salvo para el último que serían 5 menos, es decir 42

Es decir: ldir 21/16, bucle 47/42...

No veo por qué es mejor el bucle, la verdad...

Para salir de dudas hay que comparar estos métodos en un MSX real. ¿Cómo? Por ejemplo midiendo el grosor de la línea azul que generaría el siguiente código:

Código:
     ei
loop: halt
      ld bc,$0407
      call WRTVDP

      [METEMOS AQUI EL CODIGO A PROBAR]

      ld bc,$0107
      call WRTVDP
      jp loop

Y primero probamos a inicializar 8kb's con una técnica y luego la misma cantidad con otra técnica. La línea azul que resulte más gruesa indicará la técnica más lenta. Ahora mismo no tengo acceso a un emulador (puede que en una horita o así...), ¿alguien puede probarlo?

Saludos
--
SapphiRe
« Última modificación: 21 de Marzo de 2006, 06:30:08 pm por SapphiRe » En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #8 : 21 de Marzo de 2006, 09:30:38 pm »

Citar
ld [hl],r consume 19 ciclos

Es que aquí se te fue la mano, en realidad son 7 ciclos; pero ni por esas, LDIR sigue siendo más rápido que la segunda versión del bucle :

7+6+4+12/7 = 29/24

frente a

21/16

del LDIR

Y ya puestos es más rápido (y clásico) esta variante :

Código:
ld hl, 0c000h
ld de, 0c001h
ld bc, 1FFFh
ld [hl],0
ldir

Ya puestos a sentir el vértigo de la velocidad... Grin
En línea

Doom dee doom dee doom
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« Respuesta #9 : 21 de Marzo de 2006, 11:07:26 pm »

Ya digo que no es crítica, porque yo no tengo ni p.idea, pero me llama la atención que en la msx-extra y la club, en algunos artículos dicen una cosa y varios números después otra distinta (que si se puede sintetizar voz, que si no...) y sobre los artículos, no sé si fiarme del todo, por eso lo digo (uno de scroll píxel a píxel resultó ser al final scroll en la tabla de nombres, o sea que píxel a píxel nada). He guardado el lote en al armario, mañana lo miro, pero era un artículo que tenía un dibujo de esos clásicos en blanco y negro con un explorador mirando con lupa unas inscripciones egipcias. Trataba de la optimización en general, y se hablaba del asm del Z80 (que si or a es mejor que cp 0, etc.). Mañana te digo el número con exactitud, pero no era ni muy viejo ni de los últimos.

Ahora estoy grafiqueando, pero mañana pruebo a limpiar la ram y dejarla como una patena Wink
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
SapphiRe
Visitante
« Respuesta #10 : 22 de Marzo de 2006, 11:45:49 am »

Citar
ld [hl],r consume 19 ciclos

Es que aquí se te fue la mano, en realidad son 7 ciclos; pero ni por esas, LDIR sigue siendo más rápido que la segunda versión del bucle :

Cierto... lo miré en una tabla que hay en la web ( http://www.ftp83plus.net/Tutorials/z80inset1A.htm ) y las líneas no están perfectamente alineadas. Pero lo cierto es que LDIR es más rápido que un bucle, ya que te ahorras, además, el tener que acceder a la RAM para leer el código de la siguiente instrucción.

Saludos
--
SapphiRe

En línea
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« Respuesta #11 : 22 de Marzo de 2006, 03:36:41 pm »

Citar

Es que aquí se te fue la mano, en realidad son 7 ciclos; pero ni por esas, LDIR sigue siendo más rápido que la segunda versión del bucle :

Me fío más de tí que de las revistas, Sapphire Smiley Lo haré con ldir, pero de todas formas te dejo el nº de la extra:

nº 34, call XIII

Ejercicio:pon 200 bytes consecutivos a cero.

Solución:

ld hl,direccion
xor a
ld b,200
bucle:
ld (hl),a
inc hl
djnz bucle

más rápido y más corto que:

ld de,direccion
ld hl,direccion+1
ld bc,200
ld (hl),0
ldir

(ya toi de vuelta) Wink por eso me sonaba raro lo del ldir, pero ahora todo aclarado. Habrá que andar ojito con las revistas  Undecided

¡Gracias de nuevo!  Smiley
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
SapphiRe
Visitante
« Respuesta #12 : 22 de Marzo de 2006, 04:44:38 pm »

Me fío más de tí que de las revistas, Sapphire Smiley Lo haré con ldir, pero de todas formas te dejo el nº de la extra:

  No te fíes de mí, mejor comprueba las cosas por tí mismo Smiley Fíate de las matemáticas, que a estos niveles tan elementales no fallan (pero si subimos un poquito... madre mía la de agujeros que tienen).

Citar
nº 34, call XIII

  Octubre de 1987, le echaré un vistazo en casa porque ese número lo tengo (de hecho sólo me falta el 39, ¿lo tienes repe? Cheesy)

Citar
(ya toi de vuelta) Wink por eso me sonaba raro lo del ldir, pero ahora todo aclarado. Habrá que andar ojito con las revistas  Undecided

  Desde luego que hay que andar con ojo con ellas. Seguro que muchas veces la información es correcta, pero en otras ocasiones pueden contradecirse a sí mismos y meter la gamba. De todas formas para estar absolutamente seguros puedes meter esos trozos de código en el código que posteé ayer y que cambia el color del borde (en lugar de 200 bytes pon 8000). El que tenga una franja azul más gruesa es el más lento.

  Con el cálculo de ciclos desde luego sale ganando el ldir y, además, si cada instrucción precisa de un ciclo extra... ya me dirás cuál de las dos soluciones tiene menos instrucciones críticas Cheesy ¡Ante la duda hay que ir a los ciclos! O en su defecto al color de borde Cheesy
Saludos
--
SapphiRe
En línea
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« Respuesta #13 : 22 de Marzo de 2006, 04:51:37 pm »

Lástima, el 39 no lo tengo, pero te lo daba encantado Cheesy

Voy a buscar en internete alguna tabla con los tiempos de cada instrucción, a ver si optimizo un poco, que esto es un spaghetti assembler total  Tongue

Con lo del bucle, pues ldir y ya está. Total, tampoco creo que el tiempo de ejecución en esto sea muy crítico, como dice Edu. Voy a probar un scroll en screen 2 esta tarde a ver qué sale, ahí si que me va a hacer falta rapidez (y usando la bios) Cheesy
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
SapphiRe
Visitante
« Respuesta #14 : 22 de Marzo de 2006, 05:10:29 pm »

Voy a buscar en internete alguna tabla con los tiempos de cada instrucción, a ver si optimizo un poco, que esto es un spaghetti assembler total  Tongue

Un poco más arriba tienes una tabla con todos los tiempos, sólo que las fonts no son muy proporcionales entre columnas y lían un poco. Si no te apañas te envío una que tengo por casa.

Citar
Voy a probar un scroll en screen 2 esta tarde a ver qué sale, ahí si que me va a hacer falta rapidez (y usando la bios) Cheesy

¿Píxel a píxel? Yo ya tengo esa rutina Cheesy y a colores Cheesy
En línea
Páginas: [1] 2 3
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!