Page 1 sur 4

Double buffering sur MO6

Publié : 20 août 2014 20:35
par Orion_
J'ai cru comprendre que le MO6 introduisait une méthode permettant le double buffering.
A priori on peu sélectionner dans quel bank de ram l'écran sera affiché
malheureusement, mes test n'ont rien donné de concluant, alors:
est-ce que cette méthode est disponible dans tout les mode vidéo ou seulement un spécifique ?
comment la mettre en œuvre ?
Dans le cas ou on switch l'écran vers la bank 1 ou 2 par exemple, est-ce qu'on accède toujours à la bank 0 par l'adresse $0000 ?

Re: Double buffering sur MO6

Publié : 20 août 2014 23:33
par __sam__
Si c'est comme sur TO8, alors tu peux demander à l'automate d'affichage d'utiliser n'importe quelle banque physique de 0 à 3 pour l'affichage et cela indépendamment du mode vidéo. L'automate va juste chercher ses données à une autre adresse physique, c'est tout. Le mode graphique n'influence pas le résultat.

En outre tu peux peut-être aussi programmer le gate-array mode page pour qu'il place l'une de ces banques physiques dans la zone commutable (probablement entre $6000 et $9FFF?). Par contre tout comme sur TO8 en $4000 (=zone video) on trouve toujours la même banque physique, je pense que sur MO6 en $0000 on trouve toujours aussi la banque physique 0 utilisée pour l'affichage par défaut. Si tu demandes à l'automate d'affichage d'utiliser la banque 1, alors la banque 0 est disponible pour faire ce que tu veux et tu peux utiliser $0000 à $1FFF pour y mettre du code.

Attention, ceci est sous-réserve que le MO6 clone le fonctionnement du TO8, ce qui n'est pas garanti: Tu t'aventures dans des domaines du MO6 dont très peu de personnes ont connaissance et où la main de l'homme a, du coup, très peu mis les pieds :mrgreen: .

Re: Double buffering sur MO6

Publié : 21 août 2014 09:45
par Daniel
__sam__ a écrit :Tu t'aventures dans des domaines du MO6 dont très peu de personnes ont connaissance
Pour connaître une machine, il suffit de l'avoir émulée :wink:
Je confirme, le MO6 fonctionne exactement comme le TO8 pour l'affectation de la mémoire vidéo, sauf que les adresses sont décalées de $4000. Il fonctionne aussi comme le TO8 pour le recouvrement de la ROM par la RAM.

Re: Double buffering sur MO6

Publié : 21 août 2014 10:23
par Orion_
Donc d'apres le manuel technique du mo6, il faut changer le registre $A7DD
on a BE1/BE0 (bit 7 et 6) a changer pour changer le numéro de la page ram affiché

Code : Tout sélectionner

lda $A7DD
anda #$C0
ora #BankN << 6
sta $A7DD
rien d'autre ?
Faudrat que je re-essaye mais quand j'avais tester ça ne marchais pas tip top

Re: Double buffering sur MO6

Publié : 21 août 2014 10:56
par Fool-DupleX
Je confirme, le MO6 fonctionne exactement comme le TO8
Forcément, c'est le même gate-array. Hors sujet, mais info pour ceux qui aimerait exploiter la chose : Contrairement a ce que Thomson annoncait officiellement, il est possible d'utiliser l'extension 64 Ko du NR sur le MO6 et ainsi monter a 192 Ko de RAM au lieu de 128 Ko. Je l'ai testé personnellement. Un concours de circonstances electronique fait que la cartouche fonctionne alors qu'elle ne devrait pas. Ca peut être utile pour les demos. L'astuce consiste à montrer la cartouche comme une MEMO5 et a desactiver son emulation sur le MO6. Le registre A7CB n'est accessible qu'en ecriture, mais est present dans la cartouche et dans le mo6. Sa programmation influe sur la cartouche en même temps que sur la map memoire MO6, mais puisque l'emulation NR est desactivee, finalement non. Il y aurait pu y avoir un conflit en lecture de l'adresse a7cb, mais il se trouve que ce registre n'est pas accessible en lecture, donc ca marche.

