PIC port now supports object files. Applied patch from Craig Franklin that started...
authorsdattalo <sdattalo@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 22 Apr 2003 16:45:42 +0000 (16:45 +0000)
committersdattalo <sdattalo@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 22 Apr 2003 16:45:42 +0000 (16:45 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2556 4a8a32a2-be11-0410-ad9d-d568d2c75423

12 files changed:
ChangeLog
src/pic/device.c
src/pic/glue.c
src/pic/main.c
src/pic/pcode.c
src/pic/peeph.def
src/pic/ralloc.c
src/regression/Makefile
src/regression/for.c
src/regression/nestfor.c
src/regression/pointer1.c
src/regression/rt.sh

index 031e95cd47c396ed5b635c01fba896e76b1d5734..c1a1d3efe567eebe88c2b672eb1fb65b417ef59d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2003-04-22  Scott Dattalo  <scott@dattalo.com>
+
+       * src/pic Added object file support for the PIC port
+       * src/pic Applied patch from Craig Franklin (this started the object file support)
+       * src/regression Updated the PIC regression tests for object files
+
 2003-04-20  Borut Razem <borut.razem@siol.net>
 
        * sdcc/as/mcs51/lklex.c: make getfid() more robust and fixed gcc warning:
index 7c0553a658d390d711da02cff2e3ac18fc70870d..68b020e5708c31953e5f9f7206144806cba61252 100644 (file)
@@ -203,14 +203,16 @@ void dump_map(void)
 
 }
 
