]> Shamusworld >> Repos - rmac/blobdiff - listing.c
Code cleanup from last patch, also, version bump for same. :-)
[rmac] / listing.c
index cea150b4a7c8c0f29c72a82f63578e9122da346f..bbe24054af5b85904a82177e4b902a754f6a6c90 100644 (file)
--- a/listing.c
+++ b/listing.c
@@ -3,7 +3,7 @@
 // LISTING.C - Listing Output
 // Copyright (C) 199x Landon Dyer, 2011-2012 Reboot and Friends
 // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
-// Source Utilised with the Kind Permission of Landon Dyer
+// Source utilised with the kind permission of Landon Dyer
 //
 // --------------------------------------------------------------------------
 // 0    0    1    1    2    2    3    3    4    4    5    5    6    6    7    7
 // nnnnn           =vvvvvvvv
 
 #include "listing.h"
-#include "version.h"
-#include "token.h"
+#include "error.h"
 #include "procln.h"
 #include "sect.h"
-#include "error.h"
+#include "token.h"
+#include "version.h"
 
-char * list_fname;                                          // Listing filename
-char subttl[TITLESIZ];                                      // Current subtitle
-int listing;                                                // Listing level 
-int pagelen = 61;                                           // Lines on a page
-int nlines;                                                 // #lines on page so far
-LONG lsloc;                                                 // `sloc' at start of line 
+char * list_fname;                                     // Listing filename
+uint8_t subttl[TITLESIZ];                      // Current subtitle
+int listing;                                           // Listing level
+int pagelen = 61;                                      // Lines on a page
+int nlines;                                                    // #lines on page so far
+LONG lsloc;                                                    // `sloc' at start of line
 
 // Private
-static int lcursect;                                        // `cursect' at start of line
-static int llineno;                                         // `curlineno' at start of line 
-static int pageno;                                          // Current page number 
-static int pagewidth;                                       // #columns on a page
-static int subflag;                                         // 0, don't do .eject on subttl (set 1)
-static char lnimage[IMAGESIZ];                              // Image of output line
-static char title[TITLESIZ];                                // Current title
-static char datestr[20];                                    // Current date dd-mon-yyyy 
-static char timestr[20];                                    // Current time hh:mm:ss [am|pm]
-static char buf[IMAGESIZ];                                  // Buffer for numbers
+static int lcursect;                           // `cursect' at start of line
+static int llineno;                                    // `curlineno' at start of line
+static int pageno;                                     // Current page number
+static int pagewidth;                          // #columns on a page
+static int subflag;                                    // 0, don't do .eject on subttl (set 1)
+static char lnimage[IMAGESIZ];         // Image of output line
+static char title[TITLESIZ];           // Current title
+static char datestr[20];                       // Current date dd-mon-yyyy
+static char timestr[20];                       // Current time hh:mm:ss [am|pm]
+static char buf[IMAGESIZ];                     // Buffer for numbers
+static long unused;                                    // For supressing 'write' warnings
+
+static char * month[16] = {
+       "",    "Jan", "Feb", "Mar",
+       "Apr", "May", "Jun", "Jul",
+       "Aug", "Sep", "Oct", "Nov",
+       "Dec", "",    "",    ""
+};
 
-static char * month[16] = { "",    "Jan", "Feb", "Mar",
-                           "Apr", "May", "Jun", "Jul",
-                           "Aug", "Sep", "Oct", "Nov",
-                           "Dec", "",    "",    ""     };
 
 //
