Mes débuts en assembleur

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Mes débuts en assembleur

Message par tyann »

Bonsoir
Depuis 2 semaines, je passe beaucoup de temps sur ma Ti 83+ à cause
d'un tutoriel trouvé sur le site du zéro : programmation assembleur Z80.
Un tutoriel remarquable pour moi car en français et aussi très détaillé.
J'ai commencé à lire ce tuto et comme un bon livre j'ai eu du mal à le lâcher.
Après avoir téléchargé les logiciels indispensables pour compiler les programmes et les envoyer
à la calculatrice, j'ai fait un essai avec un source donné en exemple le fameux 'hello world'.
Comme tout s'est très bien passé, j'ai donc poursuivi sur ma lancée.
Aujourd'hui je vais donc tenter de vous faire partager mes découvertes, mon ressenti.
(tout en évitant d'essayer de réécrire un tuto, chose dont je serai bien incapable)

Première chose, le code s'écrit dans un éditeur de texte tout simple genre notepad et il faut juste
modifier l'extension du fichier .txt en .z80 pour que le compilateur reconnaisse celui-ci.
Et première surprise pour moi ce compilateur, ne se contente pas de transformer le source en code (compilation)
reconnaissable par le processeur, mais il a été étudié pour nous faciliter la vie.
exemple : un fichier source doit se terminer par .end indiquant au compilateur la fin du source.
Si vous écrivez end ou .End ça ne marche pas, mais avant d'entrer le code de vôtre programme, vous devez
créer un en-tête dans lequel le compilateur reconnaît certains mots clés comme #define
Ainsi si vous écrivez #define end,.end et define END,.end vous signifiez au compilateur qu'il devra remplacer end ou END par .end.
Alors vous pourrez terminer vôtre source par END sans provoquer d'erreur.
C'est comme ci sur la prime vous pouviez écrire en début de listing '#define ik,iskeydown' et ensuite écrire ik à chaque fois que vous avez
besoin d' iskeydown.
Vous verrez par la suite que ceci plus 2 ou 3 autres mots-clés sont très importants pour la programmation en assembleur.

Voilà pour ce soir, n'hésitez pas à me faire part de vos critiques, remarques et questions.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Céline
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 169
Enregistré le : 23 mars 2014 13:11

Re: Mes débuts en assembleur

Message par Céline »

Super :)
J'attends la suite.
TI-30 Galaxy
fx-180P, fx-4000P
HP 11c, 12c, 12c le, 15c, 15c le
HP 32s, 32s ii, 42s, 17b ii, 30b, 35s
HP 28s, 48s, 48sx, 48g, 50g, prime
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Mes débuts en assembleur

Message par gege »

Bonjour,
Ok, je salue le courage, attendons un peu car pour l'instant il manque encore un petit exemple...
L'assembleur c'est un état d'esprit sans doute, je n'ai jamais réussi bien que ce soit très attirant.
On a l'impression qu'on passe son temps à déplacer des octets deci-delà...
Et pour que ça "fasse" quelque chose, il faut connaître les adresse des ports ou autres trucs qui "font".
Voire il faut potasser un copieux nombre de routines quand c'est documenté, ou jouer au Champollion dans la ROM sinon... et on ne sait jamais si on est en train de désassembler du code ou des donnée !?! :evil:
Pas facile !
Si tu fais naître des vocations, bravo !
G.E.
icho
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 580
Enregistré le : 20 juin 2012 13:47
Localisation : venelles 13770

Re: Mes débuts en assembleur

Message par icho »

je n'ai jamais rien compris à l'assembleur
Collection Apple
Apple //, //e, //c, Plus, SE, SE/30, Classic I, II, Color, IIci, IIsi, IIcx, II, IIfx, Quadra 700, LC, I, II, 475, PM 6400, 6500, 7600, 9600, G3 DT, G3 MTower, Cube, G4, G5, iMac G3, G4 15", G4 20" T, 20", 24" , 27" i7, MacPro .

MacPortable, PB Duo 2300C, iBook G3, G4 12" et 14", PB G4 12" et 15" Alu, 15" Ti, MB Pro CD 15", MBP 15", MBP 17", MBP 13".