-void dump_cblock(FILE *of)
+void dump_sfr(FILE *of)
 {
+
   int start=-1;
   int addr=0;
   int bank_base;
+  static int udata_flag=0;
 
   //dump_map();   /* display the register map */
-
+  fprintf(stdout,";dump_sfr  \n");
   if (pic->maxRAMaddress < 0) {
     fprintf(stderr, "missing \"#pragma maxram\" setting\n");
     return;
@@ -236,29 +238,25 @@ void dump_cblock(FILE *of)
         * assumes that the first register in the contiguous group
         * of registers represents the bank for the whole group */
 
-       fprintf(of,"  cblock  0X%04X\t; Bank %d\n",start,finalMapping[start].bank);
+       if ( (start != addr) && (!udata_flag) ) {
+         udata_flag = 1;
+          //fprintf(of,"\tudata\n");
+       }
 
        for( ; start < addr; start++) {
-         if((finalMapping[start].reg) && !finalMapping[start].reg->isEmitted ) {
-           fprintf(of,"\t%s",finalMapping[start].reg->name);
+         if((finalMapping[start].reg) && 
+             (!finalMapping[start].reg->isEmitted) &&
+             (!finalMapping[start].instance) && 
+            (!finalMapping[start].isSFR)) {
 
-           /* If this register is aliased in multiple banks, then
-            * mangle the variable name with the alias address: */
-           if(finalMapping[start].alias & start)
-             fprintf(of,"_%x",bank_base);
+           fprintf(of,"%s\tres\t%i\n",
+                    finalMapping[start].reg->name, 
+                    finalMapping[start].reg->size);
 
-           if(finalMapping[start].instance)
-             fprintf(of,"_%d",finalMapping[start].instance);
-
-           
-           fputc('\n',of);
-
-           //finalMapping[start].reg->isEmitted = 1;
+           finalMapping[start].reg->isEmitted = 1;
          }
        }
 
-       fprintf(of,"  endc\n");
-
        start = -1;
       }
 
@@ -454,7 +452,7 @@ void mapRegister(regs *reg)
 
     do {
 
-      //fprintf(stdout,"mapping %s to address 0x%02x, reg size = %d\n",reg->name, (reg->address+alias+i),reg->size);
+      fprintf(stdout,"mapping %s to address 0x%02x, reg size = %d\n",reg->name, (reg->address+alias+i),reg->size);
 
       finalMapping[reg->address + alias + i].reg = reg;
       finalMapping[reg->address + alias + i].instance = i;
@@ -468,7 +466,7 @@ void mapRegister(regs *reg)
     } while (alias>=0);
   }
 
-  //  fprintf(stderr,"%s - %s addr = 0x%03x, size %d\n",__FUNCTION__,reg->name, reg->address,reg->size);
+  fprintf(stderr,"%s - %s addr = 0x%03x, size %d\n",__FUNCTION__,reg->name, reg->address,reg->size);
 
   reg->isMapped = 1;
 
@@ -480,7 +478,7 @@ int assignRegister(regs *reg, int start_address)
 {
   int i;
 
-  //fprintf(stderr,"%s -  %s start_address = 0x%03x\n",__FUNCTION__,reg->name, start_address);
+  fprintf(stderr,"%s -  %s start_address = 0x%03x\n",__FUNCTION__,reg->name, start_address);
   if(reg->isFixed) {
 
     if (validAddress(reg->address,reg->size)) {
@@ -545,7 +543,7 @@ void assignRelocatableRegisters(set *regset, int used)
   for (reg = setFirstItem(regset) ; reg ; 
        reg = setNextItem(regset)) {
 
-    //fprintf(stdout,"assigning %s isFixed=%d, wasUsed=%d\n",reg->name,reg->isFixed,reg->wasUsed);
+    fprintf(stdout,"assigning %s isFixed=%d, wasUsed=%d\n",reg->name,reg->isFixed,reg->wasUsed);
 
     if((!reg->isFixed) && ( used || reg->wasUsed))
       address = assignRegister(reg,address);
index 3afb569211505d0744539b104ce2e0ef0484368f..2a74a1a32c81f51a809cf123eb374a69dcdead6b 100644 (file)
@@ -41,6 +41,7 @@ extern symbol *interrupts[256];
 static void printIval (symbol * sym, sym_link * type, initList * ilist, pBlock *pb);
 extern int noAlloc;
 extern set *publics;
+extern set *externs;
 extern unsigned maxInterrupts;
 extern int maxRegBank;
 extern symbol *mainf;
@@ -65,6 +66,7 @@ extern void printPublics (FILE * afile);
 
 extern void printChar (FILE * ofile, char *s, int plen);
 void  pCodeInitRegisters(void);
+int getConfigWord(int address);
 
 /*-----------------------------------------------------------------*/
 /* aopLiteral - string from a literal value                        */
@@ -109,99 +111,104 @@ pic14emitRegularMap (memmap * map, bool addPublics, bool arFlag)
 
   /* print the area name */
   for (sym = setFirstItem (map->syms); sym;
-       sym = setNextItem (map->syms))
-    {
+       sym = setNextItem (map->syms)) {
 
-      /* if extern then do nothing */
-      if (IS_EXTERN (sym->etype))
-       continue;
+    printf("%s\n",sym->name);
 
-      /* if allocation required check is needed
-         then check if the symbol really requires
-         allocation only for local variables */
-      if (arFlag && !IS_AGGREGATE (sym->type) &&
-         !(sym->_isparm && !IS_REGPARM (sym->etype)) &&
-         !sym->allocreq && sym->level)
-       continue;
-
-      /* if global variable & not static or extern
-         and addPublics allowed then add it to the public set */
-      if ((sym->level == 0 ||
-          (sym->_isparm && !IS_REGPARM (sym->etype))) &&
-         addPublics &&
-         !IS_STATIC (sym->etype))
-       addSetHead (&publics, sym);
+    /* if extern then add it into the extern list */
+    if (IS_EXTERN (sym->etype)) {
+      addSetHead (&externs, sym);
+      continue;
+    }
 
-      /* if extern then do nothing or is a function
-         then do nothing */
-      if (IS_FUNC (sym->type))
-       continue;
+    /* if allocation required check is needed
+       then check if the symbol really requires
+       allocation only for local variables */
+    if (arFlag && !IS_AGGREGATE (sym->type) &&
+       !(sym->_isparm && !IS_REGPARM (sym->etype)) &&
+       !sym->allocreq && sym->level)
+      continue;
+
+    /* if global variable & not static or extern
+       and addPublics allowed then add it to the public set */
+    if ((sym->level == 0 ||
+        (sym->_isparm && !IS_REGPARM (sym->etype))) &&
+       addPublics &&
+       !IS_STATIC (sym->etype))
+      addSetHead (&publics, sym);
+
+    /* if extern then do nothing or is a function
+       then do nothing */
+    if (IS_FUNC (sym->type))
+      continue;
 #if 0
-      /* print extra debug info if required */
-      if (options.debug || sym->level == 0)
-       {
-         if (!sym->level)      /* global */
-           if (IS_STATIC (sym->etype))
-             fprintf (map->oFile, "F%s_", moduleName);         /* scope is file */
-           else
-             fprintf (map->oFile, "G_");       /* scope is global */
+    /* print extra debug info if required */
+    if (options.debug || sym->level == 0)
+      {
+       if (!sym->level)        /* global */
+         if (IS_STATIC (sym->etype))
+           fprintf (map->oFile, "F%s_", moduleName);           /* scope is file */
          else
-           /* symbol is local */
-           fprintf (map->oFile, "L%s_", (sym->localof ? sym->localof->name : "-null-"));
-         fprintf (map->oFile, "%s_%d_%d", sym->name, sym->level, sym->block);
-       }
+           fprintf (map->oFile, "G_"); /* scope is global */
+       else
+         /* symbol is local */
+         fprintf (map->oFile, "L%s_", (sym->localof ? sym->localof->name : "-null-"));
+       fprintf (map->oFile, "%s_%d_%d", sym->name, sym->level, sym->block);
+      }
 #endif
 
-      /* if is has an absolute address then generate
-         an equate for this no need to allocate space */
-      if (SPEC_ABSA (sym->etype))
-       {
-         //if (options.debug || sym->level == 0)
-         //fprintf (map->oFile,"; == 0x%04x\n",SPEC_ADDR (sym->etype));
-
-         fprintf (map->oFile, "%s\tEQU\t0x%04x\n",
-                  sym->rname,
-                  SPEC_ADDR (sym->etype));
-       }
-      else
-       {
-         /* allocate space */
+    /* if it has an absolute address then generate
+       an equate for this no need to allocate space */
+    if (SPEC_ABSA (sym->etype))
+      {
+       //if (options.debug || sym->level == 0)
+       //fprintf (map->oFile,"; == 0x%04x\n",SPEC_ADDR (sym->etype));
 
-         /* If this is a bit variable, then allocate storage after 8 bits have been declared */
-         /* unlike the 8051, the pic does not have a separate bit area. So we emulate bit ram */
-         /* by grouping the bits together into groups of 8 and storing them in the normal ram. */
-         if (IS_BITVAR (sym->etype))
-           {
-             bitvars++;
-           }
-         else
-           {
-             fprintf (map->oFile, "\t%s\n", sym->rname);
-             if ((size = (unsigned int) getSize (sym->type) & 0xffff) > 1)
-               {
-                 for (i = 1; i < size; i++)
-                   fprintf (map->oFile, "\t%s_%d\n", sym->rname, i);
-               }
-           }
-         //fprintf (map->oFile, "\t.ds\t0x%04x\n", (unsigned int)getSize (sym->type) & 0xffff);
-       }
+       fprintf (map->oFile, "%s\tEQU\t0x%04x\n",
+                sym->rname,
+                SPEC_ADDR (sym->etype));
+      }
+     else
+       {
+        /* allocate space */
+
+        /* If this is a bit variable, then allocate storage after 8 bits have been declared */
+        /* unlike the 8051, the pic does not have a separate bit area. So we emulate bit ram */
+        /* by grouping the bits together into groups of 8 and storing them in the normal ram. */
+        if (IS_BITVAR (sym->etype))
+          {
+            bitvars++;
+          }
+        else
+          {
+            fprintf (map->oFile, "%s\tres\t%d\n", sym->rname,getSize (sym->type) & 0xffff);
+            /*
+            if ((size = (unsigned int) getSize (sym->type) & 0xffff) > 1)
+              {
+                for (i = 1; i < size; i++)
+                  fprintf (map->oFile, "\t%s_%d\n", sym->rname, i);
+              }
+            */
+          }
+        //fprintf (map->oFile, "\t.ds\t0x%04x\n", (unsigned int)getSize (sym->type) & 0xffff);
+       }
        
-       /* if it has a initial value then do it only if
-          it is a global variable */
-       if (sym->ival && sym->level == 0) {
-           ast *ival = NULL;
+    /* if it has a initial value then do it only if
+       it is a global variable */
+    if (sym->ival && sym->level == 0) {
+      ast *ival = NULL;
            
-           if (IS_AGGREGATE (sym->type))
-               ival = initAggregates (sym, sym->ival, NULL);
-           else
-               ival = newNode ('=', newAst_VALUE(symbolVal (sym)),
-                               decorateType (resolveSymbols (list2expr (sym->ival))));
-           codeOutFile = statsg->oFile;
-           GcurMemmap = statsg;
-           eBBlockFromiCode (iCodeFromAst (ival));
-           sym->ival = NULL;
-       }
+      if (IS_AGGREGATE (sym->type))
+       ival = initAggregates (sym, sym->ival, NULL);
+      else
+       ival = newNode ('=', newAst_VALUE(symbolVal (sym)),
+                       decorateType (resolveSymbols (list2expr (sym->ival))));
+      codeOutFile = statsg->oFile;
+      GcurMemmap = statsg;
+      eBBlockFromiCode (iCodeFromAst (ival));
+      sym->ival = NULL;
     }
+  }
 }
 
 
@@ -535,7 +542,6 @@ pic14emitMaps ()
 static void
 pic14createInterruptVect (FILE * vFile)
 {
-  unsigned i = 0;
   mainf = newSymbol ("main", 0);
   mainf->block = 0;
 
@@ -556,29 +562,20 @@ pic14createInterruptVect (FILE * vFile)
       return;
     }
 
-  fprintf (vFile, ";\t.area\t%s\n", CODE_NAME);
-  fprintf (vFile, ";__interrupt_vect:\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");
+  fprintf (vFile, "%s", iComments2);
+  fprintf (vFile, "; config word \n");
+  fprintf (vFile, "%s", iComments2);
+  fprintf (vFile, "\t__config 0x%x\n", getConfigWord(0x2007));
 
+  fprintf (vFile, "%s", iComments2);
+  fprintf (vFile, "; reset and interrupt vectors \n");
+  fprintf (vFile, "%s", iComments2);
+  fprintf (vFile, "STARTUP\t%s\n", CODE_NAME);
+  fprintf (vFile, "\tgoto\t__sdcc_gsinit_startup\n");
+  fprintf (vFile, "\tnop\n");
+  fprintf (vFile, "\tnop\n");
+  fprintf (vFile, "\tgoto\t__sdcc_interrupt\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");
-       }
-    }
 }
 
 
@@ -594,6 +591,23 @@ pic14initialComments (FILE * afile)
 
 }
 
