Я понимаю, что это старый вопрос, но у меня была похожая проблема некоторое время назад, и я просто хотел бы добавить свое решение, так как нет абсолютно никакой документации или эмулятора с открытым исходным кодом, который делает это правильно, насколько мне известно.Мне потребовалась небольшая отладка для настоящего геймбоя, чтобы найти решение.
Для обеих 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