Re: Double buffering sur MO6

Publié : 21 août 2014 22:25
par Orion_
Donc le fait de mettre à 0 le bit 5 de $A7DD (cartouche visible), permet d'accéder a 16k de ram en $B000 ?
ou alors une simple écriture dans le registre $A7CB permet d'y accéder ? ($C0 + bank 0-3 si j'ai bien compris)

Re: Double buffering sur MO6

Publié : 22 août 2014 11:23
par Fool-DupleX
il faut effectivement mettre $A7DD à 0 pour rendre la cartouche visible. Ensuite, le registre $A7CB, bits 0..1 permet de choisir la page de 16 Ko vue en $B000. Mais encore faut-il avoir desactive l'emulation interne de la cartouche NR en mettant le bit 6 de $A7E7 à 0 (Ce bit est marqué reservé dans la doc, mais il sert a ca :wink: ). Donc dans l'ordre :

- bit 6 à 0 dans $A7E7
- bit 5 à 0 dans $A7DD
- bit 0..1 de $A7CB permet de choisir 16 Ko parmi 64 Ko, visible en $B000 <-- Ces 64 Ko sont ceux de la cartouche

C'est probablement le cas aussi sur MO5 NR, qui fonctionne de la même maniere en theorie. Mais sur MO6, j'ai verifie, ca marche.

Malheureusement, le slgnal /Bxxx semble ne pas être present sur le bus d'extension sur ces machines, sinon on aurait pu moyennant une petite astuce supplémentaire s'offrir encore 4 Ko de plus. Mais il reste toujours le signal /Axxx qui permet de rajouter une modeste extension (non officielle cette fois) de 2 Ko, pour un ultime total de 194 Ko.

Re: Double buffering sur MO6

Publié : 22 août 2014 11:27
par Orion_
comment modifier la valeur de $A7E7 vu que d'après la doc, il ne donne pas les même informations en lecture qu'en écriture ?

EDIT: Après avoir mis un breakpoint sur l'écriture de $A7E7 sous DCMOTO en mode MO6, il met la valeur $93
donc il faudrait écrire la valeur $D3 dans ce cas. ($93 | (1<<6))

C'est curieux car, $93 d'après la doc mo6, ça donnerais:
Type de RAM %11 = 64k * 4 (??)
Type d'ordinateur= %00 = 0
Commutation banque par $A7E5
Trame: 625 lignes
Bit 6 (reservé) mais à 0
Bit 7 (non utilisé) mais à 1 quand même (??)

EDIT2: j'ai vérifier, c'est la même valeur $93 qui est écrite dans $A7E7 dans les 3 roms du MO6, la rom PC128 et la rom MO5NR (dispo sur le site de Daniel)

Re: Double buffering sur MO6

Publié : 22 août 2014 11:53
par Fool-DupleX
Oui, qu'y-a-t-il de curieux ? :wink:

Le type de ram correspond au type de puce DRAM utilisé dans la machine. Suivant le cas, ca change les timings de rascasse. En pratique j'ai toujours vu 00 avec des TMS4256.

Et puis il faut toujours se mefier des bits reserves et non utilises. C'est generalement la premiere chose que je m'amuse a tester.

Comme le registre n'est pas le même en lecture et en ecriture, le moniteur fait exactement ce que tu proposes pour changer le bit, en stockant la valeur courante supposée quelque part dans sa page 0 en ram et en la mettant a jour. c'est une technique courante quand on manque cruellement d'espace I/O (et ici ca se chiffre en bits).

Edit : au fait n'oublie pas que pour changer A7DD, il faut d'abord le rendre visible en mettant le bit 0 de A7E4 a 0.

