Karoshi MSX Community
05 de Julio de 2021, 07:40:00 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]
  Imprimir  
Autor Tema: La rutina de transferencia "refinitiva"  (Leído 12186 veces)
0 Usuarios y 1 Visitante están viendo este tema.
SapphiRe_MSX
Visitante
« Respuesta #15 : 29 de Mayo de 2007, 05:20:04 pm »

La rutinita de marras:

Código:
; FAST LDIRVM (en MSX1 sólo funciona dentro del vblank o con la pantalla apagada)
FLDIRVM:        ld a,[7]    ; a = puerto #0 de escritura del VDP
                ld c,a      ; c = puerto #0 de escritura del VDP
                inc c       ; c = puerto #1 de escritura del VDP
                out [c],e   ; Escribimos en el VDP el byte bajo de la direccion de destino
                set 6,d     ; Activamos el sexto bit del byte alto (no seria necesario si ya lo dejamos activado al inicializar DE)
                res 7,d     ; Desactivamos el séptimo bit del byte alto (no seria necesario si ya lo dejamos desactivado al inicializar DE)
                out [c],d   ; Escribimos en el VDP el byte alto de la direccion de destino
                dec c       ; c = puerto #0 de escritura del VDP
@@LOOP:         outi        ; (1)
                outi        ; (2)
                outi        ; (3)
                outi        ; (4)
                outi        ; (5)
                outi        ; (6)
                outi        ; (7)
                outi        ; (8)
                outi        ; (9)
                outi        ; (10)
                outi        ; (11)
                outi        ; (12)
                outi        ; (13)
                outi        ; (14)
                outi        ; (15)
                outi        ; (16)
                djnz @@LOOP
                ret

Uso:

HL = Direccion de origen en RAM
DE = Direccion de destino en VRAM (si activamos los bits adecuados de D nos podríamos ahorrar las instrucciones set y res)
B = Numero de bloques de 16 bytes a transferir, pero multiplicados por 17 y módulo 256

  Es decir, para transferir, por ejemplo, 704 bytes, habría que inicializar B a:

704 div 16 = 44
44 * 17 = 748
748 mod 256 = 236

  Si el número de bytes a transferir fuera múltiplo de 256, el primer número (en este caso 44) y el último (en este caso 236) coincidirían. ¿Por qué he escogido usar 16 outis? Por la sencilla razón de que la cantidad máxima que puede enviar esta rutina es de 2048 bytes (256 bloques de 16 bytes), que es, precisamente, el tamaño de una tabla de patrones o colores, pero claro, se puede cambiar y meter el número de outis que sean necesarios, si quieres 32 o incluso 64, modificando adecuadamente los números de las operaciones.

  Un último consejo: usadla con las interrupciones desactivadas Grin Grin

Saludos
--
Sph.
« Última modificación: 29 de Mayo de 2007, 05:24:04 pm por SapphiRe » En línea
SapphiRe_MSX
Visitante
« Respuesta #16 : 30 de Mayo de 2007, 05:19:55 pm »

¿Nadie le ha echado un vistazo? Huh Huh
En línea
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« Respuesta #17 : 31 de Mayo de 2007, 10:18:16 am »

Mil gracias, Sapphire  Cheesy La ví ayer,pero no pude responder, y ahora no es que me pueda extender mucho, que estoy en el curro  Cheesy

De muerte viene la rutina, por cierto  Wink

Cosillas: comentas que puede mandar 2048 bytes, supongo que en un vblank  Huh Pero por lo que se ha comentado, el máximo que se puede mandar en un vblank en una máquina a 60Hz son 800 bytes y 1536 en una de 50Hz. Aquí me quedo un poco "pillao". ¿Qué no cuadra?  Huh Tenía entendido que ese era el tope en un MSX1 (y no veas si me jode, necesito velocidad por un tubo) Smiley Si te sales del vblank, debería aparecer basura en pantalla, ¿cierto?

¡¡Gracias de nuevo!!

En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
SapphiRe_MSX
Visitante
« Respuesta #18 : 31 de Mayo de 2007, 10:59:10 am »

Cosillas: comentas que puede mandar 2048 bytes, supongo que en un vblank  Huh

No, no. Digo que tal y como está, es capaz de transferir hasta un máximo de 2048 bytes, que son, precisamente, 256 bloques de 16 bytes. Si en lugar de 16 outis metes 32, el máximo que es capaz de transferir sería 4096.

Esta rutina es muy rápida, pero SÓLO funciona en el vblank y si la pantalla está apagada. Calculo que (en NTSC) se podrían transferir aproximadamente unos 512bytes sin problemas en el vblank con esta rutina, así que si consigues dividir las transferencias en paquetes de medio kb, te serviría perfectamente. De todas formas, creo que alguien por aquí ya ha estado jugueteando con esta rutina para transferir más de lo que yo vuelco en el QBIQS... a ver, a ver... ¿alguien tiene más datos que aportar? Grin Grin Grin

Y si la usas, no olvides inicializar b correctamente Grin que ese es el truco Cheesy
« Última modificación: 31 de Mayo de 2007, 11:01:02 am por SapphiRe » En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #19 : 31 de Mayo de 2007, 02:31:13 pm »

Citar
Si te sales del vblank, debería aparecer basura en pantalla, ¿cierto?

Um, no. Esas cantidades como bien dices, son los límites teóricos de la cantidad de bytes que se pueden volcar a la VRAM usando OUTIs durante el vblank. El vblank es el periodo comprendido entre el fin de la ultima linea de la pantalla activa (empieza por tanto en la 192) y acaba al comienzo de la misma (virtualmente sería la coordenada -1), el resto de la pantalla es visible y no es vblank, para volcar datos durante este intervalo el único requisito es que esperemos un poco entre OUTI y OUTI; pero no tiene porque salir basura si así lo hacemos. Durante el frame o cuadro se pueden enviar muchos más bytes que los que se pueden enviar durante el vblank Smiley; claro, que tampoco es cuestión de pulirse todo el tiempo de la CPU enviando datos a pantalla Tongue

