Ben voila, j'ai essayé de faire un programme en C qui utilise une fonction faite en A68k, mais...
[smiley=2]Ca marche pas!!
Je le lance, et... rien ne se passe. Le programme affiche "Done", sans rien faire...
[nosmile]
Si quelqu'un sait d'où ça peut venir, je peux toujours montrer mes sources, c'était une fonction de sprite8 personalisée...
Edit: Et maintenant, je mets la version finale... Celle qui marche!!
[b]Voici d'abord la sous-fonction en A68k:[/b]
; Assembly Source File
; Created 11/02/03, 18:35:12
section ".data"
INCLUDE "OS.h" ;fichier include pour les programmes en _nostub, contenant notamment les ROM_CALLs
INCLUDE "MyMacros.inc" ;Mes Macros persos
XDEF _nostub ;pas besoin de kernel
XDEF _ti89 ;Ce programme tourne sur TI-89.
XDEF _ti92plus ;Ce programme tourne sur TI-92+.
XDEF img8or
XDEF image8or
XDEF imgAli8or
;#define img8or(x,y,dimy,image) (image8or(8-((x)&7),(x)>>3,(y),(dimy),(image))
;(fontion optimisée de passage de coordonnée à img8or)
img8or:
SUBQ.l #2,A7 ;Décale popur insérer un word
MOVE.l 2(A7),D0 ;Prend l'adresse de retour
MOVE.l D0,(A7) ;La replace en bas de la pile
MOVE.w 6(A7),D0 ;prend x
MOVEQ #8,D1 ;pour soustraire à 8
AND.w #7,D0 ;modulo 8
SUB.w D0,D1 ;8-(x%8)
AND.w #7,D1 ;re-modulo 8 (décalage de 8 =0)
MOVE.w D1,4(A7) ;Sauve decal où il faut sur la pile
MOVE.w 6(A7),D0 ;reprend x
ADDQ.w #7,D0 ;Ajoute 7 pour mettre à l'échelle
LSR.w #3,D0 ;Divise par 8
MOVE.w D0,6(A7) ;sauve coordx
BRA image8or ;Passe à la fonction d'affichage
;void image8or(int décal, int coordx, int coordy,int dimy, const char *octets)
;params
I8decal EQU 8
I8coordx EQU 10
I8coordy EQU 12
I8dimy EQU 14
I8octets EQU 16
;vars
cpty EQUR D7
maxy EQUR D6
decalr EQUR D5
x EQUR D4
;y EQUR D3
pt_image EQUR A4
pt_ecran EQUR A3
image8or: LINK A6,#0 ;Lie A6 à la pile
MOVEM.l D3-D7/A2-A5,-(A7) ;Sauve contexte
MOVE.l $C8,A5 ;Table des ROM_CALLs en A5
;--- Début du prog ---
;prends les params
MOVE.w I8decal(A6),decalr
TST.w decalr ;SI decalr==0
BEQ imgAli8or_interne ;->Saute vers la fonction sans décalage
;(juste après la sauvegarde du contexte)
MOVE.w I8coordx(A6),x
MOVE.w I8dimy(A6),maxy
MOVE.l I8octets(A6),pt_image
;la fonction n'est pas clippée: on quitte si x==0
TST.w x ;SI(2) x!=0
BEQ I8Ofs002 ;ALORS(2)
;initialise les vars internes
MOVEQ #0,cpty
LEA LCD_MEM,pt_ecran
;calcul de la coordonnée y (multiplication par 30 sans MULU ni BOUCLE)
MOVE.w I8coordy(A6),D0 ;lit coordy
MOVE.w D0,D1 ;copie dans D1
LSL.w #5,D0 ;multiplie D0 par 32
LSL.w #1,D1 ;multiplie D1 par 2
SUB.w D1,D0 ;32-2=30!
EXT.l D0
ADDA.l D0,pt_ecran ;Ajoute y*30 au pointeur ecran
EXT.l x
ADDA.l x,pt_ecran ;Ajoute x
;boucle principale
I8Obcl001:
MOVEQ #0,D0 ;Nettoie DO
MOVE.b 0(pt_image,cpty.w),D0 ;prend l'octet de l'image
LSL.w decalr,D0 ;Décale de décal pixels vers la gauche
;Ici les instructions qui déterminent le mode
OR.b D0,0(pt_ecran) ;Affiche les pixels de droite
LSR.w #8,D0 ;Octet fort de D0.w en poids faible
OR.b D0,-1(pt_ecran) ;Affiche les pixels de gauche
LEA 30(pt_ecran),pt_ecran ;Passe à la ligne suivante
ADDQ.w #1,cpty ;incrémente y
CMP.w cpty,maxy ;SI y<maxy
BNE I8Obcl001 ;->on reboucle
I8Ofs002: ;FINSI(2)
;--- Sortie du Prog ---
MOVEM.l (A7)+,D3-D7/A2-A5 ;Rappelle contexte
UNLK A6 ;Libère A6
RTS ;Retour
;--- Fin du programme ---
;void imgAli8or(int decal_ignored,int coordx, int coordy,int dimy, const char *octets)
imgAli8or: LINK A6,#0 ;Lie A6 à la pile
MOVEM.l D3-D7/A2-A5,-(A7) ;Sauve contexte
MOVE.l $C8,A5 ;Table des ROM_CALLs en A5
;--- Début du prog ---
imgAli8or_interne:
;prends les params
MOVE.w I8coordx(A6),x
MOVE.w I8dimy(A6),maxy
MOVE.l I8octets(A6),pt_image
MOVE.w I8coordy(A6),D0 ;lit coordy
IA8OSuite:
;initialise les vars internes
MOVEQ #0,cpty
LEA LCD_MEM,pt_ecran
;calcul de la coordonnée y (multiplication par 30 sans MULU ni BOUCLE)
;coordy est toujours dans D0
MOVE.w D0,D1 ;copie dans D1
LSL.w #5,D0 ;multiplie D0 par 32
LSL.w #1,D1 ;multiplie D1 par 2
SUB.w D1,D0 ;32-2=30!
EXT.l D0
ADDA.l D0,pt_ecran ;Ajoute y*30 au pointeur ecran
EXT.l x
ADDA.l x,pt_ecran ;Ajoute x
;boucle principale
IA8Obcl001:
MOVE.b 0(pt_image,cpty.w),D0 ;prend l'octet de l'image
;Ici l'instruction qui détermine le mode
OR.b D0,0(pt_ecran) ;affiche
LEA 30(pt_ecran),pt_ecran ;Passe à la ligne suivante
ADDQ.w #1,cpty ;incrémente y
CMP.w cpty,maxy ;SI y<maxy
BNE IA8Obcl001 ;->on reboucle
;--- Sortie du Prog ---
MOVEM.l (A7)+,D3-D7/A2-A5 ;Rappelle contexte
UNLK A6 ;Libère A6
RTS ;Retour
;--- Fin du programme ---
#honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte#
[b]Et le programme en C qui l'utilise:[/b]
// C Source File
// Created 11/02/03; 19:30:47
#define USE_TI89 // Compile for TI-89
#define USE_TI92PLUS // Compile for TI-92 Plus
#define USE_V200 // Compile for V200
#define OPTIMIZE_ROM_CALLS // Use ROM Call Optimization
//#define SAVE_SCREEN // Save/Restore LCD Contents
#include <kbd.h>
#include <statline.h>
#include <graph.h>
#include <alloc.h>
#include <mem.h>
void img8or(int x, int coordy,int dimy, const char *octets) __attribute__((stkparm));
void image8or(int decal, int coordx, int coordy,int dimy, const char *octets) __attribute__((stkparm));
void imgAli8or(int decal_ignored,int coordx, int coordy,int dimy, const char *octets) __attribute__((stkparm));
#define MAT_DIMX 6
#define MAT_DIMY 4
// Main Function
void _main(void)
{
char mypic[8][8]={ {0x0F,0x30,0x40,0x48,0x90,0x98,0x9C,0xCF},
{0xF0,0x0C,0x02,0x12,0x09,0x19,0x39,0xF3},
{0x63,0x78,0x3F,0x4F,0x84,0x9A,0x62,0x01},
{0xC6,0x1E,0xFC,0xF2,0x21,0x59,0x46,0x80},
{0xCF,0x30,0xC0,0xC8,0x90,0x98,0x9C,0xCF},
{0xF3,0x0C,0x03,0x13,0x09,0x19,0x39,0xF3},
{0x81,0xC2,0xD4,0xE8,0xD4,0xE8,0xBE,0x7F},
{0xC3,0x00,0x00,0x3C,0xC3,0x00,0x00,0x3C}};
char my_mat[MAT_DIMY][MAT_DIMX]={{1,2,0,0,0,0},{3,5,2,7,7,7},{0,3,4,7,8,8},{0,0,0,7,8,8}};
char *pt_ecransauv=NULL;
int i,j;
pt_ecransauv=HeapAllocPtr(3840);
if(pt_ecransauv)
{
memcpy(pt_ecransauv,LCD_MEM,3840);
ClrScr();
for(i=0;i<MAT_DIMY;i++)
{
for(j=0;j<MAT_DIMX;j++)
{
if(my_mat[i][j])
img8or(8*j+2,8*i+2,8,mypic[(int)my_mat[i][j]-1]);
}
}
ngetchx();
memcpy(LCD_MEM,pt_ecransauv,3840);
HeapFreePtr(pt_ecransauv);
ST_helpMsg("fini.");
}
else
ST_helpMsg("Impossible de sauver l'écran.");
}
Je ne comprend vraiment pas pourquoi il ne se passe rien...
Edit: #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte# #honte#




les ROM_CALLs) mais j'ai la flemme de poser ici... Et en plus cela ne servirait pas à grand chose...