'===========================================================================
' Subject: MULTIKEY FUNCTION UPDATE           Date: 05-13-97 (14:46)       
'  Author: Joe Huber, Jr.                     Code: QB, QBasic, PDS        
'  Origin: huberjjr@nicom.com               Packet: KEYBOARD.ABC
'===========================================================================
DECLARE SUB KEYTEST (LOWERLIMIT!, UPPERLIMIT!)
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
'
'CALL KEYTEST(lower,upper)
'Use this to find new keycodes
'(unrem below to test)

' CALL KEYTEST(1, 200)

'Gives all keynums between 1 & 200
'If the 0 by the number becomes a 1, then the key with that keycode is
'currently being depressed

'EMAIL ME AT: huberjjr@nicom.com
'
'HAVE FUN!!!

'



CLS

X = 10: Y = 10
XX = X: YY = Y

DO

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,              

SUB KEYTEST (LOWERLIMIT, UPPERLIMIT)


DO
X = 1
Y = 1

 FOR I = LOWERLIMIT TO UPPERLIMIT
  TEST = MULTIKEY(I)
  LOCATE Y, X
  PRINT TEST; I
 
  IF Y < 23 THEN
   Y = Y + 1
  ELSE
   Y = 1
   X = X + 7
  END IF
 NEXT I

LOOP WHILE MULTIKEY(1) = 0
END
END SUB

FUNCTION MULTIKEY (KEYNUM)

 STATIC FIRSTIME, KEYS(), SC(), DU()

 IF FIRSTIME = 0 THEN
  DIM KEYS(255), SC(255), DU(255)
  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
