Mercurial > hg-old > index.cgi
diff src/list.c @ 0:57495da01900
Initial checking of LWASM
author | lost |
---|---|
date | Fri, 03 Oct 2008 02:44:20 +0000 |
parents | |
children | 34568fab6058 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/list.c Fri Oct 03 02:44:20 2008 +0000 @@ -0,0 +1,154 @@ +/* + * list.c + * + * code for displaying a program listing in lwasm + */ + +//#include <ctype.h> +#include <errno.h> +#include <stdio.h> +//#include <stdlib.h> +#include <string.h> +#define __list_c_seen__ +//#include "instab.h" +#include "lwasm.h" + +const char *errlist[] = +{ + "No error", + "Bad opcode", + "Illegal Symbol", + "Multiply defined symbol", + "Symbol required but not present", + "Forward references not permitted", + "Byte overflow", + "Phase error", + "Bad operand", + "Symbol not permitted here", + "Undefined symbol", + "Bit number out of range", + "Invalid expression", + "Invalid register", + "Bad file name", + "ENDM without MACRO", + "Redefined macro", + "Nested namespace", + "Bad condition", + "User error", + "Bad pragma", + "" +}; + +void list_code(asmstate_t *as) +{ + FILE *lf; + sourceline_t *cl; + int bn; + int c; + char *t; + + if (as -> listfile && strcmp(as -> listfile, "-")) + { + lf = fopen(as -> listfile, "w"); + if (!lf) + { + perror("Cannot open list file"); + return; + } + } + else + { + lf = stdout; + } + + for (cl = as -> source_head; cl; cl = cl -> next) + { + bn = 0; + if (cl -> errors) + { + errortab_t *e; + for (e = cl -> errors; e; e = e -> next) + { + if (e -> errnum < ERR_MAXERR && e -> errnum != ERR_USER) + fprintf(lf, "*****ERROR: %s\n", errlist[e -> errnum]); + } + if (cl -> user_error) + { + fprintf(lf, "*****ERROR: %s\n", cl -> user_error); + } + } + if (cl -> skipped) + { + fprintf(lf, "%-15.15s", "<skipped>"); + } + else if (cl -> macrodef) + { + fprintf(lf, "%-15.15s", "<macrodef>"); + } + else if (cl -> opcode >= 0 && cl -> numcodebytes > 0) + { + fprintf(lf, "%04X ", cl -> addr); + while (bn < 5 && bn < cl -> numcodebytes) + { + fprintf(lf, "%02X", cl -> codebytes[bn]); + bn++; + } + while (bn < 5) + { + fprintf(lf, " "); + bn++; + } + } + else if (cl -> addrset || (cl -> len && cl -> numcodebytes == 0)) + { + fprintf(lf, "%04X %10s", cl -> addr, ""); + } + else if (cl -> isequ) + { + fprintf(lf, " %04X ", cl -> symaddr); + } + else if (cl -> issetdp) + { + fprintf(lf, " %02X ", cl -> dpval); + } + else + fprintf(lf, " "); + fprintf(lf, " %15.15s:%06d ", cl -> sourcefile, cl -> lineno); + // actually display the line from the file + for (c = 0, t = cl -> line; *t; t++) + { + if (*t == '\n' || *t == '\r') + break; + if (*t == '\t') + { + do + { + fprintf(lf, " "); + c++; + } while (c % 8); + } + else + { + c++; + fprintf(lf, "%c", *t); + } + } +// fprintf(lf, "\n"); + + while (bn < cl -> numcodebytes) + { + if (bn % 5 == 0) + fprintf(lf, "\n%04X ", (cl -> addr + bn) & 0xFFFF); + fprintf(lf, "%02X", cl -> codebytes[bn]); + bn++; + } + fprintf(lf, "\n"); + } + + fprintf(lf, "\n"); + list_symbols(as, lf); + + if (lf != stdout) + fclose(lf); +} +