fxrobin a écrit:
Bonjour à tous,
Donc j'ai 3 questions :
1- comment sont représentés les pixels en RAM vidéo en BM 16 (Mémoire Forme ?) sous forme "chunky" avec référence à la palette ?
Oui c'est du chunky. Les 4 bits de poids fort sont les colonnes paires (0,2,4,6,...), et ceux de poids faible les colonnes impaires (1,3,5,7,...). Avec un subtilité: la zone $4000->$5F40 ne fait que 8ko alors qu'il faut 16ko pour la ram vidéo. L'astuce est qu'un bit en $E7C3 (le bit 0) présente la 1ère ou 2e moitié de ces 16ko dans cette zone "processeur". Ainsi la vidéo standard est divisée en 2 pages logiques de 8ko. La 1ere s'occupe des colonnes (0,1), (4,5), (8,9), .. (ca marche par groupe de deux) et la seconde page contient les colonnes (2,3), (6,7), (10,11), etc.. Ca rend les algorithmes d'affichage assez complexe car il faut distinguer +/- 4 cas (colonnes paires ou impaires, et page 0 ou page 1 en $E7C3).
Mais on peut faire mieux en mappant la ram vidéo ailleurs qu'en $40000, mais dans une zone de 16ko contigüe, par exemple entre $0000->$3FFF (zone cartouche) ou $A000->$DFFF (ram utilisateur). On a alors ainsi accès à ces deux pages directement sans tripatouiller $E7C3. La 1ere moitié de la zone s'occupe des colonnes (0,1) (ou (2,3) ca dépend si on map en $0000 ou $A000: il y a une inversion bien chia** pénible)), et l'autre moitié des colonnes complémentaires (2,3) (ou (0,1)...).
C'est un peu tordu, mais Bentoc a réussi à faire une routine super rapide pour ce découpage.
Citation:
2- comment réaliser du double buffering ? (changement d'adresse)
Le double buffering c'est pas vraiment un changement d'adresse, enfin pas du point de vu du CPU qui continue d'utiliser les même adresses de son espace
logique à lui.
Ce qu'il se passe c'est qu'on indique à l'automate d'affichage la page mémoire
physique à afficher. Cette zone de ram affichée n'a pas besoin d'être accessible par le CPU. On peut alors mapper une autre bank ram/video dans l'espace adressable du 6809 (exemple en $A000).. on travaille dessus, l'automate continue d'afficher la page physique qu'on lui a donné et qui était mappée à cette adresse, mais n'est pas perturbé par ce qu'on y fait puisque c'est une autre page physique. Quand on a fini de travailler sur cette page, on change le registre de l'automate d'affichage pour lui indiquer que la prochaine frame se fera sur l'adresse physique qu'on avait mappé en $A000. On peut alors mapper en $A000 une autre bank ram physique sur laquelle on travaillera avant de switcher à nouveau, etc. (je ne sais pas si c'est très clair, mais c'est assez naturel de toute façon.)
A savoir aussi que les banque physique 0 et 1 sont utilisée par le système, aussi en pratique seules les banques physiques 2 et 3 sont utilisables pour le double buffering (ou alors il faut tuer le système). Ca marche très bien et sachant que l'automate ne bascule qu'à la fin de frame, même si on a changé le registre au milieu, la synchro est toujours parfaite et sans artefact (mais on ne peut donc pas faire d'effets spécieux liés au changement de ram vidéo en milieu de trame.)
Citation:
- Pour la synchro verticale : Existe-t-il une interruption VBL, ou faut-il le faire avec un Timer ?
A la base on a pas besoin de se synchroniser verticalement car comme dit plus haut l'automate ne réalise la bascule qu'à la frame suivante. Par contre si le programme marche trop vite (il travaille en moins d'une 1/2 trame), alors ca déconnera. Il faut dans ce cas tester un bit en $E7E7 qui indique la fin de trame avant de poursuivre le travail.
Il n'y a pas d'interruption généré quand ce bit change d'état, il faut faire du polling comme dans la routine moniteur de changement de palette (autrement on voit des artefact à l'écran si la palette change en milieu de trame.) Bien entendu une fois synchronisé on peut utiliser une synchro timer (programmé à la bonne vitesse) pour simuler une interruption VBL physique.
Après si on est super bon (genre Préhisto), on peut ne pas utiliser de polling ou d'interruption en comptant précisément tous les cycles dans les chemins d'execution de son programme.