;Le probleme du hamburger :) ;Pour preparer un hamburger, on encode 6 bits de la maniere suivante: ;bit0: salade ;bit1: champignons ;bits2&3: nombre de tranches de tomates ;bit4: piments ;bit5: oignons ;note: les numeros de bits se lisent de droite a gauche. le bit0 est donc ;le bit le plus faible. ;Ces bits nous donnent la composition du hamburger, c'est a dire que si ;le bit4 est a 1, on veut des piments dans le hamburger, s'il est a 0, ;on ne veut pas de piments. ;Une exception est faite pour les tomates; deux bits sont utilises pour ;donner le nombre de tranches de tomates a mettre (0,1,2,3) ;On veut faire un programme qui prend en entree un nombre et qui imprime ;a l'ecran la composition du hamburger. ;Exemples: ;Le nombre entre est 19 (010011). ;0 1 00 1 1 ;bit5 bit4 bit3&2 bit1 bit0 ;Le hamburger sera compose de: ;piments, champignons et salade. ;Ce que l'on verra a l'ecran: SALADE CHAMPIGNONS PIMENTS ;Le nombre entre est 24 (011000). Le hamburger sera compose de: ;piments et deux tranches de tomate. ;Ce que l'on verra a l'ecran: 2TOMATE(S) PIMENTS deci nb,d loada msgrep,i storea d#-2,s addsp d#-2,i jsr Afficher loada nb,d anda d#1,i ;A AND 000001 =>A=000001 (bin) -> salade ; A=000000 (bin) -> pas de salade compa d#1,i ;est ce que A=1 ? brne psalade ;pas de salade? loada msgsal,i storea d#-2,s addsp d#-2,i jsr Afficher psalade: loada nb,d ;le nombre a ete modifie, alors on le recharge anda d#2,i ;A AND 000010 =>A=000010 -> champignons, ; A=000000 -> pas de champignons compa d#2,i ;est ce que A=10 ? brne pchamp ;pas de champignons? loada msgcham,i storea d#-2,s addsp d#-2,i jsr Afficher pchamp: loada nb,d anda d#12,i ;A AND 001100 =>A=000000 -> pas de tomates, ; A=000100 -> 1 tomate, ; A=001000 -> 2 tomates, ; A=001100 -> 3 tomates, asra ;decalage de A a droite deux fois, pour que asra ;le nombre de tomates arrive dans les ;premiers bits ;compa d#0,i ;on veut des tomates? (instruction pas ; nécessaire) breq ptomates ;non? ->branchement, oui? -> on continue storea tom,d ;stocker pour imprimer deco tom,d loada msgtom,i storea d#-2,s addsp d#-2,i jsr Afficher ptomates: loada nb,d anda d#16,i ;A AND 010000 =>A=010000 -> piments, ; A=000000 -> pas de piments ;PAS DE COMPARAISON. On aurait pu suivre le ;meme schema que pour la salade et les champignons ;mais il existe une maniere plus efficace de le ;faire: apres avoir fait le AND, si A vaut zero, ;le flag Z (zero) sera leve (c-a-d que Z vaudra 1). ;On peut donc determiner le resultat de ;l'operation sans faire de comparaison. ;Mais il faut utiliser l'instruction BREQ ;au lieu de BRNE. ;BRNE fait un branchement si Z=0 (nombre non-nul) ;BREQ fait un branchement si Z=1 (zero) breq ppiments ;pas de piments? loada msgpim,i storea d#-2,s addsp d#-2,i jsr Afficher ppiments: loada nb,d anda d#32,i ;A AND 100000 =>A=100000 -> oignons, ; A=000000 -> pas d'oignons breq poignons ;pas d'oignons? loada msgoign,i storea d#-2,s addsp d#-2,i jsr Afficher poignons: stop nb: .WORD d#0 tom: .WORD d#0 msgrep: .ASCII /Le hamburger sera constitue de:/ .BYTE h#0A ;Passer une ligne .BYTE h#00 ;Fin de la string msgsal: .ASCII /Salade / .BYTE h#00 msgcham: .ASCII /Champignons / .BYTE h#00 msgtom: .ASCII / Tomate(s) / .BYTE h#00 msgpim: .ASCII /Piments / .BYTE h#00 msgoign: .ASCII /Oignons/ .BYTE h#00 ; ------- Afficher ; Affiche une chaîne de caractères ASCII jusqu'à ce qu'il ; rencontre un caractère nul. Un paramètre qui est ; l'addresse du message sur la pile. ; vieuxX: .EQUATE d#0 ; sauvegarde X vieuxA: .EQUATE d#2 ; sauvegarde A adRet: .EQUATE d#4 ; adresse de retour addrMsg: .EQUATE d#6 ; addresse du message à afficher ; Afficher: ADDSP d#-4,i ; espace local sauvegarde STOREA vieuxA,s ; sauvegarde A STOREX vieuxX,s ; sauvegarde X LOADB addrMsg,s ; B := addresse du message LOADX d#0,i ; X := 0 LOADA d#0,i ; A := 0 EncorA: LDBYTA ,x ; LOOP BREQ FiniA ; EXIT WHEN Message(X) = 0; CHARO ,x ; afficher Message(X); ADDX d#1,i ; X := X + 1; BR EncorA ; END LOOP; FiniA: LOADA adRet,s ; adresse retour STOREA addrMsg,s ; déplacée sur paramètre LOADA vieuxA,s ; restaure A LOADX vieuxX,s ; restaure X ADDSP d#6,i ; nettoyer pile RTS ; .END