int d_opt(void);
int d_dsp(void);
int d_objproc(void);
+int d_align(void);
void SetLargestAlignment(int);
// Directive handler table
d_opt, // 66 .opt
d_objproc, // 67 .objproc
(void *)d_dsm, // 68 .dsm
+ d_align // 69 .align
};
}
+//
+// Adjust location to <alignment> bytes
+//
+int d_align(void)
+{
+ unsigned bytesToSkip;
+ uint64_t eval;
+
+ if (abs_expr(&eval) != OK)
+ return 0;
+
+ if (eval < 2)
+ {
+ return error("Invalid .align value specified");
+ }
+
+ if (dsp56001)
+ {
+ bytesToSkip = eval - sloc % eval;
+ D_ZEROFILL(bytesToSkip*3);
+ return 0;
+ }
+
+ bytesToSkip = eval - (rgpu || rdsp ? orgaddr : sloc) % eval;
+ if ( bytesToSkip != eval )
+ {
+ if ((scattr & SBSS) == 0)
+ {
+ D_ZEROFILL(bytesToSkip);
+ }
+ else
+ {
+ sloc += bytesToSkip;
+
+ if (orgactive)
+ orgaddr += bytesToSkip;
+ }
+ }
+ return 0;
+}
+
+
//
// Do auto-even. This must be called ONLY if 'sloc' is odd.
//