+/*-----------------------------------------------------------------*/
+/* printExterns - generates extern for external variables          */
+/*-----------------------------------------------------------------*/
+static void
+pic14printExterns (FILE * afile)
+{
+  symbol *sym;
+
+  fprintf (afile, "%s", iComments2);
+  fprintf (afile, "; extern variables in this module\n");
+  fprintf (afile, "%s", iComments2);
+
+  for (sym = setFirstItem (externs); sym;
+       sym = setNextItem (externs))
+    fprintf (afile, "\textern %s\n", sym->rname);
+}
+
 /*-----------------------------------------------------------------*/
 /* printPublics - generates .global for publics                    */
 /*-----------------------------------------------------------------*/
@@ -607,12 +621,14 @@ pic14printPublics (FILE * afile)
   fprintf (afile, "%s", iComments2);
 
   for (sym = setFirstItem (publics); sym;
-       sym = setNextItem (publics))
-    fprintf (afile, ";\t.globl %s\n", sym->rname);
+       sym = setNextItem (publics)) {
+    if(!IS_BITFIELD(sym->type) && ((IS_FUNC(sym->type) || sym->allocreq)))
+      fprintf (afile, "\tglobal %s\n", sym->rname);
+    else
+      fprintf (afile, ";\tglobal %s\n", sym->rname);
+  }
 }
 
