#include "asm.h"
#include <time.h>
+#ifndef __BORLANDC__
+// This is a bit messy because we define link ourself
+#define link NoLiNk
+#include <unistd.h>
+#undef link
+#else
+// No unistd.h in Borland C++
+#endif
+
symbol *interrupts[256];
-/*extern char *aopLiteral (value *, int);*//* drdani Jan 30 2000 */
+
void printIval (symbol *, link *, initList *, FILE *);
-extern int noAlloc;
set *publics = NULL; /* public variables */
set *externs = NULL; /* Varibles that are declared as extern */
/* TODO: this should be configurable (DS803C90 uses more than 6) */
int maxInterrupts = 6;
int allocInfo = 1;
-extern int maxRegBank ;
symbol *mainf;
extern char *VersionString;
-extern FILE *codeOutFile;
set *tmpfileSet = NULL; /* set of tmp file created by the compiler */
set *tmpfileNameSet = NULL; /* All are unlinked at close. */
tfprintf(map->oFile, "\t!ds\n", (unsigned int)getSize (sym->type) & 0xffff);
}
- /* if it has a initial value then do it only if
+ /* if it has an 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 (EX_VALUE, symbolVal (sym)),
+ ival = newNode ('=', newAst_VALUE(symbolVal (sym)),
decorateType (resolveSymbols (list2expr (sym->ival))));
codeOutFile = statsg->oFile;
allocInfo = 0;
tfprintf(ofile, "\t!db !constbyte\n", 0);
}
+/*-----------------------------------------------------------------*/
+/* return the generic pointer high byte for a given pointer type. */
+/*-----------------------------------------------------------------*/
+int pointerTypeToGPByte(const int p_type)
+{
+ switch (p_type)
+ {
+ case IPOINTER:
+ case POINTER:
+ return 0;
+ case GPOINTER:
+ /* hack - if we get a generic pointer, we just assume
+ * it's an FPOINTER (i.e. in XDATA space).
+ */
+ case FPOINTER:
+ return 1;
+ case CPOINTER:
+ return 2;
+ case PPOINTER:
+ return 3;
+ default:
+ fprintf(stderr, "*** internal error: unknown pointer type %d in GPByte.\n",
+ p_type);
+ break;
+ }
+ return -1;
+}
+
+
+/*-----------------------------------------------------------------*/
+/* printPointerType - generates ival for pointer type */
+/*-----------------------------------------------------------------*/
+void _printPointerType(FILE *oFile, const char *name)
+{
+ if (IS_DS390_PORT)
+ {
+ fprintf(oFile, "\t.byte %s,(%s >> 8),(%s >> 16)",name,name,name);
+ }
+ else
+ {
+ fprintf(oFile, "\t.byte %s,(%s >> 8)",name,name);
+ }
+}
+
+/*-----------------------------------------------------------------*/
+/* printPointerType - generates ival for pointer type */
+/*-----------------------------------------------------------------*/
+void printPointerType(FILE *oFile, const char *name)
+{
+ _printPointerType(oFile, name);
+ fprintf(oFile, "\n");
+}
+
+/*-----------------------------------------------------------------*/
+/* printGPointerType - generates ival for generic pointer type */
+/*-----------------------------------------------------------------*/
+void printGPointerType(FILE *oFile, const char *name,
+ const unsigned int type)
+{
+ _printPointerType(oFile,name);
+ fprintf(oFile, ",#0x%02x\n", pointerTypeToGPByte(type));
+}
+
/*-----------------------------------------------------------------*/
/* printIvalType - generates ival for int/char */
/*-----------------------------------------------------------------*/
/* now generate the name */
if (!val->sym) {
if (port->use_dw_for_init)
+ {
tfprintf(oFile, "\t!dws\n", val->name);
+ }
else
- fprintf(oFile, "\t.byte %s,(%s >> 8)\n", val->name,val->name);
+ {
+ printPointerType(oFile, val->name);
+ }
}
else
if (port->use_dw_for_init)
+ {
tfprintf(oFile, "\t!dws\n", val->sym->rname);
- else
- fprintf(oFile, "\t.byte %s,(%s >> 8)\n", val->sym->rname,val->sym->rname);
+ }
+ else
+ {
+ printPointerType(oFile, val->sym->rname);
+ }
return;
}
size = getSize (type);
if (val->name && strlen(val->name)) {
- switch (size) {
- case 1:
+ if (size == 1) /* This appears to be Z80 specific?? */
+ {
tfprintf(oFile,
- "\t!dbs\n", val->name) ;
- break;
- case 2:
+ "\t!dbs\n", val->name);
+ }
+ else if (size == FPTRSIZE)
+ {
if (port->use_dw_for_init)
+ {
tfprintf(oFile, "\t!dws\n", val->name);
+ }
else
- fprintf(oFile, "\t.byte %s,(%s >> 8)\n", val->name, val->name);
- break;
- /* PENDING: probably just 3 */
- default:
+ {
+ printPointerType(oFile, val->name);
+ }
+ }
+ else if (size == GPTRSIZE)
+ {
/* PENDING: 0x02 or 0x%02x, CDATA? */
- fprintf (oFile,
- "\t.byte %s,(%s >> 8),#0x%02x\n",
- val->name, val->name, (IS_PTR(val->type) ? DCL_TYPE(val->type) :
- PTR_TYPE(SPEC_OCLS(val->etype))));
+ printGPointerType(oFile, val->name,
+ (IS_PTR(val->type) ? DCL_TYPE(val->type) :
+ PTR_TYPE(SPEC_OCLS(val->etype))));
+ }
+ else
+ {
+ fprintf(stderr, "*** internal error: unknown size in "
+ "printIvalCharPtr.\n");
}
}
else {
+ /* What is this case? Are these pointers? */
switch (size) {
case 1:
tfprintf(oFile, "\t!dbs\n", aopLiteral(val, 0));
void printIvalPtr (symbol * sym, link * type, initList * ilist, FILE * oFile)
{
value *val;
+ int size;
/* if deep then */
if (ilist->type == INIT_DEEP)
}
- switch (getSize (type)) {
- case 1:
+ size = getSize (type);
+
+ if (size == 1) /* Z80 specific?? */
+ {
tfprintf (oFile, "\t!dbs\n", val->name);
- break;
- case 2:
+ }
+ else if (size == FPTRSIZE)
+ {
tfprintf (oFile, "\t!dws\n", val->name);
- break;
-
- case 3:
- fprintf (oFile, "\t.byte %s,(%s >> 8),#0x%02x\n",
- val->name, val->name,(IS_PTR(val->type) ? DCL_TYPE(val->type) :
- PTR_TYPE(SPEC_OCLS(val->etype))));
+ }
+ else if (size == GPTRSIZE)
+ {
+ printGPointerType(oFile, val->name,
+ (IS_PTR(val->type) ? DCL_TYPE(val->type) :
+ PTR_TYPE(SPEC_OCLS(val->etype))));
}
return;
}
addSetHead(&tmpfileSet,ovrFile);
/* print the global struct definitions */
- if (options.debug)
+ if (options.debug && !options.nodebug)
cdbStructBlock (0,cdbFile);
vFile = tempfile();
if (name) {
FILE *fp = fopen(name, "w+b");
if (fp)
+ {
addSetHead(&tmpfileNameSet, name);
+ }
return fp;
}
return NULL;