Компьютер - электронное устройство, которое не заменит человека до тех пор, пока не научится смеяться шуткам начальника и сваливать свои собственные ошибки на соседний компьютер.




,Q 'пишем его в память 210 NEXT ' 220 '''чистим псведостраницу 230 DEF SEG = &H2000 'адрес начала псевдостраницы 240 FOR N = 0 TO 3999 'для каждого символа и атрибута 250 POKE N,32 'помещаем код 32 260 NEXT 'пока не очистим весь буфер
500 '''пишем прямо в псевдостраницу 510 DEF SEG = &H2000 'указываем на ее адрес 520 S$ = "PSEUDOPAGE" 'выводим слово посреди страницы 530 M = LEN(S$) 'получаем длину строки 540 FOR N = 1 TO M 'для каждого символа строки 550 POKE N*2+2000, ASC(MID$(S$,N,1)) 'помещаем его в буфер 560 NEXT '
600 '''теперь используем процедуру 610 PRINT "SCRREN 1" 'печатаем сообшение на экран 620 DEF SEG = &H2200 'указываем на процедуру 630 PSEUDOPAGE = 0 'начинаем с начала процедуры 640 CALL PSEUDOPAGE 'обмениваем страницы 650 CALL PSEUDOPAGE 'повторяем обмен 660 ...

      Средний уровень.

      Функция 5 прерывания 10H выбирает текущую страницу дисплея для вывода. Надо просто поместить номер страницы в AL:
;---установка видимой страницы
      MOV AH,5 ;номер функции
      MOV AL,2 ;номер страницы (начиная с 0)
      INT 10H ;устанавливаем страницу
Однако эта функция не устанавливает страницу, на которую будет идти вывод. Любое из прерываний BIOS, которые выводят на экран (функции прерывания 10H), требует чтобы номер страницы был указан в качестве входного параметра в одном из регистров. Однако все прерывания вывода на экран MS DOS пишут на текущую видимую стра- ницу. Таким образом, для "закулисных" операций Вам необходимо пользоваться прерыванием 10H.
      Для получения информации о текущей странице надо выполнить функцию F прерывания 10H, которая возвращает статус дисплея. Номер страницы при этом возвращается в BH.


      Низкий уровень.

      Дисплейные страницы выбираются за счет изменения точки видео- памяти, начиная с которой монитор принимает данные. Эта точка памяти устанавливается регистрами 12 (старший байт) и 13 (младший байт) микросхемы 6845, которые называются регистрами стартового адреса. Значения адресов раздела страниц для буфера, начинающего- ся с B800 такие:

      40 символов 80 символов
      страница 0 0000H 0000H
      1 0400H 0800H
      2 0800H 1000H
      3 0C00H 1800H
      4 1000H
      5 1400H
      6 1800H
      7 1C00H В [4.1.1] объясняется как программировать регистры микросхемы 6845, а в [4.5.4] содержится пример программирования стартового адреса. В последнем примере надо просто присвоить BX одно из значений вышеприведенной таблицы. Конечно, при этом устанавли- вается только выводимая страница. Для записи в определенную стра- ницу на низком уровне надо использовать одно из значений таблицы в качестве смещения в видеобуфере при прямом отображении в па- мять.
      Поскольку прямое отображение в память работает очень быстро, то иллюзия страниц может быть легко создана на монохромном дисп- лее. Выделите блок размером 4000 байтов для хранения страницы. Хотя монохромный адаптор не может непосредственно читать из обыч- ной памяти, содержимое этого буфера и видеобуфера можно обменять настолько быстро, что никто не зметит разницы. Следующая процеду- ра обменивает содержимое этих двух областей. ;---в сегменте данных PPAGE DW 2000 DUP(720H) ;заполняем буфер пробелами
;---пересылка между псевдостраницей и видеобуфером
      MOV AX,0B000H ;указываем на видеобуфер
      MOV ES,AX ;
      MOV AX,SEG PPAGE ;указываем на псевдостраницу
      MOV DS,AX ; REPEAT: MOV DI,0 ;DI на начало видеобуфера
      MOV SI,OFFSET PPAGE ;SI на начало псевдостраницы
      CLD ;направление вперед
      MOV CX,2000 ;будем пересылать 2000 слов NEXT_WORD: MOV BX,ES:[DI] ;берем слово из видеобуфера в BX
      LODSW ;слово из псевдостраницы в AX
      STOSW ;слово из AX в видеобуфер
      MOV DS:[DI]-2,BX ;слово из BX в псевдостраницу
      LOOP NEXT_WORD ;

      PCjr хранит регистр страницы в порте с адресом 3DFH. Значение битов этого регистра следующее:

      биты 2-0 какая страница выводится (от 0 до 7)
      5-3 какая страница пишется (от 0 до 7) при выводе
      по адресу сегмента B800H


      7-6 = 00 для всех текстовых режимов
      = 01 для графических режимов с 16K
      = 11 для графических режимов с 32K

4.5.4 Сдвиг между страницами текста.



      Поскольку страницы текста прилегают друг к другу в видеобуфе- ре, то небольшой текстовый массив может целиком помещаться в этой памяти. В этом случае текст сдвигаться вверх и вниз по экрану не передвигаясь реально в буфере. Вместо этого экран начинает пока- зывать содержимое буфера, начиная с различных точек и тем самым создавая иллюзию сдвига. Этот метод называется аппаратным сдви- гом.
      Аппаратный сдвиг достигается за счет изменения стартового адреса дисплея, который является числом, указывающим на символ в видеобуфере, который будет выводиться в левом верхнем углу экра- на. Добавление 80 к этому числу "сдвигает" весь экран на одну строку вверх, а вычитание 80 - на одну строку вниз. В режиме с 40 символами в строке надо вместо 80 прибавлять или вычитать 40. На рис. 4-7 приведена диаграмма аппаратного сдвига.
      Отметим, что регистр стартового адреса не считает байты атри- бутов, поэтому Вы должны вычислять адреса памяти по-другому, чем при прямом отображении в память. Имейте также ввиду, что несмотря на наличие разрывов памяти между границами страниц (96 байтов между 80-символьными страницами и 48 байтов между 40-символьными страницами) микросхема 6845 пропускает эти области и сдвиг непре- рывно происходит с одной страницы на