16+
ComputerPrice
НА ГЛАВНУЮ СТАТЬИ НОВОСТИ О НАС




Яндекс цитирования


Версия для печати

Модуль поиска не установлен.

Вы и ваш компьютер (часть 3)

13.04.2009

Рустам Галеев

Чтобы завершить разговор о текстовых видеорежимах, необходимо рассмотреть еще одну тему - псевдографику. Придуманная в свое время для создания простых графических интерфейсов, псевдографика заняла свою нишу и продолжает в ней оставаться, несмотря на наличие современных роскошных "настоящих" графических интерфейсов. Свою роль в этом сыграла, очевидно, ее простота и возможность легким способом создавать относительно удобные интерфейсы пользователя, по крайней мере, намного более удобные и наглядные, чем использование параметров командной строки.

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

Псевдографический интерфейс представляет собой фактически текст - "графический текст". Для соответствующих символов в кодировке DOS отведены значения со 176 по 223 (в шестнадцатеричной системе с B0 по DF соответственно). В таблице приведены десятичные и шестнадцатеричные значения расширенного ASCII-кода для псевдографических символов (см. рисунок).

Чтобы заставить созданную нами ранее программу выводить псевдографический интерфейс, необходимо написать соответствующий "псевдографический текст". Для начала можно воспользоваться опять-таки штатными редакторами, например, встроенным редактором FAR. При этом используем предоставляемую DOS возможность набора кода символа - при нажатой клавише 'Alt' на правом цифровом блоке клавиатуры набирается код нужного символа (в десятичной системе), затем клавиша 'Alt' отпускается (в дальнейшем будем обозначать подобные действия следующим образом: , например, ). И так для всех остальных символов, отсутствующих на клавиатуре.

Введем следующую последовательность: , 15 раз повторить , пробел, "C:\FAR" (без кавычек), пробел, снова 15 раз повторить , , , 15 раз , пробел, "C:\FAR", пробел, 14 раз , 'Enter'. Если набрали что-нибудь неправильно, можно удалить ошибочный символ, как при работе с обычным текстом, с последующим вводом нужного символа. В конце строки, в позиции 79 символа, нажимаем клавишу 'Enter'. Это должна быть именно 79 позиция, не раньше и не позже - иначе наша программа отобразит составленное нами изображение неправильно. Дело в том, что используемый нами редактор не переходит автоматически на начало новой строки при достижении 80-й позиции; следующий, 81-й символ окажется за пределами экрана (или же весь текст сдвинется так, что будет виден последний, 81-й символ, но не будет видно первого символа). При выводе же напрямую в видеопамять подразумевается, что вся информация предоставляется последовательно в виде строк по 80 символов, поэтому 81-й символ автоматически попадает на начало второй строки. Чтобы учесть это, приходится набирать в конце строки 'Enter', добавляя в конец строки еще два символа (невидимые при работе с текстовым редактором) - возврата каретки и перевода строки, которые должны оказаться в 79-й и 80-й позициях соответственно. Аналогичным образом поступим и со всеми последующими строками.

Перейдем к следующей строке: , "n", 6 пробелов, "Name", 7 пробелов, , 7 пробелов, "Name", 8 пробелов, 2 раза , "n", 6 пробелов, "Name", 7 пробелов, , 7 пробелов, "Name", 7 пробелов, 'Enter'. Как видите, строки состоят из двух симметричных частей, за исключением завершающего 'Enter', занимающего место двух символов.

И последняя строка: , две точки, 16 пробелов, , "register.frm", 7 пробелов, 2 раза , 2 точки, 16 пробелов, , "register.frm", 6 пробелов, 'Enter'. Остановимся пока на этом - желающие сами смогут продолжить, как хотят. Теперь надо убедиться, что наша программа выведет эту картинку правильно. Сохраним файл (например, "pseudo.txt"), затем, как в прошлый раз, "склеим" окончательный командный файл:

copy prog.com + pseudo.txt + zero image.com

