Pouvoir provoquer une interruption à chaque début de trame permet de pouvoir bien synchroniser les changements d’affichage. Deux signaux du bus d’extension sont indispensables pour cela : INT qui permet de signaler une interruption au CPU et INTAK, qui permet de constater que le CPU a bien pris en compte l’interruption.

Cependant, voilà. Les CPLD commencent à bien se remplir, Pour le CPLD gérant les adresses il n’y a pratiquement plus d’entrée-sorties disponibles et sur le CPLD qui traite des données, ce sont les bascules et circuits logiques qui viennent à manquer, si l’on en juge sur les rapports de compilation.

CPLD DONNEES

Total dedicated input used:       3/4           (75%)

Total I/O pins used                    44/64       (68%)

Total Logic cells used                 128/128   (100%)

Total Flip-Flop used                   117/128   (91%)

Total Foldback logic used           31/128     (24%)

Total Nodes+FB/MCells              159/128   (124%)

Total cascade used                    0

Total input pins                         24

Total output pins                      23

 

CPLD ADRESSES

Total dedicated input used:       4/4           (100%)

Total I/O pins used                    64/64       (100%)

Total Logic cells used                 122/128   (95%)

Total Flip-Flop used                   108/128   (84%)

Total Foldback logic used           4/128       (3%)

Total Nodes+FB/MCells              126/128   (98%)

Total cascade used                    0

Total input pins                         31

Total output pins                      37

 

Bon en optimisant des équations par ci par là, je tente le coup. 

L’interruption devait pouvoir être utilisée en mode M1 ou M2, dans le premier mode il y a un saut vers une adresse fixe $30 et c’est le programme qui doit s’occuper de savoir qui a déclenché l’interruption.

Dans le mode M2 la carte fourni les poids faibles d’un vecteur qui ajouté à la valeur du registre I du Z80 en poids fort donnera l’adresse d’exécution de l’interruption. Cela permet d’être en mesure de différentier le traitement en fonction de la source des interruptions.

Finalement il s’est avéré impossible de programmer le mode M2, même avec un vecteur fixe. De toute façon il aurait été compliqué de gérer les collisions en cas de déclenchement simultanée d’une interruption par un autre périphérique, même si le TRS-80 n’en dispose pas de base.

Une autre limitation, il ne sera pas possible de relire le drapeau d’autorisation de l’interruption, car la lecture des registres s’effectue sur le CPLD DONNEES qui est plein comme un œuf.

La lecture du flag d’interruption ne sera possible qu’en affectant la dernière ligne disponible du CPLD ADRESSE qui par conséquent est également plein comme un œuf.

Ce qui nous donne :

CPLD ADRESSES

PIN = TRS_INT ;                                                         /* LIGNE D’INTERRUPTION DU TRS-80 */

PIN = TRS_INTAK ;                                                     /* LIGNE D’ACQUITTEMENT DE L’INTERRUPTION PAR LE TRS-80 */

PIN = FLG_INT ;                                                        /* SIGNALISATION VERS LE CPLD DONNEES */

NODE INTOE0 ;

NODE INTOE1 ;

 

FLG_INT.d = CTRL_VIE ;                                              /* VALIDATION DES INTERRUPTION VIDEO */

FLG_INT.ck = !VGA_VSYNC ;

FLG_INT.ar = TRS_A15 & MREQ & INOUT & !RDWR & !TRS_A0 & !TRS_A1 ;

 

INTOE0.d = ‘b’1 ;                                                      /* DEBUT DE L’INTERRUPTION */

INTOE0.ck = FLG_INT ;

INTOE0.ar = INTOE1 ;

 

INTOE1.d = ‘b’1 ;                                                      /* FIN DE L’INTERRUPTION */

INTOE1.ck = !INTAK ;

INTOE1.ar = !INTOE0 ;

 

TRS_INT = ‘b’0 ;                                                        /* INTERRUPTION SUR INT EN COLLECTEUR OUVERT */

TRS_INT.oe = INTOE0 ;