X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=rmac.h;h=f81b9a94290a11daf4f652d97ac05a3df413b510;hp=f7b39e39b8d027ded9bf9b68da12dcd408fd7aa4;hb=60f204cb9e3905100da0d89f14bb40db764acd9e;hpb=917bfc1503181b7e762b73b9560bb834c12c64fa diff --git a/rmac.h b/rmac.h index f7b39e3..f81b9a9 100644 --- a/rmac.h +++ b/rmac.h @@ -1,7 +1,7 @@ // // RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System // RMAC.H - Main Application Code -// Copyright (C) 199x Landon Dyer, 2011 Reboot & Friends +// Copyright (C) 199x Landon Dyer, 2017 Reboot & Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -9,15 +9,24 @@ #ifndef __RMAC_H__ #define __RMAC_H__ +#include +#include +#include +#include +#include +#include + // // TARGET SPECIFIC BUILD SETTINGS // #if defined(WIN32) || defined (WIN64) + #include + #include // Release platform - windows #define PLATFORM "Win32" #define _OPEN_FLAGS _O_TRUNC|_O_CREAT|_O_BINARY|_O_RDWR #define _OPEN_INC _O_RDONLY|_O_BINARY - #define _PERM_MODE _S_IREAD|_S_IWRITE + #define _PERM_MODE _S_IREAD|_S_IWRITE #ifdef _MSC_VER #if _MSC_VER > 1000 #pragma warning(disable:4996) @@ -27,65 +36,96 @@ #define STRINGIZE_HELPER(x) #x #define STRINGIZE(x) STRINGIZE_HELPER(x) #define WARNING(desc) __pragma(message(__FILE__ "(" STRINGIZE(__LINE__) ") : Warning: " #desc)) + #define inline __inline // usage: // WARNING(FIXME: Code removed because...) #else - //If we're not compiling for Visual Studio let's assume that we're using - //some flavour of gcc instead. So let's use the gcc compliant macro instead. - //If some weirdo uses something else (I dunno, Intel compiler or something?) - //this is probably going to explode spectacularly. Let's wait for the fireworks! + // If we're not compiling for Visual Studio let's assume that we're using + // some flavour of gcc instead. So let's use the gcc compliant macro + // instead. If some weirdo uses something else (I dunno, Intel compiler or + // something?) this is probably going to explode spectacularly. Let's wait + // for the fireworks! #define DO_PRAGMA(x) _Pragma (#x) #define WARNING(desc) DO_PRAGMA(message (#desc)) #endif - #include - #include - #include - #include - #include - #include - #include - #include - -#else + +#else + #ifdef __GCCUNIX__ - // Release platform - mac OS-X or linux + #ifdef __MINGW32__ + #define off64_t long + #define off_t long + #endif + + #include + #include + // Release platform - mac OS-X or Linux #define PLATFORM "OSX/Linux" #define _OPEN_FLAGS O_TRUNC|O_CREAT|O_RDWR #define _OPEN_INC O_RDONLY - #define _PERM_MODE S_IREAD|S_IWRITE + #define _PERM_MODE S_IRUSR|S_IWUSR // WARNING WARNING WARNING #define DO_PRAGMA(x) _Pragma (#x) #define WARNING(desc) DO_PRAGMA(message (#desc)) - #include - #include - #include - #include - #include - #include - #include - #include #else - // Release platform - not specified + // Release platform - not specified + #include #define PLATFORM "Unknown" #define _OPEN_FLAGS O_TRUNC|O_CREAT|O_RDWR #define _OPEN_INC O_RDONLY - #define _PERM_MODE S_IREAD|S_IWRITE - // Defined here, even though the platfrom may not support it... + #define _PERM_MODE S_IREAD|S_IWRITE + // Defined here, even though the platform may not support it... #define DO_PRAGMA(x) _Pragma (#x) #define WARNING(desc) DO_PRAGMA(message (#desc)) - #include - #include - #include - #include - #include - #include - #include #endif #endif +// +// Endian related, for safe handling of endian-sensitive data +// USAGE: GETBExx() is *always* an rvalue, a = pointer to a uint8_t, +// r = offset from 0. SETBExx(), v = value to write into 'a' +// +#define GETBE16(a, r) \ + (((uint16_t)(a)[(r + 0)] << 8) | ((uint16_t)(a)[(r + 1)])) + +#define GETBE32(a, r) \ + (((uint32_t)(a)[(r + 0)] << 24) | ((uint32_t)(a)[(r + 1)] << 16) \ + | ((uint32_t)(a)[(r + 2)] << 8) | ((uint32_t)(a)[(r + 3)])) + +#define GETBE64(a, r) \ + (((uint64_t)(a)[(r + 0)] << 56) | ((uint64_t)(a)[(r + 1)] << 48) \ + | ((uint64_t)(a)[(r + 2)] << 40) | ((uint64_t)(a)[(r + 3)] << 32) \ + | ((uint64_t)(a)[(r + 4)] << 24) | ((uint64_t)(a)[(r + 5)] << 16) \ + | ((uint64_t)(a)[(r + 6)] << 8) | ((uint64_t)(a)[(r + 7)])) + +#define SETBE16(a, r, v) \ + { (a)[(r + 0)] = (uint8_t)((v) >> 8); \ + (a)[(r + 1)] = (uint8_t)((v) & 0xFF); } + +#define SETBE32(a, r, v) \ + { (a)[(r + 0)] = (uint8_t)((v) >> 24); \ + (a)[(r + 1)] = (uint8_t)(((v) >> 16) & 0xFF); \ + (a)[(r + 2)] = (uint8_t)(((v) >> 8) & 0xFF); \ + (a)[(r + 3)] = (uint8_t)((v) & 0xFF); } + +#define SETBE64(a, r, v) \ + { (a)[(r + 0)] = (uint8_t)((v) >> 56); \ + (a)[(r + 1)] = (uint8_t)(((v) >> 48) & 0xFF); \ + (a)[(r + 2)] = (uint8_t)(((v) >> 40) & 0xFF); \ + (a)[(r + 3)] = (uint8_t)(((v) >> 32) & 0xFF); \ + (a)[(r + 4)] = (uint8_t)(((v) >> 24) & 0xFF); \ + (a)[(r + 5)] = (uint8_t)(((v) >> 16) & 0xFF); \ + (a)[(r + 6)] = (uint8_t)(((v) >> 8) & 0xFF); \ + (a)[(r + 7)] = (uint8_t)((v) & 0xFF); } + +// Byteswap crap +#define BYTESWAP16(x) ((((x) & 0x00FF) << 8) | (((x) & 0xFF00) >> 8)) +#define BYTESWAP32(x) ((((x) & 0x000000FF) << 24) | (((x) & 0x0000FF00) << 8) | (((x) & 0x00FF0000) >> 8) | (((x) & 0xFF000000) >> 24)) +#define WORDSWAP32(x) ((((x) & 0x0000FFFF) << 16) | (((x) & 0xFFFF0000) >> 16)) + // // Non-target specific stuff // @@ -99,7 +139,7 @@ #define ERROR (-1) // Generic error return #define EOS '\0' // End of string -#define SPACE ' ' // ASCII space +#define SPACE ' ' // ASCII space #define SLASHCHAR '/' #define SLASHSTRING "/" #define VALUE LONG // Assembler value @@ -142,15 +182,16 @@ #define ALCYON 0 // Alcyon/DRI C object format #define MWC 1 // Mark Williams object format #define BSD 2 // BSD object format +#define ELF 3 // ELF object format // Pointer type that can point to (almost) anything #define PTR union _ptr PTR { - char * cp; // Char - WORD * wp; // WORD - LONG * lp; // LONG - LONG lw; // LONG + uint8_t * cp; // Char + uint16_t * wp; // WORD + uint32_t * lp; // LONG + uint32_t lw; // LONG SYM ** sy; // SYM TOKEN * tk; // TOKEN }; @@ -177,10 +218,10 @@ PTR //#define M6502 0x0008 // 6502/microprocessor (absolute) #define TDB (TEXT|DATA|BSS) // Mask for text+data+bss -// Sizes -#define SIZB 0x0001 // .b -#define SIZW 0x0002 // .w -#define SIZL 0x0004 // .l +// Sizes +#define SIZB 0x0001 // .b +#define SIZW 0x0002 // .w +#define SIZL 0x0004 // .l #define SIZN 0x0008 // no .(size) specifier // RISC register bank definitions (used in extended symbol attributes also) @@ -194,6 +235,16 @@ PTR //#define RISCSYM 0x00010000 +// Optimisation defines +enum +{ + OPT_ABS_SHORT = 0, + OPT_MOVEL_MOVEQ = 1, + OPT_BSR_BCC_S = 2, + OPT_INDIRECT_DISP = 3, + OPT_COUNT // Dummy, used to count number of optimisation switches +}; + // Globals, externals, etc. extern int verb_flag; extern int debug; @@ -210,12 +261,14 @@ extern int lsym_flag; extern int sbra_flag; extern int obj_format; extern int legacy_flag; +extern int prg_flag; // 1 = write ".PRG" relocatable executable extern LONG PRGFLAGS; -extern int optim_flag; +extern int optim_flags[OPT_COUNT]; // Exported functions char * fext(char *, char *, int); int nthpath(char *, int, char *); +int ParseOptimization(char * optstring); #endif // __RMAC_H__