Программирование в машинных кодах и на языке ассемблера 1993 г.

Разбор программ в машинных кодах - вывод данных на экран из машинного кода.


В части 1 мы уже говорили о том, что для печати символов на экране используется команда процессора RST 010 (код D7 HEX) . Она вызывает исполнение системной процедуры из ПЗУ, которая и выполнит печать нужного Вам символа. Правда, прежде, чем обращаться к RST010, Вы должны предусмотреть, чтобы код того символа, который Вы хотите напечатать, был помещен в аккумулятор. Коды всех символов, управляющих кодов, символов графики пользователя, токенов ключевых слов Вы можете найти в "Справочнике ..." (ч. 3, табл . 1) .

Для того, чтобы выполнить печать, надо предварительно решить три вопроса:

- что печатать (какой символ, найти его код) ;

- как печатать (каким цветом, на каком фоне);

- где печатать;

Вы знаете, что экран "Спектрума" имеет 24 строки по 32 позиции, причем нижние две строки являются системным окном для вывода сообщений от операционной системы и печать в этих строках требует специальных ухищрений, а лучше пока там не печатать .

Все эти вопросы решаются помещением в аккумулятор нужного кода и вызовом RST 010.

Рассмотрим конкретный пример. Допустим, Вы хотите напечатать в центре экрана фразу "ZX-Spectrum", причем выполнить ее желтым цветом по синему фону.

Это значит, что позиция начала печати должна быть AT 11,10 -двенадцатая строка сверху ( с учетом нулевой ) и одиннадцатая колонка слева.

Цветовые коды должны быть установлены: INK = 6 ( желтые буквы) ; PAPER = 1 ( синий фон) .

Но прежде, чем начинать печать на экране, надо открыть канал экрана и очистить экран.

Канал открывается вызовом системной процедуры ПЗУ

"CHAN_OPEN", находящейся по адресу 1601, а очистка экрана -процедурой "Clear LINES", находящейся по адресу 0Е44.

6502

3E02

LD

A,02

6592

CD0116

CALL

1601

6595

0618

LD

B, 18

6597

CD4 4 0E

CALL

0E4 4

659A

3E16

LD

A,16

65 9C

D7

RST

10

65 9D

3E0B

LD

A, 0B

65 9F

D7

RST

10

65A0

3E0A

LD

A, 0A

65A2

D7

RST

10

65A3

3E11

LD

A,11

65A5

D7

RST

10

65A6

3E10

LD

A,01

65A8

D7

RST

10

65A9

3E10

LD

A,01

65AB

D7

RST

10

65AC

3E0 6

LD

A,0 6

65AE

D7

RST

10

65AF

3E5A

LD

A, 5A

65B1

D7

RST

10

65B2

3E5 8

LD

A,58

65B4

D7

RST

10

65B5

3E2D

LD

A,2D

65B7

D7

RST

10

65B8

3E7 3

LD

A,7 3

65BA

D7

RST

10

65BB

3E7 0

LD

A,7 0

65BD

D7

RST

10

65BE

3E65

LD

A,65

65C0

D7

RST

10

65C1

3E63

LD

A,63

65C3

D7

RST

10

65C4

3E7 4

LD

A,7 4

Открываем канал "S"

Количество очищаемых строк (2 4DEC) Очистка 24-х строк

В акк-р помещаем управл. код AT за которым пойдут координаты позиции печати

Вывод кода AT

Установка номера строки (11)

Ввод номера строки

Установка номера столбца

Ввод номера столбца

Установка кода PAPER

Ввод кода PAPER

Установка цвета фона

Ввод цвета фона (синий = 1)

Установка кода INK

Ввод кода INK

Установка цвета символов

Ввод цвета символов (желтый = 6)

Установка кода буквы Z

Печать буквы "Z"

Установка кода буквы "X"

Печать буквы "X"

Установка кода знака "-"

Печать знака "-"

Установка кода буквы "s"

Печать знака "s"

Установка кода буквы "p"

Печать буквы "p"

Установка кода буквы "e"

Печать буквы "e"

Установка кода буквы "с"

Печать буквы "с"

Установка кода буквы "t"

АДРЕС

МАШ.КОД

МНЕМОНИКА

