Changes between Version 15 and Version 16 of AS6-TME-B2


Ignore:
Timestamp:
Mar 3, 2021, 3:46:56 PM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B2

    v15 v16  
    137137
    138138
    139 Je vous propose de modifier un peu le code de ha
     139Je vous propose de modifier un peu le code de harch.c pour gérer l'interruption de sur le TTY1 et faire un petit programme de dessin...
     140 
     1411. Vous devez modifier la fonction `arch_init()` pour demander démasquer l'interruption du TTY1 dans l'ICU et programmer le vecteur d'interruption.
     1422. Vous allez modifier la fonction `isr_tty()` pour y créer un petit jeu de dessin.
     143   - L'idée est de gérer les touches de ''flèche'' du clavier et de déplacer le curseur sur la fenêtre.
     144   - Ensuite vous pouvez utiliser les touches U (pour UP) et D pour down pour lever ou baisser un crayon.
     145   - Si vous vous déplacez avec le crayon baissé ça écrit des '*'.
     146   - Vous pouvez ajouter d'autres fonctionnalités si ça vous amuse :-)
     147
     148Pour déplacer le curseur, nous allons utiliser les [http://braun-home.net/michael/info/misc/VT100_commands.htm commandes d'échappement `VT100`] comprises par les fenêtres `xterm`.
     149
     150Vous allez aussi devoir créer un automate d'état fini dans la fonction `tty_isr`, c'est assez simple ici.
     151Je vous donne un début de code que vous pouvez analyser et modifier.
     152Normalement, on ne fait pas un ''jeu'' dans une isr, mais un automate oui, c'est possible.
     153
     154Quand vous tapez sur une flèche ⟶ le clavier envoie 3 code ascii : le code ESC (27), '[', ’C'
     155L'automate a trois états :
     156* 0 = on attend n'importe quel caractère
     157* 1 = on a reçu ESC et on attend '['
     158* 2 = on attend 'A' ou 'B' ou 'C' ou 'D'
     159
     160{{{#!c
     161static void tty_isr (int irq)
     162{
     163    static int state[NTTYS];
     164
     165    char c = __tty_regs_map[ (irq - 3) % NTTYS].read;
     166    switch (irq) {
     167    case 3:
     168        kprintf (0, "code ascii %d", c);
     169        if ((c >= 32) && (c <= 126))
     170            kprintf (0, " = %c", c);
     171        kprintf (0, "\n");
     172        break;
     173    case 4:
     174        switch (c) {
     175        case 27  :
     176            state[1] = 1;
     177            break;
     178        case '[' :
     179            if (state[1] == 1)
     180                state[1] = 2;
     181            else {
     182                state[1] = 0;
     183            }
     184            break;
     185        case 'B' :
     186            if (state[1] == 2) {
     187                kprintf (1, "%c[B", 27);
     188            }
     189            state[1] = 0;
     190            break;
     191        case 'C' :
     192            if (state[1] == 2) {
     193                kprintf (1, "%c[C", 27);
     194            }
     195            state[1] = 0;
     196            break;
     197        }
     198    }
     199}
     200}}}