Подтвердить что ты не робот

GBZ80: Что представляет собой "пол-перенос"?

Процессор Game Boy Z80 имеет флаг половинного переноса, и я не могу найти много информации о том, когда устанавливать/очищать его.

Насколько я понимаю до сих пор, любая 8-битная операция добавления, вычитания, сдвига или поворота (и, возможно, другие?) устанавливает ее в бит 4 результата (?), и инструкция DAA устанавливает/использует это как-то, Я не уверен, как 16-битные инструкции влияют на него и зависят от того, повлияли они на него или нет, с помощью определенных регистров.

4b9b3361

Ответ 1

Это перенос с бит 3 на бит 4, как и нормальные записи флага переноса, переносятся с бит 7. Так, например, чтобы получить бит переноса длины в add:

((a&0xf) + (value&0xf))&0x10

Что дает 0x10, если половина переноса должна быть установлена, 0 в противном случае. Естественно, что получить половину переноса от других соответствующих операционных систем - вопросы - нести ли от низкого прикуса до максимума.

Чтобы представить что-то в перспективе, z80 имеет 4-битный ALU и выполняет 8-битные операционные системы, выполняя два 4-битных ops. Поэтому он получает половину переноса очень естественно, как промежуточный результат.

DAA интересуется флагом, потому что, если установлена ​​половина переноса, тогда две цифры, которые составляют более 16, были добавлены в низкий кусок; которые будут правильно произведены, переносятся в верхний полубайт, но оставят низкий кусочек 6 ниже, чем он должен быть, поскольку было еще шесть значений между 10, когда он должен был сгенерировать перенос и 16, когда он это сделал.

Ответ 2

Для 16-разрядных операций перенос от бит 3 к биту 4 в верхнем байте регистра устанавливает флаг. Другими словами, бит 11 - бит 12.

(Обратите внимание, что вышеуказанные биты обозначаются 0-15, от наименьшего до наиболее значимого)

Смотрите здесь: http://www.z80.info/z80code.htm

16 bit arithmetic

If  you want to add numbers that are more than the 0-255 that can
be stored in the A register,  then the HL, IX or IY registers can
be used. Thus LD HL,1000H:LD BC,2000H:ADD HL,BC will give

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
00 000000 2000 0000 3000 0000 0000 00 000000 0000 0000 0000 0000

The flags are set as follows.

C or carry flag          1 if answer >65535 else 0
Z or zero flag           not changed
P flag                   not changed
S or sign flag           not changed
N flag                   0
H or half carry flag     1 if carry from bit 11 to bit 12 else 0