I want to compare keystrokes in assembly (CCS64). If I type in the same key in a row I want to do something example: A A = do this
but if I type this: A B = do something else
Suggestions?
I prepared an example to you just like you've wanted. If you press same keys in a row twice, border color changes to red, otherwise stays black.
Warning! This example uses kernal
routines. There is nothing wrong with that. But there is also a lower level way to do this without using $ffd2
(Output Vector, chrout) and $ffe4
(Get From Keyboad) kernal calls. But since it is much more complicated to understand, I prefered this example.
If you want to know what is happening behind the scenes (kernal calls), you can easily trace the kernal ROM codes from AAY64
documentation. Here is the links:
Main AAY Page: http://www.the-dreams.de/aay.html
AAY64 Online HTML Version: http://unusedino.de/ec64/technical/aay/c64/
Kernal ROM Listing: http://unusedino.de/ec64/technical/aay/c64/krnromma.htm
$ffd2
(Output Vector, chrout): http://unusedino.de/ec64/technical/aay/c64/romffd2.htm
$ffe4
(Get From Keyboad): http://unusedino.de/ec64/technical/aay/c64/romffe4.htm
You can browse deeper by pressing links on the opcodes and addresses.
Here goes the example code. You can compile this code using ACME Crossassembler
which you can find here -> 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With