Как изменить поведение подпрограммы ядра SCNKEY в Commodore 64

Я пытаюсь реализовать элементы управления игрой, используя подпрограммы ядра в Commodore 64.

Ниже код работает с одним исключением. Каждое нажатие клавиши считается одним вводом. например: Нет эффекта, если вы продолжаете удерживать кнопку. Вы должны были отпустить и нажать снова для каждого движения. Как я могу изменить это поведение? Просто я хочу повторить действие, пока клавиша удерживается нажатой.

    GETIN  =  $FFE4
    SCNKEY =  $FF9F

keyScan:
    jsr SCNKEY  ;get key
    jsr GETIN   ;put key in A

    cmp #65
    beq left

    cmp #68
    beq right

    jmp keyScan 

person wizofwor    schedule 21.12.2016    source источник
comment
Отличный вопрос для retrocomputing.stackexchange.com   -  person Nick Westgate    schedule 22.12.2016


Ответы (2)


SCNKEY не подходит для игр, требующих одновременного ввода нескольких клавиш. Он не имеет состояния и просто возвращает клавишу, которая нажата сейчас — т. е. если нажаты две клавиши, она сообщит вам только об одной и официально не гарантирует, какая именно. Лучшее, что вы можете сделать, это считать, что клавиша все еще нажата, пока SCNKEY не сообщит либо о том, что что-то еще нажато, либо о том, что ничего не нажато, но шансы на то, будет ли второе одновременное нажатие клавиши проигнорировано или заменит первое, будут равными.

Если ваша программа не соответствует ортодоксальности, когда нажимается только клавиша «the», вам придется самостоятельно нажимать на аппаратное обеспечение. Codebase64 предлагает пример кода; моя сводная версия такова (правильно настроив CIA, хотя, вероятно, он уже будет правильно настроен):

  1. запишите байт в DC00, который содержит 0 для каждой строки, которую вы хотите одновременно сканировать;
  2. прочитать байт из DC01 и проверить верхние четыре бита, чтобы узнать, какие клавиши в выбранных строках были нажаты.

Общая подпрограмма должна проверять каждую строку по отдельности, чтобы избежать затенения — предположим, вы попросили прочитать строки 4 и 5 одновременно, сохранив от 0 до DC00 в битах 3 и 4, и в результате, который вы получили, был очищен верхний бит, вы бы не знали, были ли нажаты v, n или оба, только то, что по крайней мере один из них нажат.

См. В самом низу той же ссылки, что и выше, для таблицы строк и столбцов на англоязычной клавиатуре; они являются результатом физической раскладки клавиш, поэтому другие языки будут различаться так же, как и их клавиатуры. Если вы пишете игру и вас больше интересует расположение клавиш, чем их символы, вам не нужно беспокоиться о языке.

person Tommy    schedule 21.12.2016
comment
Это похоже на ZX Spectrum, где в некоторых играх использовалось затенение нескольких рядов, чтобы можно было управлять игрой одними и теми же клавишами на нескольких рядах клавиатуры (например, k/l работало так же, как o/p .. (не уверен насчет раскладки клавиатуры, может быть, я ошибаюсь. В некоторых играх, таких как арканоид, почти вся клавиатура работала либо слева, либо справа. : D - person Ped7g; 21.12.2016

Да, в C64 нет повтора клавиш (как в этом редакторе, в котором я сейчас печатаю).

Типичным способом решения этой проблемы является опрос ячейки памяти 197, в которой хранится текущий код сканирования клавиатуры. Чтобы попробовать, запустите: 10 printpeek(197):goto10

Вы можете видеть, что значение 197 изменяется и фактически сохраняет свое значение. Конечно, значение ключа не ascii и даже не petscii, но вы можете поэкспериментировать, чтобы найти код сканирования ключей, значения которых вас интересуют.

person Bo Zimmerman    schedule 25.08.2017