Код:
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
;---------------------------------------------------------------