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 de l’utilisateur
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4411
Inscription : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: Mes débuts en assembleur

Message par charognard » 20 mars 2016 09:47

Une petite subtilité cependant.
Le jump relatif et celui absolu.
Dans un cas le programme est relogeable dans l'autre non

Avatar de l’utilisateur
phe78
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 749
Inscription : 22 avr. 2011 19:08
Localisation : Var

Re: Mes débuts en assembleur

Message par phe78 » 21 mars 2016 11:26

charognard a écrit :Une petite subtilité cependant.
Le jump relatif et celui absolu.
Dans un cas le programme est relogeable dans l'autre non
c'est vrai, et les sauts relatifs sont sur les machines 8 bits codés sur un octet, donc des déplacements limités à +- 127 bytes. ils sont aussi généralement plus courts (1 byte de moins que les sauts absolus) et donc un peu plus rapides.

tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 743
Inscription : 06 oct. 2012 14:37

Re: Mes débuts en assembleur

Message par tyann » 22 mars 2016 01:14

Bonsoir

Oui j'ai bien vu dans le tuto qu'il existait JR qui était optimisé par rapport
à JP, mais était limité à +- 128 octets de distance de saut.
Donc d'après phe78 JR serait en relatif et JP en absolu.
Pourtant JP renvoie vers un label donc théoriquement en relatif.
Après tout dépend comment cela est compilé, je suppose que JR est codé en +- xxx octets
alors que JP est codé sur une adresse absolue ?
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) 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, El 5120, 9200, 9600

Canon X-07

Avatar de l’utilisateur
kweeky
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1627
Inscription : 05 oct. 2007 19:46
Localisation : Pas très loin de Bordeaux

Re: Mes débuts en assembleur

Message par kweeky » 22 mars 2016 08:40

Salut

JP renvoie vers un label placé à un endroit précis du listing assembleur. Et donc à une certaine adresse donnée: c'est donc bien de l'adressage absolu. A savoir que tu peux aussi utiliser un label avec JR: lors de l'assemblage, la valeur du saut relatif sera calculée en fonction de l'adresse du label et de l'adresse de l'instruction JR... Sauf si l'écart entre les deux est trop grand -> erreur à l'assemblage.

@+

Avatar de l’utilisateur
Forthman
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 172
Inscription : 03 juin 2009 06:51
Localisation : Castelsarrasin (82)

Re: Mes débuts en assembleur

Message par Forthman » 22 mars 2016 10:27

La programmation Assembleur n'est pas difficile, il n'y a que quelques instructions
dont la syntaxe est plutôt claire.
Une fois qu'on a bien assimilé le fonctionnement d'un processeur c'est même plutôt
grisant, on a l'impression de pouvoir faire ce que l'on veut de la machine :twisted:

Et puis... on est confronté aux périphériques... et là, si on manque de doc ça devient
très vite compliqué :cry:

Je ne sais pas comment c'est sur la TI, j'espère que tu as de la doc qui va bien
Pour la HP28s j'avais "Voyage au centre de la HP28" c'était indispensable :roll:
Ahhh... le Saturn ... ça c'était proc bien chiant à programmer ! :P

tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 743
Inscription : 06 oct. 2012 14:37

Re: Mes débuts en assembleur

Message par tyann » 22 mars 2016 13:49

Bonjour
Une fois qu'on a bien assimilé le fonctionnement d'un processeur c'est même plutôt
grisant, on a l'impression de pouvoir faire ce que l'on veut de la machine
J'en suis sûrement pas là encore, mais c'est vrai que je trouve cela assez plaisant.
Et assez riche même, j'ai effectivement un pdf qui détaille toutes les routines en rom.

Me mettre à l'assembleur ensuite sur d'autres processeurs, 68000, saturn ou arm
via mes Ti89, hp 28/48 ou hp 50, me plairait aussi, malheureusement les docs ou tutos
en français se font plutôt rare.
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) 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, El 5120, 9200, 9600

Canon X-07

Avatar de l’utilisateur
Forthman
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 172
Inscription : 03 juin 2009 06:51
Localisation : Castelsarrasin (82)

Re: Mes débuts en assembleur

Message par Forthman » 22 mars 2016 14:50

un bouquin sympa sur les vieilles consoles et les techniques de programmation :
"Machines de Jeux" de Guillaume Poggiaspalla

Pas très technique mais sympa à lire pour se faire une idée de l'ingéniosité des programmeurs
de l'époque :tongue:

tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 743
Inscription : 06 oct. 2012 14:37

Re: Mes débuts en assembleur

Message par tyann » 26 mars 2016 11:15

