-// --- dc.b, dc.w / dc, dc.l -----------------------------------------------------------------------
-//
-
-int d_dc(WORD siz) {
- WORD eattr;
- VALUE eval;
- WORD tdb;
- WORD defined;
- LONG i;
- char *p;
- int movei = 0; // movei flag for dc.i
-
- if((scattr & SBSS) != 0)
- return(error("illegal initialization of section"));
-
- if((siz != SIZB) && (sloc & 1))
- auto_even();
-
- for(;; ++tok) {
- // dc.b 'string' [,] ...
- if (siz == SIZB && *tok == STRING && (tok[2] == ',' || tok[2] == EOL)) {
- i = strlen((const char*)tok[1]);
- if((challoc - ch_size) < i)
- chcheck(i);
- for(p = (char *)tok[1]; *p != EOS; ++p)
- D_byte(*p);
- tok += 2;
- goto comma;
- }
-
- if(*tok == 'I') {
- movei = 1;
- tok++;
- siz = SIZL;
- }
-
- // dc.x <expression>
- if(expr(exprbuf, &eval, &eattr, NULL) != OK)
- return(0);
- tdb = (WORD)(eattr & TDB);
- defined = (WORD)(eattr & DEFINED);
- if((challoc - ch_size) < 4)
- chcheck(4L);
-
- switch(siz) {
- case SIZB:
- if(!defined) {
- fixup(FU_BYTE|FU_SEXT, sloc, exprbuf);
- D_byte(0);
- } else {
- if(tdb)
- return(error("non-absolute byte value"));
- if(eval + 0x100 >= 0x200)
- return(error(range_error));
- D_byte(eval);
- }
- break;
- case SIZW:
- case SIZN:
- if(!defined) {
- fixup(FU_WORD|FU_SEXT, sloc, exprbuf);
- D_word(0);
- } else {
- if(tdb)
- rmark(cursect, sloc, tdb, MWORD, NULL);
- if(eval + 0x10000 >= 0x20000)
- return(error(range_error));
- // Deposit 68000 or 6502 (byte-reversed) word
- D_word(eval);
- }
- break;
- case SIZL:
- if(!defined) {
- if(movei)
- fixup(FU_LONG|FU_MOVEI, sloc, exprbuf);
- else
- fixup(FU_LONG, sloc, exprbuf);
- D_long(0);
- } else {
- if(tdb)
- rmark(cursect, sloc, tdb, MLONG, NULL);
- if(movei)
- eval = ((eval >> 16) & 0x0000FFFF) | ((eval << 16) & 0xFFFF0000);
- D_long(eval);
- }
- break;
- }
-
- comma:
-
- if(*tok != ',')
- break;
- }
-
- at_eol();
- return(0);
+// dc.b, dc.w / dc, dc.l
+//
+int d_dc(WORD siz)
+{
+ WORD eattr;
+ VALUE eval;
+ WORD tdb;
+ WORD defined;
+ LONG i;
+ char * p;
+ int movei = 0; // movei flag for dc.i
+
+ 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(string[tok[1]]);
+
+ if ((challoc - ch_size) < i)
+ chcheck(i);
+
+ for(p=string[tok[1]]; *p!=EOS; ++p)
+ D_byte(*p);
+
+ tok += 2;
+ goto comma;
+ }
+
+ if (*tok == 'I')
+ {
+ movei = 1;
+ tok++;
+ siz = SIZL;
+ }
+
+ // dc.x <expression>
+ if (expr(exprbuf, &eval, &eattr, NULL) != OK)
+ return 0;
+
+ tdb = (WORD)(eattr & TDB);
+ defined = (WORD)(eattr & DEFINED);
+
+ if ((challoc - ch_size) < 4)
+ chcheck(4);
+
+ switch (siz)
+ {
+ case SIZB:
+ if (!defined)
+ {
+ AddFixup(FU_BYTE | FU_SEXT, sloc, exprbuf);
+ D_byte(0);
+ }
+ else
+ {
+ if (tdb)
+ return error("non-absolute byte value");
+
+ if (eval + 0x100 >= 0x200)
+ {
+ sprintf(buffer, "%s (value = $%X)", range_error, eval);
+ return error(buffer);
+ }
+
+ D_byte(eval);
+ }
+
+ break;
+ case SIZW:
+ case SIZN:
+ if (!defined)
+ {
+ AddFixup(FU_WORD | FU_SEXT, sloc, exprbuf);
+ D_word(0);
+ }
+ else
+ {
+ if (tdb)
+ rmark(cursect, sloc, tdb, MWORD, NULL);
+
+ if (eval + 0x10000 >= 0x20000)
+ return error(range_error);
+
+ // Deposit 68000 or 6502 (byte-reversed) word
+ D_word(eval);
+ }
+
+ break;
+ case SIZL:
+ if (!defined)
+ {
+ if (movei)
+ AddFixup(FU_LONG | FU_MOVEI, sloc, exprbuf);
+ else
+ AddFixup(FU_LONG, sloc, exprbuf);
+
+ D_long(0);
+ }
+ else
+ {
+ if (tdb)
+ rmark(cursect, sloc, tdb, MLONG, NULL);
+
+ if (movei)
+ eval = ((eval >> 16) & 0x0000FFFF) | ((eval << 16) & 0xFFFF0000);
+
+ D_long(eval);
+ }
+ break;
+ }
+
+comma:
+ if (*tok != ',')
+ break;
+ }
+
+ at_eol();
+ return 0;