1

Comme l'indique le titre, voici mon premier programme en assembleur (excepté une "clrhome" et quelques "Hello world!"). Il tourne sous ion et affiche les formules usuelles d'aires et de volumes.

les liens:
-le programme pour la TI : FORMULES.83p
-la source (voir plus bas) : FORMULES.z80
-le lanceur du compilateur : compiler2.bat
-le compilateur même : spasm.exe
-le fichier include : ion.inc

N'UTILISER QU'AVEC UNE TI82stats, TI82stats.fr, ou TI83(non+)
JE NE SUIS NULEMENT RESPONSABLE DE L'UTILISATION DE CE PROGRAMME (ni bugs possibles, ni punition pour triche, ni autre).


Les versions 2 et trois comportent aussi un programme pour les TI83+.
ATTENTION : il y a une erreure non corigée dans la v2 : il manque le "*pi" dans le volume de la sphère, prennez donc la v3 où ce problème est rectifié.

Voici le code source
	.nolist 
#include "ion.inc" 
	.list 
#ifdef TI83P 
	.org progstart-2 
	.db $BB,$6D 
#else 
	.org progstart 
#endif 
	ret 
	jr nc,start 
	.db "FORMULES",0 
 
start: 
	ld	hl,0
	ld	(currow),hl
	ld	hl,0
	ld	(curcol),hl
	ld	hl,titre1
	call _puts 

	ld	a,7
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,carre
	call _vputs

	ld	a,13
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,rectangle
	call _vputs

	ld	a,19
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,triangle
	call _vputs

	ld	a,25
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,losange
	call _vputs

	ld	a,31
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,disque
	call _vputs

	ld	a,37
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,parallelogramme
	call _vputs

	ld	a,43
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,trapeze
	call _vputs

	ld	a,49
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,cerfvolant
	call _vputs

	ld	a,55
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,sphere
	call _vputs


	call _getkey
	call _clrlcdf

	ld	hl,0
	ld	(currow),hl
	ld	hl,2
	ld	(curcol),hl
	ld	hl,titre21
	call _puts 

	ld	hl,1
	ld	(currow),hl
	ld	hl,4
	ld	(curcol),hl
	ld	hl,titre22
	call _puts 

	ld	a,15
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,cube
	call _vputs

	ld	a,21
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,parallelepipederectangle1
	call _vputs

	ld	a,27
	ld	(penrow),a
	ld	a,4
	ld	(pencol),a
	ld	hl,parallelepipederectangle2
	call _vputs

	ld	a,33
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,prisme
	call _vputs

	ld	a,39
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,cylindre
	call _vputs

	ld	a,45
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,cone
	call _vputs

	ld	a,51
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,pyramide
	call _vputs

	ld	a,57
	ld	(penrow),a
	ld	a,1
	ld	(pencol),a
	ld	hl,boule
	call _vputs

	call _getkey

	ret



titre1: 
	.db"Formules d'aires",0 
carre:
	.db"Carre : A=c*c",0
rectangle:
	.db"Rectangle:A=L*l",0
triangle:
	.db"Triangle:A=(b*h)/2",0
losange:
	.db"Losange:A=(d1*d2)/2",0
disque:
	.db"Disque:A=pi*r*r",0
parallelogramme:
	.db"Parallelogramme:A=b*h",0
trapeze:
	.db"Trapeze:A=(B+b)/2*h",0
cerfvolant:
	.db"Cerf-volant : A=(d1*d2)/2",0
sphere:
	.db"Sphere:4*pi*r*r",0

titre21:
	.db"Formules de",0
titre22:
	.db"volumes",0
cube:
	.db"Cube:V=c*c*c",0
parallelepipederectangle1:
	.db"Parallelepipederectangle:",0
parallelepipederectangle2:
	.db"V=l*L*h",0
prisme:
	.db"Prisme:V=B*h",0
cylindre
	.db"Cylindre:V=pi*r*r*h",0
cone:
	.db"Cone:V=r*r*h*pi/3",0
pyramide:
	.db"Pyramide:V=B*h/3",0
boule:
	.db"Boule:V=4/3*r*r*r",0
.end
Sandro

PS : merci beaucoup à Deeph, Contra et Chikendude sans lequelles je n'aurrait été capable de faire un programme en assembleur.

2

