Рубрика "IS-DOS - программистам". No 3 Елисеев В. А. "Оконная система IS-DOS" (журнальный вариант) (C) PENCRAFT 1995 (C) IskraSoft 1995 Окончание, начало в No 1, 2. Вспомогательные рестарты. _________________________________________ wtpos (#6B) К двум последним рестартам печати не- посредственно примыкает рестарт wtpos(#6B), позволяющий модифицировать текущие координаты печати для рестартов lnstr и str. Рестарт wtpos вычисляет абсолютные логические координаты печати по значе- ниям Y-coord и Print pos. из вектора ок- на, на который указывает содержимое ре- гистра IX, с учетом смещения по Y, зада- ваемого в регистре H и по X, задаваемого в регистре L, и помещает их в системную переменную XYPOS, находящуюся в векторе символьного устройства вывода. Эта сис- темная переменная активно используется рестартом ttyout(#0A), на основе которо- го созданы многие из рестартов печати уровня WIND.SYS. Следует упомянуть о том, что для за- дания координат печати можно пользо- ваться также и рестартом prapd(#0C) из уровня DOS.SYS, который помещает в сис- темную переменную XYPOS значения регис- тров H (Y-coord в строках) и L (X-coord в знакоместах 6*8). Пример с использованием prapd: ;**************************************** ;Листинг 13 Установка координат ; для lnstr(#6D) ORG #5D64 CALL CLS ;очистка экрана LD H,5 ;Y-coord LD L,2 ;X-coord LD C,#0C ;код рестарта #0С ;из уровня DOS.SYS RST #10 LD HL,TEXT ;адрес текста LD C,#6D ;код рестарта lnstr LD B,37 ;кол-во символов RST #10 ;печать строки CALL WAIT JP EXIT ;текстовый буфер TEXT DEFM "Печать строки " DEFM "с координатами " DEFM "X=2, Y=5" ;дополнительные процедуры CLS LD C,#73 ;рестарт cls RST #10 ;для очистки экрана RET WAIT LD C,#07 ;рестарт ttyin RST #10 ;для ожидания нажа- RET ;тия клавиши EXIT XOR A ;стандартный выход LD A,#F4 ;в IS-DOS RET ;**************************************** То же с использованием wtpos: ;**************************************** ;Листинг 14 Установка координат wtpos ; для lnstr(#6D) ORG #5D64 ;исходные данные: ; Y-coord окна =3 ; X-coord окна =0 ; Print pos =1 ;требуемые координаты печати: ; X=2 ; Y=5 ;следовательно: ; H=2 (смещение по Y) ; L=1 (смещение по X) CALL CLS ;очистка экрана LD IX,WIND ;вектор окна LD A,2 ;открытие окна LD C,#61 RST #10 LD H,2 ;Y-смещение LD L,1 ;X-смещение LD C,#6B ;код рестарта wtpos RST #10 LD HL,TEXT ;адрес текста LD C,#6D ;код рестарта lnstr LD B,37 ;кол-во символов RST #10 ;печать строки CALL WAIT JP EXIT ;вектор окна WIND DEFB 0 DEFB 3 DEFB 7 DEFB 30 DEFB %00001111 DEFB %00000001 DEFB 1 DEFB 40 ;текстовый буфер TEXT DEFM "Печать строки " DEFM "с координатами " DEFM "X=2, Y=5" ;дополнительные процедуры CLS LD C,#73 ;рестарт cls RST #10 ;для очистки экрана RET WAIT LD C,#07 ;рестарт ttyin RST #10 ;для ожидания нажа- RET ;тия клавиши EXIT XOR A ;стандартный выход LD A,#F4 ;в IS-DOS RET ;**************************************** scrol (#70) Еще один чрезвычайно полезный при ра- боте с текстами рестарт - scrol(#70). Он позволяет смещать содержимое рабочей об- ласти окна на строку вверх или вниз. При работе рестарта предусмотрено программирование заполнения крайнего ле- вого и крайнего правого знакомест в осво- бодившейся строке (нижней при движении вверх и наоборот). Входные параметры: IX - вектор окна HL - значение крайних байтов заполнения освободившейся строки (образ коди- руется в двоичном представлении, например: одинарная линия по краю кодируется как 10000000 00000001 и т. п. ) A - режим работы: A=0 - настройка рестарта на вектор окна - вызывается один раз перед началом работы в данном окне. Настройка сохраняется на все время работы до следующего вызова scrol c нулевым значением в регистре A. A=1 - скроллинг на строку вверх A=2 - скроллинг на строку вниз Для нормальной работы scrol необходи- мы еще два параметра, добавляемые к стан- дартному вектору окна и располагающиеся непосредственно перед ним: IX-1 скорость скроллинга - возможные значения - 1, 2, 4, 8 определяет время, в течение которого строка перемещается на 8 пикселей по вер- тикали IX-2 задержка скроллинга - возможные значения от 0 до 255 - регулирует время паузы между последовательны- ми вызовами рестарта Подбором этих двух параметров дости- гается наибольшая плавность движения при требуемой скорости скроллинга. Пример: ;**************************************** ;Листинг 15 Применение scrol(#70) ORG #5D64 ;открытие окна CALL CLS LD IX,WIND LD C,#61 LD A,2 RST #10 ;настройка процедуры scroll ;на вектор окна: LD IX,WIND ;вектор окна LD C,#70 ;код рестарта LD HL,#0000 ;заполнение XOR A ;в рег. A - 0 RST #10 ;печать строки prstr подфункция 3 LD IX,WIND LD HL,TEXT LD C,#68 LD E,3 LD A,%00001010 LD B,1 RST #10 ;скроллинг окна вверх в цикле на 5 строк LD B,5 M1 PUSH BC LD C,#70 ;код рестарта LD A,1 ;скроллинг вверх LD IX,WIND ;вектор окна LD HL,#0000 ;заполнение RST #10 POP BC DJNZ M1 CALL WAIT JP EXIT ;вектор окна + 2 байта для рестарта ;scrol(#70) DEFB 25 ;задержка DEFB 01 ;скорость WIND DEFB 0 DEFB 5 DEFB 12 DEFB 25 DEFB %00000111 DEFB %00000001 DEFB 2 DEFB 25 ;текст для печати TEXT DEFM "Так работает scrol(#70) " DEFB #0D DEFB #03 ;Дополнительные процедуры: CLS LD C,#73 ;рестарт cls RST #10 ;для очистки экрана RET WAIT LD C,#07 ;ожидание клавиши RST #10 RET EXIT XOR A ;выход в IS-DOS LD A,#F4 RET ;**************************************** Применение рестарта scrol вместе с рестартами печати (например prstr) позво- ляет организовать на экране режим "бегу- щего текста". Рассмотрим еще один пример: ;**************************************** ;Листинг 16 Программа "бегущий текст" ORG #5D64 ;процедура открытия окна CALL CLS LD IX,WIND LD C,#61 LD A,2 RST #10 ;настройка процедуры scrol ;на вектор окна: LD IX,WIND LD C,#70 LD HL,0 XOR A RST #10 ;входные параметры для процедуры печати LD A,%00001010 ;в рег. A - биты 7 и 6 определяют режим ; выравнивания ; биты 5...0 определяют отступ ; от верхнего края ; окна LD B,1 ;номер строки в ;тексте (строки ;отделяются друг ;от друга символом ;с кодом #0D) M1 PUSH AF ;сохранить рег. A PUSH BC ;сохранить BC ;печать строки по номеру ее в тексте LD IX,WIND ;адрес вектора окна LD HL,TEXT ;адрес нач. текста LD C,#68 ;код prstr LD E,3 ;код подфункции RST #10 CALL SCROLL ;вызов scrol POP BC ;восстановить BC INC B ;увеличить номер ;строки в тексте LD A,B ;проверка на число CP 9 ;напечатанных строк JP Z,END ;выход, если все ;строки напечатаны POP AF ;восстановить A JR M1 ;переход к печати ;следующей строки ;вектор окна + 2 байта для рестарта ;scrol(#70) DEFB 25 ;задержка DEFB 01 ;скорость WIND DEFB 1 DEFB 1 DEFB 12 DEFB 28 DEFB %00000111 DEFB %00000001 DEFB 4 DEFB 35 ;текст для печати TEXT DEFM " Эта программа " DEFB 13 DEFM " представляет собой пример" DEFB 13 DEFM " организации в системе " DEFB 13 DEFM " IS-DOS работы с экраном " DEFB 13 DEFM " в режиме 'бегущий текст'" DEFB 13 DEFM " Вывод текста организуется" DEFB 13 DEFM " при помощи рестартов" DEFB 13 DEFM " scrol(#70) и prstr(#68)" DEFB 13 ;Дополнительные процедуры: CLS LD C,#73 ;рестарт cls RST #10 ;для очистки экрана RET SCROLL LD C,#70 ;процедура скрол- LD A,1 ;линга окна на LD IX,WIND ;строку вверх LD HL,#0000 RST #10 RET END POP AF ;завершение работы CALL WAIT JR EXIT WAIT LD C,#07 ;ожидание клавиши RST #10 RET EXIT XOR A ;выход в IS-DOS LD A,#F4 RET ;**************************************** ...