Hardware > Hardware (Classic 16-/32-Bit)
Tastatur mit CapsLock Controlle
ToPeG:
Nach einigem Basteln, habe ich folgende Lösung:
Wenn sich jemand wundert warum die Ports so weit zusammengeschrumpft sind.
Erst wollte ich Port 4 als Ausgang benutzen. Das hätte acht freie Bit ergeben. Nach dem Ich es Probiert hatte und Nicht vernünftiges heraus kam, habe ich noch mal den IKBD Code studiert und Festgestellt, dass es damit gleich zwei Probleme gibt. Einerseits Läuft ein Interrupt der alle 1/500stel Sekunde eine Spalte der Tastatur abfragt. Will ich zu dem Zeitpunkt meine Ausgabe machen kommt nur Müll raus, Zum anderen, wenn nicht gerade die Tastatur ausgelesen wird, werden Maus und Joystick abgefragt. Damit schaltet der 74ls244 die Signale durch, will ich da etwas schreiben, kollidieren die Signale von Maus und Joystick mit meinen aus dem Port4 und ich habe wieder nur Unsinn. Also fiel Port4 schon mal flach. Port1 und Port2 sind fest belegt und da in die Signale zu pfuschen ist so komplex, das ich es nicht mit einem Befehl hin bekomme. Bei zwei oder mehr Befehlen an den IKBD besteht die Gefahr, dass der IKBD meine Arbeit wieder rückgängig macht, oder mit meinen Einstellungen nicht klar kommt. Also blieb nur Port3. Dieser wird nur zur Abfrage der Tastaturmatrix verwendet und dauerhaft als Ausgang geschaltet. Also muss ich sicher stellen, Das mir die Tastaturabfrage nicht in meine Anzeige schreibt. Zwar setzt der IKBD code Port3 Bit0 immer auf high, wenn es die Tastaturmatrix abfragt, aber auch alle Bits an Port3 werden parallel gesetzt. Das heißt es wird das übernommen was Der IKBD Code gerade schreibt. Das ist zwar nett anzusehen, aber es ist nicht das was man haben will. Also Studierte ich den Code nochmal. Dabei sah ich, das als erstes der Maus und Joystick Port ausgeblendet wird indem an Port2 Bit 0 auf high gezogen wird, erst dann werden Port3 und Port4 gesetzt. Wenn ich also Bit0 von Port3 und Bit0 von Port2 kombiniere, kann ich sicherstellen, das meine Anzeige unverändert bleibt während die Tastaturmatrix abgefragt wird. Das heißt die Bits auf Port3 dürfen übernommen werden, wenn Port3.0 Low ist und Port2.0 low ist. So griff ich nach einem 74ls02 und setzte ihn ein. Sieben Bit sind gar nicht mal so schlecht. Aber ich erinnerte mich, das ich kein 0-Bytes übertragen kann (Fehler in der Programmierung des IKBD). Also muss immer ein Bit high sein. Blieben noch sechs übrig. Ich schrieb ein kleines Progrämmchen um die Anzeige zu testen. Doch immer wieder hängte sich der IKBD auf. Ich kam dahinter das schon ein 0-Nibble (4Bit, ein halbes Byte) zu einem Fehler führt. Ich weiß nicht wo es zu dem Problem kommt, aber es ist da und reproduzierbar. So musste ich im oberen Nibble noch ein Bit opfern, das ständig high ist. So blieben nur 5 Bit für die Anzeige übrig. Ist jemand geschickt und denkt sich die richtige Kombination von Signalen aus, bei dem niemals ein 0Byte oder 0Nibble auftauchen kann man es auf sieben Bit bringen. Das war mir zu viel Aufwand.
Neben der vergrößerten Anzahl der von LEDs ist die Schaltung auch in sich Statisch. Es ist nicht nötig die Anzeige ständig zu aktualisieren. Die Schaltung "erkennt" wenn etwas falsches geschrieben werden soll.
Den GFA-Code liefe ich nach sobald ich ihn in eine repräsentable Form gebracht habe. Zur Zeit ist es kaum mehr als ein Hack.
ToPeG:
Ich habe etwas nachgedacht und brauche euer Feedback.
Es gibt nun drei Möglichkeiten wie ich die LED-Überwachung umsetzen kann.
1.
Ein AUTO-Ordner Programm, das sich persistent in den Speicher hängt und Die LEDs ansteuert.
Vorteile:
* sollte überall laufen, sofern es möglichst früh gestartet wird.Nachteile:
* Unflexible Konfiguration.
2.
Ein AUTO-Ordner Programm, das sich persistent in den Speicher hängt und Die LEDs ansteuert und ACC das dieses Steuert und Konfiguriert.
Vorteile:
* Einfaches Einstellen des Verhaltens
* Wenn alles konfiguriert ist wird das ACC nicht mehr gebrauchtNachteile:
* Belegt dennoch einen ACC-Slot
* Es kann zu Problemen mit dem Speicherschutz bei moderneren Systemen kommen, wenn Die Einstellungen sofort übernommen werden sollen. (Ansonsten würde ja kein ACC gebraucht :) )
3. Nur ein ACC das auch die Überwachung übernimmt.
Vorteile:
* Einfach Handhabung. Nur ein Programm, das man beachten muss
* Unter Modernen Systemen auch als normales Hintergrundprogramm benutzbar.
* Vollständige und einfache Konfiguration.Nachteile:
* Es kann bei modernen Systemen zu Problemen mit dem Speicherschutz kommen, da in vielen Teilen des Systems herum gepfuscht wird.
* Es belegt dauerhaft einen ACC-Slot.
Und dann gibt es natürlich noch die frage was soll überwacht werden.
* Capslock
* DMA-Zugriffe (ACSI,Floppy,DMA-Sound)
* IDE Zugriffe
* Allgemeine Laufwerkszugriffe
* Alive Ticker (blinkt langsam solange das System nicht Hängt)
* Working (LED ist aus wenn das System nichts zu tun hat, es blinkt also bei aktivität)
* SuperUserMode (LED geht an, wenn das System in den SuperUserMode wechselt. Das passiert bei Systemzugriffen (Adressraum bis 4096))
Fällt euch noch was ein?
Soll ich für andere Programme Funktionen bereit stellen? Oder gibt es da schon Protokolle die ich nutzen kann?
rainers:
Hallo ToPeG,
vielen Dank für die super Arbeit. Du hast echt viel Mühe und Zeit da reingesteckt.
Ich bin für Variante 1. Die "unflexible" Konfiguration empfinde ich nicht als störend.
Bzgl. der Überwachungen wären das meine Favoriten:
Capslock
DMA-Zugriffe (ACSI,Floppy,DMA-Sound)
Alive Ticker
Working
SuperUserMode
Was kann man sich unter " Allgemeine Laufwerkszugriffe" vorstellen?
Danke
Rainer
ToPeG:
--- Zitat von: Rainer (s) am Do 23.08.2012, 16:49:19 ---Was kann man sich unter " Allgemeine Laufwerkszugriffe" vorstellen?
--- Ende Zitat ---
Alle Zugriffe auf Dateien oder Ordner laufen über TOS Funktionen, Diese Leiten die Aktionen an die passenden Treiber weiter. Wenn ich mich da einhänge, bekomme ich jede Dateiaktion mit, kann aber nicht feststellen, an welches Gerät diese Anfragen gehen.
Dem gegenüber bietet das TOS Funktionen, mit denen es DMA-Zugriffe handhabt. Diese betreffen Floppy und ACSI. Im STE auch DMA-Sound und im TT/Falcon SCSI. Welches der Geräte betroffen ist kann ich darüber aber nicht feststellen. Auch direkte DMA-Aktionen (Das Programm schreibt in die Hardwareregister) sind damit nicht detektierbar. Dafür müsste ich die Hardware abfragen.
Was mir noch an Anzeigemöglichkeiten einfällt:
* Blitter aktiv
* 16Mhz aktiv bei Mega-STE
* ProzessorCache aktiv bei MegaSTE, Falcon, TT
ToPeG:
Wie versprochen hier der Code:
--- Code: ---'
' Testprogramm fuer Tastatur LEDs
' Ueberwacht den Capslock-Status
'
' Siehe beigelete Schaltung
'
' Komando, Adresse, Bytecount, Bytes
' 20, 0006, 01, 82+LEDbit
'
kbd$=" "
oldsend|=0
send|=0
init
'
PRINT AT(1,1);"Ende mit Maustaste"
PRINT AT(1,2);"CapsLock schaltet LED 0"
PRINT AT(1,3);"LED 1..4 werden mit den Nummerntasten geschaltet"
'
key$=""
REPEAT
key$=INKEY$
IF key$="1"
led_update(0)
ELSE IF key$="2"
led_update(1)
ELSE IF key$="3"
led_update(2)
ELSE IF key$="4"
led_update(3)
ENDIF
capslock_update
send
print_status
UNTIL MOUSEK OR key$=CHR$(27)
'
' ############################################
'
PROCEDURE init
LOCAL adr%
send|=&H82
oldsend|=send|
'
adr%=VARPTR(kbd$)
CARD{adr%}=&H2000
CARD{adr%+2}=&H601
CARD{adr%+4}=send|
'
~XBIOS(25,5,L:adr%)
~XBIOS(25,5,L:adr%)
RETURN
'
PROCEDURE capslock_update
LOCAL status!
IF BIOS(11,-1) AND 16
send|=BSET(send|,2)
ELSE
send|=BCLR(send|,2)
ENDIF
RETURN
'
PROCEDURE led_update(num|)
LOCAL pos|
IF num|<4
num|=num|+3
IF send| AND BSET(0,num|)
send|=BCLR(send|,num|)
ELSE
send|=BSET(send|,num|)
ENDIF
ENDIF
RETURN
'
PROCEDURE led_set(num|,on!)
IF num|<4
IF on!
send|=BSET(send|,num|+2)
ELSE
send|=BCLR(send|,num|+2)
ENDIF
ENDIF
RETURN
'
PROCEDURE print_status
PRINT AT(5,5);"LED0: ";
IF send| AND 4
PRINT "ON "
ELSE
PRINT "OFF"
ENDIF
'
PRINT AT(5,6);"LED1: ";
IF send| AND 8
PRINT "ON "
ELSE
PRINT "OFF"
ENDIF
'
PRINT AT(5,7);"LED2: ";
IF send| AND 16
PRINT "ON "
ELSE
PRINT "OFF"
ENDIF
'
PRINT AT(5,8);"LED3: ";
IF send| AND 32
PRINT "ON "
ELSE
PRINT "OFF"
ENDIF
'
PRINT AT(5,9);"LED4: ";
IF send| AND 64
PRINT "ON "
ELSE
PRINT "OFF"
ENDIF
RETURN
'
PROCEDURE send
LOCAL adr%
send|=BCLR(send|,0)
send|=BSET(send|,1)
send|=BSET(send|,7)
IF oldsend|<>send|
adr%=VARPTR(kbd$)
CARD{adr%+4}=send|
~XBIOS(25,5,L:adr%)
~XBIOS(25,5,L:adr%)
oldsend|=send|
ENDIF
RETURN
--- Ende Code ---
und im Anhang als GFA. (.PDF entfernen)
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln