home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SWITCH.PAS *)
- (* Bis zu 8 Schalter abfragen *)
- (* mit einer IBM-Gamekarte *)
- (* (c) 1991 Andreas Bartels & TOOLBOX *)
- (* ------------------------------------------------------ *)
- {$A+,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-}
- PROGRAM Switch;
- USES Crt, Dos;
- CONST
- DaumenfaktorDefault = 0.9988; { Korrektur für
- Werteverlauf: wenn nur Einzelwerte nicht
- stimmen, individuell anpassen! }
- Daumenfaktor : REAL = DaumenfaktorDefault;
- Daumenschritt = 0.0001; { Schrittweite }
- Daumenwert : INTEGER = 0; { Wert für Anzeige }
- MaxZaehler = 8000; { Höchstanzahl Zugriffe auf Gameport }
- PortNr = $201; { Gameport }
- TitelCol = Yellow OR Green SHL 4; { Farbattribute }
- NormCol = Yellow OR Blue SHL 4;
- WertCol = LightGreen OR Blue SHL 4;
- SwCol : ARRAY[FALSE..TRUE] OF BYTE =
- (White OR Blue SHL 4, Yellow OR Red SHL 4);
- SwStringLength = 34; { Maximallänge der Stichworte }
- SwStringLengthPlus1 = SwStringLength + 1;
- SwString : ARRAY[0..7] OF STRING[SwStringLength]
- = (' Besuch (angekündigter Überfall) ',
- ' Einbruch (nicht angek. Überfall) ',
- ' Küche erstickt im Abwasch ',
- ' Hundehütte muß renoviert werden ',
- ' Kellerbar wird geplündert ',
- ' Eisschrank leergefressen ',
- ' Saunatür verrammelt ',
- ' Kinder randalieren ');
- WertX = 5; { Schirmkoordinaten Schalterwert }
- WertY = 9;
- DaumenX = 66; { ... und Daumenfaktor }
-
- VAR
- Justierung : REAL; { Divisor für Umrechnung }
- Min : INTEGER; { minimaler und }
- Max : INTEGER; { maximaler Meßwert }
- i, X0, Y0,
- SNo, HilfByte : BYTE; { Lauf- und Hilfsvariablen }
- Help : INTEGER;
- GP : BYTE; { Bytewert für Schalter }
- KanalOK : BOOLEAN; { Status Gameport }
- Sw : ARRAY[0..7] OF BOOLEAN; { Schalter }
- TSS, DSS, LSS, BSS : STRING[SwStringLengthPlus1];
- DS, LS : STRING[SwStringLengthPlus1];
- ch : CHAR; { Taste }
-
- PROCEDURE CursorOn;
- BEGIN
- INLINE($B4/$01/
- $B9/13/12/ { Cursoranf. 12. Zl., -ende 13. Zl. }
- $CD/$10);
- END;
-
- PROCEDURE CursorOff;
- BEGIN
- INLINE($B4/$01/
- $B9/$FF/$FF/ { Cursoranfang und -ende... }
- $CD/$10); { ...auf 255 setzen: löscht den Cursor }
- END;
-
- FUNCTION RStr(r : REAL; n, m : BYTE) : STRING;
- VAR { "Str" als Funktion }
- S : STRING;
- BEGIN
- Str(r:n:m, S);
- RStr := S;
- END;
-
- FUNCTION GamePort : INTEGER; { Wert vom Gameport lesen }
- VAR
- GPWert, Zaehler : INTEGER;
- BEGIN
- INLINE ($FA); { CLI: Interrupts sperren }
- Zaehler := 0;
- REPEAT
- GPWert := Port[PortNr];
- Inc(Zaehler);
- UNTIL (GPWert AND 1 = 0)
- OR (Zaehler >= MaxZaehler);
- Port[PortNr] := GPWert;
- REPEAT
- GPWert := Port[PortNr];
- Inc(Zaehler);
- UNTIL (GPWert AND 1 = 0)
- OR (Zaehler >= MaxZaehler);
- INLINE($FB); { STI: Interrupts wieder zulassen }
- { Status ermitteln; den Wert "2" ggf. anpassen }
- KanalOK := (Zaehler < MaxZaehler) AND (Zaehler > 2);
- IF KanalOK THEN GamePort := Zaehler
- ELSE GamePort := 0;
- END;
-
- FUNCTION Messen(Anzahl : BYTE) : INTEGER;
- VAR { Meßreihe durchführen, Ergebnis geometr. mitteln }
- n : BYTE;
- Summe : LONGINT;
- BEGIN
- Summe := 0;
- FOR n := 1 TO Anzahl DO
- Summe := Summe + Sqr(WORD(GamePort));
- Summe := Round(Summe / Anzahl);
- Messen := Round(Sqrt(Summe));
- END;
-
- PROCEDURE WriteXY(x, y : BYTE; S : STRING; Col : BYTE);
- BEGIN
- TextAttr := Col;
- GotoXY(x, y);
- Write(S);
- END;
-
- PROCEDURE WriteKaestchen(i : BYTE);
- BEGIN
- WriteXY(X0, Y0 + i ,'║' + LS + '║', NormCol );
- WriteXY(X0, Y0 + i + 1,'╠' + DS + '╣', NormCol );
- END;
-
- PROCEDURE Adjust; { Schaltung einmessen }
- VAR
- Dummy : INTEGER;
- BEGIN
- ClrScr;
- Min := 0;
- Max := 0;
- REPEAT
- WriteLn('Abgleich der Schalter');
- WriteLn('=====================', #10#13);
- WriteLn('Bitte schalten Sie alle Schalter aus ' +
- 'und drücken Sie <ENTER>');
- REPEAT UNTIL ReadKey = #13;
- Dummy := GamePort;
- IF KanalOK THEN BEGIN { Kanal ist aktiv }
- Max := Messen(120);
- WriteLn('Gemessener Wert: ', Max:5);
- WriteLn('Und jetzt: Alle Schalter ein und ' +
- 'nochmal <ENTER>');
- REPEAT UNTIL ReadKey = #13;
- Min := GamePort;
- IF Min < Max THEN
- Justierung := (Max - Min) / 256
- ELSE
- WriteLn(^G, 'Justierung falsch! ' +
- 'Bitte wiederholen...', #10#13);
- END;
- IF Justierung = 0.0 THEN
- Justierung := 0.0001;
- UNTIL (Min < Max) OR NOT KanalOK;
- END;
-
- BEGIN
- TextAttr := NormCol;
- CheckBreak := FALSE; { wichtig wegen Sperrung der
- Interrupts in der Funktion "GamePort"! }
- Adjust; { einmessen }
- CursorOff;
- ClrScr;
- X0 := 18;
- Y0 := 8;
- WriteXY(X0, 2,
- '┌─────────────────────────────────────────┐',
- TitelCol);
- WriteXY(X0, 3,
- '│ "Switch": 8 Schalterstellungen │',
- TitelCol);
- WriteXY(X0, 4,
- '│ über eine Game-Karte abfragen │',
- TitelCol);
- WriteXY(X0, 5,
- '│ (c) 1991 A. Bartels & toolbox │',
- TitelCol);
- WriteXY(X0, 6,
- '└─────────────────────────────────────────┘',
- TitelCol);
- X0 := 21;
- DS := '';
- LS := '';
- FOR i := 1 TO SwStringLength DO BEGIN
- DS := DS + '═';
- LS := LS + ' ';
- END;
- TSS := DS + '╦';
- DSS := DS + '╬';
- LSS := LS + '║';
- BSS := DS + '╩';
- WriteXY(X0, Y0, '╔' + DS +'╗', NormCol);
- FOR i := 0 TO 6 DO WriteKaestchen(2 * i + 1);
- WriteXY(X0, Y0 + 15, '║' + LS + '║', NormCol);
- WriteXY(X0, Y0 + 16, '╚' + DS + '╝', NormCol);
- WriteXY(WertX - 1, WertY - 1, '╔══ Wert ══╗', WertCol);
- WriteXY(WertX - 1, WertY , '║ ║', WertCol);
- WriteXY(WertX - 1, WertY + 1, '╚══════════╝', WertCol);
- WriteXY(DaumenX - 1, WertY - 1, '╔═ Daumen ═╗', WertCol);
- WriteXY(DaumenX - 1, WertY , '║ ║', WertCol);
- WriteXY(DaumenX - 1, WertY + 1, '╚══════════╝', WertCol);
- WriteXY(DaumenX, WertY, RStr(Daumenwert, 7, 0), WertCol);
- ch := #0;
- REPEAT
- { Gameport-Kanal abfragen, evtl. invertierte Arbeitsweise }
- Help := Messen(20);
- Help := {255-}Round((Help * Daumenfaktor - Min) /
- Justierung);
- IF Help > 255 THEN Help := 255 { Überlauf abfangen }
- ELSE
- IF Help < 0 THEN Help := 0;
- GP := Help;
- IF KanalOK THEN { Wert anzeigen }
- WriteXY(WertX, WertY, RStr(GP, 7, 0) + ' ', WertCol)
- ELSE BEGIN
- WriteXY(WertX, WertY, ' Fehler!', WertCol);
- Sound(440); { Alarmton, falls Kabel
- Delay(10); defekt oder ähnliches }
- NoSound;
- END;
- { Einzelne Bits in Schalter umrechnen }
- FOR i := 0 TO 7 DO BEGIN
- HilfByte := BYTE(GP SHL (7 - i));
- Sw[i] := (HilfByte SHR 7) > 0;
- END;
- FOR SNo := 0 TO 7 DO { Schalterzustände darstellen }
- WriteXY(Succ(X0), Succ(Y0) + SNo * 2,
- SwString[SNo], SwCol[Sw[SNo]]);
- IF KeyPressed THEN BEGIN { Daumenfaktor verändern }
- ch := ReadKey;
- IF ch = #0 THEN ch := ReadKey;
- CASE ch OF
- '+' : Inc(Daumenwert);
- '-' : Dec(Daumenwert);
- END;
- Daumenfaktor := DaumenfaktorDefault + Daumenwert *
- Daumenschritt;
- WriteXY(DaumenX, WertY,
- RStr(Daumenwert, 7, 0), WertCol);
- END;
- UNTIL ch = #27;
- CursorOn;
- TextMode(LastMode);
- ClrScr;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von SWITCH.PAS *)
-