CPC Rulez
https://cpcrulez.fr/forum/

Affichage, CRTC et Gate Array
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=5023
Page 1 sur 1

Auteur :  Lone [ 26 Fév 2013, 10:23 ]
Sujet du message :  Affichage, CRTC et Gate Array

Bonjour,

Nouveau sur ce forum, voici tout d'abord quelques mots de présentations. J'ai découvert l'informatique dans les années 80, le jour ou un ami de mes parents avait amené à la maison son "IBM PC", une machine dont le potentiel ne m'a immédiatement pas échappé. Dès lors, j'ai parcouru quelques clubs informatiques, avant de pouvoir acquérir ma première machine, qui fut (quelle surprise), un CPC 6128.

De l'eau a coulé sous les ponts, depuis ce jour (et pas loin de 25 ans..) mais la passion est toujours là.
Passionné de développement informatique (c'est d'ailleurs mon métier), c'est aussi une partie de mon passe-temps. Après tout, faire des maquettes est un passe-temps honorable, quelle différence avec faire des programmes ? C'est juste moins coupant et on se colle moins les doigts...

Du coup, je me suis lancé récemment dans le codage d'un émulateur CPC. Un de plus, me direz-vous, mais le but n'est pas de concurrencer ceux qui existent et qui sont très bien, mais plutôt de répondre à un challenge personnel.

Après avoir épluché les docs de quasar, cpcrulez ou grimware (sans oublier le très utile et très synthétique cpcwiki.eu), je me suis dont lancé dans la bataille.

J'ai donc une version que nous qualifierons aimablement de "pré alpha-alpha", qui fait tourner les ROMs du bon vieux CPC, et permet même de bricoler un peu de basic (le tout au milieu d'une flopée de bug, et à la vitesse d'un escargot asmathique englué dans de la colle (celle des maquettes, tout se recoupe)).

Bref, tout cela me satisfait pleinement, et je m'attaque donc à une série de bugs gênant, avant de me lancer dans une optimisation généralisée de tout cela.

Je voudrais particulièrement me concentrer sur le fonctionnement correct de l'affichage. Dans ma version actuelle, celui-ci est globalement correct, mais quelques points restent étranges.

Je vais donc, dans le reste de ce post décrire ma compréhension de l'affichage, et je sous serais infiniment reconnaissants, à vous, gourou du CPC, de m'indiquer mes erreurs de compréhensions.


Trois entités vont interagir dans ce processus.

-Le moniteur, dont le canon à électron va balayer l'écran de gauche à droite.
-Le gate array, contenant, grosso modo, un compteur que j’appellerais "offset", servant à connaitre la

mémoire à lire pour affichage
-Le CRTC qui contient trois compteurs :
HCC, compteur de déplacement horizontal
VLC, compteur de scanline
VCC, compteur de caractères
R0-R17, les registres du CRTC
MA = Adresse de base de lecture mémoire pour l'affichage

Démarrons au temps 0. L'offset du GA, HCC, VCC, VLC sont à 0
Je partage mon temps en microsecondes.

A chaque microseconde :
* Dans le CRTC
- Je teste HCC. si HCC > R0, J'en conclue que j'ai changé de ligne :
- Je repasse HCC à 0
- J'incrémente VLC
- Calcul de MA (decalage)
- Si VLC > R9, caractère suivant :
- VLC = 0
- VCC ++
- Si VCC = R7, début du signal VSync
- Si VCC >= R4 retour au début de la page et calcul de MA
- Calcul du signal HSYNC : Je le met a ON si (HCC >= r2 ET HCC <= R2+ (R3 & 0xF))
- HCC++
Je calcule ensuite si le signal DISPEN est ON ou non : j’affiche le border dans les cas suivants :
si HCC >= R1 ou VCC >= R6, border on.

* Dans le GA :
- Si le signal HSYNC passe a faux, je remet mon offset a 0, je décale ma ligne d'affichage de 1
- Si VSYNC passe a faux, je remet mes coordonnées actuelles à 0, 0

* L'affichage : 2 fois par microsecondes :
- Si HSYNC et VSYNC sont tous les deux a faux, j'affiche :
- DISPEN est à vrai : Je lis l'octet suivant (MA + mon offset)
- DISPEN est faux : l'octet à afficher correspond à la couleur du border.
- J'affiche mes infos suivant le mode
- De fait, mon affichage est décalé de 8 pixels (équivalent mode 2, soit 4 en mode 1 et 2 en mode 0)


Mes questions :
1/ Ce comportement est-il correct ?
2/ Concernant le CRTC : Mes calculs sont les suivants (c'est très empiriques, et c'est très certainement là que c'est le plus incorrect ) :
- Changement de ligne : (tant que VCC < R6) : MA = MA + 0x800
- Si changement de scanline : MA = MA + 0xc050 (on est sur des unsigned short, donc ça tourne correctement).800
Sur ce point, je pense intuitivement que ces ajouts sont abusifs : je me demande du coup comment sont gérés les changement de lignes / scanlines : Sur quelle base sont-il calculés, dans les cas ou le nombre total de caractère affiché n'est pas de 40 ? (la réponse intuitive semble : "nb caractère de ligne * nb lignes * taille d'un caractère en octet ?)

3/ Mon calcul d'adresse MA de base lors du retour au début d'écran est le suivant :
MA = ((R12 & 0x30)<<10) + (((R12&0x03) << 8) + ((R13)<<1));

Je sors ce calcul savant de la compilation des différentes docs cités plus haut, mais je ne suis pas vraiment sur de mon résultat.
Merci d'avance pour toutes les informations (ou éventuels pointeurs me manquant) que vous pourrez me fournir.

