Index of /ukdwk_archive/ukncbtlwebcomplekt/Other/titus_paltestUKNC
Titus:
"Много цветов на УКНЦ!
Благодаря наводке Alex_K удалось выяснить,
что на УКНЦ гораздо больше цветов, нежели
всегда считалось. Не 8 цветов с двумя оттенками на каждый,
а целых 8 палитр по 8 цветов плюс 2 яркости на каждый.
Итого - 128 цветов, уникальных из них... пока не сосчитал.
И это не гигаскрин, не фликеринг, а самый обычный штатный режим работы."
На дискете программа TSPAL.SAV содержит
Тест палитры УКНЦ v0.1a (c) by dr.Titus
- запускается сразу из командного файла.
Image : disketa009.dsk
Format : DSK
Size : 800 Kb
Volume ID: RT11A
Owner :
File Blocks Date Bytes
---------- ------ ----------- ----------
SWAP .SYS 27 19-Dec-1988 13'824
RT11SJ.SYS 78 16-Dec-2012 39'936
TT .SYS 2 23-Jan-1980 1'024
MZ .SYS 4 12-Jan-1990 2'048
TSPAL .SAV 5 22-Jan-2013 2'560
GRDEMO.SAV 36 13-Jul-1980 18'432
RDWR .SAV 3 20-Dec-1991 1'536
BANK .FNT 68 31-Jan-1994 34'816
MENFNT.SAV 54 31-Jan-1994 27'648
AC .SYS 5 12-Sep-1994 2'560
RESORC.SAV 25 01-Mar-2012 12'800
DUP .SAV 45 27-Dec-1983 23'040
PIP .SAV 30 31-Oct-1998 15'360
DIR .SAV 20 31-Oct-1998 10'240
STARTS.COM 1 22-Jan-2013 512
< UNUSED > 1183 605'696
---------- ------ ----------- ----------
15 Files, 403 Blocks
1183 Free blocks
;===================================================================================
;
; Тест палитры УКНЦ
;
; Версия 0.1b
;
; (c) dr.Titus 2013
;
;===================================================================================
.MCall .TTYIN, .TTYOUT, .Print, .Exit
.RADIX 10
.CSect
CSR2STATE = ^O176674
CSR2DATA = ^O176676
PPLADR = ^O177010
PPL0DATA = ^O177012
PPL12DATA = ^O177014
KBSTAT = ^O177700
KBDATA = ^O177702
SCRMEM = ^O154540
;===============================================
Start:
;----------------------------------------------- Копировать код в память PPU
MOV #,MPA2 ;Аргумент 2 - длина программы в PPU
MOVB #1,MPType ;Комана запроса памяти PPU
CALL PPUOut ;=> Передача параметров
BNE PPUErr ;Если ошибка, то --> PPUErr
MOV MPA1,R0 ;PPUDisp = PPUMBeg - PPUTBeg
SUB #PPUTBeg,R0 ;(смещение между программой в CPU и ее копией в PPU)
MOV R0,PPUDisp ;
MOV MPA1,PPUMBeg ;Сохранить адрес начала выделенной памяти в PPUMBeg
;Аргумент 1 - адрес начала программы в PPU
MOV #PPUTBeg,MPA2 ;Аргумент 2 - адрес начала программы в CPU
MOV #,MPA3 ;Аргумент 3 - длина программы
MOVB #16,MPType ;Комана копирования из памяти CPU в память PPU
CALL PPUOut ;=> Передача параметров
BNE PPUErr ;Если ошибка, то --> PPUErr
;-----------------------------------------------
.Print #KeyOFF ;Отключить клавиатуру
;----------------------------------------------- Тестирование палитры
TestBegin:
.Print #Text0 ;Печатать название теста
CALL PALTest ;Тестирование палитры
;-----------------------------------------------
ExitTest:
;Освободить память PPU
MOV PPUMBeg,MPA1 ;Аргумент 1 - адрес начала выделенной памяти
MOV #,MPA2 ;Аргумент 2 - длина выделенной памяти
MOVB #2,MPType ;Комана освобождения памяти PPU
CALL PPUOut ;=> Передача параметров
BNE PPUErr ;Если ошибка, то --> PPUErr
.Print #KeyON ;Включить клавиатуру
.Exit
;----------------------------------------------- Ошибка обмена с PPU
PPUErr:
.PRINT #tPPUErr ;Печатаем сообщение об ошибке
.EXIT ;Выход в систему
;===================================================================================
;
; Тестирование палитры
;
;===================================================================================
PALTest:
MOV #PALPPU,R0 ;Аргумент 1 - PALPPU + PPUDisp (адрес запуска программы в PPU)
ADD PPUDisp,R0 ;
MOV R0,MPA1 ;
CLR FlgEnd ;Очищаем флаг завершения программы PPU
MOVB #24,MPType ;Команда запуска программы PPU
CALL PPUOut ;=> Передача параметров
BNE PPUErr ;Если ошибка, то --> PPUErr
1$: TST FlgEnd ;Ожидаем окончания выполнения программы PPU
BEQ 1$ ;
RETURN ;Выход
;===================================================================================
;
; Функция обмена информацией с PPU
;
;===================================================================================
PPUOut:
MOV #AMP,R0 ;R0 - Указатель на массив инициализации
MOV #8,R1 ;R1 - счетчик на 9 байт
1$:
MOVB (R0)+,@#CSR2DATA ;(R0) -> Канал-2
2$: TSTB @#CSR2STATE ;Ждать готовности
BPL 2$ ;
SOB R1,1$ ;Цикл на R1 байт
TSTB MP ;Тестировать байт ответа PPU
RETURN ;Выход
AMP: .BYTE 0, 0, 0, 255 ;Массив инициализации из неопределенного состояния
.WORD MP, 65535 ;Адрес массива параметров, и два терминатора 255, 255
MP: .BYTE 0 ;Байт ответа
MPType: .BYTE 1, 26, 0 ;Команда, тип устройства (ОЗУ ПП), номер устройства
MPA1: .WORD 0 ;Аргумент 1
MPA2: .WORD 0 ;Аргумент 2
MPA3: .WORD 0 ;Аргумент 3
FlgEnd: .WORD 0 ;Флаг завершения работы программы
;===================================================================================
;===================================================================================
;
; Начало перемещаемой области
;
;===================================================================================
PPUTBeg:
;===================================================================================
;
; Функция тестирования палитры
;
;===================================================================================
PAlPPU:
MTPS #^O340 ;Запретить прерывания
; MOV SP,SP ;Остановка для отладчика
;----------------------------------------------- Инициализация пустой строки
MOV #SCRMEM,@#PPLADR ;Адрес начала пустой строки
CLR R0 ;R0 = 0
MOV #40,R1 ;R1 - счетчик на 40 байт
10$:
MOVB R0,@#PPL0DATA ;Записать в план 0
MOV R0,@#PPL12DATA ;Записать в планы 1 и 2
INC @#PPLADR
SOB R1,10$ ;Цикл
;----------------------------------------------- Инициализация шаблона
MOV #SCRMEM+40,@#PPLADR ;Адрес начала шаблона
CLR R2 ;R2 - цвет (0)
MOV #8,R0 ;R0 - счетчик на 8 цветов
9$:
CLR R3 ;Подготовить план 0
BIT #1,R2 ;
BEQ 5$ ;
DECB R3 ;
5$:
CLR R4 ;Подготовить план 2
BIT #4,R2 ;
BEQ 6$ ;
DEC R4 ;
6$:
CLRB R4 ;Подготовить план 1
BIT #2,R2 ;
BEQ 7$ ;
DECB R4 ;
7$:
MOV #5,R1 ;R1 - счетчик на 5 байт на цвет
8$:
MOVB R3,@#PPL0DATA ;Записать в план 0
MOV R4,@#PPL12DATA ;Записать в планы 1 и 2
INC @#PPLADR
SOB R1,8$ ;Цикл
INC R2 ;Перейти к следующему цвету
SOB R0,9$ ;цикл
;=============================================== Инициализация списка строк
MOV PC,R1 ;R1 - таблица строк
ADD #Buffer-.,R1 ;
ADD #7,R1 ;Выровнять на границу 8-ми байт
BIC #7,R1 ;
MOV R1,-(SP) ;Сохранить на стеке
MOV #SCRMEM+40,R0 ;R0 - экрананя память шаблона
MOV #34952,R2 ;R2 - 0x8888 (маска яркости)
MOV #16,R4 ;R4 - палитра (0) и масштаб (320)
;----------------------------------------------- Регистр отображения и цвета для пустых строк
MOV #0,(R1)+ ;Нет курсора
MOV #16,(R1)+ ;Палитра 0
MOV #SCRMEM,(R1)+ ;Пустая строка
MOV R1,R3 ;Следующий элемент - 4-х словный регистр цвета
ADD #6+2,R3 ;
MOV R3,(R1)+ ;
MOV #0,(R1)+ ;Нулевые цвета
MOV #0,(R1)+ ;
MOV #SCRMEM,(R1)+ ;Пустая строка
MOV R1,R3 ;Следующий элемент - 2-х словный
ADD #2,R3 ;
MOV R3,(R1)+ ;
;----------------------------------------------- 30 пустых строки
MOV #30,R5 ;Цикл на 30 строк
12$:
MOV #SCRMEM,(R1)+ ;Пустая строка
MOV R1,R3 ;Следующий элемент двухсловный
ADD #2,R3 ;
MOV R3,(R1)+ ;
SOB R5,12$ ;Цикл
;----------------------------------------------- 1 пустая строка
MOV #SCRMEM,(R1)+ ;Пустая строка
MOV R1,R3 ;Следующий элемент - 4-х словный регистр цвета
ADD #6+6+1,R3 ;Включить курсор
MOV R3,(R1)+ ;
ADD #4,R1 ;Выравниваем на границу 4-х слов
;----------------------------------------------- Инициализируем цвета
2$:
MOV #12816,R3 ;R3 = 0x3210 (цвета с 0 по 3)
BIS R2,R3 ;Добавить маску яркости
MOV R3,(R1)+ ;Записать первое слово регистра управления цветом
MOV #30292,R3 ;R3 = 0x7654 (цвета с 4 по 7)
BIS R2,R3 ;Добавить маску яркости
MOV R3,(R1)+ ;Записать первое слово регистра управления цветом
MOV #SCRMEM,(R1)+ ;Пустая строка
MOV R1,R3 ;Следующий элемент - 4-х словный регистр отображения
ADD #2+2,R3 ;
MOV R3,(R1)+ ;
;------------------------------------------------ 0-я строка, задающая палитру
11$:
MOV R2,R3 ;R3 = (R2 & 0xFFF7) + 7
BIC #65527,R3 ;
ADD #7,R3 ;
MOV R3,(R1)+ ;Цвет курсора 7, яркость R2, позиция 0, тип - текстовый
MOV R4,(R1)+ ;Палитра
MOV R0,(R1)+ ;Экранная память шаблона
MOV R1,R3 ;Следующий элемент - 2-х словный
ADD #2,R3 ;
MOV R3,(R1)+ ;
;----------------------------------------------- 14 обычных строк
MOV #14,R5 ;Цикл на 14 строк
1$:
MOV R0,(R1)+ ;Экранная память шаблона
MOV R1,R3 ;Следующий элемент - 2-х словный
ADD #2,R3 ;
MOV R3,(R1)+ ;
SOB R5,1$ ;Цикл
;----------------------------------------------- 15-я строка
MOV R0,(R1)+ ;Экранная память шаблона
MOV R1,R3 ;Следующий элемент - 4-х словный регистр отображения
ADD #4+4,R3 ;
MOV R3,(R1)+ ;
ADD #4,R1 ;Выравниваем на границу 4-х слов
;-----------------------------------------------
INC R4 ;Следующая палитра
BIT #8,R4 ;Если не достигли 8-й палитры,
BEQ 11$ ;то цикл --> 11$
BIS #4,-6(R1) ;Поменять элемент с регистра отображения на регистр палитры
MOV #34952,R3 ;
XOR R3,R2 ;Иначе инвертировать маску яркости
MOV #16,R4 ;R4 - палитра (0) и масштаб (320)
TST R2 ;Если яркость нулевая,
BEQ 2$ ;то еще один цикл
;----------------------------------------------- Регистр отображения и цвета для пустых строк
BIC #4,-6(R1) ;Поменять элемент с регистра палитры на регистр отображения
MOV #0,(R1)+ ;Нет курсора
MOV #16,(R1)+ ;Палитра 0
MOV #SCRMEM,(R1)+ ;Пустая строка
MOV R1,R3 ;Следующий элемент - 4-х словный регистр цвета
ADD #6+2+1,R3 ;Выключить курсор
MOV R3,(R1)+ ;
MOV #0,(R1)+ ;Нулевые цвета
MOV #0,(R1)+ ;
MOV #SCRMEM,(R1)+ ;Пустая строка
MOV R1,R3 ;Следующий элемент - 2-х словный
ADD #2,R3 ;
MOV R3,(R1)+ ;
;----------------------------------------------- Конец списка
MOV #SCRMEM,(R1)+ ;Пустая строка
MOV R1,R3 ;Следующий элемент - 2-х словный,
ADD #-2,R3 ;зацикленный сам на себя
MOV R3,(R1) ;
;----------------------------------------------- Инициализируем корневой указатель
MOV PC,R1 ;Сохранить указатель
ADD #STOR270-.,R1 ;на первую запись таблицы строк
MOV @#^O270,(R1)+ ;
MOV @#^O272,(R1) ;
MOV #SCRMEM,@#^O270 ;Пустая строка
MOV (SP)+,R3 ;
ADD #2,R3 ;Указатель на нашу таблицу строк
MOV R3,@#^O272 ;(4-х словный список)
;----------------------------------------------- Ожидание нажатия на клавишу
4$: TSTB @#KBSTAT ;Ожидаем нажатия или отжатия
BPL 4$ ;клавиши
TSTB @#KBDATA ;Если клавиша отжата, то цикл
BMI 4$ ;
MOV PC,R1 ;Восстановить указатель
ADD #STOR270-.,R1 ;на первую запись таблицы строк
MOV (R1)+,@#^O270 ;
MOV (R1),@#^O272 ;
;=============================================== Завершение работы резидента PPU
MOV #FlgEnd/2,@#PPLADR ;-1 -> (FlgEnd)
MOV #-1,@#PPL12DATA ;(конец работы подпрограммы PPU)
MTPS #0 ;Разрешить прерывания
RETURN ;Выход
;===================================================================================
TEMP: .WORD 0 ;Слово для временного использования
PPUDisp: .WORD 0 ;Смещение программы в PPU относительно той же программы в CPU
STOR270: .WORD 0 ;Сохраненная первая запись в таблице строк
.WORD 0 ;
;----------------------------------------------- Буфер находится в памяти PPU и CPU по разным адресам
Buffer:
.BLKW 600 ;Буфер для таблицы строк (таблица строк около 534 слов)
PPUTEnd:
;===================================================================================
;
; Конец перемещаемой области
;
;===================================================================================
;===================================================================================
Text0: .ASCIZ <14>"tEST PALITRY uknc"<15>" v0.1b (c) by dr.Titus"
tPPUErr: .ASCIZ <13><10><14>"o[IBKA INICIALIZACII "<15>"PPU!"
KeyOFF: .ASCII <27><91><50><104><128>
KeyON: .ASCII <27><91><50><108><128>
.Even
;===============================================
PPUMBeg: .WORD 0 ;Адрес начала выделенной памяти в PPU
;===================================================================================
.End Start
;