π
<-
Chat plein-écran
[^]

[ASM 68000 - RESOLU] Hello World avec sub

Programmation et implémentation d'algorithmes.

[ASM 68000 - RESOLU] Hello World avec sub

Message non lude Amiga68000 » 05 Jan 2022, 21:46

Bonjour,

Je viens d'acquérir une TI-89 Titanium pour jouer avec l'ASM 68K sachant que j'ai fait pas mal d'ASM sur mon Amiga (et je m'y remets parfois).

Mais voilà que je bloque sur le code de Kevin KOFLER pour afficher un hello world (https://www.tigen.org/kevin.kofler/ti89 ... mnstbf.htm)
Il fonctionne très bien si je le prends tel quel (affichage "hello world" et attente appui touche)
Sauf que je souhaite (pour une meilleure lisibilité) faire des sub pour les différentes fonctions et les placer en fin de prog.
La première étant une sub AllocMem.
Si on enlève les 3 ";" sur bsr, bra et rts, là le prog ne fonctionne plus.
Je ne comprends pas pourquoi

Quelqu'un a-t-il une idée ?

Merci

Arnaud


Code: Tout sélectionner
; Assembly Source File
; Created 03/01/2022, 23:52:25

include "OS.h"
xdef _nostub
xdef _ti89   ;160x100
xdef _ti92plus   ;240x128

MemEcranMax = 240*128>>3 ;3840

   movem.l   d0-d7/a0-a6,-(a7) ;sauvegarde les registres
   
   ;bsr   allocMem
   ;bra   .fin
allocMem:
   move.l   $c8,a5 ;place la table des ROM_CALLs en a5
   pea.l   MemEcranMax ;taille à allouer
               ;(même chose que move.l #3840,-(a7), mais plus optimisé)
   move.l   HeapAllocPtr*4(a5),a0
   jsr   (a0) ;alloue les 3840 octets
   move.l   a0,d4 ;sauvegarde l'adresse du bloc alloué en d4
   ;rts
.fin:
   tst.l   d4
   beq   nomem ;si le pointeur est nul, quitte le programme
   

   move.l   $c8,a5 ;place la table des ROM_CALLs en a5
   
   move.l   #MemEcranMax,(a7) ;taille à copier
      ;Cette instruction n'est pas vraiment nécessaire puisque HeapAllocPtr ne modifiera
      ;pas la valeur qui est déjà sur la pile, mais mieux vaut ne pas se fier.   
   pea.l   $4c00 ;source: adresse de l'écran
   move.l   d4,-(a7) ;destination: adresse du bloc alloué
   move.l   memcpy*4(a5),a0
   jsr   (a0) ;sauvegarde l'écran
   lea.l   12(a7),a7 ;nettoie la pile

;début du programme principal
   move.l ScreenClear*4(a5),a0
   jsr (a0) ;appelle ScreenClear (ClrScr dans la documentation de TIGCC - c'est la seule
             ;fonction à ma connaissance dont les noms ne correspondent pas)

   move.w   #4,-(a7) ;passe l'attribut A_REPLACE en argument
   pea.l   hello_world(PC) ;passe le message à afficher en argument
   clr.l    -(a7) ;passe x=0 et y=0 en argument (On efface 4 octets, dont 2 pour x et 2 pour y.)
   move.l   DrawStr*4(a5),a0
   jsr    (a0) ;appelle DrawStr
   
   lea.l    10(a7),a7 ;nettoie la pile
   move.l    ngetchx*4(a5),a0
   jsr   (a0) ;appelle ngetchx
;fin du programme principal

   pea.l   3840 ;taille à copier
            ;(même chose que move.l #3840,-(a7), mais plus optimisé)
   move.l   d4,-(a7) ;source: adresse du bloc alloué
   pea.l   $4c00 ;destination: adresse de l'écran
   move.l   memcpy*4(a5),a0
   jsr   (a0) ;restaure l'écran
   addq.l   #8,a7
   move.l   d4,(a7)
   move.l   HeapFreePtr*4(a5),a0
   jsr    (a0) ;libère le bloc alloué
nomem:
   addq.l    #4,a7 ;nettoie la pile
   movem.l (a7)+,d0-d7/a0-a6 ;restaure les registres
   rts


   
hello_world:    dc.b 'Hello, World !',0
Dernière édition par Amiga68000 le 05 Jan 2022, 23:36, édité 3 fois.
Avatar de l’utilisateur
Amiga68000Premium
Niveau 4: MC (Membre Confirmé)
Niveau 4: MC (Membre Confirmé)
Prochain niv.: 40%
 
Messages: 28
Inscription: 12 Oct 2019, 22:17
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: [ASM] Bug construction sub

Message non lude Amiga68000 » 05 Jan 2022, 22:21

Bon bien j'ai trouvé, il faut dépiler le PC (a7) car sinon au retour de HeapAllocPtr, a7 garde la valeur MemEcranMax et donc le rts s'opère sur l'adresse a7
J'ai rajouté un
Code: Tout sélectionner
move.l   (a7)+,a0   ;dépile MemEcranMax

pour dépiler
Voici ce que celà donne :

Code: Tout sélectionner
bsr   allocMem
   bra   .fin
allocMem:
   move.l   $c8,a5 ;place la table des ROM_CALLs en a5
   pea.l   MemEcranMax ;taille à allouer
               ;(même chose que move.l #3840,-(a7), mais plus optimisé)
   move.l   HeapAllocPtr*4(a5),a0
   jsr   (a0)       ;alloue les 3840 octets
   move.l   a0,d4       ;sauvegarde l'adresse du bloc alloué en d4
   move.l   (a7)+,a0   ;dépile MemEcranMax
   rts
.fin:
   tst.l   d4
   beq   nomem ;si le pointeur est nul, quitte le programme
Avatar de l’utilisateur
Amiga68000Premium
Niveau 4: MC (Membre Confirmé)
Niveau 4: MC (Membre Confirmé)
Prochain niv.: 40%
 
Messages: 28
Inscription: 12 Oct 2019, 22:17
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: [ASM - RESOLU] Hello World avec sub

Message non lude Amiga68000 » 05 Jan 2022, 23:30

voici le code avec les sub

Code: Tout sélectionner
; Assembly Source File
; Created 03/01/2022, 23:52:25

include "OS.h"
xdef _nostub
xdef _ti89   ;160x100
xdef _ti92plus   ;240x128

MemEcranMax = 240*128>>3 ;3840

   movem.l   d0-d7/a0-a6,-(a7) ;sauvegarde les registres

;-- INIT   
   bsr   allocMem
   cmp.l   #0,a0
   beq   Quitter ;si le pointeur est nul, quitte le programme
   bsr   SauveEcran

;-- MAIN
   move.l   $c8,a5 ;place la table des ROM_CALLs en a5
   
   move.l    ScreenClear*4(a5),a0
   jsr    (a0) ;appelle ScreenClear (ClrScr dans la doc de TIGCC - c'est la seule
             ;fonction à ma connaissance dont les noms ne correspondent pas)

   move.w   #4,-(a7) ;passe l'attribut A_REPLACE en argument
   pea.l   hello_world(PC) ;passe le message à afficher en argument
   move.l   #$00120012,-(a7)   ;$xxxxyyyy en pixel
   move.l   DrawStr*4(a5),a0
   jsr    (a0) ;appelle DrawStr
   lea.l    10(a7),a7 ;nettoie la pile
   
   move.l    ngetchx*4(a5),a0
   jsr   (a0) ;appelle ngetchx

;-- END
   bsr   RestaurerEcran   
   bsr   freeMem
Quitter:
   movem.l (a7)+,d0-d7/a0-a6 ;restaure les registres
   rts


;
;-- SUB ROUTINES
;

allocMem:
   move.l   $c8,a5 ;place la table des ROM_CALLs en a5
   pea.l   MemEcranMax ;taille à allouer
               ;(même chose que move.l #3840,-(a7), mais plus optimisé)
   move.l   HeapAllocPtr*4(a5),a0
   jsr   (a0)       ;alloue les 3840 octets
   move.l   a0,MemAllouee_ptr   ;sauvegarde l'adresse du bloc alloué en d4
   addq.l   #4,a7   ;dépile MemEcranMax
   rts

freeMem:
   move.l   $c8,a5 ;place la table des ROM_CALLs en a5
   move.l   MemAllouee_ptr(pc),-(a7)
   move.l   HeapFreePtr*4(a5),a0
   jsr    (a0) ;libère le bloc alloué
   addq.l    #4,a7 ;nettoie la pile
   rts
   
SauveEcran:
   move.l   $c8,a5 ;place la table des ROM_CALLs en a5
   pea.l   MemEcranMax   
   pea.l   $4c00 ;source: adresse de l'écran
   move.l   MemAllouee_ptr,-(a7) ;destination: adresse du bloc alloué
   move.l   memcpy*4(a5),a0
   jsr   (a0) ;sauvegarde l'écran
   lea.l   12(a7),a7 ;nettoie la pile
   rts

RestaurerEcran:
   move.l   $c8,a5 ;place la table des ROM_CALLs en a5
   pea.l   MemEcranMax ;taille à copier (même chose que move.l #3840,-(a7), mais plus optimisé)
   move.l   MemAllouee_ptr,-(a7) ;source: adresse du bloc alloué
   pea.l   $4c00 ;destination: adresse de l'écran
   move.l   memcpy*4(a5),a0
   jsr   (a0) ;restaure l'écran
   lea.l   12(a7),a7 ;nettoie la pile
   rts
   
MemAllouee_ptr:   dc.l   0

hello_world:    dc.b    'Hello, World !',0
Avatar de l’utilisateur
Amiga68000Premium
Niveau 4: MC (Membre Confirmé)
Niveau 4: MC (Membre Confirmé)
Prochain niv.: 40%
 
Messages: 28
Inscription: 12 Oct 2019, 22:17
Genre: Homme
Calculatrice(s):
MyCalcs profile


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 32 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
2266 utilisateurs:
>2259 invités
>3 membres
>4 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)