65С6

D7

RST

10

65С7

3E72

LD

A, 72

65C9

D7

RST

10

65CA

3E7 5

LD

A, 75

65CC

D7

RST

10

65CD

3E6D

LD

A, 6D

65CF

D7

RST

10

65D0

C9

RET

КОММЕНТАРИЙ печать буквы "t" Установка кода буквы "r" Печать буквы "r" Установка кода буквы "u" Печать буквы "u" Установка кода буквы "m" Печать буквы "m" Возврат

Запускается данная процедура RANDOMIZE USR 2 6000.

Теперь мы можем поэкспериментировать с кодами управления печатью. Вы, конечно, знаете, какую роль играет разделитель <,> (ЗАПЯТАЯ) в оператре БЕЙСИКа PRINT. Она вызывает печать того, что за ней стоит на другой половине экрана. Код этого управляющего символа 06. Попробуйте заменить по адресу 65B6 код 2D (знак минус) на код 06 и снова запустить процедуру RANDOMIZE USR 26000.

Теперь попробуйте поставить туда же код 0D (ENTER, он же СR - CARRIDGE RETURN = ВОЗВРАТ КАРЕТКИ, он же "КОНЕЦ СТРОКИ") и опять стартуйте процедуру.

Если все, что Вы сделали, выглядит для Вас понятным, но достаточно скучным, то отметим, что в ПЗУ "Спектрума" есть и более мощная процедура для печати. Она позволяет печатать сразу целые строки ("стринги"), называется PR-STRING и находится по адресу 2 03С. Это процедура более высокого уровня, чем RST 10 и при своей работе использует обращения к RST 10, как к подпрограмме .

Чтобы использовать эту процедуру, надо в регистр DE загрузить адрес, в котором начинается тот текст, котрый Вы хотите выдать на печать (с управляющими кодами AT, TAB, INK, PAPER и др.) . Длина этой строки помещается в пару BC, а вызывается процедура CALL 2 03C.

Для справки мы даем здесь текст этой процедуры.

АДРЕС МАШ.КОД МНЕМОНИКА КОММЕНТАРИЙ

2 03С 78 LD A, B Это проверка BC на 0, т. е. напе-

203D B1 OR C чатана вс строка или нет

DEC BC Уменьшение счетчика на единицу.

RET Z Если в счетчике был 0, т.е. вся

строка напечатана, то выход. LD A, (DE) Загрузка в акк-р очередного

символа из Вашей строки. INC DE Переход к очередному символу.

RST 10 Печать символов.

JR 203C Переход для повтора.

2 03E 0B 2 03F C8

2 040 1A

2041

13

2042

D7

2043

18F7

Давайте с помощью этой процедуры распечатаем ту же фразу ZX-spectrum с теми же атрибутами в том же месте экрана.

Длина нашей строки = 11 печатных символов + 3 кода управления (AT, INK, PAPER) + 2 числа установки позиции начала печати + 2 числа установки цветовых атрибутов = 18 (12HEX) .

АДРЕС МАШ.КОД

КОММЕНТАРИИ

МНЕМОНИКА

6590

011200

LD

BC ,

0012

В BC загружается длина

6593

119A65

LD

DE ,

65 9A

В DE - адрес начала стр

6596

CD3C2 0

CALL 2

03C

Вызов процедуры печати

6599

C9

RET

Возврат в вызывающую пр

659A

16

"AT"

659B

0B

Строка 11.

65 9C

0A

Столбец 10.

65 9D

11

"PAPER"

659E

01

Цвет синий.

65 9F

10

"INK"

65A0

06

Цвет желтый.

65A1

5A

Z

65A2

58

X

65A3

2D

65A4

73

s

p

65A5

70

65A6

65

e

65A7

63

с

65A8

74

t

АДРЕС МАШ.КОД МНЕМОНИКА КОММЕНТАРИЙ

65A9 72 r

65AA 75 u

65AB 6D m




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Вести из Узов - бытовая жизнь студентов.
От редактора - завершена работа над новым номером газеты.
cafe2002 demos little review - замечания kq к демках с cafe2002.
Проходилка - прохождение игры Colobok.
Обратная связь - контакты редакции.

В этот день...   19 марта