ZX-Ревю 1992 №7-8 1991 г.

Элементарная графика в машинных кодах - печать чисел и строк. Управление позицией и цветом печати.


Темы статьи: Игры  

ЭЛЕМЕНТАРНАЯ ГРАФИКА В МАШИННЫХ КОДАХ

( Глава из книги "Элементарная графика")

Сегодня мы представляем Вам наше новое издание. Оно посвящено графике "Спектрума" и будет выпущено в четырех томах.

Первый том называется "Персональный компьютер ZX-СПЕКТРУМ. Элементарная графика".

Вашему вниманию предлагается одна глава из этой книги.

Книга готова к изданию и мы ждем заявок и предложении от организаций, способных приняться за ее издание и распространие на взаимовыгодных условиях.

ЭЛЕМЕНТАРНАЯ ГРАФИКА В МАШИННЫХ КОДАХ

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

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

Итак, если Вы из БЕЙСИКа напечатаете звездочку на Вашем экране, то вам потребуется изрядная доля воображения для того, чтобы считать, что это компьютерная графика и убедить своих друзей, что у Вас есть дизайнерские способности. А что, если вы сделаете то же самое из машинного кода? А если при этом Вы ее не напечатаете, а нарисуете по точкам? Все дело принимает совсем другой оборот, не правда ли? Итак, все дело не в терминах, а в целенаправленности Ваших усилий, в способности задумать что-то и найти способы, как это реализовать.

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

В этой главе мы попробуем дать Вам те основы, которые необходимы дли того, чтобы начать эксперименты с графикой из машинного кода. Как и в любом другом вопросе, связанном с программированием на "Спектруме", мы не надеемся дать полную и исчерпывающую картину. Как и всегда, "ИНФОРКОМ" видит главную задачу в том, чтобы помочь сделать первый шаг, а дальше Вы сами раскроете свои таланты.

Первое, что нам потребуется - это вспомнить концепцию потоков и каналов "Спектрума". Те, кто более глубоко заинтересуются этой концепцией, могут найти информацию в "ZX-РЕВЮ" (N12, 1991г., с.227), мы же здесь рассмотрим этот вопрос в минимальном объеме хотя бы потому, что работая в БЕЙСИКе, Вы можете и не задумываться о потоках и каналах, а вот программируя в машинных кодах, без них не обойтись, коль скоро речь идет о графике, а значит о способах выдачи информации на экран.

Стандартными каналами "Спектрума" для вывода информации являются каналы:

- "К" - нижние две строки экрана (системное окно).

- "S" - главная часть экрана;

- "P" - стандартный ZX-принтер.

К этим каналам стандартно подключены потоки:

- поток #0 - к каналу "К";

- поток #1 - тоже подключен к каналу "К";

- поток #2 - подключен к каналу "S";

- поток #3 - к каналу "P"

Таким образом, оказываются идентичными следующие команды ввода/вывода:

PRINT #0 "Hello"; A$ - то же самое, что и INPUT "Hello": A$.

PRINT "Hello" - то же самое, что и PRINT #2 "Hello".

LPRINT "Hello" - то же самое, что и PRINT #3 "Hello".

Номер, стоящий после знака и в вышеприведенных примерах, является номером потока. Поскольку эти потоки подключены стандартно и переподключены быть не могут, мы программируем на БЕЙСИКе и используем операторы INPUT, PRINT, LPRINT без указания номера потока.

Это то, что касалось стандартных каналов и потоков, но они могут быть и нестандартными. Так, если Вы работаете в локальной сети, то сеть становится еще одним каналом, к которому вы подключите поток.

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

Программируя в машинном коде, переключаться с канала "К" на "S" и наоборот -очень просто. О том, какой канал является текущим в данный момент, несет информацию нулевой бит системной переменной TVFLAG (5C3CH - 23612). Когда он выключен (равен 0), используется канал "S", а когда включен - "К".

Две небольшие процедуры продемонстрируют разницу в их использовании (листинг

1).

