Сравните нажатия клавиш - сборка 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.

Другие вопросы по тегам