+ // 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, what does it)
+ // N.B.: Since 'eval' is of type uint64_t, if it goes negative, it will
+ // have its high bit set.
+ if (eval & 0x8000000000000000)
+ return error("negative sizes not allowed in DS");
+
+ // In non-TDB section (BSS, ABS and M6502) just advance the location
+ // counter appropriately. In TDB sections, deposit (possibly large) chunks
+ // of zeroed memory....
+ if ((scattr & SBSS) || cursect == M6502)
+ {
+ listvalue((uint32_t)eval);
+ eval *= siz;
+ sloc += (uint32_t)eval;
+
+ if (cursect == M6502)
+ chptr += eval;
+
+ just_bss = 1; // No data deposited (8-bit CPU mode)
+ }
+ else if (cursect & M56KPXYL)
+ {
+ // Change segment instead of marking blanks.
+ // Only mark segments we actually wrote something
+ if (chptr != dsp_currentorg->start && dsp_written_data_in_current_org)
+ {
+ dsp_currentorg->end = chptr;
+ dsp_currentorg++;
+ dsp_currentorg->memtype = dsp_currentorg[-1].memtype;
+ }
+
+ listvalue((uint32_t)eval);
+ sloc += (uint32_t)eval;
+
+ // And now let's create a new segment
+ dsp_currentorg->start = chptr;
+ dsp_currentorg->chunk = scode; // Mark down which chunk this org starts from (will be needed when outputting)
+ sect[cursect].orgaddr = sloc;
+ dsp_currentorg->orgadr = sloc;
+ dsp_written_data_in_current_org = 0;
+
+ just_bss = 1; // No data deposited
+ }
+ else
+ {
+ dep_block(eval, siz, 0, (DEFINED | ABS), NULL);
+ }
+
+ ErrorIfNotAtEOL();
+ return OK;
+}
+
+
+//
+// dsm[.siz] expression
+// Define modulo storage
+// Quoting the Motorola assembler manual:
+// "The DSM directive reserves a block of memory the length of which in words is equal to
+// the value of <expression>.If the runtime location counter is not zero, this directive first
+// advances the runtime location counter to a base address that is a multiple of 2k, where
+// 2k >= <expression>."
+// The kicker of course is written a few sentences after:
+// "<label>, if present, will be assigned the value of the runtime location counter after a valid
+// base address has been established."
+//
+int d_dsm(WORD siz)
+{
+ TOKEN * tok_current = tok; // Keep track of where tok was when we entered this procedure
+ uint64_t eval;