//
-// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
+// RMAC - Renamed 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-2021 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
// 012345678901234567890123456789012345678901234567890123456789012345678901234567
-// filename.... Reboot's Macro Assembler N.N.NN (Unknown)
+// filename.... Renamed Macro Assembler N.N.NN (Unknown)
// nnnnn aaaaaaaa dddddddddddddddddddd T source code
// nnnnn aaaaaaaa dddddddddddddddd
// 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
+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
+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 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 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
"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)
{
- if (listing > 0)
+ if (listing > 0 && list_pag)
{
println("\f");
nlines = 0;
//
-// 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;
//
-// 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);
//
-// 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 [Shamus: wha...?]
-
- 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
//
-// 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)
{
}
-//
-// Create Listing File with the Appropriate Name
+//
+// Create listing file with the appropriate name
//
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(const char * ln)
{
//
-// Ship Line `ln' Out; Do Page Breaks and Title Stuff
+// Ship line 'ln' out; do page breaks and title stuff
//
void ship_ln(const char * ln)
{
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 InitListing(void)
{
- extern VALUE dos_date(), dos_time();
-
subflag = 0;
pageno = 0;
nlines = 0;
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
// 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);
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;
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);
//
-// 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)
{
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
//
-// 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;
}
tok += 2;
- // Always eject on pages 2+
+ // Always eject on pages 2+
if (ejectok && (subflag || pageno > 1))
eject();
//
-// 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, string[tok[1]]);
tok += 2;
return 0;
}
+