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 : 3917
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Double buffering sur MO6

Message par __sam__ » 26 févr. 2016 19:04

Daniel pourrait répondre car seuls DCMoto et MESS font l'émulation MO6.
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 : 10120
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Double buffering sur MO6

Message par Daniel » 26 févr. 2016 20:45

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 du membre
OlivierP
Messages : 633
Enregistré le : 21 sept. 2009 15:50
Localisation : IDF

Re: Double buffering sur MO6

Message par OlivierP » 26 févr. 2016 21:53

merci pour ces infos/confirmations, ce comportement est-il modifiable ?
Envoyé de mon pécé

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

Re: Double buffering sur MO6

Message par Daniel » 26 févr. 2016 22:19

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 du membre
OlivierP
Messages : 633
Enregistré le : 21 sept. 2009 15:50
Localisation : IDF

Re: Double buffering sur MO6

Message par OlivierP » 26 févr. 2016 23:20

Je comprends mieux le manque d’intérêt pour cette machine.
C'est un peu une erreur de conception, non ?
Envoyé de mon pécé

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

Re: Double buffering sur MO6

Message par __sam__ » 27 févr. 2016 02:05

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.
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 : 10120
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Double buffering sur MO6

Message par Daniel » 27 févr. 2016 08:26

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 du membre
OlivierP
Messages : 633
Enregistré le : 21 sept. 2009 15:50
Localisation : IDF

Re: Double buffering sur MO6

Message par OlivierP » 10 mai 2016 00:17

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
Modifié en dernier par OlivierP le 10 mai 2016 17:49, modifié 2 fois.
Envoyé de mon pécé

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

Re: Double buffering sur MO6

Message par Daniel » 10 mai 2016 08:12

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 : 3917
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Double buffering sur MO6

Message par __sam__ » 10 mai 2016 12:00

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

Avatar du membre
OlivierP
Messages : 633
Enregistré le : 21 sept. 2009 15:50
Localisation : IDF

Re: Double buffering sur MO6

Message par OlivierP » 10 mai 2016 17:48

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
Envoyé de mon pécé

Garland_Raven
Messages : 25
Enregistré le : 19 juin 2017 19:00

Re: Double buffering sur MO6

Message par Garland_Raven » 28 juin 2017 08:05

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 : 975
Enregistré le : 06 avr. 2009 12:07

Re: Double buffering sur MO6

Message par Fool-DupleX » 28 juin 2017 08:34

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
Enregistré le : 19 juin 2017 19:00

Re: Double buffering sur MO6

Message par Garland_Raven » 28 juin 2017 15:20

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 : 3917
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Double buffering sur MO6

Message par __sam__ » 28 juin 2017 15:32

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

Répondre