home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-10-11 | 5.5 KB | 185 lines | [TEXT/PJMM] |
- {KbdLts}
- {A Keyboard light manipulating demo that WORKS - which Apple's demo dos NOT!}
- {This demo is directly based on Apple's demo (from Inside Mac), but corrected to}
- {work on non-US keyboards. Apple's code only checked for the US keyboard layout,}
- {and did nothing on international keyboards no matter whether they had lights or not.}
- {}
- {I don't claim that this is the optimal way to solve the problem, but I do claim that}
- {it works better than what we had before.}
- {}
- {By Ingemar Ragnemalm 1995. Think Pascal source-code.}
-
- program KbdLts;
- uses
- DeskBus;
-
- function IsExtendedKeyboard (myAddress: ADBAddress): Boolean;
- var
- myInfo: ADBDataBlock;
- myCommand: Integer;
- myErr: OSErr;
- response: Longint;
- isExt: Boolean;
- const
- kExtKeyboardAddr = 2;
- kExtKeyboardOrigHandlerID = 2;
- begin
- myErr := Gestalt('kbd ', response);
- {response one out of:}
- {4,9, 15? 16? 17? 20,21,24. PowerUser = 9 (ext ISO)}
- case response of
- 4, 9, 15, 16, 17, 20, 21, 24:
- isExt := true;
- otherwise
- isExt := false;
- end;
-
- myErr := GetADBInfo(myInfo, myAddress);
- IsExtendedKeyboard := (myInfo.origADBAddr = kExtKeyboardAddr) and isExt;
- end; {IsExtendedKeyboard}
-
-
- procedure MySetFlag;
- {move a nonzero value into the word pointed to by register A2}
- inline
- $34BC, $FFFF; {MOVE.W #$FFFF, (A2)}
-
- procedure MyCompletionRoutine;
- begin
- MySetFlag; {set a flag to indicate done}
- end;
-
- function MySendADBCommand (myBufferPtr: Ptr; myCommand: Integer): OSErr;
- {send a command to an ADB device synchronously}
- var
- myDone: Integer; {completion flag}
- myErr: OSErr;
- begin
- myDone := 0;
- myErr := ADBOp(@myDone, @MyCompletionRoutine, myBufferPtr, myCommand);
- if myErr = noErr then
- repeat
- until myDone <> 0
- else
- ; {ADB buffer overflowed -- retry command here}
- MySendADBCommand := myErr;
- end;
-
- var
- gRegisterData: packed array[0..8] of Byte; {buffer for register data}
- const
- kListenMask = 8; {masks for ADB commands}
- kTalkMask = 12;
- kLEDRegister = 2; {register containing LED settings}
- kLEDValueMask = 7; {mask for bits containing current LED setting}
-
- function MyGetLEDValue (myAddress: ADBAddress; var myLEDValue: Integer): OSErr;
- var
- myCommand: Integer;
- myErr: OSErr;
- begin
- {initialize length of buffer; on return, the ADB device sets }
- gRegisterData[0] := Byte(0); { this byte to the number of bytes returned}
- {get existing register contents with a Talk command}
- myCommand := (myAddress * 16) + kTalkMask + kLEDRegister;
- myErr := MySendADBCommand(@gRegisterData, myCommand);
- if myErr = noErr then {make sure completed successfuly}
- {gRegisterData now contains the existing data in device register 2; }
- { the lower 3 bits of byte 2 contain the LED value}
- myLEDValue := Integer(BAND(gRegisterData[2], kLEDValueMask))
- else
- myLEDValue := 0;
- MyGetLEDValue := myErr;
- end;
-
- {Listing 5-4 Setting the current state of the LED lights}
-
- function MySetLEDValue (myAddress: ADBAddress; myValue: Integer): OSErr;
- var
- myCommand: Integer;
- myByte: Byte; {existing byte 2 of device register 2}
- myErr: OSErr;
- begin
- gRegisterData[0] := Byte(2); {set length of buffer}
- {get existing register contents with a Talk command}
- myCommand := (myAddress * 16) + kTalkMask + kLEDRegister;
- myErr := MySendADBCommand(@gRegisterData, myCommand);
- MySetLEDValue := myErr;
- if myErr <> noErr then {make sure completed successfuly}
- EXIT(MySetLEDValue);
- {gRegisterData now contains the existing data in device register 2; }
- { reset the lower 3 bits of byte 2 to the desired value}
- myByte := gRegisterData[2];
- myByte := BAND(myByte, 255 - 7); {mask off lower three bits}
- myByte := BOR(myByte, Byte(myValue)); {install desired value}
- gRegisterData[2] := myByte;
- myCommand := (myAddress * 16) + kListenMask + kLEDRegister;
- MySetLEDValue := MySendADBCommand(@gRegisterData, myCommand);
- end;
-
- {Listing 5-5 Counting in binary using a keyboard’s LED lights}
-
- procedure MyCountWithLEDs;
- var
- myValue: Integer;
- myIndex: Integer;
- myAddress: ADBAddress;
- myOrigLED: Integer;
- myInfo: ADBDataBlock; {needed for GetIndADB; ignored here}
- myDelay: LongInt; {needed for Delay; ignored here}
- myErr: OSErr;
- begin
- for myIndex := 1 to CountADBs do
- begin
- myAddress := GetIndADB(myInfo, myIndex);
- if IsExtendedKeyboard(myAddress) then
- begin
- {save original state of LED lights}
- myErr := MyGetLEDValue(myAddress, myOrigLED);
- myValue := 7; {turn all the lights OFF}
- while myValue >= 0 do
- begin
- myErr := MySetLEDValue(myAddress, myValue);
- myValue := myValue - 1;
- Delay(30, myDelay);
- end;
- {restore original state of LED lights}
- myErr := MySetLEDValue(myAddress, myOrigLED);
- end; {IF}
- end; {FOR}
- end;
-
- var
- myDelay: LongInt;
- myErr: OSErr;
- myOrigLED: Integer;
-
- begin
-
- myErr := MyGetLEDValue(2, myOrigLED);
- myErr := MySetLEDValue(2, 7);
- Delay(30, myDelay);
- myErr := MySetLEDValue(2, 0);
- Delay(30, myDelay);
- myErr := MySetLEDValue(2, 7);
- Delay(30, myDelay);
- myErr := MySetLEDValue(2, 0);
- Delay(30, myDelay);
- myErr := MySetLEDValue(2, 7 - 1);
- Delay(30, myDelay);
- myErr := MySetLEDValue(2, 7 - 2);
- Delay(30, myDelay);
- myErr := MySetLEDValue(2, 7 - 4);
- Delay(30, myDelay);
- myErr := MySetLEDValue(2, 7 - 1);
- Delay(30, myDelay);
- myErr := MySetLEDValue(2, 7 - 2);
- Delay(30, myDelay);
- myErr := MySetLEDValue(2, 7 - 4);
- Delay(30, myDelay);
- myErr := MySetLEDValue(2, myOrigLED);
-
-
- MyCountWithLEDs;
-
- end.