2001-10-21 Michael Hope <michaelh@juju.net.nz>
[fw/sdcc] / src / mcs51 / main.c
1 /** @file main.c
2     mcs51 specific general functions.
3
4     Note that mlh prepended _mcs51_ on the static functions.  Makes
5     it easier to set a breakpoint using the debugger.
6 */
7 #include "common.h"
8 #include "main.h"
9 #include "ralloc.h"
10 #include "gen.h"
11
12 static char _defaultRules[] =
13 {
14 #include "peeph.rul"
15 };
16
17 /* list of key words used by msc51 */
18 static char *_mcs51_keywords[] =
19 {
20   "at",
21   "bit",
22   "code",
23   "critical",
24   "data",
25   "far",
26   "idata",
27   "interrupt",
28   "near",
29   "pdata",
30   "reentrant",
31   "sfr",
32   "sbit",
33   "using",
34   "xdata",
35   "_data",
36   "_code",
37   "_generic",
38   "_near",
39   "_xdata",
40   "_pdata",
41   "_idata",
42   "_naked",
43   NULL
44 };
45
46
47 void mcs51_assignRegisters (eBBlock ** ebbs, int count);
48
49 static int regParmFlg = 0;      /* determine if we can register a parameter */
50
51 static void
52 _mcs51_init (void)
53 {
54   asm_addTree (&asm_asxxxx_mapping);
55 }
56
57 static void
58 _mcs51_reset_regparm ()
59 {
60   regParmFlg = 0;
61 }
62
63 static int
64 _mcs51_regparm (sym_link * l)
65 {
66   /* for this processor it is simple
67      can pass only the first parameter in a register */
68   if (regParmFlg)
69     return 0;
70
71   regParmFlg = 1;
72   return 1;
73 }
74
75 static bool
76 _mcs51_parseOptions (int *pargc, char **argv, int *i)
77 {
78   /* TODO: allow port-specific command line options to specify
79    * segment names here.
80    */
81   return FALSE;
82 }
83
84 static void
85 _mcs51_finaliseOptions (void)
86 {
87   if (options.model == MODEL_LARGE) {
88       port->mem.default_local_map = xdata;
89       port->mem.default_globl_map = xdata;
90     }
91   else
92     {
93       port->mem.default_local_map = data;
94       port->mem.default_globl_map = data;
95     }
96 }
97
98 static void
99 _mcs51_setDefaultOptions (void)
100 {
101 }
102
103 static const char *
104 _mcs51_getRegName (struct regs *reg)
105 {
106   if (reg)
107     return reg->name;
108   return "err";
109 }
110
111 static void
112 _mcs51_genAssemblerPreamble (FILE * of)
113 {
114 }
115
116 /* Generate interrupt vector table. */
117 static int
118 _mcs51_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts)
119 {
120   return FALSE;
121 }
122
123 /** $1 is always the basename.
124     $2 is always the output file.
125     $3 varies
126     $l is the list of extra options that should be there somewhere...
127     MUST be terminated with a NULL.
128 */
129 static const char *_linkCmd[] =
130 {
131   "{bindir}{sep}aslink", "-nf", "$1", NULL
132 };
133
134 /* $3 is replaced by assembler.debug_opts resp. port->assembler.plain_opts */
135 static const char *_asmCmd[] =
136 {
137   "asx8051", "$l", "$3", "$1.asm", NULL
138 };
139
140 /* Globals */
141 PORT mcs51_port =
142 {
143   TARGET_ID_MCS51,
144   "mcs51",
145   "MCU 8051",                   /* Target name */
146   {
147     TRUE,                       /* Emit glue around main */
148     MODEL_SMALL | MODEL_LARGE,
149     MODEL_SMALL
150   },
151   {
152     _asmCmd,
153     NULL,
154     "-plosgffc",                /* Options with debug */
155     "-plosgff",                 /* Options without debug */
156     0,
157     ".asm"
158   },
159   {
160     _linkCmd,
161     NULL,
162     NULL,
163     ".rel"
164   },
165   {
166     _defaultRules
167   },
168   {
169         /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
170     1, 2, 2, 4, 1, 2, 3, 1, 4, 4
171   },
172   {
173     "XSEG    (XDATA)",
174     "STACK   (DATA)",
175     "CSEG    (CODE)",
176     "DSEG    (DATA)",
177     "ISEG    (DATA)",
178     "XSEG    (XDATA)",
179     "BSEG    (BIT)",
180     "RSEG    (DATA)",
181     "GSINIT  (CODE)",
182     "OSEG    (OVR,DATA)",
183     "GSFINAL (CODE)",
184     "HOME        (CODE)",
185     NULL,
186     NULL,
187     1
188   },
189   {
190     +1, 1, 4, 1, 1, 0
191   },
192     /* mcs51 has an 8 bit mul */
193   {
194     1, -1
195   },
196   "_",
197   _mcs51_init,
198   _mcs51_parseOptions,
199   _mcs51_finaliseOptions,
200   _mcs51_setDefaultOptions,
201   mcs51_assignRegisters,
202   _mcs51_getRegName,
203   _mcs51_keywords,
204   _mcs51_genAssemblerPreamble,
205   _mcs51_genIVT,
206   _mcs51_reset_regparm,
207   _mcs51_regparm,
208   NULL,
209   NULL,
210   NULL,
211   FALSE,
212   0,                            /* leave lt */
213   0,                            /* leave gt */
214   1,                            /* transform <= to ! > */
215   1,                            /* transform >= to ! < */
216   1,                            /* transform != to !(a == b) */
217   0,                            /* leave == */
218   FALSE,                        /* No array initializer support. */
219   PORT_MAGIC
220 };