Итак, первое, что нам нужно знать о клавиатуре, что значение последней нажатой клавиши хранится в памяти по адресу 0x9000. В DCPU-16 Studio, конечно.
Получаем такой код, для чтения клавиши клавиатуры:
Code
; Работа с клавиатурой : kbinput SET Z, [0x9000] ; Устанавливаем в Z адрес значение последней нажатой клавиши SET A, Z ; Делаем копию адреса SET Z, [Z] ; Устанавливаем в Z значение в памяти по адресу, который был записан в Z (0x9000), т.е. нажатую клавишу SET [A], 0 ; Сбрасываем значение нажатой клавиши SET PC, POP ; В итоге, у нас в регистре Z записан код нажатой клавиши. Возвращаемся назад.
Значение нужно сбрасывать для того, чтобы знать - нажимал еще пользователь клавишу или нет. А то, если мы нажмем "А", то в памяти будет "А", пока не нажмем другую клавишу.
Теперь выведем на экран наш прочитанный символ:
Code
; Основоной код программы : main JSR kbinput ; Читаем символ с клавиатуры IFE Z, 0x0000 ; Если пользователь ничего не нажал... SET PC, main ; ... снова читаем символ с клавиатуры JSR transform ; Переводим код нажатой клавиши в составляющие ADD Z, 0xf000 ; Прибавляем цвет. Как это работает? SET [0x8000], Z ; Выводим Z... SET PC, main ;====================================
Вот, собственно и все, что нужно знать о чтении клавиши. Но мы пойдем дальше - выведем код символа на экран.
Немного теории:
Если у нас есть символ с кодом 0x2F, то как же нам перевести этот код в буквы "2" и "F"? Обратимся к математическим вычислениям. Для простоты объяснения, я в пример возьму десятичное число: 29.
Что бы нам получить, что младший разряд именно 9, мы узнаем остаток от деления на 10. Ведь, если делить на десять, то младший разряд и будет остатком от деления. В нашем случае же это 9. Вот и все. Почти.
Теперь нам нужно знать старший разряд. Чтобы упростить это дело, мы просто старший разряд переведем в младший разряд.
Сначала, вычитаем из нашего числа (29) остаток от деления на 10 (9), т.е. младший разряд. Получим число 20. Делим его на 10, и вот - наш старший разряд (2) уже стал младшим разрядом. Осталось узнать остаток от деления на 10.
Вы не поверите, но в шестнадцатеричной системы так же. Только вместо остатка от деления на 10, мы узнаем остаток от деления на 16 (0x10).
Итак, допустим, мы узнали, что младший разряд 0xF, а старший 0x2. Теперь нужно их преобразовать в коды символов. Делается это очень просто. Мы берем ASCII таблицу кодов. Смотрим, откуда начинается цифра 0. Затем, проверяем является ли наш разряд цифрой или бувкой? Если цифрой, то просто прибавляем к разряду код начала цифр. Т.е. Если у нас число 0x0 - прибавляем к нему код символа 0 (0x30), получаем символ-цифру.
Т.к. буквы идут не сразу после цифр, то если наш разряд оказался не цифрой, то проверяем его на "буквенность". Проделываем то же самое, как с цифрой, но с одним ухищрением. Т.к. буквенный разряд у нас уже равен 10-и в десятичной системе, то и прибавлять надо на десяток меньше, чем в сам код. А - начинается с 0x41. Вычитаем десятку (0xA) - получаем 0x37. Вот мы и получили коды символов разрядов. Вот функция, которая все это делает:
Code
; Подготовка регистров X и Y в ; нужный нам вид, а именно в вид кода :transform SET X, Z ; Регистр Z мы не трогаем, а работать будем с Х MOD X, 0x10 ; Остаток от деления на 0x10(16). В итоге, мы получим нужную нам цифру в значение. Прим. 0x2F станет 0xF SET A, X ; Копируем Х в А IFG 0xA, A ; Если Х - обычная цифра