.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
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
(je sais pas comment tu fais pour supporter la syntaxe ignoble de cet assembleur, perso grin)
avatarZeroblog

« 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
(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 ^^)
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
J'espère juste que tu n'apprendras pas ça comme ça à tes gamins embarrassed
avatarQue cache le pays des Dieux ? - Ximoon's Box - 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.
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)?
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
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é
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
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
A ne pas utiliser sur une autre plate-forme (mais ça, tu en étais déjà parfaitement conscient) trinon
avatarMembre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.
Ni sur AMS trioui
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
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?
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
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é
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.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
(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
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Et tu as économisé 2 octets en rendant ton code illisible. tongue
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
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é
Arrête, c'est admirablement commenté dans un anglais on ne peut plus académique embarrassed
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
2 octets de moins, mais combien de cycles en plus ? tongue
avatarZeroblog

« 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
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
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o
grin

Zerosquare -> sûr, mais on a pas toujours besoin de vitesse hehe
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
(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)
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o
en ARM on fait:
func:
push lr
(bidouille)
pop pc
mignon aussi love
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".
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
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.
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o
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 ?
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Oui, le rts n'existe pas.
Ok, marrant smile
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
(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)
Un équivalent de link/unlk du 68k donc, merci bien. smile
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
ç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
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.
Ca a l'air mignon tout ça. smile
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Franchement faire de l'ARM c'est sympa grin