X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=direct.c;h=6237ce2e418d715c464cedab0813ff6a1842b7c0;hp=750d5873444f38f9a542566c838230d9fb79ddbe;hb=603c75134d7911c5c6a7af38da1327f3e713d583;hpb=71cec8e7896b200c6ae63ebc428339bef147240a diff --git a/direct.c b/direct.c index 750d587..6237ce2 100644 --- a/direct.c +++ b/direct.c @@ -77,8 +77,8 @@ int (*dirtab[])() = { 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 @@ -88,9 +88,52 @@ int (*dirtab[])() = { 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 // @@ -307,6 +350,8 @@ int d_incbin(void) int bytes = 0; long pos, size, bytesRead; char msg[256]; + char buf1[256]; + int i; // Check to see if we're in BSS, and, if so, throw an error if (scattr & SBSS) @@ -321,12 +366,30 @@ int d_incbin(void) return ERROR; } - if ((fd = open(string[tok[1]], _OPEN_INC)) < 0) + // Attempt to open the include file in the current directory, then (if that + // failed) try list of include files passed in the enviroment string or by + // the "-d" option. + if ((fd = open(string[tok[1]], _OPEN_INC)) < 0) { - errors("cannot open include binary file (%s)", string[tok[1]]); - return ERROR; + for(i=0; nthpath("RMACPATH", i, buf1)!=0; i++) + { + fd = strlen(buf1); + + // Append path char if necessary + if (fd > 0 && buf1[fd - 1] != SLASHCHAR) + strcat(buf1, SLASHSTRING); + + strcat(buf1, string[tok[1]]); + + if ((fd = open(buf1, _OPEN_INC)) >= 0) + goto allright; + } + + return errors("cannot open: \"%s\"", string[tok[1]]); } +allright: + size = lseek(fd, 0L, SEEK_END); pos = lseek(fd, 0L, SEEK_SET); chcheck(size); @@ -772,8 +835,7 @@ int d_bss(void) // 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; @@ -790,9 +852,14 @@ if (verb_flag) 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); @@ -955,6 +1022,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"); @@ -1541,3 +1610,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; +} +