#include "main.h"
#include "ralloc.h"
#include "gen.h"
+#include "peep.h"
+#include "dbuf_string.h"
#include "../SDCCutil.h"
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[] =
{
/* 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;
asmLineNode *aln = newAsmLineNode();
char *op, op1[256], op2[256];
int opsize;
- const unsigned char *p;
+ const char *p;
char inst[8];
mcs51opcodedata *opdat;
MODEL_SMALL | MODEL_MEDIUM | MODEL_LARGE,
MODEL_SMALL
},
- {
+ { /* Assembler */
_asmCmd,
NULL,
"-plosgffc", /* Options with debug */
".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
"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
"_",
_mcs51_init,
_mcs51_parseOptions,
- NULL,
+ _mcs51_options,
NULL,
_mcs51_finaliseOptions,
_mcs51_setDefaultOptions,