+ printf("PUSH");
+ } else {
+ printf("POP");
+ }
+ break;
+ case 0x19: printf("PEEK"); break;
+ case 0x1a: printf("PICK 0x%04x", nextword); break;
+ case 0x1b: printf("SP"); break;
+ case 0x1c: printf("PC"); break;
+ case 0x1d: printf("EX"); break;
+ case 0x1e: printf("[0x%04x]", nextword); break;
+ case 0x1f: printf("0x%04x", nextword); break;
+ default: printf("0x%02x", value - 0x21);
+ }
+}
+
+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");