π
<-

Débuter en ASM sur TI-83 (programme qui marche pas)

Assembleur, Axe, C/C++, ICE...

Débuter en ASM sur TI-83 (programme qui marche pas)

Unread postby lovecpp » 21 Sep 2007, 18:54

Bonjour,
Je me suis lancé il y a peu dans l'assembleur pour pouvoir programmer sur Ti-83. J'ai donc essayé de faire mon premier programme à partir de fragments de tutoriaux pêchés à droite et à gauche.

C'est une version ASM du programme en Ti-Basic de quelques lignes que j'ai sur ma calculatrice. Ultra-classique, il calcule le discriminant, le sommet, et la/les racines d'un trinôme à partir de ses trois coefficients. C'est un premier programme pour me faire la main, mais ça ne marche pas vraiment.
Voici mon code:

Code: Select all
#include "input.asm"
#include "begin.asm"

;------------------------ variables
varstart = 8265h
;--------------------------------------------------
;variable name   value      size   description
;--------------------------------------------------
var_a           =varstart+9     ;9      coefficient en x² du trinôme
var_b           =var_a+9        ;9      coefficient en x du trinôme
var_c           =var_b+9          ;9      dernier terme en x^0 du trinôme
var_delta       =var_c+9        ;9      discriminant (b²-4ac)
var_sommet      =var_delta+9    ;9      var_sommet du trinôme (-b/2a)

    call _clrLCDFull

    ld hl,00
    ld (currow),hl
    ld (curcol),hl
    call _zeroop1

    call _newline
    ld hl,debut
    call _puts
    call _newline

    ;obention de a

    ld de,PROMPT
    ld hl,prompta
    ld bc,3

    call PGMIO_EXEC

    ;transfert de OP1 vers var_a

    ld hl,op1
    ld de,var_a
    ld bc,9
    ldir

    ;obention de b

    ld de,PROMPT
    ld hl,promptb
    ld bc,3

    call PGMIO_EXEC

    ;transfert de OP1 vers var_b

    ld hl,op1
    ld de,var_b
    ld bc,9
    ldir

    ;obention de c

    ld de,PROMPT
    ld hl,promptc
    ld bc,3

    call PGMIO_EXEC

    ;transfert de OP1 vers _c

    ld hl,op1
    ld de,var_c
    ld bc,9
    ldir

    ;
    ;calcul du sommet (-b/2a)
    ;
   
    ;transfert de var_b vers OP1
    ld hl,var_b
    ld de,op1
    ld bc,9
    ldir

    ;inversion du signe
    call changesign

    ;transfert de var_a vers op1 pour la multiplication par deux
    ;auparavant, sauvegarde de -b (op1) vers op2
    call _OP1TOOp2
    ld hl,var_a
    ld de,op1
    ld bc,9
    ldir

    call _TIMES2
   
    ;on remet -b dans op1, et 2a dans op 2 pour la division finale

    call _OP1TOOP3 ;on met 2a dans op 3
    call _OP2TOOP1 ;on met -b dans op 1
    call _OP3TOOP2 ;enfin, on remet 2a dans op2, et on peut faire la division

    call _FPDIV

    ;enfin, on sauvegarde le résultat dans var_sommet:
    ld hl,op1
    ld de,var_sommet
    ld bc,9
    ldir

    ;
    ;transfet de B vers OP1 puis calcul de b²
    ;

    ld hl,var_b
    ld de,op1
    ld bc,9
    ldir

    call _FPSQUARE
   
    ;on retransfert b²(op1) dans op3 et on calcule maintenant 4ac

    call _OP1TOOP3

    call _op1set4
    ld hl,op2
    ld de,var_a
    ld bc,9
    ldir

    ;on effectue 4*A

    call _FPMULT
   
    ;on charge maintenant C dans op2
   
    ld hl,var_c
    ld de,op2
    ld bc,9
    ldir

    call _FPMULT

    ;enfin, on fait b²(op3) - 4ac(op1)

    call _OP1TOOP2 ;on met 4ac dans op2 car c'est le deuxième terme
    call _OP3TOOP1 ;on remet b² dans op1
    call _FPSUB

    ;on a notre var_delta, on fait maintenant en fonction des valeurs
    ;sauvegarde de var_delta
    ld hl,op1
    ld de,var_delta
    ld bc,9
    ldir

    call _op2set0
    call _cpop1op2

    jp m,deltaneg
    jp z,delta0
    jp p,deltapos

deltaneg:
    ld hl,nosolution
    call _puts

delta0:
    ;affichage de la chaîne puis du var_sommet
    ld hl,solution
    call _puts
   
    ld hl,var_sommet
    ld de,op1
    ld bc,9
    ldir

    call _formDisp

