Autore Topic: Come Leggere La Key Matrix  (Letto 2748 volte)

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Come Leggere La Key Matrix
« il: 27 Dicembre 2004, 02:45:44 »
 La keymatrix del C64 permette di leggere la tastiera anche quando gli interrupt sono disattivati o peggio si sta lavorando senza il kernal ($01=#$35)
Ad esempio negli intro si usa spesso qualcosa del genere
Codice: [Seleziona]
LDA $DC01
cmp #$EF
bne loop
JMP depack_routine
per "sentire" lo spazio, perche' una normale JSR $FFE4 non avrebbe effetti se non quelli di crashare.
Questo piccolo prg di esempio mostra come vengono letti i valori di ogni tasto e come sfruttarlo per delle key combinations. A voi scoprire come si esce dal programma :)

Usare dasm. Se volete c'e la mia versione modificata, che capisce anche la sintassi C64ASM, piu' altre modifiche spiegate nel "whatsnew.txt",  QUA

Codice: [Seleziona]
; visualize key matrix scancodes
; iAN CooG/HokutoForce
;------------------------------------------------------
rowTblLo = $ECF0
scrptr   = $fc

        org $0801
        .word eop
        .word 7102
        .byte $9e
        .byte "2059"
eop    
        .byte 0
;------------------------------------------------------
        lda #$00
        sta scrptr
        lda #$04
        sta scrptr+1
        jsr $e544
;------------------------------------------------------
loop
        ldx #$00

mainloop
      ; set Keymatrix row
        lda table,x
        sta $dc00
      ; now read the column
        lda $dc01
      ; 8 bytes array for checking keycombos etc
        sta $0400,x
      ;print hex values on screen on each row
        jsr printv
        inx
        cpx #$08
        bne mainloop

      ;now check for exit keycombo
        dex
checkx
        lda $0400,x
        cmp exittable,x
        bne loop
        dex
        bpl checkx
      ; all ok, exit
        jsr $e544
      ; clean keyboard buffer
        lda #0
        sta $c6
        rts
;------------------------------------------------------
printv
        sta $fb; save X and A
        txa
        pha

      ; get right address for every row
        lda rowTblHi,x
        sta scrptr+1
        inx
        lda rowTblLo,x
        sta scrptr

        lda $fb  ;get back A & convert
        jsr dexit

        ldy #$01
        sta (scrptr),y
        txa
        dey
        sta (scrptr),y

        pla
        tax
        lda $fb
        rts
;------------------------------------------------------
dexit  ; return hex number in screencodes split in XA
      ; $1f -> X=$31 '1' A=$0f 'F'
        pha
        lsr
        lsr
        lsr
        lsr
        jsr check
        tax
next    
        pla
        and #$0f
        jsr check
        rts
check
        cmp #$0a
        bcs hex
        adc #$30
        rts
hex    
        sbc #$09
        rts
;------------------------------------------------------
table
        .byte $fe; 2^0 eor ff
        .byte $fd; 2^1 eor ff
        .byte $fb; 2^2 eor ff
        .byte $f7; 2^3 eor ff
        .byte $ef; 2^4 eor ff
        .byte $df; 2^5 eor ff
        .byte $bf; 2^6 eor ff
        .byte $7f; 2^7 eor ff

exittable
        .byte $ff; try to find
        .byte $bf; the exit
        .byte $3f; keycombo :)
        .byte $ff;
        .byte $fd;
        .byte $ff;
        .byte $ff;
        .byte $df;
;------------------------------------------------------
rowTblHi
N   SET 1
    REPEAT 8
    .byte #>($400+N*40)
N   SET N+1
    REPEND
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Come Leggere La Key Matrix
« Risposta #1 il: 27 Dicembre 2004, 12:22:58 »
 
Citazione
A voi scoprire come si esce dal programma

Disassemblando un attimo il programma e osservando la keymatrix,dovrebbe essere la combinazione C= I T X E.
Però ho provato il programma sul VICE 1.14 e non riesce a leggere tutti questi tasti in contemporanea,mentre ad esempio, sostituendo il 3F con 7F (quindi premendo solo X invece che T e X) funziona.

Forse il problema è dovuto al fatto che la locazione $dc01 viene usata anche per controllare il joystick in porta 1,e quindi alcune combinazioni di tasti non sono consentite.

Bye

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Come Leggere La Key Matrix
« Risposta #2 il: 27 Dicembre 2004, 22:35:45 »
 Strano. Io con Vice 1.15 e CCS2.0 premo EXIT e poi il tasto ctrl (che funge da C=) ed esce correttamente. So che c'e' un limite di tasti premibili contemporaneamente su PC, ma avendolo provato proprio in entrambi gli emulatori non credevo desse problemi altrove. Vabbe' pazienza, basta che si sia capito il resto del programma :)

Rinnovo l'invito a postare codice, qualunque cosa sia, l'importante e' confrontarsi per migliorarsi. :)
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Come Leggere La Key Matrix
« Risposta #3 il: 29 Dicembre 2004, 11:00:23 »
 Allora,con tutta probabilità è un problema di emulatore. :)