Autore Topic: Routine Di Lettura Joy Port 1 E Tastiera  (Letto 2391 volte)

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Routine Di Lettura Joy Port 1 E Tastiera
« il: 07 Maggio 2011, 20:35:41 »
 Mentre scrivevo il codice del mini editor per Ollie's Follies mi sono scontrato con l'annoso problema della lettura del joystick in porta 1 e della tastiera.
Per chi non lo sapesse ricordo che entrambi sono collegati agli stessi pin del CIA1 e pertanto é difficile determinare chi dei due sia stato usato.
Ho cercato alcune soluzioni finché non ho trovato quella che vi propongo.
La routine va ovviamente chiamata con una JSR e restituisce il valore nell'accumulatore:
- se il valore é 0 significa che non é stato rilevato alcun input
- valori minori di $7f vanno intepretati come joy
- valori da $80 in poi vanno interpretati come tastiera
E' ovviamente impossibile leggere tastiera e joy contemporaneamente: il joy ha priorità e l'informazione della tastiera si perde.
La posto nella speranza che possa essere utile a qualcuno.

Codice: [Seleziona]
;**********************************************************
; Routine per leggere il valore della tastiera o il valore
; del Joy port 1 in modo indipendente
;**********************************************************
; $00  => Nessun input
; $00-$1f => Joystick
; $80-$ff => Tastiera

cia1pra  equ $dc00
cia1prb  equ $dc01
cia1ddra equ $dc02
cia1ddrb equ $dc03

GetKeyJoy
lda #$7F
sta GKJtemp
ldy #$ff
sty cia1ddra
lda #$00
sta cia1ddrb  
sec
GKJreadcia  
ldx GKJtemp  
sei
sty cia1pra; Leggo Joystick
lda cia1prb; ...
stx cia1pra; Leggo Keyboard
ldx cia1prb; ...
sty cia1pra; Rileggo Joystick
and cia1prb;  
cli
eor #$ff
bne GKJIsJoy
txa
eor #$ff
bne GKJIsKey  
ror GKJtemp
bcs GKJreadcia
GKJIsJoy
ldx #$00
stx $dc00
and #$ff; Rigenera flag
rts  
GKJIsKey  
lsr GKJtemp
iny
bcs GKJIsKey
sty GKJtemp
asl GKJtemp
asl GKJtemp
asl GKJtemp
ldy #$ff
GKJFindKey
iny
lsr
bcc GKJFindKey
tya
ora GKJtemp
eor #$80
bne GKJIsJoy

GKJtemp
.byte $00  

TheKaneB

  • Neo-iscritto
  • *
  • Post: 5
  • Gioco Preferito: Montezuma's Revenge
Routine Di Lettura Joy Port 1 E Tastiera
« Risposta #1 il: 07 Maggio 2011, 21:40:43 »
 Ottimo lavoro!

Una domanda: questa routine può funzionare sul C128 (in modalità 128 chiarmente)?
E sul C16?

Lo chiedo perchè avendo il monitor integrato tendo più ad usare questi per i miei esperimenti in Assembly, mentre sul C64 (in realtà uso il C128 in modalità 64 per lo scopo) dovrei caricare un Assembler a parte (uso Buddy 64, a mio parere fantastico!).

Ciao e grazie!
Software Failure: Guru Meditation

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Routine Di Lettura Joy Port 1 E Tastiera
« Risposta #2 il: 07 Maggio 2011, 22:50:28 »
 Nel C128 funziona, ovviamente mettendosi in bank 15 per poter accedere all'IO. Il C16 (come il +4) é completamente differente, in questo non funziona.

TheKaneB

  • Neo-iscritto
  • *
  • Post: 5
  • Gioco Preferito: Montezuma's Revenge
Routine Di Lettura Joy Port 1 E Tastiera
« Risposta #3 il: 07 Maggio 2011, 23:19:22 »
Citazione da: "Freshness79"
Nel C128 funziona, ovviamente mettendosi in bank 15 per poter accedere all'IO. Il C16 (come il +4) é completamente differente, in questo non funziona.
Bene :-)

Nel C16 bisogna cambiare solo qualche indirizzo oppure bisogna cambiare totalmente approccio? scusa per la domanda niubba, ma conosco pochissimo i modelli TED...
Software Failure: Guru Meditation

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Routine Di Lettura Joy Port 1 E Tastiera
« Risposta #4 il: 07 Maggio 2011, 23:49:39 »
 Sui modelli 16/+4 non so veramente nulla. Forse c'é qualcun altro del forum che può risponderti...

Elder0010

  • Utente
  • **
  • Post: 75
    • http://csdb.dk/scener/?id=22731
  • Gioco Preferito: Rampage
Routine Di Lettura Joy Port 1 E Tastiera
« Risposta #5 il: 08 Maggio 2011, 01:46:39 »
 grazie per aver condiviso questo lavoro! Mi tornerà utile senz'altro in qualche produzione!

 
lda #0 sta $d020 sta $d021