output: .equ 0FFFFF000h ; Adresse du port d'affichage a l'ecran .org 0 ; demarrage a l'adresse 0 (vecteur d'interruption 0) ld r30,pile ; initialise le pointeur de pile la r0,main br r0 ; brancher a "main" pile: .dc 10000h ; l'adresse du bas de la pile .org 20h ; Vecteur d'interruption 2 ; (on a de l'espace pour seulement 4 instructions) addi r30,r30,-8 ; allouer de l'espace sur la pile st r0,0(r30) ; sauver r0 sur la pile (on doit tout sauver ce qu'on utilise) la r0,int2 br r0 ; brancher a la routine de traitement d'interruption .org 1000h ; 1000h est la premiere adresse apres la table d'interruption ;---------- ; Routine d'interruption du clavier int2: st r1,4(r30) ; sauver r1 sur la pile svi r0,r1 ; lire le caractere et le statut d'interruption st r0,output ; afficher le caractere addi r0,r0,-'\n' ; comparer avec Return lar r1,notLF brnz r1,r0 la r0,1 ; placer 1 dans la variable 'exit' st r0,exit notLF: la r0,0 st r0,output ; vider le tampon d'affichage ld r0,0(r30) ; restaurer les registres ld r1,4(r30) addi r30,r30,8 ; II and IPC n'ont pas changes, pas necessaire de les restaurer rfi ; retour de l'interruption exit: .dc 0 message: .dcb "Ici je met un message en rouge sur bleu pour tester, avec des \" et '\n",0 ;---------- ; Routine principale main: een ; autoriser les interruptions lar r0,message ; pointeur au message lar r31,display brl r31,r31 ; afficher le message lar r1,loop loop: ldr r0,exit ; boucler tant que exit == 0 brzr r1,r0 stop ;---------- ; Procedure pour afficher une chaine de caracteres terminee par un 0 ; (r0 contient l'adresse de la chaine de caracteres) display: addi r30,r30,-12 st r0,0(r30) ; sauver les registres st r1,4(r30) st r2,8(r30) addi r1,r0,0 ; r0 ne peut pas servir comme adresse alors on le met dans r1 lar r0,dispLoop lar r2,dispMessage br r2 dispLoop: ori r2,r2,4100h ; met les attributs a rouge(1) sur bleu(4) st r2,output ; affiche le caractere dispMessage: ld r2,(r1) ; prend un caractere addi r1,r1,1 ; incremente le pointeur shr r2,r2,24 ; extrait l'octet superieur du mot (le caractere) brnz r0,r2 ; continue s'il n'est pas 0 ld r0,0(r30) ; restaurer les registrer ld r1,4(r30) ld r2,8(r30) addi r30,r30,12 br r31