User Tag List

Показано с 1 по 10 из 62

Тема: Загадка плавающих флагов SCF/CCF раскрыта!

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #30

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,374
    Спасибо Благодарностей отдано 
    1,695
    Спасибо Благодарностей получено 
    2,214
    Поблагодарили
    868 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию Исходник теста 'Test SCF 9'

    Вот вам исходик теста, там все подписано:

    Код:
    LX              DEFINE  IXL
    HX              DEFINE  IXH
    LY              DEFINE  IYL
    HY              DEFINE  IYH
    
    ;---------------------------------------------------------------
    
    
    
    STACK		EQU	$C000
    
    ConvTable	EQU	$8000
    
    PatternX30	EQU	$A000
    PatternY31	EQU	$A080
    
    PatternX31	EQU	$A100
    PatternY30	EQU	$A180
    
    PatternX50	EQU	$A200
    PatternY51	EQU	$A280
    
    PatternX51	EQU	$A300
    PatternY50	EQU	$A380
        
    
    ;===============================================================	
    
                    ORG     $9000
    BeginTest:
    		DI
    		LD	SP,STACK
    		
    		LD	HL,$4000				; Очистить экран
    		LD	DE,$4001				;
    		LD	BC,$1800				;
    		LD	(HL),L					;
    		LDIR						;
    		
    ;---------------------------------------------------------------
    		
    ;		LD	HL,$5800
    		LD	B,L
    		
    BT_T0:		LD	(HL),$78				; Верхняя треть экрана - белая бумага, черные чернила
    		INC	HL					;
    		DJNZ	BT_T0					;
    		
    BT_T1:          LD      (HL),$69                                ; Средняя треть экрана - белая бумага, черные синие
    		INC	HL					;
    		DJNZ	BT_T1					;
    		
    BT_T2:		LD	(HL),$38				; Нижняя треть экрана - белая бумага, черные чернила
    		INC	HL					;
    		DJNZ	BT_T2					;
    		
    ;---------------------------------------------------------------
    
    		LD	A,2					; Открыть поток вывода 2 (основной экран)
    		CALL	$1601					;
    
    		LD	HL,TextInfo				; Печать информационного текста
    		LD	A,(HL)
    PrintTextLoop:  RST     $10
                    INC     HL
                    LD	A,(HL)
                    OR	A
                    JP	P,PrintTextLoop
                         
    
    ;---------------------------------------------------------------
    		
    		DI
    	
    		LD	BC,$00FE				;
    		
    		DEFB	$ED,$71					; OUT (c),0 (определение CMOS/NMOS)
    	
    		LD	HL,ConvTable				;
    		
    TableLoop:	LD	D,$08					; 
    		CALL	CreateTable				; Построить таблицу для бита 3
    	
    		LD	D,$20					;
    		CALL	CreateTable				; Построить таблицу для бита 5
    
    ;--------------------------------------------------------------- Построение паттернов для бита 3
    		
    		LD	HL,PatternX30				; Паттерн для X (F)
    		XOR	A					;
    		LD	B,$80					; B - длина таблицы 128 байт
    		
    CPX3_Loop:	LD	(HL),A					; Записать байт в таблицу
    		INC	L					;
    
    		INC	A					; Инкремент цепочки бит по увеличению приоритета:
    		LD	C,A					; 0,1,4,5,6,7,2
    		AND	$03					; так как 2 имеет большое влияние на результат
    		LD	A,C					;
    		JR	NZ,CPX3_noBit2				;
    		ADD	A,$0C					;
    CPX3_noBit2:	JR	NC,CPX3_noBit8				;
    		ADD	A,$04					;
    CPX3_noBit8:	DJNZ	CPX3_Loop				;
    		
    ;---------------------------------------------------------------	
    
    		LD	HL,PatternY31				; Паттерн для Y (A)
    		LD	A,$08					; Бит 3 установлен, чтобы быть в противофазе с X (F)
    		LD	B,$40					; B - длина таблицы 64 байта
    		
    CPY3_Loop:	LD	(HL),A					; Записать байт в таблицу
    		INC	L					;
    
    		ADD	A,2					; Инкремент цепочки бит по увеличению приоритета:
    		BIT	1,A					; 1,4,5,6,7,2
    		JR	NZ,CPY3_noBit2				; так как 2 имеет большое влияние на результат
    		ADD	A,$0C					; 0 не используется для сокращения таблицы вдвое
    CPY3_noBit2:	JR	NC,CPY3_noBit8				;
    		ADD	A,$04					;
    CPY3_noBit8:	DJNZ	CPY3_Loop				;
    
    
    ;--------------------------------------------------------------- Построение паттернов для бита 5
    		
    		LD	HL,PatternX50				; Паттерн для X (F)
    		XOR	A					;
    		LD	B,$80					; B - длина таблицы 128 байт
    		
    CPX5_Loop:	LD	(HL),A					; Записать байт в таблицу
    		INC	L					;
    
    		INC	A					; Инкремент цепочки бит по увеличению приоритета:
    		LD	C,A					; 0,1,2,3,4,6,7
    		AND	$1F					; 
    		LD	A,C					;
    		JR	NZ,CPX5_noBit5				;
    		ADD	A,$20					;
    CPX5_noBit5:	DJNZ	CPX5_Loop				;
    		
    ;---------------------------------------------------------------	
    	
    		LD	HL,PatternY51				; Паттерн для Y (A)
    		LD	A,$20					; Бит 5 установлен, чтобы быть в противофазе с X (F)
    		LD	B,$40					; B - длина таблицы 64 байта
    		
    CPY5_Loop:	LD	(HL),A					; Записать байт в таблицу
    		INC	L					;
    
    		ADD	A,2					; Инкремент цепочки бит по увеличению приоритета:
    		LD	C,A					; 1,2,3,4,6,7
    		AND	$1F					; 0 не используется для сокращения таблицы вдвое
    		LD	A,C					;
    		JR	NZ,CPY5_noBit5				;
    		ADD	A,$20					; 
    CPY5_noBit5:    DJNZ    CPY5_Loop                               ;
    	
    ;---------------------------------------------------------------		
    		
    		LD	HL,PatternX30				; Копировать PatternX30/PatternY31 в PatternX31/PatternY30
    		LD	DE,PatternX31				; с инверсией бита 3
    Inv3Loop:	LD	A,(HL)					;
    		XOR	$08					;
    		LD	(DE),A					;
    		INC	L					;
    		INC	E					;
    		JR	NZ,Inv3Loop				;
    
    		LD	HL,PatternX50				; Копировать PatternX50/PatternY51 в PatternY51/PatternY50
    		LD	DE,PatternX51				; с инверсией бита 5
    Inv5Loop:	LD	A,(HL)					;
    		XOR	$20					;
    		LD	(DE),A					;
    		INC	L					;
    		INC	E					;
    		JR	NZ,Inv5Loop				;
    
    
    
    		
    ;--------------------------------------------------------------- Главный цикл теста
    
    MainLoop:
    		LD	A,ConvTable / 256			; Таблица бит для бита 3
    		LD	HL,$4000				; Верхний левый график
                    LD      IX,PatternX30                          	; IX - таблица паттернов по X (F) для бита 3 = 0
                    LD      IY,PatternY31                          	; IY - таблица паттернов по Y (A) для бита 3 = 1
    		CALL	DrawGraph				; Рисвать график
    		
    		LD	A,ConvTable / 256			; Таблица бит для бита 3
    		LD	HL,$4010				; Верхний правый график
                    LD      IX,PatternX31                          	; IX - таблица паттернов по X (F) для бита 3 = 1
                    LD      IY,PatternY30                         	; IY - таблица паттернов по Y (A) для бита 3 = 0
    		CALL	DrawGraph				; Рисвать график
    		
                    LD      A,(ConvTable + $800) / 256              ; Таблица бит для бита 5
    		LD	HL,$4800				; Нижний левый график
                    LD      IX,PatternX50                          	; IX - таблица паттернов по X (F) для бита 5 = 0
                    LD      IY,PatternY51                          	; IY - таблица паттернов по Y (A) для бита 5 = 1
    		CALL	DrawGraph				; Рисвать график
    		
                    LD      A,(ConvTable + $800) / 256              ; Таблица бит для бита 5
                    LD      HL,$4810                                ; Нижний правый график
                    LD      IX,PatternX51                          	; IX - таблица паттернов по X (F) для бита 5 = 1
                    LD      IY,PatternY50                         	; IY - таблица паттернов по Y (A) для бита 5 = 0
    		CALL	DrawGraph				; Рисвать график
    		
    
    
    
    		JP	MainLoop				; Повторить тест заново			
    
    ;===============================================================
    								; Рисование графика шириной 128, высотой 64 точки
    
    				
    DrawGraph:							; HL - адрес трети на экране
    								; A - старший байт адреса таблицы бит
    								; IX - таблица паттернов по X (F)
    								; IY - таблица паттернов по Y (A)
    								
    		LD	(ByteLoop + 2),A			; Сохранить старший адрес таблицы бит		
    		
    ByteLoop:	LD      DE,ConvTable				; D - старший байт адреса таблицы ConvTable
    								; E - буфер байта для экрана
    TestLoop:
    		LD	B,(IY+00)				; B - паттерн по Y (A)
    		LD	C,(IX+00)				; C - паттерн по X (F)
    		
    		PUSH	BC					; Одиночный тест SCF	
    		POP	AF					; 
    		SCF						;
    		PUSH	AF					;
    		POP	BC					;
    		
    		LD	B,D					; C - регистр флагов
    		LD      A,(BC)					; (BC) -> A (битовая маска для текущей позиции экрана)
    		OR	E					; Установить в байте точку
    		LD	E,A					;
    		INC	D					; Перейти к следующему биту
    		
    		INC	LX					; Перейти к следующему паттерну по X (F)
    		
    		LD	A,D
                    AND	$07                                     ; Цикл на 8 бит в байте
    		JP	NZ,TestLoop				;
    		
    		LD	(HL),E					; Записать байт в экран
    		INC	HL					; Перейти к следующему байту
    		
    		LD	A,L					;
    		AND	$0F					;
    		JP	NZ,ByteLoop				; Цикл по горизонтали до конца половины экрана
    		
    		INC	LY					; Перейти к следующему паттерну по Y (A)
    		LD	LX,0					; Перейти на начало таблицы паттернов для X (F)
    		
    		LD	DE,$00F0				; Перейти на следующую линию
    		ADD	HL,DE					;
    		
    		LD	A,H					;
    		AND	$07					; Цикл на 8 линий
    		JP	NZ,ByteLoop				;
    		
    		LD	DE,-$07E0				; Перейти на следующую строку (знакоместо)
    		ADD	HL,DE					;	
    					
    		BIT	0,H					; Цикл на 8 знакомест в высоту (64 точки)
    		JP	Z,ByteLoop				;
    	
    		RET						; Выход
    		
    ;===============================================================		
    
    CreateTable:	LD	E,$80					;
    
    CT_Loop:	LD	A,L
    		AND	D
    		JR	Z,CT_Zero
    		LD	A,E
    CT_Zero:	LD	(HL),A
                    INC     L
                    JR      NZ,CT_Loop
                    INC     H
    		
    		SRL	E					;
    		JR	NC,CT_Loop				; Цикл на 8 бит в байте		
    		
    		RET
    	
    		
    ;===============================================================		
    
    TextInfo:	DEFB	22,16,5,17,7,16,0,"SCF Test-9 by dr.Titus"
    		DEFB	22,21,0,"Border: Black-NMOS; White-CMOS"
    		DEFB	22,18,0,"Zones:", 19,1,"F3=0,A3=1; F3=1,A3=0"
    		DEFB	22,19,6,17,5,16,1,"F5=0,A5=1; F5=1,A5=0"		
    		DEFB	$FF
    
    	
    ;---------------------------------------------------------------

    Эти 4 пользователя(ей) поблагодарили Titus за это полезное сообщение:

    cafedead(08.05.2025), drbars(09.05.2025), zebest(08.05.2025), ZXMAK(08.05.2025)

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Загадка
    от 31pka в разделе Несортированное железо
    Ответов: 20
    Последнее: 11.03.2020, 05:02
  2. Описание команд Z80: Установка флагов
    от ВитГо в разделе Эмуляторы
    Ответов: 14
    Последнее: 06.03.2019, 20:42
  3. Поясните по поводу регистра AF и флагов
    от jim в разделе Программирование
    Ответов: 10
    Последнее: 27.11.2005, 14:51
  4. Проясните по поводу регистра флагов Z80
    от Shiru в разделе Программирование
    Ответов: 45
    Последнее: 14.05.2005, 12:06

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •