'===========================================================================
' Subject: MULTIPLE KEYS                      Date: 03-08-97 (13:07)       
'  Author: Joe Huber, Jr.                     Code: QB, QBasic, PDS        
'  Origin: huberjjr@nicom.com               Packet: KEYBOARD.ABC
'===========================================================================
DECLARE FUNCTION MULTIKEY (KEYNUM)

'MUTIKEY FUNCTION - LETS YOU TRAP SEVERAL KEYS AT ONCE (BETTER THAN INKEY$!!)
'
'USAGE:
'  riable=MULTIKEY(KEYNUM)
'WHERE KEYNUM IS THE KEY YOU WANT TO TRAP
'  riable = 1 IF KEY IS DEPRESSED, 0 IF IT ISN'T
'
'EMAIL ME AT: huberjjr@nicom.com
'
'HAVE FUN!!!


DIM SHARED KEYS(255), SC(255), DU(255)  'ALWAYS NEED THIS!!!

CLS

X = 10: Y = 10
XX = X: YY = Y

DO

'FOR I = 1 TO 255                    '\
' TEST = MULTIKEY(I)                 ' |-TEST LOOP
' LOCATE 1, 1: PRINT TEST; I         ' |
' WHILE INKEY$ = "": WEND            ' | PRESS KEY IN QUESTION UNTIL
'  IF TEST = 1 THEN END              ' | LOOP ENDS. THE SECOND NUMBER IS THE
'NEXT I                              '/  SCAN CODE FOR MULTIKEY

RIGHT = MULTIKEY(75)    ' GET SOME KEYS' STATUSES
LEFT = MULTIKEY(77)
UP = MULTIKEY(72)
DOWN = MULTIKEY(80)
SPACE = MULTIKEY(57)
ESC = MULTIKEY(1)

IF ESC = 1 THEN END    'TEMINATE WHEN ESCAPE IS PRESSED

IF TIMELOOP = 100 THEN             'THIS MOVES YOU AROUND
 IF RIGHT = 1 THEN X = X - 1
 IF LEFT = 1 THEN X = X + 1        'THE TIMELOOP   RIABLE DELAYS
 IF UP = 1 THEN Y = Y - 1          'MOVEMENT WITHOUT SLOWING DOWN
 IF DOWN = 1 THEN Y = Y + 1        'INPUT (WITHOUT IT YOU WOULD GO
 TIMELOOP = 0                      'WAAAAYYY TOO FAST)
END IF

IF X >= 80 THEN X = 80        'KEEPS YOU FROM GOING OFF THE SCREEN AND
IF X <= 0 THEN X = 1          'MAKING AN ERROR
IF Y >= 23 THEN Y = 23
IF Y <= 0 THEN Y = 1


IF SPACE = 1 THEN                    'CHANGES YOUTR SHAPE WHEN
 LOCATE Y, X: PRINT CHR$(94)         'YOU HIT SPACE
ELSE
 LOCATE Y, X: PRINT CHR$(127)
END IF

IF XX <> X OR YY <> Y THEN           'UPDATES YOUR POSITION
 LOCATE YY, XX: PRINT " "
 LOCATE Y, X: PRINT CHR$(127)
END IF


XX = X: YY = Y                     'TELLS ME WHERE I WAS LAST

TIMELOOP = TIMELOOP + 1

LOOP                 'LOOP (DUH...) :)

'THANX TO Eric Carr FOR FIGURING OUT HOW TO TRAP SEVERAL KEYS AT ONCE
'EVERYTHING ELSE WRITTEN BY ME,              

FUNCTION MULTIKEY (KEYNUM)

 STATIC FIRSTIME

 IF FIRSTIME = 0 THEN
  FOR E = 0 TO 127              '\
  SC(E) = E: DU(E) = 1          '|
  NEXT                          '|-ERIC CARR'S CODE--------------------\
  FOR E = 128 TO 255            '|                                     |
  SC(E) = E - 128: DU(E) = 0    '|                                     |
  NEXT                          '/                                     |
  FIRSTIME = -1                 '                                      |
 END IF                         '                                      |
                                '                                      |
 I$ = INKEY$       ' So the keyb buffer don't get full     \routine/ \ |
 I = INP(&H60)     ' Get keyboard scan code from port 60h   \lines/  |-/
 OUT &H61, INP(&H61) OR &H82: OUT &H20, &H20       '         \!!!/   |
 KEYS(SC(I)) = DU(I) ' This says what keys are pressed        \!/    /

MULTIKEY = KEYS(KEYNUM)


END FUNCTION
