GBZ80: Как LD HL, (SP + e) ​​влияет на флаги H и C? - PullRequest
6 голосов
/ 01 марта 2011

На Gameboy Z80, как именно операция LD HL,(SP+e) влияет на флаги H и C?(Half-carry + carry)

Ссылка: http://www.devrs.com/gb/files/opcodes.html

Ответы [ 2 ]

13 голосов
/ 31 августа 2011

Я понимаю, что это старый вопрос, но у меня была похожая проблема некоторое время назад, и я просто хотел бы добавить свое решение, так как нет абсолютно никакой документации или эмулятора с открытым исходным кодом, который делает это правильно, насколько мне известно.Мне потребовалась небольшая отладка для настоящего геймбоя, чтобы найти решение.

Для обеих 16-битных операций SP + s8 (немедленная подпись):

устанавливается флаг переноса при переполнении с 7-го по 8-й бит.

флаг половинного переносаустанавливается при переполнении с 3-го на 4-й бит

Мне было проще сделать поведение отдельно для немедленной положительной и отрицательной подписи (Lua):

local D8 = self:Read(self.PC+1)
local S8 = ((D8&127)-(D8&128))
local SP = self.SP + S8 

if S8 >= 0 then
    self.Cf = ( (self.SP & 0xFF) + ( S8 ) ) > 0xFF
    self.Hf = ( (self.SP & 0xF) + ( S8 & 0xF ) ) > 0xF
else
    self.Cf = (SP & 0xFF) <= (self.SP & 0xFF)
    self.Hf = (SP & 0xF) <= (self.SP & 0xF)
end
0 голосов
/ 26 марта 2011

Как видно здесь: http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html Сумма SP + e влияет на флаг Half Carry и Carry, поэтому вам следует проверить, есть ли перенос от 3 до 4 и от 7 до 8 (начиная с 0!)

...