+// N.B.: This is awful. This needs better handling, rather than just bodging something in that, while works, is basically an ugly wart on the assembler. !!! FIX !!!
+ if (dsp56001)
+ {
+ if (cursect != M56001L)
+ {
+ if (!defined)
+ {
+ AddFixup(FU_DSPIMM24 | FU_SEXT, sloc, exprbuf);
+ D_dsp(0);
+ }
+ else
+ {
+ if (eattr & FLOAT)
+ {
+ double fval = *(double *)&eval;
+ eval = DoubleToDSPFloat(fval);
+ }
+ else
+ {
+ if ((uint32_t)eval + 0x1000000 >= 0x2000000)
+ return error(range_error);
+ }
+
+ // Deposit DSP word (24-bit)
+ D_dsp(eval);
+ }
+ }
+ else
+ {
+ // In L: we deposit stuff to both X: and Y: instead
+ // We will be a bit lazy and require that there is a 2nd value
+ // in the same source line. (Motorola's assembler can parse
+ // 12-digit hex values, which we can't do at the moment) This
+ // of course requires to parse 2 values in one pass. If there
+ // isn't another value in this line, assume X: value is 0.
+ int secondword = 0;
+ uint32_t evaly;
+l_parse_loop:
+
+ if (!defined)
+ {
+ AddFixup(FU_DSPIMM24 | FU_SEXT, sloc, exprbuf);
+ D_dsp(0);
+ }
+ else
+ {
+ if (eattr & FLOAT)
+ {
+ float fval = *(float *)&eval;
+ eval = DoubleToDSPFloat(fval);
+ }
+ else
+ {
+ if (eval + 0x1000000 >= 0x2000000)
+ return error(range_error);
+ }
+
+ // Parse 2nd value if we didn't do this yet
+ if (secondword == 0)
+ {
+ evaly = (uint32_t)eval;
+ secondword = 1;
+
+ if (*tok != ':')
+ {
+ // If we don't have a : then we're probably at EOL,
+ // which means the X: value will be 0
+ eval = 0;
+ ErrorIfNotAtEOL();
+ }
+ else
+ {
+ tok++; // Eat the comma;
+
+ if (expr(exprbuf, &eval, &eattr, NULL) != OK)
+ return 0;
+
+ defined = (WORD)(eattr & DEFINED);
+ goto l_parse_loop;
+ }
+ }
+
+ // Deposit DSP words (24-bit)
+ D_dsp(eval);
+ D_dsp(evaly);
+ sloc--; // We do write 2 DSP words but as far as L: space is concerned we actually advance our counter by one
+ }
+
+ }
+
+ goto comma;
+ }