#include <time.h>
symbol *interrupts[256];
-extern char *aopLiteral (value *, int);
+/*extern char *aopLiteral (value *, int);*//* drdani Jan 30 2000 */
void printIval (symbol *, link *, initList *, FILE *);
extern int noAlloc;
set *publics = NULL; /* public variables */
+
+/* TODO: this should be configurable (DS803C90 uses more than 6) */
int maxInterrupts = 6;
extern int maxRegBank ;
symbol *mainf;
if (SPEC_SCLS(expr->left->etype) == S_IDATA)
DCL_TYPE(val->type) = IPOINTER ;
else
- DCL_TYPE(val->type) = POINTER ;
+ if (SPEC_SCLS(expr->left->etype) == S_FLASH)
+ DCL_TYPE(val->type) = FLPOINTER ;
+ else
+ DCL_TYPE(val->type) = POINTER ;
val->type->next = expr->left->ftype;
val->etype = getSpec(val->type);
return val;
return;
}
- fprintf (vFile, "\t.area\tCODE (CODE)\n");
+ fprintf (vFile, "\t.area\t%s\n", CODE_NAME);
fprintf (vFile, "__interrupt_vect:\n");
+
- fprintf (vFile, "\tljmp\t__sdcc_gsinit_startup\n");
+ if (!port->genIVT || ! (port->genIVT(vFile, interrupts, maxInterrupts)))
+ {
+ /* "generic" interrupt table header (if port doesn't specify one).
+ *
+ * Look suspiciously like 8051 code to me...
+ */
+ fprintf (vFile, "\tljmp\t__sdcc_gsinit_startup\n");
- /* now for the other interrupts */
- for (; i < maxInterrupts; i++) {
- if (interrupts[i])
- fprintf (vFile, "\tljmp\t%s\n\t.ds\t5\n", interrupts[i]->rname);
- else
- fprintf (vFile, "\treti\n\t.ds\t7\n");
+
+ /* now for the other interrupts */
+ for (; i < maxInterrupts; i++) {
+ if (interrupts[i])
+ fprintf (vFile, "\tljmp\t%s\n\t.ds\t5\n", interrupts[i]->rname);
+ else
+ fprintf (vFile, "\treti\n\t.ds\t7\n");
+ }
}
}
if (options.debug)
cdbStructBlock (0,cdbFile);
- /* create the interrupt vector table */
- createInterruptVect ((vFile = tmpfile ()));
+ vFile = tmpfile();
+ /* PENDING: this isnt the best place but it will do */
+ if (port->general.glue_up_main) {
+ /* create the interrupt vector table */
+ createInterruptVect (vFile);
+ }
+
addSetHead(&tmpfileSet,vFile);
/* emit code for the all the variables declared */
/* now put it all together into the assembler file */
/* create the assembler file name */
- sprintf (buffer, srcFileName);
- strcat (buffer, ".asm");
+
+ if (!options.c1mode) {
+ sprintf (buffer, srcFileName);
+ strcat (buffer, ".asm");
+ }
+ else {
+ strcpy(buffer, options.out_name);
+ }
+
if (!(asmFile = fopen (buffer, "w"))) {
werror (E_FILE_OPEN_ERR, buffer);
exit (1);
/* print module name */
fprintf (asmFile, "\t.module %s\n", moduleName);
+ /* Let the port generate any global directives, etc. */
+ if (port->genAssemblerPreamble)
+ {
+ port->genAssemblerPreamble(asmFile);
+ }
+
/* print the global variables in this module */
printPublics (asmFile);
-
/* copy the sfr segment */
fprintf (asmFile, "%s", iComments2);
fprintf (asmFile, "%s", iComments2);
fprintf (asmFile, "; global & static initialisations\n");
fprintf (asmFile, "%s", iComments2);
+
+ /* Everywhere we generate a reference to the static_name area,
+ * (which is currently only here), we immediately follow it with a
+ * definition of the post_static_name area. This guarantees that
+ * the post_static_name area will immediately follow the static_name
+ * area.
+ */
fprintf (asmFile, "\t.area %s\n", port->mem.static_name); /* MOF */
+ fprintf (asmFile, "\t.area %s\n", port->mem.post_static_name);
+ fprintf (asmFile, "\t.area %s\n", port->mem.static_name);
+
if (mainf && mainf->fbody) {
fprintf (asmFile,"__sdcc_gsinit_startup:\n");
/* if external stack is specified then the
}
copyFile (asmFile, statsg->oFile);
-
+
+ if (port->general.glue_up_main && mainf && mainf->fbody)
+ {
+ /* This code is generated in the post-static area.
+ * This area is guaranteed to follow the static area
+ * by the ugly shucking and jiving about 20 lines ago.
+ */
+ fprintf(asmFile, "\t.area %s\n", port->mem.post_static_name);
+ fprintf (asmFile,"\tljmp\t__sdcc_program_startup\n");
+ }
+
/* copy over code */
fprintf (asmFile, "%s", iComments2);
fprintf (asmFile, "; code\n");