IWriter I, II, StyleWriter I, II, QuickTake 100, Newtons, etc ...
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Mes débuts en assembleur

Message par tyann »

Bonsoir
Oui excellentes toutes ces remarques, c'est exactement ce que je me disais
avant la lecture de ce fameux tutoriel.
Cela ne veut pas dire que tout cela est derrière moi et que j'ai tout compris maintenant,
mais j'avance, je réussi à faire certaines (petites) choses et ça me plaît, donc poursuivons.
Je vous parlais du compilateur, nous avons #define qui permet de remplacer un texte par un autre.
Il y a aussi .equ qui permet elle de remplacer une valeur par un texte.
Et pour que ça "fasse" quelque chose, il faut connaître les adresse des ports ou autres trucs qui "font".
Effectivement en assembleur on utilise beaucoup les adresses dans la ram et dans la rom.
Petit exemple :
Dans la rom il y a des routines qui font certaines choses comme le dit si bien gege, on appelle ça dans le jargon des romcall.
Pour appeler une romcall il faut connaître son adresse, à l'adresse $4540 de la rom de la Ti 83+ il y a une routine qui efface l'écran.
Pour l'appeler on écrit :

Code : Tout sélectionner

 rst 28h
  .dw $4540 
soit 2 instructions, grâce à #define on peut écrire dans le header :
#define bcall(xxxx),rst 28h\.dw $xxxx.
Dans nôtre code on pourra écrire maintenant
bcall($4540)
car xxxx signifie que l'on peut remplacer ces xxxx par une valeur ou un texte.
Dans le header on pourra écrire
_cls .equ $4540
et alors dans le code au lieu de bcall($4540), nous écrirons bcall(_cls).
Cela donne le code suivant :

Code : Tout sélectionner

#define bcall(xxxx),rst 28h\.dw $xxxx   ; la barre permet de chaîner plusieurs lignes
 _cls .equ $4540                                   ; le point virgule permet d'insérer un commentaire
      bcall(_cls)                                       ; première ligne de code
      ret                                                   ; termine le programme et rend la main au système
.end                                                      ; indique la fin du source
Voilà ce premier programme en assembleur efface l'écran tout simplement.
Si .equ ne vous convient pas vous pouvez écrire #define eq,.equ par exemple et ensuite écrire _cls eq $4540.
Voilà il me restera 2,3 petites choses à vous dire sur le compilateur, puis nous parlerons code.
A bientôt.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Mes débuts en assembleur

Message par C.Ret »

C'est bien de pouvoir s'initier à l'assembleur dans un 'Notepad' et en utilisant un 'compilateur' évolué.

Ca fait longtemps, mais je me souvient qu'à l'époque de mon initiation, le compilateur c'était moi à partir du programme écrit au crayon de papier sur mon bloc-notes.
Instruction par instruction, je chercher le code objet et calculer les adresses, puis venait l'implémentation par un programme en BASIC plein de PEEK, POKE et DATA

Puis, après une dernière sauvegarde, le débuggage à coups de SYS et USER().


Heureusement, les programmes étaient courts, l'environnement bien délimité (Commodore VIC-20) et l'assembleur du 6502 plus simple que celui d'un Z80 !
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Mes débuts en assembleur

Message par tyann »

Bonjour à tous
C'est bien de pouvoir s'initier à l'assembleur dans un 'Notepad' et en utilisant un 'compilateur' évolué.
Effectivement ça facilite beaucoup les choses, c'est pour cela que j'ai trouvé intéressant d'en parler.
Pour en finir avec le compilateur, il y a également l'instruction INCLUDE qui permet de désigner un fichier texte dont l'extension
sera .inc qui sera chaîné à vôtre source.
Dans ce fichier on pourra y mettre ce que l'on mets dans le header : les #define et .equ, au final il n'y aura qu'à sauvegarder ce fichier
une bonne fois pour toute et l'inclure dans vos sources pour ne plus avoir à vous préoccuper du header.
Puis, après une dernière sauvegarde, le débuggage à coups de SYS et USER().
Ici encore le compilateur nous facilite la vie, en effet si il y a une ou plusieurs erreurs dans vôtre source,
il vous renvoie un fichier type excel dans lequel sont signalées les erreurs de compilation.