Remplace les "call" par des "bcall" (lorsqu'il s'agit de rom calls) puis rajoute cette ligne dans compiler.bat :
spasm -T -A -DTI83P=TI83P FORMULES.z80 FORMULES.8xp
Et théoriquement ça marche aussi sur 83+ top

Ensuite si tu utilises un registre 16 bit (hl) pour charger des valeurs dans pencol/penrow tu peux optimiser comme ça :
	ld hl,$0701
	ld (pencol),hl
	ld hl,carre
	bcall _vputs

Enfaite comme pencol et penrow sont des octets et que l'adresse de penrow est juste après celle de pencol ça fait exactement la même chose smile

Sinon tu peux insérer des caractères spéciaux dans tes textes (cf cette table), par exemple :
cylindre
	.db "Cylindre:V=",$C4,"*r*r*h",0

3

Voici la version 2 avec les amméliorations que tu as proposées:
les liens :
-le programme pour la TI82stats/TI83 : tromb FORMULES.83p
-le programme pour la TI83+ : tromb FORMULES.8xp
-la source (voir plus bas) : tromb FORMULES.z80
-le lanceur du compilateur : tromb compiler2.bat
-le compilateur même : tromb spasm.exe
-le fichier include : tromb ion.inc

la source:
	.nolist 
#include "ion.inc" 
	.list 
#ifdef TI83P 
	.org progstart-2 
	.db $BB,$6D 
#else 
	.org progstart 
#endif 
	ret 
	jr nc,start 
	.db "FORMULES",0 
 
start: 
	ld	hl,0
	ld	(currow),hl
	ld	hl,0
	ld	(curcol),hl
	ld	hl,titre1
	bcall _puts 

	ld	hl,$0701
	ld	(pencol),hl
	ld	hl,carre
	bcall _vputs

	ld	hl,$0D01
	ld	(pencol),hl
	ld	hl,rectangle
	bcall _vputs

	ld	hl,$1301
	ld	(pencol),hl
	ld	hl,triangle
	bcall _vputs

	ld	hl,$1901
	ld	(pencol),hl
	ld	hl,losange
	bcall _vputs

	ld	hl,$1F01
	ld	(pencol),hl
	ld	hl,disque
	bcall _vputs

	ld	hl,$2501
	ld	(pencol),hl
	ld	hl,parallelogramme
	bcall _vputs

	ld	hl,$2B01
	ld	(pencol),hl
	ld	hl,trapeze
	bcall _vputs

	ld	hl,$3101
	ld	(pencol),hl
	ld	hl,cerfvolant
	bcall _vputs

	ld	hl,$3701
	ld	(pencol),hl
	ld	hl,sphere
	bcall _vputs


	bcall _getkey
	bcall _clrlcdf

	ld	hl,0
	ld	(currow),hl
	ld	hl,2
	ld	(curcol),hl
	ld	hl,titre21
	bcall _puts 

	ld	hl,1
	ld	(currow),hl
	ld	hl,4
	ld	(curcol),hl
	ld	hl,titre22
	bcall _puts 

	ld	hl,$0F01
	ld	(pencol),hl
	ld	hl,cube
	bcall _vputs

	ld	hl,$1501
	ld	(pencol),hl
	ld	hl,parallelepipederectangle1
	bcall _vputs

	ld	hl,$1B04
	ld	(pencol),hl
	ld	hl,parallelepipederectangle2
	bcall _vputs

	ld	hl,$2101
	ld	(pencol),hl
	ld	hl,prisme
	bcall _vputs

	ld	hl,$2701
	ld	(pencol),hl
	ld	hl,cylindre
	bcall _vputs

	ld	hl,$2D01
	ld	(pencol),hl
	ld	hl,cone
	bcall _vputs

	ld	hl,$3301
	ld	(pencol),hl
	ld	hl,pyramide
	bcall _vputs

	ld	hl,$3901
	ld	(pencol),hl
	ld	hl,boule
	bcall _vputs

	bcall _getkey

	ret



titre1: 
	.db"Formules d'aires",0 
carre:
	.db"Carr",$96," : A=c",$12,0
rectangle:
	.db"Rectangle:A=L*l",0
triangle:
	.db"Triangle:A=(b*h)/2",0
losange:
	.db"Losange:A=(d1*d2)/2",0
