; ************************************************************ ; Programme: MOYENNE.TXT version PEP813 sous Windows ; ; Ce programme calcule la moyenne parmi les nombres hexadécimaux ; entrés par l'utilisateur. ; ; auteur: Bernard Martin ; code permanent: non applicable ; courriel: martin.bernard@uqam.ca ; date: Eté 2020 ; cours: INF2171 ; *********************************************************** ; STRO msgbien,d ; bienvenue ; début: STRO msginput,d ; Entrez vos données CHARI caract,d LDA avcaract,d CPA "\n",i ; caractère ENTREE uniquement ? BREQ final STRO msgres,d ; résultat BR premier ; premier départ ; lire: CHARI caract,d LDA avcaract,d premier: CPA ' ',i ; éliminer espace de début BREQ lire CPA "\n",i ; fin de la ligne ? BREQ finlign traite: CPA '0',i ; entre '0' et '9' ? BRLT erreur CPA '9',i BRLE chiffre ANDA 0x00DF,i ; transforme en majuscule CPA 'A',i ; entre 'A' et 'F' ? BRLT erreur CPA 'F',i BRGT erreur SUBA 7,i ; pour les lettres seulement chiffre: SUBA '0',i ; conversion en chiffre ; LDX position,d ; maximum de 4 caractères hexa CPX 3,i BRGT erreur ADDX 1,i STX position,d LDX nombre,d ; nombre actuel * 16 BREQ zéro ASLX ASLX ASLX ASLX zéro: STX nombre,d ADDA nombre,d STA nombre,d ; nouveau nombre actuel CHARI caract,d ; caractère suivant LDA avcaract,d CPA "\n",i ; fin de ligne ? BREQ finlign CPA ' ',i ; prochaine lecture BRNE traite ; ; fin de ligne rencontrée ; finlign: LDA position,d ; ligne vide ? BREQ erreur LDA valeur,d ; une donnée lue de plus ADDA 1,i STA valeur,d LDA nombre,d ; sauve pour affichage futur en décimal STA hexa,d ADDA somme,d ; totalisation BRV erreur ; > 32767 ? STA somme,d LDX virgule,d ; virgule à afficher ? BREQ pasvirg CHARO ",",i CHARO ' ',i pasvirg: LDX 1,i STX virgule,d ; virgule future LDA trois,d ; trois par ligne ? CPA 3,i BRNE pastrois CHARO "\n",i LDA 0,i pastrois:ADDA 1,i STA trois,d ; ; affichage des 4 caractères en hexa ; LDX 3,i ; 4 caractères à afficher LDA nombre,d boucleh: ANDA 0xF000,i ; conserve le premier octet de gauche ASRA ; déplace à la fin du registre ASRA ASRA ASRA ASRA ASRA ASRA ASRA ASRA ASRA ASRA ASRA ANDA 0x000F,i ; rendre positif si c'est une lettre ADDA '0',i ; conversion en chiffre CPA '9',i ; lettre ? BRLE chiffr lettre: ADDA 7,i ; conversion en lettre à partir d'un négatif suite à ASRA chiffr: STBYTEA car,d ; caractère à afficher CHARO car,d LDA nombre,d ; prochain caractère ASLA ; placer le prochain caractère au début du registre ASLA ASLA ASLA STA nombre,d SUBX 1,i ; caractère suivant BRGE boucleh ; ; affichage en décimal ; CHARO "(",i DECO hexa,d CHARO ")",i LDA avcaract,d CPA "\n",i ; calcul de la moyenne demandé BREQ calcul ; ; élimination des caractères du tampon d'entrée ; relire: CHARI caract,d LDA avcaract,d CPA "\n",i BREQ calcul CPA ' ',i BREQ relire ; LDX 0,i ; initialisation prochaine valeur STX nombre,d STX position,d BR traite ; ; moyenne à calculer ; ; division signée ; calcul: LDA somme,d BRGE positif1 NEGA LDX -1,i STX signe,d positif1:LDX 0,i ; quotient soustrai:ADDX 1,i SUBA valeur,d BRGE soustrai SUBX 1,i ; défaisons la dernière soustraction ADDA valeur,d STA reste,d ; ; arrondissement si reste*2 >= quotient ; ASLA CPA valeur,d BRLT pasarr ADDX 1,i pasarr: LDA signe,d BREQ positif2 NEGX ; rendre négatif le quotient LDA reste,d NEGA ; rendre négatif le reste STA reste,d positif2:STX nombre,d STX hexa,d ; LDX trois,d ; 3 par ligne CPX 3,i BRNE pastroi CHARO "\n",i BR moy pastroi: CHARO ' ',i moy: STRO msgmoy,d ; ; HEXOUT ; ; affichage en hexa caractère par caractère ; ex: 12AB ; ;Instruction ROLA ; ;L'instruction ROLA effectue une rotation cyclique à gauche (L pour left) d'une position du contenu du ;registre associé au code de condition C. Le bit de droite du registre reçoit le code de condition C, ce ;dernier reçoit comme nouvelle valeur le bit sorti du registre. Seul le témoin C est affecté. ; ;En fait, un bit est décalé vers la gauche à partir des 17 bits (Témoin C + 16 bits du registre A), ;le bit perdu est inséré à la droite du registre. ; ; 1) après 4 rotations à gauche: 12AB -> 2AB0 -> à conserver pour le prochain caractère ; 2) après 5 rotations à gauche: 12AB -> 5561 ; 3) on effectue un AND avec x000F afin de ne conserver que la dernière position 5561 -> 0001 -> '1' ; 4) on refait les étapes 1 à 3, 3 autres fois pour afficher les 3 autres caractères hexa ; ; 1) après 4 rotations à gauche: 2AB0 -> AB09 -> à conserver pour le prochain caractère ; 2) après 5 rotations à gauche: 2AB0 -> 5612 ; 3) on effectue un AND avec x000F afin de ne conserver que la dernière position 5612 -> 0002 -> '2' ; 4) on refait les étapes 1 à 3, 2 autres fois pour afficher les 2 autres caractères hexa ; ; 1) après 4 rotations à gauche: AB09 -> B09D -> à conserver pour le prochain caractère ; 2) après 5 rotations à gauche: AB09 -> 613A ; 3) on effectue un AND avec x000F afin de ne conserver que la dernière position 613A -> 000A -> 'A' ; 4) on refait les étapes 1 à 3, 1 autre fois pour afficher l'autre caractère hexa ; ; 1) après 4 rotations à gauche: B09D -> 09DD ; 2) après 5 rotations à gauche: B09D -> 13BB ; 3) on effectue un AND avec x000F afin de ne conserver que la dernière position 13BB -> 000B -> 'B' ; LDX 3,i ; 4 caractères hexa à afficher boucler: LDA nombre,d ROLA ; déplacement du premier caractère vers l'extrême droite ROLA ; ROLA ; ROLA ; STA nombre,d ; prochaine position ROLA ; ANDA 0x000F,i ; élimination des 3 autres caractères ADDA '0',i ; conversion en chiffre CPA '9',i ; lettre ? BRLE chiffrr ADDA 7,i ; conversion en lettre chiffrr: STBYTEA car,d ; caractère à afficher CHARO car,d SUBX 1,i ; caractère suivant BRGE boucler ; ; affichage en décimal ; CHARO "(",i DECO hexa,d CHARO ")",i ; ; initialisation de toutes les variables ; termine: LDA 0,i STA nombre,d STA somme,d STA virgule,d STA trois,d STA valeur,d STA position,d STA signe,d BR début ; ; fin normale ; final: STRO msgfin,d STOP ; ; entrée invalide ; erreur: STRO msginv,d ; ; vidage du tampon d'entrée ; erreur2: LDA avcaract,d CPA "\n",i ; jusqu'au ENTREE BREQ termine CHARI caract,d BR erreur2 ; STOP ; msgbien: .ASCII "Bienvenue à ce programme qui calcule la moyenne" .ASCII "\nde nombres hexadécimaux." .ASCII "\nex: AB C12 def" .ASCII "\nVeuillez entrer uniquement la touche ENTREE" .ASCII " pour terminer.\x00" msginput:.ASCII "\n\nEntrez vos données svp: \x00" msgres: .ASCII "\nRésultat:\n\x00" msginv: .ASCII "\nEntrée invalide\x00" msgmoy: .ASCII "=> moyenne: \x00" msgfin: .ASCII "\n\nFin normale du programme.\x00" avcaract:.BLOCK 1 ;#1h caract: .BLOCK 1 ;#1h hexa: .BLOCK 2 ;#2d valeur base 16 nombre: .BLOCK 2 ;#2d construction du nombre somme: .BLOCK 2 ;#2d totalisation car: .BLOCK 1 ;#1h caractère heaa à afficher virgule: .BLOCK 2 ;#2d (0-non 1-oui) trois: .BLOCK 2 ;#2d valeur par ligne valeur: .BLOCK 2 ;#2d valeur hexa lue signe: .BLOCK 2 ;#2d 0:positif 1:négatif quotient:.BLOCK 2 ;#2d reste: .BLOCK 2 ;#2d position:.BLOCK 2 ;#2d nombre de caractères hexa lue .END