Petite présentation du z80 pour finir et la prochaine fois nous parlerons programmation.
C'est un microprocesseur 8 bits, il dispose dispose de 8 registres d'une capacité d'un octet : a,b,c,d,e,f,h,l
On peut grouper ces registres par 2 pour avoir une capacité de 16 bits ou 2 octets : af,bc,de,hl
Il faut voir ces registres comme des variables internes au z80, on peut les utiliser pour stocker des valeurs et faire des calculs
mais le z80 les utilise également pour nombre d'opérations.
Ils ont de plus certaines fonctions spécifiques à chacun.
Il y a d'autres registres encore comme ix et iy qui sont 2 registres 16 bits d'indexage, et le registre pc.
Il y a également un pile où l'on peut stocker des valeurs puis les rappeler dans l'ordre inverse.
Voilà pour aujourd'hui.
A bientôt.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
farvardin
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 444
Enregistré le : 18 mai 2009 00:06
Contact :

Re: Mes débuts en assembleur

Message par farvardin »

Merci pour ces retours. J'avais vu ce tuto sur openclassrooms, je l'ai juste survolé mais le sujet m'intéresse (surtout pour faire de la musique sur TI et comprendre les outils disponibles).
Ce forum est sympa et un peu décalé pour voir ce qui se passe dans le monde des TI et du z80: https://codewalr.us/
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Mes débuts en assembleur

Message par tyann »

Bonsoir
Nouvel épisode ce soir, avec un exemple que j'ai également copié
dans le tuto en modifiant juste le texte pour dire.
Il s'agit bien sur d'afficher un petit message à l'écan pour voir comment cela
se déroule.
Pour ce faire nous avons plusieurs routines de disponibles dans la rom, nous
utiliserons _puts qui affiche le contenu de l'adresse stockée dans le registre 16 bits hl.
Cette routine utilise 2 adresses nommée currow et curcol pour postionner le message à l'écran.

Code : Tout sélectionner

#define bcall(xxxx),rst 28h\.dw $xxxx   ; la barre permet de chaîner plusieurs lignes
 _cls .equ $4540
_puts .equ $adresse
currow .equ $adresse
curcol .equ $adresse
      bcall(_cls)                                       ; efface l'écran
      ld a,2                                              ; charge 2 dans le registre a
      ld(currow),a                                    ; charge la valeur de a dans l'adresse désignée par currow
      ld (curcol),a                                    ; idem pour curcol  soit colonne 2 et ligne 2
      ld hl,txt1                                          ; charge dans le registre hl l'adresse du texte à afficher
      bcall(_puts)                                     ; appel la routine d'affichage
      ret                                                   ; termine le programme et rend la main au système
txt1:                                                       ; txt1 est un label
.db "BONJOUR",0                                 ; ,0 indique la fin d'une chaîne.
.end      
Voila pour afficher un message à l'écran, j'ai ensuite fait quelques essais, par exemple remplacer la chaîne par une valeur

Code : Tout sélectionner

txt1:                                                       ; txt1 est un label
.db 65
puis j'ai mis deux valeurs à la suite :

Code : Tout sélectionner

 txt1:                                                       ; txt1 est un label
.db 65,66
Je me suis dit que chaque valeur devait être codée sur un octet, donc en incrémentant hl, je devrais pouvoir
lire la seconde valeur, j'en ai profité pour incrémenter a pour afficher 2 valeurs à 2 endroits différents et ça a marché.
Non sans peine car il faut savoir qu'après un appel à _puts, le registre hl a perdu sa valeur et qu'il faut donc le recharger
avec txt1 avant de l'incrémenter pour lire la seconde valeur.
Voilà depuis j'ai pas mal progressé, j'ai aussi retrouvé sur mon pc un pdf qui détaille toutes les routines de la rom de la ti 83.
Ce qui est un peu compliqué pour moi depuis le début, c'est que souvent les appels de routines détruisent le contenu des registres
et qu'il faut donc être très attentif à cela, la prochaine fois je dirai comment créer des variables.
A bientôt et merci à ceux qui me suivent.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4412
Enregistré le : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: Mes débuts en assembleur