disque:
	.db"Disque:A=",$C4," r",$12,0
parallelogramme:
	.db"Parall",$96,"logramme:A=b*h",0
trapeze:
	.db"Trap",$97,"ze:A=(B+b)/2*h",0
cerfvolant:
	.db"Cerf-volant : A=(d1*d2)/2",0
sphere:
	.db"Sph",$97,"re:4",$C4," r",$12,0

titre21:
	.db"Formules de",0
titre22:
	.db"volumes",0
cube:
	.db"Cube:V=c",$D5,0
parallelepipederectangle1:
	.db"Parall",$96,"l",$96,"pip",$97,"de-rectangle:",0
parallelepipederectangle2:
	.db"V=L*l*h",0
prisme:
	.db"Prisme:V=B*h",0
cylindre
	.db"Cylindre:V=",$C4," r",$D3,"*h",0
cone:
	.db"C",$4A,"ne:V=",$C4," r",$12,"*h/3",0
pyramide:
	.db"Pyramide:V=B*h/3",0
boule:
	.db"Boule:V=4/3*r",$D5,0




Sandro


PS : est-ce que tu pourrait s'il te plaît m'expliquer quelle est la différence entre "call" et "bcall" ?

4

Tu peux faire pareil avec currow/curcol, sauf que cette fois c'est currow qui a son adresse avant celle de curcol :
	ld hl,$0401
	ld (currow),hl
	ld hl,titre22
	bcall _puts

Pour ce qui est du call/bcall, c'est la même chose sur TI 83, d'ailleurs Ion se charge de faire la conversion :
#ifdef	TI83
#define bcall(xxxx)	call xxxx
...

Un bcall est ce qu'on appelle un rom call, c'est à dire un appel à une routine située dans la ROM et non dans la RAM comme avec n'importe quelle routine de ton programme. Voilà quelques explications : http://www.mworld.fr/html/projects/calc/ti-82/tutoriel/progasm/guide/lesson5.html

5

Félicitations ! As-tu un autre projet à faire après ce-ci ?

C'est vrai ce qu'à dit deeph sur CURROW/CURCOL, mais fais attention: HL est un registre 16-bit, ça veut dire qu'il occupe deux octets. Quand tu fais "ld (currow),hl", la calc charge la valeur d'L à CURROW et celle de H à CURROW+1 (il se trouve que cette addresse est CURCOL). Bon, tout est bien, mais quand tu fais "ld (curcol),hl", on charge la valeur d'L à CURCOL et la valeur de H à CURCOL+1. Je ne sais pas ce qu'il y a, ti83plus.inc dit que c'est "curOffset" mais je ne sais pas à quoi il sert.

6

