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

__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Double buffering sur MO6

Message par __sam__ »

Daniel pourrait répondre car seuls DCMoto et MESS font l'émulation MO6.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Double buffering sur MO6

Message par Daniel »

La documentation technique Cofadel du MO5NR donne beaucoup d'informations sur le MO6, si on fait abstraction du contrôleur nanoréseau. Il y a en particulier un paragraphe sur la transformation des adresses.

Cet extrait du code de dcmoto peut aussi donner quelques éclaircissements (surtout les commentaires) :

Code : Tout sélectionner

// Selection de banques memoire ///////////////////////////////////////////////
void MO6rombank(int c)
{
 //si le bit 0x20 de a7e6 est positionne a 1, l'espace ROM est recouvert
 //par la banque RAM definie par les 3 bits de poids faible de a7e6
 //subtilite : les adresses sont decalées de +0x1000 pour 0xb000 (en 0x1000),
 //0xc000 (en 0x2000), 0xd000 (en 0x3000), et de -0x3000 pour 0xe000 (en 0x1000).
 //sinon la banque ROM est definie par a7dd et a7c0 (c)
 //7 est le numero de banque de rom fictive recouverte par la ram
 nrombank = (c & 0x20) >> 5;
 if((port[0x1d] & 0x10) == 0) nrombank += 2;
}
Autre extrait, avec ce commentaire :
//dans la rom basic 128, la plage $b000-$bfff est apres la plage $c000-$efff
Quand j'évoquais les subtiles différences avec le TO8, je pensais surtout à ce genre de pièges :
Les adresses $B000-$BFFF, $C000-$DFFF et $E000-$EFFF sont traitées différemment.

Code : Tout sélectionner

// Lecture memoire MO6 ///////////////////////////////////////////////////////
int MgetMO6(int a)
{
 int r;
 //extern int lightpen, lbutton;

 a &= 0xffff;
 if(a == breakpoint) breakflag = 1;
 switch(a >> 12)
 {
  case 0x0: case 0x1: r = videobank[nvideobank][a]; break;
  case 0x2: case 0x3: case 0x4: case 0x5: r = userram[a]; break;
  case 0x6: case 0x7: case 0x8: case 0x9: r = rambank[nrambank][a]; break;
  case 0xa: if(a < 0xa7c0) {r = ctrlbank[nctrlbank][a & 0x7ff]; break;}
   if(a < 0xa900) r = MO6readport(a); else r = 0; break;
  case 0xb:
   if(port[0x26] & 0x20) {r = rombank[7][a + 0x1000]; break;} //rom recouverte par ram
   if((port[0x1d] & 0x30) == 0x20) {r = 0; break;} //cartouche masquee Basic 1
   //dans la rom basic 128, la plage $b000-$bfff est apres la plage $c000-$efff
   if(port[0x1d] & 0x20) {r = rombank[nrombank][a + 0x4000]; break;} //cartouche masquee Basic 128
   if((cartype == 3) && ((port[0x0b] & 4) == 0)) {r = 0; break;} //extension memoire inactive
   if((a & 0xfffc) == 0xbffc) Switchcartridgebank(a); //commutation cartouche
   r = carbank[ncarbank][a]; //cartouche memo5 ou extension memoire
   break;
  case 0xc: case 0xd:
   if(port[0x26] & 0x20) {r = rombank[7][a + 0x1000]; break;} //rom recouverte par ram
   if(port[0x1d] & 0x20) {r = rombank[nrombank][a]; break;} //cartouche masquee Basic 128
   if((cartype == 3) && ((port[0x0b] & 4) == 0)) {r = 0; break;} //extension memoire inactive
   r = carbank[ncarbank][a]; //cartouche memo5 ou extension memoire
   break;
  case 0xe:
   if(port[0x26] & 0x20) {r = rombank[7][a - 0x3000]; break;} //rom recouverte par ram
   if(port[0x1d] & 0x20) {r = rombank[nrombank][a]; break;} //cartouche masquee Basic 128
   if((cartype == 3) && ((port[0x0b] & 4) == 0)) {r = 0; break;} //extension memoire inactive
   r = carbank[ncarbank][a]; //cartouche memo5 ou extension memoire
   break;
  default: r = systbank[nsystbank][a]; break;
 }
 return r & 0xff;
}
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
OlivierP
Messages : 703
Inscription : 21 sept. 2009 15:50
Localisation : IDF

Re: Double buffering sur MO6

Message par OlivierP »

merci pour ces infos/confirmations, ce comportement est-il modifiable ?
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Double buffering sur MO6

Message par Daniel »

C'est très difficile. Il faudrait au minimum reprogrammer les deux Basic et le moniteur système, changer le gate array et la ROM. Et la plupart des logiciels existants ne fonctionneraient plus.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
OlivierP
Messages : 703
Inscription : 21 sept. 2009 15:50
Localisation : IDF

Re: Double buffering sur MO6

Message par OlivierP »

Je comprends mieux le manque d’intérêt pour cette machine.
C'est un peu une erreur de conception, non ?
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Double buffering sur MO6

Message par __sam__ »

OlivierP a écrit :C'est un peu une erreur de conception, non ?
Oui où une contrainte technique liée au décodage d'adresse. La logique du TO avec l'inversion RAMA/RAMB suivant que c'est mappé en $0000 ou en $A000 n'est pas non très logique.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Double buffering sur MO6

