Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: jrcp_kun en 01 de Febrero de 2015, 10:03:39 pm



Título: En screen 5
Publicado por: jrcp_kun en 01 de Febrero de 2015, 10:03:39 pm
estoy probando screen 5 y hago lo siguiente. Genero una imagen sc5 y con bytes gen genero el codigo.

hago esta rutina
ld a,5
call chgmod

ld hl,data
ld de,0 :empieza de 0 hasta 5fff o 65ff dependiendo 192 o 212
ld bc,5fff
call LDIRVM

data:...........


bueno el problema es que solo me coge 16160 bytes del archivo data y los demas pasando. en basic es mas facil porque haces bload"...",s y fuego. pero aqui se traba y no se como hacer para que los lea o los meta en otro slot o lo que sea. Supongo que ha llenado 16kb y no sabe o algo donde escribirlos. Entonces solo me saca en pantalla los 16k leidos

una ayudita. Gracias



Título: Re:En screen 5
Publicado por: e_sedes en 02 de Febrero de 2015, 10:13:10 pm
¿Estas haciendo un .ROM? Se me ocurre que te sale una rom de 32k y no estas situando los segundos 16k. Si es así, tienes que empezar el programa en la página 1 y configurar la página 2 para que apunte a tu programa. En AsMSX usa la directiva .SEARCH. Échale un ojo al manual o busca por este foro, ya se trató ese tema, si mal no recuerdo.

Un saludo.


Título: Re:En screen 5
Publicado por: jrcp_kun en 03 de Febrero de 2015, 05:44:07 pm
si lo mirare porque creo que es eso


Título: Re:En screen 5
Publicado por: jrcp_kun en 06 de Febrero de 2015, 01:45:55 pm
ahora si alguien me puede explicar como va en asm lo de las paginas de vram ??  set page en basic
como puedo cargar un grafico o lo que sea en una pagina y copiarlo a la visible o alternar pero en asm no en basic.

gracias


Título: Re:En screen 5
Publicado por: j4mk3 en 08 de Febrero de 2015, 01:59:49 am
Esto sería un SET PAGE para ponerla visible:
Código:
; A = Pagina Visible (0-3)

SETPAGEVIEW: ; Envio a REG 2 0XX1 1111
sla A
sla A
sla A
sla A
sla A
or 00011111b
out [099h],A
ld A,80h+02h ; Reg 2 Bitmap Table
out [099h],A

ret

Y para escribir en VRAM tienes que direccionar a que posición vas a escribir. La Página de VRAM va implicita dentro de la dirección completa en sus 17 bits de dirección.
Seteas enviando por el 99h la dirección de VRAM. En esa dirección va implicito la página donde escribes.
Puedes entrarlo como yo en un registro de la rutina de poner datos en VRAM como se ve en el codigo siguiente y luego ya a enviar por el 98h los datos gráficos.
Como ya sabes, internamente el chip de video va guardando lo que le envies por el 98, de manera contigua, byte tras byte.
Código:
; DE = direccion VRAM
; B = Pagina on va Grafic

ld A,D
and 01000000b ; Bits A15-A13 de direccio VRAM (A15 es page)
srl A
srl A
srl A
srl A
srl A
srl A
sla B ; A16-A15 Ve per B
or B
out [99h],A
ld A,14 ; a Registre 14 (A16,A15,A14)
or 80h
out [99h],A
ld A,E ; Bits A7-A0 de direccio VRAM
out [99h],A
ld A,D ; Bits A13-A8 de direccio VRAM
and 00111111b
or 40h
out [99h],A


Título: Re:En screen 5
Publicado por: jrcp_kun en 08 de Febrero de 2015, 03:17:16 pm
si pero para escribir en cada pagina como lo hago??

0-69ff es la pantalla de 256x212  o 0-5fff es la pantalla de 256x192. como le digo que escriba en la pagina por ejemplo 1.

osea si quiero cargar algo en esa pagina 1 y luego traerla a visible.

la hago visible con el reg2sav,  si fuera set page 0,1 y la quiero visible seria como set page 1.  reg2sav= 0 01 1 1111  correcto??
pero como dibujo en en la pagina 1??

si hago
ld hl,grafico
ld de, 0  (desde el principio del screen)
ld bc,5fffh
call LDIRVM

como hago para que eso lo tenga en la pagina 1??
y que no se vea

solucionado !!!!!





Título: Re:En screen 5
Publicado por: jrcp_kun en 08 de Febrero de 2015, 04:57:42 pm
ahora siguiente paso es como hacer un copy. he mirado el HMMM del libro pero no acabo de hacerlo rular.
asimismo la rutina GRPRT 0089h  que es solo para msx2  no consigo hacerla funcionar




Título: Re:En screen 5
Publicado por: jrcp_kun en 08 de Febrero de 2015, 10:22:19 pm
j4mk3 :

entonces si quiero copiar en la pagina uno lo que tengo en la pagina 0 por poner un ejemplo

ld de,8000h  direccion vram
ld b,1  pagina 1
....
....

y hago un bucle para la longitud que quiera transferir??
osea volcaria 69ffh.

seria asi??



Título: Re:En screen 5 (Comandos VRAM)
Publicado por: j4mk3 en 11 de Febrero de 2015, 11:27:51 am
Es preferible usar los comandos de VRAM

Mi forma de hacerlo es con una rutina que lee un buffer de datos que tengo en RAM que seteo con los datos que necesita y luego lanzo la rutina que carga esos datos a la VRAM y ejecuto el comando.

Te pongo la rutina y un ejemplo.
Esta es la rutina para hacer comandos a la VRAM:
Código:
; //////////////////////////////////////
; ///////// _VDPCMD  ///////////////////
; //////////////////////////////////////

