X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=listing.c;h=3e89ad514022a8d62a5ace76b59deb687b29db06;hp=cea150b4a7c8c0f29c72a82f63578e9122da346f;hb=c59f7a33730dacf753e066a4002e2f749051a137;hpb=d09274f3e3d4dca122c308a621ea8edc100b7d99 diff --git a/listing.c b/listing.c index cea150b..3e89ad5 100644 --- a/listing.c +++ b/listing.c @@ -1,9 +1,9 @@ // -// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System +// RMAC - Reboot's Macro Assembler for all Atari computers // LISTING.C - Listing Output -// Copyright (C) 199x Landon Dyer, 2011-2012 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2019 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 @@ -14,38 +14,42 @@ // 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,28 +64,28 @@ int eject(void) // -// Return GEMDOS Format Date +// Return GEMDOS format date // -VALUE dos_date(void) +uint32_t dos_date(void) { - VALUE v; + uint32_t v; struct tm * tm; time_t tloc; 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 // -VALUE dos_time(void) +// Return GEMDOS format time +// +uint32_t dos_time(void) { - VALUE v; + uint32_t v; struct tm * tm; time_t tloc; @@ -94,12 +98,12 @@ VALUE dos_time(void) // -// Generate a Time String +// Generate a time string // -void time_string(char * buf, VALUE time) +void time_string(char * buf, uint32_t time) { int hour; - char *ampm; + char * ampm; hour = (time >> 11); @@ -117,29 +121,15 @@ void time_string(char * buf, VALUE time) // -// Generate a Date String +// Generate a date string // -void date_string(char * buf, VALUE date) +void date_string(char * buf, uint32_t date) { sprintf(buf, "%d-%s-%d", (int)(date & 0x1F), month[(date >> 5) & 0xF], (int)((date >> 9) + 1980)); } -// -// 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); + CantCreateFile(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) +int listvalue(uint32_t 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; } +