-
-
 /*-----------------------------------------------------------------*/
 /* emitOverlay - will emit code for the overlay stuff              */
 /*-----------------------------------------------------------------*/
@@ -622,7 +638,7 @@ pic14emitOverlay (FILE * afile)
   set *ovrset;
 
   if (!elementsInSet (ovrSetSets))
-    fprintf (afile, ";\t.area\t%s\n", port->mem.overlay_name);
+    fprintf (afile, "\t%s\n", port->mem.overlay_name);
 
   /* for each of the sets in the overlay segment do */
   for (ovrset = setFirstItem (ovrSetSets); ovrset;
@@ -637,6 +653,9 @@ pic14emitOverlay (FILE * afile)
             otherwise the assembler will append each of these
             declarations into one chunk and will not overlay
             sad but true */
+             
+          /* I don't think this applies to us. We are using gpasm.  CRF */
+          
          fprintf (afile, ";\t.area _DUMMY\n");
          /* output the area informtion */
          fprintf (afile, ";\t.area\t%s\n", port->mem.overlay_name);    /* MOF */
@@ -823,16 +842,23 @@ picglue ()
       port->genAssemblerPreamble(asmFile);
     }
     
+  /* print the extern variables in this module */
+  pic14printExterns (asmFile);
+
   /* print the global variables in this module */
   pic14printPublics (asmFile);
-    
 
   /* copy the sfr segment */
   fprintf (asmFile, "%s", iComments2);
   fprintf (asmFile, "; special function registers\n");
   fprintf (asmFile, "%s", iComments2);
   copyFile (asmFile, sfr->oFile);
-    
+
+  fprintf (asmFile, "%s", iComments2);
+  fprintf (asmFile, "; udata\n");
+  fprintf (asmFile, "%s", iComments2);
+  fprintf (asmFile, "\tudata\n");
+  copyFile (asmFile, data->oFile);
 
   /* Put all variables into a cblock */
   AnalyzeBanking();
@@ -844,6 +870,8 @@ picglue ()
   fprintf (asmFile, "%s", iComments2);    
   copyFile (asmFile, ovrFile);
 
+#if 0
+
   /* create the stack segment MOF */
   if (mainf && IFFUNC_HASBODY(mainf->type)) {
     fprintf (asmFile, "%s", iComments2);
@@ -867,14 +895,14 @@ picglue ()
     fprintf (asmFile,";\t.area XSEG (XDATA)\n"); /* MOF */
     fprintf (asmFile,";\t.ds 256\n");
   }
-       
-       
+
   /* copy xtern ram data */
   fprintf (asmFile, "%s", iComments2);
   fprintf (asmFile, "; external ram data\n");
   fprintf (asmFile, "%s", iComments2);
   copyFile (asmFile, xdata->oFile);
-    
+
+#endif
 
   /* copy the bit segment */
   fprintf (asmFile, "%s", iComments2);
@@ -882,72 +910,57 @@ picglue ()
   fprintf (asmFile, "%s", iComments2);
   copyFile (asmFile, bit->oFile);
 
-
-  fprintf (asmFile, "\tORG 0\n");
-
   /* copy the interrupt vector table */
   if (mainf && IFFUNC_HASBODY(mainf->type)) {
+    copyFile (asmFile, vFile);
+    
     fprintf (asmFile, "%s", iComments2);
-    fprintf (asmFile, "; interrupt vector \n");
+    fprintf (asmFile, "; initialization and interrupt code \n");
     fprintf (asmFile, "%s", iComments2);
-    copyFile (asmFile, vFile);
+
+    /* initialize data memory */
+    fprintf (asmFile, "code_init\t%s\t0x10\n", CODE_NAME);
+    fprintf (asmFile,"__sdcc_gsinit_startup:\n");
+    /* FIXME: This is temporary.  The idata section should be used.  If 
+       not, we could add a special feature to the linker.  This will 
+       work in the mean time.  Put all initalized data in main.c */
+    copypCode(asmFile, statsg->dbName);
+    fprintf (asmFile,"\tpagesel _main\n");
+    fprintf (asmFile,"\tgoto _main\n");
+
+    /* interrupt service routine */
+    fprintf (asmFile, "__sdcc_interrupt:\n");
+    copypCode(asmFile, 'I');
+    fprintf (asmFile,"\tgoto $\n");
   }
