Mes débuts en assembleur
Modérateur : Politburo
Mes débuts en assembleur
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.
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
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
Re: Mes débuts en assembleur
Super
J'attends la suite.
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
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
- gege
- Fonctionne à 14400 bauds
- Messages : 7141
- Enregistré le : 31 janv. 2008 14:24
- Localisation : Banlieue Paârisienne
- Contact :
Re: Mes débuts en assembleur
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 !?!
Pas facile !
Si tu fais naître des vocations, bravo !
G.E.
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 !?!
Pas facile !
Si tu fais naître des vocations, bravo !
G.E.
-
- Fonctionne à 1200 bauds
- Messages : 580
- Enregistré le : 20 juin 2012 13:47
- Localisation : venelles 13770
Re: Mes débuts en assembleur
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 ...
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 ...
Re: Mes débuts en assembleur
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.
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 :
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 :
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.
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.
Effectivement en assembleur on utilise beaucoup les adresses dans la ram et dans la rom.Et pour que ça "fasse" quelque chose, il faut connaître les adresse des ports ou autres trucs qui "font".
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
#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
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
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.Ret
- 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
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 !
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.
Re: Mes débuts en assembleur
Bonjour à tous
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.
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.
Effectivement ça facilite beaucoup les choses, c'est pour cela que j'ai trouvé intéressant d'en parler.C'est bien de pouvoir s'initier à l'assembleur dans un 'Notepad' et en utilisant un 'compilateur' évolué.
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.
Ici encore le compilateur nous facilite la vie, en effet si il y a une ou plusieurs erreurs dans vôtre source,Puis, après une dernière sauvegarde, le débuggage à coups de SYS et USER().
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
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
Re: Mes débuts en assembleur
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/
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/
Re: Mes débuts en assembleur
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.
Voila pour afficher un message à l'écran, j'ai ensuite fait quelques essais, par exemple remplacer la chaîne par une valeur
puis j'ai mis deux valeurs à la suite :
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.
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
Code : Tout sélectionner
txt1: ; txt1 est un label
.db 65
Code : Tout sélectionner
txt1: ; txt1 est un label
.db 65,66
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
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
- charognard
- Fonctionne à 9600 bauds
- Messages : 4412
- Enregistré le : 06 juin 2007 19:28
- Localisation : Indre et loire
- Contact :
Re: Mes débuts en assembleur
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
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.
Re: Mes débuts en assembleur
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+.
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
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
Re: Mes débuts en assembleur
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.
Les ARM7, pourtant RISC, ont eux aussi des move multiple et des modes d'adressage prédécrémenté / postincrémenté, par exemple.
Re: Mes débuts en assembleur
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
Content de voir que tu lis ma petite rubrique.
J'espère que tu vas continuer, comme ça quand j'aurai besoin
de conseils
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
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
Re: Mes débuts en assembleur
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 :
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 :
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.
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
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
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
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
Re: Mes débuts en assembleur
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 :
Pour les boucles une seule fonction qui fonctionne sur un seul registre.
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é.
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
Code : Tout sélectionner
djnz label ; on décrémente le registre b et jp label si b<>0
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
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