Karoshi MSX Community
05 de Julio de 2021, 07:38:32 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: Corrupción en la VRAM  (Leído 8362 veces)
0 Usuarios y 1 Visitante están viendo este tema.
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« : 27 de Enero de 2012, 06:45:15 pm »

Buenas tardes.

Tengo el M-TANKS casi terminado, depurando fallitos allí y alla, pero se me está atascando lo que espero que sea una tontería y veo que la fecha límite para el MSXDEV'11 se me echa encima.

En su momento descubrí que acceder a la VRAM con las funciones de la BIOS me daba problemas porque ellas solitas activaban las interrupciones, así que decidí copiarlas en mi código y modificarlas lévemente para colocar EI donde me interesara.

Todo parecía ir bien hasta que hemos empezado a hacer pruebas intensas en máquinas reales.

Aleatoriamente (aunque no muy a menudo), aparecen TILES aleatorios en pantalla, se modifican sprites sin venir a cuento, aparecen sprites donde no deben cuando no deben, etc.

¿Alguien podría echarme una mano con las rutinas que uso por si hubiera metido la pata?

Estas son las funciones de acceso a la VRAM que utilizo:


vpoke_ROM:
        ld a,l
        di
        vpoke_rom_99_1:       
        out (0x99),a
        ld a,h
        and 0x3f
        or  0x40
        vpoke_rom_99_2:       
        out (0x99),a
        ld a,b
        ex [sp],hl
        ex [sp],hl
        vpoke_rom_98_3:       
        out (0x98),a
        ei
        ret
vpoke_int_ROM:
        ld a,l
        vpoke_int_rom_99_1:
        out (0x99),a
        ld a,h
        and 0x3f
        or  0x40
        vpoke_int_rom_99_2:
        out (0x99),a
        ld a,b
        ex [sp],hl
        ex [sp],hl
        vpoke_int_rom_98_3:
        out (0x98),a
        ret
direccionvram_ROM:
        ld a,l
        direccionvram_rom_99_1:
        out (0x99),a
        ld a,h
        and 0x3f
        or 0x40
        direccionvram_rom_99_2:
        out (0x99),a
        ret
   
       
llenavram_ROM:
        ld d,a
        di
        call direccionvram
               
        bucle_llenavram_rom:       
        ld a,d
        llenavram_rom_98_1:
        out(0x98),a
        dec bc
        ld a,b
        or c
        jr nz,bucle_llenavram_rom
         
        ei
        ret
llenavram_vert_ROM:
        ld d,a
        di
        bucle_llenavram_vert_ROM:       
        call direccionvram
               
        ld a,d
        llenavram_vert_rom_98_1:
        out[0x98],a
        push de
        ld de,32
        add hl,de
        pop de
        dec bc
        ld a,b
        or c
        jr nz,bucle_llenavram_vert_ROM
         
        ei
        ret
       
ram2vram_ROM:
        di
        ex de,hl
        call direccionvram
bucle_ram2vram_ROM:
        ld a,[de]
        ram2vram_rom_98_1:
        out [0x98],a
        inc de
        dec bc
        ld a,b
        or c
        jr nz,bucle_ram2vram_ROM 
        ei
        ret



Las etiquetas intermedias (ram2vram_rom_98_1, llenavram_vert_rom_98_1...) las utilizo para copiar el código en RAM y modificar las direcciones del puerto del VDP a las que indica la dirección 0x0007