Message par charognard »

Il y a quelques années (et oui ça passe) j'avais fais un comparo BASIC/C/ASSEMBLEUR du même programme (Un casse brique non jouable)
Pour chaque ligne basic tu as les instructions C et assembleur correspondantes (BASIC/C/ASSEMBLEUR Z80 sur SHARP PC 850V)
Possible que cela t'interresse ... Je post
BASIC                                      C                                      Assembleur G850V

Code : Tout sélectionner

                                             10 #define m 65535                                  10      ORG   0100H
                                                                                                 20GRAPH EQU   093CBH
                                                                                                 30      JR    START
--------------------------------------------------------------------------------------------------------------------------
                                             20 int sc, x,y,ox,oy,rx,ry;                         40SC:   DB    0
                                                                                                 50X:    DB    0
                                                                                                 60Y:    DB    0
                                                                                                 70OX:   DB    0
                                                                                                 80OY:   DB    0
                                                                                                 90RX:   DB    0
                                                                                                 100RY:  DB    0
                                                                                                 110PROV:DB    0
                                                                                                 120     DB    0
--------------------------------------------------------------------------------------------------------------------------
10 CLS                                                                                           130START:CALL CLS
--------------------------------------------------------------------------------------------------------------------------
20 LINE (59,0)-(135,30),B                    40  line(59,0,135,30,0,m,1);                        140     LD    HL,59
                                                                                                 150     LD    DE,0
                                                                                                 160     LD    IX,135
                                                                                                 170     LD    IY,30
                                                                                                 180     LD    A,1
                                                                                                 190     LD    B,1
                                                                                                 200     CALL  LINE
--------------------------------------------------------------------------------------------------------------------------
30 LINE (60,0)-(134,3),BF                    50  line(60,0,134,3,0,m,2);                         210     LD    HL,60
                                                                                                 220     LD    DE,0
                                                                                                 230     LD    IX,134
                                                                                                 240     LD    IY,3
                                                                                                 250     LD    A,1
                                                                                                 260     LD    B,2
                                                                                                 270     CALL  LINE
--------------------------------------------------------------------------------------------------------------------------
40 LINE (60,6)-(134,9),BF                    60  line(60,6,134,9,0,m,2);                         280     LD    HL,60
                                                                                                 290     LD    DE,6
                                                                                                 300     LD    IX,134
                                                                                                 310     LD    IY,9
                                                                                                 320     LD    A,1
                                                                                                 330     LD    B,2
                                                                                                 340     CALL  LINE
--------------------------------------------------------------------------------------------------------------------------
50 X=99,Y=10,OX=99:OY=10:RX=-3:RY=2          70 sc=0,x=99,y=10, ox=99,oy=10, rx=-3,ry=2;         350     LD    A,0
                                                                                                 360     LD    (SC),A
                                                                                                 370     LD    A,99
                                                                                                 380     LD    (X),A
                                                                                                 390     LD    (OX),A
                                                                                                 400     LD    A,10
                                                                                                 410     LD    (Y),A
                                                                                                 420     LD    (OY),A
                                                                                                 430     LD    A,-3
                                                                                                 440     LD    (RX),A
                                                                                                 450     LD    A,2
                                                                                                 460     LD    (RY),A
