GBZ80: Что представляет собой «полуперенос»? - PullRequest
33 голосов
/ 15 января 2012

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

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

Ответы [ 2 ]

28 голосов
/ 16 января 2012

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

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

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

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

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

9 голосов
/ 16 января 2012

Для 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
...