2012-01-15 4 views
27

У процессора Game Boy Z80 есть флаг с половинной задержкой, и я не могу найти много информации о том, когда устанавливать/очищать его.GBZ80: Что составляет «половину переноса»?

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

+0

Er, не это вопрос электроники? –

+11

Я пишу эмулятор, поэтому я так не думаю ... – Rena

ответ

23

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

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

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

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

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

+1

Хорошо, но как насчет 16-битных операций? Является ли набор с половинным переносом от старшего или младшего байта? – Rena

+2

Высокий байт; это самая последняя половина. И вы, вероятно, уже нашли его, но я нахожу http://datasheets.chipdb.org/Zilog/Z80/z80-documented-0.90.pdf, чтобы получить отличное описание DAA, а также объяснения того, откуда происходит половина переноса такие как CCF (где он установлен на старый перенос, если память используется). – Tommy

+0

Добавлена ​​одна вещь, которая дает мне понять: добавление, например, 0x37 и 0x44, не приведет к полунезависимости, потому что вы смотрите только на младшие 4 бита каждого байта, добавляете их вместе и видите, переполняется ли это. 0x0F + 0x01, 0x37 + 0x44 - нет. –

6

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