2

TheCodR
a écrit : mais resultat, mon premier prog fonctionne nikel, et le second foire completement, plantage de la calc, alors pourquoi ??

allocscr:
pea.l 3840
call HeapAllocPtr
move.l a0,d4
tst.l d4
beq nomem
rts

Là, tu sautes à l'adresse 3840 en retournant. Le rts saute à l'adresse donnée par les 4 premiers octets sur la pile (les 4 octets placés sur la pile en dernier). Ici, c'est 3840.
est ce que c'est a cause du link a6,#0 ???

Non, c'est parce qu'il n'y a pas de link/unlk dans ta sous-routine.
parceque je pense que quand on fait un BSR il doit sauvegarder la position courante du prog, sur la pile (sur x86, c pareil)

En effet.
or comme j'utilise link a6,#0 pour eviter justement de s'embeter a restaurer la pile a chaque utilisation de fonction,

Mais il faut restaurer la pile avant chaque rts, pas seulement avant celui à la fin du programme.
c peut etre pour sa que sa plante, alors comment faire ?

addq.l #4,a7 avant le rts de allocscr.
Tu pourrais aussi mettre un link et un unlk dans allocscr, mais dans ce cas le beq nomem ne marcherait plus parce que ça sauterait le unlk correspondant au link dans allocscr.
tant, qu'a faire, je profite de ce topic pour demander comment utiliser un rawread en ASM nostub.

Voici la routine de TIGCCLIB:
.data
	.xdef _rowread
_rowread:
| Write the mask to the port
	move.w (%sp,4),0x600018
| Wait for a few milliseconds until the I/O can return a valid value
	move.w #24,%d0
0:
	dbra %d0,0b
| Read the port and write it to %d0 (return value register)
	move.b 0x60001B,%d0
| Invert the byte
	not.b %d0
	and.w #0xFF,%d0
| Return
	rts

et puis aussi, savoir comment fait la TI pour l'heure (ams 2.08) lorsqu'elle est eteinte,
est ce que la calc coupe l'ecran seulement et laisse tourner le proc, ou alors le 68k a t'il un mode veille qui continu a executer les int ??

Le matériel de la calculatrice a un mode veille qui réveille le 68k quand une auto-int se déclenche. Cf. http://m101.ryd.student.liu.se/J89hw.txt, port $600005.
tout ce que j'ai remarqué depuis que j'ai l'ams 2.08
c'est que quand j'allume ma TI apres l'avoir eteinte pendant quelque heure, l'ecran est tout noir puis redevient trés vite normal, (ecran HOME), pourquoi ?

Je ne sais pas, c'est un effet bizarre connu.
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é

5

TheCodR a écrit :
hum, petit souci, le prog marche mais plante en quittant. quel est la meilleurs méthode pour eviter sa, ne plus utiliser link/unlk ?

Poste ton code changé pour que je voie ce qui ne va pas maintenant.
j'avais vu , sur atari il me semble, que au debut de chaque prog asm
les codeurs imposait leurs propre pile, est ce que c plus pratique , ou en quoi sa peut
aider ?

MOVE.L A7,A5 LEA.L PILE,A7

Ça n'aide pas du tout ici.
Ça peut aider s'il n'y a pas assez de place sur la pile système, mais pas du tout pour ton problème.
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é

7

Déjà, il faudrait changer de place le addq.l #4,a7 de la ligne 77. Il faut le faire dans tous les cas, qu'il y ait de la mémoire ou pas (donc tu peux le mettre juste après HeapAllocPtr).
Ce qui ne va pas, c'est que tu ne restaures pas la pile ! Il faut que tu calcules le total de ce que tu pousses sur la pile, et il faut le rajouter à la fin (à la ligne 62) ! Mais il faut mettre la correction de sp avant nomem dans ton code (car tu n'as pas poussé sur la pile autant que s'il y a de la mémoire)
Il ne faut pas exécuter nomem si tout se passe bien, donc il ne faut pas placer le bloc de code nomem à cet endroit-là.
J'espère que je suis assez clair, car en général je ne le suis pas...

Et tu peux virer les link/unlk qui ne servent absolument à rien ici (à moins qu'AS en ait besoin ?).

Il y a de petits trucs d'optimisation: move.l #...., -(sp) = pea ....; move.w #0,-(a7) = clr.w -(a7) le move.l a0,d4 de la ligne 74 suffit en principe...
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

9

XDanger
a écrit : Déjà, il faudrait changer de place le addq.l #4,a7 de la ligne 77. Il faut le faire dans tous les cas, qu'il y ait de la mémoire ou pas (donc tu peux le mettre juste après HeapAllocPtr).

Mais le unlk a6 devrait s'en occuper normalement.
Ce qui ne va pas, c'est que tu ne restaures pas la pile ! Il faut que tu calcules le total de ce que tu pousses sur la pile, et il faut le rajouter à la fin (à la ligne 62) ! Mais il faut mettre la correction de sp avant nomem dans ton code (car tu n'as pas poussé sur la pile autant que s'il y a de la mémoire) Il ne faut pas exécuter nomem si tout se passe bien, donc il ne faut pas placer le bloc de code nomem à cet endroit-là.

Idem.


J'ai trouvé le problème: c'est d4/a5 qu'il faut mettre dans tes movem, pas d0/a5! d0 n'a pas besoin d'être sauvegardé, mais d4 oui. (Ce n'est pas la peine de sauvegarder d0-d2/a0-a1, mais il faut sauvegarder d3-d7/a0-a6 et évidemment a7.)
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

Je n'avais pas bien compris link/unlk... Je mets toujours l'option -fomit-frame-pointer à mes programmes qui ne nécessitent pas de frame pointer.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.