-    
+
+#if 0    
+
   /* copy global & static initialisations */
   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 && IFFUNC_HASBODY(mainf->type)) {
-    fprintf (asmFile,"__sdcc_gsinit_startup:\n");
-    /* if external stack is specified then the
-       higher order byte of the xdatalocation is
-       going into P2 and the lower order going into
-       spx */
-    if (options.useXstack) {
-      fprintf(asmFile,";\tmov\tP2,#0x%02x\n",
-             (((unsigned int)options.xdata_loc) >> 8) & 0xff);
-      fprintf(asmFile,";\tmov\t_spx,#0x%02x\n",
-             (unsigned int)options.xdata_loc & 0xff);
-    }
+  copypCode(asmFile, statsg->dbName);
 
-  }
+#endif
 
-  if (port->general.glue_up_main && mainf && IFFUNC_HASBODY(mainf->type))
-    {
-      /* 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");
   fprintf (asmFile, "%s", iComments2);
-  fprintf (asmFile, ";\t.area %s\n", port->mem.code_name);
-
-  //copyFile (stderr, code->oFile);
+  fprintf (asmFile, "code_%s\t%s\n", moduleName, port->mem.code_name);
 
-  copypCode(asmFile, 'I');
-  copypCode(asmFile, statsg->dbName);
+  /* unknown */
   copypCode(asmFile, 'X');
+  
+  /* _main function */
   copypCode(asmFile, 'M');
+
+  /* other functions */
   copypCode(asmFile, code->dbName);
-  copypCode(asmFile, 'P');
 
+  /* unknown */
+  copypCode(asmFile, 'P');
 
   fprintf (asmFile,"\tend\n");
 
index 986b9d7488e6ba3a9e659ca241028dcabb1dc964..486a4b819e897f2c3feb4a882eee05f0536827b0 100644 (file)
@@ -239,7 +239,6 @@ _pic14_genAssemblerPreamble (FILE * of)
   }
 
   fprintf (of, "\tlist\tp=%s\n",&name[1]);
-  fprintf (of, "\t__CONFIG 0x%x\n",getConfigWord(0x2007));
   fprintf (of, "\tradix dec");
   fprintf (of, "\ninclude \"%s.inc\"\n",name);
 }
@@ -328,20 +327,13 @@ _hasNativeMulFor (iCode *ic, sym_link *left, sym_link *right)
 */
 static const char *_linkCmd[] =
 {
-  "aslink", "-nf", "$1", NULL
+  "gplink", "-nf", "$1", NULL
 };
 
-/* Sigh. This really is not good. For now, I recommend:
- * sdcc -S -mpic14 file.c
- * the -S option does not compile or link
- */
 static const char *_asmCmd[] =
 {
-  /* This should be:
-   * "gpasm", "-c  -I \"{datadir}\" -o \"$2\"", "\"$1.asm\"", NULL
-   * but unfortunately buildCmdLine() doesn't expand {xxx} macros.
-   */
-  "gpasm", "-c  -I \"/usr/local/share/gpasm/header\" -o \"$2\"", "\"$1.asm\"", NULL
+  "gpasm", "-c", "$1.asm", NULL
+
 };
 
 /* Globals */
@@ -350,7 +342,7 @@ PORT pic_port =
   TARGET_ID_PIC,
   "pic14",
   "MCU pic",                   /* Target name */
