Радио-86РК/Радио 03-90/Драйвер оконного интерфейса/Таблица 1
Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. Автор: Г. ШТЕФАН |
Таблица JMP TEST ; ПЕРЕХОД НА ТЕСТИРОВАНИЕ ДР. PRINTC: JMP 0F809Н ;ВЫВОД СИМВОЛА ЧЕРЕЗ МОНИТОР PRINT: JMP 0F818H ;ВЫВОД ТЕКСТА ЧЕРЕЗ МОНИТОР INPUT: JMP 0F803H ;ввод символа с клавиатуры LOADM: JMP 0F821H ;запрос символа над курсором LDCUR: JMP 0F81EH ;ЗАПРОС ПОЛОЖЕНИЯ КУРСОРА INITSP: DW TXTCUR+5 ;АДРЕС ОБЛАСТИ СОХРАНЕНИЯ ЭК. ; ОПИСАНИЕ РАБОЧИХ ПОЛЕЙ ДРАЙВЕРА BASEAD: EQU 2100Н ;АДРЕС НАЧАЛА РАБ. ОБЛАСТИ WPARM: EQU BASEAD ;РАЗМЕР ОКНА (ВЕРТ./ГОРИЭ.> WHOME: EQU WPARM+2 ;ПОЛОЖЕНИЕ ВЕРХ. ЛЕВОГО УГЛА WCURSR: EQU WHOME+2 ;ПОЛОЖЕНИЕ КУРСОРА NUMWND: EQU WCURSR+2 ;НОМЕР АКТИВНОГО ОКНА ADRSP: EQU NUMWND+1 ; АДРЕС СВОБОДНОЙ ОБЛАСТИ TXTCUR: EQU ADRSP+2 ; РАБОЧИЕ ЯЧ. ДЛЯ УСТ.КУСОРА ;+resetw - инициирование драйвера оконного + ;* интерфейса + ;++++++++++++++++++++++++++++++++++++++++++++++++ RESETW: PUSH Н XRA А ;ОБНУЛЕНИЕ НОМЕРА STA NUMWND ;АКТИВНОГО ОКНА LHLD INITSP ;ИНИЦИИРУЕМ АДРЕС НАЧАЛА ОЗУ SHLD ADRSP ;ДЛЯ СОХРАНЕНИЯ ЭКРАНОВ POP Н RET ;+++++++++++++++++++++++++++++++++++++++++++++++ ;+SAVEW - СОХРАНЕНИЕ ОБЛАСТИ ЭКРАНА ЗАНИМАЕМОЙ + ;+ ПОД ОТКРЫВАЕМОЕ ОКНО + ;+ВХОД: H,L- КООРДИНАТЫ ЛЕВОЙ ВЕРШИНЫ ОКНА + ;+ D,Е- РАЗМЕРЫ ОКНА С РАМКОЙ (СТРК/СТЛБ1 + SAVEW: PUSH D ; СОХРАНЯЕМ РЕГИСТРЫ PUSH Н PUSH H ;КООРДИНАТЫ ОКНА CALL CURIN ;ЗАГРУЖАЕМ ПОЛОЖЕНИЕ КУРСОРА SHLD WCURSR ;СОХРАНЯЕМ ПОЛОЖЕНИЕ КУРСОРА LHLD ADRSP ;АДРЕС СТЕКА ОБЛАСТИ СОХРАН. SAW10: XTHL ;КООРДИНАТЫ ОКНА В HL CALL CUROUT ;УСТАНАВЛИВАЕМ КУРСОР INR Н ;ГОТОВИМ СЛЕДУЮЩУЮ СТРОКУ XTHL ;СОХРАНЯЕМ КООРДИНАТЫ В СТЕКЕ MOV В,Е ;РАЗМЕР ОКНА ПО ГОРИЗОНТАЛИ SAW20: CALL LOADM ;БАЙТ ИЗ ЭКРАННОЙ ОБЛАСТИ MOV М, А ;СОХРАНЯЕМ ЕГО В РАБ.ОБЛАСТИ INX Н ;УВЕЛИЧИВАЕМ АДРЕС MVI C,18H ;СДВИГАЕМ КУРСОР ВПРАВО CALL PRINTC DCR В ;УМЕНЬШАЕМ СЧЕТЧ.ШИРИНЫ ОКНА JNZ SAW20 ;ЦИКЛ ПО СИМВОЛАМ СТРОКИ DCR D ;УМЕНЬШАЕМ СЧЕТЧ.ВЫСОТЫ ОКНА JNZ SAW10 ;ЦИКЛ ПО СТРОКАМ INX SP ;ПРОПУСКАЕМ КООРДИНАТЫ ОКНА INX SP ;В СТЕКЕ XCHG ;ПЕРЕСЫЛАЕМ АДР.РАБ.ОБЛАСТИ LHLD WНОМЕ ;СОХРАНЯЕМ КООРД. АКТ.ОКНА CALL SAVPP ;В РАБОЧЕЙ ОБЛАСТИ LHLD WPARM ;СОХРАНЯЕМ ПАРАМЕТРЫ ОКНА CALL SAVPP LHLD WCURSR ; СОХРАНЯЕМ ПОЗИЦИИ КУРСОРА CALL SAVPP LHLD ADRSP ; СОХРАНЯЕМ АДР.НАЧАЛА ОБЛАСТИ CALL SAVPP ;ПОД АКТИВНОЕ ОКНО ХСНG ;ОБНОВЛЯЕМ АДРЕС НАЧАЛА SHLD ADRSP ;СВОБОДНОЙ РАБ. ОБЛАСТИ LXI H, NUMWND ;УВЕЛИЧИВАЕМ НОМЕР INR М ;АКТИВНОГО ОКНА POP H ;ВОССТАНАВЛИВАЕМ РЕГИСТРЫ POP D RET ; SAVPP - ПОДПРОГРАММА ПОМЕЩЕНИЯ ПАРАМЕТРОВ ; ' АКТИВНОГО ОКНА В СТЕК ДРАЙВЕРА SAVPP: XCHG ; АДРЕС ПЕРЕСЫЛАЕМ В HL MOV М, Е ; МЛАДШИЙ БАЙТ ПАРАМЕТРА INX Н MOV M, D ; СТАРШИЙ БАЙТ ПАРАМЕТРА INX H ХСНG ; ВОССТАНАВЛИВАЕМ АДРЕС В DE RET ;+RESTW - СТИРАНИЕ АКТИВНОГО ОКНА И ВОССТА- + ;+ НОВЛЕНИЕ СОДЕРЖИМОГО ЭКРАНА + ;++++++++++++++++++++++++++++++++++++++++++++ RESTW: PUSH H PUSH D PUSH В LDA NUMWND ; ПРОВЕРЯЕМ НОМЕР АКТ. ОКНА DCR A ; ЕСЛИ ОТКРЫТОГО ОКНА НЕТ, JM RESRET ; ТО ВЫХОДИМ. ИНАЧЕ УМЕНЬШАЕМ STA NUMWND ; НОМЕР АКТИВНОГО ОКНА LHLD ADRSP ; НАЧИНАЕМ ВОССТАНОВЛЕНИЕ XCHG ; ПАРАМЕТРОВ ПРЕДПОСЛ. ОКНА CALL RESPP ; АДРЕС РАБОЧЕЙ ОБЛАСТИ ОКНА SHLD ADRSP ; CALL RESPP ; ПОЗИЦИЯ КУРСОРА SHLD WCURSR ; CALL RESPP ; РАЗМЕРЫ ОКНА PUSH H CALL RESPP ; КООРДИНАТЫ ОКНА PUSH H LHLD WPARM ; ЗАГРУЖАЕМ РАЗМЕР СТИР. XCHG ; ОКНА INR D ; УЧИТЫВАЕМ РАМКУ INR D LHLD WHOME ; ЗАГРУКАЕМ КООРДИНАТЫ DCR H ; СТИРАЕМОГО ОКНА DCR L ; И УЧИТЫВАЕМ РАМКУ PUSH H ; СОХРАНЯЕМ ЕГО В СТЕКЕ LHLD ADRSP ; АДРЕС ОБЛАСТИ СОХР. ОКНА RES10: XTHL ; КООРДИНАТЫ ОКНА В (H.L) CALL CUROUT ; КУРСОР В УГОЛ РАМКИ INR H ; ГОТОВИМСЯ К СЛЕД.СТРОКЕ XTHL ; АДРЕС 08Л.СОХР. В (H,L) MOV В,Е ; счетчик ширины окна RES20: MOV C,M ; ВОССТАНАВЛИВАЕМ СОДЕР". CALL PRINTC ; ЭКРАНА INX H ; УВЕЛИЧИВАЕМ АДРЕС DCR В ; НИКЛ ПО СТРОКЕ JNZ RES20 DCR D ; ЦИКЛ ПО СТРОКАМ JNZ RES10 INX SP ; ПРОПУСКАЕМ РАБОЧУЮ INX SP ; ПЕРЕМЕННУЮ В СТЕКЕ POP D ; КООРДИНАТЫ POP H ; И РАЗМЕРЫ ОКНА SHLD WPARM ; ПОМЕЩАЕМ В РАБОЧИЕ XCHG ; ЯЧЕЙКИ ДРАЙВЕРА SHLD WHOME SHLD WHOME LHLD WCURSR ; ВОССТАНАВЛИВАЕМ ПОЗИЦИЮ CALL CUROUT ; КУРСОРА RESRET: POP В ; ВОССТАНАВЛИВАЕМ РЕГИСТРЫ POP D ; и выход POP H RET ; _________________________________________________ ; RESPP - ПОДПРОГРАММА ЗАГРУЗКИ ПАРАМЕТРОВ ОКНА ; _________________________________________________ RESPP: XCHG DCX H ; ЗАГРУЖАЕМ ДВА БАЙТА MOV D, M ; ИЗ ОБЛАСТИ СОХРАНЕНИЯ DCX H ; ПЕРЕСЫЛАЕМ ИХ В (H,L) MOV Е,М XCHG RET ; ВЫХОД ;+ FRAME - РИСОВАНИЕ РАМКИ ОКНА И ФОРМИРОВАНИЕ + ;+ ПАРАМЕТРОВ ОКНА + ;+ ВХОД : H,L- КООРДИНАТЫ OKHA, D, E РАЗМЕРЫ + FRAMES: PUSH H ; СОХРАНЯЕМ РЕГИСТРЫ PUSH D CALL CUROUT ; КУРСОР В УГОЛ РАМКИ DCR D ; УМЕНЬШАЕМ ВЫСОТУ РАМКИ DCR D MOV В, Е ; ШИРИНУ РАМКИ В СЧЕТЧИК LXI H, FRTEXT ; АДРЕС ВЕРХНЕЙ ЛИНИИ CALL DRWFR ; РИСУЕМ ЛИНИЮ И УГОЛ MOV B, D ; ВЫСОТУ РАМКИ В СЧЕТЧИК CALL DRWFR ; РИСУЕМ ПРАВУЮ ЛИНИИ MOV В,Е ; ширину рамки в счетчик CALL DRWFR ; РИСУЕМ НИЖНЮЮ ЛИНИЮ MOV B, D ; ВЫСОТУ РАМКИ В СЧЕТЧИК CALL DRWFR ; РИСУЕМ ЛЕВУЮ ЛИНИЮ И CALL CURIN ; ЗАГРУЖАЕМ КООРДИНАТЫ SHLD WHOME ; ПОЛОЖЕНИЯ НОМЕ ОКНА XCHG SHLD WPARM ; ЗАПИСЫВАЕМ РАЗМЕРЫ АКТ. POP D ; ОКНА POP H ; ВОССТАНАВЛИВАЕМ РЕГИСТРЫ RET ;-DRWFR - РИСОВАНИЕ СТОРОНЫ И УГЛА РАМКИ ;-ВХОД: В - ДЛИНА СТОРОНЫ DRWFR: DCR В ; ЕСЛИ ДЛИНА 1 JZ DRR20 ; ОБХОДИМ ЦИКЛ ПО ДЛИНЕ СТОР. DRW10: PUSH H ; РИСУЕМ В-1 СИМВОЛОВ СТОРОНЫ CALL PRINT POP H DCR В JNZ DRW10 DRR20: CALL PRINT ; РИСУЕМ ПОСЛЕДНИЙ СИМВОЛ INX H CALL PRINT ; ПРОРИСОВЫВАЕМ УГОЛ INX H ; готовим адрес очереди. стор. RET ; ДАННЫЕ ДЛЯ ПОСТРОЕНИЯ РАМКИ FRTEXT: DB 17Н, 0 ; ВЕРХНЯЯ СТОРОНА DB 1АН, 8, 0 ; УГОЛ DB 17Н, 1АН, 8, 0 ; ПРАВАЯ СТОРОНА DB 0 ; УГОЛ DB 17Н, 8, 8, 0 ; НИЖНЯЯ СТОРОНА DB 19H, 18H, 0 ; УГОЛ DB 17Н,19Н, 8, 0 ;ЛЕВАЯ СТОРОНА DB 18Н,1АН, 0 ; КУРСОР В ЛЕВЫЙ ВЕРХНИЙ УГОЛ ;WRITE - ВЫВОД ТЕКСТА ЧЕРЕЗ ДРАЙВЕР ОКНА. + ; АНАЛОГ П/П МОНИТОРА 0F818H ) + ;ВХОД: HL - АДРЕС НАЧАЛА ТЕКСТА. + WRITE: MOV А, М ; ВЫВОДИМ ВСЕ СИМВОЛЫ ORA А ; ДО НУЛЯ JZ WRTRET MOV С, А ; ЧЕРЕЗ CALL WRITEC ; ПОДПРОГРАММУ WRITEC INX H JMP WRITE WRTRET: INX H RET ;++++++++++++++++++++++++++++++++++++++++++++ ; WRITEC - ВЫВОД СИМВОЛА ЧЕРЕЗ ДРАЙВЕР ОКНА + ; АНАЛОГ П/П МОНИТОРА 0F809Н + ; ВХОД: С - КОД СИМВОЛА + ;++++++++++++++++++++++++++++++++++++++++++++ WRITEC: LDA NUMWND ; ПРОВЕРЯЕМ НАЛИЧИЕ ORA А ; АКТИВНОГО ОКНА JZ WRC30 ; ЕСЛИ НЕТ- ЧЕРЕЗ МОНИТОР MOV А, С ; РЕЗЕРВИРУЕМ ВОЗМОЖНОСТЬ ORA A ; ИЗМЕНЕНИЯ АТРИБУТОВ ВГ-75 JM WRC30 CPI 0DН ; УПРАВЛЯЮШИЕ СИМВОЛЫ JNZ WRC10 ; 0Dн CALL WR0D JMP WRCRET WRC10: CPI 0СН ; 0CH JNZ WRC20 CALL WR0C JMP WRCRET WRC20: CPI 1FH ; 1FH JNZ WRC30 CALL WR1F ; ОБРАБАТЫВАЮТСЯ П/П ДРАЙВЕРА JMP WRCRET URC30: CALL PRINTC ; ОСТАЛЬНЫЕ СИМВОЛЫ В МОНИТОР WRCRET: RET ; WR0D - ОБРАБОТКА СИМВОЛА 0DН + WR0D: PUSH В MVI C, 0DH ; КУРСОР В НАЧАЛО СТРОКИ CALL PRINTC LDA WHOME ; МЛАДШИЙ БАЙТ В WHOME MOV В, А ; КООРДИНАТА ПО СТОЛБЦАМ MVI C, 18H ; ПЕРЕДВИГАЕМ КУРСОР НА WRDL0: CALL PRINTC ; ПЕРВУЮ ПОЗИЦИЮ ВНУТРИ ОКНА DCR В JNZ WRD10 POP В RET ; WR0C - ОБРАБОТКА СИМВОЛА 0СН + WR0С: PUSH Н LHLD WHOME ; УСТАНАВЛИВАЕМ КУРСОР В CALL CUROUT ; В ВЕРХНИЙ ЛЕВЫЙ УГОЛ ПРОДОЛЖЕНИЕ ТАБЛИЦ! POP Н ; ОКНА ВНУТРИ РАМКИ RET ; WR1F - ОБРАБОТКА СИМВОЛА 1FH + WR1F: PUSH Н ; СОХРАНЯЕМ ИСПОЛЬЗУЕМЫЕ PUSH D ; РЕГИСТРЫ PUSH В LHLD WPARM ; ЗАГРУЖАЕМ РАЗМЕРЫ ОКНА XCHG LHLD WHOME ; ЗАГРУЖАЕМ КООРДИНАТЫ ОКНА WRF10: CALL CUROUT ; КУРСОР В НАЧАЛО СТРОКИ ОКНА MOV B, E ; РАЗМЕР ОКНА ПО СТОЛБЦАМ DCR В ; УЧИТЫВАЕМ РАМКУ DCR В ; СЧЕТЧИК ПО СТОЛБЦАМ WRF20: MVI С,' ' ; ОБНУЛЯЕМ СТРОКУ CALL PRINTC DCR В ; ЦИКЛ ПО СИМВОЛАМ СТРОКИ JNZ WRF20 INR Н ; ГОТОВИМ КООРД. СЛЕД. СТРОКИ DCR D ; УМЕНЬШАЕМ СЧЕТЧИК СТРОК JNZ WRF10 ; ЦИКЛ ПО СТРОКАМ ОКНА CALL WR0C ; КУРСОР В ВЕРХНИЙ ЛЕВЫЙ УГОЛ POP В POP D ; ВОССТАНАВЛИВАЕМ РЕГИСТРЫ POP Н RET ;+++++++++++++++++++++++++++++++++++++ ;+CURIN - ЗАГРУЗКА КООРДИНАТ КУРСОРА + ;+ВЫХОД: <Н> - НОМЕР СТРОКИ + ;+ (L) - НОМЕР СТОЛБЦА + CURIN: CALL LDCUR ; ЗАГРУЖАЕМ КООРД. КУРСОРА PUSH D ; В ФОРМАТЕ МОНИТОРА LXI D,0FCF8H ; ПРИВОДИМ К НОРМАЛЬНОМУ ВИДУ DAD D ; ОТ <0,0> ДО <24,63) POP D RET ;+CUROUT - УСТАНОВКА КУРСОРА В ЗАДАННУП ПОЗИЦИЮ + ;+ВХОД: <Н) - НОМЕР СТРОКИ + ;+ (L) - НОМЕР СТОЛБЦА + ;++++++++++++++++++++++++++++++++++++++++++++++++ CUROUT: PUSH H ; СОХРАНЯЕМ РЕГИСТРЫ PUSH D PUSH В LXI D,2020Н ; ГОТОВИМ: 20H+<l ) И 20Н+(Н) DAD D XCHG ; ПЕРЕСЫЛАЕМ В <l),L> LXI H,TXTCUR+4 ; РАБОЧЕЕ ПОЛЕ В ОЗУ MVI М,0 ; ПРИЗНАК КОНЦА СТРОКИ DCX Н ; ФОРМИРУЕМ В TXTCUR MOV M,E ; ESCAPE ПОСЛЕДОВАТЕЛЬНОСТЬ DCX Н ; АР2,'Г',2вН+(Н>>20H+<L>,0 MOV M,D DСХ Н MVI M,'Y' DСХ H MVI M,1BH CALL PRINT ; УСТАНАВЛИВАЕМ КУРСОР ЧЕРЕЗ POP В ; МОНИТОР POP D POP H RET ;***************** ТЕСТОВАЯ ПРОГРАММА ************************ TEST: STEP1: CALL RESETW ; ИНИЦИИРУЕМ ДРАЙВЕР STEP2: LXI Н,506Н ; КООРД.РАМКИ 1 ОКНА LXI D,512H ; РАЗМЕРЫ РАМКИ 1 ОКНА CALL SAVEW ; COXP.СОДЕРЖ.ЭКРАНА CALL FRAME ; РИСУЕМ РАМКУ STEP3: LXI H, TSTXT1 ; ВЫВОДИМ ТЕКСТ CALL WRITE ; ЧЕРЕЗ ДРАЙВЕР CALL INPUT ; ПАУЗА STEP4: LXI Н,80ЕН ; КООРДИНАТЫ 2 ОКНА LXI D,512H ; РАЗМЕРЫ 2 ОКНА CALL SAVEW ; OTKPblBAEM 2 ОКНО CALL FRAME LXI H, TSTXT2 ; ВЫВОДИМ ТЕКСТ CALL WRITE ; BO 2 ОКНО STEP5: CALL INPUT ; ПАУЗА CALL RESTW ; СТИРАЕМ 2 OKHО STEP6: CALL INPUT ; ПАУЗА CALL RESTW ; СТИРАЕМ 1 ОКНО CALL INPUT ; ПАУЗА JMP TEST ; НА ПОВТОР ТЕСТ-ПРОГРАММЫ TSTXT1: DB 1FH,'1 ОКНО' DB 0DH, 0AH, '2 СТРОКА 1 ОКНА',0 TSTXT2: DB 1FH,'2 ОКНО ' DB 0DB,0AH,'2 СТРОКА 2 ОКНА' DB 0DH,0AH,'3 СТРОКА 2 ОКНА',0СН,0