Más corrupción en la VRAM

By assembler

Champion (312)

assembler's picture

27-01-2012, 18:44

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  ,hl
        ex  ,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  ,hl
        ex  ,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.

Login or register to post comments

By mohai

Champion (418)

mohai's picture

28-01-2012, 16:58

Una buena práctica, ates de escribir en VRAM es, si vienes de otra rutina o sospechas que algo ha podido escribir en el puerto 0x99, es hacer un simple in a,(0x99), para limpiar el buffer del VDP. puedes hacerlo ca vez que hagas un "vpoke" o colócalo estrat'égicamente antes de cada rutina de refresco de tu pantalla.
Posiblemente este es el problema que estas teniendo.

By Miguel_Noe

Champion (390)

Miguel_Noe's picture

29-01-2012, 00:03

Todo esto lo meteis/comprobais en un pc o en un MSX1 ó MSX2? Si es un MSX, como???Question

No tengo ni puta idea, pero cuando algo parece complicado luego se transforma en algo facil.Big smile

Un Saludo.

By assembler

Champion (312)

assembler's picture

29-01-2012, 07:18

En maquinas reales lo pruebo con el MegaFlashRom. Paso la ROM a una tarjeta SD y la grabo con el lector de SD de Padial.

By Miguel_Noe

Champion (390)

Miguel_Noe's picture

29-01-2012, 20:26

el programa lo haceis en un pc o en un MSX?
Donde puedo comprar la tarjeta MegaFlashRom?

{mod: Aquí. http://www.msxcartridgeshop.com/ }

By Warchild

Paladin (917)

Warchild's picture

29-01-2012, 20:29

@Miguel_Noe: No creo que sea muy apropiado el desviar de esta forma el tema del hilo que ha abierto assembler. Si no puedes aportar nada al tema (igual que yo, que no tengo conocimientos suficientes para ayudarle), al menos deberías respetar el hilo, que ha sido abierto para encontrar ayuda, y además con cierta urgencia. Así que pretender que te expliquen aquí cómo estos señores programan un videojuego, como lo prueban y, para rematar, donde puedo comprar esto o aquello... la verdad, me parece fuera de lugar. Y antes de que vayas a abrir un hilo para tus preguntas, piensa que lo que tú vas a preguntar, probablemente, ya lo ha preguntado alguien antes y se le ha respondido. Así que, tómate el pequeño trabajo (porque de verdad, es un muy pequeño trabajo) y busca antes de postear. Smile

Saludos (y espero que ese problema de corupción en VRAM se pueda solucionar a tiempo)

By Miguel_Noe

Champion (390)

Miguel_Noe's picture

31-01-2012, 09:24

Vale! Vale!

By assembler

Champion (312)

assembler's picture

31-01-2012, 13:51

Ayer estuve a un pelo de tirar la toalla, pero creo que he dado con la tecla y he solucionado los problemas "inexplicables" (que al final no lo han sido) que se daban en el programa.

Hay que tener cuidado con las interrupciones y lo que se hace dentro de ellas oO

My MSX profile