home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser 1998 October / STC_CD_10_1998.iso / UTILITY / CAPS_ANZ / CAPS_ANZ.Q < prev    next >
Text File  |  1998-09-26  |  12KB  |  217 lines

  1. ;******************************************************************************
  2. ;*                                                                            *
  3. ;*                          CapsLock Anzeigetreiber                           *
  4. ;*                                                                            *
  5. ;*                              Stand 08.02.1996                              *
  6. ;*                                                                            *
  7. ;******************************************************************************
  8.  
  9. ; Zum Betrieb ist die CapsLock-Anzeige Hardware in der Tastatur erforderlich!
  10.  
  11. ;    Autor: Roland Skuplik
  12.  
  13. ; ╜ 1993-1996 by WRS Software-Design
  14. ;                Hohenzollernstraße 121 / PF 10 29 37
  15. ;          45888 Gelsenkirchen
  16. ;           0209 87 30 01 / 81 13 31 (priv.)
  17.  
  18. ;------------------------------------------------------------------------------
  19.  
  20.           TEXT
  21.  
  22. prgstart: bra       caps_anz            ; den Residenten Teil auslassen
  23.  
  24. ;------------------------------------------------------------------------------
  25.           dc.b      "XBRA"              ; Kennung für Vektorverbieger
  26.           dc.b      "CPSL"              ; 'CaPSLock'-Kennung
  27. oldcvec:  dc.l      0                   ; alter Vektor (nur wg. Struktur)
  28. capsvec:  movea.l   kbshift,a0          ; Adresse der Umschalttastenvariablen
  29.           move.b    (a0),d0             ; Status holen
  30.           andi.b    #16,d0              ; nur CapsLock übriglassen
  31.           cmp.b     lastcaps,d0         ; verändert?
  32.           beq.s     vblend              ; nein... schnarch...
  33.           bsr.s     do_led              ; Status auch zur LED übertragen
  34. vblend:   rts
  35.  
  36. ; Routine zum Übertragen des CapsLock-Status an den IKBD
  37. ; Den Vektor zu dieser Routine findet man auch im CookieJar unter 'CPSL'
  38. ;  ~> d0.b : anzuzeigender Status (Bit 4)
  39.  
  40. do_led:   movem.l   d1/a1-a2,-(sp)      ; Register retten
  41.           move.b    d0,lastcaps         ; Status merken
  42.           btst      #4,d0               ; was darf's denn sein?
  43.           bne.s     set_led
  44. clr_led:  lea       ikbd_cl(pc),a1      ; Lösche-Stringadresse laden
  45.           bra.s     mach_hin
  46. set_led:  lea       ikbd_sl(pc),a1      ; Setze-Stringadresse laden
  47. mach_hin: movea.l   #$FFFFFC00,a2       ; Basisadresse IKBD-ACIA
  48.           moveq     #5,d1               ; 6 Bytes zu schreiben
  49.           move      sr,-(sp)            ; Statusregister retten
  50.           ori       #$700,sr            ; IPL7 - keine Störungen
  51. ikbdws:   move.b    (a1)+,d0            ; zu schreibendes Byte holen
  52. wait:     btst      #1,(a2)             ; Senderegister leer?
  53.           beq.s     wait                ; nein... warten...
  54.           move.b    d0,2(a2)            ; Byte an IKBD schreiben
  55.           dbra      d1,ikbdws           ; alle Bytes senden
  56.           move      (sp)+,sr            ; Statusregister restaurieren
  57.           movem.l   (sp)+,d1/a1-a2      ; Register restaurieren
  58.           rts
  59.  
  60. ikbd_cl:  dc.b      32,0,4,1,255,0      ; Load-IKBD-Memory-String zum löschen
  61. ikbd_sl:  dc.b      32,0,4,1,254,0      ; dito zum setzen der CapsLock-LED
  62.  
  63. kbshift:  dc.l      $E1B                ; Adresse des Umschalttastenstatus
  64. lastcaps: dc.b      0                   ; aktuell angezeigter Status
  65.  
  66.           dc.b      "XBRA"              ; Kennung für Vektorverbieger
  67.           dc.b      "CPSL"              ; 'CaPSLock'-Kennung
  68. oldvblvc: dc.l      0                   ; alter Vektor auf die VBL-Queue
  69. newvbls:  ds.l      16,0                ; 16 VBLs freihalten
  70.  
  71.           dc.b      "XBRA"              ; Kennung für Vektorverbieger
  72.           dc.b      "CPSL"              ; 'CaPSLock'-Kennung
  73. oldcookv: dc.l      0                   ; alter Vektor auf den CookieJar
  74. newcooks: dc.l      0,33                ; neuer CookieJar mit 33 Einträgen
  75.           dc.l      0,33,0,33,0,33,0,33
  76.           dc.l      0,33,0,33,0,33,0,33
  77.           dc.l      0,33,0,33,0,33,0,33
  78.           dc.l      0,33,0,33,0,33,0,33
  79.           dc.l      0,33,0,33,0,33,0,33
  80.           dc.l      0,33,0,33,0,33,0,33
  81.           dc.l      0,33,0,33,0,33,0,33
  82.           dc.l      0,33,0,33,0,33,0,33
  83. ;------------------------------------------------------------------------------
  84.  
  85. caps_anz: pea       copyrght            ; 'Hallo, da bin ich...'
  86.           move.w    #9,-(sp)            ; per CconWs ausgeben
  87.           trap      #1                  ; GEMDOS
  88.           addq.l    #6,sp               ; Stack aufräumen
  89.           pea       install             ; im Supervisor Vektoren installieren
  90.           move.w    #38,-(sp)           ; Opcode
  91.           trap      #14                 ; XBIOS
  92.           addq.l    #6,sp               ; Stack aufräumen
  93.           tst.w     d0                  ; Installation erfolgreich?
  94.           beq.s     weiter              ; ja...
  95.           pea       nixvbl              ; Fehler bei der Installation
  96.           move.w    #9,-(sp)            ; per CconWs
  97.           trap      #1                  ; GEMDOS
  98.           addq.l    #6,sp               ; Stack aufräumen
  99.           move.w    #7,-(sp)            ; CrawcIn (auf Taste warten)
  100.           trap      #1                  ; GEMDOS
  101.           addq.l    #2,sp               ; Stack aufräumen
  102.           clr.w     -(sp)               ; Pterm0
  103.           trap      #1                  ; und zurück an's GEMDOS
  104.  
  105. weiter:   pea       instok              ; Installation erfolgreich
  106.           move.w    #9,-(sp)            ; per CconWs
  107.           trap      #1                  ; GEMDOS
  108.           addq.l    #6,sp               ; Stack aufräumen
  109.           move.l    #caps_anz,d0        ; Ende des residenten Teils
  110.           sub.l     #prgstart,d0        ; Anfang abziehen
  111.           add.l     #256,d0             ; Basepagelänge dazu
  112.           clr.w     -(sp)               ; RET-Code 0, alles OK
  113.           move.l    d0,-(sp)            ; residenten Teil im Speicher halten
  114.           move.w    #49,-(sp)           ; PtermRes
  115.           trap      #1                  ; und tschüß...
  116.  
  117. install:  clr.w     $452                ; VBLs sperren
  118.           move.w    $454,d0             ; Anzahl der VBLs ermitteln
  119.           subq.w    #2,d0               ; wegen SysMouseVec und DBRA
  120.           movea.l   $456,a0             ; Zeiger auf VBLs holen
  121.           move.w    d0,d1               ; für Später
  122.           movea.l   a0,a1               ; dito
  123. suchvbl:  addq.l    #4,a0               ; ersten Überspringen (MAUS)
  124.           tst.l     (a0)                ; frei?
  125.           beq.s     nxsuch              ; ja, dann weiter nach belegten suchen
  126.           movea.l   (a0),a2             ; Vektor holen und reingucken
  127.           cmpi.l    #"CPSL",-8(a2)      ; ist der Eintrag etwa der eigene?
  128.           beq       nxvbl               ; ja, Installation abbrechen
  129. nxsuch:   dbra      d0,suchvbl          ; alle Sloz überprüfen
  130. suchslot: addq.l    #4,a1               ; ersten wieder überspringen
  131.           tst.l     (a1)                ; frei?
  132.           beq.s     gefunden
  133.           dbra      d1,suchslot         ; alle Sloz
  134.           cmpi.w    #16,$454            ; >=16 VBLs installiert?
  135.           bge       nxvbl               ; nicht durch dieses Prog erweiterbar
  136.           move.w    $454,d0             ; Anzahl VBLs holen
  137.           subq.w    #1,d0               ; wegen DBRA
  138.           movea.l   $456,a0             ; Zeiger auf VBLs wiederherstellen
  139.           lea       newvbls,a1          ; Zeiger auf neuen VBL-Queue
  140. vblcopy:  move.l    (a0)+,(a1)+         ; kopieren
  141.           dbra      d0,vblcopy
  142.           move.l    $456,oldvblvc       ; alten Vektor retten
  143.           move.l    #newvbls,$456       ; neue Adresse eintragen
  144.           move.w    #16,$454            ; jetzt sind's 16 Stück
  145.           bra.s     install             ; neu versuchen
  146.  
  147. gefunden: move.l    (a1),oldcvec        ; alten Vektor retten
  148.           move.l    #capsvec,(a1)       ; eigenen Vektor einklinken
  149.           addq.w    #1,$452             ; VBLs freigeben
  150.           movea.l   $4F2,a0             ; _sysbase aus den SysVars
  151.           cmpi.w    #$100,2(a0)         ; TOS-Version größer 1.00?
  152.           beq.s     old_tos             ; nein, dann stimmt der Defaultwert
  153.           move.l    36(a0),kbshift      ; _pkbshift aus dem OS-Header (ab 1.02)
  154. old_tos:  movea.l   kbshift,a0          ; Adresse der Umschalttastenvariablen
  155.           move.b    (a0),d0             ; Status holen
  156.           andi.b    #16,d0              ; nur CapsLock übriglassen
  157.           bsr       do_led              ; Status auch zur LED übertragen
  158.           move.l    $5a0,d0             ; Zeiger auf Cookie Jar aus SysVars
  159.           beq.s     nocjar              ; schade, kein Cookie Jar im System
  160.           movea.l   d0,a0               ; Vektor in ein Adressregister rein
  161.           moveq     #1,d0               ; Zähler für Cookies auf InitWert
  162. lookcook: tst.l     (a0)+               ; Cookie testen
  163.           beq.s     cookend             ; war Null, dann ist (a0) Anzahl
  164.           addq.l    #4,a0               ; sonst Wert überspringen
  165.           addq.w    #1,d0               ; Cookiezähler erhöhen
  166.           bra.s     lookcook            ; und weitersuchen
  167. cookend:  cmp.l     (a0),d0             ; CookieJar voll?
  168.           bne.s     instcook            ; nein, eigenen Cookie eintragen
  169.           cmpi.w    #33,d0              ; >=33 Cookies?
  170.           bge.s     nocjar              ; leider, kann nicht erweitert werden
  171.           movea.l   $5a0,a0             ; CookieJar Vektor
  172.           move.l    a0,oldcookv         ; gleich merken
  173.           lea       newcooks,a1         ; Adresse des neuen CookieJar
  174.           move.l    a1,$5a0             ; gleich eintragen
  175.           subq.l    #2,d0               ; wg. DBRA und wg. Anzahl-Cookie
  176. copycook: move.l    (a0)+,(a1)+         ; Cookie kopieren
  177.           move.l    (a0)+,(a1)+         ; Wert kopieren
  178.           dbra      d0,copycook
  179.           move.l    #'CPSL',(a1)+       ; Eigenen Cookie eintragen
  180.           move.l    #do_led,(a1)        ; Adresse der Anzeigeroutine als Wert
  181.           bra.s     cookok              ; Meldung ausgeben und gut'iss!
  182. instcook: clr.l     4(a0)               ; Anzahl-Cookie verschieben
  183.           move.l    (a0),8(a0)          ; Anzahl verschieben
  184.           move.l    #'CPSL',-4(a0)      ; Eigenen Cookie eintragen
  185.           move.l    #do_led,(a0)        ; Adresse der Anzeigeroutine als Wert
  186. cookok:   pea       okcookie            ; Cookie gesetzt
  187.           bra.s     iwok
  188. nocjar:   pea       nocookie            ; Cookie NICHT gesetzt
  189. iwok:     move.w    #9,-(sp)            ; per CconWs
  190.           trap      #1                  ; GEMDOS
  191.           addq.l    #6,sp               ; Stack aufräumen
  192.           moveq     #0,d0               ; alles OK
  193. instend:  rts                           ; Installation beendet
  194. nxvbl:    moveq     #-1,d0              ; Fehlerstatus setzen
  195.           bra.s     instend             ; und raus
  196.  
  197.           DATA
  198.  
  199. copyrght: dc.b      13,10,27,112
  200.           dc.b      " CapsLock-Anzeigetreiber V1.1 08.02.1996, R. Skuplik "
  201.           dc.b      27,113,13,10
  202.           dc.b      "╜ 1993-1996 by WRS Software-Design, <0209> 873001"
  203.           dc.b      13,10,0
  204. instok:   dc.b      "~> Installation erfolgreich.",13,10,0
  205. nixvbl:   dc.b      10,7,27,112
  206.           dc.b      "~> Installation abgebrochen. "
  207.           dc.b      27,113,13,10
  208.           dc.b      "Anpassung bereits vorgenommen oder VBL-Queue nicht "
  209.           dc.b      "erweiterbar..."
  210.           dc.b      13,10,0
  211. okcookie: dc.b      "~> 'CPSL'-Eintrag im Cookie Jar erfolgreich.",13,10,0
  212. nocookie: dc.b      10,27,112
  213.           dc.b      "~> 'CPSL'-Eintrag im Cookie Jar fehlt! "
  214.           dc.b      27,113,13,10,0
  215.  
  216.           END
  217.