Не менее просто переключаться с каналов "S" или "К" на канал "P". Здесь тоже достаточно изменить один бит. Это первый бит системной переменной FLAGS (5C3BH -23611). Он должен быть выключен для каналов "S" и "К", но включен для канала "P" (листинг 2).

Вы можете также изменить текущий канал, переключившись на другой поток. Это можно сделать вызовом процедуры ПЗУ, называющейся CHAN_OPEN и находящейся по адресу 1601H (5633). Перед тем, как ее вызывать, следует в аккумуляторе установить номер желаемого потока (листинг 3).

Нам необходимо знать эти азы потому, что если мы используем для печати из машинного кода команду процессора RST 10H, то должны иметь в виду, что она выдает информацию ТОЛЬКО В ТЕКУЩИЙ КАНАЛ. Прежде, чем Вы дадите компьютеру команду, что бы Вы хотели, чтобы он напечатал, надо сначала определиться, куда он будет это печатать и как.

Команду RST 10H Вы можете использовать для печати любых символов, будь то символ стандарта ASCII или графический символ. Это может быть управляющий символ и даже токен ключевого слова стандартного БЕЙСИКа. Поместите код того, что хотите напечатать, в аккумулятор и дайте команду RST 10H. При этом обычные символы займут одно знакоместо, управляющие коды сделают то, что им положено, а токены ключевых слов будут развернуты и займут столько знакомест, сколько букв в этом ключевом слове. Вам надо также знать, что команда RST 10H никогда не портит содержимое регистров процессора, кроме ВС', DE' (альтернативные) и аккумулятора, который портит не всегда.

Печать чисел.

1. Целые числа от 0 до 9.

Выполнить печать целого числа от 0 до 9 можно двумя способами.

Во-первых, вы можете напечатать его обычным способом, как и любой другой символ. Для этого поместите в аккумулятор процессора его код (код 0 - 48 (30H).... код 9 - 57 (39H)) и дайте команду RST 10H.

Во-вторых, можно это число напечатать, загрузив в аккумулятор не его код, а само число, но в этом случае печать следует выполнять не командой RST 10H, а вызовом специально предназначенной процедуры ПЗУ - CALL 15EFH (десятеричный адрес - 5615), она называется OUT_ CODE. Это, конечно удобнее, но при своей работе эта процедура портит регистр Е (имейте это в виду).

Возможен и промежуточный вариант, когда Вы засылаете в аккумулятор само число, а не его код, затем прибавляете к нему 30H (получаете его код) и затем даете RST 10H. LD A,n ADD A, 30H RST 10

По расходу памяти это то же самое, что и CALL OUT_CODE, но не портит регистр Е.

2.. Целые числа от 0 до 9999.

Для печати целых чисел, меньших чем 10000, введите это число в регистровую пару BC и вызовите процедуру ПЗУ OUT_NUM_1. Она находится по адресу 1А1ВН (6683).

Если Ваше число содержится в виде двух байтов в известном Вам адресе памяти, то Вы можете воспользоваться процедурой ПЗУ OUT_NUM_2 (1A28H = 6696). В этом случае перед вызовом процедуры надо в регистровую пару HL заслать адрес, в котором находится Ваше число.

И в том и в другом случае, если Вы попробуете через эти процедуры распечатать число, которое больше 9999, результат будет неверным.

Листинг 1

Демо_S

213С5С LD HL,TVFLAG

3600 LD (HL),00

ЗЕ2А LOOP LD A,42

D7 RST 10H

18FB JR LOOP

О

