Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compare keystrokes - Assembly CCS64

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?

like image 618
Oakin Avatar asked Dec 17 '22 07:12

Oakin


1 Answers

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
like image 116
Emir Akaydın Avatar answered Jan 25 '23 15:01

Emir Akaydın