Posté le 05/07/2011 à 11:11 Membre depuis le 25/03/2011, 207 messages
Bonjour/bonsoir,
Je viende réussir un "Hello world" en ASM pour ion (grande et petite ecriture), mais le texte ne reste affiché qu"une fraction de seconde avant un retour à ion.
est-ce que quelcun aurrait SVP un code qui soit ralentit de 2-3 secondes, soit attend la préssion d'une touche (quelconque ou spécifique) pour continuer.

Merci d'avance
Sandro
Posté le 05/07/2011 à 11:50 Membre depuis le 15/03/2005, 3470 messages
Voici une routine simple qui a pour argument b (nombre d'itérations) :
wait:
	halt
	djnz wait
	ret

(cf http://www.mworld.fr/html/projects/calc/ti-82/tutoriel/progasm/guide/lesson17.html#nophalt )

Sinon pour l'appui d'une touche tu as la rom call _getkey.
Posté le 05/07/2011 à 11:55 Membre depuis le 02/02/2009, 672 messages
Salut,

Tu peux faire un call WAITKEY par exemple.
Il faudra peut-être ajouter (dans ion.inc de preference):
WAITKEY .equ     4CFEh  ; Wait for a key and read




Pour faire une pause sans appui de touche tu peux faire par exemple :
         ld b, 255    ; nombre de tour dans la boucle
boucle_ralentir:
         ld a, 10   ;des calculs pour ralentir (tu peux mettre ce que tu veux
         add a   ; idem
         add a   ; idem
         add a   ; idem
         add a   ; idem
         djnz boucle_ralentir  ;decrementer b et si b != 0 sauter à boucle_ralentir


Ou quelque chose comme ça.

Sinon comme disait deeph et chickendude dans un autre topic y a NOP (ne rien faire mais ralentit) ou HALT.

Mais sinon bravo pour ton hello world smile

edit :cross tongue
Posté le 05/07/2011 à 12:29 Membre depuis le 25/03/2011, 207 messages
Merci beaucoup, j'essaye ce soir, là j'ai pas le temps.

sandro
Posté le 05/07/2011 à 22:34 Membre depuis le 25/03/2011, 207 messages
J'ai essayé les 3 solutions :
le WAIKEY à mettre dans ion.inc ne fonctionne pas (j'optient une erreure comme quoi ce n'est pas une instruction ou une étiquette.

Pour les 2 autre, même avec un "ld b,255", je ne persois pas de différence (c'est quoi la durée théorique?).

@Contra : c'est "add a" ou "add a,a" ?

Merci d'avance
Sandro
PS : voici mon .z80 actuel avec le halt :tromb Fichier joint : Copie_de_HELLOSTP.z80 (c'est bien ça, je me suis débrouillé au niveau de compiler.bat).
Posté le 05/07/2011 à 23:17 Membre depuis le 03/06/2011, 520 messages
Essaye ce code-ci:
pause:
	ld a,$F
	ld bc,$FF
hipause:
	djnz hipause
	dec c
	jr nz,hipause
	dec a
	jr nz,hipause
	ret


EDIT: Et tu peux aussi essayer "bcall _getkey"
Posté le 05/07/2011 à 23:25 Membre depuis le 15/03/2005, 3470 messages
C'est normal t'as un "ret" avant "ld b,255".

Sinon le "add a" devrait te mettre une erreur, seul "sub" soustrait automatiquement à l'accumulateur.

Et pas besoin de définir "waitkey", Ion.inc a déjà pas mal de rom calls et _getkey fait exactement ce que tu veux.
Posté le 06/07/2011 à 10:08 Membre depuis le 25/03/2011, 207 messages
Merci beaucoup

J'avais donc bien fait de remplacer "add a" par "add a,a"?

En enlevant le "ret" et en remplaçant "add a" par "add a,a", j'optient une pause (même si elle est plutôt courrte).

Par contre, est-ce que quelcun pourrait SVP m'expliquer quand est-ce qu'il faut mettre un ret et quand non, je ne suis pas trop sur ce point.

Merci d'avance
Sandro

PS : j'essaye les autres variantes.

EDIT 1: la variante avec call _getkey marche parfaitement.
EDIT 2: la variante avec halt me semble ne pas fonctionner: même avec b=1 elle semble ne pas ce finir (c'est quoi à peu près la durrée de 1 "halt" ?
Posté le 06/07/2011 à 16:49 Membre depuis le 15/03/2005, 3470 messages
Tu fais un "ret" à chaque fois que tu veux arrêter une routine appelée avec "call". Ton programme se termine aussi avec un "ret" puisque le shell le considère comme une très grande routine.

Sinon c'est très compliqué de donner une durée aux instructions... Ça dépend enfaite de la "cadence" du processeur. Voilà les temps d’exécutions en équivalent NOP : http://quasar.cpcscene.com/doku.php?id=iassem:timings

Un NOP prend ce qu'on appelle 4 T-States (un cycle donc), c'est à dire qu'à 10 MHz (100 nanosecondes) il te faudra 400 nanosecondes pour l’exécuter... Et la 83 n'est cadencée qu'à 6MHz, donc je te laisse faire les calculs...

Sinon je tu es sûr qu'avec le code suivant tu n'as pas une pause assez marquée ?

	.nolist
#include "ion.inc"
	.list
#ifdef TI83P
	.org progstart-2
	.db $BB,$6D
#else
	.org progstart
#endif
	ret
	jr nc,start
	.db "HELLOSTP",0

start:
	ld  hl,$0403
	ld  (currow),hl
	ld  hl,texte
	call _puts
	ld  b,255

wait:
	halt
	djnz wait
	ret

texte:
	.db"Hello world!",0
.end
Posté le 06/07/2011 à 16:53 Membre depuis le 03/06/2011, 520 messages
Halt arrête tout jusqu'à la prochaine interruption, c'est à dire plus ou moins 1/200 d'une seconde. Mais si les interruptions ne sont pas activées (tu peux les activer avec "ei", "di" pour les désactiver), comme une autre interruption ne viendra jamais la calc plante (bon, elle attendra toujours jusqu'à ce qu'on enlêve les piles).

Ret, c'est un peu difficile de l'expliquer. Pour le moment, il suffit de savoir qu'on l'utilise pour quitter le programme. Ret = return(/retour), ce qu'il fait c'est mettre la dernière addresse de la pile au PC (Program Counter, l'addresse de la prochaine commande à exécuter). Il a plusieurs emplois, comme pour les sous-programmes, mais le plus simple est celui de quitter le programme.

debut:
  ld hl,$0000
  ld (currow),hl
  ld hl,texte
  bcall _putS    ;afficher le texte
  call pause     ;appeler le sousprogramme
;quand on quitte le sousprogramme on  arrive ici
  ret               ;quitter le programme (rentrer à l0écran d'accueil)

pause:
  bcall _getKey  ;un délai
  ret                  ;rentrer à la partie principale du programme

texte:
.db "Bonjour!",0
Posté le 06/07/2011 à 20:24 Membre depuis le 25/03/2011, 207 messages
Merci beaucoup à vous deux, mais pour le interruptions, par défaut, elles sont activées ou désactivées ; sinon si on quite le programme sans les remmettre en état, ça fait quoi?

@ Deeph : au contraire, la pause est "infinie" : si j'ai bien compris le post de Chickendude, c'est que les interruptions sont désactivées.

Merci d'avance
Sandro

EDIT : en activant les interruptions, le programme avec "halt" fonctionne nickel.
Posté le 06/07/2011 à 21:04 Membre depuis le 15/03/2005, 3470 messages
Hmm ouais Ion les désactive il me semble (et les réactive en quittant donc pas besoin de s'en soucier...). À la limite remplace "halt" par "nop".
Posté le 06/07/2011 à 21:13 Membre depuis le 25/03/2011, 207 messages
Merci beaucoup.