La preparación de las rutinas la hago con:
fin_rutinas_video_ROM:
rutinas_vram:
        ld hl,inicio_rutinas_video_ROM
        ld de,inicio_rutinas_video_RAM
        ld bc,fin_rutinas_video_ROM-inicio_rutinas_video_ROM
        ldir
        ld a,[7]
        ld [inicio_rutinas_video_RAM+(vpoke_rom_98_3-vpoke_ROM)+1],a
        ld [inicio_rutinas_video_RAM+(vpoke_int_rom_98_3-vpoke_ROM)+1],a
        ld [inicio_rutinas_video_RAM+(llenavram_rom_98_1-vpoke_ROM)+1],a
        ld [inicio_rutinas_video_RAM+(llenavram_vert_rom_98_1-vpoke_ROM)+1],a
        ld [inicio_rutinas_video_RAM+(ram2vram_rom_98_1-vpoke_ROM)+1],a
        inc a
        ld [inicio_rutinas_video_RAM+(vpoke_rom_99_1-vpoke_ROM)+1],a
        ld [inicio_rutinas_video_RAM+(vpoke_rom_99_2-vpoke_ROM)+1],a
        ld [inicio_rutinas_video_RAM+(vpoke_int_rom_99_1-vpoke_ROM)+1],a
        ld [inicio_rutinas_video_RAM+(vpoke_int_rom_99_2-vpoke_ROM)+1],a
        ld [inicio_rutinas_video_RAM+(direccionvram_rom_99_1-vpoke_ROM)+1],a
        ld [inicio_rutinas_video_RAM+(direccionvram_rom_99_2-vpoke_ROM)+1],a
        ret



A quien se le ocurre ponerse tan tarde a probar el juego en máquinas reales, eh? a quien?
ains...



Muchas gracias.
En línea
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« Respuesta #1 : 27 de Enero de 2012, 07:57:44 pm »

A mi me da que no te esperas lo necesario entre OUT i OUT hacia VRAM.
Mirate este post http://karoshi.auic.es/index.php?topic=668.0 en le apartado de Acceso contenido a la VRAM (o como acceder a la VRAM sin usar la BIOS y no morir en el intento)
y te dejo aquí la rutina que uso yo para volcado de ThePetsMode by NapalM Wink.
Así ves un poco eso del tiempo de espera.

Código:
; ////////////////////////////////
; ///////// IPBVRM ///////////////
; ////////////////////////////////

; Interrupt pub buffer videoram
; VOLCA buffer de 768 bytes A VRAM screen2
; 29/12/04 Arnau Castellvi / Zona Neutra

; HL = Offset del buffer

; Cal RAM : res
; Toca   : B,C,D,E
; Retorna : res
; Usa fun.: res

IPBVRM:
ld DE,VRM_MAP
ld B,96     
ld A,E
out [99h],A
ld A,D
or 40h
out [99h],A
ld C,98h

IPBVRM0:
ld D,B
outi
nop
nop
outi
nop
nop
outi
nop
nop
outi
nop
nop
outi
nop
nop
outi
nop
nop
outi
nop
ld B,D
outi
jp nz,IPBVRM0
ret
En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #2 : 27 de Enero de 2012, 08:33:30 pm »

Voy a meter unos cuantos NOP entre los OUT, a ver si así...

Lo que me tiene intrigado es que el código lo copié de la BIOS del Toshiba HX-10 que hay para el BlueMSX, por lo que debería ser correcta, al menos para el HX-10

¿?



Muchas gracias.
En línea
Dioniso
Visitante
« Respuesta #3 : 27 de Enero de 2012, 09:04:43 pm »

Estas son las funciones de acceso a la VRAM que utilizo:

¿Dónde está la rutina direccionvram? No la veo en el código que has puesto.
En línea
Dioniso
Visitante
« Respuesta #4 : 27 de Enero de 2012, 09:12:33 pm »

Y respecto a los OUTs de tu rutina: tampoco veo ningún problema por la espera entre OUTs. De hecho, tengo requeteprobado que un simple LD A,0 (9 t-states) es suficiente. Dos NOPs serían 10, uno más de la cuenta  Wink

O incluso LD A,$3E, ya que LD A,n sería $3E y al cargar A con $3E te puede salir una mejor compresión ... En hexadecimal LD A,$3E sería $3E, $3E.

Esto, claro, si no necesitas A en tus OUTs.
En línea
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #5 : 27 de Enero de 2012, 09:21:18 pm »

