| 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 | }}} |