То есть флаг H в конечном итоге это флаг от суммы HL и операнда (послее шага суммирования их старших байтов) без учёта изначального С?
А про MEMPTR у Янга я читал, что он равен (HL+1), где HL берётся до операции.
То есть флаг H в конечном итоге это флаг от суммы HL и операнда (послее шага суммирования их старших байтов) без учёта изначального С?
А про MEMPTR у Янга я читал, что он равен (HL+1), где HL берётся до операции.
С учетом. В Higgins Emulator есть такой простой макрос:
Так вот для ADC16 вычислить HF можно с помощью HF_ARI(r, a, b), приняв r=(HL+OP+CF)/#100, a=HL/#100 и b=OP/#100. Во всех случаях HL, OP и CF -- значения до исполнения.Код:#define HF_ARI(r, a, b) (((r) ^ (a) ^ (b)) & Z80_HF)
Правильно. Я ошибся, действительно берется значение (HL + 1).
Higgins ZX Spectrum Emulator 8.10 alpha 3 available
Please write us to report a bug or request a feature.
Ничего не понимаю. С H в последнем моём вопросе я немного ошибся. Исправляю:Код:#define HF_ARI(r, a, b) (((r) ^ (a) ^ (b)) & Z80_HF)
1. Прибавить к операнду изначалое значение С.
2. Запомнить флаги P1, C1, H1 - после первой операции.
2. Прибавить к HL текущее значение операнда используя компнда ADD, ADC.
3. Запомнить флаги P2, C2, H2 после второго действия.
4. Вычислить флаги P, C, H результата как P=(P1ORP2)XORC1, C=C1ORC2, H=H1ORH2, Z вычислить проверкой HL на ноль.
То есть H взводится если он взводился хотя бы один раз - после первой операции сложения (старших байт) или же после второй операции сложения (старших байт).
(надо мне как нибудь на досуге С++ выучить ... :-) )
Последний раз редактировалось Lisitsin; 09.03.2011 в 20:53.
Higgins ZX Spectrum Emulator 8.10 alpha 3 available
Please write us to report a bug or request a feature.
ADC16 PASSED !!!
А вот SBC16 по этому алгоритму не хочет ...
Последний раз редактировалось Lisitsin; 09.03.2011 в 23:02.
Higgins ZX Spectrum Emulator 8.10 alpha 3 available
Please write us to report a bug or request a feature.
Шлю в приложении:
Вот здесь:
В ADC16 вы суммируете HL и CF и запоминаете флаги, а затем прибавляете получившееся к операнду и снова получаете нужные флаги, и это правильно. Это работает потому, что сложение коммутативно, и не имеет значения прибавлять ли CF к правому операнду и получить первую порцию флагов или прибавлять CF к левому и получить порцию флагов -- в любом случае последующее вычисление флагов даст правильный результат.Код:BST F,CC ; копируем бит С BLD BUF,0 ; в младший разряд BUF SUB ZL,BUF ; вычитаем флаг С, хранящийся в BUF SBC ZH,ZERO ; к операнду (регистр ZERO==0 – всегда)
Когда речь идет о SBC16 (то есть, о вычитании), то отнимая CF из HL вы получаете не те флаги, которые нужны. Здесь важна последовательность вычислений: сначала нужно добавить CF к правому операнду (а не к HL) и получить порцию флагов, а уже затем из HL вычесть получившееся и вычислить результирующие флаги.
Higgins ZX Spectrum Emulator 8.10 alpha 3 available
Please write us to report a bug or request a feature.
Сделел как во вложении, но всё равно failed:
Ой !!! не взвожу N !!!
Исправляюсь ...
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)