Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Unsorted (http://zx-pk.ru/forumdisplay.php?f=13)
-   -   ZX Spectrum: аппаратная реализация на восьми микросхемах (http://zx-pk.ru/showthread.php?t=13747)

Lisitsin 9th March 2011 21:24

То есть флаг H в конечном итоге это флаг от суммы HL и операнда (послее шага суммирования их старших байтов) без учёта изначального С?
А про MEMPTR у Янга я читал, что он равен (HL+1), где HL берётся до операции.

Higgins 9th March 2011 21:32

Quote:

Originally Posted by Lisitsin (Post 364789)
То есть флаг H в конечном итоге это флаг от суммы HL и операнда (послее шага суммирования их старших байтов) без учёта изначального С?

С учетом. В Higgins Emulator есть такой простой макрос:

Code:

#define HF_ARI(r, a, b) (((r) ^ (a) ^ (b)) & Z80_HF)
Так вот для ADC16 вычислить HF можно с помощью HF_ARI(r, a, b), приняв r=(HL+OP+CF)/#100, a=HL/#100 и b=OP/#100. Во всех случаях HL, OP и CF -- значения до исполнения.

Quote:

Originally Posted by Lisitsin (Post 364789)
А про MEMPTR у Янга я читал, что он равен (HL+1), где HL берётся до операции.

Правильно. Я ошибся, действительно берется значение (HL + 1).

Lisitsin 9th March 2011 21:48

Code:

#define HF_ARI(r, a, b) (((r) ^ (a) ^ (b)) & Z80_HF)
Ничего не понимаю. С H в последнем моём вопросе я немного ошибся. Исправляю:
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 взводится если он взводился хотя бы один раз - после первой операции сложения (старших байт) или же после второй операции сложения (старших байт).
(надо мне как нибудь на досуге С++ выучить ... :-) )

Higgins 9th March 2011 22:36

Quote:

Originally Posted by Lisitsin (Post 364801)
То есть H взводится если он взводился хотя бы один раз - после первой операции сложения (старших байт) или же после второй операции сложения (старших байт).

Да, можно считать HF = HF1 OR HF2.

Но PF нужно считать как PF = PF1 XOR PF2.

Lisitsin 9th March 2011 23:23

1 Attachment(s)
ADC16 PASSED !!!
А вот SBC16 по этому алгоритму не хочет ...

Higgins 10th March 2011 12:11

Quote:

Originally Posted by Lisitsin (Post 364851)
А вот SBC16 по этому алгоритму не хочет ...

Должен работать. Покажите свой код для ADC16 и SBC16, и, может быть, обойдемся без трейсингов в этот раз. :)

Lisitsin 10th March 2011 18:30

1 Attachment(s)
Шлю в приложении:

Higgins 10th March 2011 19:13

Quote:

Originally Posted by Lisitsin (Post 365068)
Эмуляция команд ADC16, SBC16.zip

Вот здесь:

Code:

BST                F,CC                        ; копируем бит С
BLD                BUF,0                        ; в младший разряд BUF
SUB                ZL,BUF                        ; вычитаем флаг С, хранящийся в BUF
SBC                ZH,ZERO                ;  к операнду (регистр ZERO==0 – всегда)

В ADC16 вы суммируете HL и CF и запоминаете флаги, а затем прибавляете получившееся к операнду и снова получаете нужные флаги, и это правильно. Это работает потому, что сложение коммутативно, и не имеет значения прибавлять ли CF к правому операнду и получить первую порцию флагов или прибавлять CF к левому и получить порцию флагов -- в любом случае последующее вычисление флагов даст правильный результат.

Когда речь идет о SBC16 (то есть, о вычитании), то отнимая CF из HL вы получаете не те флаги, которые нужны. Здесь важна последовательность вычислений: сначала нужно добавить CF к правому операнду (а не к HL) и получить порцию флагов, а уже затем из HL вычесть получившееся и вычислить результирующие флаги.

Lisitsin 10th March 2011 19:57

1 Attachment(s)
Сделел как во вложении, но всё равно failed:

Lisitsin 10th March 2011 20:06

Ой !!! не взвожу N !!!
Исправляюсь ...


All times are GMT +4. The time now is 16:59.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.