Les sauts conditionnelles et saisie d'une touche

Attention les enfants leçon très importante. Nous allons voir des commandes absolument nécessaire pour tout prgm qui se respecte.

saisie d'une touche :

_getkey : attend qu'une touche soit pressée et renvoie le code correspondant ds le registre a. Regardez à la fin de cette leçon pour les codes correspondants.
_getky : équivalent de la commande getkey en basic. Retourne le code de la touche dans Op2 (voir leçon suivante). Voyez votre manuel de ti pour les codes des touches.

La commande _getkey autorise à changer les contrastes, éteindre la calculatrice, se mettre en mode 2nd ou Alpha
la commande _getky est très utile pour un jeu par exemple mais à l'inconvénient de reduire la durée de vie des batteries.

comparaison  :

cp : cp permet d'effectuer une comparaison.

exemple :

cp 121 : compare 121 et a.
cp b : compare a et b
call _cphlde : compare hl et de

Le problème qui se pose maintenant est de savoir comment utiliser cette comparaison. En fait lorsque la comparaison s'effectue, le nbre ou le registre qui suit est soustrait de a. Donc si le résultat est 0, les deux nbres sont égaux et inversement. Mais cp indique aussi si le résultat est positif, négatif, paire, impaire. Ces résultat sont stockés dans le registre f, on dit aussi que le "flag" est mis à jour

C'est à ce moment qu'interviennent les sauts conditionnels. Ce sont des commandes qui suivant la condition qui les suit vont sauter jusqu'à une portion de code et l'exécuter. Il s'agit de jr et jp

Un petit programme exemple :

    ....début standard..........
    call _clrlcdfull
    call _homeup
    ld a,4
    ld b,2
    cp b ;soustrait b de a
    jp p,positive ;si le résultat est positif on saute jusqu'au label positif
    jp m,minus ; la même chose mais pour le résultat négatif
positive:
    ld hl,$0404
    ld (currow),hl
    ld hl,message1
    call _puts
    ret
minus:
    ld hl,$0404
    ld (currow),hl
    ld hl,message2
    call _puts
    ret
message1:
    .db "positif",0
message2:
    .db "negatif",0
.end
END

Dans ce programme, la ti affichera positif  (4-2=2), amusez-vous à changer les valeurs de a et b et de changer les conditions (par exemple pour zero : z et diff de zero : nz)

jr et jp ne sont pas les seules commandes conditionels. Voyez ce petit tableau

jp       C    NC    Z    NZ    PE    PO    M    P
jr        C    NC    Z    NZ
call     C    NC    Z    NZ    PE    PO    M    P
ret      C    NC    Z    NZ    PE    PO    M    P

z : zéro, nz : non zéro, pe : impaire, po : paire, m : négatif, p : positif

Je devine votre question : et pour Le C et NC? Là, c'est un peu plus compliqué.

Lors des opérations mathématiques, il arrive que le résultat de l'opération soit codé sur un nombre supérieur de bits. le bit en trop est placé dans C. C'est tout ce que je pourrais vous dire, si quelqu'un pouvais m'aider sur ce sujet.

Attention, il y a une différence entre jp et jr. Lorsque le programme est compilé, tasm indique de combien d'octets, il faut avancer ou reculer pour atteindre le label. Jr ne peut effectuer des sauts sup à 128 octets, jp n'a pas de limite. Par contre en utilisant jr, le programme sera plus rapidement compilé et prendra moins de place.

Call permet aussi d'appeler un label sans faire de saut.

..début standard.......

    call lbl ; appelle le label lbl1
    call _clrlcdfull
    call _homeup
    ret
lbl1:
    ld hl,$0202
    ld (currow),hl
    ld hl,str1
    call _puts
    ret
str1:
    .db "ASMTI8X",0
.end
END

le ret à la fin du label lbl1 indique à la ti qu'il faut revenir du label et continuer les instructions qui suivent. Attention si vous effectuer un saut (jp,jr) jusqu'à ce label le programme se terminera car il y a un ret.

Codes des touches : extrait de la doc de texas
----------
1er fonction
-------------
kDown    04h    | kClear    09h    | kLParen     85h| kLN    BFh
kLeft    02h    | kCos    B9h    | kLOG    C1h
kRight    01h    | kChs    8Ch    | kPrgm    20h    | kSQUARE    BDh
kUp    03h    | k3    91h    | kStat    31h    | kINV    B6h
k6    94h    | k0    8Eh    | kMATH    32h
k9    97h    | k1    8Fh
kRParen    86h | k4    92h    | kGRAPH    44h
kTan    BBh    | k7    95h    | kTRACE    5Ah
kEnter    05h    | kVARS    35h    | kCOMMA    8Bh    | kZOOM    2Eh
kAdd    80h    | kSin    B7h    | kWINDOW    48h
kSub    81h    | kDecPnt    8Dh    | kMATRIX    37h    | kYEQU    49h
kMul    82h    | k2    90h    | kVarx    B4h|
kDiv     83h    | k5    93h    | kMODE    45h
kExpon    84h    | k8    96h    | kStore    8Ah    | kDEL    0Ah

2nd
-------------
kDown    04h    | KCLEAR    09h    | kLBRACE    ECh    | kEXP    C0h
kBOL    0Eh    | kACos    BAh    | kALOG    C2h
kEOL    0Fh    | kANS    C5h    | kDRAW    2Fh    | kSQRT    BEh
kUp    03h    | kL3A    F5h    | kLIST    3Ah    | kFIN    3Ch
kL6A    F8h    | kCATALOG    3Eh    | kTEST    33h
kWNA    FBh    | kL1A    F3h|
kRBracE    EDh    | kL4A    F6h    | kTABLE    4Ah
kATan    BCh    | kUNA    F9h    | kCALC    3Bh
kLastEnt    0Dh    | kDIST    38h    | kEE    98h    | kFORMAT    57h
kMem    36h    | kASin    B8h    | kTBLSET    4Bh
kRBRACK    88h    | ki    EEh    | kANGLE    39h    | kSPLOT    30h
kLBRACK    87h    | kL2A    F4h    | kLinkIO    41h|
KCONSTeA    EFh    | kL5A    F7h    | kQuit    40h
kPi    B5h    | kVNA    FAh    | kRecall    0Ch    | kINS    0Bh

alpha :
----------------
kALPHADOWN    08h    | kClear    09h    | kCapL    A5h    | kCapV    AFh
kLeft    02h    | kCapM    A6h    | kCapW    B0h
kRight    01h    | kQUEST    CAh    | kcapN    A7h    | kCapX    B1h
kALPHAUP    07h    | kTHETA    CCh    | kSTAT    31h    | kCapY    B2h
kCapE    9Eh    | kSPACE    99h    | kCapZ    B3h
kCapF    9Fh    | kCapO    A8h|
kCapG    A0h    | kCapP    A9h    | kGRAPH    44h
kCapH    A1h    | kCapQ    AAh    | kTRACE    5Ah
kALPHAENTER    06h    | kVARS    35h    | kCapR    ABh    | kZOOM    2Eh
kQUOTE    CBh    | kCapS    ACh    | kWINDOW    48h
kCapA    9Ah    | kcolon    C6h    | kCapT    ADh    | kYEQU    49h
kCapB    9Bh    | kCapI    A2h    | kVarx    B4h
kCapC    9Ch    | kCapJ    A3h    | kMODE    45h
kCapD    9Dh    | kCapK    A4h    | kCapU    AEh    | kDEL    0Ah
----------------------------------------------------------------------------------------------