summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
062214e)
Whoever put this stuff together made a HUGE mistake in its alignment
pseudo-ops. Basically, before this fix, alignment directives in a RISC
section had absolutely NO guarantees of efficacy. This is what happens
when you bodge things together without extensive testing! Note that if
you had some RISC code that you had to wave a dead chicken at to get it
to work, it will probably not work any longer as the assembler will now
do what you tell it to. ;-)
This is a big enough change that it merits a minor version bump; we're
now at 1.3.0. :-)
+ orgactive = 1;
+//printf("ORG: address = $%08X...\n", orgaddr);
error("syntax error; string missing");
return ERROR;
}
error("syntax error; string missing");
return ERROR;
}
-//#define D_byte(b) {*chptr++=(char)b; ++sloc; ++ch_size; if(orgactive) ++orgaddr;}
memcpy(chptr, fileBuffer, size);
chptr += size;
sloc += size;
memcpy(chptr, fileBuffer, size);
chptr += size;
sloc += size;
+//
+// Helper function, to cut down on mistakes & typing
+//
+static inline void SkipBytes(unsigned bytesToSkip)
+{
+ if (!bytesToSkip)
+ return;
+
+ if ((scattr & SBSS) == 0)
+ {
+ chcheck(bytesToSkip);
+ D_ZEROFILL(bytesToSkip);
+ }
+ else
+ {
+ sloc += bytesToSkip;
+
+ if (orgactive)
+ orgaddr += bytesToSkip;
+ }
+}
+
+
//
// Adjust Location to an EVEN Value
//
int d_even(void)
{
//
// Adjust Location to an EVEN Value
//
int d_even(void)
{
+ unsigned skip = (rgpu || rdsp ? orgaddr : sloc) & 0x01;
+
+// if (sloc & 1)
+ if (skip)
{
if ((scattr & SBSS) == 0)
{
{
if ((scattr & SBSS) == 0)
{
+ sloc++;
+
+ if (orgactive)
+ orgaddr++;
- unsigned i;
- unsigned val = 4;
-
- i = sloc & ~(val - 1);
-
- if (i != sloc)
- val = val - (sloc - i);
- else
- val = 0;
-
- if (val)
- {
- if ((scattr & SBSS) == 0)
- {
- chcheck(val);
-
- for(i=0; i<val; i++)
- D_byte(0);
- }
- else
- {
- sloc += val;
- }
- }
+ unsigned lower2Bits = (rgpu || rdsp ? orgaddr : sloc) & 0x03;
+ unsigned bytesToSkip = (0x04 - lower2Bits) & 0x03;
+ SkipBytes(bytesToSkip);
//
// Adjust Location to an PHRASE Value
//
//
// Adjust Location to an PHRASE Value
//
+// N.B.: We have to handle the GPU/DSP cases separately because you can embed
+// RISC code in the middle of a regular 68K section. Also note that all
+// of the alignment pseudo-ops will have to be fixed this way.
+//
+// This *must* behave differently when in a RISC section, as following sloc
+// (instead of orgaddr) will fuck things up royally. Note that we do it this
+// way because you can embed RISC code in a 68K section, and have the origin
+// pointing to a different alignment in the RISC section than the 68K section.
+//
- unsigned i;
- unsigned val = 8;
-
- i = sloc & ~(val - 1);
-
- if (i != sloc)
- val = val - (sloc - i);
- else
- val = 0;
-
- if (val)
- {
- if ((scattr & SBSS) == 0)
- {
- chcheck(val);
-
- for(i=0; i<val; i++)
- D_byte(0);
- }
- else
- {
- sloc += val;
- }
- }
+ unsigned lower3Bits = (rgpu || rdsp ? orgaddr : sloc) & 0x07;
+ unsigned bytesToSkip = (0x08 - lower3Bits) & 0x07;
+ SkipBytes(bytesToSkip);
- unsigned i;
- unsigned val = 16;
-
- i = sloc & ~(val - 1);
-
- if (i != sloc)
- val = val - (sloc - i);
- else
- val = 0;
-
- if (val)
- {
- if ((scattr & SBSS) == 0)
- {
- chcheck(val);
-
- for(i=0; i<val; i++)
- D_byte(0);
- }
- else
- {
- sloc += val;
- }
- }
+ unsigned lower4Bits = (rgpu || rdsp ? orgaddr : sloc) & 0x0F;
+ unsigned bytesToSkip = (0x10 - lower4Bits) & 0x0F;
+ SkipBytes(bytesToSkip);
- unsigned i;
- unsigned val = 32;
-
- i = sloc & ~(val - 1);
-
- if (i != sloc)
- val = val - (sloc - i);
- else
- val = 0;
-
- if (val)
- {
- if ((scattr & SBSS) == 0)
- {
- SaveSection();
- chcheck(val);
-
- for(i=0; i<val; i++)
- D_byte(0);
- }
- else
- {
- sloc += val;
- }
- }
+ unsigned lower5Bits = (rgpu || rdsp ? orgaddr : sloc) & 0x1F;
+ unsigned bytesToSkip = (0x20 - lower5Bits) & 0x1F;
+ SkipBytes(bytesToSkip);
// which is OK since multiple labels are only allowed in AS68 kludge mode, and
// the C compiler is VERY paranoid and uses ".even" whenever it can
//
// which is OK since multiple labels are only allowed in AS68 kludge mode, and
// the C compiler is VERY paranoid and uses ".even" whenever it can
//
+// N.B.: This probably needs the same fixes as above...
+//
void auto_even(void)
{
if (scattr & SBSS)
void auto_even(void)
{
if (scattr & SBSS)
- ++sloc; // Bump BSS section
+ sloc++; // Bump BSS section
- D_byte(0) // Deposit 0.b in non-BSS
+ D_byte(0); // Deposit 0.b in non-BSS
- if (lab_sym != NULL) // Bump label if we have to
+ if (lab_sym != NULL) // Bump label if we have to
// If previous section was dsp or 68000 then we need to reset ORG'd Addresses
if (!rgpu)
{
// If previous section was dsp or 68000 then we need to reset ORG'd Addresses
if (!rgpu)
{
+//printf("Resetting ORG...\n");
orgactive = 0;
orgwarning = 0;
}
orgactive = 0;
orgwarning = 0;
}
+//else printf("NOT resetting ORG!\n");
rgpu = 1; // Set GPU assembly
rdsp = 0; // Unset DSP assembly
rgpu = 1; // Set GPU assembly
rdsp = 0; // Unset DSP assembly
#
all : mntab.h 68ktab.h kwtab.h risckw.h rmac
#
all : mntab.h 68ktab.h kwtab.h risckw.h rmac
+ @echo
+ @echo "Don't forget to bump the version number before commiting!"
+ @echo
#
# Generated Sources for State Machines and Keyword, Directive and Mnemonic Definitions
#
# Generated Sources for State Machines and Keyword, Directive and Mnemonic Definitions
//#define D_rlong(lw) {*chptr++=(char)(lw>>16);*chptr++=(char)(lw>>24);\
// *chptr++=(char)lw;*chptr++=(char)(lw>>8); \
// sloc+=4; ch_size += 4;if(orgactive) orgaddr += 4;}
//#define D_rlong(lw) {*chptr++=(char)(lw>>16);*chptr++=(char)(lw>>24);\
// *chptr++=(char)lw;*chptr++=(char)(lw>>8); \
// sloc+=4; ch_size += 4;if(orgactive) orgaddr += 4;}
+// Fill n bytes with zeroes
+#define D_ZEROFILL(n) {memset(chptr, 0, n); chptr+=n; sloc+=n; ch_size+=n;\
+ if (orgactive) orgaddr+=n;}
#define NSECTS 16 // Max. number of sections
#define NSECTS 16 // Max. number of sections
// Release Information
#define MAJOR 1 // Major version number
// Release Information
#define MAJOR 1 // Major version number
-#define MINOR 2 // Minor version number
-#define PATCH 15 // Patch release number
+#define MINOR 3 // Minor version number
+#define PATCH 0 // Patch release number