X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=rmac.h;h=2b71ac7cdfce1c7d7259f53138a50bc243c4bc72;hp=5b17d4b97631e15f3b02c94e19544ad3e70b459e;hb=5cd8a4814b805f1ef8ce689423eb5eeba12573c5;hpb=052be802baa4836564801c780b1d432cfe17c576 diff --git a/rmac.h b/rmac.h index 5b17d4b..2b71ac7 100644 --- a/rmac.h +++ b/rmac.h @@ -127,6 +127,11 @@ (a)[(r + 6)] = (uint8_t)(((v) >> 8) & 0xFF); \ (a)[(r + 7)] = (uint8_t)((v) & 0xFF); } +// In 6502 mode, turns out we need this: +#define SETLE16(a, r, v) \ + { (a)[(r + 0)] = (uint8_t)((v) & 0xFF); \ + (a)[(r + 1)] = (uint8_t)((v) >> 8); } + // 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)) @@ -148,8 +153,8 @@ #define SPACE ' ' // ASCII space #define SLASHCHAR '/' #define SLASHSTRING "/" -#define VALUE LONG // Assembler value -#define TOKEN LONG // Assembler token +#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,6 +168,7 @@ #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) @@ -182,6 +188,11 @@ #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 @@ -189,7 +200,7 @@ #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 +#define XEX 4 // COM/EXE/XEX/whatever a8 object format // Pointer type that can point to (almost) anything #define PTR union _ptr @@ -222,7 +233,7 @@ PTR #define TEXT 0x0001 // Relative to text #define DATA 0x0002 // Relative to data #define BSS 0x0004 // Relative to BSS -#define M6502 0x0008 // 6502/microprocessor (absolute) +#define M6502 0x0008 // 6502/microprocessor (absolute) #define TDB (TEXT|DATA|BSS) // Mask for text+data+bss // Sizes @@ -230,6 +241,11 @@ PTR #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 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 // RISC register bank definitions (used in extended symbol attributes also) #define BANK_N 0x0000 // No register bank specified @@ -240,7 +256,28 @@ PTR #define EQUATEDCC 0x0020 #define UNDEF_CC 0x0040 -//#define RISCSYM 0x00010000 +/* Construct binary constants at compile time +Code by Tom Torfs */ + +/* Helper macros */ +#define HEX__(n) 0x##n##LU +#define B8__(x) ((x&0x0000000FLU)?1:0) \ ++((x&0x000000F0LU)?2:0) \ ++((x&0x00000F00LU)?4:0) \ ++((x&0x0000F000LU)?8:0) \ ++((x&0x000F0000LU)?16:0) \ ++((x&0x00F00000LU)?32:0) \ ++((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) \ ++ B8(dlsb)) // Optimisation defines enum @@ -249,18 +286,22 @@ enum OPT_MOVEL_MOVEQ = 1, OPT_BSR_BCC_S = 2, OPT_INDIRECT_DISP = 3, + OPT_LEA_ADDQ = 4, + OPT_BASE_DISP = 5, OPT_COUNT // Dummy, used to count number of optimisation switches }; -// Globals, externals, etc. +// Exported variables extern int verb_flag; extern int debug; extern int rgpu, rdsp; +extern int dsp56001; extern int err_flag; extern int err_fd; extern int regbank; extern char * firstfname; extern int list_fd; +extern int list_pag; extern int as68_flag; extern int m6502; extern int list_flag; @@ -272,7 +313,6 @@ extern int legacy_flag; extern int prg_flag; // 1 = write ".PRG" relocatable executable extern LONG PRGFLAGS; extern int optim_flags[OPT_COUNT]; -extern void Init6502(); // Exported functions char * fext(char *, char *, int);