Yo también dudo mucho que sea un problema de agobio del vdp, hay ya retardos más que de sobra. Lo que sí veo es que vpoke_int_ROM y direccionvram_ROM no desabilitan las interrupcuones entre los  OUTS que establecen la dirección de memoria, así que si cae una INT en medio el puntero puede terminar en cualquier sitio y explicaría los fenómenos paranormales porque modificas la vram de forma aleaotoria...
En línea
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #6 : 27 de Enero de 2012, 09:31:34 pm »

vpoke_int la utilizo solo dentro de la interrupción y direccionvram solo la uso dentro de las funciones que hay ahí, no la uso sola



En línea
Dioniso
Visitante
« Respuesta #7 : 27 de Enero de 2012, 09:33:13 pm »

¿Puedes mostrar la rutina direccionvram? Igual hay algo ahí.
En línea
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #8 : 27 de Enero de 2012, 10:19:19 pm »

La función es direccionvram_ROM que se copia en RAM para cambiar las direcciones de los puertos según convenga
En línea
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #9 : 27 de Enero de 2012, 10:54:29 pm »

¿Va bien en todos los emuladores? ¿En qué máquinas reales falla? ¿MSX1 ó MSX2? ¿50 ó 60?
En línea
Dioniso
Visitante
« Respuesta #10 : 27 de Enero de 2012, 11:44:17 pm »

¿No será que cuando se dan ciertas coincidencias en el juego mandas más datos de los que deberías a la VRAM? ... Uff, pueden ser tantas cosas ...
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #11 : 28 de Enero de 2012, 01:13:49 am »

Si sucede "de vez en cuando", lo más probable es que en algún punto del programa, mientras estás escribiendo a VRAM, se dé una interrupción que afecte a los punteros del VDP. Así, al seguir escribiendo tras ejecutar la interrupción, se haría en puntos incorrectos de la VRAM.

La otra opción - habría que ver capturas del problema - es que escribas a VRAM fuera del v-blank y sin los suficientes retardos.

Pero claro, todo esto te lo digo sin revisar tu código, que no está el horno para bollos. Recuerda que por más DI que pongas, muchas rutinas de la BIOS reactivan las interrupciones (hacen un EI que deja tus DI sin efecto).

Ánimo para depurar. A mi me pasó algo semejante, pero era porque dejaba el bit de la VDP que indicaba que sólo se disponía de 4 KB de VRAM. Todo lo que estaba por encima, dejaba de refrescarse (es RAM dinámica) y al poco se corrompían los gráficos. Por lo que cuentas, no es éste el caso.
En línea
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #12 : 28 de Enero de 2012, 07:19:27 am »

Últimamente solo lo he probado con el BlueMSX. Hubo una temporada que tuve linux y lo estuve probando con openMSX.

Con BlueMSX no recuerdo haber visto nada raro, aunque me consta que emulando un TurboR sí ha dado algún que otro fallo. En OpenMSX no lo he probado como para ver fallos.

En máquinas reales lo he probado en un Toshiba HX-10, un NMS8245 y un Wavy 70FD, en todos alguna vez , me ha hecho algo raro.

Tengo una rutina que dependiendo de si estamos en 50 ó 60 hz inicializa una variable, para ejecutar la interrupción siempre 50 veces por segundo: cada 5 interrupciones, me salto una, así siempre va el juego a la misma velocidad, y no se nota nada raro ni en el movimiento ni en la música. Lo leí aquí o en el MRC y la verdad es que va muy bien.



¿?
En línea
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #13 : 28 de Enero de 2012, 09:55:03 am »

Si te hace el raro en un MSX2 yo ya descartaría que se problema de velocidad, porque ni queriendo con un Z80 podrías enviar datos más rápido de los que puede procesar.

¿Y si fuera otra interrupción que no sea la del VDP la que te estuviera fastidiando? ¿Cómo cargas las roms en las máquinas? ¿Con un cartucho flash o con algo que puede generar interrupciones?
En línea
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #14 : 28 de Enero de 2012, 10:13:32 am »

Ahora que estoy en formato megarom, solo puedo probarlo con la MegaFlashROM SCC. Cuando iba por 32 KB podía probarlo con EXECROM


En línea
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!