Double buffering sur MO6

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Avatar du membre
Orion_
Messages : 146
Enregistré le : 07 août 2014 16:29
Localisation : Perpignan
Contact :

Double buffering sur MO6

Message par Orion_ » 20 août 2014 20:35

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 ?
Programmation rétro ! Orion_'s website

__sam__
Messages : 3815
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Double buffering sur MO6

Message par __sam__ » 20 août 2014 23:33

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: .
Samuel.
Amiga 500+GVP530(MMU/FPU) (hs), A1200(030@50mhz/fpu/64mb/cf 8go), R-Pi, TO9, TO8D, TO8.
New Teo 1.8.4 8)

Daniel
Messages : 9739
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Double buffering sur MO6

Message par Daniel » 21 août 2014 09:45

__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.
Daniel
L'obstacle augmente mon ardeur.

Avatar du membre
Orion_
Messages : 146
Enregistré le : 07 août 2014 16:29
Localisation : Perpignan
Contact :

Re: Double buffering sur MO6

Message par Orion_ » 21 août 2014 10:23

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
Programmation rétro ! Orion_'s website

Fool-DupleX
Messages : 880
Enregistré le : 06 avr. 2009 12:07

Re: Double buffering sur MO6

Message par Fool-DupleX » 21 août 2014 10:56

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.
Modifié en dernier par Fool-DupleX le 22 août 2014 11:23, modifié 1 fois.

Avatar du membre
Orion_
Messages : 146
Enregistré le : 07 août 2014 16:29
Localisation : Perpignan
Contact :

Re: Double buffering sur MO6

Message par Orion_ » 21 août 2014 22:25

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)
Programmation rétro ! Orion_'s website

Fool-DupleX
Messages : 880
Enregistré le : 06 avr. 2009 12:07

Re: Double buffering sur MO6

Message par Fool-DupleX » 22 août 2014 11:23

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.
Modifié en dernier par Fool-DupleX le 22 août 2014 11:27, modifié 1 fois.

Avatar du membre
Orion_
Messages : 146
Enregistré le : 07 août 2014 16:29
Localisation : Perpignan
Contact :

Re: Double buffering sur MO6

Message par Orion_ » 22 août 2014 11:27

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)
Programmation rétro ! Orion_'s website

Fool-DupleX
Messages : 880
Enregistré le : 06 avr. 2009 12:07

Re: Double buffering sur MO6

Message par Fool-DupleX » 22 août 2014 11:53

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.

Avatar du membre
Orion_
Messages : 146
Enregistré le : 07 août 2014 16:29
Localisation : Perpignan
Contact :

Re: Double buffering sur MO6

Message par Orion_ » 22 août 2014 12:51

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 :/
Programmation rétro ! Orion_'s website

Fool-DupleX
Messages : 880
Enregistré le : 06 avr. 2009 12:07

Re: Double buffering sur MO6

Message par Fool-DupleX » 22 août 2014 13:23

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.

Avatar du membre
Orion_
Messages : 146
Enregistré le : 07 août 2014 16:29
Localisation : Perpignan
Contact :

Re: Double buffering sur MO6

Message par Orion_ » 22 août 2014 13:53

a oui pardon j'ai mal lu la doc :)
Programmation rétro ! Orion_'s website

Fool-DupleX
Messages : 880
Enregistré le : 06 avr. 2009 12:07

Re: Double buffering sur MO6

Message par Fool-DupleX » 22 août 2014 16:53

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.

Avatar du membre
Orion_
Messages : 146
Enregistré le : 07 août 2014 16:29
Localisation : Perpignan
Contact :

Re: Double buffering sur MO6

Message par Orion_ » 22 août 2014 17:06

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)
Programmation rétro ! Orion_'s website

Daniel
Messages : 9739
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Double buffering sur MO6

Message par Daniel » 22 août 2014 18:18

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.
Daniel
L'obstacle augmente mon ardeur.

Répondre