--------------------------------------------------------------------------------------------------------------------------
60 REPEAT                                    80 do{                                              470REP: LD    A,(RY)
--------------------------------------------------------------------------------------------------------------------------
70 X=X+RX:Y=Y+RY                             90      x+=rx;y+=ry;                                480     LD    B,A
                                                                                                 490     LD    A,(Y)
                                                                                                 500     ADD   A,B
                                                                                                 510     LD    (Y),A
                                                                                                 520     LD    A,(RX)
                                                                                                 530     LD    B,A
                                                                                                 540     LD    A,(X)
                                                                                                 550     ADD   A,B
                                                                                                 560     LD    (X),A
--------------------------------------------------------------------------------------------------------------------------
80 IF X<60 OR X>132 LET...                   100    if(x<60|x>132)                               570     CP    60
                                                                                                 580     JR    C,OK1
                                                                                                 590     CP    133
                                                                                                 600     JR    C,SU1
--------------------------------------------------------------------------------------------------------------------------
… RX=-RX:X=X+2*RX                            110       rx=-rx,x+=2*rx;                           610OK1: LD    A,(RX)
                                                                                                 620     XOR   255
                                                                                                 630     ADD   A,1
                                                                                                 640     LD    (RX),A
                                                                                                 650     ADD   A,A
                                                                                                 660     LD    B,A
                                                                                                 670     LD    A,(X)
                                                                                                 680     ADD   A,B
                                                                                                 685     LD    (X),A
--------------------------------------------------------------------------------------------------------------------------
90 IF Y>=30 OR Y=-2 LET …                    120   if(y>=30|y==-2)                               690SU1: LD    A,(Y)
                                                                                                 700     CP    30
                                                                                                 710     JR    NC,OK2
                                                                                                 720     CP    -2
                                                                                                 730     JR    NZ,SU2
--------------------------------------------------------------------------------------------------------------------------
… RY=-RY:Y=OY+RY                             130    ry=-ry;y=oy+ry;                              740OK2: LD    A,(RY)
                                                                                                 750     XOR   255
                                                                                                 760     ADD   A,1
                                                                                                 770     LD    (RY),A
                                                                                                 790     LD    B,A
                                                                                                 800     LD    A,(OY)
                                                                                                 810     ADD   A,B
                                                                                                 820     LD    (Y),A
--------------------------------------------------------------------------------------------------------------------------
100 IF POINT (X,Y) THEN                      140   if (point(x,y)){                              830SU2: LD    A,(X)
                                                                                                 840     LD    E,A
                                                                                                 850     LD    A,(Y)
                                                                                                 860     LD    D,A
                                                                                                 870     CALL  POI
                                                                                                 880     CP    1
                                                                                                 890     JR    NZ,SU3
--------------------------------------------------------------------------------------------------------------------------
110 SC=SC+5                                  150   sc+=5;                                        900     LD    A,(SC)
                                                                                                 910     ADD   A,5
                                                                                                 920     LD    (SC),A
--------------------------------------------------------------------------------------------------------------------------
120 LINE (X,Y)-(X+2,Y+1),R,B                 160   line(x,y,x+2,y+1,1,m,1);                      930     LD    A,(X)
                                                                                                 940     LD    H,0
                                                                                                 950     LD    L,A
                                                                                                 960     ADD   A,2
                                                                                                 970     LD    (PROV),A
                                                                                                 980     LD    IX,(PROV)
                                                                                                 990     LD    A,(Y)
                                                                                                 1000     LD    D,0
                                                                                                 1010     LD    E,A
                                                                                                 1020     ADD   A,1
                                                                                                 1030     LD    (PROV),A
                                                                                                 1040     LD    IY,(PROV)
                                                                                                 1050     LD    A,2
                                                                                                 1060    LD    B,1
                                                                                                 1070    CALL  LINE
--------------------------------------------------------------------------------------------------------------------------
130 Y=Y-RY,RY=-RY :ENDIF                     170  y-=ry,ry=-ry;}                                 1080    LD    A,(RY)
                                                                                                 1090    LD    B,A
                                                                                                 1100    LD    A,(Y)
                                                                                                 1110    SUB   B
                                                                                                 1120    LD    (Y),A
                                                                                                 1130    LD    A,(RY)
                                                                                                 1140    XOR   255
                                                                                                 1150    ADD   A,1
                                                                                                 1160    LD    (RY),A
--------------------------------------------------------------------------------------------------------------------------
140 LINE (X,Y)-(X+2,Y+1),B                   180   line(x,y,x+2,y+1,0,m,1);                      1170SU3: LD   A,(X)
                                                                                                 1180    LD    H,0
                                                                                                 1190    LD    L,A
                                                                                                 1200    ADD   A,2
                                                                                                 1210    LD    (PROV),A
                                                                                                 1220    LD    IX,(PROV)
                                                                                                 1230    LD    A,(Y)
                                                                                                 1240    LD    D,0
                                                                                                 1250    LD    E,A
                                                                                                 1260    ADD   A,1
                                                                                                 1270    LD    (PROV),A
                                                                                                 1280    LD    IY,(PROV)
                                                                                                 1290    LD    A,1
                                                                                                 1300    LD    B,1
                                                                                                 1310    CALL  LINE
--------------------------------------------------------------------------------------------------------------------------
150 LINE (OX,OY)-(OX+2,OY+1),R,B             190   line(ox,oy,ox+2,oy+1,1,m,1);                  1320    LD    A,(OX)
                                                                                                 1330    LD    H,0
                                                                                                 1340    LD    L,A
                                                                                                 1350    ADD   A,2
                                                                                                 1360    LD    (PROV),A
                                                                                                 1370    LD    IX,(PROV)
                                                                                                 1380    LD    A,(OY)
                                                                                                 1390    LD    D,0
                                                                                                 1400    LD    E,A
                                                                                                 1410    ADD   A,1
                                                                                                 1420    LD    (PROV),A
                                                                                                 1430    LD    IY,(PROV)
                                                                                                 1440    LD    A,2
                                                                                                 1450    LD    B,1
                                                                                                 1460    CALL  LINE
--------------------------------------------------------------------------------------------------------------------------
160 OX=X:OY=Y                                200   ox=x;oy=y;                                    1470    LD    A,(X)
                                                                                                 1480    LD    (OX),A
                                                                                                 1490    LD    A,(Y)
                                                                                                 1500    LD    (OY),A
--------------------------------------------------------------------------------------------------------------------------
170 UNTIL SC>200                             210  }while(sc<=200);                               1510    LD    A,(SC)
                                                                                                 1520    CP    200
                                                                                                 1530    JP    C,REP