Message par Daniel »

La raison essentielle doit être la recherche de compatibilité avec les applications MO5 existantes (MEMO5, cassettes, disquettes).
On ne peut pas blâmer Thomson sans analyser plus précisément les raisons de leur choix. Il est évident qu'on peut le contester aujourd'hui, mais de toutes façons on ne peut pas refaire l'histoire.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
OlivierP
Messages : 703
Inscription : 21 sept. 2009 15:50
Localisation : IDF

Re: Double buffering sur MO6

Message par OlivierP »

J'ai trouvé un moyen de faire NyanCat sur MO6.
- ça fonctionne bien sur dcmoto
- ça fonctionne bien sur machine réelle mais avec quelques pixels parasites
- je n'arrive pas a trouver une version de MESS qui fonctionne correctement : la dernière version 0.173 fait toujours Device I/O error et la version 0.112 (dernière version testée d'après https://www-apr.lip6.fr/~mine/mess/index.html.fr) ne semble pas émuler correctement le MO6 dans le mode utilisé
Que faire sachant que je souhaite rendre public une seule version ? (si possible sans bug)
EDIT : je met un lien temporaire sur http://dl.free.fr/gEzPHulJF
EDIT2 : lien temporaire remplacé par https://github.com/OlivierP-To8/NyanCat ... aster/dist
Dernière modification par OlivierP le 10 mai 2016 17:49, modifié 2 fois.
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Double buffering sur MO6

Message par Daniel »

Les pixels parasites sur le vrai MO6 peuvent peut-être être supprimés en synchronisant l'affichage avec la VBL ?

La réponse à ta question est très claire pour moi : La seule contrainte pour un développeur est de faire fonctionner le programme correctement sur la vraie machine. Si les émulateurs ne reproduisent pas bien son comportement ce n'est pas le problème du développeur, mais celui des auteurs d'émulateurs. Il faut leur signaler, et ne pas chercher à masquer les anomalies.

Concernant l'émulation Thomson dans MESS, je crois qu'il y a peu d'utilisateurs, justement à cause des difficultés rencontrées pour faire fonctionner l'application. C'est dommage que MESS ne soit pas développé avec plus de rigueur, car les modules Thomson, en particulier, sont remarquables. Mais les modifications anarchiques à chaque nouvelle version risquent un jour de faire écrouler le bel édifice.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Double buffering sur MO6

Message par __sam__ »

Daniel a écrit :C'est dommage que MESS ne soit pas développé avec plus de rigueur (...)
En même temps c'est cohérent avec le nom de l'appli pour les anglophones. Qui aurait l'idée farfelue d'appeler son émulateur "désordre" ou "b*rdel" ?

Cela dit, comme l’émulateur connait les DSK (image disk), le choix de "b*rdel" pourrait avoir une certaine cohérence aussi :wink: (penser à l'ex homme-politique :mrgreen: )
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
OlivierP
Messages : 703
Inscription : 21 sept. 2009 15:50
Localisation : IDF

Re: Double buffering sur MO6

Message par OlivierP »

Je ne peux pas synchroniser l'affichage sans détériorer la sortie du sample
J'ai mis les sources et les binaires sur github : https://github.com/OlivierP-To8/NyanCat
Garland_Raven
Messages : 25
Inscription : 19 juin 2017 19:00

Re: Double buffering sur MO6

Message par Garland_Raven »

Sorry for necro posting guys.

When i execute this code to switch on bitmap16 mode:

ORG &32000
LDA #$7B
STA $A7DC


I get this:

Image

Red+yellow point on center are drawn by me so thats fine.

(I'm using PC128 emulation rather than MO6).

Also, this is a code for TO8:

Code : Tout sélectionner

LDA $E7C3
ANDA #$FE    .Passage en RAMB
STA $E7C3
Now on MOs E7C3 is actually A7C0, if i do LDA #31 STA $1000 i can see my points. But can't find a way to switch on RAMB, #$FE seems not correct on MO. Of course my purpose is to write points 3 and 4 right after 1 and 2 on $1000.

Merci les héros! :)
Fool-DupleX
Messages : 2284
Inscription : 06 avr. 2009 12:07

Re: Double buffering sur MO6

Message par Fool-DupleX »

Which means you are probably already in RAMB. Try:

Code : Tout sélectionner

LDA $A7C0
ORA #$01    .Passage en RAM forme
STA $A7C0
Garland_Raven
Messages : 25
Inscription : 19 juin 2017 19:00

Re: Double buffering sur MO6

Message par Garland_Raven »

Fool-DupleX a écrit :Which means you are probably already in RAMB. Try:

Code : Tout sélectionner

LDA $A7C0
ORA #$01    .Passage en RAM forme
STA $A7C0
Yes, so it is ANDA #$FE and ORA #$01, thanks :)

Any idea about the glitched screen? :|
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Double buffering sur MO6

Message par __sam__ »

You mean the vertical stripes that appear after poking $A7cd hence switching to 160x200? they are normal since in 320x200 the invisible cyan foreground color in color-ram suddenly are interpreted. as chunk bits and become visible as stripes on every ram-b column in 160x200.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Répondre