//
-// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
+// RMAC - Reboot's Macro Assembler for all Atari computers
// SECT.H - Code Generation, Fixups and Section Management
-// Copyright (C) 199x Landon Dyer, 2017 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2017 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
-// Source utilised with the kind permission of Landon Dyer
+// Source utilized with the kind permission of Landon Dyer
//
#ifndef __SECT_H__
#include "rmac.h"
-// Macros to deposit code in the current section
+// Macros to deposit code in the current section (in Big Endian)
// D_rword deposits a "6502" format (low, high) word (01).
-// D_rlong deposits a MWC "canonical byte order" longword (2301).
#define D_byte(b) {*chptr++=(uint8_t)(b); sloc++; ch_size++; \
if(orgactive) orgaddr++;}
#define D_word(w) {chcheck(2);*chptr++=(uint8_t)((w)>>8); \
*chptr++=(uint8_t)((lw)>>8); \
*chptr++=(uint8_t)(lw); \
sloc += 4; ch_size += 4; if(orgactive) orgaddr += 4;}
-#define D_rword(w) {*chptr++=(uint8_t)w; *chptr++=(uint8_t)(w>>8); \
+#define D_quad(qw) {*chptr++=(uint8_t)((qw)>>56); \
+ *chptr++=(uint8_t)((qw)>>48);\
+ *chptr++=(uint8_t)((qw)>>40);\
+ *chptr++=(uint8_t)((qw)>>32);\
+ *chptr++=(uint8_t)((qw)>>24);\
+ *chptr++=(uint8_t)((qw)>>16);\
+ *chptr++=(uint8_t)((qw)>>8); \
+ *chptr++=(uint8_t)(qw); \
+ sloc += 8; ch_size += 8; if(orgactive) orgaddr += 8;}
+#define D_rword(w) {*chptr++=(uint8_t)(w); *chptr++=(uint8_t)((w)>>8); \
sloc+=2; ch_size+=2;if(orgactive) orgaddr += 2;}
-//#define D_rlong(lw) {*chptr++=(uint8_t)(lw>>16);*chptr++=(uint8_t)(lw>>24);\
-// *chptr++=(uint8_t)lw;*chptr++=(uint8_t)(lw>>8); \
-// sloc+=4; ch_size += 4;if(orgactive) orgaddr += 4;}
+// This macro expects to get an array of uint8_ts with the hi bits in a[0] and
+// the low bits in a[11] (Big Endian).
+#define D_extend(a) {memcpy(chptr, a, 12); chptr+=12; sloc+=12, ch_size+=12;\
+ if (orgactive) orgaddr+=12;}
+
// 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 FU_LBRA 0x4000 // Long branch, for short branch detect
#define FU_DONE 0x8000 // Fixup has been done
+// FPU fixups
+// TODO: these are obviously bogus for now!
+#define FU_FLOATSING 0x0D0B // Fixup 32-bit float
+#define FU_FLOATDOUB 0x0E0B // Fixup 64-bit float
+#define FU_FLOATEXT 0x0F0B // Fixup 96-bit float
+
// Chunks are used to hold generated code and fixup records
#define CHUNK struct _chunk
CHUNK {