Как IFN A, 0x10 переводится в 0xc00d в оригинальной спецификации для DCPU 16
Я пытаюсь написать ассемблер для спецификации Notch DCPU-16. Оригинальную спецификацию для этого процессора можно найти здесь.
Соответствующие строки:
SET A, 0x30 ;7c01 0030
...
IFN A, 0x10 ;c00d
Я понимаю инструкции до этого момента, но этот для меня должен быть не менее двух слов, а не просто 0xc00d
SET A, 0x10
было бы 7c01 0010
, так
IFN A, 0x10
должно быть 7c0d 0010
не так ли?
Почему b
аргумент в IFN
, не вызывает ли инструкция необходимость в компоненте [PC++] или nextword?
1 ответ
0x1f: next word (literal)
0x20-0x3f: literal value 0x00-0x1f (literal)
Это основная часть спецификации, о которой вы спрашиваете. Литеральное значение от 0 до 31 (0x1f) может быть закодировано в коде операции. Если значение слишком велико, для литерального значения требуется дополнительное слово, обозначенное 0x1f.
Так IFN A, 0x10
нужно только одно слово, так как литерал 0x10 достаточно мал, чтобы поместиться внутри кода операции. 16-битный код операции разбивается на 6 битов для операнда b, 6 битов для операнда и 4 бита для инструкции. Таким образом, b = 0x30 (0x20+ литерал), a = 0x00 (регистр A), instr = 0xd (IFN). Положите их вместе с opcode = (b << 10) | (a << 4) | instr;
и вы получите 0xc00d.