(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))
#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
#define CONST 'a' // CONST <value>
#define ACONST 'A' // ACONST <value> <attrib>
#define STRING 'b' // STRING <address>
+#define STRINGA8 'S' // Atari 800 internal STRING <address>
#define SYMBOL 'c' // SYMBOL <address>
#define EOL 'e' // End of line
#define TKEOF 'f' // End of file (or macro)
#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 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
#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
#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
#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
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;
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);