Сравните нажатия клавиш - сборка CCS64
Я хочу сравнить нажатия клавиш в сборке (CCS64). Если я наберу тот же ключ в строке, я хочу сделать что-то пример: A A = сделать это
но если я наберу это: A B = сделать что-то еще
Предложения?
2 ответа
Я подготовил вам пример, как вы и хотели. Если дважды нажать одни и те же клавиши подряд, цвет границы изменится на красный, в противном случае он останется черным.
Предупреждение! Этот пример использует kernal
Подпрограммы. Там нет ничего плохого. Но есть и низкоуровневый способ сделать это без использования $ffd2
(Выходной вектор, chrout) и $ffe4
(Get From Keyboad) Кернал звонит. Но так как это гораздо сложнее понять, я предпочел этот пример.
Если вы хотите знать, что происходит за кулисами (вызовы Kernal), вы можете легко отследить коды ПЗУ Kernel из AAY64
документация. Вот ссылки:
Главная страница AAY: http://www.the-dreams.de/aay.html
AAY64 Онлайн HTML-версия: http://unusedino.de/ec64/technical/aay/c64/
Список ПЗУ Kernal: http://unusedino.de/ec64/technical/aay/c64/krnromma.htm
$ffd2
(Выходной вектор, chrout): http://unusedino.de/ec64/technical/aay/c64/romffd2.htm
$ffe4
(Get From Keyboad): http://unusedino.de/ec64/technical/aay/c64/romffe4.htm
Вы можете просматривать глубже, нажимая ссылки на коды операций и адреса.
Вот пример кода. Вы можете скомпилировать этот код, используя ACME Crossassembler
который вы можете найти здесь -> http://www.esw-heim.tu-clausthal.de/~marco/smorbrod/acme/
!to "keycomp.prg",cbm
zpBuffer = $fa ; $fa-$fb are reserved for 2 bytes of key buffer
* = $0801
!byte $0c, $08, $00, $00, $9e, $32, $30, $36, $31, $00, $00, $00
* = $080d
; key buffer initialization
ldx #$f0 ; initialize key buffer
stx zpBuffer ; with two different
inx ; values to avoid instant
stx zpBuffer+1 ; match at the beginning
; border color initialization
lda #$00 ; set startup border color to black
sta $d020 ; which means "no match"
; main loop
mainloop
lda zpBuffer ; shift key buffer
sta zpBuffer+1 ; by one
readKey
jsr $ffe4 ; read key
beq readKey ; if no key pressed loop forever
jsr $ffd2 ; show key on the screen
sta zpBuffer ; store the key to key buffer
lda zpBuffer ; compare the last stored key
cmp zpBuffer+1 ; with the old key value
beq cmpMatch ; if there is a match jmp to cmpMatch
lda #$00 ; if two pressed keys are different
sta $d020 ; change border color to black
jmp cmpOut ; skip the other condition code block
cmpMatch
lda #$02 ; if there is a repeated key
sta $d020 ; change border color to red
cmpOut
jmp mainloop ; wait for the next key
Я не человек C64, но я знаю 6502 сборки. Вам нужно знать две вещи, чтобы достичь своей цели. Первое - выучить ассемблер 6502, если вы еще об этом не знаете. Эта страница имеет отличные ресурсы, например.
Второе - узнать об архитектуре C64 и ОС. На коммодорском языке он называется Kernal, быстрый Google должен указать вам правильное направление.
Но есть альтернатива. Вы всегда можете использовать cc65, превосходный бесплатный пакет, состоящий из почти совместимого с ISO компилятора C, ассемблера 6502, компоновщика и пары других 6502 связанных инструментов. Он поддерживает все популярные платформы 6502, включая Atari 8-bit, Apple II и, конечно же, Commodore 64. Он содержит большое количество документации, и люди в списке рассылки приятны и полезны. В качестве подсказки функции ввода с клавиатуры и вывода на экран определены в conio.h.