Page 2 sur 2

Publié : ven. 08 août 2008 20:24
par touko
Allez xav sorts de ton trou et arretes de compiler, on t'a vu essayer de faire une routine dma avec changement de reso 8)


Ca va clacquer du peek et du poke je crois !!!! :D

Publié : ven. 08 août 2008 21:32
par xav
* Quand vsync claque: tu passes la resolution horizontale à  512 et tu lances le transfert DMA.
* Si la fin de transfert DMA claque et que le hsync n'a pas claqué c'est la fete.
* Si hsync claque: quoiqu'il arrive il faut retourner dans la resolution de base. L'affichage risque d'être affreux si le transfert n'est pas fini. Et faire du "double buffering" risque d'être tendu. Il faut connaitre les tiles affectées par le transfert DMA, et alterner les addresses.
Sauf que j'ai essayer un truc pour booster le VCE a 10Mhz sans trop trafiquer la reso, en modifiant juste le "pixel clock", le 1er reg du VCE a $400, si le bit 1 est mis 1 et le bit 0 à  0 le VCE passe à  10Mhz,
si D1=0 et D0=1 le VCE est à  7Mhz.

J'ai essayé de le lancé juste aprés le vsync et juste avant la dma, puis remettre a 7Mhz juste avant la fin du Vsync, ça n'a pas l'air de merdouiller l'affichage.
La meilleure solution reste de se débrouiller pour que le transfert se finisse avant le hsync
D'ou l'interet du turbo, quoi que toujours d'aprés le grand Charles, une dma qui ne serais pas finis avant la fin du vsync serais reporté (ou mis en pause?) au vsync suivant.

Non ce qui m'embete c'est qu'on ne puise pas "pooler" l'état de la dma, pouvoir connaitre l'état du transfert sans devoir passer par un int eux était interressant...

Il faut reconnaitre qu'il faudrait reprendre entiérement la gestion de l'IRQ1 sous magic kit, il y a trop de manque.
D'apres tomaheous le Magic kit (et par voie de conséquence Huc) contiens de nombreux hook qui permette d'implanter proprement ces propres routine Irq ( proprement car par defaut le joypad est lu pendant la vsync, et certainement d'autre choses, ce qui limite les modifs possible)

Publié : ven. 08 août 2008 22:29
par MooZ
Ouaip!
Regarde dans startup.asm. Tu as dans la bss (pour une hucard):

Code : Tout sélectionner

                .org    $2200
user_jmptbl:            ; user interrupt vectors
irq2_jmp:       .ds 2   ; IRQ2 (BRK instruction and external IRQ)
irq1_jmp:       .ds 2   ; IRQ1 (VDC interrupt)
timer_jmp:      .ds 2   ; TIMER
nmi_jmp:        .ds 2   ; NMI (unused)
vsync_hook:     .ds 2   ; VDC vertical sync routine
hsync_hook:     .ds 2   ; VDC horizontal sync rountine
dma_hook; .ds 2 ; Notre hook pour la fin de transfert dma vram->vram
Et ligne 121 tu as le code de l'irq1. Pour avoir une sous routine différente pour l'hsync, le vsync, etc... tu as:

Code : Tout sélectionner

_irq1:
    ; si le bit 1 d'irq_m est à  1 irq1_jmp sera éxécuté et remplacera tout le boxon qui suit. 
    bbs1    <irq_m,user_irq1
    ; ensuite c'est le truc classique. Sauvegarde des registres, du registre de statut
   ; du vdc.
    pha
    phx
    phy
    lda    video_reg
    sta    <vdc_sr
    ; Et hop! On verifie le type d'interrupt.
    ; 1. vsync (bit 5 du vdc status register)
    ; ici si le bit 5 est à  0, on passe à  la verif du hsync
    bbr5    <vdc_sr,.hsync 
        ; Je ne vais pas réécrire tout le code.
        ; Mais en gros c'est ici qu'on incrémente irq_cnt qui sert à  wait_vsync.
        ; Le registre 5 du vdc est mis à  jour
        ; Si le bit 5 d'irq_m est nul, on éxécute la sous routine _vsync_hndl.
        ; vsync_hdnl se charge du scroll, de la mise à  jour de "l'horloge"
        ; du generateur d'aleas, du driver psg (oui oui mais il ne fait quasi rien),
        ; de la gestion des joypads et si besoin de la souris.
        bbs5    <_irq_m, .l3
        jsr    _vsync_hndl
        ; Et voici ce qui nous interesse. Le code du vsync de l'utilisateur (celui
        ; qu'on a spécifié avec setvec).
.l3:   bbr4 <irq_m,.l4
        jsr    user_vsync 
.l4:
.hsync:
       ; ici c'est un peu le meme topo que pour vsync. Il y a une sous routine de mkit
       ; et une pour l'utilisateur
       ; Donc si on veut gérer l'interrupt de fin de dma, on rajoute ça:
        bbr2 <vdc_sr,.dma_end
            ; blabla gestion du hsync etc...

        ; mise en orbite de poneys!
.dma_end:
        bbr4    <vdc_sr,.exit
        jsr    user_dma
.exit:
        ; restoration des registres, etc...
        rti

: Et voici la partie où on éxécute le code de l'utilisateur. Sur pce on ne peut pas
; faire jsr [ptr]. L'astuce consiste donc à  sauter vers une sous routine qui ne
; contiendra que jmp [ptr]. Le rts de la sous routine de l'utilisateur nous fera
; retourner juste après le jsr. Par exemple pour user_irq1, le pc sera positioné
; après jsr user_irq1 (la haut). On reprendra donc l'éxécution du code de gestion
; de l'éxécution de l'irq1 comme si on avait fait un simple jsr.
; Une autre astuce serait de mettre le code gestion de l'irq1 en ram. Mais bon,
; on n'a que 8k .
user_irq1:
        jmp   [irq1_jmp]
user_hsync:
        jmp   [hsync_hook]
user_vsync:
        jmp   [vsync_hook]
; on ratjoute le hook pour le dma
user_dma:
        jmp   [dma_hook]
.exit:
Par contre je crois que pour le CDROM, tout est géré par la system card. Et apparement il n'y a pas de hook de prevu pour le dma. Mais comme pour l'hucard on peut totallement bypasser la gestion de l'irq1 par la system card.

Bonne chance pour la suite! Pour ma part je file 1 semaine à  la cambrousse :D

Publié : ven. 08 août 2008 22:46
par xav
Merci, il faut avoir des yeux dans le dos quand on s'attaque au Int :shock:

Bon voyage :wink: