--- 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