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 ;