Edit 2 : et attention a ne pas confondre d'une part les notions de page mémoire, de banque mémoire et de page ecran qui sont trois choses distinctes et d'autre part la notion de page 0 application, page 0 moniteur et page 0 ecran, qui sont aussi trois choses differentes.

Re: Double buffering sur MO6

Publié : 22 août 2014 12:51
par Orion_
pouhhlalala ! c'est pas simple :D
j'espère que les développeurs de l'époque avait des docs un peu plus fournie que ça pour le MO6 parceque c'est galère (et encore, heuresement que j'ai le debuggeur de DCmoto !)

Donc si j'ai bien tout compris ça donnerais ça:

Code : Tout sélectionner

	lda	$81	; Valeur du BIOS pour $A7E7
	ora	#$50	; Bit 6, Activation cartouche extension mémoire (non documenté), + bit 4 pour écriture $A7E5
	sta	$A7E7

	clra
	sta	$A7E4	; Permet la lecture des valeurs systeme en $A7E4

	lda	$A7E4
	anda	#%11011111	; Cartouche Visible
	sta	$A7DD		; (Attention: trash la couleur de fond)

	lda	#$C0		; Sélectionne la Bank 0 de l'extension mémoire 64k
	sta	$A7CB		; 16k disponible à partir de $B000
Bon, il me manque plus qu'a avoir un MO6 fonctionnel, et surtout à trouver une cartouche d'extension mémoire pour tester ça :)
en tout cas, si Lemmings nécessite plus de 128ko de mémoire, cette astuce sera surement utile si j'essaye de faire un portage :)


EDIT: d'ailleurs j'ai trouvé un bug dans l'assembleur c6809, si on fait lda $0000, ça assemble comme si on faisait un lda $00 avec DP :/

Re: Double buffering sur MO6

Publié : 22 août 2014 13:23
par Fool-DupleX
Pourquoi $C0 en $A7CB ? Ca ne marche pas ca. C'est $0C - $0F qu'il faut mettre suivant la page a choisir.

Par rapport a tes commentaires dans le code, le b6 n'active pas la cartouche, il desactive l'emulation de la cartouche. c'est un bit a usage interne dans la machine.

et ce n'est pas la couleur de fond qui est trashee mais la couleur de tour de l'ecran.

Re: Double buffering sur MO6

Publié : 22 août 2014 13:53
par Orion_
a oui pardon j'ai mal lu la doc :)

Re: Double buffering sur MO6

Publié : 22 août 2014 16:53
par Fool-DupleX
c'est vrai que le mo6 est un peu compliqué a prime abord. Jacques et moi-même avons passé un week-end entier à deux pour comprendre pourquoi notre os9 ne bootait pas alors que notre code d'initialisation du gate-array nous semblait correct. Apparemment, même l'ordre d'acces des registres a son importance, même s'ils ne semblent pas avoir de lien direct.

Re: Double buffering sur MO6

Publié : 22 août 2014 17:06
par Orion_
et d'ailleurs c'est toujours d'actualité OS/9 ? car la page officielle semble en pause depuis bien longtemps :(
je pense qu'avec le nouveau module SD y'aurais de quoi faire (pour éviter le ROM disk par exemple)

Re: Double buffering sur MO6

Publié : 22 août 2014 18:18
par Daniel
Orion_ a écrit :j'ai trouvé un bug dans l'assembleur c6809, si on fait lda $0000, ça assemble comme si on faisait un lda $00 avec DP :/
Beaucoup d'assembleurs cherchent à optimiser en utilisant l'adressage direct. Pour forcer l'adressage étendu il faut faire LDA >$0000.
Une autre solution est de fixer la valeur de DP dans le source par une consigne spéciale de l'assembleur, par exemple DP $20, et ainsi il utilisera l'adressage direct uniquement s'il est possible.

C'est ainsi que je procède avec l'assembleur A09 : http://www.hermannseib.com/english/opensource.htm
Je ne connais pas c6809, donc je ne suis pas sûr que la méthode s'applique aussi.