From: Shamus Hammons Date: Fri, 14 Nov 2014 04:26:00 +0000 (-0600) Subject: Fix for bug #29. X-Git-Tag: 1.3.0^0 X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=commitdiff_plain;h=c04128b575f2db39445b9ef6fcf0c12b3bb2c60f Fix for bug #29. 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. :-) --- diff --git a/direct.c b/direct.c index efec94a..77fda01 100644 --- a/direct.c +++ b/direct.c @@ -108,7 +108,8 @@ int d_org(void) } orgaddr = address; - orgactive = 1; + orgactive = 1; +//printf("ORG: address = $%08X...\n", orgaddr); return 0; } @@ -312,7 +313,6 @@ int d_incbin(void) if (*tok != STRING) { -// error(syntax_error); error("syntax error; string missing"); return ERROR; } @@ -339,7 +339,6 @@ int d_incbin(void) return ERROR; } -//#define D_byte(b) {*chptr++=(char)b; ++sloc; ++ch_size; if(orgactive) ++orgaddr;} memcpy(chptr, fileBuffer, size); chptr += size; sloc += size; @@ -373,12 +372,38 @@ int d_regbank1(void) } +// +// 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) { - if (sloc & 1) + unsigned skip = (rgpu || rdsp ? orgaddr : sloc) & 0x01; + +// if (sloc & 1) + if (skip) { if ((scattr & SBSS) == 0) { @@ -387,7 +412,10 @@ int d_even(void) } else { - ++sloc; + sloc++; + + if (orgactive) + orgaddr++; } } @@ -400,30 +428,9 @@ int d_even(void) // int d_long(void) { - 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; isvalue; } @@ -1238,9 +1192,11 @@ int d_gpu(void) // 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; } +//else printf("NOT resetting ORG!\n"); rgpu = 1; // Set GPU assembly rdsp = 0; // Unset DSP assembly diff --git a/makefile b/makefile index 8b46eed..def563c 100644 --- a/makefile +++ b/makefile @@ -20,6 +20,9 @@ OBJS = amode.o debug.o direct.o eagen.o error.o expr.o listing.o mach.o macro.o # 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 diff --git a/sect.h b/sect.h index 8759eda..f7c3aaf 100644 --- a/sect.h +++ b/sect.h @@ -25,6 +25,9 @@ //#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 diff --git a/version.h b/version.h index 75e1c56..b49b4ae 100644 --- a/version.h +++ b/version.h @@ -12,7 +12,7 @@ // 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 #endif // __VERSION_H__