Handheld Game

' {$STAMP BS2e}
' {$PBASIC 2.5}

LED1    PIN   4
LED2    PIN   1
LED3    PIN   8
LED4    PIN   14
LED5    PIN   5
LED6    PIN   10
LED7    PIN   12
IR      PIN   13
BTN1    PIN   3
BTN2    PIN   7
S0      PIN   2
S1      PIN   0
IN      PIN   15
BUZZ    PIN   9

ENDLEFT   VAR   Bit
ENDRIGHT  VAR   Bit
Slot1     VAR   Bit
Slot2     VAR   Bit
Slot3     VAR   Bit
Slot5     VAR   Bit
Slot6     VAR   Bit
Slot7     VAR   Bit
CNTR      VAR   Nib
PREV      VAR   Nib
i         VAR   Byte
TIME      VAR   Byte
TIMER     VAR   Word

FREQOUT BUZZ, 400, 1000
PAUSE 400
FREQOUT BUZZ, 400, 1000
PAUSE 400
FREQOUT BUZZ, 400, 1000
PAUSE 400
FREQOUT BUZZ, 500, 3000

Main:

TIME = 20

Start:
GOSUB Blink_Left


DO

IF BTN2 = 0 THEN
  GOTO Main
ENDIF

IF ENDLEFT = 1 THEN
  GOSUB Blink_Right
  ENDLEFT = 0
ELSEIF ENDRIGHT = 1 THEN
  GOSUB Blink_Left
  ENDRIGHT = 0
ENDIF

LOOP

Blink_Left:

GOSUB Check_Slot7
IF BTN1 = 0 THEN
  CNTR = 0
  TIMER = 0
  GOSUB Level_Up
ENDIF
GOSUB Check_Slot6
GOSUB Check_Slot5
IF BTN1 = 0 THEN
  CNTR = 0
  TIMER = 0
  GOSUB Level_Up
ENDIF
GOSUB Check_Center
GOSUB Check_Slot3
IF BTN1 = 0 THEN
  CNTR = 0
  TIMER = 0
  GOSUB Level_Up
ENDIF
GOSUB Check_Slot2
GOSUB Check_Slot1
IF BTN1 = 0 THEN
  CNTR = 0
  TIMER = 0
  GOSUB Level_Up
ENDIF
ENDLEFT = 1
RETURN

Blink_Right:

GOSUB Check_Slot1
IF BTN1 = 0 THEN
  CNTR = 0
  TIMER = 0
  GOSUB Level_Up
ENDIF
GOSUB Check_Slot2
GOSUB Check_Slot3
IF BTN1 = 0 THEN
  CNTR = 0
  TIMER = 0
  GOSUB Level_Up
ENDIF
GOSUB Check_Center
GOSUB Check_Slot5
IF BTN1 = 0 THEN
  CNTR = 0
  TIMER = 0
  GOSUB Level_Up
ENDIF
GOSUB Check_Slot6
GOSUB Check_Slot7
IF BTN1 = 0 THEN
  CNTR = 0
  TIMER = 0
  GOSUB Level_Up
ENDIF
ENDRIGHT = 1
RETURN

Check_Slot1:

HIGH LED1
FOR i = 1 TO TIME
  IF IR = 0 THEN
    Slot1 = 1
    GOSUB Loser
  ENDIF
NEXT
LOW LED1
RETURN

Check_Slot2:

HIGH LED2
FOR i = 1 TO TIME
  IF IR = 0 THEN
    Slot2 = 1
    GOSUB Loser
  ENDIF
NEXT
LOW LED2
RETURN

Check_Slot3:

HIGH LED3
FOR i = 1 TO TIME
  IF IR = 0 THEN
    Slot3 = 1
    GOSUB Loser
  ENDIF
NEXT
LOW LED3
RETURN

Check_Center:

HIGH LED4
FOR i = 1 TO TIME
  IF IR = 0 THEN
    GOSUB Winner
  ENDIF
NEXT
LOW LED4
RETURN

Check_Slot5:

HIGH LED5
FOR i = 1 TO TIME
  IF IR = 0 THEN
    Slot5 = 1
    GOSUB Loser
  ENDIF
NEXT
LOW LED5
RETURN

Check_Slot6:

HIGH LED6
FOR i = 1 TO TIME
  IF IR = 0 THEN
    Slot6 = 1
    GOSUB Loser
  ENDIF
NEXT
LOW LED6
RETURN

Check_Slot7:

HIGH LED7
FOR i = 1 TO TIME
  IF IR = 0 THEN
    Slot7 = 1
    GOSUB Loser
  ENDIF
NEXT
LOW LED7
RETURN

Winner:

HIGH LED4
PAUSE 50
LOW LED4
PAUSE 50
HIGH LED4
PAUSE 50
LOW LED4
PAUSE 50
HIGH LED4
PAUSE 50
LOW LED4

HIGH LED1
HIGH LED7
PAUSE 500
HIGH LED2
HIGH LED6
PAUSE 500
HIGH LED3
HIGH LED5
PAUSE 500
HIGH LED4
PAUSE 1000

