1

	.xdef	_ti92plus
	.xdef	_main
	
	.include	"kernel.h"
	
_main:	movea.l	(%sp),%a0
	jmp	(%a0)

Ca plante pas, niveau optimisation c'est génial. Merci PpHd hehe

2

(je sais pas comment tu fais pour supporter la syntaxe ignoble de cet assembleur, perso grin)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3

(l'habitude en fait, au début j'utilisais le --register-prefix-optional, mais maintenant je m'en fous, je tape les registres avec le % naturellement ^^)

4

J'espère juste que tu n'apprendras pas ça comme ça à tes gamins embarrassed
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

5

Et quel est l'intérêt par rapport un rts, à part montrer que PreOs est robuste face à 1. la restauration incorrecte de la pile et 2. les registres détruits (mais bon, s'il ne supportait pas %a0, un registre call-clobbered, étant détruit, ça craindrait)?
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

6

Ximoon -> trisotfl Trop tard, trop tard ... ^^


Kevin, pour ça :
_main:	jsr	pexeclib__0000			|exec main part, pushing &data
	.long	pedrom__printf,kernel__Exec	|system calls

pexeclib__0000:
	movea.l	(%sp)+,%a0				|&Data
	movea.l	(%sp)+,%a1				|return adress of pexec
	move.w	(%sp)+,%d3				|get ARGC
	movea.l	(%sp),%a2				|get ARGV
	lea.l	-STACK_FRAME_SIZE(%sp),%sp		|create stack frame
	movea.l	%sp,%fp					|set frame pointer

Plus la peine d'aller chercher à x(%sp) les arguments, donc c'est plus court comme ça. La pile est recouverte par le stack frame dans tout le programme, mais c'est pas grave. smile
D'autant plus que je leak une taille variable et indéterminée (mais limitée) de pile dans le programme, mais je m'en fous, PreOS fait bien son boulot. love

7

A ne pas utiliser sur une autre plate-forme (mais ça, tu en étais déjà parfaitement conscient) trinon
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

8

Ni sur AMS trioui

9

Je ne comprends toujours pas ce que tu nous ponds. confus Tu nous places l'adresse de retour dans %a0 et tu y sautes, quel rapport avec le snippet du ./6?
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

10

Le code du ./1 n'est qu'un exemple, un test case.

Dans le programme global, je lis les arguments dont j'ai besoin sur la pile, dont l'adresse de retour que je stocke dans mon stack frame. A la fin, je lis cette adresse et j'y fais un jmp. Je gagne pour aller lire les arguments sur la pile : pas de offset(an), mais des (an) directement, -2 octets à chaque fois.

11

(Merci Zerosquare : #pointzeph#)

Petit trick du moment :
	movem.l	d3-d5/a2-a3,-(sp)
...
	;-----------------------------------------------------------------------
	;	20 bytes have been pushed on the stack
	;	- 8 bytes are popped with addq
	;	- 12 bytes are popped by trashing d0-d2
	;-----------------------------------------------------------------------
	addq.l	#8,sp
	movem.l	(sp)+,d0-d5/a2-a3
	rts
Et voilà comment popper plus de 8 octets de pile en deux octets. smile

12

Et tu as économisé 2 octets en rendant ton code illisible. tongue
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

13

Arrête, c'est admirablement commenté dans un anglais on ne peut plus académique embarrassed

14

2 octets de moins, mais combien de cycles en plus ? tongue
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

15

Folco (./11) :
Petit trick du moment :
	movem.l	d3-d5/a2-a3,-(sp)
...
	;-----------------------------------------------------------------------
	;	20 bytes have been pushed on the stack
	;	- 8 bytes are popped with addq
	;	- 12 bytes are popped by trashing d0-d2
	;-----------------------------------------------------------------------
	addq.l	#8,sp
	movem.l	(sp)+,d0-d5/a2-a3
	rts
Et voilà comment popper plus de 8 octets de pile en deux octets. smile

Je propose:
movem.l d3-d5/a2-a3,-(sp) ... ;----------------------------------------------------------------------- ; 20 bytes have been pushed on the stack ; - 8 bytes are popped with addq ; - 12 bytes are popped by trashing d0-d2 ;----------------------------------------------------------------------- movem.l d0-d2,-(sp) movem.l (sp)+,d0-d5/a2-a3 rts trigic
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

16

grin

Zerosquare -> sûr, mais on a pas toujours besoin de vitesse hehe

17

(je n'ai fait aucun calcul ceci dit mon code est probablement incorrect, j'ai juste eu envie de consommer encore plus de cycles grin)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

18

en ARM on fait:
func:
push lr
(bidouille)
pop pc
mignon aussi love

19

Tiens c'est rigolo, je ne vois pas de spécification de longueur dans tes instructions
Et sinon, il veut dire quoi le "pc" du pop ? "sp" j'aurais compris, mais "pc" ça fait plus "program counter".

20

C'est le PC oui en effet, et pas de spécification de longuer parceque un ARM ne lit et ecrit que des mots de 32bit en mode ARM, et 16bit en mode thumb.
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

21

Ok, mais alors "pop pc", ça veut dire quoi ? Ca pop ce qu'il y a sur la pile dans pc, ça ferait donc un rts ?

22

Oui, le rts n'existe pas.

23

Ok, marrant smile

24

(Et au passage, LR c'est link register, je viens de vérifier vu que c'est un peu loin dans mes souvenirs — http://www.keil.com/support/man/docs/armasm/armasm_dom1359731145503.htm)

25

Un équivalent de link/unlk du 68k donc, merci bien. smile

26

ça me rappelle qu'il faudrait que je commence à apprendre l'ARMv7, je m'étais offert la doc au début d'un vap0rware d'émulateur GBA, j'aimais bien la simplicité grin

27

en fait en ARM quand tu fais un call ca fait

pc actuel -> lr (LINK register)
puis
destpc -> pc

si t'as pas d'appels supplémentaires tu peux juste faire mov pc,lr pour retourner a la fin
mais en général une routine generee va pusher le PC de retour (LR) puis popper PC

L'arm fait beaucoup de raccourcis dans ses codages

et SURTOUT c'est une archi load/store, donc ses instructions habituelles ne causent QUE avec des registres. impossible d'ajouter ou mov entre méḿoire et registre, juste des registres.

add rdest,rsrc1,rsrc2

les load et store se font avec des instructions dédiées
ldr/str pour des mots de 32 bits
ldrw/strw pour des mots de 16 bits
ldrb/strb pour des mots de 8 bits
et ldm/stm (avec des options incrémentations d'index) pour les load/store multiples, pas seulement a destination de sp d'ailleurs.

en mode ARM chaque instruction a une taille de 32 bits, peu efficace, mais chaque instruction peut être rendue indépendamment conditionnelle.

en mode THUMB chaque instruction a une taille de 16 bits et ne peut utiliser que la moitié des registres
Thumb contient donc des instructions de chargement des registres inaccessibles normalement
Il y a aussi le Thumb 2 qui a des instructions de 16 ou 32 bits pour faciliter le codage
un bit du SR donne le mode actuel
En mode ARM, le PC est aligné sur 2 (finit par zéro), et sauter a un PC impair switche en mode thumb (pour lequel le PC est toujours aligné sur 2, mais le LSB est à 1 pour indiquer le mode thumb.

Et dans tous les modes charger des constantes était chiant avant le thumb2 qui a movw et movt pour charger 32 bits en 2 instructions.

28

Ca a l'air mignon tout ça. smile

29

30

Franchement faire de l'ARM c'est sympa grin