X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Favr%2Fmain.c;h=b3e33659a5a9e1d49a9e6f28c95f9e1854b5d64e;hb=2f566bab0a5fe0bf025d6c892d6fc309966618f1;hp=57c0aece2eb5b324a40d9c96edda3f82ca66a57e;hpb=c19e63c811b568ecd13a231f78cc69a01bacfa1e;p=fw%2Fsdcc diff --git a/src/avr/main.c b/src/avr/main.c index 57c0aece..b3e33659 100644 --- a/src/avr/main.c +++ b/src/avr/main.c @@ -9,115 +9,126 @@ #include "ralloc.h" #include "gen.h" -static char _defaultRules[] = -{ +static char _defaultRules[] = { #include "peeph.rul" }; /* list of key words used by msc51 */ -static char *_avr_keywords[] = { - "at", - "code", - "critical", - "eeprom", - "interrupt", - "sfr", - "sbit", - "xdata", - "_code", - "_eeprom", - "_generic", - "_xdata", - "sram" , - "_sram", - "flash", - "_flash", - NULL +static char *_avr_keywords[] = { + "at", + "code", + "critical", + "eeprom", + "interrupt", + "sfr", + "xdata", + "_code", + "_eeprom", + "_generic", + "_xdata", + "sram", + "_sram", + "flash", + "_flash", + NULL }; -static int regParmFlg = 0; /* determine if we can register a parameter */ +static int regParmFlg = 0; /* determine if we can register a parameter */ -static void _avr_init(void) +static void +_avr_init (void) { - asm_addTree(&asm_asxxxx_mapping); + asm_addTree (&asm_asxxxx_mapping); } -static void _avr_reset_regparm() +static void +_avr_reset_regparm () { - regParmFlg = 0; + regParmFlg = 0; } -static int _avr_regparm( link *l) +static int +_avr_regparm (sym_link * l) { - /* the first eight bytes will be passed in - registers r16-r23. but we won't split variables - i.e. if not enough registers left to hold - the parameter then the whole parameter along - with rest of the parameters go onto the stack */ - if (regParmFlg < 8 ) { - int size ; - if ((size = getSize(l)) > (8 - regParmFlg)) { - /* all remaining go on stack */ - regParmFlg = 8; - return 0; + /* the first eight bytes will be passed in + registers r16-r23. but we won't split variables + i.e. if not enough registers left to hold + the parameter then the whole parameter along + with rest of the parameters go onto the stack */ + if (regParmFlg < 8) { + int size; + if ((size = getSize (l)) > (8 - regParmFlg)) { + /* all remaining go on stack */ + regParmFlg = 8; + return 0; + } + regParmFlg += size; + return 1; } - regParmFlg += size; - return 1; - } - - return 0; + + return 0; } -void avr_assignRegisters (eBBlock **ebbs, int count); +void avr_assignRegisters (eBBlock ** ebbs, int count); -static bool _avr_parseOptions(int *pargc, char **argv, int *i) +static bool +_avr_parseOptions (int *pargc, char **argv, int *i) { - /* TODO: allow port-specific command line options to specify - * segment names here. - */ - return FALSE; + /* TODO: allow port-specific command line options to specify + * segment names here. + */ + return FALSE; } -static void _avr_finaliseOptions(void) +static void +_avr_finaliseOptions (void) { - port->mem.default_local_map = - port->mem.default_globl_map = xdata; - /* change stack to be in far space */ - /* internal stack segment ; - SFRSPACE - NO - FAR-SPACE - YES - PAGED - NO - DIRECT-ACCESS - NO - BIT-ACCESS - NO - CODE-ACESS - NO - DEBUG-NAME - 'B' - POINTER-TYPE - POINTER - */ - istack = allocMap (0, 1, 0, 0, 0, 0,options.stack_loc, ISTACK_NAME,'B',FPOINTER); + port->mem.default_local_map = port->mem.default_globl_map = xdata; + /* change stack to be in far space */ + /* internal stack segment ; + SFRSPACE - NO + FAR-SPACE - YES + PAGED - NO + DIRECT-ACCESS - NO + BIT-ACCESS - NO + CODE-ACESS - NO + DEBUG-NAME - 'B' + POINTER-TYPE - FPOINTER + */ + istack = + allocMap (0, 1, 0, 0, 0, 0, options.stack_loc, ISTACK_NAME, + 'B', FPOINTER); + + /* also change xdata to be direct space since we can use lds/sts */ + xdata->direct = 1; } -static void _avr_setDefaultOptions(void) +static void +_avr_setDefaultOptions (void) { - options.stackAuto = 1; + options.stackAuto = 1; } -static const char *_avr_getRegName(struct regs *reg) +static const char * +_avr_getRegName (struct regs *reg) { - if (reg) - return reg->name; - return "err"; + if (reg) + return reg->name; + return "err"; } -static void _avr_genAssemblerPreamble(FILE *of) +static void +_avr_genAssemblerPreamble (FILE * of) { } /* Generate interrupt vector table. */ -static int _avr_genIVT(FILE *of, symbol **interrupts, int maxInterrupts) +static int +_avr_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts) { - return TRUE; + return TRUE; } /** $1 is always the basename. @@ -127,74 +138,83 @@ static int _avr_genIVT(FILE *of, symbol **interrupts, int maxInterrupts) MUST be terminated with a NULL. */ static const char *_linkCmd[] = { - "aslink", "-nf", "$1", NULL + "linkavr", "", "$1", NULL }; static const char *_asmCmd[] = { - "asx8051", "-plosgffc", "$1.asm", NULL + "asavr", "$l" , "-plosgff", "$1.s", NULL }; /* Globals */ PORT avr_port = { - "avr", - "ATMEL AVR", /* Target name */ - { - TRUE, /* Emit glue around main */ - }, - { - _asmCmd, - "-plosgffc", /* Options with debug */ - "-plosgff", /* Options without debug */ - 0 - }, - { - _linkCmd, - NULL, - ".rel" - }, - { - _defaultRules - }, - { - /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */ - 1, 1, 2, 4, 2, 2, 3, 1, 4, 4 - }, - { - "XSEG (XDATA)", - "STACK (DATA)", - "CSEG (CODE)", - "DSEG (DATA)", - "ISEG (DATA)", - "XSEG (XDATA)", - "BSEG (BIT)", - "RSEG (DATA)", - "GSINIT (CODE)", - "OSEG (OVR,DATA)", - "GSFINAL (CODE)", - "HOME (CODE)", + TARGET_ID_AVR, + "avr", + "ATMEL AVR", /* Target name */ + { + TRUE, /* Emit glue around main */ + MODEL_LARGE | MODEL_SMALL, + MODEL_SMALL}, + { + _asmCmd, + NULL, + "-plosgff", /* Options with debug */ + "-plosgff", /* Options without debug */ + 0, + ".s"}, + { + _linkCmd, + NULL, + NULL, + ".rel"}, + { + _defaultRules}, + { + /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */ + 1, 2, 2, 4, 2, 2, 3, 1, 4, 4}, + { + "XSEG", + "STACK", + "CSEG", + "DSEG", + "ISEG", + "XSEG", + "BSEG", + "RSEG", + "GSINIT", + "OSEG", + "GSFINAL", + "HOME", + NULL, + NULL, + 0, + }, + { + -1, 1, 4, 1, 1, 0}, + /* avr has an 8 bit mul */ + { + 1, -1 + }, + "_", + _avr_init, + _avr_parseOptions, + _avr_finaliseOptions, + _avr_setDefaultOptions, + avr_assignRegisters, + _avr_getRegName, + _avr_keywords, + _avr_genAssemblerPreamble, + _avr_genIVT, + _avr_reset_regparm, + _avr_regparm, + NULL, NULL, - NULL, - 0, - }, - { - -1, 1, 4, 1, 1, 0 - }, - /* avr has an 8 bit mul */ - { - 1 - }, - "_", - _avr_init, - _avr_parseOptions, - _avr_finaliseOptions, - _avr_setDefaultOptions, - avr_assignRegisters, - _avr_getRegName , - _avr_keywords, - _avr_genAssemblerPreamble, - _avr_genIVT, - _avr_reset_regparm, - _avr_regparm, - FALSE + FALSE, + 0, /* leave lt */ + 1, /* transform gt ==> not le */ + 0, /* leave le */ + 0, /* leave ge */ + 0, /* leave != */ + 0, /* leave == */ + FALSE, /* No array initializer support. */ + PORT_MAGIC }; -