GBA ASM - День 4: Обработка нажатий на клавиши

Дата публикации 2 авг 2003

GBA ASM - День 4: Обработка нажатий на клавиши — Архив WASM.RU

Некоторая информация об инструкциях MOV и LDR.

Эта секция посвящена людям, которых всё ещё интересует разница между инструкциями MOV и LDR. У них у обоих одно и то же назначение - перемещать данные, правильно? Разница состоит в том, что инструкция MOV в основном используется для перемещения содержимого одного регистра в другой примерно вот таким образом:

Код (Text):
  1.  
  2. mov r0,r1
  3.  
  4.         Если r1 = 100, то теперь r0 также = 100, поняли?

С помощью MOV вы можете перемещать в регистры числа, но они должны умещаться в 8 бит (1 байт). Просто используйте MOV для копирования регистров и LDR для загрузки в регистры значений примерно вот так:

Код (Text):
  1.  
  2. ldr r0,=0x06000000
  3.    
  4.         LDR загружает регистр 32-х битным (4 байта) числом.

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

О клавиатуре GBA.

Ок, я допускаю, что настоящей клавиатуры в GBA нет!

У GBA есть 10 клавиш: ВВЕРХ, ВНИЗ, ВЛЕВО, ВПРАВО, A, B, START, SELECT, L и R. Когда вы нажимаете клавишу, очищается соответствующий бит. Регистр клавиатуры находится по адресу 0x04000130. В Кeypad.h, который вы найдёте здесь. В нём определены следующие значения:

Код (Text):
  1.  
  2. KEY_A 1
  3. KEY_B 2
  4. KEY_SELECT 4
  5. KEY_START 8
  6. KEY_RIGHT 16
  7. KEY_LEFT 32
  8. KEY_UP 64
  9. KEY_DOWN 128
  10. KEY_R 256
  11. KEY_L 512
  12. KEYS 0x04000130

Чтобы проверить, нажата ли клавиша, вы должны сделать следующее:

Код (Text):
  1.  
  2. ldr r3,=KEYS     ; Эти две строки загружают в регистр r4
  3. ldr r4,[r3]      ; содержимое ячейки памяти с состоянием клавиш
  4. ands r4,r4,#KEY_A  ; Эта строка делает операцию AND над регистром клавиш и
  5.                    ; кнопкой A. Обратите внимание, что у инструкции AND есть
  6.                    ; суффик 'S', который уставновит флаги результата операции

Если клавиша A нажата, то следующая инструкция с суффиксом EQ выполнится ТОЛЬКО, если клавиша A нажата. Я думаю, что теперь очевидно, как протестировать другие клавиши.

Поэтому далее следует небольшая программа, иллюстрирующая обработку нажатия на клавиши.

Код (Text):
  1.  
  2. ;;--- НАЧАЛО КОДА ---;;
  3. @include screen.h      
  4. @include keypad.h     ; убедитесь, что эти файлы находятся в папке с Goldroad
  5. @textarea
  6.  
  7. ldr r4,=REG_DISPCNT
  8. ldr r5,=(MODE_3|BG2_ENABLE)
  9. str r5,[r4]
  10.  
  11. ; Наша обычная процедура установки режима экрана 3.
  12.  
  13. ldr r7,=VRAM+2410
  14.  
  15. ; r7 указывает на видеопамять в позиции 10,10.
  16.  
  17. start   ; метка под названием старт, вы уже должны отличать метки от других
  18.         ; инструкций, так что это последний раз, когда объясняю подобные вещи.
  19.  
  20.  
  21. ldr r8,=KEYS    ; загружает в r8 адрес ячейки памяти с состоянием клавиш
  22. ldr r6,[r8]   ; получает её значение
  23. ands r6,r6,#KEY_UP   ; бит и значение темперь должны быть равны (EQual),
  24.                      ; если клавиша нажата и не равны, если клавиша не нажата.
  25.  
  26. ldr r6,=0x00FF00FF  ; загружает две (2) красные точки в r6
  27. ldrne r6,=0x00000000  ; если результатом операции было неравенство, помещаем
  28.                       ; две чёрные точки в r6
  29.  
  30. str r6,[r7]      ; помещаем пиксели, находящиеся в r6, в r7 (r7 указывает на
  31.                  ; видеопамять 10,10)
  32. b start     ; переходим обратно на начало
  33. ;;--- ЗАКАНЧИВАЕМ КОПИРОВАТЬ ---;;

Сассемблируйте этот файл!

ПРИМЕЧАНИЕ: чтобы получить результат от этой программы, вы должны держать клавишу нажатой.

Вы поняли, что проверка нажатий на клавиши очень важно?

День 5 будет посвящён спрайтам. © Mike H, пер. Aquila


0 1.222
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532