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 >
Wrap
Text File
|
1998-09-26
|
12KB
|
217 lines
;******************************************************************************
;* *
;* CapsLock Anzeigetreiber *
;* *
;* Stand 08.02.1996 *
;* *
;******************************************************************************
; Zum Betrieb ist die CapsLock-Anzeige Hardware in der Tastatur erforderlich!
; Autor: Roland Skuplik
; ╜ 1993-1996 by WRS Software-Design
; Hohenzollernstraße 121 / PF 10 29 37
; 45888 Gelsenkirchen
; 0209 87 30 01 / 81 13 31 (priv.)
;------------------------------------------------------------------------------
TEXT
prgstart: bra caps_anz ; den Residenten Teil auslassen
;------------------------------------------------------------------------------
dc.b "XBRA" ; Kennung für Vektorverbieger
dc.b "CPSL" ; 'CaPSLock'-Kennung
oldcvec: dc.l 0 ; alter Vektor (nur wg. Struktur)
capsvec: movea.l kbshift,a0 ; Adresse der Umschalttastenvariablen
move.b (a0),d0 ; Status holen
andi.b #16,d0 ; nur CapsLock übriglassen
cmp.b lastcaps,d0 ; verändert?
beq.s vblend ; nein... schnarch...
bsr.s do_led ; Status auch zur LED übertragen
vblend: rts
; Routine zum Übertragen des CapsLock-Status an den IKBD
; Den Vektor zu dieser Routine findet man auch im CookieJar unter 'CPSL'
; ~> d0.b : anzuzeigender Status (Bit 4)
do_led: movem.l d1/a1-a2,-(sp) ; Register retten
move.b d0,lastcaps ; Status merken
btst #4,d0 ; was darf's denn sein?
bne.s set_led
clr_led: lea ikbd_cl(pc),a1 ; Lösche-Stringadresse laden
bra.s mach_hin
set_led: lea ikbd_sl(pc),a1 ; Setze-Stringadresse laden
mach_hin: movea.l #$FFFFFC00,a2 ; Basisadresse IKBD-ACIA
moveq #5,d1 ; 6 Bytes zu schreiben
move sr,-(sp) ; Statusregister retten
ori #$700,sr ; IPL7 - keine Störungen
ikbdws: move.b (a1)+,d0 ; zu schreibendes Byte holen
wait: btst #1,(a2) ; Senderegister leer?
beq.s wait ; nein... warten...
move.b d0,2(a2) ; Byte an IKBD schreiben
dbra d1,ikbdws ; alle Bytes senden
move (sp)+,sr ; Statusregister restaurieren
movem.l (sp)+,d1/a1-a2 ; Register restaurieren
rts
ikbd_cl: dc.b 32,0,4,1,255,0 ; Load-IKBD-Memory-String zum löschen
ikbd_sl: dc.b 32,0,4,1,254,0 ; dito zum setzen der CapsLock-LED
kbshift: dc.l $E1B ; Adresse des Umschalttastenstatus
lastcaps: dc.b 0 ; aktuell angezeigter Status
dc.b "XBRA" ; Kennung für Vektorverbieger
dc.b "CPSL" ; 'CaPSLock'-Kennung
oldvblvc: dc.l 0 ; alter Vektor auf die VBL-Queue
newvbls: ds.l 16,0 ; 16 VBLs freihalten
dc.b "XBRA" ; Kennung für Vektorverbieger
dc.b "CPSL" ; 'CaPSLock'-Kennung
oldcookv: dc.l 0 ; alter Vektor auf den CookieJar
newcooks: dc.l 0,33 ; neuer CookieJar mit 33 Einträgen
dc.l 0,33,0,33,0,33,0,33
dc.l 0,33,0,33,0,33,0,33
dc.l 0,33,0,33,0,33,0,33
dc.l 0,33,0,33,0,33,0,33
dc.l 0,33,0,33,0,33,0,33
dc.l 0,33,0,33,0,33,0,33
dc.l 0,33,0,33,0,33,0,33
dc.l 0,33,0,33,0,33,0,33
;------------------------------------------------------------------------------
caps_anz: pea copyrght ; 'Hallo, da bin ich...'
move.w #9,-(sp) ; per CconWs ausgeben
trap #1 ; GEMDOS
addq.l #6,sp ; Stack aufräumen
pea install ; im Supervisor Vektoren installieren
move.w #38,-(sp) ; Opcode
trap #14 ; XBIOS
addq.l #6,sp ; Stack aufräumen
tst.w d0 ; Installation erfolgreich?
beq.s weiter ; ja...
pea nixvbl ; Fehler bei der Installation
move.w #9,-(sp) ; per CconWs
trap #1 ; GEMDOS
addq.l #6,sp ; Stack aufräumen
move.w #7,-(sp) ; CrawcIn (auf Taste warten)
trap #1 ; GEMDOS
addq.l #2,sp ; Stack aufräumen
clr.w -(sp) ; Pterm0
trap #1 ; und zurück an's GEMDOS
weiter: pea instok ; Installation erfolgreich
move.w #9,-(sp) ; per CconWs
trap #1 ; GEMDOS
addq.l #6,sp ; Stack aufräumen
move.l #caps_anz,d0 ; Ende des residenten Teils
sub.l #prgstart,d0 ; Anfang abziehen
add.l #256,d0 ; Basepagelänge dazu
clr.w -(sp) ; RET-Code 0, alles OK
move.l d0,-(sp) ; residenten Teil im Speicher halten
move.w #49,-(sp) ; PtermRes
trap #1 ; und tschüß...
install: clr.w $452 ; VBLs sperren
move.w $454,d0 ; Anzahl der VBLs ermitteln
subq.w #2,d0 ; wegen SysMouseVec und DBRA
movea.l $456,a0 ; Zeiger auf VBLs holen
move.w d0,d1 ; für Später
movea.l a0,a1 ; dito
suchvbl: addq.l #4,a0 ; ersten Überspringen (MAUS)
tst.l (a0) ; frei?
beq.s nxsuch ; ja, dann weiter nach belegten suchen
movea.l (a0),a2 ; Vektor holen und reingucken
cmpi.l #"CPSL",-8(a2) ; ist der Eintrag etwa der eigene?
beq nxvbl ; ja, Installation abbrechen
nxsuch: dbra d0,suchvbl ; alle Sloz überprüfen
suchslot: addq.l #4,a1 ; ersten wieder überspringen
tst.l (a1) ; frei?
beq.s gefunden
dbra d1,suchslot ; alle Sloz
cmpi.w #16,$454 ; >=16 VBLs installiert?
bge nxvbl ; nicht durch dieses Prog erweiterbar
move.w $454,d0 ; Anzahl VBLs holen
subq.w #1,d0 ; wegen DBRA
movea.l $456,a0 ; Zeiger auf VBLs wiederherstellen
lea newvbls,a1 ; Zeiger auf neuen VBL-Queue
vblcopy: move.l (a0)+,(a1)+ ; kopieren
dbra d0,vblcopy
move.l $456,oldvblvc ; alten Vektor retten
move.l #newvbls,$456 ; neue Adresse eintragen
move.w #16,$454 ; jetzt sind's 16 Stück
bra.s install ; neu versuchen
gefunden: move.l (a1),oldcvec ; alten Vektor retten
move.l #capsvec,(a1) ; eigenen Vektor einklinken
addq.w #1,$452 ; VBLs freigeben
movea.l $4F2,a0 ; _sysbase aus den SysVars
cmpi.w #$100,2(a0) ; TOS-Version größer 1.00?
beq.s old_tos ; nein, dann stimmt der Defaultwert
move.l 36(a0),kbshift ; _pkbshift aus dem OS-Header (ab 1.02)
old_tos: movea.l kbshift,a0 ; Adresse der Umschalttastenvariablen
move.b (a0),d0 ; Status holen
andi.b #16,d0 ; nur CapsLock übriglassen
bsr do_led ; Status auch zur LED übertragen
move.l $5a0,d0 ; Zeiger auf Cookie Jar aus SysVars
beq.s nocjar ; schade, kein Cookie Jar im System
movea.l d0,a0 ; Vektor in ein Adressregister rein
moveq #1,d0 ; Zähler für Cookies auf InitWert
lookcook: tst.l (a0)+ ; Cookie testen
beq.s cookend ; war Null, dann ist (a0) Anzahl
addq.l #4,a0 ; sonst Wert überspringen
addq.w #1,d0 ; Cookiezähler erhöhen
bra.s lookcook ; und weitersuchen
cookend: cmp.l (a0),d0 ; CookieJar voll?
bne.s instcook ; nein, eigenen Cookie eintragen
cmpi.w #33,d0 ; >=33 Cookies?
bge.s nocjar ; leider, kann nicht erweitert werden
movea.l $5a0,a0 ; CookieJar Vektor
move.l a0,oldcookv ; gleich merken
lea newcooks,a1 ; Adresse des neuen CookieJar
move.l a1,$5a0 ; gleich eintragen
subq.l #2,d0 ; wg. DBRA und wg. Anzahl-Cookie
copycook: move.l (a0)+,(a1)+ ; Cookie kopieren
move.l (a0)+,(a1)+ ; Wert kopieren
dbra d0,copycook
move.l #'CPSL',(a1)+ ; Eigenen Cookie eintragen
move.l #do_led,(a1) ; Adresse der Anzeigeroutine als Wert
bra.s cookok ; Meldung ausgeben und gut'iss!
instcook: clr.l 4(a0) ; Anzahl-Cookie verschieben
move.l (a0),8(a0) ; Anzahl verschieben
move.l #'CPSL',-4(a0) ; Eigenen Cookie eintragen
move.l #do_led,(a0) ; Adresse der Anzeigeroutine als Wert
cookok: pea okcookie ; Cookie gesetzt
bra.s iwok
nocjar: pea nocookie ; Cookie NICHT gesetzt
iwok: move.w #9,-(sp) ; per CconWs
trap #1 ; GEMDOS
addq.l #6,sp ; Stack aufräumen
moveq #0,d0 ; alles OK
instend: rts ; Installation beendet
nxvbl: moveq #-1,d0 ; Fehlerstatus setzen
bra.s instend ; und raus
DATA
copyrght: dc.b 13,10,27,112
dc.b " CapsLock-Anzeigetreiber V1.1 08.02.1996, R. Skuplik "
dc.b 27,113,13,10
dc.b "╜ 1993-1996 by WRS Software-Design, <0209> 873001"
dc.b 13,10,0
instok: dc.b "~> Installation erfolgreich.",13,10,0
nixvbl: dc.b 10,7,27,112
dc.b "~> Installation abgebrochen. "
dc.b 27,113,13,10
dc.b "Anpassung bereits vorgenommen oder VBL-Queue nicht "
dc.b "erweiterbar..."
dc.b 13,10,0
okcookie: dc.b "~> 'CPSL'-Eintrag im Cookie Jar erfolgreich.",13,10,0
nocookie: dc.b 10,27,112
dc.b "~> 'CPSL'-Eintrag im Cookie Jar fehlt! "
dc.b 27,113,13,10,0
END