FOR i = 1 TO 40
  HIGH LED4
  PAUSE 20
  LOW LED4
NEXT

LOW LED1
LOW LED2
LOW LED3
LOW LED5
LOW LED6
LOW LED7

FREQOUT BUZZ, 100, 1500
PAUSE 5
FREQOUT BUZZ, 100, 1300
PAUSE 5
FREQOUT BUZZ, 100, 1500
PAUSE 5
FREQOUT BUZZ, 200, 3000
PAUSE 100

FOR i = 1 TO 20
  IF i = 5 THEN
    HIGH LED2
  ELSEIF i = 10 THEN
    LOW LED2
    HIGH LED6
  ELSEIF i = 15 THEN
    LOW LED6
    HIGH LED2
  ELSEIF i = 20 THEN
    LOW LED2
    HIGH LED6
  ELSEIF i = 25 THEN
    LOW LED6
    HIGH LED2
  ELSEIF i = 30 THEN
    LOW LED2
    HIGH LED6
  ELSEIF i = 35 THEN
    LOW LED6
    HIGH LED2
  ELSEIF i = 40 THEN
    LOW LED2
    HIGH LED6
  ELSEIF i = 45 THEN
    LOW LED6
    HIGH LED2
  ELSEIF i = 50 THEN
    LOW LED2
    HIGH LED6
  ENDIF

  HIGH LED1
  HIGH LED7
  PAUSE 25
  LOW LED1
  LOW LED7
  HIGH LED3
  HIGH LED5
  PAUSE 25
  LOW LED3
  LOW LED5
  PAUSE 50

NEXT
RETURN

Loser:

IF Slot1 = 1 THEN
  LOW LED1
  PAUSE 200
  HIGH LED1
  PAUSE 200
  LOW LED1
  Slot1 = 0
ELSEIF Slot2 = 1 THEN
  LOW LED2
  PAUSE 200
  HIGH LED2
  PAUSE 200
  LOW LED2
  Slot2 = 0
ELSEIF Slot3 = 1 THEN
  LOW LED3
  PAUSE 200
  HIGH LED3
  PAUSE 200
  LOW LED3
  Slot3 = 0
ELSEIF Slot5 = 1 THEN
  LOW LED5
  PAUSE 200
  HIGH LED5
  PAUSE 200
  LOW LED5
  Slot5 = 0
ELSEIF Slot6 = 1 THEN
  LOW LED6
  PAUSE 200
  HIGH LED6
  PAUSE 200
  LOW LED6
  Slot6 = 0
ELSEIF Slot7 = 1 THEN
  LOW LED7
  PAUSE 200
  HIGH LED7
  PAUSE 200
  LOW LED7
  Slot7 = 0
ENDIF

FREQOUT BUZZ, 100, 1500
PAUSE 100
FREQOUT BUZZ, 200, 1000
PAUSE 100

GOTO Start

Level_Up:

PAUSE 100

FREQOUT BUZZ, 100, 2500
PAUSE 20
FREQOUT BUZZ, 100, 2500
PAUSE 20
FREQOUT BUZZ, 100, 2500
PAUSE 500

LOW LED1
LOW LED2
LOW LED3
LOW LED4
LOW LED5
LOW LED6
LOW LED7
PAUSE 1000

DO

PREV = CNTR
IF BTN1 = 0 THEN
  PAUSE 300
  CNTR = CNTR + 1
ENDIF

IF CNTR > PREV THEN
  TIMER = 0
ENDIF

IF CNTR = 1 THEN
  HIGH LED1
  TIMER = TIMER + 1
  TIME = 50
ELSEIF CNTR = 2 THEN
  HIGH LED1
  HIGH LED2
  TIMER = TIMER + 1
  TIME = 40
ELSEIF CNTR = 3 THEN
  HIGH LED1
  HIGH LED2
  HIGH LED3
  TIMER = TIMER + 1
  TIME = 30
ELSEIF CNTR = 4 THEN
  HIGH LED1
  HIGH LED2
  HIGH LED3
  HIGH LED4
  TIMER = TIMER + 1
  TIME = 20
ELSEIF CNTR = 5 THEN
  HIGH LED1
  HIGH LED2
  HIGH LED3
  HIGH LED4
  HIGH LED5
  TIMER = TIMER + 1
  TIME = 10
ELSEIF CNTR = 6 THEN
  HIGH LED1
  HIGH LED2
  HIGH LED3
  HIGH LED4
  HIGH LED5
  HIGH LED6
  TIMER = TIMER + 1
  TIME = 8
ELSEIF CNTR = 7 THEN
  HIGH LED1
  HIGH LED2
  HIGH LED3
  HIGH LED4
  HIGH LED5
  HIGH LED6
  HIGH LED7
  TIMER = TIMER + 1
  TIME = 6
ENDIF

LOOP UNTIL TIMER > 650
TIMER = 0
CNTR = 0
GOTO Start