; Ejecuta un comando al VDP con datos ordenados en puntero HL

; HL = Puntero de datos de comando
; (  SXL,  SXH,  SYL,  SYH,  DXL, DXH, DYL,DYH,
; INCXL,INCXH,INCYL,INCYH, COLO, ARG, CMD)

; Toca : BC,HL

_VDPCMD:
; Bucle de espera a bit CE
call WAIT_CE

ld A,20h   ; Comando comença al Reg 20h
out [099h],A
ld A,80h+11h ; Reg 11h Ini. per enviar bytes seguits a Reg Seguits
out [099h],A

ld B,15
ld C,09Bh   ; Port VDP per indirecte

@@LOOP:
outi
ld A,B
cp 0
jp nz,@@LOOP

; Bucle de espera a bit CE
call WAIT_CE

ret

; //////////////////////////////////////
; ///////// WAIT_CE  ///////////////////
; //////////////////////////////////////

; Espera a que el bit 0 del R2 de Status estigui a 0 per començar o acabar _VDPCOM

WAIT_CE:
ld A,02h
out [099h],A
ld A,80h+0Fh  ; Llegim el Reg 02h posant 2 a Reg 0Fh
out [099h],A
in A,[099h]
and 1
jp nz,WAIT_CE
; Abans de marxar recoloquem el REG STATUS 0 a Reg 0Fh
ld A,00h
out [099h],A
ld A,80h+0Fh 
out [099h],A

ret


Y en RAM tengo este array de datos declarado. Verás que está comentado lo que significa cada byte:
Código:
VDPCOMDATA: .ds 15 ; 0: Source XL
; 1: Source XH [Normal a cero si SCR 5]
; 2: Source YL
; 3: Source YH [Page 0-3]
; 4: Destiny XL
; 5: Destiny XH [Normal a cero si SCR 5]
; 6: Destiny YL
; 7: Destiny YH [Page 0-3]
; 8: Width XL
; 9: Width XH [Normal a cero si SCR5]
;10: Height YL
;11: Height YH [Normal a cero si SCR5]
;12: Color Register
;13: Arguments [Habitual 000000-EQ-MAJ = 00h para VRAM<->VRAM]
;14: Comando a ejecutar
; HighSpeed CMD: (Que conozco)
; 000h: Stop
; 0D0h: Copy Rectangle VRAM->VRAM

Y esto es lo que haría en el código del juego si quiero copiar cachos de pantalla.
   ld   IX,VDPCOMDATA
   ld   [IX+0],
   ;....( setear todos los valores que corresponden [desde IX+0 a IX+14] con lo que quiero hacer, coordenadas y tamaños)...
   ld   [IX+14],0D0h   ;CMD 0D0h HMMM Copy Rectangle
   ; Lanzar el comando
   ld   HL,VDPCOMDATA   ; Envio CMD a la VRAM
   ; Aqui realiza los push que necesites guardar (ojo que el siguiente CALL toca registros)
   call   _VDPCMD
   ; Recupera datos anteriores con POP si hiciera falta.
   
Mirate : http://problemkaputt.de/portar.htm#vdpregisters20h2ehmsx2videocommandregisters
Para entender un poco que hace cada dato que se envia a los registros.
Te recomiendo tambien la lectura del PDF  yamaha_v9938_MSX2.pdf en la página 54 hacia delante. Especialmente la página 62 que es el comando que te interesa de copiar de VRAM a VRAM
http://www.textfiles.com/bitsavers/pdf/yamaha/Yamaha_V9938_MSX-Video_Technical_Data_Book_Aug85.pdf
   
   


Título: Re:En screen 5
Publicado por: jrcp_kun en 11 de Febrero de 2015, 07:20:10 pm
he hecho esto y no me copia nada a la pagina 3. me la deja en blanco


Código:
ld hl,data ;cargo en pagina 0
ld de,0
ld bc,69ffh
call LDIRVM


Código:
ld ix,VDPCOMDATA
ld [ix+0],0
ld [ix+1],0
ld [ix+2],0
ld [ix+3],0
ld [ix+4],0
ld [ix+5],0
ld [ix+6],0
ld [ix+7],3
ld [ix+8],100
ld [ix+9],0
ld [ix+10],100
ld [ix+11],0
ld [ix+12],0
ld [ix+13],0
ld [ix+14],0D0h
ld hl,VDPCOMDATA
call _VDPCMD


Título: Re:En screen 5
Publicado por: j4mk3 en 14 de Febrero de 2015, 06:01:03 pm
Puuuues no sabría que decirte. ???
Parecen correctos  :( los parámetros para copiar 100x100 pixels de página 0 a página 3.

hmm nunca he usado el LDIRVM. De hecho nunca uso nada de la BIOS, siempre la quito. Ya, lo se, mala práctica en el sentido más estricto de compatibilidad MSX  :P
Supongo que LDIRVM puede hacer eso de copiar en la página 0. Por lo que veo no se si puede ir más allá de ella por el direccionamiento.

Si quieres pasame el ASM, te ayudo. Lo compilo y miro a ver que podría ser.
Tienes mi mail aquí en el foro.
Ah! si hay algún archivo extra...grafico o algo, pasalo tambien. Que pueda compilarlo todo :)

A ver si puedo ver que sucede  ;)


Título: Re:En screen 5
Publicado por: jrcp_kun en 15 de Febrero de 2015, 11:26:07 am
la idea es cargo el grafico en la pagina 0. y luego hago un copy a la pagina 3.

ldrivm es la rutina de la bios que copia a la vram un bloque de datos