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

Разбор программ в машинных кодах - управление программой от клавиатуры.


Это, без сомнения, тоже задача повседневной потребности. Сразу укажем на то, что существуют два различных метода опроса клавиатуры - один связан с приемом и анализом данных, поступающих от внешнего порта, а другой - с использованием системных переменных KSTATE или LASTK. Мы здесь рассмотрим оба метода, т.к. оба достаточно часто применяются в программах.

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

"P" - в пр а в о " Q" - в в е рх

"О" - влево "А" - вниз

"0" - выход из программы Для усложнения задачи введем еще клавишу "ПРОБЕЛ" в качестве переключателя режимов "РИСОВАНИЕ/СТИРАНИЕ".

Опрос Но,

HEX)

клавиатуры производится по внешнему порту 2 54 (FE поскольку адрес порта клавиатуры является двухбайтным

МЕТОД 1

числом, то FE - является младшим байтом адреса порта, а старший должен быть установлен предварительно в аккумуляторе.

Анализируются 5 младших битов. При этом если клавиша не нажата, то бит включен (в отличие от опроса Кемпстон-джойсти-ка). Поэтому, если ни одна клавиша не нажата, то должно бы выдаваться число 255, но оно не выдается, а выдается 191. Дело в том, что по 6-му биту анализируется состояние порта входа от магнитофона и если сигнал не поступает, то 6-ой бит выключен и поэтому Вы получаете 191, а не 255 (255-64 = 191) .

Адрес Метка Маш.код 6590 3E02

6592 CD 0116

6595 6597 65 9A 65 9C

659F 65A1

65A4

65A6

65A9

0618 CD440E 3E0F 325766

3E0B 325666

3E8F

CD4766

65AC REP 0E4F

65AE HERE 0 6FF

65B0 PAUSE 10 FE

65B2 0D

65B3 2 0F9

Мнемоника LD A, 02 CALL 1601

LD B,18 CALL 0E44 LD A, 0F LD (XPOS),A

LD A, 0B LD (YPOS) ,A

LD A, 8F

32 5A6 6 LD (SIM) ,A

CALL PRINT

LD C, 4 F

LD B,FF

DJNZ PAUSE

DEC C

JR NZ,HERE

Комментарий

Открываем канал для печати на экране

Очистка экрана

Установка начальной колонки печати в переменной XPOS

Установка начальной строки печати в YPOS Аккумулятор указывает на символ | (143) Код символа отправляется в переменную SYM. Вызов процедуры печати символа

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

Первый замедляющий цикл

3EEF DBFE CB4 7 C8

3E7F DBFE CB47 CC2C66

65C5 65C7 65С9 65CB 65CD 65CF 65D1 65D3 65D5 65D7 65D9 65DB 65DD 65DF 65E1

3EDF DBFE СВ4 7 2817 CB4F 2825 3EFD DBFE CB47 2 82F 3EFB DBFE CB47 2839 C3AC65

LD IN BIT JR BIT JR LD IN BIT JR LD IN BIT JR JP

CALL Z , TOGGL

A, DF A, (FE)

0,A

Z,RIGHT

1,A

Z,LEFT A, FD A, (FE) 0,A

Z,DOWN A, FB A, (FE) 0,A Z,UP RET

65E4 RIGHT 3A5766 LD A, (XPOS)

65E7 65E8

65EA

65ED

65F0

3C INC A

FE1F CP 1F

CAAC65 JP Z,REP

325766 LD (XPOS), A

CD4766 CALL PRINT

Мнемоника LD A, EF

65B5 65B7 65B9 65BB 65BC 65BE 65C0 65C2

IN BIT RET LD IN BIT

A, (FE) 0, A Z

A,7F A, (FE) 0,A

Указание на 5-ый полуряд Опрос 5-го полуряда Проверка клавиши "0" Выход в БЕЙСИК, если нажата Указание на 8-ой полуряд Опрос 8-го полуряда Проверка клавиши "ПРОБЕЛ" Вызов подпрограммы на переключение печатаемого символа для обеспечения стирания Указание на 6-й полуряд Опрос 6-го полуряда Проверка клавиши "P" Вправо, если нажата Проверка клавиши "O" Влево, если нажата Указание на 2-й полуряд Опрос 2-го полуряда Проверка клавиши "A" Вниз, если нажата Указание на 3-й полуряд Опрос 3-го полуряда Проверка клавиши "Q" Вверх, если нажата Если ни одна клавиша не нажата, то сначала в акк-р идет последний столбец печати и увеличивается на 1 Проверка на достижение правого края Если да, то возврат на опрос клавиатуры Если нет, то запомнить новый столбец и вызвать подпрограмму печати

65F9 65FA

65FC

65FF

6602 CD4766

6605 C3AC65

6608 DOWN 3A5666

3C

FE16 CAAC 6 5

325666

CD4766 C3AC65

3A5 666 3D

FE0 0

CAAC 6 5 325666

660B 660C

660E

6611

6614 6617

6 61A UP

661D

661E

6620

6623

6626 CD4766

6629 C3AC65

662C TOGGL 3E7F

Адрес Метка Маш.код Мнемоника 65F3 C3AC65 JP REP

65F6 LEFT 3A5766 LD A, (XPOS)

3D

FE0 0

CAAC 6 5 325766

DEC A CP 00

JP Z,REP

LD

(XPOS),A

CALL PRINT

JP REP

LD A, (YPOS)

INC A

CP 16

JP Z,REP

LD A, (YPOS)

CALL PRINT

JP REP

LD A,(YPOS)

DEC A

CP 00

JP Z,REP

LD A, (YPOS)

CALL PRINT

JP REP

LD A, 7F

Возврат на новый опрос клавиатуры

Ввод текущего столбца печати

Уменьшить его номер на 1

Проверка на достижение

левого края

Если да, то возврат на

опрос клавиатуры

Если нет, запомнить новый

столбец

Вызов подпрограммы печати Возврат на опрос клавиатуры В акк-р идет последняя строка печати и увеличивается на 1 Проверка на достижение нижнего края Если да, то возврат на опрос клавиатуры Если нет, то запомнить новую строку и вызвать подпрограмму печати Возврат на новый опрос клавиатуры

Ввод текущей строки печати

Уменьшить номер строки на 1

Проверка на достижение

верхнего края

Если да, то возврат на

опрос клавиатуры

Если нет, то запомнить

новую строку

Вызов подпрограммы печати Возврат на опрос клавиатуры Вновь проверяем нажатие клавиши "ПРОБЕЛ", т. к. она

A, (FE) 0,A

JR Z,TOGGL

3A5A6 6 LD A, (SYM)

FE8F CP 8F

2 8 06 JR Z, NEXT

3E8F LD A,8 F

32 5A6 6 LD (SYM) , A

RET

LD A, 8 0

6640 C9

6641 NEXT 3E8 0

6643

(SYM), A

RET

LD B,FF

DJNZ WAIT

LD DE, TEXT

32 5A6 6 LD

6646 C9

6647 PRINT 06FF

6 62E 6630

DBFE CB47

IN BIT

6632

6634

6637 6 63 9

663B 6 63D

2 8F8

6649 WAIT 10 FE 664B 115566

6 64E 6651

6654

С9

010600 LD BC,0006 CD3C2 0 CALL 203C

RET

6655

TEXT

16

DEFB

16

6656

YPOS

00

DEFB

00

6657

XPOS

00

DEFB

00

6658

10

DEFB

10

6659

01

DEFB

01

6 65А

SYM

0 0

DEFB

00

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

Чтобы переключить режим, надо сначала определить, какой символ установлен -синий квадрат (8F) или белый (80)

Поскольку был не синий, то устанавливаем в переменную SYM код синего квадрата Возврат

И, наоборот, раз был синий, то теперь устанавливаем белый квадрат ("СТИРАНИЕ") Возврат

Организация третьего замедляющего цикла Третий замедляющий цикл Регистр DE указывает на печатный текст Длина текста - 6 символов Вызов процедуры печати строки из ПЗУ Возврат в вызывающую процедуру

Символ управления печатью AT

Позиция печати по горизонт. Позиция печати по вертик. Управляющий символ INK Цвет символа - синий Код печатаемого символа.

МЕТОД 2

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

1. Использование системной переменной LAST K.

Эта системная переменная находится по адресу 23560. В ней запоминается код символа (токена) , находящегося на последней нажатой клавише. Причем, здесь есть различия, в зависимости от того, в каком клавиатурном регистре эта клавиша была нажата. Например, после нажатия клавиши "Р" там будет помещен код 7 0HEX (символ "р"), при нажатии CAPS SHIFT "P" - код 50HEX (символ "Р"), а при нажатии SYMB SHIFT "P" - код 22HEX (символ") .

Итак, первой особенностью является то, что одна и та же клавиша при использовании ее в разных режимах дает разные коды. поскольку в программе с равной вероятностью клавиатура может быть в режиме CAPS LOCK и в обычном режиме, то при определении перехода надо проверять оба кода. Например, для клавиши "Р" -переход на процедуру обработки движения вправо:

CP 70

JR Z,RIGHT

CP 50

JR Z,RIGHT

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

3. Если этот недостаток является существенным, то можно воспользоваться системной переменной KSTATE. Она занимает 8 байтов, начиная с адреса 23552 по 23559. Строго говоря, это не просто переменная, а это небольшая область памяти, в которой процедуры ПЗУ, отвечающие за опрос клавиатуры, организуют свои временные хранилища информации. Наиболее интересен для нас адрес клавиши, причем он хоть и "запоминается" там, но ненадолго, в отличие от переменной LASTK. Здесь Вы можете прочитать код последней нажатой клавиши, причем он хоть и "запоминается" там, но ненадолго. Он хранится пять циклов прерываний, а поскольку в "Спектруме" прерывания происходят каждую 1/50 секунды, то код хранится в этой ячейке примерно 0.1 секунды.

4. И, наконец, последнее замечание. Для того, чтобы системные процедуры ПЗУ могли производить опрос клавиатуры и устанавливать системные переменные LASTK и KSTATE, необходимо, чтобы маскируемое прерывание было разрешено. Надо убедиться в этом, а лучше принудительно перед опросом клавиатуры дать команду EI (код FB HEX) .




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Soundtrack - Представляем вам полный soundtrack к трилогии: "Брат", "Брат-2" и "Двоюродный брат".
Обратная связь - контакты редакции.
B.B.S. Новости - О работе B.B.S.'ок.
Humor - юмор.
Part 2 - Playing tips.

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