Выключили бит 0 системной переменной TVFLAG. Загрузили в аккумулятор число 42 (код символа Выдали на печать по текущему каналу то, что находится в аккумуляторе. возврат для повтора.

Демо_К

213C5C LD HL,TVFLAG

3601 LD (TVFLAG),01

3E2A LOOP LD A,42

D7 RST 10H

18FB JR LOOP

Включили бит 0 системной переменной TVFLAG.

Печать символа "*". возврат для повтора.

Листинг 2.

Демо_Р

Включили бит 1 системной переменной FLAGS. Обнуление счетчика (подготовка к печати 256-ти символов).

Печать символа "*". Возврат для повтора, пока счетчик не достигнет нуля. Возврат в вызывающую программу

2^5С CBCE 0600

LD HL, FLAGS SET 1,(FLAGS)

LD B, 00

ЗЕ2А D7

10FB

LOOP

LD A,42 RST 10H DJNZ LOOP

С9

RET

3. Целые числа от 0 до 65535.

В этом случае Ваше число тоже должно быть помещено в регистровую пару ВС, но в

отличие от предыдущего случая необходимо делать не один вызов процедур ПЗУ, а два.

Сначала оно должно быть конвертировано в интегральную (пятибайтную) форму и помещено на стек калькулятора, это делается вызовом процедуры STACK_BC (2D2BH = 11563). И только после этого оно может быть напечатано, как действительное число с плавающей точкой. Это выполняется вызовом процедуры PRINT_FP, расположенной по адресу 2DE3H (11747).

4. Отрицательные целые числа.

Знак "минус" имеет код 2DH. Поместите его в аккумулятор, выполните RST 10H и абсолютную величину числа печатайте, как показано выше.

5. Произвольные действительные числа (числа с плавающей точкой).

Такое число занимает 5 байтов и хранить его ни в каком регистре, ни в регистровой паре невозможно. В этом случае Вами должны быть приняты меры для того, чтобы предварительно разместить его на вершине стека калькулятора. Когда это сделано, вызов процедуры PRINT_FP (2DE3H=11747) напечатает его на экране.

Здесь надо сделать пару предупреждений для тех, кто работает с калькулятором "Спектрума", зашитым в ПЗУ.

Во-первых, после работы процедура PRINT_FP, число со стека калькулятора снимается и, если Вам оно еще может потребоваться, то позаботьтесь предварительно продублировать вершину стека (соответствующая команда в сводке команд калькулятора имеется - см. "Первые шаги в машинном коде". М.: "ИНФОРКОМ", 1990г., т. 1).

Во-вторых, в процедурах ПЗУ, обслуживающих калькулятор, есть ошибка. Она заключается в том, что это число при вызове PRINT_FP снимается со стека не всегда. Если Ваше действительное число находится в диапазоне от -1 до +1 (ноль исключается), то вместо вашего числа на вершине стека остается 0. Обращайте на это внимание.

Печать символьных строк.

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

Самый простой метод состоит в следующем. Регистровая пара DE должна содержать адрес, с которого начинается ваша символьная строка, а в регистровой паре BC необходимо предварительно установить длину этой строки. Печать выполняется вызовом процедуры PR_STRING, которая находится по адресу 203CH (8252).

Во-вторых, символьная строка может быть Вами получена в результате работы встроенного калькулятора. В этом случае она находится на вершине стека и может быть напечатана прямо оттуда вызовом процедуры ПЗУ PR_STR_1 (адрес 2036H-8246).

Третья возможность - самая мощная и именно она применяется в большинстве случаев в игровых, прикладных и системных программах.

У Вас может быть целый набор из N различных сообщений, хранящихся в виде таблицы. И Вы, допустим, хотите напечатать k-ое сообщение. Тогда можете действовать следующим образом:

- установите в аккумуляторе число k-1:

- установите в регистровой паре DE адрес, указывающий на байт, находящийся перед первым байтом самого первого сообщения из Вашей таблицы сообщений. Имейте в виду, что этот байт должен быть больше или равен 80H, т.е. старший (седьмой) бит в этом числе должен быть включен (он явится маркером начала текстового сообщения);

- вызовите процедуру PO_MSG (0C0AH-3082) и Ваше сообщение будет напечатано на экране.

Впрочем, у этого метода есть ряд ограничений и требований. Их необходимо также иметь в виду при программировании:

- недопустимо использование графических символов или токенов ключевых слов БЕЙСИКа, т.е. коды печатаемых символов должны быть менее 128 (80H). Впрочем, можно ведь и поменять символьный набор, заменив на время символы ASCII на нужные вам графические шаблоны;

- во-вторых, Вам надо при заполнении таблицы сообщений сделать так, чтобы последний символ каждого сообщения имел включенный 7-ой бит, тем самым он будет служить маркером конца 1-го сообщения и компьютер всегда по номеру, заданному в аккумуляторе, найдет нужное Вам сообщение;

- в таблице не может быть пустых строк.

На что надо обратить внимание!

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

Итак, во-первых, если вам необходимо будет выдавать на экран символы блочной графики (коды с 80Н по 8FH) - эти символы расположены на цифровом ряду клавиатуры, - то коррумпируются (портятся) системные переменные, расположенные в адресах с 5С92Н (23698) по 5С99Н (23705).

Те, кто читал "Первые шаги в машинном коде", знают, что здесь хранятся две первые ячейки памяти встроенного калькулятора (из шести стандартных). Это ячейки M0 и M1. Почти во всех случаях вам эта порча безразлична, но если вы активно работаете с калькулятором и именно они Вам и нужны, то примите меры по сохранению их значений в другом месте, например на стеке или в других ячейках.

Во-вторых, при печати чисел мы довольно активно пользовались процедурой ПЗУ PRINT_FP, которая распечатывает содержимое вершины стека калькулятора, а она во время своей работы "портит" все шесть ячеек памяти калькулятора, т.е. все содержимое системной переменной MEMBOT с адреса 5С92Н (23698) по адрес 5CAFH (23727). Опять же для Вас это почти всегда безразлично, за исключением тех редких случаев, когда вы оставили там на хранение данные без присмотра.

А вот третий случай довольно часто встречается у тех, кто много работает со встроенным калькулятором. Дело в том, что в таблице системных переменных есть переменная под названием MEM, она расположена в адресе 5С68Н (23656) и занимает 2 байта. В ней хранится адрес, по которому расположена память калькулятора, т.е. адрес системной переменной MEMBOT. Если Вам достаточно тех шести ячеек памяти, которые есть стандартно, то нет проблем. А если же Вам их мало, то Вы создаете их побольше, для чего меняете адрес MEMBOT и, естественно, указание на нее, содержащееся в MEM. Это нормальная, часто встречающаяся операция. Так вот, после такой замены процедура PRINT_FP правильно работать не сможет.

Управляющие символы.

Набор символов "Спектрума" включает в себя стандартные символы ASCII - их коды с 20Н (32) по 7FH (127). Символы блочной графики, графики пользователя и токены ключевых слов БЕЙСИКа - коды с 80Н (128) по FFH (255). Это оставляет вне поля нашего зрения символы с 0 по 1FH (31). Что же расположено там?

А здесь расположены так называемые управляющие символы, их еще называют управляющими кодами (символами их называть и не хочется, ведь их нельзя напечатать и увидеть). Хоть сами они на экране и не воспроизводятся, зато с их помощью можно управлять процессом печати тех символов, которые могут быть напечатаны.

Мы начнем с управляющего кода 16H. Он называется AT_CONTROL и определяет координаты позиции печати так же, как и оператор AT в БЕЙСИКе.

Задействуются управляющие коды, как и любые другие символы, путем выставления этого кода в аккумуляторе процессора и подачей команды RST 10H. Это означает, что они могут быть как бы "напечатаны" вместе с прочими символами и могут быть включены в длинные символьные строки.

БЕЙСИКовский оператор AT требует после себя указания двух параметров -координат позиции печати по вертикали и горизонтали. Управляющий код AT требует то же самое. Оба параметра вводятся тем же способом - вводом параметра в аккумулятор и выдачей команды RST 10H.

Приведенная распечатка показывает машиннокодовый аналог оператора БЕЙСИКа PRINT AT 5,1; .

DEMO АТ 5 4

3E16

LD A, 16H

D7

RST 10H

; PRINT

AT ...

3Е05

LD A,05

D7

RST 10H

; 5

3E04

LD A,04

D7

RST 10H

; 4

Не имеет

никакого

значения

между тремя вышеприведенными командами RST 10H. "Спектрум", если выдал управляющий код 10H, далее всегда будет помнить, что два ближайших числа, проходящих через RST 10H, являются параметрами управляющего кода AT_CONTROL.

Более часто этот управляющий код находит применение, когда речь идет не о печати в фиксированной позиции, а в позиции, заданной программными переменными. Ниже показан машиннокодовый аналог команды PRINT AT D, Е (здесь D и Е - содержимое соответствующих регистров процессора.)

DEMO AT D E

ЗЕ16

LD A,16H

D7

RST 10H

; PRINT

LD A,D

DT

RST 10H

; D, ..

7B

LD A,E

D7

RST 10H

; E. ..

Следующий управляющий код, который мы рассмотрим - это код 17Н. Он называется TAB_CONTROL - код управления табуляцией. До некоторой степени он тоже аналогичен оператору БЕЙСИКа TAB и указывает на номер позиции печати в текущей строке.

За ним также следуют 2 параметра (это не ошибка - именно 2 параметра, хотя БЕЙСИКовский опыт учит, что для позиции печати достаточно и одного). Дело в том, что первый параметр - это младший байт координаты позиции печати, а второй параметр - ее старший байт. Поскольку экран "Спектрума" имеет всего лишь 32 символа по ширине, сразу и не понятно, зачем еще нужен какой-то старший байт? Но дело в том, что печать ведь может идти не только на экран. А если на принтер? Да, ZX-принтер тоже имеет только 32 символа в строке, но ведь возможна печать и на широкий матричный принтер, через интерфейс. Внимательный читатель может спросить, где мы видели принтер, печатающий в строку более 255 символов, но это уже вопрос риторический. Неважно, есть он или нет, но возможность работы с ним в компьютере предусмотрена. Более того, понятие "печать", как способ выдачи информации, может предусматривать не только стандартные каналы типа экрана или принтера. Возможны ведь и пользовательские каналы типа файлов на диске или в оперативной памяти, в которых запись может иметь и десятки тысяч символов в строке.

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

Дело в том, что когда Вы задаете параметр TAB, компьютер берет из него остаток от деления на 32, а старший байт кратен 256 и, естественно, кратен 32, поэтому его содержимое влияние при печати на экран и не оказывает.

Нижеприведенная процедура показывает управляющий код TAB_CONTROL в действии. Первый параметр предполагается переменным и берется из регистра E. Выдавая второй параметр, мы обнулили его, использовав для этого обнуление аккумулятора через XOR A, но раз этот байт роли не играет, можно было XOR A и не давать, а отправить в этот параметр то, что было в аккумуляторе к этому моменту, неважно, что это было.

DEMO TAB_E

3E17 LD A,17

D7 RST 10H ; PRINT TAB...

7В LD A,E

D7 RST 10H ; Е....

AF XOR A

D7 RST 10H ; 0 ...

Код CHR 6 называется COMMA_CONTROL и выполняет то же, что и запятая оператора PRINT. Код подается точно так же, как и прочие, введением числа 6 в аккумулятор и выдачей его через RST 10H. В результате его действия в качестве позиции печати устанавливается 0 или 15, в зависимости от того, в какой половине экрана печаталось последнее знакоместо.

Код 0DH (13) - аналогичен ENTER. Выдается так же и обеспечивает прекращение печати в текущей строке и переход в начало следующей.

Код 08 - называется BACKSPACE_ CONTROL, он выполняет смещение позиции печати на одно знакоместо влево.

Команда процессора RST 10H -довольно гибкая и имеет самое разнообразное действие. С ее помощью можно не только управлять позицией печати символов на экране, но и управлять цветами того, что Вы воспроизводите, т.е. выдавать коды цветовых атрибутов. Выполняется это точно также путем предварительной установки в аккумуляторе управлявшего кода и передачей его, а затем передачей параметра. Мы не будем подробно останавливаться на цветовых атрибутах и привели их в Таблице 1.

Таблица 1.

Управляющий код

Параметры

Комментарии

06 COMMA CONWR

-

08 BACKSPACE

-

0D ENTER

-

10 INK_CONTROL

00-черный

Параметр 08 (транспарантный5)

11 PAPER_CONTR

01 -синий

означает, что цвет печати не

02 -красный

устанавливается, а берется тот,

03-пурпурн.

который уже есть в данной

04- зеленый

позиции печати. Параметр 09

05-голубой

(контрастный) устанавливает цвет

06 -желтый

INK или PAPER контрастным к уже

07-белый

существующему в данной позиции

08 -транспарантный

противоположному цвету.

09 -контрастный

12 FLASH CONTROL

00 - выключен

13 BRIGHT_CONTR

01 -включен

08 - транспарантный

См. выше.

14 INVERSE CONTR

00- выключен

15 OVER CONTROL

01-включен

16 AT CONTROL

17 TAB_CONTROL

Строка, столбец. Младший байт, старший

При выдаче на экран старший байт может быть любым. Можете,

байт.

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

Пример применения кодов управления цветовыми атрибутами показывает, как выполняется печать красной звездочки на желтом фоне. Обратите внимание на то, что установленные таким способом цветовые атрибуты остаются действующими до того, как

будут изменены или до окончания действия оператора БЕЙСИКа, из которого вызывалась

данная

процедура в машинных кодах

3E10

LD A,10H

D7

RST 10H

; PRINT INK...

3E02

LD A, 02

D7

RST 10H

; 2; ....

5E11

LD A,11H

D7

RST 10H

; PAPER...

3E06

LD A, 06

D7

RST 10H

; 6;....

3E2A

LD A, 2A

D7

RST 10H

; "*";

Другие приемы управления позицией и цветом печати.

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

PRINT AT B,C (где B и C -содержимое одноименных регистров процессора) может быть выполнено вызовом процедуры АТ_B_C, находящейся по адресу 0A9BH (2715).

PRINT TAB A (где A - содержимое аккумулятора) выполнимо вызовом процедуры ТАВ_А (0AC3H=2755).

Управляющий код 06 (COMMA_CONTROL) эмулируется вызовом PO_COMMA (0A5FH=2655).

Эти три приема действуют не только на канал "S", но и на канал "K", т.е. с их помощью можно печатать информацию и в INPUT-строке.

У Вас есть также достаточно простой способ управлять цветовыми атрибутами INK, PAPER, BRIGHT, FLASH. Все, что для этого требуется - внести изменения в системную переменную ATTR_T (5C8FH = 23695), отвечающую за статус временных атрибутов экрана, эта системная переменная имеет следующую раскладку:

Биты 0...2 - цвет INK (от 0 до 7)

Биты 3...5 - PAPER (от 0 до 7)

Бит 6 - статус BRIGHT (0 или 1)

Бит 7 - статус FLASH (0 или 1)

Все, что требуется для установки нужных комбинации цвета - это заслать в эту системную переменную число, определяемое по формуле:

128*F + 64*B + 8*P + 1, где:

- F - статус FLASH:

- В - статус BRIGHT;

- P - номер цвета PAPER;

- I - номер цвета INK.

Если же Вы хотите, чтобы какие-то цветовые атрибута были транспарантными, системной переменной ATTR_T Вам уже недостаточно и надо воспользоваться системной переменной MASK_T (5С90Н = 23696). Ее раскладка точно та же, что и у ATTR_T. Биты, соответствующие атрибуту, который Вы хотите сделать транспарантным, надо включить.

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




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Paradox 2000 - отчет Касика с поездки на Paradox'2000.
new warez - свежий wArЫz: lamergy 5,6,best view 2.12.
Глюк - O глюках в ZXZip & ZXUnzip и CDos'e.
dihalt 2011 ay music review - обзор AY музыки с DiHalt'2011.
Четыре килобайта - О тематических выпусках Оптрона: Железо и кодинг.

В этот день...   21 ноября