Folco > des rom calls ^^
une partie de mon prog est en (ep)rom et contient un tableau de pointeurs vers des fonctions, l'adresse de cette table est stockée à une adresse fixe.
le code utilisateur est en (non volatile)ram et je lui fais appeler des fonctions de la ROM au lieu de les recoder.
sur ams c'est l'adresse $C8 qui contient l'adresse de la table des ROM CALLS, et à cette adresse t'as un tableau de pointeurs vers les routines elles mêmes.
et pour l'appeler, c'est le code de tigcc/gcc4ti dans default.h qui fait le lien. Ces trois jolies lignes font un cast magique qui transforme un numéro de rom calls en instructions jsr ou bsr vers cette adresse, tout en mettant les bons paramètres sur la pile:
#define ROM_CALL_TABLE 0x0004
#define __jmp_tbl (*(__code void * __code * __code *)ROM_CALL_TABLE)
#define _rom_call(type,args,intindex) (*((type(*)args)(__jmp_tbl[intindex])))
#define SerialInit _rom_call(void,(void),0)
(les __code c'est parce que le mcs51 a plusieurs types de mémoire, alors il faut dire quelle mémoire est pointée par le pointeur, et dans quelle mémoire est stockée le pointeur

)
mais le code généré sur un micro 8 bits est assez pourri, et y'a pas le choix, j'ai pu simplifier un peu en donnant directement l'adresse de la table et pas l'adresse d'une case mem ou est stockée l'adresse de la table, ça supprime une indirection mais bon c'est pas encore ça:
Brunni> en fait ce qui suxe le plus c'est le SP qui fait 8 bits

(et avant que je recode un compilateur pour faire une ABI qui supporte un SP de 16 bits, il se passera du temps, mais bon c'est un microcontroleur aussi, pas un microprocesseur).