home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of A1200
/
World_Of_A1200.iso
/
programs
/
develop
/
as65
/
demo
/
s1
/
tast_abfr.asm
< prev
next >
Wrap
Assembly Source File
|
1995-02-27
|
8KB
|
317 lines
;**************************************************************************
;
; Filename : TAST_ABFR.ASM
; ------------------------
;
; (c) 1990 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Tastaturabfrage
;
;
;**************************************************************************
MODUL_START set * ; Größe des Moduls berechnen
; =========================================================================
;
; Type : Hauptprg.
; : Wähltastatur abfragen
;
; Eingang : -------
;
; Ausgang : carry=1 Taste erkannt
;
; Register : Accu, X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================
wta_abfr lda akt_mb ; gibt die MB-Achse an, welche gesetzt wird
sta Wta_port ; aktuelle MB-Achse einschalten, set=0
; gedrückte Taste einlesen
; ------------------------
lda Wta_port ; Verbindung zu MA-Achsen laden
and #$FF^HTON ; Hörton-BIT ausblenden
sta wta_merk ; Zustand merken
eor #$ff ; entsprechender MA=0 wenn Verbindung vorhanden
and #%01110000 ; MB0-3 und PA7 ausblenden
beq nxt_mb ; keine Taste gedrückt, nächsten MB einstellen
lda wtast ; Taste noch gedrückt ?
beq wta_1 ; nein, direkt auswerten
; Tasten Repeat ermöglichen
; -------------------------
dec wta_repeat ; Repeat Counter runterzählen
bne wta_end ; kein Überlauf
dec wta_repeat+1 ; high Byte nachführen
bne wta_end ; noch nicht erreicht, Ende
; Taste entprellen
; ----------------
wta_1 lda #WTA_PR_TIM ; Timerwert laden
jsr task_delay ; Taste entprellen
lda Wta_port ; Zustand des Ports laden
and #$FF^HTON ; Hörton-BIT ausblenden
cmp wta_merk ; Zustand vor Entprellung,Taste noch gedrückt ?
beq wta_ber ; ja, Tastenwert berrechnen
; nächste MB-Achse einstellen
; ---------------------------
nxt_mb stz wtast ; Taste wurde losgelassen, keine Taste gedrückt
sec ; 1 nachschieben
ror akt_mb ; nächste MB-Achse einstellen
bcs wta_end ; nicht alle Achsen getestet
lda #MB4 ; MB4 einstellen, set=0
sta akt_mb
wta_end clc ; keine Taste erkannt
rts
; =========================================================================
;
; Type : Unterprg.
; : gedrückte Wähltaste berrechnen
;
; Eingang : Zustand MA/MB Port im Accu
; : zB.: Taste auf MA0 und MB0 = X1101110
;
; Ausgang : carry=1 Taste erkannt
; : Tastenwert 1-12 in "wtast"
;
; Register : Accu, X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================
wta_ber eor #$ff ; gesetzter Port =1
sta wtast ; Zustand des Ports ablegen
lda #01 ; Offset auf MA0/MB0, 1-12
ldx #3 ; Anzahl der MB
sec ; nur falls kein MA oder MB gefunden wird
wta_ber_0 ror wtast ; gesetzen MB ermitteln
bcs wta_ber_1 ; MB gefunden, set=0
adc #3 ; Offset pro MB
dex ; Anzahl der getesteten MB-1
bra wta_ber_0 ; nächsten MB testen
wta_ber_1 dex ; auf MA einstellen
bmi wta_ber_2 ; steht bereits auf MA
ror wtast ; MB ausblenden
bra wta_ber_1 ; alle MB ausblenden
wta_ber_2 ror wtast ; gesetzten MA ermitteln
bcs wta_ber_3 ; MA gefunden
inc a ; Offset auf MA
bra wta_ber_2 ; nächsten MA testen
; ---------------------------------------------------------------
; Tastenreihenfolge erzeugen : 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, #, *
; ---------------------------------------------------------------
wta_ber_3 tax ; Tastennr. 1-12 kopieren
cpx #10 ; ist es Taste 1-9
bcc wta_ber_4 ; ja, Taste ok
bne wta_ber_5 ; Taste ist "0" oder "#"
inx ; Taste ist "*", TW=11
inx
bra wta_ber_4
wta_ber_5 dex ; TW "0"=10, TW "#"=11
wta_ber_4 stx wtast ; gedrückte Taste zur Auswertung ablegen
stz wta_repeat ; WTasten Repeat aufziehen
lda #2
sta wta_repeat+1
txa ; Wähltaste im Accu
sec ; Taste erkannt
rts
; =========================================================================
;
; Funktion : Tasten in X/Y-Matrix abfragen
;
; Eingang : -------
;
; Ausgang : Offset auf Tastatur-Matrix der gedrückten Taste in "taste"
; : clc = keine Taste gedrückt
;
; Register : Accu, X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================
; ================
; X0 und X1 testen
; ================
tast_abfr lda akt_x ; aktuelle X-Achse
beq tast_1 ; X0 setzen
cmp #2 ; X0 und X1 schon getestet ?
bcs tast_2 ; ja, X2-E setzen
; X1 einschalten
; --------------
lda #$ce ; CB2=0 / CA2=1
sta Tout_1 ; X1 einschalten
bra get_y ; Y-Achsen testen
; X0 einschalten
; --------------
tast_1 lda #$ec ; CB2=1 / CA2=0
sta Tout_1 ; X0 einschalten
bra get_y ; Y-Achsen testen
; ================
; X2 bis XE testen
; ================
tast_2 lda #$ee ; CB2=1 / CA2=1
sta Tout_1 ; X0 und X1 ausschalten
lda akt_x ; aktuelle X-Achse laden
cmp #2 ; X2 testen ?
beq tast_03 ; ja, X2 einstellen
cmp #$0a ; XA testen ?
bne tast_3 ; nein, XA nicht einstellen
tast_03 ldx #%11111110 ; X2 bzw. XA einstellen
stx x_achse
; X2-X9 einschalten
; -----------------
tast_3 cmp #$0a ; X2-X9 schon getestet ?
bcs tast_4 ; ja, XA-XE testen
lda #00 ; XA-XE zurücksetzen
ora txen_rl23 ; Zustand TX-Enable und RL2/3 nicht verändern
sta Tout_3 ; X-Achse ausschalten, set=1
lda x_achse ; gibt die aktuelle X-Achse an
sta Tout_2 ; X-Achse einschalten, set=0
sta x2_9_merk ; Zustand X2-X9 laden, Display RS-Flag
bra get_y ; Y-Achsen testen
; XA-XE einschalten
; -----------------
tast_4 lda #$ff ; X2-X9 zurücksetzen
sta x2_9_merk ; Zustand X2-X9 laden, Display RS-Flag
sta Tout_2 ; X-Achse ausschalten, set=0
lda x_achse ; gibt die aktuelle X-Achse an
eor #$ff ; set=1
ora txen_rl23 ; Zustand TX-Enable und RL2/3 nicht verändern
sta Tout_3 ; X-Achse einschalten, set=1
; Y-Achsen einlesen
; -----------------
get_y lda Tin ; Y-Achsen einlesen
sta tast_merk ; Zustand merken
eor #$ff ; wenn Verbindung vorhanden, entspr. Y-Achse=0
beq nxt_x ; keine Taste gedrückt, nächste X-Achse einst.
lda taste ; Taste noch gedrückt ?
beq tast_5 ; nein, direkt auswerten
; Tasten Repeat ermöglichen
; -------------------------
dec key_repeat ; Repeat Counter runterzählen
bne tast_end ; kein Überlauf
dec key_repeat+1 ; high Byte nachführen
bne tast_end ; noch nicht erreicht, Ende
; Taste entprellen
; ----------------
tast_5 lda #TA_PR_TIM ; Timerwert laden
jsr task_delay ; Taste entprellen
lda x2_9_merk ; Zustand X2-X9 laden, Display RS-Flag
sta Tout_2 ; und entsprechend schalten
lda tast_merk ; Zustand vor Entprellung laden
cmp Tin ; ist Taste noch gedrückt ?
beq tast_ber ; Tastenwert berrechnen
; nächste X-Achse einstellen
; ---------------------------
nxt_x stz taste ; Taste wurde losgelassen, keine Taste gedrückt
stz tw ; Tastenwert löschen
inc akt_x ; nächste X-Achse testen
sec ; 1 nachschieben
rol x_achse ; nächste X-Achse einstellen
ldx akt_x ; aktuelle X-Achse laden
cpx #$10 ; alle Achsen getestet ?, und Port clr
bcc tast_end ; nein
stz akt_x ; X0 einstellen
tast_end clc ; keine Taste erkannt
rts
; =========================================================================
;
; Type : Unterprg.
; : Offset auf Tastaturtabelle in X/Y-Matrix berrechnen
;
; Eingang : Zustand Y-Port im Accu
; : aktuelle X-Achse in akt_x
;
; Ausgang : carry=1 Taste erkannt
; : Tastenwert 1-... in "taste"
;
; Register : Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================
tast_ber sta taste ; Zustand des Y-Ports ablegen
lda #01 ; Offset auf Tastaturtabelle, 1-...
ta_ber_0 lsr taste ; Y-Achse ermitteln
bcc ta_ber_1 ; Achse gefunden, set=0
clc
adc #MAX_X ; Offset pro Y-Achse
bra ta_ber_0 ; nächste Achse testen
ta_ber_1 stz key_repeat ; Tasten Repeat aufziehen
ldx #3
stx key_repeat+1
adc akt_x ; aktuelle X-Achse dazu
sta taste ; Tastenwert ablegen
sec ; Taste erkannt
rts
; --------------------------------------------------------------------------
HLP set *
_TAST_ABFR equ HLP-MODUL_START ; Größe des Moduls