// Jaguar Object Processor assembler
//
// by James Hammons
-// (C) 2018 Underground Software
+// (C) 2019 Underground Software
//
#include "op.h"
#include "sect.h"
#include "token.h"
-// Macros to help define things (though largely unnecessary for this assembler)
-#define BITMAP 3100
-#define SCBITMAP 3101
-#define GPUOBJ 3102
-#define BRANCH 3103
-#define STOP 3104
-#define NOP 3105
-#define JUMP 3106
+#define DEF_MO
+#include "opkw.h" // For MO_* macros
// Function prototypes
-int HandleBitmap(void);
-int HandleScaledBitmap(void);
-int HandleGPUObject(void);
-int HandleBranch(void);
-int HandleStop(void);
-int HandleNOP(void);
-int HandleJump(void);
+static int HandleBitmap(void);
+static int HandleScaledBitmap(void);
+static int HandleGPUObject(void);
+static int HandleBranch(void);
+static int HandleStop(void);
+static int HandleNOP(void);
+static int HandleJump(void);
// OP assembler vars.
static uint8_t lastObjType;
switch (state)
{
- case BITMAP:
+ case MO_BITMAP:
return HandleBitmap();
- case SCBITMAP:
+ case MO_SCBITMAP:
return HandleScaledBitmap();
- case GPUOBJ:
+ case MO_GPUOBJ:
return HandleGPUObject();
- case BRANCH:
+ case MO_BRANCH:
return HandleBranch();
- case STOP:
+ case MO_STOP:
return HandleStop();
- case NOP:
+ case MO_NOP:
return HandleNOP();
- case JUMP:
+ case MO_JUMP:
return HandleJump();
}
return 0x04;
else if (strcmp(scratchbuf, "RELEASE") == 0)
return 0x08;
+
return 0;
}
// Form: bitmap <data>, <xloc>, <yloc>, <dwidth>, <iwidth>, <iheight>, <bpp>,
// <pallete idx>, <flags>, <firstpix>, <pitch>
//
-int HandleBitmap(void)
+static int HandleBitmap(void)
{
uint64_t xpos = 0;
uint64_t ypos = 0;
}
}
- at_eol();
+ ErrorIfNotAtEOL();
uint64_t p1 = 0x00 | ((ypos * 2) << 3) | (iheight << 14) | (linkAddr << 21) | (dataAddr << 40);
uint64_t p2 = xpos | (bpp << 12) | (pitch << 15) | (dwidth << 18) | (iwidth << 28) | (index << 38) | (flags << 45) | (firstpix << 49);
// <xscale>, <yscale>, <remainder>, <bpp>, <pallete idx>,
// <flags>, <firstpix>, <pitch>
//
-int HandleScaledBitmap(void)
+static int HandleScaledBitmap(void)
{
uint64_t xpos = 0;
uint64_t ypos = 0;
}
}
- at_eol();
+ ErrorIfNotAtEOL();
uint64_t p1 = 0x01 | ((ypos * 2) << 3) | (iheight << 14) | (linkAddr << 21) | (dataAddr << 40);
uint64_t p2 = xpos | (bpp << 12) | (pitch << 15) | (dwidth << 18) | (iwidth << 28) | (index << 38) | (flags << 45) | (firstpix << 49);
// Insert GPU object
// Form: gpuobj <line #>, <userdata> (bits 14-63 of this object)
//
-int HandleGPUObject(void)
+static int HandleGPUObject(void)
{
uint64_t eval;
uint16_t eattr;
if (!(eattr & DEFINED))
return error("bad expression in data");
- at_eol();
+ ErrorIfNotAtEOL();
uint64_t p1 = 0x02 | ((ypos * 2) << 3) | (eval << 14);
// branch OPFLAG, <link addr>
// branch SECHALF, <link addr>
//
-int HandleBranch(void)
+static int HandleBranch(void)
{
char missingKeyword[] = "missing VC, OPFLAG, or SECHALF in branch";
uint32_t cc = 0;
if (!(eattr & DEFINED))
AddFixup(FU_QUAD | FU_OBJLINK, sloc, exprbuf);
- at_eol();
+ ErrorIfNotAtEOL();
uint64_t p1 = 0x03 | (cc << 14) | ((ypos * 2) << 3) | ((eval & 0x3FFFF8) << 21);
// Insert a stop object
// Form: stop
//
-int HandleStop(void)
+static int HandleStop(void)
{
lastObjType = 4;
D_quad(4LL);
// Insert a phrase sized "NOP" in the object list (psuedo-op)
// Form: nop
//
-int HandleNOP(void)
+static int HandleNOP(void)
{
uint64_t eval = (orgaddr + 8) & 0x3FFFF8;
// This is "branch if VC > 2047". Branch addr is next phrase, so either way
// Insert an unconditional jump in the object list (psuedo-op)
// Form: jump <link addr>
//
-int HandleJump(void)
+static int HandleJump(void)
{
uint64_t eval;
uint16_t eattr;
if (!(eattr & DEFINED))
AddFixup(FU_QUAD | FU_OBJLINK, sloc, exprbuf);
- at_eol();
+ ErrorIfNotAtEOL();
// This is "branch if VC < 2047", which pretty much guarantees the branch.
uint64_t p1 = 0x03 | (1 << 14) | (0x7FF << 3) | ((eval & 0x3FFFF8) << 21);