"if" { count(); return(IF); }
"int" { count(); return(INT); }
"interrupt" { count(); return(INTERRUPT);}
+"banked" { count(); TKEYWORD(BANKED);}
"long" { count(); return(LONG); }
"near" { count(); TKEYWORD(DATA);}
"pdata" { count(); TKEYWORD(PDATA); }
%token <yyint> SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
%token <yyint> XOR_ASSIGN OR_ASSIGN
%token TYPEDEF EXTERN STATIC AUTO REGISTER CODE EEPROM INTERRUPT SFR AT SBIT
-%token REENTRANT USING XDATA DATA IDATA PDATA VAR_ARGS CRITICAL
+%token REENTRANT USING XDATA DATA IDATA PDATA VAR_ARGS CRITICAL BANKED
%token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID BIT
%token STRUCT UNION ENUM ELIPSIS RANGE FAR _XDATA _CODE _GENERIC _NEAR _PDATA _IDATA _EEPROM
%token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
$$->class = SPECIFIER ;
SPEC_CRTCL($$) = 1;
}
+ | BANKED {$$ = newLink ();
+ $$->class = SPECIFIER ;
+ SPEC_BANKED($$) = 1;
+ }
| Interrupt_storage
{
$$ = newLink () ;
SPEC_BLEN(dest) |= SPEC_BLEN(src);
SPEC_BSTR(dest) |= SPEC_BSTR(src);
SPEC_TYPEDEF(dest) |= SPEC_TYPEDEF(src);
+ SPEC_BANKED(dest) |= SPEC_BANKED(src);
if ( IS_STRUCT(dest) && SPEC_STRUCT(dest) == NULL )
SPEC_STRUCT(dest) = SPEC_STRUCT(src);
unsigned _typedef :1 ; /* is typedefed */
unsigned _isregparm:1 ; /* is the first parameter */
unsigned _isenum :1 ; /* is an enumerated type */
+ unsigned banked :1 ; /* function has banked attribute */
unsigned _IntNo ; /* 1=Interrupt svc routine */
short _regbank ; /* register bank 2b used */
unsigned _addr ; /* address of symbol */
#define SPEC_STRUCT(x) x->select.s.v_struct
#define SPEC_TYPEDEF(x) x->select.s._typedef
#define SPEC_REGPARM(x) x->select.s._isregparm
+#define SPEC_BANKED(x) x->select.s.banked
/* type check macros */
#define IS_DECL(x) ( x && x->class == DECLARATOR )
#define IS_LITERAL(x) (IS_SPEC(x) && x->select.s.sclass == S_LITERAL)
#define IS_ISR(x) (IS_SPEC(x) && SPEC_INTRTN(x))
#define IS_REGPARM(x) (IS_SPEC(x) && SPEC_REGPARM(x))
+#define IS_BANKED(x) (IS_SPEC(x) && SPEC_BANKED(x))
/* forward declaration for the global vars */
extern bucket *SymbolTab[] ;
/*-----------------------------------------------------------------*/
static void genCall (iCode *ic)
{
+ link *detype = getSpec(operandType(IC_LEFT(ic)));
+ if (IS_BANKED(detype)) emit2("; call to a banked function");
emitCall(ic, FALSE);
}
/* PENDING: portability. */
emit2("__%s_start:", sym->rname);
emit2("!functionlabeldef", sym->rname);
-
+
fetype = getSpec(operandType(IC_LEFT(ic)));
-
+
/* if critical function then turn interrupts off */
if (SPEC_CRTCL(fetype))
emit2("!di");
+ if (SPEC_BANKED(fetype)) emit2("; Iam banked");
/* if this is an interrupt service routine then
save acc, b, dpl, dph */
static char *_keywords[] = {
"sfr",
+ "banked",
NULL
};