--------------------------------------------------------------------------------------------------------------------------
180 END                                      220 }                                               1540     RET

Modifié en dernier par charognard le 05 mars 2016 07:43, modifié 4 fois.
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Mes débuts en assembleur

Message par tyann »

Bonsoir
Merci Charo, je pense comprendre presque tout dans la version assembleur, c'est chouette ça.
En ce qui concerne le C, j'avais dégoté il y a quelques années un tuto en Français sur Ti 89,92
de la même qualité que celui que j'ai trouvé pour l'assembleur z80.
J'ai réussi à développer 2 programmes de jeu de carte sur V200, puis j'ai abandonné.
Depuis quelques jours j'ai commencé à regarder l'assembleur sur 68000, je pensais que ce serait plus souple
du fait que le 68000 est plus puissant que le z80, mais cela ne me semble pas le cas, mauvais tuto ?
A+.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
debrouxl
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 125
Enregistré le : 03 mars 2013 09:01

Re: Mes débuts en assembleur

Message par debrouxl »

Le 68000 est en effet bien plus sympa à programmer que le Z80 (et l'eZ80, d'ailleurs), grâce à beaucoup plus de registres, de modes d'adressage et d'instructions avancées (multiplication 16x16->32, division 32/16->16, move multiple, etc.).
Les ARM7, pourtant RISC, ont eux aussi des move multiple et des modes d'adressage prédécrémenté / postincrémenté, par exemple.
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Mes débuts en assembleur

Message par tyann »

Salut Lionel
Content de voir que tu lis ma petite rubrique.
J'espère que tu vas continuer, comme ça quand j'aurai besoin
de conseils :wink:
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Mes débuts en assembleur

Message par tyann »

Bonjour
Me revoilà pour vous parler de variables, car avec les 8 registres
on ne va pas bien loin.
Il y a 4 zones de mémoire disponibles pour créer vos variables.
Elles se nomment saferam1, saferam2 etc... selon la convention.
Elles ont une longueur différente, la plus grande fait 768 octets
et la plus petite 66.
Elles sont bien sûr à déclarer dans le header:

