X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=rmac.h;h=a2cc1c8a270d38677e6d98ccc05daecd18b1414b;hp=30880a30ee24717ad59c61e5d058b4dc657693f7;hb=c38505ee4b2a0de59926107e52fb8bb84041a0e4;hpb=5f23454f7155f0c77ea1bede3f9e60b39da99fa8 diff --git a/rmac.h b/rmac.h index 30880a3..a2cc1c8 100644 --- a/rmac.h +++ b/rmac.h @@ -1,7 +1,7 @@ // -// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System +// RMAC - Reboot's Macro Assembler for all Atari computers // RMAC.H - Main Application Code -// Copyright (C) 199x Landon Dyer, 2017 Reboot & Friends +// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -19,7 +19,7 @@ // // TARGET SPECIFIC BUILD SETTINGS // -#if defined(WIN32) || defined (WIN64) +#if defined(WIN32) || defined(WIN64) #include #include // Release platform - windows @@ -27,6 +27,7 @@ #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 + #ifdef _MSC_VER #if _MSC_VER > 1000 #pragma warning(disable:4996) @@ -58,8 +59,8 @@ #include #include - // Release platform - mac OS-X or Linux - #define PLATFORM "OSX/Linux" + // Release platform - Linux or mac OS-X + #define PLATFORM "Linux/OSX" #define _OPEN_FLAGS O_TRUNC|O_CREAT|O_RDWR #define _OPEN_INC O_RDONLY #define _PERM_MODE S_IRUSR|S_IWUSR @@ -76,7 +77,9 @@ // WARNING WARNING WARNING #define DO_PRAGMA(x) _Pragma (#x) #define WARNING(desc) DO_PRAGMA(message (#desc)) -#else + + #else + // Release platform - not specified #include #define PLATFORM "Unknown" @@ -87,8 +90,10 @@ #define DO_PRAGMA(x) _Pragma (#x) #define WARNING(desc) DO_PRAGMA(message (#desc)) #endif + #endif + // // Endian related, for safe handling of endian-sensitive data // USAGE: GETBExx() is *always* an rvalue, a = pointer to a uint8_t, @@ -132,9 +137,16 @@ { (a)[(r + 0)] = (uint8_t)((v) & 0xFF); \ (a)[(r + 1)] = (uint8_t)((v) >> 8); } +// In DSP56001 mode, this is useful: +#define SETBE24(a, v) \ + { (a)[0] = (uint8_t)(((v) >> 16) & 0xFF); \ + (a)[1] = (uint8_t)(((v) >> 8) & 0xFF); \ + (a)[2] = (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 BYTESWAP64(x) (BYTESWAP32(x >> 32) | (BYTESWAP32(x & 0xFFFFFFFF) << 32)) #define WORDSWAP32(x) ((((x) & 0x0000FFFF) << 16) | (((x) & 0xFFFF0000) >> 16)) // @@ -153,8 +165,6 @@ #define SPACE ' ' // ASCII space #define SLASHCHAR '/' #define SLASHSTRING "/" -#define VALUE uint32_t // Assembler value -#define TOKEN uint32_t // Assembler token #define FNSIZ 128 // Maximum size of a filename #define OK 0 // OK return #define DEBUG if (debug) // Debug conditional @@ -163,55 +173,35 @@ #define ERROUT 2 // Error output #define CREATMASK 0 -// (Normally) non-printable tokens -#define COLON ':' // : (grumble: GNUmacs hates ':') -#define CONST 'a' // CONST -#define ACONST 'A' // ACONST -#define STRING 'b' // STRING
-#define STRINGA8 'S' // Atari 800 internal STRING
-#define SYMBOL 'c' // SYMBOL
-#define EOL 'e' // End of line -#define TKEOF 'f' // End of file (or macro) -#define DEQUALS 'g' // == -#define SET 149 // set -#define REG 'R' // reg -#define EQUREG 148 // equreg -#define CCDEF 183 // ccdef -#define DCOLON 'h' // :: -#define GE 'i' // >= -#define LE 'j' // <= -#define NE 'k' // <> or != -#define SHR 'l' // >> -#define SHL 'm' // << -#define UNMINUS 'n' // Unary '-' -#define DOTB 'B' // .b or .B or .s or .S -#define DOTW 'W' // .w or .W -#define DOTL 'L' // .l or .L -#define DOTI 'I' // .i or .I -#define DOTD 'D' // .d or .D -#define DOTS 'S' // .s or .S (FPU Single) -#define DOTQ 'Q' // .q oe .Q (FPU Quad) -#define DOTX 'X' // .x or .X (FPU Extended) -#define DOTP 'P' // .p or .P (FPU Packed) -#define ENDEXPR 'E' // End of expression - // Object code formats -#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 -#define XEX 4 // COM/EXE/XEX/whatever a8 object format +enum +{ +ALCYON, // Alcyon/DRI C object format +MWC, // Mark Williams object format +BSD, // BSD object format +ELF, // ELF object format +LOD, // DSP 56001 object format +P56, // DSP 56001 object format +XEX, // COM/EXE/XEX/whatever a8 object format +}; + +// Assembler token +#define TOKEN uint32_t // Pointer type that can point to (almost) anything #define PTR union _ptr PTR { - uint8_t * cp; // Char - uint16_t * wp; // WORD - uint32_t * lp; // LONG - uint32_t lw; // LONG - SYM ** sy; // SYM - TOKEN * tk; // TOKEN + uint8_t * cp; // Char pointer + uint16_t * wp; // WORD pointer + uint32_t * lp; // LONG pointer + uint32_t * u32; // 32-bit pointer + uint64_t * u64; // 64-bit pointer + uint32_t lw; // LONG (for some reason) + SYM ** sy; // SYM pointer + TOKEN * tk; // TOKEN pointer + double * dp; // Double pointer + int64_t * i64; // 64-bit signed int pointer }; // Symbol spaces @@ -227,25 +217,32 @@ PTR #define REFERENCED 0x1000 // Symbol has been referenced #define EQUATED 0x0800 // Symbol was equated #define SDECLLIST 0x0400 // Symbol is on 'sdecl'-order list +#define FLOAT 0x0200 // Symbol is a floating point value // Expression spaces, ORed with symbol and expression attributes above #define ABS 0x0000 // In absolute space #define TEXT 0x0001 // Relative to text #define DATA 0x0002 // Relative to data #define BSS 0x0004 // Relative to BSS +//OK, this is bad, mmkay? These are treated as indices into an array which means that this was never meant to be defined this way--at least if it was, it was a compromise that has come home to bite us all in the ass. !!! FIX !!! #define M6502 0x0008 // 6502/microprocessor (absolute) -#define TDB (TEXT|DATA|BSS) // Mask for text+data+bss +#define M56001P 0x0010 // DSP 56001 Program RAM +#define M56001X 0x0020 // DSP 56001 X RAM +#define M56001Y 0x0040 // DSP 56001 Y RAM +#define M56001L 0x0080 // DSP 56001 L RAM +#define TDB (TEXT|DATA|BSS) // Mask for TEXT+DATA+BSS +#define M56KPXYL (M56001P|M56001X|M56001Y|M56001L) // Mask for 56K stuff // Sizes #define SIZB 0x0001 // .b #define SIZW 0x0002 // .w #define SIZL 0x0004 // .l #define SIZN 0x0008 // no .(size) specifier -#define SIZD 0x0010 // .d (quad word or FPU double precision real) +#define SIZD 0x0010 // .d (FPU double precision real) #define SIZS 0x0020 // .s (FPU single precision real) #define SIZX 0x0040 // .x (FPU extended precision real) #define SIZP 0x0080 // .p (FPU pakced decimal real) -#define SIZQ SIZD +#define SIZQ 0x0100 // .q (quad word) // RISC register bank definitions (used in extended symbol attributes also) #define BANK_N 0x0000 // No register bank specified @@ -256,12 +253,13 @@ PTR #define EQUATEDCC 0x0020 #define UNDEF_CC 0x0040 -/* Construct binary constants at compile time -Code by Tom Torfs */ +// Construct binary constants at compile time +// Code by Tom Torfs -/* Helper macros */ +// Helper macros #define HEX__(n) 0x##n##LU -#define B8__(x) ((x&0x0000000FLU)?1:0) \ +#define B8__(x) \ + ((x&0x0000000FLU)?1:0) \ +((x&0x000000F0LU)?2:0) \ +((x&0x00000F00LU)?4:0) \ +((x&0x0000F000LU)?8:0) \ @@ -270,13 +268,12 @@ Code by Tom Torfs */ +((x&0x0F000000LU)?64:0) \ +((x&0xF0000000LU)?128:0) -/* User macros */ -#define B8(d) ((unsigned char)B8__(HEX__(d))) -#define B16(dmsb,dlsb) (((unsigned short)B8(dmsb)<<8) \ -+ B8(dlsb)) -#define B32(dmsb,db2,db3,dlsb) (((unsigned long)B8(dmsb)<<24) \ -+ ((unsigned long)B8(db2)<<16) \ -+ ((unsigned long)B8(db3)<<8) \ +// User macros +#define B8(d) ((uint8_t)B8__(HEX__(d))) +#define B16(dmsb,dlsb) (((uint16_t)B8(dmsb)<<8) + B8(dlsb)) +#define B32(dmsb,db2,db3,dlsb) (((uint32_t)B8(dmsb)<<24) \ ++ ((uint32_t)B8(db2)<<16) \ ++ ((uint32_t)B8(db3)<<8) \ + B8(dlsb)) // Optimisation defines @@ -288,6 +285,10 @@ enum OPT_INDIRECT_DISP = 3, OPT_LEA_ADDQ = 4, OPT_BASE_DISP = 5, + OPT_NULL_BRA = 6, + OPT_CLR_DX = 7, + OPT_ADDA_ADDQ = 8, + OPT_ADDA_LEA = 9, OPT_COUNT // Dummy, used to count number of optimisation switches }; @@ -295,6 +296,7 @@ enum extern int verb_flag; extern int debug; extern int rgpu, rdsp; +extern int robjproc; extern int dsp56001; extern int err_flag; extern int err_fd; @@ -317,6 +319,7 @@ extern int activecpu; extern int activefpu; // Exported functions +void strtoupper(char * s); char * fext(char *, char *, int); int nthpath(char *, int, char *); int ParseOptimization(char * optstring);