X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=direct.c;h=6237ce2e418d715c464cedab0813ff6a1842b7c0;hp=5cdac4ca73b605c297caf6c0b870480677898fd4;hb=1feb728a9eb579b6441daf0124d81483f600365c;hpb=a48737de123e304866212f5382d6fa4174d496a0 diff --git a/direct.c b/direct.c index 5cdac4c..6237ce2 100644 --- a/direct.c +++ b/direct.c @@ -3,7 +3,7 @@ // DIRECT.C - Directive Handling // Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 -// Source Utilised with the Kind Permission of Landon Dyer +// Source utilised with the kind permission of Landon Dyer // #include "direct.h" @@ -22,9 +22,10 @@ #include "kwtab.h" -TOKEN exprbuf[128]; // Expression buffer +TOKEN exprbuf[128]; // Expression buffer SYM * symbolPtr[1000000]; // Symbol pointers table static long unused; // For supressing 'write' warnings +char buffer[256]; // Scratch buffer for messages // Directive handler table @@ -32,52 +33,52 @@ int (*dirtab[])() = { d_org, // 0 org d_even, // 1 even d_unimpl, // 2 .6502 - d_68000, // 3 .68000 + d_68000, // 3 .68000 d_bss, // 4 bss - d_data, // 5 data - d_text, // 6 text - d_abs, // 7 abs - d_comm, // 8 comm - d_init, // 9 init - d_cargs, // 10 cargs - d_goto, // 11 goto - d_dc, // 12 dc - d_ds, // 13 ds - d_undmac, // 14 undefmac + d_data, // 5 data + d_text, // 6 text + d_abs, // 7 abs + d_comm, // 8 comm + (void *)d_init, // 9 init + d_cargs, // 10 cargs + (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 - d_dcb, // 17 dcb - d_unimpl, // 18* set - d_unimpl, // 19* reg - d_unimpl, // 20 dump - d_incbin, // 21 .incbin //load - d_unimpl, // 22 disable - d_unimpl, // 23 enable - d_globl, // 24 globl + (void *)d_dcb, // 17 dcb + d_unimpl, // 18* set + d_unimpl, // 19* reg + d_unimpl, // 20 dump + d_incbin, // 21 .incbin //load + d_unimpl, // 22 disable + d_unimpl, // 23 enable + d_globl, // 24 globl d_regbank0, // 25 .regbank0 d_regbank1, // 26 .regbank1 - d_unimpl, // 27 xdef - d_assert, // 28 assert - d_unimpl, // 29* if - d_unimpl, // 30* endif - d_unimpl, // 31* endc - d_unimpl, // 32* iif - d_include, // 33 include - fpop, // 34 end - d_unimpl, // 35* macro - ExitMacro, // 36* exitm - d_unimpl, // 37* endm - d_list, // 38 list - d_nlist, // 39 nlist - d_long, // 40* rept - d_phrase, // 41* endr - d_dphrase, // 42 struct - d_qphrase, // 43 ends - d_title, // 44 title - d_subttl, // 45 subttl - eject, // 46 eject - d_unimpl, // 47 error - d_unimpl, // 48 warn + d_unimpl, // 27 xdef + d_assert, // 28 assert + d_unimpl, // 29* if + d_unimpl, // 30* endif + d_unimpl, // 31* endc + d_unimpl, // 32* iif + d_include, // 33 include + fpop, // 34 end + d_unimpl, // 35* macro + ExitMacro, // 36* exitm + d_unimpl, // 37* endm + d_list, // 38 list + d_nlist, // 39 nlist + d_long, // 40* rept + d_phrase, // 41* endr + d_dphrase, // 42 struct + d_qphrase, // 43 ends + d_title, // 44 title + d_subttl, // 45 subttl + eject, // 46 eject + d_error, // 47 error + d_warn, // 48 warn d_noclear, // 49 .noclear d_equrundef, // 50 .equrundef/.regundef d_ccundef, // 51 .ccundef @@ -86,9 +87,53 @@ int (*dirtab[])() = { 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 // @@ -291,6 +336,7 @@ int d_equrundef(void) // int d_noclear(void) { + warn("CLR.L opcode ignored..."); return 0; } @@ -304,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) @@ -318,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); @@ -675,6 +741,27 @@ int d_globl(void) } +// +// .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] // @@ -748,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; @@ -766,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); @@ -802,15 +893,22 @@ int d_dc(WORD siz) if ((scattr & SBSS) != 0) return error("illegal initialization of section"); + // Do an auto_even if it's not BYTE sized (hmm, should we be doing this???) if ((siz != SIZB) && (sloc & 1)) auto_even(); + // Check to see if we're trying to set LONGS on a non 32-bit aligned + // address in a GPU or DSP section, in their local RAM + if ((siz == SIZL) && (orgaddr & 0x03) + && ((rgpu && (orgaddr >= 0xF03000) && (orgaddr <= 0xF03FFFF)) + || (rdsp && (orgaddr >= 0xF1B000) && (orgaddr <= 0xF1CFFFF)))) + warn("depositing LONGs on a non-long address in local RAM"); + for(;; ++tok) { // dc.b 'string' [,] ... if (siz == SIZB && *tok == STRING && (tok[2] == ',' || tok[2] == EOL)) { -// i = strlen((const char*)tok[1]); i = strlen(string[tok[1]]); if ((challoc - ch_size) < i) @@ -854,7 +952,10 @@ int d_dc(WORD siz) return error("non-absolute byte value"); if (eval + 0x100 >= 0x200) - return error(range_error); + { + sprintf(buffer, "%s (value = $%X)", range_error, eval); + return error(buffer); + } D_byte(eval); } @@ -921,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"); @@ -1507,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; +} +