X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fmcs51%2Fmain.c;h=1904e14985be2f24c48be2c669994a6a45c06739;hb=c5499f98aa5c2ce7df3a6e5dcf0fd69b6c3818cd;hp=402993d8a2e9f377e9672a2dae9718f1a497900f;hpb=195ee3f3ee25ce2c5f2a59fbd2779c4cb80527c3;p=fw%2Fsdcc diff --git a/src/mcs51/main.c b/src/mcs51/main.c index 402993d8..1904e149 100644 --- a/src/mcs51/main.c +++ b/src/mcs51/main.c @@ -8,6 +8,8 @@ #include "main.h" #include "ralloc.h" #include "gen.h" +#include "peep.h" +#include "dbuf_string.h" #include "../SDCCutil.h" static char _defaultRules[] = @@ -15,6 +17,18 @@ static char _defaultRules[] = #include "peeph.rul" }; +#define OPTION_STACK_SIZE "--stack-size" + +static OPTION _mcs51_options[] = + { + { 0, OPTION_STACK_SIZE, &options.stack_size, "Tells the linker to allocate this space for stack", CLAT_INTEGER }, + { 0, "--parms-in-bank1", &options.parms_in_bank1, "use Bank1 for parameter passing"}, + { 0, "--pack-iram", NULL, "Tells the linker to pack variables in internal ram (default)"}, + { 0, "--no-pack-iram", &options.no_pack_iram, "Tells the linker not to pack variables in internal ram"}, + { 0, "--acall-ajmp", &options.acall_ajmp, "Use acall/ajmp instead of lcall/ljmp" }, + { 0, NULL } + }; + /* list of key words used by msc51 */ static char *_mcs51_keywords[] = { @@ -122,14 +136,27 @@ _mcs51_finaliseOptions (void) port->genXINIT=0; } - if (options.model == MODEL_LARGE) { + switch (options.model) + { + case MODEL_SMALL: + port->mem.default_local_map = data; + port->mem.default_globl_map = data; + port->s.gptr_size = 3; + break; + case MODEL_MEDIUM: + port->mem.default_local_map = pdata; + port->mem.default_globl_map = pdata; + port->s.gptr_size = 3; + break; + case MODEL_LARGE: port->mem.default_local_map = xdata; port->mem.default_globl_map = xdata; - } - else - { + port->s.gptr_size = 3; + break; + default: port->mem.default_local_map = data; port->mem.default_globl_map = data; + break; } if (options.parms_in_bank1) { @@ -162,26 +189,27 @@ _mcs51_genAssemblerPreamble (FILE * of) /* Generate interrupt vector table. */ static int -_mcs51_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts) +_mcs51_genIVT (struct dbuf_s * oBuf, symbol ** interrupts, int maxInterrupts) { int i; - fprintf (of, "\tljmp\t__sdcc_gsinit_startup\n"); + dbuf_printf (oBuf, "\t%cjmp\t__sdcc_gsinit_startup\n", options.acall_ajmp?'a':'l'); + if((options.acall_ajmp)&&(maxInterrupts)) dbuf_printf (oBuf, "\t.ds\t1\n"); /* now for the other interrupts */ for (i = 0; i < maxInterrupts; i++) { if (interrupts[i]) { - fprintf (of, "\tljmp\t%s\n", interrupts[i]->rname); + dbuf_printf (oBuf, "\t%cjmp\t%s\n", options.acall_ajmp?'a':'l', interrupts[i]->rname); if ( i != maxInterrupts - 1 ) - fprintf (of, "\t.ds\t5\n"); + dbuf_printf (oBuf, "\t.ds\t%d\n", options.acall_ajmp?6:5); } else { - fprintf (of, "\treti\n"); + dbuf_printf (oBuf, "\treti\n"); if ( i != maxInterrupts - 1 ) - fprintf (of, "\t.ds\t7\n"); + dbuf_printf (oBuf, "\t.ds\t7\n"); } } return TRUE; @@ -264,6 +292,9 @@ hasExtBitOp (int op, int size) if (op == RRC || op == RLC || op == GETHBIT + || op == GETABIT + || op == GETBYTE + || op == GETWORD || (op == SWAP && size <= 2) ) return TRUE; @@ -574,7 +605,7 @@ asmLineNodeFromLineNode (lineNode *ln) asmLineNode *aln = newAsmLineNode(); char *op, op1[256], op2[256]; int opsize; - const unsigned char *p; + const char *p; char inst[8]; mcs51opcodedata *opdat; @@ -690,10 +721,10 @@ PORT mcs51_port = { glue, TRUE, /* Emit glue around main */ - MODEL_SMALL | MODEL_LARGE, + MODEL_SMALL | MODEL_MEDIUM | MODEL_LARGE, MODEL_SMALL }, - { + { /* Assembler */ _asmCmd, NULL, "-plosgffc", /* Options with debug */ @@ -702,23 +733,27 @@ PORT mcs51_port = ".asm", NULL /* no do_assemble function */ }, - { + { /* Linker */ _linkCmd, NULL, NULL, ".rel", 1 }, - { + { /* Peephole optimizer */ _defaultRules, getInstructionSize, getRegsRead, - getRegsWritten + getRegsWritten, + mcs51DeadMove, + 0 }, { /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */ 1, 2, 2, 4, 1, 2, 3, 1, 4, 4 }, + /* tags for generic pointers */ + { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */ { "XSTK (PAG,XDATA)", // xstack_name "STACK (DATA)", // istack_name @@ -736,6 +771,9 @@ PORT mcs51_port = "XISEG (XDATA)", // xidata_name - initialized xdata initialized xdata "XINIT (CODE)", // xinit_name - a code copy of xiseg "CONST (CODE)", // const_name - const data (code or not) + "CABS (ABS,CODE)", // cabs_name - const absolute data (code or not) + "XABS (ABS,XDATA)", // xabs_name - absolute xdata/pdata + "IABS (ABS,DATA)", // iabs_name - absolute idata/data NULL, NULL, 1 @@ -767,7 +805,7 @@ PORT mcs51_port = "_", _mcs51_init, _mcs51_parseOptions, - NULL, + _mcs51_options, NULL, _mcs51_finaliseOptions, _mcs51_setDefaultOptions,