HispaMSX

RE: Programando VDP a pelo (v9918,v9928)

2002-09-19 16:53:18
--- En hispamsx@y..., "Eduardo Robsy Petrus" <robsypetrus@h...> 
escribió:
Hola.


Hola. Vaya por delante que me gustaría ver mas preguntas como esta.( 
A ver si puedo ayudar un poco)


En el frustrante mundo de la programación sin llamadas a la BIOS he 
tenido 
algún que otro problema mientras lidiaba con el VDP. 

Nunca utilizo la BIOS para manejar graficos porque es mas lenta, 
solamente para iniciar un modo de pantalla y poco mas.
 
NOTA: todo el código siguiente se supone que se está ejecutando con 
las 
interrupciones deshabilitadas (DI) (*)

 
1.-Estoy tratando de variar un registro del VDP y no lo consigo. 
Supongamos 
que quiero escribir el valor $E2 en el registro 1. En teoría 
debería hacer 
algo así como lo siguiente:

   LD A,$E2
   OUT $99,A
   LD A,$81
   OUT $99,A

   Pues el caso es que no funciona. ¿Alguna pista?

Si, que debe funcionar perfectamente. aqui dos ejemplos que he 
probado:

                ; DIR DE TABLA DE FORMAS EN SC3 $0000<->$1800

                LD      A,[VDPREG4]       ; $F3E3
                XOR     00000011B
                OUT     [$99],A        
                LD      [VDPREG4],A
                LD      A,4             
                OR      10000000B       
                OUT     [$99],A    
                

                ; SPRITES TIPO 1 16X16

                LD      A,[VDPREG1]       ; $F3E0  MAG=0 16x16
                RES     0,A
                SET     1,A
                OUT     [$99],A        
                LD      A,1             
                OR      10000000B       
                OUT     [$99],A    

 
2.-Sé que hay una forma de hacerlo pero no recuerdo cómo era: ¿cómo 
puedo 
utilizar el modo gráfico (SCREEN 2 para entendernos) con sólo un 
único banco 
de caracteres y colores? Es decir, en lugar de los 3x256=768 
bloques 
diferentes, poder emplear únicamente 256. Lo he visto hacer, pero 
¿cómo?

Eso se parece mucho a Screen 1. Si no vas a utilizar funciones como 
line o circle, yo usaría Scr1.

 
3.-¿Cuántos ciclos de reloj habría que esperar (siendo prudentes) 
desde que 
se establece una dirección de la VRAM hasta que se puede acceder a 
ella con 
seguridad? Lo estaba haciendo así, pero a veces (muy de vez en 
cuando) 
falla:

   LD A,$00   ; Los veteranos emplearíamos aquí XOR A
   OUT $99,A
   LD A,$60
   OUT $99,A  ; Así quedaría apuntando a la dirección $2000 de la 
VRAM
   NOP
   NOP ;  Así hacemos tiempo (4+4 ciclos), es suficiente?
   LD HL,origen
   LD B,128
@@BUCLE:     ; Por ejemplo, rutina que copia 128 bytes de RAM a VRAM
   LD A,[HL]
   INC HL
   OUT $98,A
   DJNZ @@BUCLE

(*) Puede deberse a que trabajas en modo DI.(como diria Konamiman, es 
como aguantar la respiración). Pero mejor que lo explique el.

Bueno, ademas te paso dos funciones utiles por si no las tienes:

; inicia vram para escritura
; HL indica la dir de inicio de escritura.
; despues escribes un dato con out 
; y la dir vram de escritura se incrementa en 1.

INIVPOKE:
                PUSH    AF
                LD      A,L
                OUT     [099H],A                
                LD      A,H
                OR      01000000B               
                OUT     [099H],A                
                POP     AF               
                RET

;inicia la vram para lectura
;funciona como la anterior pero con in

INIVPEEK:

                LD      A,L                 
                OUT     [$99],A
                LD      A,H
                OUT     [$99],A
                RET



Saludos
 



<Anterior en la conversación] Conversación actual [Siguiente en la conversación>