¡A este paso dentro de poco te vas a convertir en Darth VDP! :-D
En línea

Doom dee doom dee doom
SapphiRe_MSX
Visitante
« Respuesta #20 : 31 de Mayo de 2007, 02:36:06 pm »

por cierto, JL, ¿recuerdas cuando empezamos a intercambiarnos mensajes sobre esta rutina? Fíjate en lo que ha quedado al final Grin Grin
En línea
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« Respuesta #21 : 31 de Mayo de 2007, 04:08:12 pm »

¡Gracias a ambos, monstruos!  Cheesy

Ya me ha quedado claro lo del vblank y fuera de él (algo aprendo, lento pero algo) Smiley pero lo comentaba porque en la rutina de Sapphire los outis van a saco sin nops por medio (a no ser que me pierda algo, eso me parece). Por eso decía que fuera del vblank se podría marear la cosa. Ya tengo claro que vblank=outis a saco, y luego si la transferencia es mayor=creo rutina que vuelca el resto con dos nops  Cool

Para las cosillas spectrumeras, como quiero música de por medio (cómo mola, jeje) quiero saber más o menos cuántos ciclos consume el Caruso a tres canales, y así poder hacer por ejemplo una rutina tal que así:

halt

(salta el Caruso -> tralarí, tralará, reggaeton del güeno y tal...)

Volcado de x bytes a saco (outis, outis and more outis)

Resto del volcado-> usando nops

Ahora necesito saber si después del vblank, con el Caruso en marcha, puedo volcar 600 bytes, 500 o lo que sea.

Aunque a lo mejor lo suyo es no arriesgar y hacer la rutina con nops y me aseguro que tarde lo que tarde el reproductor no se descuadra el volcado a VRAM.

De nuevo, gracias, estoy dando el salto al lado oscuro poco a poco (a empujones, eso sí)  Grin
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
SapphiRe_MSX
Visitante
« Respuesta #22 : 31 de Mayo de 2007, 04:21:23 pm »

Resto del volcado-> usando nops

Claro que, en lugar de nops, puedes aprovechar esos ciclos para ir haciendo otros cálculos... Grin Grin
En línea
Darth_Fistro
Karoshi Hero
*****
Mensajes: 507


Email
« Respuesta #23 : 31 de Mayo de 2007, 04:50:40 pm »

Pero... ¿qué cálculos puedo hacer en 8 ciclos? ¿Y cómo controlo el flujo de las instrucciones, qué ejecutar y el orden?  Shocked

Eso suena muy maquiavélico... ¡cuenta, cuenta!  Cheesy
En línea

MSX FOREVER (hasta que saquen un ZX81 con TMS, PSG y 64K de RAM)
SapphiRe_MSX
Visitante
« Respuesta #24 : 31 de Mayo de 2007, 05:02:33 pm »

Pero... ¿qué cálculos puedo hacer en 8 ciclos? ¿Y cómo controlo el flujo de las instrucciones, qué ejecutar y el orden?  Shocked

A ver, los 8 ciclos son un tiempo MÍNIMO de espera. Si tienes que hacer un cálculo donde no intervengan de, hl ó bc, puedes aprovechar esos tiempos entre outi y outi para hacer todo lo que necesites con el acumulador y de. Si necesitases más registros siempre puedes hacer un exx, utilizarlos lo que necesites y repetir el exx para recuperar los valores adecuados de hl y bc. Aunque siendo estrictos, incluso podrías utilizar b, sabiendo que se decrementa tras cada outi.

Claro que todo esto sólo lo puedes hacer desenrollando "a lo bestia" (del todo) el bucle de transferencia, e intercalando el cálculo entre los outis... Cheesy
« Última modificación: 31 de Mayo de 2007, 06:19:04 pm por SapphiRe » En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #25 : 31 de Mayo de 2007, 05:21:32 pm »

Juanma:

En cuanto al uso del Caruso te recomiendo que la secuencia se la siguiente:

HALT

CALL DUMP_PSG ; Creo que se llama así

; Aquí, todos los temas de volcado a VRAM

...

; Y aquí, el resto de procesos del Caruso

...


De este modo, conseguirás que el sonido sea síncrono pero no pierdas tiempo de v-blank con procesos no relacionados con VRAM.
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #26 : 31 de Mayo de 2007, 07:44:23 pm »

Citar
por cierto, JL, ¿recuerdas cuando empezamos a intercambiarnos mensajes sobre esta rutina? Fíjate en lo que ha quedado al final Grin

Sí....y hay que ver como se ha desarrollado la condenada Wink

Citar
De este modo, conseguirás que el sonido sea síncrono pero no pierdas tiempo de v-blank con procesos no relacionados con VRAM.

Eso que te comenta Robsy es muy importante, todo lo dicho se queda en nada si lo primero que haces tras la sincronización no es la transferencia a video.

Citar
Eso suena muy maquiavélico... ¡cuenta, cuenta!

Como ya te explica Sapp, se pueden hacer muchas cosas; pero en este caso, depende 100% de como tengas montada la rutina y de lo que estes haciendo, es posible que puedas aprovechar el tiempo o que no puedas Roll Eyes. Tu siempre ten presente que los NOPs es una perdida de tiempo Smiley
En línea

Doom dee doom dee doom
Páginas: 1 [2]
  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!