![]() |
Quote:
|
Всё. Центральный процессор засбоил. Завтра пойду феном выпаивать.
|
1 Attachment(s)
Перепаял вручную. Всё нормально.
ADC16 чуть по-больше: |
Quote:
|
2 Attachment(s)
Здесь сразу и ADC и SBC: (пришлось частями, всё не лезет)
|
Quote:
Quote:
Quote:
PF в ADC16/SBC16 считается так. Считается значение PF как для всех прочих арифметических операций, но только для старших половин результата, прежнего значения HL и операнда. Далее делается следующее. Если сумма второго операнда (то, что добавляется) и CF вызывает переполнение (то есть, CF взведен и операнд был равен #FFFF или стал равен #0000 после сложения с CF), тогда результирующее значение PF меняется на обратное, то есть взводится если сброшен и наоборот. Мы уже знаем, что ADC8 считается верно, значит правильно работающее вычисление PF для арифметических инструкций есть, и нужно только правильно применить его к ADC16/SBC16. |
То есть правильно я понимаю?
OPH:OPL - операнд. Сначала делаю ADD L,OPL, ADC H,OPH. Затем запоминаю PF. Затем если в начале C=0 - то выхожу, а если C=1 - инкрементирую HL и проверяю C, и если этот самый С=1 - значит инвертирую PF? А флаг С я считаю как С1 or С2, где С1 - флаг переполнеия при первом сложении (старших байт), а С2 - при возможном втором (если в начале С=1). Премного благодарен за консультацию !!! |
Quote:
Не забудьте также, про случаи "ADC HL, HL" и "SBC HL, HL" -- эти инструкции модифицируют свои вторые операнды, но во время их исполнения OP (то есть, эти самые вторые операнды) должны рассматриваться равными значению HL до исполнения инструкций, как бы HL ни изменялся во время их исполнения. |
Есть идея сделать так:
1. Прибавить к операнду изначалое значение С. 2. Запомнить флаги P1, C1, S1, V1 - после первой операции. 2. Прибавить к HL текущее значение операнда используя компнда ADD, ADC. 3. Запомнить флаги P2, C2, S2, V2 после второго действия. 4. Вычислить флаги P, C, S результата как P=(P1ORP2)XORC1, C=C1ORC2, S=S1ORS2, V=V1ORV2, Z вычислить проверкой HL на ноль. |
Quote:
В терминах Z80, и если перекладывать на восьмиразрядные инструкции, инструкция "ADC HL, OP" эквивалентно следующему. 1) Прибавляем CF к OP: Code:
LD A, OPLИмеем в виду, что OP -- это временная копия операнда, а не сам этот регистр в правой части инструкции. То есть, сам регистр не модифицируем. 2) Прибавляем OP к HL: Code:
LD A, LCode:
PF = PF XOR PF1Code:
CF = CF OR CF16) SF считать не нужно. Последняя инструкция его выставит сама. 7) А вот HF посчитать придется. То, что дает последняя инструкция будет правильным значением для инкрементированного операнда (если CF на входе взведен), а нам нужен HF для исходных операндов, то есть до инкремента. 8) MEMPTR = значение HL до исполнения. 9) Во флаги 3 и 5 копируем соответствующие разряды старшей половины резлуьтата (то есть H). |
| All times are GMT +4. The time now is 16:59. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.