home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / develop / as65 / demo / s1 / tast_abfr.asm < prev    next >
Assembly Source File  |  1995-02-27  |  8KB  |  317 lines

  1. ;**************************************************************************
  2. ;
  3. ; Filename : TAST_ABFR.ASM
  4. ; ------------------------
  5. ;
  6. ; (c) 1990 by Thomas Lehmann
  7. ;
  8. ;
  9. ; Jackophone V5.00
  10. ;
  11. ;
  12. ; Tastaturabfrage
  13. ;
  14. ;
  15. ;**************************************************************************
  16.  
  17. MODUL_START    set    *    ; Größe des Moduls berechnen
  18.  
  19. ; =========================================================================
  20. ;
  21. ; Type    : Hauptprg.
  22. ;    : Wähltastatur abfragen
  23. ;
  24. ; Eingang    : -------
  25. ;
  26. ; Ausgang    : carry=1 Taste erkannt
  27. ;
  28. ; Register    : Accu, X
  29. ;
  30. ; (c) by Thomas Lehmann Feb. 1990
  31. ;
  32. ; =========================================================================
  33.  
  34. wta_abfr    lda akt_mb    ; gibt die MB-Achse an, welche gesetzt wird
  35.     sta Wta_port    ; aktuelle MB-Achse einschalten, set=0
  36.  
  37.     ; gedrückte Taste einlesen
  38.     ; ------------------------
  39.     lda Wta_port    ; Verbindung zu MA-Achsen laden
  40.     and #$FF^HTON    ; Hörton-BIT ausblenden
  41.     sta wta_merk    ; Zustand merken
  42.     eor #$ff    ; entsprechender MA=0 wenn Verbindung vorhanden
  43.     and #%01110000    ; MB0-3 und PA7 ausblenden
  44.     beq nxt_mb    ; keine Taste gedrückt, nächsten MB einstellen
  45.  
  46.     lda wtast    ; Taste noch gedrückt ?
  47.     beq wta_1    ; nein, direkt auswerten
  48.  
  49.     ; Tasten Repeat ermöglichen
  50.     ; -------------------------
  51.     dec wta_repeat    ; Repeat Counter runterzählen
  52.     bne wta_end    ; kein Überlauf
  53.     dec wta_repeat+1    ; high Byte nachführen
  54.     bne wta_end    ; noch nicht erreicht, Ende
  55.  
  56.  
  57.     ; Taste entprellen
  58.     ; ----------------
  59. wta_1    lda #WTA_PR_TIM    ; Timerwert laden
  60.     jsr task_delay    ; Taste entprellen
  61.  
  62.     lda Wta_port    ; Zustand des Ports laden
  63.     and #$FF^HTON    ; Hörton-BIT ausblenden
  64.     cmp wta_merk    ; Zustand vor Entprellung,Taste noch gedrückt ?
  65.     beq wta_ber    ; ja, Tastenwert berrechnen
  66.  
  67.     ; nächste MB-Achse einstellen
  68.     ; ---------------------------
  69. nxt_mb    stz wtast    ; Taste wurde losgelassen, keine Taste gedrückt
  70.     sec        ; 1 nachschieben
  71.     ror akt_mb    ; nächste MB-Achse einstellen
  72.     bcs wta_end    ; nicht alle Achsen getestet
  73.     lda #MB4    ; MB4 einstellen, set=0
  74.     sta akt_mb
  75.  
  76. wta_end    clc        ; keine Taste erkannt
  77.     rts
  78.  
  79.  
  80.  
  81. ; =========================================================================
  82. ;
  83. ; Type    : Unterprg.
  84. ;    : gedrückte Wähltaste berrechnen
  85. ;
  86. ; Eingang    : Zustand MA/MB Port im Accu
  87. ;    : zB.: Taste auf MA0 und MB0 = X1101110
  88. ;
  89. ; Ausgang    : carry=1 Taste erkannt
  90. ;    : Tastenwert 1-12 in "wtast"
  91. ;
  92. ; Register    : Accu, X
  93. ;
  94. ; (c) by Thomas Lehmann Feb. 1990
  95. ;
  96. ; =========================================================================
  97.  
  98. wta_ber    eor #$ff    ; gesetzter Port =1
  99.     sta wtast    ; Zustand des Ports ablegen
  100.     lda #01        ; Offset auf MA0/MB0, 1-12
  101.     ldx #3        ; Anzahl der MB
  102.     sec        ; nur falls kein MA oder MB gefunden wird
  103.  
  104. wta_ber_0    ror wtast    ; gesetzen MB ermitteln
  105.     bcs wta_ber_1    ; MB gefunden, set=0
  106.     adc #3        ; Offset pro MB
  107.     dex        ; Anzahl der getesteten MB-1
  108.     bra wta_ber_0    ; nächsten MB testen
  109.  
  110. wta_ber_1    dex        ; auf MA einstellen
  111.     bmi wta_ber_2    ; steht bereits auf MA
  112.     ror wtast    ; MB ausblenden
  113.     bra wta_ber_1    ; alle MB ausblenden
  114.  
  115. wta_ber_2    ror wtast    ; gesetzten MA ermitteln
  116.     bcs wta_ber_3    ; MA gefunden
  117.     inc a        ; Offset auf MA
  118.     bra wta_ber_2    ; nächsten MA testen
  119.  
  120.  
  121. ; ---------------------------------------------------------------
  122. ; Tastenreihenfolge erzeugen : 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, #, *
  123. ; ---------------------------------------------------------------
  124.  
  125. wta_ber_3    tax        ; Tastennr. 1-12 kopieren
  126.     cpx #10        ; ist es Taste 1-9
  127.     bcc wta_ber_4    ; ja, Taste ok
  128.     bne wta_ber_5    ; Taste ist "0" oder "#"
  129.  
  130.     inx        ; Taste ist "*", TW=11
  131.     inx
  132.     bra wta_ber_4
  133.  
  134. wta_ber_5    dex        ; TW "0"=10, TW "#"=11
  135.  
  136. wta_ber_4    stx wtast    ; gedrückte Taste zur Auswertung ablegen
  137.     stz wta_repeat    ; WTasten Repeat aufziehen 
  138.     lda #2
  139.     sta wta_repeat+1
  140.     txa        ; Wähltaste im Accu
  141.     sec        ; Taste erkannt
  142.     rts
  143.  
  144.  
  145. ; =========================================================================
  146. ;
  147. ; Funktion    : Tasten in X/Y-Matrix abfragen
  148. ;
  149. ; Eingang    : -------
  150. ;
  151. ; Ausgang    : Offset auf Tastatur-Matrix der gedrückten Taste in "taste"
  152. ;    : clc = keine Taste gedrückt
  153. ;
  154. ; Register    : Accu, X
  155. ;
  156. ; (c) by Thomas Lehmann Feb. 1990
  157. ;
  158. ; =========================================================================
  159.  
  160.  
  161.     ; ================
  162.     ; X0 und X1 testen
  163.     ; ================
  164.  
  165. tast_abfr    lda akt_x    ; aktuelle X-Achse
  166.     beq tast_1    ; X0 setzen
  167.     cmp #2        ; X0 und X1 schon getestet ?
  168.     bcs tast_2    ; ja, X2-E setzen
  169.  
  170.     ; X1 einschalten
  171.     ; --------------
  172.     lda #$ce    ; CB2=0 / CA2=1
  173.     sta Tout_1    ; X1 einschalten
  174.     bra get_y    ; Y-Achsen testen
  175.  
  176.     ; X0 einschalten
  177.     ; --------------
  178. tast_1    lda #$ec    ; CB2=1 / CA2=0
  179.     sta Tout_1    ; X0 einschalten
  180.     bra get_y    ; Y-Achsen testen
  181.  
  182.  
  183.     ; ================
  184.     ; X2 bis XE testen
  185.     ; ================
  186. tast_2    lda #$ee    ; CB2=1 / CA2=1
  187.     sta Tout_1    ; X0 und X1 ausschalten
  188.     lda akt_x    ; aktuelle X-Achse laden
  189.     cmp #2        ; X2 testen ?
  190.     beq tast_03    ; ja, X2 einstellen
  191.     cmp #$0a    ; XA testen ?
  192.     bne tast_3    ; nein, XA nicht einstellen
  193.  
  194. tast_03    ldx #%11111110    ; X2 bzw. XA einstellen
  195.     stx x_achse
  196.  
  197.  
  198.     ; X2-X9 einschalten
  199.     ; -----------------
  200. tast_3    cmp #$0a    ; X2-X9 schon getestet ?
  201.     bcs tast_4    ; ja, XA-XE testen
  202.     
  203.     lda #00        ; XA-XE zurücksetzen
  204.     ora txen_rl23    ; Zustand TX-Enable und RL2/3 nicht verändern
  205.     sta Tout_3    ; X-Achse ausschalten, set=1
  206.     
  207.     lda x_achse    ; gibt die aktuelle X-Achse an
  208.     sta Tout_2    ; X-Achse einschalten, set=0
  209.     sta x2_9_merk    ; Zustand X2-X9 laden, Display RS-Flag
  210.     bra get_y    ; Y-Achsen testen
  211.  
  212.     ; XA-XE einschalten
  213.     ; -----------------
  214. tast_4    lda #$ff    ; X2-X9 zurücksetzen
  215.     sta x2_9_merk    ; Zustand X2-X9 laden, Display RS-Flag
  216.     sta Tout_2    ; X-Achse ausschalten, set=0
  217.  
  218.     lda x_achse    ; gibt die aktuelle X-Achse an
  219.     eor #$ff    ; set=1
  220.     ora txen_rl23    ; Zustand TX-Enable und RL2/3 nicht verändern
  221.     sta Tout_3    ; X-Achse einschalten, set=1
  222.  
  223.  
  224.     ; Y-Achsen einlesen
  225.     ; -----------------
  226. get_y    lda Tin        ; Y-Achsen einlesen
  227.     sta tast_merk    ; Zustand merken
  228.     eor #$ff    ; wenn Verbindung vorhanden, entspr. Y-Achse=0
  229.     beq nxt_x    ; keine Taste gedrückt, nächste X-Achse einst.
  230.  
  231.     lda taste    ; Taste noch gedrückt ?
  232.     beq tast_5    ; nein, direkt auswerten
  233.  
  234.     ; Tasten Repeat ermöglichen
  235.     ; -------------------------
  236.     dec key_repeat    ; Repeat Counter runterzählen
  237.     bne tast_end    ; kein Überlauf
  238.     dec key_repeat+1    ; high Byte nachführen
  239.     bne tast_end    ; noch nicht erreicht, Ende
  240.  
  241.  
  242.     ; Taste entprellen
  243.     ; ----------------
  244. tast_5    lda #TA_PR_TIM    ; Timerwert laden
  245.     jsr task_delay    ; Taste entprellen
  246.  
  247.     lda x2_9_merk    ; Zustand X2-X9 laden, Display RS-Flag
  248.     sta Tout_2    ; und entsprechend schalten
  249.  
  250.     lda tast_merk    ; Zustand vor Entprellung laden
  251.     cmp Tin        ; ist Taste noch gedrückt ?
  252.     beq tast_ber    ; Tastenwert berrechnen
  253.  
  254.  
  255.     ; nächste X-Achse einstellen
  256.     ; ---------------------------
  257. nxt_x    stz taste    ; Taste wurde losgelassen, keine Taste gedrückt
  258.     stz tw        ; Tastenwert löschen
  259.     inc akt_x    ; nächste X-Achse testen
  260.     sec        ; 1 nachschieben
  261.     rol x_achse    ; nächste X-Achse einstellen
  262.  
  263.     ldx akt_x    ; aktuelle X-Achse laden
  264.     cpx #$10    ; alle Achsen getestet ?, und Port clr
  265.     bcc tast_end    ; nein
  266.     stz akt_x    ; X0 einstellen
  267.  
  268. tast_end    clc        ; keine Taste erkannt
  269.     rts
  270.  
  271.  
  272.  
  273.  
  274.  
  275. ; =========================================================================
  276. ;
  277. ; Type    : Unterprg.
  278. ;    : Offset auf Tastaturtabelle in X/Y-Matrix berrechnen
  279. ;
  280. ; Eingang    : Zustand Y-Port im Accu
  281. ;    : aktuelle X-Achse in akt_x
  282. ;
  283. ; Ausgang    : carry=1 Taste erkannt
  284. ;    : Tastenwert 1-... in "taste"
  285. ;
  286. ; Register    : Accu
  287. ;
  288. ; (c) by Thomas Lehmann Feb. 1990
  289. ;
  290. ; =========================================================================
  291.  
  292. tast_ber    sta taste    ; Zustand des Y-Ports ablegen
  293.     lda #01        ; Offset auf Tastaturtabelle, 1-...
  294.  
  295. ta_ber_0    lsr taste    ; Y-Achse ermitteln
  296.     bcc ta_ber_1    ; Achse gefunden, set=0
  297.     clc
  298.     adc #MAX_X    ; Offset pro Y-Achse
  299.     bra ta_ber_0    ; nächste Achse testen
  300.  
  301. ta_ber_1    stz key_repeat    ; Tasten Repeat aufziehen 
  302.     ldx #3
  303.     stx key_repeat+1
  304.     adc akt_x    ; aktuelle X-Achse dazu
  305.     sta taste    ; Tastenwert ablegen
  306.     sec        ; Taste erkannt
  307.     rts
  308.  
  309.  
  310.  
  311.  
  312. ; --------------------------------------------------------------------------
  313.  
  314. HLP    set    *
  315. _TAST_ABFR    equ    HLP-MODUL_START        ; Größe des Moduls
  316.  
  317.