+static inline
+int operand_snprint_(char *buf, size_t buf_sz, DCPU16_WORD value, DCPU16_WORD nextword, unsigned int operand_is_a) {
+ int len;
+
+ len = snprintf(buf, buf_sz, " ");
+ if ((size_t)len >= buf_sz)
+ return -1;
+
+ buf += len, buf_sz -= len;
+
+ if (value <= 0x07) {
+ len = snprintf(buf, buf_sz, "%s", dcpu16_reg_names[value]);
+ } else if (value <= 0x0f) {
+ len = snprintf(buf, buf_sz, "[%s]", dcpu16_reg_names[value & 0x07]);
+ } else if (value <= 0x17) {
+ len = snprintf(buf, buf_sz, "[0x%04x + %s]", nextword, dcpu16_reg_names[value & 0x07]);
+ } else switch (value) {
+ case 0x18:
+ if (operand_is_a == 0) { /* b */
+ len = snprintf(buf, buf_sz, "PUSH");
+ } else {
+ len = snprintf(buf, buf_sz, "POP");
+ }
+ break;
+ case 0x19: len = snprintf(buf, buf_sz, "PEEK"); break;
+ case 0x1a: len = snprintf(buf, buf_sz, "PICK 0x%04x", nextword); break;
+ case 0x1b: len = snprintf(buf, buf_sz, "SP"); break;
+ case 0x1c: len = snprintf(buf, buf_sz, "PC"); break;
+ case 0x1d: len = snprintf(buf, buf_sz, "EX"); break;
+ case 0x1e: len = snprintf(buf, buf_sz, "[0x%04x]", nextword); break;
+ case 0x1f: len = snprintf(buf, buf_sz, "0x%04x", nextword); break;
+ default: len = snprintf(buf, buf_sz, "0x%02x", (short)(value - 0x21));
+ }
+
+ if ((size_t)len >= buf_sz)
+ return -1;
+
+ return len;
+}
+