-// Eject the Page (Print Empty Lines), Reset the Line Count and Bump the Page Number
+// Eject the page, reset the line count and bump the page number
 //
 int eject(void)
 {
@@ -60,7 +64,7 @@ int eject(void)
 
 
 //
-// Return GEMDOS Format Date
+// Return GEMDOS format date
 //
 VALUE dos_date(void)
 {
@@ -70,14 +74,14 @@ VALUE dos_date(void)
 
        time(&tloc);
        tm = localtime(&tloc);
-       v = ((tm->tm_year - 80) << 9) | ((tm->tm_mon+1) << 5) | tm->tm_mday;
+       v = ((tm->tm_year - 80) << 9) | ((tm->tm_mon + 1) << 5) | tm->tm_mday;
 
        return v;
 }
 
 
-// 
-// Return GEMDOS Format Time
+//
+// Return GEMDOS format time
 //
 VALUE dos_time(void)
 {
@@ -94,12 +98,12 @@ VALUE dos_time(void)
 
 
 //
-// Generate a Time String
+// Generate a time string
 //
 void time_string(char * buf, VALUE time)
 {
        int hour;
-       char *ampm;
+       char * ampm;
 
        hour = (time >> 11);
 
@@ -117,7 +121,7 @@ void time_string(char * buf, VALUE time)
 
 
 //
-// Generate a Date String
+// Generate a date string
 //
 void date_string(char * buf, VALUE date)
 {
@@ -126,20 +130,6 @@ void date_string(char * buf, VALUE date)
 }
 
 
-//
-// Copy `n' Characters from `src' to `dest' (also stops on EOS in src).
-// Does not null-terminate dest.
-//
-void scopy(char *dest, char *src, int len)
-{
-       if (len < 0)
-               len = 1000;                                           // Some large number
-
-       while (len-- && *src)
-               *dest++ = *src++;
-}
-
-
 //
 // Transform letters a-f in the address and data columns of the listing to
 // uppercase. (People seem  to like uppercase hex better in assembly-language
@@ -159,7 +149,7 @@ void uc_ln(char * ln)
 
 
 //
-// Fill Region `dest' with `len' Characters `c' and Null Terminate the Region
+// Fill region 'dest' with 'len' characters 'c' and null terminate the region
 //
 void lnfill(char * dest, int len, char chr)
 {
@@ -170,8 +160,8 @@ void lnfill(char * dest, int len, char chr)
 }
 
 
-// 
-// Create Listing File with the Appropriate Name
+//
+// Create listing file with the appropriate name
 //
 void list_setup(void)
 {
@@ -186,79 +176,82 @@ void list_setup(void)
        }
 
        list_fname = NULL;
-       
+
        if ((list_fd = open(fnbuf, _OPEN_FLAGS, _PERM_MODE)) < 0)
                cantcreat(fnbuf);
 }
 
 
 //
-// Tag Listing with a Character, Typically for Errors or Warnings
+// Tag listing with a character, typically for errors or warnings
 //
 void taglist(char chr)
 {
-       lnimage[TAG_COL+1] = chr;
+       lnimage[TAG_COL + 1] = chr;
 }
 
 
 //
-// Print a Line to the Listing File
+// Print a line to the listing file
 //
-void println(char * ln)
+void println(const char * ln)
 {
        unsigned int length;
 
-       if (list_fname != NULL)                                   //  Create listing file, if necessary
+       //  Create listing file, if necessary
+       if (list_fname != NULL)
                list_setup();
 
        length = strlen(ln);
-       write(list_fd, ln, length);
-       write(list_fd, "\n", 1L);
+       unused = write(list_fd, ln, length);
+       unused = write(list_fd, "\n", 1L);
 }
 
 
 //
-// Ship Line `ln' Out; Do Page Breaks and Title Stuff
+// Ship line 'ln' out; do page breaks and title stuff
 //
-void ship_ln(char * ln)
+void ship_ln(const char * ln)
 {
        // If listing level is <= 0, then don't print anything
        if (listing <= 0)
                return;
 
-       // Notice bottom of page
-       if (nlines >= pagelen - BOT_MAR)
-               eject();
-
-       // Print title, boilerplate, and subtitle at top of page
-       if (nlines == 0)
+       if (list_pag)
        {
-               ++pageno;
-               println("");
-               date_string(datestr, dos_date());
-               time_string(timestr, dos_time());
-               sprintf(buf,
-                       "%-40s%-20s Page %-4d    %s %s        RMAC %01i.%01i.%02i (%s)",
-                       title, curfname, pageno, timestr, datestr, MAJOR, MINOR, PATCH, PLATFORM);
-               println(buf);
-               sprintf(buf, "%s", subttl);
-               println(buf);
-               println("");
-               nlines = 4;
+               // Notice bottom of page
+               if (nlines >= pagelen - BOT_MAR)
+                       eject();
+
+               // Print title, boilerplate, and subtitle at top of page
+               if (nlines == 0)
+               {
+                       pageno++;
+                       println("");
+                       date_string(datestr, dos_date());
+                       time_string(timestr, dos_time());
+                       sprintf(buf,
+                               "%-40s%-20s Page %-4d    %s %s        RMAC %01i.%01i.%02i (%s)",
+                               title, curfname, pageno, timestr, datestr, MAJOR, MINOR, PATCH,
+                               PLATFORM);
+                       println(buf);
+                       sprintf(buf, "%s", subttl);
+                       println(buf);
+                       println("");
+                       nlines = 4;
+               }
        }
 
        println(ln);
-       ++nlines;
+       nlines++;
 }
 
 
 //
-// Initialize Listing Generator
+// Initialize listing generator
 //
-void init_list(void)
+void InitListing(void)
 {
-       extern VALUE dos_date(), dos_time();
-
        subflag = 0;
        pageno = 0;
        nlines = 0;
@@ -282,18 +275,18 @@ void listeol(void)
        LONG count;
        int fixcount;
 
-       DEBUG printf("~list: lsloc=$%ux sloc=$%ux\n", lsloc, sloc);
+       DEBUG printf("~list: lsloc=$%X sloc=$%X\n", lsloc, sloc);
 
        if (lsloc != sloc)
        {
-               sprintf(buf, "%08ux", lsloc);
-               scopy(lnimage+LOC_COL, buf, 8);
+               sprintf(buf, "%08X", lsloc);
+               strncpy(lnimage + LOC_COL, buf, 8);
        }
 
        if (llineno != curlineno)
        {
                sprintf(buf, "%5d", llineno);
-               scopy(lnimage+LN_COL, buf, 5);
+               strncpy(lnimage + LN_COL, buf, 5);
        }
 
        // List bytes only when section stayed the same and the section is not a
@@ -302,24 +295,27 @@ void listeol(void)
        // deposited with dcb. The fix (kludge) is an extra variable which records
        // the fact that a 'ds.x' directive generated all the data, and it
        // shouldn't be listed
-       savsect();                                               // Update section variables
+       SaveSection();          // Update section variables
 
        if (lcursect == cursect && (sect[lcursect].scattr & SBSS) == 0
                && lsloc != sloc && just_bss == 0)
        {
                ch = sect[lcursect].sfcode;
 
+               if (lcursect != M6502)
+        {
                for(; ch!=NULL; ch=ch->chnext)
                {
                        if (lsloc >= ch->chloc && lsloc < (ch->chloc + ch->ch_size))
                                break;
                }
+        }
 
                // Fatal: Can't find chunk holding code
                if (ch == NULL)
                {
 nochunk:
-                       interror(6);                                       // Can't find generated code in section
+                       interror(6);    // Can't find generated code in section
                }
 
                p =  ch->chptr + (lsloc - ch->chloc);
@@ -329,16 +325,18 @@ nochunk:
                for(count=sloc-lsloc; count--; col+=2, ++lsloc)
                {
                        if (col >= DATA_END)
-                       {                              // Ship the line
+                       {
+                               // Ship the line
                                col = DATA_COL;
                                uc_ln(lnimage);
                                ship_ln(lnimage);
-                               lnfill(lnimage, SRC_COL, SPACE);                // Fill with spaces
-                               sprintf(buf, "%08ux", lsloc);
-                               scopy(lnimage+LOC_COL, buf, 8);
+                               lnfill(lnimage, SRC_COL, SPACE);        // Fill with spaces
+                               sprintf(buf, "%08X", lsloc);
+                               strncpy(lnimage + LOC_COL, buf, 8);
                        }
 
-                       if (lsloc >= (ch->chloc + ch->ch_size))
+                       if (lcursect != M6502 &&
+                    lsloc >= (ch->chloc + ch->ch_size))
                        {
                                if ((ch = ch->chnext) == NULL)
                                        goto nochunk;
@@ -351,17 +349,17 @@ nochunk:
 
                        if (fixcount)
                        {
-                               --fixcount;
+                               fixcount--;
                                strcpy(buf, "xx");
-                               ++p;                                            // Advance anyway
+                               p++;            // Advance anyway
                        }
-                       else 
+                       else
                                sprintf(buf, "%02x", *p++ & 0xff);
 
-                       scopy(lnimage+col, buf, 2);
+                       strncpy(lnimage + col, buf, 2);
                }
 
-               // Flush partial line 
+               // Flush partial line
                if (col > DATA_COL)
                {
                        uc_ln(lnimage);
@@ -377,7 +375,7 @@ nochunk:
 
 
 //
-// Copy Current (Saved) Line to Output Buffer and Tag it with a Character
+// Copy current (saved) line to output buffer and tag it with a character
 //
 void lstout(char tag)
 {
@@ -388,7 +386,7 @@ void lstout(char tag)
        lcursect = cursect;
        llineno = curlineno;
 
-       lnfill(lnimage, SRC_COL, SPACE);                         // Fill with spaces
+       lnfill(lnimage, SRC_COL, SPACE);        // Fill with spaces
        lnimage[TAG_COL] = tag;
 
        // Copy line image and handle control characters
@@ -410,12 +408,12 @@ void lstout(char tag)
 
 
 //
-// Output a Value to Listing
+// Output a value to listing
 //
 int listvalue(VALUE v)
 {
-       sprintf(buf, "=%08ux", v);
-       scopy(lnimage + DATA_COL - 1, buf, 9);
+       sprintf(buf, "=%08X", v);
+       strncpy(lnimage + DATA_COL - 1, buf, 9);
        return 0;
 }
 
@@ -443,11 +441,13 @@ int d_subttl(void)
        if (*tok != STRING)
                return error("missing string");
 
-       strcpy(subttl, (char *)tok[1]);
+//     strcpy(subttl, (char *)tok[1]);
+       strcpy(subttl, string[tok[1]]);
 
        tok += 2;
 
-       if (ejectok && (subflag || pageno > 1))                   // Always eject on pages 2+ 
+       // Always eject on pages 2+
+       if (ejectok && (subflag || pageno > 1))
                eject();
 
        subflag = 1;
@@ -457,14 +457,16 @@ int d_subttl(void)
 
 
 //
-// Set title on titles not on the first page, do an eject and clobber the subtitle
+// Set title on titles not on the first page, do an eject and clobber the
+// subtitle
 //
 int d_title(void)
 {
        if (*tok != STRING)
                return error("missing string");
-       
-       strcpy(title, (char*)tok[1]);
+
+//     strcpy(title, (char*)tok[1]);
+       strcpy(title, string[tok[1]]);
        tok += 2;
 
        if (pageno > 1)
@@ -475,3 +477,4 @@ int d_title(void)
 
        return 0;
 }
+