Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: iAN CooG - 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
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 (http://iancoog.altervista.org/C/dasm2.20.07_fix.rar)
; 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
-
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
-
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. :)
-
Allora,con tutta probabilità è un problema di emulatore. :)