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
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; 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