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