X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=direct.c;h=70f4469602278ad708811706181f5a37146a2c3f;hp=643f0318850bcd2c7158a51c133dab287ae855af;hb=d570f2d80fed3a3254ff49748d4e2f50ee5e2a2c;hpb=d4e405e35a5e2a94076b0f882dc9a09f9b695a71 diff --git a/direct.c b/direct.c index 643f031..70f4469 100644 --- a/direct.c +++ b/direct.c @@ -35,19 +35,19 @@ int (*dirtab[])() = { 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 @@ -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 @@ -87,9 +87,52 @@ int (*dirtab[])() = { d_jpad, // 54 .jpad (deprecated) d_nojpad, // 55 .nojpad (deprecated) d_gpumain, // 56 .gpumain (deprecated) + d_prgflags, // 57 .prgflags }; +// +// .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 // @@ -677,6 +720,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] // @@ -750,8 +814,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; @@ -768,9 +831,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); @@ -933,6 +1001,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");