GBA ASM - День 4: Обработка нажатий на клавиши — Архив WASM.RU
Некоторая информация об инструкциях MOV и LDR.
Эта секция посвящена людям, которых всё ещё интересует разница между инструкциями MOV и LDR. У них у обоих одно и то же назначение - перемещать данные, правильно? Разница состоит в том, что инструкция MOV в основном используется для перемещения содержимого одного регистра в другой примерно вот таким образом:
Код (Text):
mov r0,r1 Если r1 = 100, то теперь r0 также = 100, поняли?С помощью MOV вы можете перемещать в регистры числа, но они должны умещаться в 8 бит (1 байт). Просто используйте MOV для копирования регистров и LDR для загрузки в регистры значений примерно вот так:
Код (Text):
ldr r0,=0x06000000 LDR загружает регистр 32-х битным (4 байта) числом.Чтобы подвести итоги этой маленькой секции, я скажу: "LDR используется для загрузки регистров значением, а MOV - для копирования регистра в регистр".
О клавиатуре GBA.
Ок, я допускаю, что настоящей клавиатуры в GBA нет!
У GBA есть 10 клавиш: ВВЕРХ, ВНИЗ, ВЛЕВО, ВПРАВО, A, B, START, SELECT, L и R. Когда вы нажимаете клавишу, очищается соответствующий бит. Регистр клавиатуры находится по адресу 0x04000130. В Кeypad.h, который вы найдёте здесь. В нём определены следующие значения:
Код (Text):
KEY_A 1 KEY_B 2 KEY_SELECT 4 KEY_START 8 KEY_RIGHT 16 KEY_LEFT 32 KEY_UP 64 KEY_DOWN 128 KEY_R 256 KEY_L 512 KEYS 0x04000130Чтобы проверить, нажата ли клавиша, вы должны сделать следующее:
Код (Text):
ldr r3,=KEYS ; Эти две строки загружают в регистр r4 ldr r4,[r3] ; содержимое ячейки памяти с состоянием клавиш ands r4,r4,#KEY_A ; Эта строка делает операцию AND над регистром клавиш и ; кнопкой A. Обратите внимание, что у инструкции AND есть ; суффик 'S', который уставновит флаги результата операцииЕсли клавиша A нажата, то следующая инструкция с суффиксом EQ выполнится ТОЛЬКО, если клавиша A нажата. Я думаю, что теперь очевидно, как протестировать другие клавиши.
Поэтому далее следует небольшая программа, иллюстрирующая обработку нажатия на клавиши.
Код (Text):
;;--- НАЧАЛО КОДА ---;; @include screen.h @include keypad.h ; убедитесь, что эти файлы находятся в папке с Goldroad @textarea ldr r4,=REG_DISPCNT ldr r5,=(MODE_3|BG2_ENABLE) str r5,[r4] ; Наша обычная процедура установки режима экрана 3. ldr r7,=VRAM+2410 ; r7 указывает на видеопамять в позиции 10,10. start ; метка под названием старт, вы уже должны отличать метки от других ; инструкций, так что это последний раз, когда объясняю подобные вещи. ldr r8,=KEYS ; загружает в r8 адрес ячейки памяти с состоянием клавиш ldr r6,[r8] ; получает её значение ands r6,r6,#KEY_UP ; бит и значение темперь должны быть равны (EQual), ; если клавиша нажата и не равны, если клавиша не нажата. ldr r6,=0x00FF00FF ; загружает две (2) красные точки в r6 ldrne r6,=0x00000000 ; если результатом операции было неравенство, помещаем ; две чёрные точки в r6 str r6,[r7] ; помещаем пиксели, находящиеся в r6, в r7 (r7 указывает на ; видеопамять 10,10) b start ; переходим обратно на начало ;;--- ЗАКАНЧИВАЕМ КОПИРОВАТЬ ---;;Сассемблируйте этот файл!
ПРИМЕЧАНИЕ: чтобы получить результат от этой программы, вы должны держать клавишу нажатой.
Вы поняли, что проверка нажатий на клавиши очень важно?
День 5 будет посвящён спрайтам. © Mike H, пер. Aquila
GBA ASM - День 4: Обработка нажатий на клавиши
Дата публикации 2 авг 2003