GBZ80: что представляет собой "половинный перенос"?

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

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

2 ответов


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

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

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

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

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


для 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