#include "common.h"
#include "asm.h"
+#if defined __MINGW32__
+ // for O_BINARY in _pipe()
+# include <fcntl.h>
+#elif !defined(__BORLANDC__) && !defined(_MSC_VER)
+ // for pipe and close
+# include <unistd.h>
+#endif
+
/* A 'token' is like !blah or %24f and is under the programmers
control. */
#define MAX_TOKEN_LEN 64
break;
case 'F':
// Source file name.
- pInto = _appendAt (pInto, newFormat, srcFileName);
+ pInto = _appendAt (pInto, newFormat, fullSrcFileName);
sz++;
break;
case 'N':
}
/*-----------------------------------------------------------------*/
-/* printCLine - try to find the c-code for this lineno */
+/* printILine - return the readable i-code for this ic */
+/* */
+/* iCodePrint wants a file stream so we need a pipe to fool it */
+/*-----------------------------------------------------------------*/
+static char verbalICode[1024];
+
+char *printILine (iCode *ic) {
+ int filedes[2];
+ FILE *pipeStream;
+ iCodeTable *icTab=getTableEntry(ic->op);
+
+#if defined __MINGW32__
+ assert(_pipe(filedes, 256, O_BINARY)!=-1); // forget it
+#else
+ assert(pipe(filedes)!=-1); // forget it
+#endif
+
+ // stuff the pipe with the readable icode
+ pipeStream=fdopen(filedes[1],"w");
+ icTab->iCodePrint(pipeStream, ic, icTab->printName);
+ // it really needs an extra push
+ fflush(pipeStream);
+ // now swallow it
+ pipeStream=fdopen(filedes[0],"r");
+ fgets(verbalICode, sizeof(verbalICode), pipeStream);
+ // clean up the mess, we'll return here for all icodes!!
+ assert(!close (filedes[0]));
+ assert(!close (filedes[1]));
+ // kill the trailing NL
+ verbalICode[strlen(verbalICode)-1]='\0';
+ // and throw it up
+ return verbalICode;
+}
+
+/*-----------------------------------------------------------------*/
+/* printCLine - return the c-code for this lineno */
/*-----------------------------------------------------------------*/
static FILE *inFile=NULL;
static char inLineString[1024];
static int inLineNo=0;
+static char lastSrcFile[PATH_MAX];
int rewinds=0;
char *printCLine (char *srcFile, int lineno) {
char *ilsP=inLineString;
+
+ if (inFile) {
+ if (strcmp (lastSrcFile, srcFile) != 0) {
+ fclose (inFile);
+ inFile = NULL;
+ inLineNo = 0;
+ }
+ }
if (!inFile) {
inFile=fopen(srcFile, "r");
if (!inFile) {
perror ("printCLine");
exit (1);
}
+ strcpy (lastSrcFile, srcFile);
}
if (lineno<inLineNo) {
fseek (inFile, 0, SEEK_SET);
{NULL, NULL}
};
+static const ASM_MAPPING _xa_asm_mapping[] =
+{
+ {"labeldef", "%s:"},
+ {"slabeldef", "%s:"},
+ {"tlabeldef", "L%05d:"},
+ {"tlabel", "L%05d"},
+ {"immed", "#"},
+ {"zero", "#0"},
+ {"one", "#1"},
+ {"area", ".area %s"},
+ {"areacode", ".area %s"},
+ {"areadata", ".area %s"},
+ {"areahome", ".area %s"},
+ {"ascii", ".db \"%s\""},
+ {"ds", ".ds %d"},
+ {"db", ".db"},
+ {"dbs", ".db \"%s\""},
+ {"dw", ".dw"},
+ {"dws", ".dw %s"},
+ {"constbyte", "0x%02x"},
+ {"constword", "0x%04x"},
+ {"immedword", "0x%04x"},
+ {"immedbyte", "0x%02x"},
+ {"hashedstr", "#%s"},
+ {"lsbimmeds", "#<%s"},
+ {"msbimmeds", "#>%s"},
+ {"module", "; .module %s"},
+ {"global", ".globl %s"},
+ {"fileprelude", ""},
+ {"functionheader",
+ "; ---------------------------------\n"
+ "; Function %s\n"
+ "; ---------------------------------"
+ },
+ {"functionlabeldef", "%s:"},
+ {"bankimmeds", "0 ; PENDING: bank support"},
+ {"los","(%s & 0FFh)"},
+ {"his","((%s / 256) & 0FFh)"},
+ {"hihis","((%s / 65536) & 0FFh)"},
+ {"hihihis","((%s / 16777216) & 0FFh)"},
+ {"lod","(%d & 0FFh)"},
+ {"hid","((%d / 256) & 0FFh)"},
+ {"hihid","((%d / 65536) & 0FFh)"},
+ {"hihihid","((%d / 16777216) & 0FFh)"},
+ {"lol","(L%05d & 0FFh)"},
+ {"hil","((L%05d / 256) & 0FFh)"},
+ {"hihil","((L%05d / 65536) & 0FFh)"},
+ {"hihihil","((L%09d / 16777216) & 0FFh)"},
+ {"equ"," equ"},
+ {NULL, NULL}
+};
+
const ASM_MAPPINGS asm_asxxxx_mapping =
{
NULL,
NULL,
_a390_mapping
};
+
+const ASM_MAPPINGS asm_xa_asm_mapping =
+{
+ NULL,
+ _xa_asm_mapping
+};