Logicielsmoto.com

Nous sommes le 19 Mar 2024, 06:42

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 20 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
 Sujet du message: Mode BM 16 + Double Buffer
MessagePosté: 13 Juil 2021, 14:59 
Hors ligne

Inscription: 12 Fév 2021, 15:54
Messages: 78
Localisation: Rennes
Bonjour à tous,

j'ai l'intention (voire la trop forte prétention) de tenter un down-portage d'un jeu "mythique" sur TO8, ou au moins un démonstrateur ...
J'ai cherché un peu (peut-être trop peu) des éléments sur le mode BM 16 et la capacité de faire du double buffering.
J'ai parcouru (peut-être un peu trop vite) la documentation technique TO8.

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 ?
2- comment réaliser du double buffering ? (changement d'adresse)
3- Pour la synchro verticale : Existe-t-il une interruption VBL, ou faut-il le faire avec un Timer ?

Merci d'avance pour les pistes que vous m'apporterez.

_________________
Fan de Atari 2600, Thomson MO5, Thomson TO8, Atari STE.
Retro-Codeur à mes heures perdues. https://www.fxjavadevblog.fr


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 13 Juil 2021, 20:21 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1800
Localisation: Brest
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.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 13 Juil 2021, 22:09 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 432
Localisation: Var
Je te donne un peu de manière "brute" les infos pour mettre en oeuvre ce que sam vient de te détailler.

Code:
* Page Affichee par l'automate Video
* ----------------------------------
*   $E7DD determine la page affichee a l'ecran
*   bit7=0 bit6=0 bit5=0 bit4=0 (#$0_) : page 0
*   bit7=0 bit6=1 bit5=0 bit4=0 (#$4_) : page 1
*   bit7=1 bit6=0 bit5=0 bit4=0 (#$8_) : page 2
*   bit7=1 bit6=1 bit5=0 bit4=0 (#$C_) : page 3
*   bit3 bit2 bit1 bit0  (#$_0 a #$_F) : couleur du cadre
*   Remarque : bit5 et bit4 utilisable uniquement en mode MO
*
* Page en espace cartouche
* ------------------------
*   $E7E6 determine la page visible dans l'espace cartouche (0000 a 3FFF)
*   bit7 toujours a 0
*   bit6=1 : ecriture autorisee
*   bit5=1 : espace cartouche recouvert par de la RAM
*   bit4=0 : CAS1N valide : banques 0-15 / 1 = CAS2N valide : banques 16-31
*   bit5=1 bit4=0 bit3=0 bit2=0 bit1=0 bit0=0 (#$60) : page 0
*   ...
*   bit5=1 bit4=0 bit3=1 bit2=1 bit1=1 bit0=1 (#$6F) : page 15
*   bit5=1 bit4=1 bit3=0 bit2=0 bit1=0 bit0=0 (#$70) : page 16
*   ...
*   bit5=1 bit4=1 bit3=1 bit2=1 bit1=1 bit0=1 (#$7F) : page 31
*
* Demi-Page 0 en espace ecran (4000 a 5FFF)
* -----------------------------------------
*   $E7C3 determine la demi-page de la page 0 visible dans l'espace ecran
*   bit0=0 : 8Ko RAMA
*   bit0=1 : 8ko RAMB
*
* Page en espace donnees (A000-DFFF)
* ----------------------
* lda   #$04
* sta   $E7E5                    * selection de la page 04 en RAM Donnees


Les pages affichables par l'automate :
- La demi page 0 (haute ou basse) est montée en permanence en espace écran (4000 a 5FFF), on ne peut pas y monter une autre page, on choisi juste quelle moitié est utilisable. ça n'a pas de rapport avec la page visible qui elle est déterminée par le paramétrage de l'automate vidéo.
- La page 1 est montée en permanence en (6000-9FFF), la zone 6000-60FF est réservée donc on ne peut pas l'utiliser pour des données.

On peut donc monter les pages 0,1,2 et 3 dans l'espace cartouche (0000 a 3FFF) ou données (A000-DFFF) pour lire/écrire les données des pages affichées par l'automate.
Attention à l'inversion dont sam a parlé :
espace cartouche : 0000-1FFF = RAMA (0000-1FFF), 2000-3FFF = RAMB (2000-3FFF)
espace données : A000-BFFF = RAMB (2000-3FFF), C000-DFFF = RAMA (0000-1FFF)
La page 1 n'est pas vraiment utilisable pour la vidéo, on l'utilise plutôt pour le code principal du programme car cet espace est visible en permanence.
Le fait qu'une moitié de la page 0 soit aussi visible en permanence est également utile pour stocké un bout de programme, ou des données temporaires.
Comme dit sam on utilise donc les pages 2 et 3 pour la vidéo dans un usage "classique".


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 15 Juil 2021, 10:14 
Hors ligne

Inscription: 12 Fév 2021, 15:54
Messages: 78
Localisation: Rennes
Bonjour à vous deux,

merci énormément pour vos réponses.

Moi qui croyait que le "4 bit planes" de l'Atari ST était "chiant" ... :tourne:

@Bentoc : je vais me plonger dans tes "outils" TO8 aussi. Quand je vois ce que tu arrives à faire, c'est hallucinant !

Bon allez, je me lance, mais j'aurais bien aimé "refaire" un clone de Rick Dangerous, mais je ne sais pas si c'est à ma portée. On verra.

_________________
Fan de Atari 2600, Thomson MO5, Thomson TO8, Atari STE.
Retro-Codeur à mes heures perdues. https://www.fxjavadevblog.fr


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 15 Juil 2021, 10:58 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1800
Localisation: Brest
J'adore rick dangerous. A Priori les sprites sont petits et pas nobmbreux et il existe sur CPC, C64 et ZX Spectrum, preuve que c'est à la portée des 8 bits. Et en plus c'est super joli graphiquement (sur CPC et C64, mais le Spectrum de démérite pas)!!!
phpBB [video]

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 15 Juil 2021, 13:13 
Hors ligne

Inscription: 12 Fév 2021, 15:54
Messages: 78
Localisation: Rennes
Oui cela reste assez statique. Peu de sprites.
Y'a un scrolling un gérer quand même, et pas juste un scrolling pour faire joli, il faut que le joueur puisse jouer pendant.
Je comptais partir des assets disponibles ici : https://rickdangerous.co.uk/graphics.htm (320x200 -> il faudra adapter)
Je vais chercher ceux de CPC pour voir si c'est une bonne base.

_________________
Fan de Atari 2600, Thomson MO5, Thomson TO8, Atari STE.
Retro-Codeur à mes heures perdues. https://www.fxjavadevblog.fr


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 15 Juil 2021, 20:59 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 477
salut, cool

J'avais déjà commencé à passer les sprites de RD vers TO en bm16,
et je voulais aussi faire ce jeux sur to9 àààààààà l'époque je l'avait commencé en basic :D

Fichier(s) joint(s):
rick1tiles-widex2pixel-16couleurs.gif
rick1tiles-widex2pixel-16couleurs.gif [ 11.61 Kio | Vu 9251 fois ]


Fichier(s) joint(s):
construction-01.png
construction-01.png [ 19.73 Kio | Vu 9251 fois ]


Fichier(s) joint(s):
screen-rd-dcmoto.png
screen-rd-dcmoto.png [ 102.78 Kio | Vu 9251 fois ]

_________________
Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 15 Juil 2021, 21:05 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 477
Fichier(s) joint(s):
screen2.gif
screen2.gif [ 6.84 Kio | Vu 9251 fois ]


en basic ça donnait ça, en bitmap 4 couleurs...
Fichier(s) joint(s):
07_rickd.jpg
07_rickd.jpg [ 54.94 Kio | Vu 9251 fois ]

Fichier(s) joint(s):
06_rickd.jpg
06_rickd.jpg [ 94.66 Kio | Vu 9251 fois ]

_________________
Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 15 Juil 2021, 21:17 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 477
mais tu peux te passer du scrolling, et faire écran par écran lorsque le perso arrive aux bords d'écran, ça sera bien aussi (si le scrolling complique !)

_________________
Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 15 Juil 2021, 21:21 
Hors ligne

Inscription: 12 Fév 2021, 15:54
Messages: 78
Localisation: Rennes
Ouah trop bien !!!! TOP les graphismes en BM16 !

_________________
Fan de Atari 2600, Thomson MO5, Thomson TO8, Atari STE.
Retro-Codeur à mes heures perdues. https://www.fxjavadevblog.fr


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 15 Juil 2021, 21:24 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 477
Tiens juste pour te motiver ;)

fait un : (j' avais repris ce code je sais plus où et j'ai modifié un peu )

Code:
RUN"LOAD


- Tu tape le nom du fichier sans l'extension et "entrée"
- Touche 0 et 1 pour activer/déactivé le mode BM16
- R pour reloader une image

SCREEN1 et SCREEN2 c'est du RD... les autres c'été pour essayer

Fichier(s) joint(s):
rd.fd.zip [36.74 Kio]
Téléchargé 281 fois

_________________
Image


Dernière édition par adnz le 15 Juil 2021, 21:36, édité 5 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 15 Juil 2021, 21:26 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 432
Localisation: Var
J'aime bien le rendu en BM16 ! Sinon très bonne idée de jeu.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 16 Juil 2021, 09:03 
Hors ligne

Inscription: 12 Fév 2021, 15:54
Messages: 78
Localisation: Rennes
Samuel, Bentoc,

si je résume les informations que vous m'avez données (j'aime bien résumer, ça me permet de voir si j'ai bien compris), vous me conseillez ceci pour le double-buffering :

- de monter soit la page 2, soit la page 3 en espace RAM $A000 avec :

Code:
LDA #$xx       *xx == numéro de page
STA $E7E5 


- de dire à l'automate d'afficher la page 2 ou 3

Code:
LDA #$80      * $80 : page 2, cadre noir / $C0 : page 3, cadre noir
STA $E7DD


et de vérifier un bit de $E7E7 pour la fin de trame. (je vais chercher lequel :-) )

Ensuite en $A000,
dans la première partie (8 Ko) : on a les colonnes (2,3),(6,7),(10,11) etc.
et dans la seconde partie (8 Ko) : on a les colonnes (0,1),(4,5),(8,9) etc.

Ensuite pour chaque paire de colonne, on a $<c1><c2> : où c1 est la référence couleur pour la première colonne, et c2 la référence vers la seconde couleur.

par exemple si on pose $12, en $A000, avec la palette standard, cela fera un pixel rouge ($1) suivi d'un pixel vert ($2) respectivement pour le pixel 2 et le pixel 3.
Correct ?

L'offset entre RAM A et RAM B : c'est 8 Ko ou c'est 8000 octets ?

_________________
Fan de Atari 2600, Thomson MO5, Thomson TO8, Atari STE.
Retro-Codeur à mes heures perdues. https://www.fxjavadevblog.fr


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 16 Juil 2021, 10:54 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 432
Localisation: Var
Tu peux utiliser soit la zone données ($A000) soit la zone cartouche ($0000) pour monter les pages 2 ou 3, c'est au choix ...

Pour la VBL :
https://forum.system-cfg.com/viewtopic.php?t=9367

La RAMA et la RAM B font 8ko chacun, avec seulement 8000 octets utilisés et 192 de libres en fin.
Il y a donc deux espaces en $BF40-$BFFF et $DF40-DFFF qui peuvent être utilisés sans que ça se voit à l'écran (rien ne se perd !!!)

Mes outils utilisent la zone données pour le double buffering, ça me permet d'exécuter les sprites compilés de la manière suivante:
- Le sprite compilé est exécuté depuis la ROM (T.2) ou RAM en $0000-$3FFF
- Il effectue la sauvegarde des pixels de fond en $4000-$5FFF (demi page 0, qui est permutée en même temps que les pages 2 et 3)
- Il écrit le sprite en RAM vidéo en $A000-$DFFF (page 2 ou 3)
- En $6100-$9FFF on retrouve le programme principal qui fait appel a toutes les routines situées en ROM ou RAM via permutation des pages, détient les données globales et le code des IRQ

Une précision par rapport au manuel technique de T08 qui n'est pas toujours très clair (selon moi) :
Page 229 il est indiqué "Registres moniteur (page 0)" pour détailler les adresses $6000-$60FF alors qu'en page 120 il est expliqué que la page montée en permanence en RAM système ($6000-$9FFF) est la page 1 et que la 0 est résidente en $4000-$5FFF ... bon je pense que c'est une erreur et le chapitre devrait s'appeler : "Registres moniteur (page 1)", a moins qu'un truc m'échappe ...

Au passage j'ai vu sur le site de la BNF qu'il y avait deux versions du manuel technique une de 1987 (que je possède) et une de 1988 (2e éd. rev. et augm.)
Quelqu'un possède cette seconde édition ? https://catalogue.bnf.fr/ark:/12148/cb35048003v
J'ai demandé un devis de numérisation à la BNF pour cet ouvrage ... si le prix n'est pas trop délirant je me laisserai tenter.

Edit 19/07: Je viens de voir que cette seconde version à été ajoutée sur le site de DCMOTO le 14 juin dernier ... donc pas besoin de commander le scan à la BNF c'est cool.


Dernière édition par Bentoc le 19 Juil 2021, 10:04, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Mode BM 16 + Double Buffer
MessagePosté: 16 Juil 2021, 12:20 
Hors ligne

Inscription: 12 Fév 2021, 15:54
Messages: 78
Localisation: Rennes
Bentoc a écrit:
Tu peux utiliser soit la zone données ($A000) soit la zone cartouche ($0000) pour monter les pages 2 ou 3, c'est au choix ...

Tu me conseilles quelle technique du coup ? plutôt la zone cartouche ?

_________________
Fan de Atari 2600, Thomson MO5, Thomson TO8, Atari STE.
Retro-Codeur à mes heures perdues. https://www.fxjavadevblog.fr


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 20 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 6 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com