9Fermer11
SallyLe 18/04/2009 à 14:00
./7 asm ("d7");
 > Comme ça :register word *stack_base asm ("a4");
register byte *base_ptr asm ("a3");
register long pc_offset
dans un fichier .h qui est inclus par tous les fichiers source. Alors pourquoi a4 et a3 ? je ne me souviens plus avec certitude mais il me semble que a5 est utilisé par une certaine option de tigcc, que je voulais activer (genre il y stocke l'adresse d'AMS et il s'en sert pour faire tous les ROM calls).
Si tu veux voir la partie correspondante de mon .h en entier :
mon code
/* Pour éviter au maximum les variables globales j'en remplace certaines par des macros. */

#define data_head (*(header_t*)base_ptr)
#define objd_obj_base (base_ptr + data_head.object_o)
[...]
#define global_ptr (base_ptr + data_head.variable_o)
#define common_word_ptr (base_ptr + data_head.common_word_o)
#define vocab (base_ptr + data_head.vocab_o)

/* Et je mets les autres dans une structure... */

#include <graph.h>

typedef struct {
  word        *stack;
  byte        *prog_block_ptr;

[...]

} structure_magique_t;


#ifndef NO_GLOBAL_REGISTER_VARIABLES
register word *stack_base asm ("a4");
register byte *base_ptr asm ("a3");
register long pc_offset asm ("d7");
#else
extern word *stack_base;
extern byte *base_ptr;
extern long pc_offset;
#endif

#define structure_magique ((structure_magique_t*)stack_base)
#define stack (structure_magique->stack)
#define prog_block_ptr (structure_magique->prog_block_ptr)
[...]
Bon la principale raison pour laquelle tout est fait à coups de define, c'est qu'avant ça j'utilisais des variables globales ordinaires — d'ailleurs en fait je n'ai pas tout écrit, je suis parti d'un code existant —, et ce hack m'a en fait permis de passer à l'adressage indirect via la structure sans changer le code (c'est une optimisation après coup, quoi ^^)

edit : c'est beau les tab à trois espaces trilove (par contre l'idéal c'est d'utiliser le caractère tab et de le régler visuellement à trois espaces, pas de taper les trois espaces ^^)