assembler
|
|
« : 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.
|