+ uint64_t address;
+
+ if (!rgpu && !rdsp && !m6502)
+ return error(".org permitted only in gpu/dsp and 6502 sections");
+
+ if (abs_expr(&address) == ERROR)
+ {
+ error("cannot determine org'd address");
+ return ERROR;
+ }
+
+ if (rgpu | rdsp)
+ {
+ orgaddr = address;
+ orgactive = 1;
+ }
+ else
+ {
+ // 6502. We also kludge `lsloc' so the listing generator doesn't try
+ // to spew out megabytes.
+ if (address > 0xFFFF)
+ return error(range_error);
+
+ if (sloc != currentorg[0])
+ {
+ currentorg[1] = sloc;
+ currentorg += 2;
+ }
+
+ currentorg[0] = address;
+ ch_size = 0;
+ lsloc = sloc = address;
+ chptr = scode->chptr + address;
+ orgaddr = address;
+ orgactive = 1;
+ at_eol();
+ }
+
+ return 0;
+}
+
+
+//
+// Print directive
+//
+int d_print(void)
+{
+ char prntstr[LNSIZ]; // String for PRINT directive
+ char format[LNSIZ]; // Format for PRINT directive
+ int formatting = 0; // Formatting on/off
+ int wordlong = 0; // WORD = 0, LONG = 1
+ int outtype = 0; // 0:hex, 1:decimal, 2:unsigned
+
+ uint64_t eval; // Expression value
+ WORD eattr; // Expression attributes
+ SYM * esym; // External symbol involved in expr.
+ TOKEN r_expr[EXPRSIZE];
+
+ while (*tok != EOL)
+ {
+ switch(*tok)
+ {
+ case STRING:
+ sprintf(prntstr, "%s", string[tok[1]]);
+ printf("%s", prntstr);
+
+ if (list_fd)
+ unused = write(list_fd, prntstr, (LONG)strlen(prntstr));
+
+ tok += 2;
+ break;
+ case '/':
+ formatting = 1;
+
+ if (tok[1] != SYMBOL)
+ goto token_err;
+
+// strcpy(prntstr, (char *)tok[2]);
+ strcpy(prntstr, string[tok[2]]);
+
+ switch(prntstr[0])
+ {
+ case 'l': case 'L': wordlong = 1; break;
+ case 'w': case 'W': wordlong = 0; break;
+ case 'x': case 'X': outtype = 0; break;
+ case 'd': case 'D': outtype = 1; break;
+ case 'u': case 'U': outtype = 2; break;
+ default:
+ error("unknown print format flag");
+ return ERROR;
+ }
+
+ tok += 3;
+ break;
+ case ',':
+ tok++;
+ break;
+ default:
+ if (expr(r_expr, &eval, &eattr, &esym) != OK)
+ goto token_err;
+ else
+ {
+ switch(outtype)
+ {
+ case 0: strcpy(format, "%X"); break;
+ case 1: strcpy(format, "%d" ); break;
+ case 2: strcpy(format, "%u" ); break;
+ }