-  "p16f877",                    /* Processor */
+  "",                    /* Processor */
   {
     TRUE,                      /* Emit glue around main */
     MODEL_SMALL | MODEL_LARGE | MODEL_FLAT24,
@@ -371,7 +363,7 @@ PORT pic_port =
     _linkCmd,
     NULL,
     NULL,
-    ".rel"
+    ".o"
   },
   {
     _defaultRules
@@ -387,14 +379,14 @@ PORT pic_port =
   {
     "XSEG    (XDATA)",
     "STACK   (DATA)",
-    "CSEG    (CODE)",
+    "code",
     "DSEG    (DATA)",
     "ISEG    (DATA)",
     "XSEG    (XDATA)",
     "BSEG    (BIT)",
     "RSEG    (DATA)",
     "GSINIT  (CODE)",
-    "OSEG    (OVR,DATA)",
+    "udata_ovr",
     "GSFINAL (CODE)",
     "HOME       (CODE)",
     NULL, // xidata
index f99510028e5701f78eb612ef2b9ce7e648635da8..3b2b7d91b14917ef41dd58cb28fe7291a35297f3 100644 (file)
@@ -50,12 +50,12 @@ peepCommand peepCommands[] = {
 
 
 // Eventually this will go into device dependent files:
-pCodeOpReg pc_status    = {{PO_STATUS,  "_STATUS"}, -1, NULL,0,NULL};
+pCodeOpReg pc_status    = {{PO_STATUS,  "STATUS"}, -1, NULL,0,NULL};
 pCodeOpReg pc_indf      = {{PO_INDF,    "INDF"}, -1, NULL,0,NULL};
 pCodeOpReg pc_fsr       = {{PO_FSR,     "FSR"}, -1, NULL,0,NULL};
 pCodeOpReg pc_intcon    = {{PO_INTCON,  ""}, -1, NULL,0,NULL};
 pCodeOpReg pc_pcl       = {{PO_PCL,     "PCL"}, -1, NULL,0,NULL};
-pCodeOpReg pc_pclath    = {{PO_PCLATH,  "_PCLATH"}, -1, NULL,0,NULL};
+pCodeOpReg pc_pclath    = {{PO_PCLATH,  "PCLATH"}, -1, NULL,0,NULL};
 
 pCodeOpReg pc_kzero     = {{PO_GPR_REGISTER,  "KZ"}, -1, NULL,0,NULL};
 pCodeOpReg pc_wsave     = {{PO_GPR_REGISTER,  "WSAVE"}, -1, NULL,0,NULL};
@@ -75,7 +75,7 @@ static pBlock *pb_dead_pcodes = NULL;
 /* Hardcoded flags to change the behavior of the PIC port */
 static int peepOptimizing = 1;        /* run the peephole optimizer if nonzero */
 static int functionInlining = 1;      /* inline functions if nonzero */
-int debug_verbose = 1;                /* Set true to inundate .asm file */
+int debug_verbose = 0;                /* Set true to inundate .asm file */
 
 // static int GpCodeSequenceNumber = 1;
 int GpcFlowSeq = 1;
@@ -1285,9 +1285,9 @@ void  pCodeInitRegisters(void)
   initStack(0xfff, 8);
   init_pic(port->processor);
 
-  pc_status.r = allocProcessorRegister(IDX_STATUS,"_STATUS", PO_STATUS, 0x80);
+  pc_status.r = allocProcessorRegister(IDX_STATUS,"STATUS", PO_STATUS, 0x80);
   pc_pcl.r = allocProcessorRegister(IDX_PCL,"PCL", PO_PCL, 0x80);
-  pc_pclath.r = allocProcessorRegister(IDX_PCLATH,"_PCLATH", PO_PCLATH, 0x80);
+  pc_pclath.r = allocProcessorRegister(IDX_PCLATH,"PCLATH", PO_PCLATH, 0x80);
   pc_fsr.r = allocProcessorRegister(IDX_FSR,"FSR", PO_FSR, 0x80);
   pc_indf.r = allocProcessorRegister(IDX_INDF,"INDF", PO_INDF, 0x80);
   pc_intcon.r = allocProcessorRegister(IDX_INTCON,"INTCON", PO_INTCON, 0x80);
@@ -1567,6 +1567,7 @@ void copypCode(FILE *of, char dbName)
     if(getpBlock_dbName(pb) == dbName) {
       pBlockStats(of,pb);
       printpBlock(of,pb);
+      fprintf (of, "\n");
     }
   }
 
@@ -2537,10 +2538,19 @@ char *get_op(pCodeOp *pcop,char *buffer, size_t size)
       if(PCOI(pcop)->_const) {
 
        if( PCOI(pcop)->offset && PCOI(pcop)->offset<4) {
-         SAFE_snprintf(&s,&size,"(((%s+%d) >> %d)&0xff)",
-                       pcop->name,
-                       PCOI(pcop)->index,
-                       8 * PCOI(pcop)->offset );
+         switch(PCOI(pcop)->offset) {
+         case 0:
+           SAFE_snprintf(&s,&size,"low %s",pcop->name);
+           break;
+         case 1:
+           SAFE_snprintf(&s,&size,"high %s",pcop->name);
+           break;
+         default:
+           SAFE_snprintf(&s,&size,"(((%s+%d) >> %d)&0xff)",
+                         pcop->name,
+                         PCOI(pcop)->index,
+                         8 * PCOI(pcop)->offset );
+         }
        } else
          SAFE_snprintf(&s,&size,"LOW(%s+%d)",pcop->name,PCOI(pcop)->index);
       } else {
@@ -2550,10 +2560,16 @@ char *get_op(pCodeOp *pcop,char *buffer, size_t size)
                        pcop->name,
                        PCOI(pcop)->index );
        } else {
-         if(PCOI(pcop)->offset)
-           SAFE_snprintf(&s,&size,"(%s >> %d)&0xff",pcop->name, 8*PCOI(pcop)->offset);
-         else
+         switch(PCOI(pcop)->offset) {
+         case 0:
            SAFE_snprintf(&s,&size,"%s",pcop->name);
+           break;
+         case 1:
+           SAFE_snprintf(&s,&size,"high %s",pcop->name);
+           break;
+         default:
+           SAFE_snprintf(&s,&size,"(%s >> %d)&0xff",pcop->name, 8*PCOI(pcop)->offset);
+         }
        }
       }
 
