d_unimpl, // 2 .6502
d_68000, // 3 .68000
d_bss, // 4 bss
- d_data, 7// 5 data
+ d_data, // 5 data
d_text, // 6 text
d_abs, // 7 abs
d_comm, // 8 comm
- (void *)d_init, // 9 init
+ (void *)d_init, // 9 init
d_cargs, // 10 cargs
- (void *)d_goto, // 11 goto
- (void *)d_dc, // 12 dc
- (void *)d_ds, // 13 ds
+ (void *)d_goto, // 11 goto
+ (void *)d_dc, // 12 dc
+ (void *)d_ds, // 13 ds
d_undmac, // 14 undefmac
d_gpu, // 15 .gpu
d_dsp, // 16 .dsp
- (void *)d_dcb, // 17 dcb
+ (void *)d_dcb, // 17 dcb
d_unimpl, // 18* set
d_unimpl, // 19* reg
d_unimpl, // 20 dump
d_title, // 44 title
d_subttl, // 45 subttl
eject, // 46 eject
- d_unimpl, // 47 error
- d_unimpl, // 48 warn
+ d_error, // 47 error
+ d_warn, // 48 warn
d_noclear, // 49 .noclear
d_equrundef, // 50 .equrundef/.regundef
d_ccundef, // 51 .ccundef
d_jpad, // 54 .jpad (deprecated)
d_nojpad, // 55 .nojpad (deprecated)
d_gpumain, // 56 .gpumain (deprecated)
+ d_prgflags, // 57 .prgflags
+ d_opt, // 58 .opt
};
+//
+// .error - Abort compilation, printing an error message
+//
+int d_error(char *str)
+{
+ if (*tok == EOL)
+ return error("error directive encountered - aborting assembling");
+ else
+ {
+ switch(*tok)
+ {
+ case STRING:
+ return error(string[tok[1]]);
+ break;
+ default:
+ return error("error directive encountered - aborting assembling");
+ }
+ }
+}
+
+
+//
+// .warn - Just display a warning on screen
+//
+int d_warn(char *str)
+{
+ if (*tok == EOL)
+ return warn("WARNING WARNING WARNING");
+ else
+ {
+ switch(*tok)
+ {
+ case STRING:
+ return warn(string[tok[1]]);
+ break;
+ default:
+ return warn("WARNING WARNING WARNING");
+ }
+ }
+}
+
+
//
// .org - Set origin
//
}
+//
+// .prgflags expression
+//
+int d_prgflags(void)
+{
+ VALUE eval;
+
+ if (*tok == EOL)
+ return error("PRGFLAGS requires value");
+ else if (abs_expr(&eval) == OK)
+ {
+ PRGFLAGS=eval;
+ return 0;
+ }
+ else
+ {
+ return error("PRGFLAGS requires value");
+ }
+}
+
+
//
// .abs [expression]
//
//
int d_ds(WORD siz)
{
-if (verb_flag)
- printf("Directive: .ds.[size] = %u, sloc = $%X\n", siz, sloc);
+ DEBUG { printf("Directive: .ds.[size] = %u, sloc = $%X\n", siz, sloc); }
VALUE eval;
if (abs_expr(&eval) != OK)
return 0;
+ // Check to see if the value being passed in is negative (who the hell does
+ // that?--nobody does; it's the code gremlins, or rum, that does it)
+ if (eval < 0)
+ return error("negative sizes not allowed");
+
// In non-TDB section (BSS, ABS and M6502) just advance the location
// counter appropriately. In TDB sections, deposit (possibly large) chunks
- //of zeroed memory....
+ // of zeroed memory....
if (scattr & SBSS)
{
listvalue(eval);
VALUE evalc, eval;
WORD eattr;
+ DEBUG { printf("dcb: section is %s%s%s (scattr=$%X)\n", (cursect & TEXT ? "TEXT" : ""), (cursect & DATA ? " DATA" : ""), (cursect & BSS ? "BSS" : ""), scattr); }
+
if ((scattr & SBSS) != 0)
return error("illegal initialization of section");
return error("What the hell? Do you think we adhere to the Goof standard?");
}
+
+//
+// .opt - turn a specific (or all) optimisation on or off
+//
+int d_opt(void)
+{
+ while (*tok != EOL)
+ {
+ if (*tok == STRING)
+ {
+ tok++;
+ char * tmpstr = string[*tok++];
+
+ if (ParseOptimization(tmpstr) != OK)
+ {
+ char temperr[256];
+ sprintf(temperr, "unknown optimisation flag '%s'", tmpstr);
+ return error(temperr);
+ }
+ }
+ else
+ return error(".opt directive needs every switch enclosed inside quotation marks");
+ }
+
+ return OK;
+}
+