Если теперь запустить файл image.com, вы увидите (если не сделали ошибок) верхнюю часть вашего файлового менеджера (правда, справа будет причудливое обрамление из символов перехода на новую строку). Единственное отличие - монохромное изображение. Это также можно изменить, но для этого нам придется слегка модифицировать нашу программу - в качестве данных она должна использовать не только коды символов, но и соответствующие байты-атрибуты. Модифицированная программа будет выглядеть следующим образом:

mov ax,3
int 10
mov ax,b800
mov es,ax
mov si,11e
lodsw
and ax,ax
jz 115
stosw
jmp 10d
mov ax,0
int 16
mov ah,4c
int 21
dw 0020

По сравнению с предыдущей версией, здесь изменены три команды: вместо 'lodsb' используется 'lodsw', вместо 'and al,al' - 'and ax,ax'; вместо 'db 20' - 'dw 0020'. Во всех случаях изменения обусловлены использованием слова вместо байта. Кроме того, отсутствует команда 'mov ah,7' для инициализации байта-атрибута (единого для всего выводимого текста); в связи с этим расположение команд и соответствующие им адреса изменились, изменились и адреса переходов. Сохраните программу под другим именем, например, 'prog2.com'.

Для ввода данных воспользоваться текстовым редактором на этот раз не удастся. Каждый символ теперь должен кодироваться двумя байтами; чтобы их ввести, потребуется шестнадцатеричный редактор. В качестве такового придется опять использовать отладчик debug, причем нам потребуется лишь одна команда - 'dw' (после этой команды можно набирать несколько значений, отделяя их запятыми; строка завершается нажатием 'Enter'). Например, чтобы ввести десять значений '0020', можно набрать:

dw 0020,0020,0020,0020,-0020,0020,0020,0020,0020,0020

Теперь создадим наш "шедевр". Нам придется окунуться в море цифр. Запускаем debug, как обычно, набираем 'a 100', затем нужно набрать указанным выше способом 100 значений '0020' - это будут поля. Относительный адрес после ввода этих значений должен быть 1с8. Затем вводим:

dw 1e01,1720,178f,17e0,-17a8,17ab,17ae,17a6,17a5,17ad
dw 17a8,17a5

Далее набираем 23 значения '1720'.

dw 705f,1720,7009,1720,7078

Первая строка нашего изображения готова. Само изображение будет размещаться по центру экрана, занимая 40 позиций; справа и слева остаются "поля" размерами в 20 позиций каждое. Поэтому после набора каждой "строки" необходимо набрать дополнительно 40 значений '0020' (20 для завершения текущей "строки" и 20 - для отступа от начала следующей). После набора "полей" относительный адрес должен быть 268.

Такой сложный цифровой набор лучше контролировать, чередуя ввод данных с просмотром того, что получилось - именно для этой цели приводятся здесь значения относительного адреса после завершения ввода очередной "строки". Чтобы запустить промежуточный этап, после соответствующей строки добавьте:

dw 0000

(символ завершения; на этот раз нам не придется отдельно "вклеивать" файл с нулем). Затем еще раз нажмите 'Enter', наберите 'r cx' и введите значение относительного адреса минус 100 (после первой строки это будет 26а-100 = 16а). При сохранении в первый раз придется назвать нашу программу, например, 'n wnd.txt', затем 'w' и 'q'. Соединим кодовую часть файла с данными:

copy prog2.com + wnd.txt wnd.com

Запустите wnd.com и посмотрите, все ли идет, как надо. При ошибках придется вводить "строку" заново.

Чтобы продолжить с того места, на котором мы остановились, загрузим debug вместе с сохраненной уже программой:

debug wnd.txt

Введем адрес, на котором остановились: 'a 268', и продолжим, как если бы не прерывались:

dw 70ba,7020,7494,70a0,-70a9,70ab,7020,078f.07e0,07a0
dw 07a2,07aa,07a0,7020,-7482,70a8,70a4,7020,748e,70aa
dw 70ad,70ae,7020,743f
15 раз наберите '7020'
dw 70ba

