139 | | Je vous propose de modifier un peu le code de ha |
| 139 | Je 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 | |
| 141 | 1. Vous devez modifier la fonction `arch_init()` pour demander démasquer l'interruption du TTY1 dans l'ICU et programmer le vecteur d'interruption. |
| 142 | 2. 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 | |
| 148 | Pour 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 | |
| 150 | Vous allez aussi devoir créer un automate d'état fini dans la fonction `tty_isr`, c'est assez simple ici. |
| 151 | Je vous donne un début de code que vous pouvez analyser et modifier. |
| 152 | Normalement, on ne fait pas un ''jeu'' dans une isr, mais un automate oui, c'est possible. |
| 153 | |
| 154 | Quand vous tapez sur une flèche ⟶ le clavier envoie 3 code ascii : le code ESC (27), '[', ’C' |
| 155 | L'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 |
| 161 | static 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 | }}} |