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

Все статьи

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

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

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

mov r0,r1

		Если r1 = 100, то теперь r0 также = 100, поняли?

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

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

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

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

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

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

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

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

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

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

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

;;--- НАЧАЛО КОДА ---;;
@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 будет посвящён спрайтам.

2002-2013 (c) wasm.ru