Ca va clacquer du peek et du poke je crois !!!!
Exemple de DMA
Modérateurs : SirG, Redfield1, shubibiman, Laucops
- touko
- NECromancer
- Messages : 2297
- Inscription : lun. 31 mars 2008 14:32
Allez xav sorts de ton trou et arretes de compiler, on t'a vu essayer de faire une routine dma avec changement de reso
Ca va clacquer du peek et du poke je crois !!!!
Ca va clacquer du peek et du poke je crois !!!!
Dernière modification par touko le sam. 09 août 2008 19:11, modifié 1 fois.
- xav
- NECrophage
- Messages : 1159
- Inscription : mar. 05 juil. 2005 22:12
- Localisation : Le plus grand four solaire de France, Montpellier
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,* 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.
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.
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.La meilleure solution reste de se débrouiller pour que le transfert se finisse avant le hsync
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)
"Theory, it's when we know everything and nothing works. Practice, it's when everything works and nobody knows why. Here, we have put together theory and practice : Nothing works... and nobody knows why!" (Albert Einstein)
- MooZ
- Administrateur
- Messages : 2090
- Inscription : jeu. 16 déc. 2004 14:25
- Contact :
Ouaip!
Regarde dans startup.asm. Tu as dans la bss (pour une hucard):
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:
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
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
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:Bonne chance pour la suite! Pour ma part je file 1 semaine à la cambrousse
- xav
- NECrophage
- Messages : 1159
- Inscription : mar. 05 juil. 2005 22:12
- Localisation : Le plus grand four solaire de France, Montpellier
Merci, il faut avoir des yeux dans le dos quand on s'attaque au Int
Bon voyage
Bon voyage
"Theory, it's when we know everything and nothing works. Practice, it's when everything works and nobody knows why. Here, we have put together theory and practice : Nothing works... and nobody knows why!" (Albert Einstein)

