diff --git a/doc/da65.sgml b/doc/da65.sgml index 7300d3d71..dd51a4764 100644 --- a/doc/da65.sgml +++ b/doc/da65.sgml @@ -248,8 +248,8 @@ With the command line option , the disassembler may be told which CPU to support: - - NMOS 6502 (all legal instructions) - - NMOS 6502 with all undocumented instructions + - NMOS 6502 (all legal instructions) + - NMOS 6502 with all undocumented instructions - the emulated CPU of the C64DTV device - first CMOS instruction set (no bit manipulation, no wai/stp) - full CMOS instruction set (has bit manipulation and wai/stp) diff --git a/src/da65/attrtab.c b/src/da65/attrtab.c index 002965dff..1ba694038 100644 --- a/src/da65/attrtab.c +++ b/src/da65/attrtab.c @@ -33,6 +33,11 @@ +#include + +/* common */ +#include "xmalloc.h" + /* da65 */ #include "cpu.h" #include "error.h" @@ -46,14 +51,78 @@ -/* Attribute table */ -static unsigned short AttrTab[0x10000]; +/* Attribute structure how it is found in the attribute table */ +typedef struct Attribute Attribute; +struct Attribute { + struct Attribute* Next; /* Next entry in linked list */ + uint32_t Addr; /* The full address */ + attr_t Attr; /* Actual attribute */ +}; -/* 65816 attribute table */ -#define MAX_LONG_ATTRS 256 -static unsigned short LongAttrVal[MAX_LONG_ATTRS]; -static unsigned LongAttrAddr[MAX_LONG_ATTRS]; -static unsigned LongAttrsUsed; +/* Attributes use a hash table and a linear list for collision resolution. The +** hash function is easy and effective. It evaluates just the lower bits of +** the address. +*/ +#define ATTR_HASH_SIZE 8192u /* Must be power of two */ +static Attribute* AttributeTab[ATTR_HASH_SIZE]; + + + +/*****************************************************************************/ +/* struct Attribute */ +/*****************************************************************************/ + + + +static Attribute* NewAttribute (uint32_t Addr, attr_t Attr) +/* Create a new attribute structure and return it */ +{ + /* Create a new attribute */ + Attribute* A = xmalloc (sizeof (Attribute)); + + /* Fill in the data */ + A->Next = 0; + A->Addr = Addr; + A->Attr = Attr; + + /* Return the attribute just created */ + return A; +} + + + +static uint32_t GetAttributeHash (uint32_t Addr) +/* Get the hash for an attribute at the given address */ +{ + return (Addr & (ATTR_HASH_SIZE - 1)); +} + + + +static Attribute* FindAttribute (uint32_t Addr) +/* Search for an attribute for the given address and return it. Returns NULL +** if no attribute exists for the address. +*/ +{ + Attribute* A = AttributeTab[GetAttributeHash (Addr)]; + while (A) { + if (A->Addr == Addr) { + break; + } + A = A->Next; + } + return A; +} + + + +static void InsertAttribute (Attribute* A) +/* Insert an attribute into the hash table */ +{ + uint32_t Hash = GetAttributeHash (A->Addr); + A->Next = AttributeTab[Hash]; + AttributeTab[Hash] = A; +} @@ -63,51 +132,43 @@ static unsigned LongAttrsUsed; -void AddrCheck (unsigned Addr) +void AddrCheck (uint32_t Addr) /* Check if the given address has a valid range */ { if (Addr >= 0x10000 && CPU != CPU_65816) { - Error ("Address out of range: %08X", Addr); + Error ("Address out of range: $%04" PRIX32, Addr); } } -unsigned char IsLongAddr (unsigned Addr) -/* Is it 24-bit? */ -{ - return Addr >= 0x10000 && CPU == CPU_65816; -} - - -attr_t GetAttr (unsigned Addr) +attr_t GetAttr (uint32_t Addr) /* Return the attribute for the given address */ { + /* As a small optimization we cache the last used attribute so when the + ** function is called several times with the same address we do already + ** know it. + */ + static const Attribute* A = 0; + if (A != 0 && A->Addr == Addr) { + return A->Attr; + } + /* Check the given address */ AddrCheck (Addr); - if (IsLongAddr (Addr)) { - unsigned i; - for (i = 0; i < LongAttrsUsed; i++) { - if (LongAttrAddr[i] == Addr) { - return LongAttrVal[i]; - } - } - - return 0; - } - /* Return the attribute */ - return AttrTab[Addr]; + A = FindAttribute (Addr); + return A? A->Attr : atDefault; } -int SegmentDefined (unsigned Start, unsigned End) +int SegmentDefined (uint32_t Start, uint32_t End) /* Return true if the atSegment bit is set somewhere in the given range */ { while (Start <= End) { - if (AttrTab[Start++] & atSegment) { + if (GetAttr (Start++) & atSegment) { return 1; } } @@ -116,7 +177,7 @@ int SegmentDefined (unsigned Start, unsigned End) -int IsSegmentEnd (unsigned Addr) +int IsSegmentEnd (uint32_t Addr) /* Return true if a segment ends at the given address */ { return (GetAttr (Addr) & atSegmentEnd) != 0x0000; @@ -124,7 +185,7 @@ int IsSegmentEnd (unsigned Addr) -int IsSegmentStart (unsigned Addr) +int IsSegmentStart (uint32_t Addr) /* Return true if a segment starts at the given address */ { return (GetAttr (Addr) & atSegmentStart) != 0x0000; @@ -155,7 +216,7 @@ unsigned GetGranularity (attr_t Style) -void MarkRange (unsigned Start, unsigned End, attr_t Attr) +void MarkRange (uint32_t Start, uint32_t End, attr_t Attr) /* Mark a range with the given attribute */ { /* Do it easy here... */ @@ -166,53 +227,33 @@ void MarkRange (unsigned Start, unsigned End, attr_t Attr) -void MarkAddr (unsigned Addr, attr_t Attr) +void MarkAddr (uint32_t Addr, attr_t Attr) /* Mark an address with an attribute */ { /* Check the given address */ AddrCheck (Addr); - if (IsLongAddr (Addr)) { - unsigned i; - for (i = 0; i < LongAttrsUsed; i++) { - if (LongAttrAddr[i] == Addr) { - - /* We must not have more than one style bit */ - if (Attr & atStyleMask) { - if (LongAttrVal[i] & atStyleMask) { - Error ("Duplicate style for long address %06X", Addr); - } - } - LongAttrVal[i] |= Attr; - - return; - } - } - - if (LongAttrsUsed >= MAX_LONG_ATTRS) { - Error ("Too many long addresses"); - } - LongAttrVal[LongAttrsUsed] |= Attr; - LongAttrAddr[LongAttrsUsed] = Addr; - LongAttrsUsed++; - - return; - } + /* Get an existing attribute entry */ + Attribute* A = FindAttribute (Addr); /* We must not have more than one style bit */ - if (Attr & atStyleMask) { - if (AttrTab[Addr] & atStyleMask) { - Error ("Duplicate style for address %04X", Addr); + if (A != 0 && (Attr & atStyleMask) != 0) { + if ((A->Attr & atStyleMask) != 0) { + Error ("Duplicate style for address %04" PRIX32, Addr); } } /* Set the style */ - AttrTab[Addr] |= Attr; + if (A) { + A->Attr |= Attr; + } else { + InsertAttribute (NewAttribute (Addr, Attr)); + } } -attr_t GetStyleAttr (unsigned Addr) +attr_t GetStyleAttr (uint32_t Addr) /* Return the style attribute for the given address */ { /* Check the given address */ @@ -224,7 +265,7 @@ attr_t GetStyleAttr (unsigned Addr) -attr_t GetLabelAttr (unsigned Addr) +attr_t GetLabelAttr (uint32_t Addr) /* Return the label attribute for the given address */ { /* Check the given address */ diff --git a/src/da65/attrtab.h b/src/da65/attrtab.h index 4a0ea8225..ec44fd3b3 100644 --- a/src/da65/attrtab.h +++ b/src/da65/attrtab.h @@ -38,6 +38,10 @@ +#include + + + /*****************************************************************************/ /* Data */ /*****************************************************************************/ @@ -95,37 +99,37 @@ typedef enum attr_t { -void AddrCheck (unsigned Addr); +void AddrCheck (uint32_t Addr); /* Check if the given address has a valid range */ -unsigned char IsLongAddr (unsigned Addr); +unsigned char IsLongAddr (uint32_t Addr); /* Check if the given address is 24-bit */ -attr_t GetAttr (unsigned Addr); +attr_t GetAttr (uint32_t Addr); /* Return the attribute for the given address */ -int SegmentDefined (unsigned Start, unsigned End); +int SegmentDefined (uint32_t Start, unsigned End); /* Return true if the atSegment bit is set somewhere in the given range */ -int IsSegmentEnd (unsigned Addr); +int IsSegmentEnd (uint32_t Addr); /* Return true if a segment ends at the given address */ -int IsSegmentStart (unsigned Addr); +int IsSegmentStart (uint32_t Addr); /* Return true if a segment starts at the given address */ unsigned GetGranularity (attr_t Style); /* Get the granularity for the given style */ -void MarkRange (unsigned Start, unsigned End, attr_t Attr); +void MarkRange (uint32_t Start, uint32_t End, attr_t Attr); /* Mark a range with the given attribute */ -void MarkAddr (unsigned Addr, attr_t Attr); +void MarkAddr (uint32_t Addr, attr_t Attr); /* Mark an address with an attribute */ -attr_t GetStyleAttr (unsigned Addr); +attr_t GetStyleAttr (uint32_t Addr); /* Return the style attribute for the given address */ -attr_t GetLabelAttr (unsigned Addr); +attr_t GetLabelAttr (uint32_t Addr); /* Return the label attribute for the given address */ diff --git a/src/da65/code.c b/src/da65/code.c index a162e6482..6045e83c5 100644 --- a/src/da65/code.c +++ b/src/da65/code.c @@ -53,10 +53,10 @@ -unsigned char CodeBuf [0x10000]; /* Code buffer */ -unsigned long CodeStart; /* Start address */ -unsigned long CodeEnd; /* End address */ -unsigned long PC; /* Current PC */ +uint8_t CodeBuf[0x10000]; /* Code buffer */ +uint32_t CodeStart; /* Start address */ +uint32_t CodeEnd; /* End address */ +uint32_t PC; /* Current PC */ @@ -117,12 +117,13 @@ void LoadCode (void) ** 0x10000 - Size. This is a reasonable default assuming that the file ** is a ROM that contains the hardware vectors at $FFFA. */ - if (StartAddr < 0) { + if (!HaveStartAddr) { if (Size > 0x10000) { StartAddr = 0; } else { StartAddr = 0x10000 - Size; } + HaveStartAddr = 1; } /* Calculate the maximum code size */ @@ -155,7 +156,7 @@ void LoadCode (void) -unsigned char GetCodeByte (unsigned Addr) +uint8_t GetCodeByte (uint32_t Addr) /* Get a byte from the given address */ { PRECONDITION (Addr <= CodeEnd); @@ -164,48 +165,48 @@ unsigned char GetCodeByte (unsigned Addr) -unsigned GetCodeDByte (unsigned Addr) +uint16_t GetCodeDByte (uint32_t Addr) /* Get a dbyte from the given address */ { - unsigned Lo = GetCodeByte (Addr); - unsigned Hi = GetCodeByte (Addr+1); + uint16_t Lo = GetCodeByte (Addr); + uint16_t Hi = GetCodeByte (Addr+1); return (Lo <<8) | Hi; } -unsigned GetCodeWord (unsigned Addr) +uint16_t GetCodeWord (uint32_t Addr) /* Get a word from the given address */ { - unsigned Lo = GetCodeByte (Addr); - unsigned Hi = GetCodeByte (Addr+1); + uint16_t Lo = GetCodeByte (Addr); + uint16_t Hi = GetCodeByte (Addr+1); return Lo | (Hi << 8); } -unsigned long GetCodeDWord (unsigned Addr) +uint32_t GetCodeDWord (uint32_t Addr) /* Get a dword from the given address */ { - unsigned long Lo = GetCodeWord (Addr); - unsigned long Hi = GetCodeWord (Addr+2); + uint32_t Lo = GetCodeWord (Addr); + uint32_t Hi = GetCodeWord (Addr+2); return Lo | (Hi << 16); } -unsigned GetCodeLongAddr (unsigned Addr) +uint32_t GetCodeLongAddr (uint32_t Addr) /* Get a word from the given address */ { - unsigned Lo = GetCodeByte (Addr); - unsigned Mid = GetCodeByte (Addr+1); - unsigned Hi = GetCodeByte (Addr+2); + uint32_t Lo = GetCodeByte (Addr); + uint32_t Mid = GetCodeByte (Addr+1); + uint32_t Hi = GetCodeByte (Addr+2); return Lo | (Mid << 8) | (Hi << 16); } -unsigned GetRemainingBytes (void) +uint32_t GetRemainingBytes (void) /* Return the number of remaining code bytes */ { if (CodeEnd >= PC) { diff --git a/src/da65/code.h b/src/da65/code.h index aa3c6a290..1a4cce2c8 100644 --- a/src/da65/code.h +++ b/src/da65/code.h @@ -38,16 +38,20 @@ +#include + + + /*****************************************************************************/ /* Data */ /*****************************************************************************/ -extern unsigned char CodeBuf [0x10000]; /* Code buffer */ -extern unsigned long CodeStart; /* Start address */ -extern unsigned long CodeEnd; /* End address */ -extern unsigned long PC; /* Current PC */ +extern uint8_t CodeBuf[0x10000]; /* Code buffer */ +extern uint32_t CodeStart; /* Start address */ +extern uint32_t CodeEnd; /* End address */ +extern uint32_t PC; /* Current PC */ @@ -60,22 +64,22 @@ extern unsigned long PC; /* Current PC */ void LoadCode (void); /* Load the code from the given file */ -unsigned char GetCodeByte (unsigned Addr); +uint8_t GetCodeByte (uint32_t Addr); /* Get a byte from the given address */ -unsigned GetCodeDByte (unsigned Addr); +uint16_t GetCodeDByte (uint32_t Addr); /* Get a dbyte from the given address */ -unsigned GetCodeWord (unsigned Addr); +uint16_t GetCodeWord (uint32_t Addr); /* Get a word from the given address */ -unsigned long GetCodeDWord (unsigned Addr); +uint32_t GetCodeDWord (uint32_t Addr); /* Get a dword from the given address */ -unsigned GetCodeLongAddr (unsigned Addr); +uint32_t GetCodeLongAddr (uint32_t Addr); /* Get a 24-bit address from the given address */ -unsigned GetRemainingBytes (void); +uint32_t GetRemainingBytes (void); /* Return the number of remaining code bytes */ int CodeLeft (void); diff --git a/src/da65/comments.c b/src/da65/comments.c index f136ae3d2..f1295d486 100644 --- a/src/da65/comments.c +++ b/src/da65/comments.c @@ -33,6 +33,9 @@ +#include +#include + /* common */ #include "xmalloc.h" @@ -49,13 +52,82 @@ -/* Comment table */ -static const char* CommentTab[0x10000]; +/* Comment structure how it is found in the comment table */ +typedef struct Comment Comment; +struct Comment { + struct Comment* Next; /* Next entry in linked list */ + uint32_t Addr; /* The full address */ + char Text[1]; /* Text, dynamically allocated */ +}; -#define MAX_LONG_COMMENTS 256 -static const char* LongCommentVal[MAX_LONG_COMMENTS]; -static unsigned LongCommentAddr[MAX_LONG_COMMENTS]; -static unsigned LongCommentsUsed; +/* Comments use a hash table and a linear list for collision resolution. The +** hash function is easy and effective. It evaluates just the lower bits of +** the address. Since we don't expect many comments, we can keep the table +** small. +*/ +#define COMMENT_HASH_SIZE 256u /* Must be power of two */ +static Comment* CommentTab[COMMENT_HASH_SIZE]; + + + +/*****************************************************************************/ +/* struct Comment */ +/*****************************************************************************/ + + + +static Comment* NewComment (uint32_t Addr, const char* Text) +/* Create a new comment structure and return it */ +{ + /* Get the length of the text */ + unsigned Len = strlen (Text); + + /* Create a new comment */ + Comment* C = xmalloc (sizeof (Comment) + Len); + + /* Fill in the data */ + C->Next = 0; + C->Addr = Addr; + memcpy (C->Text, Text, Len + 1); + + /* Return the comment just created */ + return C; +} + + + +static uint32_t GetCommentHash (uint32_t Addr) +/* Get the hash for a comment at the given address */ +{ + return (Addr & (COMMENT_HASH_SIZE - 1)); +} + + + +static Comment* FindComment (uint32_t Addr) +/* Search for a comment for the given address and return it. Returns NULL if +** no comment exists for the address. +*/ +{ + Comment* C = CommentTab[GetCommentHash (Addr)]; + while (C) { + if (C->Addr == Addr) { + break; + } + C = C->Next; + } + return C; +} + + + +static void InsertComment (Comment* C) +/* Insert a comment into the hash table */ +{ + uint32_t Hash = GetCommentHash (C->Addr); + C->Next = CommentTab[Hash]; + CommentTab[Hash] = C; +} @@ -65,62 +137,30 @@ static unsigned LongCommentsUsed; -static unsigned FindLongIndex (unsigned Addr) -{ - unsigned i; - for (i = 0; i < LongCommentsUsed; i++) { - if (LongCommentAddr[i] == Addr) { - return i; - } - } - return -1; -} - - - -void SetComment (unsigned Addr, const char* Comment) +void SetComment (uint32_t Addr, const char* Text) /* Set a comment for the given address */ { /* Check the given address */ AddrCheck (Addr); - if (IsLongAddr (Addr)) { - if (FindLongIndex (Addr)) { - Warning ("Duplicate comment for address $%06X", Addr); - } else { - if (LongCommentsUsed >= MAX_LONG_COMMENTS) { - Error("Too many long-address comments"); - } - LongCommentVal[LongCommentsUsed] = xstrdup (Comment); - LongCommentAddr[LongCommentsUsed] = Addr; - LongCommentsUsed++; - } + /* If we do already have a comment, warn and ignore the new one */ + Comment* C = FindComment (Addr); + if (C) { + Warning ("Duplicate comment for address $%04" PRIX32, Addr); } else { - /* If we do already have a comment, warn and ignore the new one */ - if (CommentTab[Addr]) { - Warning ("Duplicate comment for address $%04X", Addr); - } else { - CommentTab[Addr] = xstrdup (Comment); - } + InsertComment (NewComment (Addr, Text)); } } -const char* GetComment (unsigned Addr) +const char* GetComment (uint32_t Addr) /* Return the comment for an address */ { /* Check the given address */ AddrCheck (Addr); - if (IsLongAddr (Addr)) { - const unsigned i = FindLongIndex (Addr); - if (i < LongCommentsUsed) { - return LongCommentVal[i]; - } - return NULL; - } - - /* Return the label if any */ - return CommentTab[Addr]; + /* Check for a comment and return it */ + const Comment* C = FindComment (Addr); + return C? C->Text : 0; } diff --git a/src/da65/comments.h b/src/da65/comments.h index 1d95111a9..dfa1654ab 100644 --- a/src/da65/comments.h +++ b/src/da65/comments.h @@ -38,6 +38,9 @@ +#include + +/* da65 */ #include "attrtab.h" @@ -48,10 +51,10 @@ -void SetComment (unsigned Addr, const char* Comment); +void SetComment (uint32_t Addr, const char* Text); /* Set a comment for the given address */ -const char* GetComment (unsigned Addr); +const char* GetComment (uint32_t Addr); /* Return the comment for an address */ diff --git a/src/da65/data.c b/src/da65/data.c index f85cd327d..a7389ca5a 100644 --- a/src/da65/data.c +++ b/src/da65/data.c @@ -50,17 +50,17 @@ -static unsigned GetSpan (attr_t Style) +static uint32_t GetSpan (attr_t Style) /* Get the number of bytes for a given style */ { /* Get the number of bytes still available */ - unsigned RemainingBytes = GetRemainingBytes (); + uint32_t RemainingBytes = GetRemainingBytes (); /* Count how many bytes are available. This number is limited by the ** number of remaining bytes, a label, a segment change, or the end of ** the given Style attribute. */ - unsigned Count = 1; + uint32_t Count = 1; while (Count < RemainingBytes) { attr_t Attr; if (MustDefLabel(PC+Count)) { @@ -85,10 +85,10 @@ static unsigned GetSpan (attr_t Style) static unsigned DoTable (attr_t Style, unsigned MemberSize, void (*TableFunc) (unsigned)) /* Output a table of bytes */ { - unsigned BytesLeft; + uint32_t BytesLeft; /* Count how many bytes may be output. */ - unsigned Count = GetSpan (Style); + uint32_t Count = GetSpan (Style); /* If the count is less than the member size, print a row of Count data ** bytes. We assume here that there is no member with a size that is less @@ -108,7 +108,7 @@ static unsigned DoTable (attr_t Style, unsigned MemberSize, void (*TableFunc) (u while (BytesLeft > 0) { /* Calculate the number of bytes for the next line */ - unsigned Chunk = (BytesLeft > BytesPerLine)? BytesPerLine : BytesLeft; + uint32_t Chunk = (BytesLeft > BytesPerLine)? BytesPerLine : BytesLeft; /* Output a line with these bytes */ TableFunc (Chunk); @@ -129,7 +129,7 @@ static unsigned DoTable (attr_t Style, unsigned MemberSize, void (*TableFunc) (u -unsigned ByteTable (void) +uint32_t ByteTable (void) /* Output a table of bytes */ { /* Call the low level function */ @@ -138,7 +138,7 @@ unsigned ByteTable (void) -unsigned DByteTable (void) +uint32_t DByteTable (void) /* Output a table of dbytes */ { /* Call the low level function */ @@ -147,7 +147,7 @@ unsigned DByteTable (void) -unsigned WordTable (void) +uint32_t WordTable (void) /* Output a table of words */ { /* Call the low level function */ @@ -156,7 +156,7 @@ unsigned WordTable (void) -unsigned DWordTable (void) +uint32_t DWordTable (void) /* Output a table of double words */ { /* Call the low level function */ @@ -165,18 +165,18 @@ unsigned DWordTable (void) -unsigned AddrTable (void) +uint32_t AddrTable (void) /* Output a table of addresses */ { - unsigned long BytesLeft = GetRemainingBytes (); - unsigned long Start = PC; + uint32_t BytesLeft = GetRemainingBytes (); + uint32_t Start = PC; /* Loop while table bytes left and we don't need to create a label at the ** current position. */ while (BytesLeft && GetStyleAttr (PC) == atAddrTab) { - unsigned Addr; + uint32_t Addr; /* If just one byte is left, define it and bail out */ if (BytesLeft == 1 || GetStyleAttr (PC+1) != atAddrTab) { @@ -231,18 +231,18 @@ unsigned AddrTable (void) -unsigned RtsTable (void) +uint32_t RtsTable (void) /* Output a table of RTS addresses (address - 1) */ { - unsigned long BytesLeft = GetRemainingBytes (); - unsigned long Start = PC; + uint32_t BytesLeft = GetRemainingBytes (); + uint32_t Start = PC; /* Loop while table bytes left and we don't need to create a label at the ** current position. */ while (BytesLeft && GetStyleAttr (PC) == atRtsTab) { - unsigned Addr; + uint32_t Addr; /* If just one byte is left, define it and bail out */ if (BytesLeft == 1 || GetStyleAttr (PC+1) != atRtsTab) { @@ -297,14 +297,14 @@ unsigned RtsTable (void) -unsigned TextTable (void) +uint32_t TextTable (void) /* Output a table of text messages */ { /* Count how many bytes may be output. */ - unsigned ByteCount = GetSpan (atTextTab); + uint32_t ByteCount = GetSpan (atTextTab); /* Output as many data bytes lines as needed. */ - unsigned BytesLeft = ByteCount; + uint32_t BytesLeft = ByteCount; while (BytesLeft > 0) { unsigned I; @@ -312,7 +312,7 @@ unsigned TextTable (void) /* Count the number of characters that can be output as such */ unsigned Count = 0; while (Count < BytesLeft && Count < BytesPerLine*4-1) { - unsigned char C = GetCodeByte (PC + Count); + uint8_t C = GetCodeByte (PC + Count); if (C >= 0x20 && C <= 0x7E && C != '\"') { ++Count; } else { @@ -348,7 +348,7 @@ unsigned TextTable (void) /* Count the number of bytes that must be output as bytes */ Count = 0; while (Count < BytesLeft && Count < BytesPerLine) { - unsigned char C = GetCodeByte (PC + Count); + uint8_t C = GetCodeByte (PC + Count); if (C < 0x20 || C > 0x7E || C == '\"') { ++Count; } else { diff --git a/src/da65/data.h b/src/da65/data.h index 4cec14a03..d9885b780 100644 --- a/src/da65/data.h +++ b/src/da65/data.h @@ -44,25 +44,25 @@ -unsigned ByteTable (void); +uint32_t ByteTable (void); /* Output a table of bytes */ -unsigned DByteTable (void); +uint32_t DByteTable (void); /* Output a table of dbytes */ -unsigned WordTable (void); +uint32_t WordTable (void); /* Output a table of words */ -unsigned DWordTable (void); +uint32_t DWordTable (void); /* Output a table of double words */ -unsigned AddrTable (void); +uint32_t AddrTable (void); /* Output a table of addresses */ -unsigned RtsTable (void); +uint32_t RtsTable (void); /* Output a table of RTS addresses (address - 1) */ -unsigned TextTable (void); +uint32_t TextTable (void); /* Output a table of text messages */ diff --git a/src/da65/global.c b/src/da65/global.c index e258aecdd..7e5cabf54 100644 --- a/src/da65/global.c +++ b/src/da65/global.c @@ -58,7 +58,8 @@ unsigned char UseHexOffs = 0; /* Use hexadecimal label offsets */ unsigned char PassCount = 2; /* How many passed do we do? */ signed char NewlineAfterJMP = -1; /* Add a newline after a JMP insn? */ signed char NewlineAfterRTS = -1; /* Add a newline after a RTS insn? */ -long StartAddr = -1L; /* Start/load address of the program */ +unsigned char HaveStartAddr = 0; /* Flag for start address given */ +uint32_t StartAddr = 0; /* Start/load address of the program */ unsigned char SyncLines = 0; /* Accept line markers in the info file */ long InputOffs = -1L; /* Offset into input file */ long InputSize = -1L; /* Number of bytes to read from input */ diff --git a/src/da65/global.h b/src/da65/global.h index c85c7a79e..2e558d6a9 100644 --- a/src/da65/global.h +++ b/src/da65/global.h @@ -38,6 +38,10 @@ +#include + + + /*****************************************************************************/ /* Data */ /*****************************************************************************/ @@ -59,7 +63,8 @@ extern unsigned char UseHexOffs; /* Use hexadecimal label offsets */ extern unsigned char PassCount; /* How many passed do we do? */ extern signed char NewlineAfterJMP;/* Add a newline after a JMP insn? */ extern signed char NewlineAfterRTS;/* Add a newline after a RTS insn? */ -extern long StartAddr; /* Start/load address of the program */ +extern unsigned char HaveStartAddr; /* Flag for start address given */ +extern uint32_t StartAddr; /* Start/load address of the program */ extern unsigned char SyncLines; /* Accept line markers in the info file */ extern long InputOffs; /* Offset into input file */ extern long InputSize; /* Number of bytes to read from input */ diff --git a/src/da65/handler.c b/src/da65/handler.c index 84229594f..db55b4058 100644 --- a/src/da65/handler.c +++ b/src/da65/handler.c @@ -33,6 +33,7 @@ +#include #include /* common */ @@ -95,7 +96,7 @@ static void OneLine (const OpcDesc* D, const char* Arg, ...) -static const char* GetAbsOverride (unsigned Flags, unsigned Addr) +static const char* GetAbsOverride (unsigned Flags, uint32_t Addr) /* If the instruction requires an abs override modifier, return the necessary ** string, otherwise return the empty string. */ @@ -111,7 +112,7 @@ static const char* GetAbsOverride (unsigned Flags, unsigned Addr) -static const char* GetAddrArg (unsigned Flags, unsigned Addr) +static const char* GetAddrArg (unsigned Flags, uint32_t Addr) /* Return an address argument - a label if we have one, or the address itself */ { const char* Label = 0; @@ -123,11 +124,9 @@ static const char* GetAddrArg (unsigned Flags, unsigned Addr) } else { static char Buf [32]; if (Addr < 0x100) { - xsprintf (Buf, sizeof (Buf), "$%02X", Addr); - } else if (Addr < 0x10000) { - xsprintf (Buf, sizeof (Buf), "$%04X", Addr); + xsprintf (Buf, sizeof (Buf), "$%02" PRIX32, Addr); } else { - xsprintf (Buf, sizeof (Buf), "$%06X", Addr); + xsprintf (Buf, sizeof (Buf), "$%04" PRIX32, Addr); } return Buf; } @@ -135,7 +134,7 @@ static const char* GetAddrArg (unsigned Flags, unsigned Addr) -static void GenerateLabel (unsigned Flags, unsigned Addr) +static void GenerateLabel (unsigned Flags, uint32_t Addr) /* Generate a label in pass one if requested */ { /* Generate labels in pass #1, and only if we don't have a label already */ @@ -305,7 +304,7 @@ void OH_Implicit_42_45GS02 (const OpcDesc* D) void OH_Immediate (const OpcDesc* D) { - OneLine (D, "#$%02X", GetCodeByte (PC+1)); + OneLine (D, "#$%02" PRIX8, GetCodeByte (PC+1)); } @@ -313,9 +312,9 @@ void OH_Immediate (const OpcDesc* D) void OH_Immediate65816M (const OpcDesc* D) { if (GetAttr (PC) & atMem16) { - OneLine (D, "#$%04X", GetCodeWord (PC+1)); + OneLine (D, "#$%04" PRIX16, GetCodeWord (PC+1)); } else { - OneLine (D, "#$%02X", GetCodeByte (PC+1)); + OneLine (D, "#$%02" PRIX8, GetCodeByte (PC+1)); } } @@ -324,9 +323,9 @@ void OH_Immediate65816M (const OpcDesc* D) void OH_Immediate65816X (const OpcDesc* D) { if (GetAttr (PC) & atIdx16) { - OneLine (D, "#$%04X", GetCodeWord (PC+1)); + OneLine (D, "#$%04" PRIX16, GetCodeWord (PC+1)); } else { - OneLine (D, "#$%02X", GetCodeByte (PC+1)); + OneLine (D, "#$%02" PRIX8, GetCodeByte (PC+1)); } } @@ -334,7 +333,7 @@ void OH_Immediate65816X (const OpcDesc* D) void OH_ImmediateWord (const OpcDesc* D) { - OneLine (D, "#$%04X", GetCodeWord (PC+1)); + OneLine (D, "#$%04" PRIX16, GetCodeWord (PC+1)); } @@ -342,7 +341,7 @@ void OH_ImmediateWord (const OpcDesc* D) void OH_Direct (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+1); + uint32_t Addr = GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -370,7 +369,7 @@ void OH_Direct_Q (const OpcDesc* D) void OH_DirectX (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+1); + uint32_t Addr = GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -398,7 +397,7 @@ void OH_DirectX_Q (const OpcDesc* D) void OH_DirectY (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+1); + uint32_t Addr = GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -412,7 +411,7 @@ void OH_DirectY (const OpcDesc* D) void OH_Absolute (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeWord (PC+1); + uint32_t Addr = GetCodeWord (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -440,7 +439,7 @@ void OH_Absolute_Q (const OpcDesc* D) void OH_AbsoluteX (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeWord (PC+1); + uint32_t Addr = GetCodeWord (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -468,7 +467,7 @@ void OH_AbsoluteX_Q (const OpcDesc* D) void OH_AbsoluteY (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeWord (PC+1); + uint32_t Addr = GetCodeWord (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -482,7 +481,7 @@ void OH_AbsoluteY (const OpcDesc* D) void OH_AbsoluteLong (const OpcDesc* D attribute ((unused))) { /* Get the operand */ - unsigned Addr = GetCodeLongAddr (PC+1); + uint32_t Addr = GetCodeLongAddr (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -496,7 +495,7 @@ void OH_AbsoluteLong (const OpcDesc* D attribute ((unused))) void OH_AbsoluteLongX (const OpcDesc* D attribute ((unused))) { /* Get the operand */ - unsigned Addr = GetCodeLongAddr (PC+1); + uint32_t Addr = GetCodeLongAddr (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -513,7 +512,7 @@ void OH_Relative (const OpcDesc* D) signed char Offs = GetCodeByte (PC+1); /* Calculate the target address */ - unsigned Addr = (((int) PC+2) + Offs) & 0xFFFF; + uint32_t Addr = (((int) PC+2) + Offs) & 0xFFFF; /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -535,7 +534,7 @@ void OH_RelativeLong (const OpcDesc* D attribute ((unused))) signed short Offs = GetCodeWord (PC+1); /* Calculate the target address */ - unsigned Addr = (((int) PC+3) + Offs) & 0xFFFF; + uint32_t Addr = (((int) PC+3) + Offs) & 0xFFFF; /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -552,7 +551,7 @@ void OH_RelativeLong4510 (const OpcDesc* D attribute ((unused))) signed short Offs = GetCodeWord (PC+1); /* Calculate the target address */ - unsigned Addr = (((int) PC+2) + Offs) & 0xFFFF; + uint32_t Addr = (((int) PC+2) + Offs) & 0xFFFF; /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -566,7 +565,7 @@ void OH_RelativeLong4510 (const OpcDesc* D attribute ((unused))) void OH_DirectIndirect (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+1); + uint32_t Addr = GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -580,7 +579,7 @@ void OH_DirectIndirect (const OpcDesc* D) void OH_DirectIndirectY (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+1); + uint32_t Addr = GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -594,7 +593,7 @@ void OH_DirectIndirectY (const OpcDesc* D) void OH_DirectIndirectZ (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+1); + uint32_t Addr = GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -622,7 +621,7 @@ void OH_DirectIndirectZ_Q (const OpcDesc* D) void OH_DirectXIndirect (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+1); + uint32_t Addr = GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -636,7 +635,7 @@ void OH_DirectXIndirect (const OpcDesc* D) void OH_AbsoluteIndirect (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeWord (PC+1); + uint32_t Addr = GetCodeWord (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -652,11 +651,11 @@ void OH_BitBranch (const OpcDesc* D) char* BranchLabel; /* Get the operands */ - unsigned char TestAddr = GetCodeByte (PC+1); - signed char BranchOffs = GetCodeByte (PC+2); + uint32_t TestAddr = GetCodeByte (PC+1); + int8_t BranchOffs = GetCodeByte (PC+2); /* Calculate the target address for the branch */ - unsigned BranchAddr = (((int) PC+3) + BranchOffs) & 0xFFFF; + uint32_t BranchAddr = (((int) PC+3) + BranchOffs) & 0xFFFF; /* Generate labels in pass 1. The bit branch codes are special in that ** they don't really match the remainder of the 6502 instruction set (they @@ -686,11 +685,11 @@ void OH_BitBranch_m740 (const OpcDesc* D) */ { /* unsigned Bit = GetCodeByte (PC) >> 5; */ - unsigned Addr = GetCodeByte (PC+1); - signed char BranchOffs = GetCodeByte (PC+2); + uint32_t Addr = GetCodeByte (PC+1); + int8_t BranchOffs = (int8_t) GetCodeByte (PC+2); /* Calculate the target address for the branch */ - unsigned BranchAddr = (((int) PC+3) + BranchOffs) & 0xFFFF; + uint32_t BranchAddr = (((int) PC+3) + BranchOffs) & 0xFFFF; /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -700,10 +699,12 @@ void OH_BitBranch_m740 (const OpcDesc* D) OneLine (D, "%s, %s", GetAddrArg (D->Flags, Addr), GetAddrArg (flLabel, BranchAddr)); } + + void OH_ImmediateDirect (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+2); + uint32_t Addr = GetCodeByte (PC+2); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -717,7 +718,7 @@ void OH_ImmediateDirect (const OpcDesc* D) void OH_ImmediateDirectX (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+2); + uint32_t Addr = GetCodeByte (PC+2); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -731,7 +732,7 @@ void OH_ImmediateDirectX (const OpcDesc* D) void OH_ImmediateAbsolute (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeWord (PC+2); + uint32_t Addr = GetCodeWord (PC+2); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -745,7 +746,7 @@ void OH_ImmediateAbsolute (const OpcDesc* D) void OH_ImmediateAbsoluteX (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeWord (PC+2); + uint32_t Addr = GetCodeWord (PC+2); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -790,7 +791,7 @@ void OH_StackRelativeIndirectY4510 (const OpcDesc* D attribute ((unused))) void OH_DirectIndirectLong (const OpcDesc* D attribute ((unused))) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+1); + uint32_t Addr = GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -804,7 +805,7 @@ void OH_DirectIndirectLong (const OpcDesc* D attribute ((unused))) void OH_DirectIndirectLongY (const OpcDesc* D attribute ((unused))) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+1); + uint32_t Addr = GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -820,9 +821,9 @@ void OH_BlockMove (const OpcDesc* D) char* DstLabel; /* Get source operand */ - unsigned Src = GetCodeWord (PC+1); + uint32_t Src = GetCodeWord (PC+1); /* Get destination operand */ - unsigned Dst = GetCodeWord (PC+3); + uint32_t Dst = GetCodeWord (PC+3); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Src); @@ -835,7 +836,7 @@ void OH_BlockMove (const OpcDesc* D) DstLabel = xstrdup (GetAddrArg (D->Flags, Dst)); /* Output the line */ - OneLine (D, "%s%s,%s%s,$%04X", + OneLine (D, "%s%s,%s%s,$%04" PRIX16, GetAbsOverride (D->Flags, Src), GetAddrArg (D->Flags, Src), GetAbsOverride (D->Flags, Dst), DstLabel, GetCodeWord (PC+5)); @@ -848,12 +849,12 @@ void OH_BlockMove (const OpcDesc* D) void OH_BlockMove65816 (const OpcDesc* D) { /* Get source operand */ - unsigned Src = GetCodeByte (PC+2); + uint8_t Src = GetCodeByte (PC+2); /* Get destination operand */ - unsigned Dst = GetCodeByte (PC+1); + uint8_t Dst = GetCodeByte (PC+1); /* Output the line */ - OneLine (D, "#$%02X, #$%02X", Src, Dst); + OneLine (D, "#$%02" PRIX8 ", #$%02" PRIX8, Src, Dst); } @@ -861,7 +862,7 @@ void OH_BlockMove65816 (const OpcDesc* D) void OH_AbsoluteXIndirect (const OpcDesc* D attribute ((unused))) { /* Get the operand */ - unsigned Addr = GetCodeWord (PC+1); + uint32_t Addr = GetCodeWord (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -875,7 +876,7 @@ void OH_AbsoluteXIndirect (const OpcDesc* D attribute ((unused))) void OH_DirectImmediate (const OpcDesc* D) { /* Get the operand */ - unsigned Addr = GetCodeByte (PC+1); + uint32_t Addr = GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -891,7 +892,7 @@ void OH_ZeroPageBit (const OpcDesc* D) ** NOTE: currently is part of the instruction */ { - unsigned Addr = GetCodeByte (PC+1); + uint32_t Addr = GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -917,10 +918,10 @@ void OH_AccumulatorBitBranch (const OpcDesc* D) ** NOTE: currently is part of the instruction */ { - signed char BranchOffs = GetCodeByte (PC+1); + int8_t BranchOffs = GetCodeByte (PC+1); /* Calculate the target address for the branch */ - unsigned BranchAddr = (((int) PC+3) + BranchOffs) & 0xFFFF; + uint32_t BranchAddr = (((int) PC+3) + BranchOffs) & 0xFFFF; /* Generate labels in pass 1 */ GenerateLabel (flLabel, BranchAddr); @@ -945,7 +946,7 @@ void OH_SpecialPage (const OpcDesc* D) /* m740 "special page" address mode */ { /* Get the operand */ - unsigned Addr = 0xFF00 + GetCodeByte (PC+1); + uint32_t Addr = 0xFF00 + GetCodeByte (PC+1); /* Generate a label in pass 1 */ GenerateLabel (D->Flags, Addr); @@ -1004,16 +1005,13 @@ void OH_JsrAbsolute (const OpcDesc* D) unsigned ParamSize = SubroutineParamSize[GetCodeWord (PC+1)]; OH_Absolute (D); if (ParamSize > 0) { - unsigned RemainingBytes; - unsigned BytesLeft; + uint32_t RemainingBytes; + uint32_t BytesLeft; PC += D->Size; RemainingBytes = GetRemainingBytes (); - if (RemainingBytes < ParamSize) { - ParamSize = RemainingBytes; - } - BytesLeft = ParamSize; + BytesLeft = (RemainingBytes < ParamSize)? RemainingBytes : ParamSize; while (BytesLeft > 0) { - unsigned Chunk = (BytesLeft > BytesPerLine) ? BytesPerLine : BytesLeft; + uint32_t Chunk = (BytesLeft > BytesPerLine) ? BytesPerLine : BytesLeft; DataByteLine (Chunk); BytesLeft -= Chunk; PC += Chunk; @@ -1024,7 +1022,7 @@ void OH_JsrAbsolute (const OpcDesc* D) -void SetSubroutineParamSize (unsigned Addr, unsigned Size) +void SetSubroutineParamSize (uint32_t Addr, unsigned Size) { SubroutineParamSize[Addr] = Size; } diff --git a/src/da65/handler.h b/src/da65/handler.h index fc82595c6..91c1562cd 100644 --- a/src/da65/handler.h +++ b/src/da65/handler.h @@ -38,6 +38,8 @@ +#include + /* common */ #include "attrib.h" @@ -119,7 +121,7 @@ void OH_JmpAbsoluteIndirect (const OpcDesc* D); void OH_JmpAbsoluteXIndirect (const OpcDesc* D); void OH_JsrAbsolute (const OpcDesc*); -void SetSubroutineParamSize (unsigned Addr, unsigned Size); +void SetSubroutineParamSize (uint32_t Addr, unsigned Size); /* End of handler.h */ diff --git a/src/da65/infofile.c b/src/da65/infofile.c index fbf367cc9..67e7df1d9 100644 --- a/src/da65/infofile.c +++ b/src/da65/infofile.c @@ -219,7 +219,7 @@ static void GlobalSection (void) case INFOTOK_ARGUMENT_COLUMN: InfoNextTok (); InfoAssureInt (); - InfoRangeCheck (MIN_ACOL, MAX_ACOL); + InfoRangeCheck ("ARGUMENTCOLUMN", MIN_ACOL, MAX_ACOL); ACol = InfoIVal; InfoNextTok (); break; @@ -227,7 +227,7 @@ static void GlobalSection (void) case INFOTOK_COMMENT_COLUMN: InfoNextTok (); InfoAssureInt (); - InfoRangeCheck (MIN_CCOL, MAX_CCOL); + InfoRangeCheck ("COMMENTCOLUMN", MIN_CCOL, MAX_CCOL); CCol = InfoIVal; InfoNextTok (); break; @@ -235,7 +235,7 @@ static void GlobalSection (void) case INFOTOK_COMMENTS: InfoNextTok (); InfoAssureInt (); - InfoRangeCheck (MIN_COMMENTS, MAX_COMMENTS); + InfoRangeCheck ("COMMENTS", MIN_COMMENTS, MAX_COMMENTS); Comments = InfoIVal; InfoNextTok (); break; @@ -281,7 +281,7 @@ static void GlobalSection (void) case INFOTOK_INPUTSIZE: InfoNextTok (); InfoAssureInt (); - InfoRangeCheck (1, 0x10000); + InfoRangeCheck ("INPUTSIZE", 1, 0x10000); InputSize = InfoIVal; InfoNextTok (); break; @@ -289,7 +289,7 @@ static void GlobalSection (void) case INFOTOK_LABELBREAK: InfoNextTok (); InfoAssureInt (); - InfoRangeCheck (0, UCHAR_MAX); + InfoRangeCheck ("LABELBREAK", 0, UCHAR_MAX); LBreak = (unsigned char) InfoIVal; InfoNextTok (); break; @@ -297,7 +297,7 @@ static void GlobalSection (void) case INFOTOK_MNEMONIC_COLUMN: InfoNextTok (); InfoAssureInt (); - InfoRangeCheck (MIN_MCOL, MAX_MCOL); + InfoRangeCheck ("MNEMONICCOLUMN", MIN_MCOL, MAX_MCOL); MCol = InfoIVal; InfoNextTok (); break; @@ -336,7 +336,7 @@ static void GlobalSection (void) InfoNextTok (); InfoAssureInt (); if (InfoIVal != 0) { - InfoRangeCheck (MIN_PAGE_LEN, MAX_PAGE_LEN); + InfoRangeCheck ("PAGELENGTH", MIN_PAGE_LEN, MAX_PAGE_LEN); } PageLength = InfoIVal; InfoNextTok (); @@ -345,15 +345,16 @@ static void GlobalSection (void) case INFOTOK_STARTADDR: InfoNextTok (); InfoAssureInt (); - InfoRangeCheck (0x0000, 0xFFFF); + InfoRangeCheck ("STARTADDR", 0x0000, 0xFFFF); StartAddr = InfoIVal; + HaveStartAddr = 1; InfoNextTok (); break; case INFOTOK_TEXT_COLUMN: InfoNextTok (); InfoAssureInt (); - InfoRangeCheck (MIN_TCOL, MAX_TCOL); + InfoRangeCheck ("TEXTCOLUMN", MIN_TCOL, MAX_TCOL); TCol = InfoIVal; InfoNextTok (); break; @@ -413,7 +414,7 @@ static void LabelSection (void) InfoError ("Value already given"); } InfoAssureInt (); - InfoRangeCheck (0, 0xFFFF); + InfoRangeCheck ("ADDR", 0, 0xFFFF); Value = InfoIVal; InfoNextTok (); break; @@ -447,7 +448,7 @@ static void LabelSection (void) InfoError ("Size already given"); } InfoAssureInt (); - InfoRangeCheck (1, 0x10000); + InfoRangeCheck ("SIZE", 1, 0x10000); Size = InfoIVal; InfoNextTok (); break; @@ -458,7 +459,7 @@ static void LabelSection (void) InfoError ("ParamSize already given"); } InfoAssureInt (); - InfoRangeCheck (1, 0x10000); + InfoRangeCheck ("PARAMSIZE", 1, 0x10000); ParamSize = InfoIVal; InfoNextTok (); break; @@ -554,13 +555,13 @@ static void RangeSection (void) tComment = 0x10, tAddrMode = 0x20, tUnit = 0x40, - tNeeded = (tStart | tEnd | tType) + tNeeded = (tStart | tEnd | tType) }; unsigned Attributes = tNone; /* Locals - initialize to avoid gcc warnings */ - unsigned Start = 0; - unsigned End = 0; + uint32_t Start = 0; + uint32_t End = 0; unsigned char Type = 0; unsigned AddrMode = 0; char* Name = 0; @@ -599,17 +600,18 @@ static void RangeSection (void) case INFOTOK_END: AddAttr ("END", &Attributes, tEnd); InfoNextTok (); - if (InfoTok == INFOTOK_OFFSET_INTCON) { - InfoRangeCheck (0x0000, 0xFFFF); - if (!(Attributes & tStart)) + InfoRangeCheck ("END", 0x0000, 0xFFFF); + if ((Attributes & tStart) == 0) { InfoError ("When using End with an offset, Start must be specified before"); + } End = Start + InfoIVal - 1; - if (End > 0xFFFF) + if (End > 0xFFFF) { InfoError ("Range error"); + } } else { InfoAssureInt (); - InfoRangeCheck (0x0000, 0xFFFF); + InfoRangeCheck ("END", 0x0000, 0xFFFF); End = InfoIVal; } InfoNextTok (); @@ -631,7 +633,7 @@ static void RangeSection (void) AddAttr ("START", &Attributes, tStart); InfoNextTok (); InfoAssureInt (); - InfoRangeCheck (0x0000, 0xFFFF); + InfoRangeCheck ("START", 0x0000, 0xFFFF); Start = InfoIVal; InfoNextTok (); break; @@ -689,7 +691,7 @@ static void RangeSection (void) AddAttr ("UNIT", &Attributes, tUnit); InfoNextTok (); InfoAssureInt (); - InfoRangeCheck (0x0002, 0xFFFF); + InfoRangeCheck ("UNIT", 0x0002, 0xFFFF); Unit = InfoIVal; InfoNextTok (); break; @@ -807,7 +809,7 @@ static void SegmentSection (void) InfoError ("Value already given"); } InfoAssureInt (); - InfoRangeCheck (0, 0xFFFF); + InfoRangeCheck ("END", 0, 0xFFFF); End = InfoIVal; InfoNextTok (); break; @@ -828,7 +830,7 @@ static void SegmentSection (void) InfoError ("Value already given"); } InfoAssureInt (); - InfoRangeCheck (0, 0xFFFF); + InfoRangeCheck ("START", 0, 0xFFFF); Start = InfoIVal; InfoNextTok (); break; diff --git a/src/da65/labels.c b/src/da65/labels.c index 4cae0316a..6f6bce3ed 100644 --- a/src/da65/labels.c +++ b/src/da65/labels.c @@ -33,15 +33,17 @@ +#include #include #include /* common */ +#include "coll.h" +#include "strbuf.h" #include "xmalloc.h" #include "xsprintf.h" /* da65 */ -#include "attrtab.h" #include "code.h" #include "comments.h" #include "error.h" @@ -57,14 +59,82 @@ -/* Symbol table */ -static const char* SymTab[0x10000]; +/* Label structure how it is found in the label table */ +typedef struct Label Label; +struct Label { + struct Label* Next; /* Next entry in linked list */ + uint32_t Addr; /* The full address */ + char Name[1]; /* Symbol name, dynamically allocated */ +}; -/* 65816 symbol table */ -#define MAX_LONG_LABELS 256 -static const char* LongSymVal[MAX_LONG_LABELS]; -static unsigned LongSymAddr[MAX_LONG_LABELS]; -static unsigned LongLabelsUsed; +/* Labels use a hash table and a linear list for collision resolution. The +** hash function is easy and effective. It evaluates just the lower bits of +** the address. +*/ +#define LABEL_HASH_SIZE 4096u /* Must be power of two */ +static Label* LabelTab[LABEL_HASH_SIZE]; + + + +/*****************************************************************************/ +/* struct Label */ +/*****************************************************************************/ + + + +static Label* NewLabel (uint32_t Addr, const char* Name) +/* Create a new label structure and return it */ +{ + /* Get the length of the name */ + unsigned Len = strlen (Name); + + /* Create a new label */ + Label* L = xmalloc (sizeof (Label) + Len); + + /* Fill in the data */ + L->Next = 0; + L->Addr = Addr; + memcpy (L->Name, Name, Len + 1); + + /* Return the label just created */ + return L; +} + + + +static uint32_t GetLabelHash (uint32_t Addr) +/* Get the hash for a label at the given address */ +{ + return (Addr & (LABEL_HASH_SIZE - 1)); +} + + + +static Label* FindLabel (uint32_t Addr) +/* Search for a label for the given address and return it. Returns NULL if +** no label exists for the address. +*/ +{ + Label* L = LabelTab[GetLabelHash (Addr)]; + while (L) { + if (L->Addr == Addr) { + break; + } + L = L->Next; + } + return L; +} + + + +static void InsertLabel (Label* L) +/* Insert a label into the tables */ +{ + /* Insert into hash table */ + uint32_t Hash = GetLabelHash (L->Addr); + L->Next = LabelTab[Hash]; + LabelTab[Hash] = L; +} @@ -74,34 +144,19 @@ static unsigned LongLabelsUsed; -static const char* MakeLabelName (unsigned Addr) +static const char* MakeLabelName (uint32_t Addr) /* Make the default label name from the given address and return it in a ** static buffer. */ { static char LabelBuf [32]; - xsprintf (LabelBuf, sizeof (LabelBuf), - IsLongAddr (Addr) ? "L%06X" : "L%04X", Addr); + xsprintf (LabelBuf, sizeof (LabelBuf), "L%04" PRIX32, Addr); return LabelBuf; } -static unsigned FindLongIndex (unsigned Addr) -{ - unsigned i; - for (i = 0; i < LongLabelsUsed; i++) { - if (LongSymAddr[i] == Addr) { - return i; - } - } - - return -1; -} - - - -static void AddLabel (unsigned Addr, attr_t Attr, const char* Name) +static void AddLabel (uint32_t Addr, attr_t Attr, const char* Name) /* Add a label */ { /* Get an existing label attribute */ @@ -109,43 +164,25 @@ static void AddLabel (unsigned Addr, attr_t Attr, const char* Name) /* Must not have two symbols for one address */ if (ExistingAttr != atNoLabel) { - /* Allow redefinition if identical. Beware: Unnamed labels don't - ** have a name (you guessed that, didn't you?). + /* Allow redefinition if identical. Beware: Unnamed labels do not + ** have an entry in the label table. */ - if (IsLongAddr (Addr)) { - const unsigned i = FindLongIndex (Addr); - if (ExistingAttr == Attr && - ((Name == 0 && LongSymVal[i] == 0) || - (Name != 0 && LongSymVal[i] != 0 && - strcmp (LongSymVal[i], Name) == 0))) { - return; - } - Error ("Duplicate label for address $%06X (%s): '%s'", Addr, - LongSymVal[i] == 0 ? "" : LongSymVal[i], - Name == 0 ? "" : Name); - } else { - if (ExistingAttr == Attr && - ((Name == 0 && SymTab[Addr] == 0) || - (Name != 0 && SymTab[Addr] != 0 && - strcmp (SymTab[Addr], Name) == 0))) { - return; - } - Error ("Duplicate label for address $%04X (%s): '%s'", Addr, - SymTab[Addr] == 0 ? "" : SymTab[Addr], - Name == 0 ? "" : Name); + Label* L = FindLabel (Addr); + if (ExistingAttr == Attr && + ((Name == 0 && L == 0) || + (Name != 0 && L != 0 && strcmp (Name, L->Name) == 0))) { + return; } + Error ("Duplicate label for address $%04X (%s): '%s'", Addr, + L? L->Name : "", + Name? Name : ""); } - /* Create a new label (xstrdup will return NULL if input NULL) */ - if (IsLongAddr (Addr)) { - if (LongLabelsUsed >= MAX_LONG_LABELS) { - Error ("Too many long labels"); - } - LongSymAddr[LongLabelsUsed] = Addr; - LongSymVal[LongLabelsUsed] = xstrdup (Name); - LongLabelsUsed++; - } else { - SymTab[Addr] = xstrdup (Name); + /* If this is not an unnamed label, create a new label entry and + ** insert it. + */ + if (Name != 0) { + InsertLabel (NewLabel (Addr, Name)); } /* Remember the attribute */ @@ -154,7 +191,7 @@ static void AddLabel (unsigned Addr, attr_t Attr, const char* Name) -void AddIntLabel (unsigned Addr) +void AddIntLabel (uint32_t Addr) /* Add an internal label using the address to generate the name. */ { AddLabel (Addr, atIntLabel, MakeLabelName (Addr)); @@ -162,7 +199,7 @@ void AddIntLabel (unsigned Addr) -void AddExtLabel (unsigned Addr, const char* Name) +void AddExtLabel (uint32_t Addr, const char* Name) /* Add an external label */ { AddLabel (Addr, atExtLabel, Name); @@ -170,7 +207,7 @@ void AddExtLabel (unsigned Addr, const char* Name) -void AddUnnamedLabel (unsigned Addr) +void AddUnnamedLabel (uint32_t Addr) /* Add an unnamed label */ { AddLabel (Addr, atUnnamedLabel, 0); @@ -178,11 +215,27 @@ void AddUnnamedLabel (unsigned Addr) -void AddDepLabel (unsigned Addr, attr_t Attr, const char* BaseName, unsigned Offs) +void AddDepLabel (uint32_t Addr, attr_t Attr, const char* BaseName, unsigned Offs) /* Add a dependent label at the given address using "basename+Offs" as the new ** name. */ { + /* Create the new name in the buffer */ + StrBuf Name = AUTO_STRBUF_INITIALIZER; + if (UseHexOffs) { + SB_Printf (&Name, "%s+$%02X", BaseName, Offs); + } else { + SB_Printf (&Name, "%s+%u", BaseName, Offs); + } + + /* Define the labels */ + AddLabel (Addr, Attr | atDepLabel, SB_GetConstBuf (&Name)); + + /* Free the name buffer */ + SB_Done (&Name); + + + /* Allocate memory for the dependent label name */ unsigned NameLen = strlen (BaseName); char* DepName = xmalloc (NameLen + 7); /* "+$ABCD\0" */ @@ -203,7 +256,7 @@ void AddDepLabel (unsigned Addr, attr_t Attr, const char* BaseName, unsigned Off -static void AddLabelRange (unsigned Addr, attr_t Attr, +static void AddLabelRange (uint32_t Addr, attr_t Attr, const char* Name, unsigned Count) /* Add a label for a range. The first entry gets the label "Name" while the ** others get "Name+offs". @@ -241,7 +294,7 @@ static void AddLabelRange (unsigned Addr, attr_t Attr, -void AddIntLabelRange (unsigned Addr, const char* Name, unsigned Count) +void AddIntLabelRange (uint32_t Addr, const char* Name, unsigned Count) /* Add an internal label for a range. The first entry gets the label "Name" ** while the others get "Name+offs". */ @@ -252,7 +305,7 @@ void AddIntLabelRange (unsigned Addr, const char* Name, unsigned Count) -void AddExtLabelRange (unsigned Addr, const char* Name, unsigned Count) +void AddExtLabelRange (uint32_t Addr, const char* Name, unsigned Count) /* Add an external label for a range. The first entry gets the label "Name" ** while the others get "Name+offs". */ @@ -263,7 +316,7 @@ void AddExtLabelRange (unsigned Addr, const char* Name, unsigned Count) -int HaveLabel (unsigned Addr) +int HaveLabel (uint32_t Addr) /* Check if there is a label for the given address */ { /* Check for a label */ @@ -272,7 +325,7 @@ int HaveLabel (unsigned Addr) -int MustDefLabel (unsigned Addr) +int MustDefLabel (uint32_t Addr) /* Return true if we must define a label for this address, that is, if there ** is a label at this address, and it is an external or internal label. */ @@ -286,7 +339,7 @@ int MustDefLabel (unsigned Addr) -const char* GetLabelName (unsigned Addr) +const char* GetLabelName (uint32_t Addr) /* Return the label name for an address */ { /* Get the label attribute */ @@ -297,19 +350,16 @@ const char* GetLabelName (unsigned Addr) */ if (A == atUnnamedLabel) { return ""; - } else if (IsLongAddr (Addr)) { - /* Return the label if any */ - const unsigned i = FindLongIndex (Addr); - return i < LongLabelsUsed ? LongSymVal[i] : NULL; } else { /* Return the label if any */ - return SymTab[Addr]; + const Label* L = FindLabel (Addr); + return L? L->Name : 0; } } -const char* GetLabel (unsigned Addr, unsigned RefFrom) +const char* GetLabel (uint32_t Addr, uint32_t RefFrom) /* Return the label name for an address, as it is used in a label reference. ** RefFrom is the address the label is referenced from. This is needed in case ** of unnamed labels, to determine the name. @@ -339,7 +389,7 @@ const char* GetLabel (unsigned Addr, unsigned RefFrom) */ if (Addr <= RefFrom) { /* Search backwards */ - unsigned I = RefFrom; + uint32_t I = RefFrom; while (Addr < I) { --I; A = GetLabelAttr (I); @@ -357,7 +407,7 @@ const char* GetLabel (unsigned Addr, unsigned RefFrom) } else { /* Search forwards */ - unsigned I = RefFrom; + uint32_t I = RefFrom; while (Addr > I) { ++I; A = GetLabelAttr (I); @@ -373,26 +423,22 @@ const char* GetLabel (unsigned Addr, unsigned RefFrom) /* Return the label name */ return FwdLabels[Count-1]; } - - } else if (IsLongAddr (Addr)) { - /* Return the label if any */ - const unsigned i = FindLongIndex (Addr); - return i < LongLabelsUsed ? LongSymVal[i] : NULL; } else { /* Return the label if any */ - return SymTab[Addr]; + const Label* L = FindLabel (Addr); + return L? L->Name : 0; } } -void ForwardLabel (unsigned Offs) +void ForwardLabel (uint32_t Offs) /* If necessary, output a forward label, one that is within the next few ** bytes and is therefore output as "label = * + x". */ { /* Calculate the actual address */ - unsigned long Addr = PC + Offs; + uint32_t Addr = PC + Offs; /* Get the type of the label */ attr_t A = GetLabelAttr (Addr); @@ -406,7 +452,7 @@ void ForwardLabel (unsigned Offs) ** an error. */ if (A == atUnnamedLabel) { - Error ("Cannot define unnamed label at address $%04lX", Addr); + Error ("Cannot define unnamed label at address $%04" PRIX32, Addr); } /* Output the label */ @@ -415,24 +461,33 @@ void ForwardLabel (unsigned Offs) -static void DefOutOfRangeLabel (unsigned long Addr) +static int CompareLabels (void* Data attribute ((unused)), + const void* L1, const void* L2) +/* Compare functions for sorting the out-of-range labels */ +{ + if (((const Label*) L1)->Addr < ((const Label*) L2)->Addr) { + return -1; + } else if (((const Label*) L1)->Addr > ((const Label*) L2)->Addr) { + return 1; + } else { + return 0; + } +} + + + +static void DefOutOfRangeLabel (const Label* L) /* Define one label that is outside code range. */ { - switch (GetLabelAttr (Addr)) { + switch (GetLabelAttr (L->Addr)) { case atIntLabel: case atExtLabel: - if (IsLongAddr (Addr)) { - const unsigned i = FindLongIndex (Addr); - DefConst (i < LongLabelsUsed ? LongSymVal[i] : NULL, - GetComment (Addr), Addr); - } else { - DefConst (SymTab[Addr], GetComment (Addr), Addr); - } + DefConst (L->Name, GetComment (L->Addr), L->Addr); break; case atUnnamedLabel: - Error ("Cannot define unnamed label at address $%04lX", Addr); + Error ("Cannot define unnamed label at address $%04" PRIX32, L->Addr); break; default: @@ -446,34 +501,40 @@ static void DefOutOfRangeLabel (unsigned long Addr) void DefOutOfRangeLabels (void) /* Output any labels that are out of the loaded code range */ { - unsigned long Addr; - unsigned i; + unsigned I; - SeparatorLine (); + /* This requires somewhat more effort since the labels output should be + ** sorted by address for better readability. This is not directly + ** possible when using a hash table, so an intermediate data structure + ** is required. It is not possible to collect out-of-range labels while + ** generating them, since they may come from an info file and are added + ** while no input file was read. Which means it cannot be determined at + ** that point if they're out-of-range or not. + */ + Collection Labels = AUTO_COLLECTION_INITIALIZER; + CollGrow (&Labels, 128); - /* Low range */ - Addr = 0; - while (Addr < CodeStart) { - DefOutOfRangeLabel (Addr++); - } - - /* Skip areas in code range */ - while (Addr <= CodeEnd) { - if (GetStyleAttr (Addr) == atSkip) { - DefOutOfRangeLabel (Addr); + /* Walk over the hash and copy all out-of-range labels */ + for (I = 0; I < LABEL_HASH_SIZE; ++I) { + Label* L = LabelTab[I]; + while (L) { + if (L->Addr < CodeStart || L->Addr > CodeEnd) { + CollAppend (&Labels, L); + } + L = L->Next; } - ++Addr; } - /* High range */ - while (Addr < 0x10000) { - DefOutOfRangeLabel (Addr++); - } - - /* 65816 long range */ - for (i = 0; i < LongLabelsUsed; i++) { - DefOutOfRangeLabel (LongSymAddr[i]); - } + /* Sort the out-of-range labels by address */ + CollSort (&Labels, CompareLabels, 0); + /* Output the labels */ SeparatorLine (); + for (I = 0; I < CollCount (&Labels); ++I) { + DefOutOfRangeLabel (CollConstAt (&Labels, I)); + } + SeparatorLine (); + + /* Free allocated storage */ + DoneCollection (&Labels); } diff --git a/src/da65/labels.h b/src/da65/labels.h index c4b52774a..37f2daeab 100644 --- a/src/da65/labels.h +++ b/src/da65/labels.h @@ -38,6 +38,9 @@ +#include + +/* da65 */ #include "attrtab.h" @@ -48,42 +51,42 @@ -void AddIntLabel (unsigned Addr); +void AddIntLabel (uint32_t Addr); /* Add an internal label using the address to generate the name. */ -void AddExtLabel (unsigned Addr, const char* Name); +void AddExtLabel (uint32_t Addr, const char* Name); /* Add an external label */ -void AddUnnamedLabel (unsigned Addr); +void AddUnnamedLabel (uint32_t Addr); /* Add an unnamed label */ -void AddDepLabel (unsigned Addr, attr_t Attr, const char* BaseName, unsigned Offs); +void AddDepLabel (uint32_t Addr, attr_t Attr, const char* BaseName, unsigned Offs); /* Add a dependent label at the given address using "base name+Offs" as the new ** name. */ -void AddIntLabelRange (unsigned Addr, const char* Name, unsigned Count); +void AddIntLabelRange (uint32_t Addr, const char* Name, unsigned Count); /* Add an internal label for a range. The first entry gets the label "Name" ** while the others get "Name+offs". */ -void AddExtLabelRange (unsigned Addr, const char* Name, unsigned Count); +void AddExtLabelRange (uint32_t Addr, const char* Name, unsigned Count); /* Add an external label for a range. The first entry gets the label "Name" ** while the others get "Name+offs". */ -int HaveLabel (unsigned Addr); +int HaveLabel (uint32_t Addr); /* Check if there is a label for the given address */ -int MustDefLabel (unsigned Addr); +int MustDefLabel (uint32_t Addr); /* Return true if we must define a label for this address, that is, if there ** is a label at this address, and it is an external or internal label. */ -const char* GetLabelName (unsigned Addr); +const char* GetLabelName (uint32_t Addr); /* Return the label name for an address */ -const char* GetLabel (unsigned Addr, unsigned RefFrom); +const char* GetLabel (uint32_t Addr, uint32_t RefFrom); /* Return the label name for an address, as it is used in a label reference. ** RefFrom is the address the label is referenced from. This is needed in case ** of unnamed labels, to determine the name. diff --git a/src/da65/main.c b/src/da65/main.c index 545cc657b..91eecd94f 100644 --- a/src/da65/main.c +++ b/src/da65/main.c @@ -313,7 +313,8 @@ static void OptPageLength (const char* Opt attribute ((unused)), const char* Arg static void OptStartAddr (const char* Opt, const char* Arg) /* Set the default start address */ { - StartAddr = CvtNumber (Opt, Arg); + StartAddr = (uint32_t) CvtNumber (Opt, Arg); + HaveStartAddr = 1; } @@ -409,11 +410,11 @@ static unsigned HandleChangedLength(const OpcDesc* D, unsigned PC) static void OneOpcode (unsigned RemainingBytes) /* Disassemble one opcode */ { - unsigned I; - unsigned OldPC = PC; + uint32_t I; + uint32_t OldPC = PC; /* Get the opcode from the current address */ - unsigned char OPC = GetCodeByte (PC); + uint8_t OPC = GetCodeByte (PC); /* Get the opcode description for the opcode byte */ const OpcDesc* D = &OpcTable[OPC]; @@ -574,7 +575,7 @@ static void OneOpcode (unsigned RemainingBytes) static void OnePass (void) /* Make one pass through the code */ { - unsigned Count; + uint32_t Count; PrevAddrMode = 0; diff --git a/src/da65/output.c b/src/da65/output.c index 8e786e130..bc5f7d5c2 100644 --- a/src/da65/output.c +++ b/src/da65/output.c @@ -33,6 +33,7 @@ +#include #include #include #include @@ -208,13 +209,13 @@ void DefForward (const char* Name, const char* Comment, unsigned Offs) -void DefConst (const char* Name, const char* Comment, unsigned Addr) +void DefConst (const char* Name, const char* Comment, uint32_t Addr) /* Define an address constant */ { if (Pass == PassCount) { Output ("%s", Name); Indent (ACol); - Output (":= $%04X", Addr); + Output (":= $%04" PRIX32, Addr); if (Comment) { Indent (CCol); Output ("; %s", Comment); @@ -225,19 +226,19 @@ void DefConst (const char* Name, const char* Comment, unsigned Addr) -void DataByteLine (unsigned ByteCount) +void DataByteLine (uint32_t ByteCount) /* Output a line with bytes */ { - unsigned I; + uint32_t I; Indent (MCol); Output (".byte"); Indent (ACol); for (I = 0; I < ByteCount; ++I) { if (I > 0) { - Output (",$%02X", CodeBuf[PC+I]); + Output (",$%02" PRIX8, CodeBuf[PC+I]); } else { - Output ("$%02X", CodeBuf[PC+I]); + Output ("$%02" PRIX8, CodeBuf[PC+I]); } } LineComment (PC, ByteCount); @@ -246,19 +247,19 @@ void DataByteLine (unsigned ByteCount) -void DataDByteLine (unsigned ByteCount) +void DataDByteLine (uint32_t ByteCount) /* Output a line with dbytes */ { - unsigned I; + uint32_t I; Indent (MCol); Output (".dbyt"); Indent (ACol); for (I = 0; I < ByteCount; I += 2) { if (I > 0) { - Output (",$%04X", GetCodeDByte (PC+I)); + Output (",$%04" PRIX16, GetCodeDByte (PC+I)); } else { - Output ("$%04X", GetCodeDByte (PC+I)); + Output ("$%04" PRIX16, GetCodeDByte (PC+I)); } } LineComment (PC, ByteCount); @@ -267,19 +268,19 @@ void DataDByteLine (unsigned ByteCount) -void DataWordLine (unsigned ByteCount) +void DataWordLine (uint32_t ByteCount) /* Output a line with words */ { - unsigned I; + uint32_t I; Indent (MCol); Output (".word"); Indent (ACol); for (I = 0; I < ByteCount; I += 2) { if (I > 0) { - Output (",$%04X", GetCodeWord (PC+I)); + Output (",$%04" PRIX16, GetCodeWord (PC+I)); } else { - Output ("$%04X", GetCodeWord (PC+I)); + Output ("$%04" PRIX16, GetCodeWord (PC+I)); } } LineComment (PC, ByteCount); @@ -288,19 +289,19 @@ void DataWordLine (unsigned ByteCount) -void DataDWordLine (unsigned ByteCount) +void DataDWordLine (uint32_t ByteCount) /* Output a line with dwords */ { - unsigned I; + uint32_t I; Indent (MCol); Output (".dword"); Indent (ACol); for (I = 0; I < ByteCount; I += 4) { if (I > 0) { - Output (",$%08lX", GetCodeDWord (PC+I)); + Output (",$%08" PRIX32, GetCodeDWord (PC+I)); } else { - Output ("$%08lX", GetCodeDWord (PC+I)); + Output ("$%08" PRIX32, GetCodeDWord (PC+I)); } } LineComment (PC, ByteCount); @@ -372,12 +373,12 @@ void LineComment (unsigned PC, unsigned Count) Output ("; %04X", PC); if (Comments >= 3) { for (I = 0; I < Count; ++I) { - Output (" %02X", CodeBuf [PC+I]); + Output (" %02" PRIX8, CodeBuf [PC+I]); } if (Comments >= 4) { Indent (TCol); for (I = 0; I < Count; ++I) { - unsigned char C = CodeBuf [PC+I]; + uint8_t C = CodeBuf [PC+I]; if (!isprint (C)) { C = '.'; } diff --git a/src/da65/output.h b/src/da65/output.h index bc20aace0..7370e0786 100644 --- a/src/da65/output.h +++ b/src/da65/output.h @@ -72,22 +72,22 @@ void DefForward (const char* Name, const char* Comment, unsigned Offs); ** current PC. */ -void DefConst (const char* Name, const char* Comment, unsigned Addr); +void DefConst (const char* Name, const char* Comment, uint32_t Addr); /* Define an address constant */ void OneDataByte (void); /* Output a .byte line with the current code byte */ -void DataByteLine (unsigned ByteCount); +void DataByteLine (uint32_t ByteCount); /* Output a line with bytes */ -void DataDByteLine (unsigned ByteCount); +void DataDByteLine (uint32_t ByteCount); /* Output a line with dbytes */ -void DataWordLine (unsigned ByteCount); +void DataWordLine (uint32_t ByteCount); /* Output a line with words */ -void DataDWordLine (unsigned ByteCount); +void DataDWordLine (uint32_t ByteCount); /* Output a line with dwords */ void SeparatorLine (void); diff --git a/src/da65/scanner.c b/src/da65/scanner.c index d0301c08a..66940dfb6 100644 --- a/src/da65/scanner.c +++ b/src/da65/scanner.c @@ -600,11 +600,11 @@ void InfoAssureIdent (void) -void InfoRangeCheck (long Lo, long Hi) +void InfoRangeCheck (const char* Attr, long Lo, long Hi) /* Check the range of InfoIVal */ { if (InfoIVal < Lo || InfoIVal > Hi) { - InfoError ("Range error"); + InfoError ("Range error for attribute %s", Attr); } } diff --git a/src/da65/scanner.h b/src/da65/scanner.h index ce76d4a98..e34aecb4f 100644 --- a/src/da65/scanner.h +++ b/src/da65/scanner.h @@ -191,7 +191,7 @@ void InfoAssureChar (void); void InfoAssureIdent (void); /* Make sure the next token is an identifier */ -void InfoRangeCheck (long Lo, long Hi); +void InfoRangeCheck (const char* Attr, long Lo, long Hi); /* Check the range of InfoIVal */ void InfoSpecialToken (const IdentTok* Table, unsigned Size, const char* Name); diff --git a/src/da65/segment.c b/src/da65/segment.c index 12d4cf656..1a0b3b062 100644 --- a/src/da65/segment.c +++ b/src/da65/segment.c @@ -58,7 +58,7 @@ typedef struct Segment Segment; struct Segment { Segment* NextStart; /* Pointer to next segment */ - unsigned long Start; + uint32_t Start; unsigned AddrSize; char Name[1]; /* Name, dynamically allocated */ }; @@ -76,7 +76,7 @@ static Segment* StartTab[HASH_SIZE]; /* Table containing segment starts */ -void AddAbsSegment (unsigned Start, unsigned End, const char* Name) +void AddAbsSegment (uint32_t Start, uint32_t End, const char* Name) /* Add an absolute segment to the segment table */ { /* Get the length of the name */ @@ -104,7 +104,7 @@ void AddAbsSegment (unsigned Start, unsigned End, const char* Name) -char* GetSegmentStartName (unsigned Addr) +char* GetSegmentStartName (uint32_t Addr) /* Return the name of the segment which starts at the given address */ { Segment* S = StartTab[Addr % HASH_SIZE]; @@ -122,7 +122,7 @@ char* GetSegmentStartName (unsigned Addr) -unsigned GetSegmentAddrSize (unsigned Addr) +unsigned GetSegmentAddrSize (uint32_t Addr) /* Return the address size of the segment which starts at the given address */ { Segment* S = StartTab[Addr % HASH_SIZE]; diff --git a/src/da65/segment.h b/src/da65/segment.h index b1423bb41..5da30fda3 100644 --- a/src/da65/segment.h +++ b/src/da65/segment.h @@ -44,13 +44,13 @@ -void AddAbsSegment (unsigned Start, unsigned End, const char* Name); +void AddAbsSegment (uint32_t Start, uint32_t End, const char* Name); /* Add an absolute segment to the segment table */ -char* GetSegmentStartName (unsigned Addr); +char* GetSegmentStartName (uint32_t Addr); /* Return the name of the segment which starts at the given address */ -unsigned GetSegmentAddrSize (unsigned Addr); +unsigned GetSegmentAddrSize (uint32_t Addr); /* Return the address size of the segment which starts at the given address */