Вторая строка завершена. Не забудьте набрать в конце 40 раз '0020'. Адрес после набора: 308.

Третья строка:

dw 70c4,70c4,70c4,70c4,-70c4,70c4,70da
10 раз наберите '70c4'.
dw 70bf,78dc
20 раз '70c4'.
dw 70b6

Конец строки - 40 раз '0020'. Адрес - 3а8.

Четвертая строка:

dw 70ba
5 раз '7020'
dw 70b3,748e,70e2,70ac,-70a5,70ad,70a8,70e2,70ec,7020
dw 7020,70b3,78db
19 раз '7020'.
dw 071e,70ba
Конец строки - 40 раз '0020'. Адрес - 448.

Пятая строка:

dw 70ba
5 раз '7020'.
dw 70c3
10 раз '70c4'.
dw 70b4,78db
19 раз '7020'.
dw 70b1,70ba.
Конец строки - 40 раз '0020'. Адрес - 4е8.

Шестая строка:

dw 70ba
5 раз '7020'.
dw 70b3,7482,70eb,70e0,-70a5,70a7,70a0,70e2,70ec,7020
dw 7020,70b3,78db,1720,-178f,17e0,17a5,17a4,17e3,17af
dw 17e0,17a5,17a6,17a4,-17a5,17ad,17a8,17a5,1720,1720
dw 7078,78dc,70b1,70ba
Конец строки - 40 раз '0020'. Адрес - 558.

Седьмая строка:

dw 70ba
5 раз '7020'
dw 70b3,748a,70ae,70af,-70a8,70e0,70ae,70a2,70a0,70e2
dw 70ec,70b3,78db,70b3,-7020,7020,fe1e
13 раз '7020'
dw 70b3,78db,70b1,70ba
Конец строки - 40 раз '0020'. Адрес - 628.

Восьмая строка:

dw 70ba
5 раз '7020'.
dw 70b3,7082,74e1,70e2,-70a0,70a2,70a8,70e2,70ec,7020
dw 7020,70b3,78db,70b3,-7020,fe1e,fc7e,fe1e,7020,708e
dw 70e1,70e2,70ae,70e0,-70ae,70a6,70ad,70ae,7020,7020
dw 70b3,78db,70b1,70ba
Конец строки - 40 раз '0020'. Адрес - 6с8.

Девятая строка:

dw 70ba
5 раз '7020'.
dw 70b3,7493,70a4,70a0,-70ab,70a8,70e2,70ec,7020,7020
dw 7020,70b3,78db,70b3
16 раз '7020'.
dw 70b3,78db,7008,70ba
Конец строки - 40 раз '0020'. Адрес - 768.

Десятая строка:

dw 70ba
5 раз '7020'.
dw 70c0
10 раз '70c4'.
dw 70d9,78db,70b3
6 раз '7020'.
dw 6020,604f,606b,6020,78dc
5 раз '7020'.
dw 70b3,78db,70b1,70ba
Конец строки - 40 раз '0020'. Адрес - 808.

Одиннадцатая строка:

dw 70ba
6 раз '7020'; 12 раз '78df'
dw 70c0
7 раз '70c4'; 4 раза '78df'; 5 раз '70c4'.
dw 70d9,78db,70b1,70ba
Конец строки - 40 раз '0020'. Адрес - 8а8.

Двенадцатая строка:

dw 70ba
19 раз '7020'; 18 раз '78df'.
dw 70b1,70ba
Конец строки - 40 раз '0020'. Адрес - 948.

Тринадцатая строка:

dw 70ba
37 раз '7020'.
dw 071f,70ba
Конец строки - 40 раз '0020'. Адрес - 9е8.

Последняя строка:

dw 70c8
38 раз '70cd'.
dw 70bc,0000

Конец данных.

"Шедевр" готов. Можете склеить окончательный файл и наслаждаться зрелищем. Или же придумать что-то свое, еще более грандиозное.

Вы и ваш компьютер (часть 1)
Вы и ваш компьютер (часть 2)



статьи
статьи
 / 
новости
новости
 / 
контакты
контакты