X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=procln.c;h=65d7580b7a14a013fefae620dfa243275f292dc0;hp=c4612cbce65cb438c1351a7f40a2f7b6399c5ff6;hb=5cd8a4814b805f1ef8ce689423eb5eeba12573c5;hpb=51cff2ac6cb3d097f62b68c51d74fafbce8923f6;ds=sidebyside diff --git a/procln.c b/procln.c index c4612cb..65d7580 100644 --- a/procln.c +++ b/procln.c @@ -41,6 +41,8 @@ static int disabled; // Assembly conditionally disabled int just_bss; // 1, ds.b in microprocessor mode VALUE pcloc; // Value of "PC" at beginning of line SYM * lab_sym; // Label on line (or NULL) +int bfparam1; // bfxxx instruction parameters +int bfparam2; // bfxxx instruction parameters const char extra_stuff[] = "extra (unexpected) text found after addressing mode"; const char comma_error[] = "missing comma"; @@ -49,7 +51,7 @@ const char locgl_error[] = "cannot GLOBL local symbol"; const char lab_ignored[] = "label ignored"; // Table to convert an addressing-mode number to a bitmask. -LONG amsktab[0112] = { +LONG amsktab[0124] = { M_DREG, M_DREG, M_DREG, M_DREG, M_DREG, M_DREG, M_DREG, M_DREG, @@ -88,8 +90,18 @@ LONG amsktab[0112] = { M_AM_USP, // 0106 M_AM_SR, // 0107 M_AM_CCR, // 0110 - M_AM_NONE // 0111 -}; // 0112 length + M_AM_NONE, // 0111 + 0x30, // 0112 + 0x30, // 0113 + 0L, // 0114 + 0L, // 0115 + 0L, // 0116 + 0L, // 0117 + M_CREG, // 0120 (caches - TODO: is this correct or does it need its own bitfield?) + M_CREG, // 0121 + M_FREG, // 0122 + M_FPSCR // 0123 +}; // 0123 length // Function prototypes @@ -177,6 +189,9 @@ loop1: // Internal line processing loop // First token MUST be a symbol (Shamus: not sure why :-/) if (*tok != SYMBOL) { + if (*tok>=KW_D0 && *tok<=KW_R31) + error("cannot use reserved keyword as label name or .equ"); + else error("syntax error; expected symbol"); goto loop; } @@ -261,6 +276,17 @@ as68label: siz = SIZL, tok++; else if (*tok == DOTB) siz = SIZB, tok++; + else if(*tok == DOTD) + siz = SIZD, tok++; + else if(*tok == DOTP) + siz = SIZP, tok++; + else if(*tok == DOTQ) + siz = SIZQ, tok++; + else if(*tok == DOTS) + siz = SIZS, tok++; + else if(*tok == DOTX) + siz = SIZX, tok++; + // Do special directives (500..999) (These must be handled in "real time") if (state >= 500 && state < 1000)