Bonjour
Voici donc mon premier vrai programme en asm.
Il s'agit d'un softmenu utilisable en basic comme sur Ti 85,86.
Chaque touche est définie par 4 caractères, il y a 5 touches de fonctions.
On stock ces carctères dans Str1, une variable réservée aux chaines, il y en a 10 (Str0...Str9)
exemple: "JOUEOPTNQUITHELP" ->Str1
donnera : F1:JOUE F2:OPTN F3:QUIT F4:HELP
On récupère ensuite le n° de la touche choisie dans la variable X.
On peut quitter le menu avec la touche CLEAR, X renvoie alors 0
Dans cet exemple F5 sera sans effet comme les autres touches à part 2nd OFF.
Après avoir initialiser Str1 on appelle un programme basic qui lui appellera le programme en asm
après avoir vérifié que Str1 n'est pas vide et que sa longueur est un multiple de 4.
Le voici :

Code : Tout sélectionner

SOFTMENU
length(str1)->X
If X>0 and fpart(X/4)=0
Then
Asm(prgmSFMENU)
Else
" "->Xmin REM sinon erreur
End

Code : Tout sélectionner

#include "ultimate.inc"
icol = saferam4
opt = saferam4+1
optm = saferam4+2
	res 5,(iy+0); annule DONE
	set 2,(iy+43);fullscreen
	ld a,1
	ld (icol),a
	call comenu
	bcall(_clearrect)
readstr:
	ld hl,strname
	bcall(_mov9toop1)
	bcall(_findsym) ; adresse du contenu str dans de
	ld h,d
	ld l,e	;       mise dans hl
	bcall(_ldhlind) ; taille str1 dans hl
	ld a,l
	sra a
	sra a  ; taille divisée par 4
	inc a  ; option max +1 dans optm
	ld (optm),a
	ld a,l
	ex de,hl ; adresse str1 ->hl
	inc hl
	inc hl
	ld de,menu ;adresse menu dans de
cpy:
	ld bc,4
	ldir   ; copie depuis hl vers de bc octets
	inc de ; on passe le zéro de fin de chaîne
	sub 4
	cp 0
	jr nz,cpy
	ld hl,menu
aff:
	ld a,(icol)
	ld (pencol),a
	add a,19
	cp 115   ; si on affiché 5 titres
	jp z,inv ; branchement vers inv
	ld (icol),a
	ld a,57
	ld (penrow),a
	bcall(_vputs)
	jp aff	
inv:
	call comenu
	bcall(_invertrect)  ; affichage en blanc sur fond noir
fin:
	bcall(_op1set0) ; mise à 0 de op1
	bcall(_getkey)
	cp kclear
	jr z,quit ; branchement à quit si touche clear op1 contien n° option choisie
	ld (opt),a
	bcall(_plus1) ; incrément de op1=1
	ld a,(opt)
	cp kyequ
	jr z,quit  ; branchement à quit si touche Y= op1 contien n° option choisie
	bcall(_plus1) ;2
	ld a,(opt)
	cp kwindow
	jr z,quit
	bcall(_plus1) ;3
	ld a,(opt)
	cp kzoom
	jr z,quit
	bcall(_plus1) ;4
	ld a,(opt)
	cp ktrace
	jr z,quit
	bcall(_plus1) ;5
	ld a,(opt)
	cp kgraph
	jr z,quit
	jp fin
quit:
	ld a,(optm) ; option max+1 dans a
	bcall(_setxxop2) ;met a dans op2
	bcall(_cpop1op2) ; compare op1 et op2
	jp z,fin ; si on est egal
	jp nc,fin ;ou superieur à option max+1 on ignore la touche
	bcall(_stox) ;sinon stockage op1 dans X
	call comenu
	bcall(_clearrect)  ; effacement du menu
	set 5,(iy+0);remet DONE
	res 2,(iy+43);annule fullscreen
	ret
comenu:
	ld h,57 ;coordonnées graphiques du menu
	ld l,0
	ld d,63
	ld e,95
	ret
strname:
.db strngobj,tvarstrng,tstr1,0,0

menu:
.db "    ",0,"    ",0,"    ",0,"    ",0,"    ",0
.end
Voilà ce programme est loin d'être parfait, on pourrait sauvegarder l'écran avant l'affichage
du menu puis le restaurer ensuite, ici les 8 dernières lignes de pixels sont détruites.
Seules les lettres et chiffres sont affichées correctement.
Je pourrai continuer ainsi à l'amélioré et à m'améliorer en assembleur
Programmer en assembleur et interagir avec le basic est pour moi très intéressant.
Ce sera mon dernier post concernant ma découverte de l'assembleur, si cela vous a donné envie tant mieux.
Si vous avez des questions, des remarques n'hésitez pas.
Merci de m'avoir suivi.

PS: Un grand merci à Epharius pour son aide concernant le codage différent des chaînes entre l'assembleur et le basic.
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) 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, El 5120, 9200, 9600

Canon X-07

Répondre

Revenir vers « Tous les Pockets »