Auteur :  Lone [ 27 Fév 2013, 14:19 ]
Sujet du message :  Re: Affichage, CRTC et Gate Array

Après être tombé sur la réponse en fouillant le net (c'est incroyable ce qu'on peut y trouver), je m'auto réponds.
C'est donc dans un numéro fort pédagogique d'Amstrad live (ici : http://pushnpop.net/Download/Papermags/ ... e%2002.pdf ) que se trouve une des réponses.

Pour résumer (pour ceux qui ont la flemme d'aller voir dans le pdf, qui explique tout très très clairement ) :

L'adresse de base de l'affichage est calculé à partir des registres 12 et 13 du CRTC (rien de neuf la dedans).
Cette adresse est calculée en utilisant donc R12 et R13, mais également un registre à 3 bits, contenant la valeur de la ligne du caractère : Tout ceci est historique, et prévu pour des affichage en mode texte.

Donc :

Notre adresse finale, sur 16 bits, est calculée comme suit :
Soit MA, l'adresse formé des registres R12 (msb) et R13 (lsb), sur 14 bits (les bits 7 et 6 de R12 sont ignorés)
Soit RA, compteur de scanline, sur 3 bits.
Bit 0 : Clock
Bit 1 -> 10 : MA0 -> MA9
Bit 11, 12, 13 : RA1, 2, 3
Bit 14, 15 : MA12 et MA13

Au démarrage de l'écran, RA = 0. On a donc, pour des valeurs de base de R12 = 0x30 et R13 = 0.
MA = 0x30 00
L'adresse de base qui est égale a...
0xC000, les bits 4-5 de R12 constituant en effet les bits M12 et MA 13.

Rappelons nous maintenant qu'un caractère en mode 1 est constitué de deux octets par ligne (au sens scanline). Ainsi, 40 caractères = 80 octets par ligne.
A chaque déplacement d'un caractère, correspondant à un tick du CRTC (cadencé à 1 Mhz pour mémoire), l'adresse MA sera incrémentée de 1.
L'adresse lue sera donc incrémentée, elle, de deux (MA0 étant sur le bit 1 de l'adresse constituée, rappelez vous).

Fin de la ligne : Une fois le nombre de caractère correct affiché (basé sur le registre 1 du CRTC), on incrémente le nombre de scanline (RA).
Si ce nombre, dont le maximum est de fait a 8 (0->7, nous sommes sur 3 bits), dépasse le registre R9, l'adresse MA est incrémenté par la valeur du registre R1, et RA est remis à 0.

Sur un affichage standard, nous avons donc :
Fin de la ligne 1 :
MA = 0x3000 + 0x27
RA = 00
Adresse lue = 0xC03E

Début ligne 2 :
MA = 0x3000
RA = 01
Adresse lue : 0xC800 (RA1 étant sur le bit d'adresse 12)

Fin ligne 8 (indexé sur 0, donc RA = 7 !)
MA = 0x3000 + 0x27
RA = 7
Adresse lue : 0xF827

Début ligne 9 :
MA = 0x3000 + 0x28 !
RA = 0
Adresse lue : 0xC050

C'est magique.
Ca permet, de plus, de comprendre comment sont gérés le passage à l'adressage de 32ko video (si bits 10 et 11 de MA sont à 1, tout incrément d'un de ces bits sera propagé aux bits 12, et éventuellement 13.)

Au passage, cela m'a permis de voir un bugs dans mon calcul d'adresse, corrigeant quelques problèmes de scroll un peu gênant.

Auteur :  sPOKE [ 28 Fév 2013, 19:42 ]
Sujet du message :  Re: Affichage, CRTC et Gate Array

Salut,

T'as vu qu'un autre gars développe également un émulateur CPC en ce moment ?

http://cpcrulez.fr/forum/viewtopic.php?f=4&t=5008

Peut-être pourriez-vous échanger des informations ou travailler ensemble sur votre projet ?

As-tu contacté des gars qui ont déjà conçu un émulateur CPC, comme Demoniak ? Car c'est assez spécial comme dev.

Auteur :  Lone [ 28 Fév 2013, 20:59 ]
Sujet du message :  Re: Affichage, CRTC et Gate Array

Hello,

En fait, je prends ça comme un challenge personnel, tel une madeleine que je me cuisinerais moi même...
Cela dit, les contacts sont toujours bon à prendre (ne serait-ce que pour comprendre quelques trucs, qui ont pourtant été bien expliqués et explorés par bien des gens).

Cela dit, je progresse : L'affichage semble relativement correct, j'en suis désormais à essayer de débrouiller un FDC qui marche (a peu près).

Auteur :  sPOKE [ 28 Fév 2013, 21:54 ]
Sujet du message :  Re: Affichage, CRTC et Gate Array

Bien. :)

Fais tourner Discology sur ton émulateur. C'est un bon test pour savoir s'il émule correctement le FDC.

(Ainsi que la protection Latis ou Rubi je crois. Les dumpers te le diront mieux que moi)

Auteur :  MacDeath26 [ 01 Mars 2013, 19:02 ]
Sujet du message :  Re: Affichage, CRTC et Gate Array

Salut à toi Ardéchois.
Serait il impolis de te demander d'ou en Ardèche tu es?
Moi je suis Maxence Valence... dans le deux-six, juste à côté en théorie.

Auteur :  Lone [ 01 Mars 2013, 20:47 ]
Sujet du message :  Re: Affichage, CRTC et Gate Array

Je viens de la vallée du Rhône, un petit village au nord de la Voulte....
Quand à Valence, je connais, je bosse juste à côté tous les jours ( côté Ardèche bien sur !)

Page 1 sur 1 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/