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)

Higgins 26th February 2011 13:55

Quote:

Originally Posted by Lisitsin (Post 361950)
А все команды CP, CPI копируют биты 3, 5 из операнда в F?

CP n и CP r работают так. CPI, CPD, CPIR и CPDR выставляют эти флаги по-другому:

Code:

case 0201:  /* CPI, CPD, CPIR, CPDR: f(4) f(4) r(3) e(5) + e(5) */
        if(y < 4) return Z80_PC;
        s = Z80_AF, w = Z80_HL, do_alu(7, r = READ(w)), CONT5(w);
        r = LIB_UZX_DATA_HIGH(Z80_AF) - r - !!(Z80_AF & Z80_HF);
        Z80_BC = DEC16(Z80_BC);
        Z80_AF = (Z80_AF & (LIB_UZX_DATA_HIGH_MASK | Z80_SF | Z80_ZF | Z80_HF)) |
            ((r << 4) & Z80_YF) | (r & Z80_XF) | ((Z80_BC != 0) << PF_BIT) | Z80_NF | (s & Z80_CF);
        if(y & 1) Z80_HL = DEC16(Z80_HL), z80_MEMPTR = DEC16(z80_MEMPTR);
        else Z80_HL = INC16(Z80_HL), z80_MEMPTR = INC16(z80_MEMPTR);
        if((y & 2) && !(Z80_AF & Z80_ZF) && Z80_BC != 0)
            return (CONT5(w),  Z80_PC = SUB16(Z80_PC, 2), z80_MEMPTR = INC16(Z80_PC));
        return Z80_PC;


Lisitsin 26th February 2011 14:24

Тут ещё такая тема: в мануале написано, что CPD, CPDR, CPI, CPIR - все флаг N взводят. А мне что-то кажется, что CPI, CPIR флаг сей должны сбрасывать.

Higgins 26th February 2011 15:05

Quote:

Originally Posted by Lisitsin (Post 361988)
Тут ещё такая тема: в мануале написано, что CPD, CPDR, CPI, CPIR - все флаг N взводят. А мне что-то кажется, что CPI, CPIR флаг сей должны сбрасывать.

Все эти инструкции взводят NF, см. Z80_NF в коде выше.

Lisitsin 26th February 2011 15:24

Исправил CP, CPI, CPIR, CPD, CPDR в части флагов 3, 5:

Higgins 26th February 2011 16:04

Quote:

Originally Posted by Lisitsin (Post 361997)
Исправил CP, CPI, CPIR, CPD, CPDR в части флагов 3, 5:

Хорошая новость: к #8085 приходим с правильным значением F.

Теперь по адресу #0B03 инструкция "BIT 1, (IY + 1)" все те же флаги 3 и 5. Там должны быть соответственно биты 3 и 5 старшей половины регистра MEMPTR. Он, в свою очередь, получает значение адреса читаемой ячейки, в данном случае IY + 1.

Lisitsin 26th February 2011 16:11

Quote:

Originally Posted by Higgins (Post 362006)
Хорошая новость: к #8085 приходим с правильным значением F.

Теперь по адресу #0B03 инструкция "BIT 1, (IY + 1)" все те же флаги 3 и 5. Там должны быть соответственно биты 3 и 5 старшей половины регистра MEMPTR. Он, в свою очередь, получает значение адреса читаемой ячейки, в данном случае IY + 1.

То есть я просто копирую их опять же из операнда? Работаю.

Lisitsin 26th February 2011 17:13

BIT исправил:
Или я что-то не так понимаю: биты 3 и 5 копируются из самого операнда или из старшего байта его адреса?

Lisitsin 26th February 2011 18:53

Если биты 3 и 5 копируются из старшего байта адреса операнда, вот что получается:

Lisitsin 26th February 2011 21:42

Каюсь. SCF и CCF исправил неправильно. Сейчас сделал правильно. SCF и CCF Passed. DAA failed, но я там ничего не делал с флагом H - не нашёл в документации. Трейсинг последует.

Higgins 26th February 2011 22:11

Quote:

Originally Posted by Lisitsin (Post 362008)
То есть я просто копирую их опять же из операнда?

Quote:

Originally Posted by Lisitsin (Post 362026)
Или я что-то не так понимаю: биты 3 и 5 копируются из самого операнда или из старшего байта его адреса?

Задача в три действия действия:
1) Заносим *адрес* индексированной ячейки в MEMPTR.
2) Берем старшую половину регистра MEMPTR.
3) Копируем биты 3 и 5 из этой старшей половины MEMPTR в регистр F.

Quote:

Originally Posted by Lisitsin (Post 362120)
Каюсь. SCF и CCF исправил неправильно. Сейчас сделал правильно. SCF и CCF Passed. DAA failed, но я там ничего не делал с флагом H - не нашёл в документации. Трейсинг последует.

Отлично. :)


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

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