saferam1 .equ adresse
etc...

Ensuite vous pouvez mettre toujours dans le header :

Code : Tout sélectionner

nomvar1=saferam1
nomvar2=saferam1+1; nomvar1 est une variable 8 bits
nomvar3=saferam1+3; nomvar2 est une variable 16 bits
Je n'ai pas essayé, mais je suppose que l'on peut écrire aussi
nomvar3=nomvar2+2

Pour lire et écrire une valeur dans une variable, il faut passer par un registre.
Pour une valeur de un octet, c'est obligatoirement a, pour 2 octets
on peut prendre n'importe quel registre 16 bits sauf af.

Une autre possibilité est d'utiliser un label:

Vous pouvez parfaitement écrire :

Code : Tout sélectionner

	ld a,(var1) ;charger la valeur 0 dans a
	add a,10    ;augmenter a de 10
	ld (var1),a ;charger la valeur de a dans var1
	ret
var1:
.db 0
.end
Une autre possibilité est d'utiliser les OP, il y en a 6.
Ce sont des registres de 11 octets qui peuvent recevoir des nombres réels.
On peut leur affecter une valeur entière prédéfinie, il y a aussi des fonctions mathématiques
qui leur sont applicables sous forme de romcall.

On peut par exemple effectuer une multiplication entre OP1 et OP2, générer un nombre aléatoire entre 0 et 1
dans OP1.
J'ai ainsi réussi à générer un entier aléatoire entre 1 et une borne supérieure.
Il existe une passerelle toujours sous forme de romcall entre ces registres et les variables BASIC, j'ai donc
expérimenté un petit programme basic qui attends une entrée via input, puis appelle un programme en assembleur
qui transfère le contenu de cette variable vers un OP.

J'espère pouvoir vous présenter bientôt un petit programme qui fait quelque chose, pour l'instant j'expérimente
différentes briques.
La prochaine fois je vous parlerai des branchements, boucles et tests.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Mes débuts en assembleur

Message par tyann »

Bonjour

Comme prévu aujourd'hui je vous parle des boucles, tests et routines
en assembleur.

Pour les branchements il y a jp qui équivaut à goto, qui envoi le
programme vers le label spécifié.
Pour les tests, c'est un peu différent du basic, on effectue dans un premier
temps une comparaison entre le registre a et une valeur, en fait c'est une soustraction.
Selon le résultat les bits du registre f sont mis à 0 ou 1.
Dans un second temps on va effectuer une action selon l'état de l'un de ces bits.
jp par exemple peut être dépendant de l'un de ces bits.
Il y a le bit Z qui est mis à 1 quand le résultat de la comparaison est ègale à 0.
Il y a le bit S de signe qui est mis à 1 quand le résultat est positif.
Il y a un bit pour le dépassement de capacité, un pour pair ou impair
Petit exemple concret :

Code : Tout sélectionner

inp:
    bcall(_getkey)	 ; le programme attend l'appui sur une touche
		   le code de cette touche est mis dans a
    cp kclear	 ; kclear contient le code de la touche clear on compare a à ce code
    jp z,effac	 ; si a=code de clear branchement au label efface
    cp kquit	 ; sinon test si a = touche quit
    jp z,quit        ; si a= code de quit
    jp inp            ; sinon on boucle sur attente touche
effac:		 ; label effac 	

quit:


jp s,label       ;fera un branchement si résultat positif
jp nz,label	 ; on peut tester l'inverse ici not zero
Pour les boucles une seule fonction qui fonctionne sur un seul registre.

Code : Tout sélectionner

djnz label  	; on décrémente le registre b et jp label si b<>0
Pour les sous programmes :

call label et label: instructions ......... ret
ici ret agit comme le end sur la 41 il marque la fin d'un sous programme et la fin du programme.

Enfin sachez qu'il est possiblle d'associer une condition à call et ret

call z,label et ret z par exemple .

Voilà, j'ai réussi à mener à bien un petit programme qui sert à quelque chose.
Je vous en parlerai la prochaine fois avec le listing détaillé.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Répondre

Retourner vers « Tous les Pockets »