====== DEBUT SOURCE
WBStartup
WbToScreen 3
Use Screen 3
LoadFont 2,"topaz.font",8
Use IntuiFont 2
;On déclare nos variables...
;...codées sur un mot en prévision d'évolutions futures (word ; 16 bits)
chiffre_un.w=0
chiffre_deux.w=0
;...codées sur 32 bits (long)
resultat.l=0
;Voici (re)venir la GadgetList numéro 0
;On prépare les boutons +, -, * et /
GTButton 0,1,10,0,40,15,"+",$10
GTButton 0,2,10,20,40,15,"-",$10
GTButton 0,3,10,40,40,15,"*",$10
GTButton 0,4,10,60,40,15,"/",$10
;On prépare les deux zones de saisie qui acceptent désormais 2 chiffres
GTString 0,5,80,20,40,15,"",$10,2
GTString 0,6,80,40,40,15,"",$10,2
;On ouvre le fenêtre numéro 0 et on en fait la sortie par défaut
Window 0,0,14,320,120,$140e,"Un peu d'ASM 68k avec le Blitz",-1,-1
DefaultOutput
;On attache la GadgetList numéro 0 à la fenêtre numéro 0
AttachGTList 0,0
Use Window 0
;Boucle principale du programme
While ev.l<>$200
;On récupère les évènements qui se produisent dans la fenêtre du logiciel
ev.l=Event
WindowOutput 0
;Si on clique sur un bouton
;et que l'on a bien saisi deux chiffres
If (GTGetString(0,5)<>"") AND (GTGetString(0,6)<>"")
AND (Len(GTGetString(0,5))<3) AND (Len(GTGetString(0,6))<3)
If ev.l=64
;Si on clique sur le bouton +
If GadgetHit=1
;Nos zones de saisie contenant de la chaîne de caractères
;on doit les transformer en chiffres avec la fonction VAL()
chiffre_un.w=Val(GTGetString(0,5))
chiffre_deux.w=Val(GTGetString(0,6))
;On met tout le registre processeur D0 à 0
CLR.l d0
;On met le contenu de la variable entière codée sur
;un word nommé CHIFFRE_UN dans le registre de données D0 du 68000
GetReg d0,chiffre_un.w
;Même traitement pour D1, il ne faut pas qu'il reste de cochonneries dedans
CLR.l d1
GetReg d1,chiffre_deux.w
;On ajoute les 16 bits de poids faible de la valeur contenue dans le registre
;D0 à celle contenue dans D1 et on stocke le résultat dans D1
ADD.w d0,d1
;On transfère le contenu de D1 dans la variable entière codée sur 32 bits
;nommée RESULTAT
PutReg d1,resultat.l
;On positionne le curseur de texte dans la fenêtre
WLocate 10,100
Print Str$(chiffre_un.w)+" + "+Str$(chiffre_deux.w)+" = "+Str$(resultat.l)+" "
EndIf
;Si on clique sur le bouton -
If GadgetHit=2
chiffre_un.w=Val(GTGetString(0,5))
chiffre_deux.w=Val(GTGetString(0,6))
CLR.l d0
GetReg d0,chiffre_un.w
CLR.l d1
GetReg d1,chiffre_deux.w
SUB.w d1,d0
;C'est à partir d'ici que les choses changent
;On teste l'état du bit numéro 15 (le 16e bit donc ; ils sont numérotés de
;droite (0) à gauche (15)) du registre de données D0 du 68000
BTST #15,d0
;Si le 16e bit (aussi appelé "bit de poids fort", car c'est lui qui a la plus
;forte influence sur la valeur décimale codée) est égal à zéro
;cela signifie que le nombre placé dans D0 est positif (les nombres négatifs
:sont codifiés en utilisant la méthode du complément à deux ; voir le cours
;de Krabob à ce sujet)
;sachez juste que je procède de cette manière, car en complément à deux, les
;nombres négatifs commencent toujours par un 1.
;L'instruction 68000 BNE signifie Branch if Not Equal. Ici, on saute au label
;NEGATIF si le résultat de BTST est différent de 0 (donc 1)
BNE NEGATIF:
;L'instruction 68000 BEQ signifie Branch if Equal. Ici, on saute au label
;POSITIF si le résultat de BTST est 0
BEQ POSITIF:
NEGATIF:
;Si on a affaire à un nombre négatif, on inverse la procédure de codage en
;complément à deux
;On inverse donc les 16 premiers bits du registre D0 (les bits de poids faible,
;ceux qui sont le plus à droite)
NOT.w d0
;On ajoute 1 à D0 pour achever la manipulation
;On se retrouve donc avec le chiffre réel en positif
ADD.w #1,d0
PutReg d0,resultat.l
WLocate 10,100
Print Str$(chiffre_un.w)+" - "+Str$(chiffre_deux.w)+" = -"+Str$(resultat.l)+" "
;Si mes souvenirs sont bons, l'instruction BRA n'est pas à proprement parler une
;instruction native 68000, il s'agit plus d'une macro
;BRA = Branch Anyway
;Donc quoi qu'il arrive, on saute au label FIN
BRA FIN:
POSITIF:
PutReg d0,resultat.l
WLocate 10,100
Print Str$(chiffre_un.w)+" - "+Str$(chiffre_deux.w)+" = "+Str$(resultat.l)+" "
FIN:
EndIf
;Si on clique sur le bouton *
If GadgetHit=3
chiffre_un.w=Val(GTGetString(0,5))
chiffre_deux.w=Val(GTGetString(0,6))
CLR.l d0
GetReg d0,chiffre_un.w
CLR.l d1
GetReg d1,chiffre_deux.w
MULU.w d0,d1
PutReg d1,resultat.l
WLocate 10,100
Print Str$(chiffre_un.w)+" * "+Str$(chiffre_deux.w)+" = "+Str$(resultat.l)+" "
EndIf
;Si on clique sur le bouton /
If GadgetHit=4
chiffre_un.w=Val(GTGetString(0,5))
chiffre_deux.w=Val(GTGetString(0,6))
CLR.l d0
GetReg d0,chiffre_un.w
CLR.l d1
GetReg d1,chiffre_deux.w
DIVU.l d1,d0
PutReg d0,resultat.l
WLocate 10,100
Print Str$(chiffre_un.w)+" / "+Str$(chiffre_deux.w)+" = "+Str$(resultat.l)+" "
EndIf
EndIf
EndIf
Wend
DetachGTList 0
Free Window 0
End
====== FIN SOURCE
|