index f705c9e53c4a817938147afd83cd11e597761e5d..08d541b738ac1dffc476207d6663b8bf725acc79 100644 (file)
@@ -164,7 +164,7 @@ replace restart {
 replace restart {
        decf    %1,f
        movf    %1,w
-       btfss   _STATUS,z
+       btfss   STATUS,z
        goto    %2
 } by {
        ;     peep 3 - decf/mov/skpz to decfsz
index 42ec8f8465c55a12a56807ee12f1f548e845128d..5332a8f455e8e7cc0f109f27b13548e992c01ca1 100644 (file)
@@ -454,7 +454,7 @@ static regs* newReg(short type, short pc_type, int rIdx, char *name, int size, i
       *buffer = 's';
     dReg->name = Safe_strdup(buffer);
   }
-  //fprintf(stderr,"newReg: %s, rIdx = 0x%02x\n",dReg->name,rIdx);
+  fprintf(stderr,"newReg: %s, rIdx = 0x%02x\n",dReg->name,rIdx);
   dReg->isFree = 0;
   dReg->wasUsed = 1;
   if(type == REG_SFR)
@@ -949,8 +949,7 @@ void writeSetUsedRegs(FILE *of, set *dRegs)
 extern void assignFixedRegisters(set *regset);
 extern void assignRelocatableRegisters(set *regset,int used);
 extern void dump_map(void);
-extern void dump_cblock(FILE *of);
-
+extern void dump_sfr(FILE *of);
 
 void packBits(set *bregs)
 {
@@ -968,10 +967,10 @@ void packBits(set *bregs)
 
     breg = regset->item;
     breg->isBitField = 1;
-    //fprintf(stderr,"bit reg: %s\n",breg->name);
+    fprintf(stderr,"bit reg: %s\n",breg->name);
 
     if(breg->isFixed) {
-      //fprintf(stderr,"packing bit at fixed address = 0x%03x\n",breg->address);
+      fprintf(stderr,"packing bit at fixed address = 0x%03x\n",breg->address);
 
       bitfield = typeRegWithIdx (breg->address >> 3, -1 , 1);
       breg->rIdx = breg->address & 7;
@@ -979,12 +978,13 @@ void packBits(set *bregs)
 
       if(!bitfield) {
        sprintf (buffer, "fbitfield%02x", breg->address);
-       //fprintf(stderr,"new bit field\n");
+       fprintf(stderr,"new bit field\n");
        bitfield = newReg(REG_SFR, PO_GPR_BIT,breg->address,buffer,1,0);
        bitfield->isBitField = 1;
        bitfield->isFixed = 1;
        bitfield->address = breg->address;
-       addSet(&dynDirectRegs,bitfield);
+       //addSet(&dynDirectRegs,bitfield);
+       addSet(&dynInternalRegs,bitfield);
        //hTabAddItem(&dynDirectRegNames, regname2key(buffer), bitfield);
       } else {
        //fprintf(stderr,"  which is occupied by %s (addr = %d)\n",bitfield->name,bitfield->address);
@@ -998,10 +998,11 @@ void packBits(set *bregs)
        byte_no++;
        bit_no=0;
        sprintf (buffer, "bitfield%d", byte_no);
-       //fprintf(stderr,"new relocatable bit field\n");
+       fprintf(stderr,"new relocatable bit field\n");
        relocbitfield = newReg(REG_GPR, PO_GPR_BIT,rDirectIdx++,buffer,1,0);
        relocbitfield->isBitField = 1;
-       addSet(&dynDirectRegs,relocbitfield);
+       //addSet(&dynDirectRegs,relocbitfield);
+       addSet(&dynInternalRegs,relocbitfield);
        //hTabAddItem(&dynDirectRegNames, regname2key(buffer), relocbitfield);
 
       }
@@ -1054,7 +1055,8 @@ void aliasEQUs(FILE *of, set *fregs, int use_rIdx)
   for (reg = setFirstItem(fregs) ; reg ;
        reg = setNextItem(fregs)) {
 
-    if(!reg->isEmitted && reg->wasUsed) {
+    //if(!reg->isEmitted && reg->wasUsed) {
+    if(reg->wasUsed) {
       if(use_rIdx)
        fprintf (of, "%s\tEQU\t0x%03x\n",
                 reg->name,
@@ -1072,25 +1074,33 @@ void writeUsedRegs(FILE *of)
 {
   packBits(dynDirectBitRegs);
 
-
   assignFixedRegisters(dynAllocRegs);
+  printf("assignFixedRegisters(dynAllocRegs);\n");
   assignFixedRegisters(dynStackRegs);
+  printf("assignFixedRegisters(dynStackRegs);\n");
   assignFixedRegisters(dynDirectRegs);
+  printf("assignFixedRegisters(dynDirectRegs);\n");
 
   assignRelocatableRegisters(dynInternalRegs,0);
+  printf("assignRelocatableRegisters(dynInternalRegs,0);\n");
   assignRelocatableRegisters(dynAllocRegs,0);
+  printf("assignRelocatableRegisters(dynAllocRegs,0);\n");
   assignRelocatableRegisters(dynStackRegs,0);
+  printf("assignRelocatableRegisters(dynStackRegs,0);\n");
+/*
   assignRelocatableRegisters(dynDirectRegs,0);
-
+  printf("assignRelocatableRegisters(dynDirectRegs,0);\n");
+*/
   //dump_map();
 
-  dump_cblock(of);
+  dump_sfr(of);
   bitEQUs(of,dynDirectBitRegs);
+/*
   aliasEQUs(of,dynAllocRegs,0);
   aliasEQUs(of,dynDirectRegs,0);
   aliasEQUs(of,dynStackRegs,0);
   aliasEQUs(of,dynProcessorRegs,1);
-
+*/
 }
 
 #if 0
index fbcda342671443b3be7978323f5a57e80ce45b14..50df1b67b2262a16dace8edeaab5fc63c9165108 100644 (file)
@@ -14,7 +14,7 @@
 # is unique to the PIC (as in Microchip PIC) port.
 # As such it requires the following software:
 #
-#  gpasm version 0.8.10 (or greater)
+#  gpasm version 0.11.1 (or greater)
 #  gpsim version 0.20.7 (or greater)
 #
 # Usage:
 # make cleancod
 # make cleanasm
 # make cleanstc
-#  - removes either the .stc, .asm, or .cod files
+# make cleano
+#  - removes either the .stc, .asm, .cod or .o files
 
 
 CC = ../../bin/sdcc
-
-#HEADER=/usr/local/share/gpasm/header
+LINKER = gplink
+TARGETPIC = 16f873
+CFLAGS = -mpic14 -c -pp$(TARGETPIC)
 
 .SUFFIXES: .asm .c .cod .stc
 
@@ -97,19 +99,25 @@ SRC = b.c \
 
 COD := $(patsubst %.c, %.cod, $(SRC))
 ASM := $(patsubst %.c, %.asm, $(SRC))
+O := $(patsubst %.c, %.o, $(SRC))
 STC := $(patsubst %.c, %.stc, $(SRC))
+HEX := $(patsubst %.c, %.hex, $(SRC))
+LST := $(patsubst %.c, %.lst, $(SRC))
+MAP := $(patsubst %.c, %.map, $(SRC))
 
 all:   test
 
 
 # The asm files are generated by sdcc
-.c.asm:
-       $(CC) -mpic14 -S $*.c
+.c.o:
+       $(CC) $(CFLAGS)  $*.c
 
 # The .cod files are generated by gpasm
 # these get loaded by gpsim.
-.asm.cod:
-       gpasm $*.asm
+.o.cod:
+       $(LINKER) --map -c -s $(TARGETPIC).lkr -o $*.o $*.o
+
+#      gpasm $*.asm
 
 #      gpasm -c -I $(HEADER) $*.asm
 
@@ -127,6 +135,7 @@ all:        test
 
 cod : $(COD)
 
+o : $(O)
 
 asm : $(ASM)
 
@@ -141,6 +150,12 @@ cleancod:
          if [ -f $$f ]; then rm $$f; fi \
        done ; \
 
+cleano:
+       files="$(O)" ; \
+       for f in $$files ; do \
+         if [ -f $$f ]; then rm $$f; fi \
+       done ; \
+
 cleanasm:
        files="$(ASM)" ; \
        for f in $$files ; do \
@@ -153,5 +168,17 @@ cleanstc:
          if [ -f $$f ]; then rm $$f; fi \
        done ; \
 
-clean: cleancod cleanasm cleanstc
+cleanhex:
+       files="$(HEX)" ; \
+       for f in $$files ; do \
+         if [ -f $$f ]; then rm $$f; fi \
+       done ; \
+
+cleanlst:
+       files="$(LST)" ; \
+       for f in $$files ; do \
+         if [ -f $$f ]; then rm $$f; fi \
+       done ; \
+
+clean: cleancod cleanasm cleanstc cleano cleanhex cleanlst
        if [ -f "$(LOGFILE)" ]; then rm $(LOGFILE); fi
index 1f6cbbb78caf06742f4173e459b67788fedbe906..db3e73345b8936dc6c8ec171db98f34d513af859 100644 (file)
@@ -12,8 +12,6 @@ unsigned int uint1 = 0;
 unsigned char uchar0 = 0;
 unsigned char uchar1 = 0;
 
-unsigned char call3(void);
-
 void done()
 {
 
index 8b22cae11c12dd8e7654e0a35f17b715a3270eff..6ce48fc8043ff5d4620547888a8f081c70c222a5 100644 (file)
@@ -12,8 +12,6 @@ unsigned int uint1 = 0;
 unsigned char uchar0 = 0;
 unsigned char uchar1 = 0;
 
-unsigned char call3(void);
-
 void dput(unsigned char val)
 {
        PORTB = val;
index b030c1b37a1d9320e91530db5ea109ed574d0efd..839c65d4d3a25c54beb83da7d8aee9f7f2f9dd95 100644 (file)
@@ -113,7 +113,6 @@ main (void)
   if(buff[achar0 + 7] != 4+7)
     failures++;
 
-  //  dummy = buff[5];
   dummy = buff[achar0];
 
   if(dummy != 4)
index da4d72c20843055212c43324c698397c26962319..5b1ca1fc55a14f513909822d1bc8c0f4f27ad0e9 100755 (executable)
@@ -8,10 +8,16 @@ if [ $# -lt 1 ] ; then
 fi
 
 # compile
-../../bin/sdcc -S -mpic14 $1.c
+# ../../bin/sdcc -S -mpic14 $1.c
+../../bin/sdcc -c -mpic14 -pp16f873 $1.c
 #gpasm -c  -I /usr/local/share/gpasm/header $1.asm
-gpasm  $1.asm
+#gpasm  $1.asm
+
+# create the executable
+
+gplink --map -c -s 16f877.lkr -o $1.o $1.o
 ./create_stc $1.cod $1.stc
+
 ./simulate $1.stc garbage.log
 cat garbage.log
 rm garbage.log