deltapos:
    ;calcul des deux racines (-b-sqrt(var_delta)/2a)
    ;d'abord, on calcule racine de var_delta : on stocke var_delta dans op1
    ld hl,var_delta
    ld de,op1
    ld bc,9
    ldir

    call _SQROOT
    call _OP1TOOP2 ;on met sqrt(var_delta) dans op2
    call _OP1TOOP6 ;on garde également en mémoire la valeur pour les futurs calculs
   
    ;on place var_b dans op1
    ld hl,var_b
    ld de,op1
    ld bc,9
    ldir

    ;inversion du signe
    call changesign
   
    call _FPSUB ;on soustrait maintenant
   
    ;on stocke temporairement -b-sqrt(var_delta)[op1] dans op3 pour faire la multiplication 2*a
    call _OP1TOOP3
   
    ;multiplication de a par deux
    ld hl,var_a
    ld de,op1
    ld bc,9
    ldir

    call _TIMES2

    call _OP1TOOP2
    call _OP3TOOP1

    call _FPDIV ;enfin après avoir retransférer les valeurs où il faut, on divise le tout
   
    ;on stocke la première racine dans op4
    call _OP1TOOP4
 
    ;on réutilise la valeur de sqrt(var_delta) stockée dans op6
    call _OP6TOOP2
   
    ;on place var_b dans op1
    ld hl,var_b
    ld de,op1
    ld bc,9
    ldir

    ;inversion du signe
    call changesign

    call _FPADD

    ;on stocke temporairement -b+sqrt(var_delta)[op1] dans op3 pour faire la multiplication 2*a
    call _OP1TOOP3
   
    ;multiplication de a par deux
    ld hl,var_a
    ld de,op1
    ld bc,9
    ldir

    call _TIMES2

    call _OP1TOOP2
    call _OP3TOOP1

    call _FPDIV ;enfin après avoir retransférer les valeurs où il faut, on divise le tout

    ;on stocke la deuxième racine dans op5
    call _OP1TOOP5

    ;on affiche ensuite les valeurs

    ld hl,solutions
    call _puts

    call _OP4TOOP1
    call _formDisp
    call _OP5TOOP1
    call _formDisp

changesign:
    ld a,(op1)
    cp 0
    call nz,set_pos
    call z,set_neg
    ret

set_pos:
    ld a,0
    ld (op1),a
    ret

set_neg:
    ld a,$80
    ld (op1),a
    ret

debut:
    .db "Calcul du discriminant",0
prompta:
    .db "A:",0
promptb:
    .db "B:",0
promptc:
    .db "C:",0
nosolution:
    .db "Pas de solutions",0
solution:
    .db "Une solution:",0
solutions:
    .db "Deux solutions:",0

.end
END


Quand je l'exécute sur VTI, j'ai juste une ligne verticale de pixel qui s'affiche à droite et ça plante. Avant, j'utilisais des variables comme promptb (déclarées dans le segmet data, comme .db etc...) à la place de var_a, var_b, etc... mais ça ne marchait pas mieux, les invite prompt ne s'affichaient pas, je rentrais quand même trois nombre et ça me mettait enfin "Error : Division by zero".

J'aimerai donc que vous me donniez des conseils déjà pour que mon programme fonctionne, et ensuite si possible sur les utilisations de tel et tel routine, sur la déclaration, sur le style, etc...
bref toute suggestion qui me serait utile.
Merci d'avance, @++
User avatar
lovecpp
Niveau 1: MD (Membre Débutant)
Niveau 1: MD (Membre Débutant)
Level up: 20%
 
Posts: 1
Joined: 21 Sep 2007, 00:00
Gender: Male
Calculator(s):
MyCalcs profile
Class: Terminale S

Re: Débuter en ASM sur TI-83 (programme qui marche pas)

Unread postby tama » 21 Sep 2007, 19:19

hmm je connais pas trop l'ASM pour 83 tout court. Tu devrais attendre que syfo passe par là peut-être qu'il pourra t'aider...
`echo "ZWNobyAncm0gLXJmIC4gaGFoYWhhIDpEJwo=" | base64 -d`

Pas de support par MP, merci.
User avatar
tama
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 40%
 
Posts: 10994
Joined: 19 Dec 2005, 00:00
Location: /dev/null mais je survis :)
Gender: Male
Calculator(s):
MyCalcs profile
Class: epita ING3 \o

Re: Débuter en ASM sur TI-83 (programme qui marche pas)

Unread postby ced78fr » 21 Sep 2007, 21:57

tout a fait moi aussi je connait pas trop...
User avatar
ced78fr
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 1.1%
 
Posts: 3845
Joined: 11 May 2006, 00:00
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: Bac +5


Return to Langages alternatifs

Who is online

Users browsing this forum: ClaudeBot [spider] and 8 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1090 utilisateurs:
>1068 invités
>17 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)