X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=direct.c;h=dc44e8e62371b5b5eb72229801c8800bd347fdf6;hp=175027292045ab67193e1b6c75a51ecc48523f6e;hb=be5c1cb1a3ca24f29789437675fa8cd22e1edd45;hpb=c7c27ef02a3d5c7d17e5728910961a4a1eeacfe3 diff --git a/direct.c b/direct.c index 1750272..dc44e8e 100644 --- a/direct.c +++ b/direct.c @@ -88,6 +88,7 @@ int (*dirtab[])() = { d_nojpad, // 55 .nojpad (deprecated) d_gpumain, // 56 .gpumain (deprecated) d_prgflags, // 57 .prgflags + d_opt, // 58 .opt }; @@ -814,8 +815,7 @@ int d_bss(void) // int d_ds(WORD siz) { -if (debug) - printf("Directive: .ds.[size] = %u, sloc = $%X\n", siz, sloc); + DEBUG { printf("Directive: .ds.[size] = %u, sloc = $%X\n", siz, sloc); } VALUE eval; @@ -832,9 +832,14 @@ if (debug) 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); @@ -997,6 +1002,8 @@ int d_dcb(WORD siz) 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"); @@ -1583,3 +1590,30 @@ int d_gpumain(void) 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; +} +