Практикум по среде и языку QBasic__________________________133

ется кодом символа (первый байт) и загруженной кодовой страницей, а окраска и мигание - так называемым атрибутом (второй байт).

Разобраться в этом совсем нетрудно, если знать адреса ЗУ адаптера дисплея, имеющего общее адресное пространство с ОЗУ. Для дисплея типа EGA, работающего в текстовом режиме, код символа размещаемого в первом столбце первой строки должен быть записан в ячейке со смещением о, а код атрибута — со смещением 1, при этом шестнадцатеричное значение адреса сегмента должно быть равно В800. При увеличении номера столбца на 1 смещение должно увеличиваться на 2, а при увеличении номера строки на 1 смещение должно увеличиваться на 160, так как в строке размещается 80 символов. При адресации к ОЗУ для вывода на дисплей удобнее для выбора строки задавать код сегмента: поскольку изменению адреса сегмента на 1 соответствует изменение смещения на 16, то при увеличении номера строки на 1 адрес сегмента должен изменяться на 10 (в десятичной системе).

Итак будем по номеру столбца задавать смещение, а по номеру строки — адрес сегмента. Для начала выведем на первую строку символы кодовой страницы, соответствующие кодам от о до 31. Эти коды (а также код 127) используются В ASCII (American Standard Code for information interchange переводится как американский стандартный код для обмена информацией) для управления выводом и обменом информацией. По этой причине они не имеют стандартных символьных обозначений. Ниже приведена программа вывода упомянутых кодов в нечетные столбцы первой строки (для этого смещение должно изменяться не на 2, а на 4).

CLS 'очистка экрана DEF SEG = &НВ800 'обращение к первой строке FOR i% = О ТО 31 'цикл по столбцам POKE 4 * i%, i%

'в нечетных столбцах коды символов от 0 до 31 POKE 4 * i% + 1, 15

'в нечетных столбцах атрибут белого на черном NEXT i% 'конец цикла по столбцам

Запустив эту программу вы увидите интересные для программирования игр символы (например, символы карточных мастей), часть этих символов (например, с кодами 7, ю и 13) в принципе не могут быть выведены процедурой PRINT, так как они используются для управления выводом.

Для вывода всех символов кодовой страницы включим цикл по столбцам в цикл по строкам, причем номера строк также будут нечетные (код сегмента должен изменяться не на 10, а на 20). CLS 'очистка экрана FOR j% = О ТО 7 'цикл по строкам DEF SEG = &HB800 + 20 * j%

'обращение к строке с нечетным номером k% = 32 * j%

'для перебора кодов от 0 до 255 FOR i% = О ТО 31 'цикл по столбцам