Merci beaucoup, voici donc la v3 (d'ailleur, on vient de me fair remarqué que dans la v2, il manque le "*pi" pour la shère). Elle fait 602 octés:
les fichiers qui changent :
-Le fichier pour les TI83+ : tromb Fichier joint : FORMULES.8xp
-Le fichier pour les TI83/82stats/82stats.fr :tromb Fichier joint : FORMULES.83p
-La source (cf en-dessous) : tromb Fichier joint : FORMULES.z80

Voici la source :
	.nolist 
#include "ion.inc" 
	.list 
#ifdef TI83P 
	.org progstart-2 
	.db $BB,$6D 
#else 
	.org progstart 
#endif 
	ret 
	jr nc,start 
	.db "FORMULES",0 
 
start: 
	ld	hl,$0000
	ld	(currow),hl
	ld	hl,titre1
	bcall _puts 

	ld	hl,$0701
	ld	(pencol),hl
	ld	hl,carre
	bcall _vputs

	ld	hl,$0D01
	ld	(pencol),hl
	ld	hl,rectangle
	bcall _vputs

	ld	hl,$1301
	ld	(pencol),hl
	ld	hl,triangle
	bcall _vputs

	ld	hl,$1901
	ld	(pencol),hl
	ld	hl,losange
	bcall _vputs

	ld	hl,$1F01
	ld	(pencol),hl
	ld	hl,disque
	bcall _vputs

	ld	hl,$2501
	ld	(pencol),hl
	ld	hl,parallelogramme
	bcall _vputs

	ld	hl,$2B01
	ld	(pencol),hl
	ld	hl,trapeze
	bcall _vputs

	ld	hl,$3101
	ld	(pencol),hl
	ld	hl,cerfvolant
	bcall _vputs

	ld	hl,$3701
	ld	(pencol),hl
	ld	hl,sphere
	bcall _vputs


	bcall _getkey
	bcall _clrlcdf

	ld	hl,$0200
	ld	(currow),hl
	ld	hl,titre21
	bcall _puts 

	ld	hl,$0401
	ld	(currow),hl
	ld	hl,titre22
	bcall _puts 

	ld	hl,$0F01
	ld	(pencol),hl
	ld	hl,cube
	bcall _vputs

	ld	hl,$1501
	ld	(pencol),hl
	ld	hl,parallelepipederectangle1
	bcall _vputs

	ld	hl,$1B04
	ld	(pencol),hl
	ld	hl,parallelepipederectangle2
	bcall _vputs

	ld	hl,$2101
	ld	(pencol),hl
	ld	hl,prisme
	bcall _vputs

	ld	hl,$2701
	ld	(pencol),hl
	ld	hl,cylindre
	bcall _vputs

	ld	hl,$2D01
	ld	(pencol),hl
	ld	hl,cone
	bcall _vputs

	ld	hl,$3301
	ld	(pencol),hl
	ld	hl,pyramide
	bcall _vputs

	ld	hl,$3901
	ld	(pencol),hl
	ld	hl,boule
	bcall _vputs

	bcall _getkey

	ret



titre1: 
	.db"Formules d'aires",0 
carre:
	.db"Carr",$96," : A=c",$12,0
rectangle:
	.db"Rectangle:A=L*l",0
triangle:
	.db"Triangle:A=(b*h)/2",0
losange:
	.db"Losange:A=(d1*d2)/2",0
disque:
	.db"Disque:A=",$C4," r",$12,0
parallelogramme:
	.db"Parall",$96,"logramme:A=b*h",0
trapeze:
	.db"Trap",$97,"ze:A=(B+b)/2*h",0
cerfvolant:
	.db"Cerf-volant : A=(d1*d2)/2",0
sphere:
	.db"Sph",$97,"re:4",$C4," r",$12,0

titre21:
	.db"Formules de",0
titre22:
	.db"volumes",0
cube:
	.db"Cube:V=c",$D5,0
parallelepipederectangle1:
	.db"Parall",$96,"l",$96,"pip",$97,"de-rectangle:",0
parallelepipederectangle2:
	.db"V=L*l*h",0
prisme:
	.db"Prisme:V=B*h",0
cylindre
	.db"Cylindre:V=",$C4," r",$D3,"*h",0
cone:
	.db"C",$4A,"ne:V=",$C4," r",$12,"*h/3",0
pyramide:
	.db"Pyramide:V=B*h/3",0
boule:
	.db"Boule:V=4/3*r",$D5,"*",$C4,0
.end


Sandro

PS : @ Chickendude : non je n'ai aucune idée de programme assez simple pour moi pour l'instant ; je suis ouvert à toutes propositions.

7

Bien que ce soit encore optimisable c'est déjà un très bon début en ASM top

Et pour un prochain projet, sans utiliser les sprites, pourquoi ne pas faire quelque chose d'assez simple comme un jeu du plus ou moins ?

8

Ou même pour la V4, faire un ménu avec _getkey et les sauts (jp/jr) pour choisir les formules ?
1. Carre
2. Rectangle
3. Triangle
etc.

9

Merci beaucoup,
là j'essaye de fire simplement un pixel qui ce ballade sur l'écran en fonction de la flèche sur laquelle on appuit. Ensuite je pense que je vais d'abord commencer par l'idée de Deeph.

Merci d'avance
Sandro

PS : comment sait-on s'il faut utiliser jr ou jp (si le label est à plus de 128 octés ou non)?

10

Oui, et jr est plus rapide que jp mais tu ne peux pas faire les même tests (cf http://www.mworld.fr/html/projects/calc/ti-82/tutoriel/progasm/guide/lesson10.html#jumps ).

11

Bon en réalité jr est plus petit (2 octets, 12 t-states) mais jp est en général plus rapide (3 octets, 10 t-states). Mais si tu utilises les conditionnels, il se peut que jr soit plus rapide aussi (si le conditionnel est faux, 7 t-states).

12

merci beaucoup