; --------------------------------------------------
; Prelims
; -------
; Use this space to power up the robot, etc etc in order to test your robot.  Nothing here should
; be an integral part of the robots functionality.  It should be easily erased with no consequences.

ORG	&H00	; Begin program at 00
Begin:
	LOAD	One
	OUT		Reset

AllDone:
	JUMP	AllDone
	
; -----------
; End Prelims
; --------------------------------------------------


; --------------------------------------------------
; Experimental Functions
; ----------------------
; Put all the functions you're testing here

Pass:
	LOAD	Zero ;;REPLACE THESE LINES WITH PASS CODE
	ADDI	&HA
	OUT		SevenSeg
	CALL	WaitHalfSecond
	RETURN

ClearIR:
	LOAD	Zero
	STORE	Local1
	ClearIR_1:
	LOAD	Local1
	OUT		IRcomm
	IN		IRcomm
	CALL	TestIR_1
	JNEG	ClearIR_1
	RETURN
	
TestIR:
	CALL	ResetIR ;read in to reset IR
	IR0:
		CALL	TestIR_2 ;select the IR emitter we want and load the code up
		OUT		IREmit0 ;output the code
		CALL	TestIR_1 ;increase local3 (the detector loop variable), wait for the emit to propogate, read it, compare it
		JNEG	IR0 ;jump back to IR0 while local3 < 8
	LOAD	Local2
	STORE	IRE0 ;store whether we got the signal (1) or not (0) in IRE0
	CALL	ResetIR
	IR1:
		CALL	TestIR_2
		OUT		IREmit1
		CALL	TestIR_1
		JNEG	IR1
	LOAD	Local2
	STORE	IRE1
	CALL	ResetIR
	IR2:
		CALL	TestIR_2
		OUT		IREmit2
		CALL	TestIR_1
		JNEG	IR2
	LOAD	Local2
	STORE	IRE2
	CALL	ResetIR
	IR3:
		CALL	TestIR_2
		OUT		IREmit3
		CALL	TestIR_1
		JNEG	IR3
	LOAD	Local2
	STORE	IRE3
	CALL	ResetIR
	IR4:
		CALL	TestIR_2
		OUT		IREmit4
		CALL	TestIR_1
		JNEG	IR4
	LOAD	Local2
	STORE	IRE4
	CALL	ResetIR
	IR5:
		CALL	TestIR_2
		OUT		IREmit5
		CALL	TestIR_1
		JNEG	IR5
	LOAD	Local2
	STORE	IRE5
	CALL	ResetIR
	IR6:
		CALL	TestIR_2
		OUT		IREmit6
		CALL	TestIR_1
		JNEG	IR6
	LOAD	Local2
	STORE	IRE6
	CALL	ResetIR
	IR7:
		CALL	TestIR_2
		OUT		IREmit7
		CALL	TestIR_1
		JNEG	IR7
	LOAD	Local2
	STORE	IRE7
	
	;end test, display results
	RETURN
		
	ResetIR:
		CALL	ClearIR ;clear all IRs
		LOAD	Zero
		STORE	Local3 ;reset the loop counter
		STORE	Local2 ;reset "working emitter" variable
		RETURN
	
	TestIR_1:
		CALL	INCLocal3
		CALL	WaitHalfSecond
		IN		IRcomm
		SUB		Code
		JZERO	TestIR_3
		LOAD	Local3
		SUB		Eight
		RETURN
		TestIR_3:
			LOAD	One
			STORE	Local2
			;need to select which IR decoder passed and store it into the correct variable (IRD0 - IRD7)
			;ex: ird0 = 1
			RETURN
		
	TestIR_2:
		LOAD	Local1
		OUT		IRComm
		LOAD	Code
		RETURN
		
;end IR testing

WaitHalfSecond:
	LOAD	Five
	STORE	In1
	CALL	Delay
	RETURN
	
WaitSecond:
	LOAD	Zero
	ADDI	10
	STORE	In1
	CALL	Delay
	RETURN
		
FTSevSeg:
	CALL	INCLocal3
	OUT		SevenSeg
	OUT		Timer
	RETURN

FTFail:
	LOAD	Local3
	ADDI	&H70
	STORE	In1
	CALL	Fail
	RETURN

FTFive:
	IN		Timer
	ADDI	-50
	RETURN
	
SATFailFifty:
	LOAD	Zero
	ADDI	&H50
	STORE	In1
	CALL	Fail
	RETURN
		
FiringTest:
	LOAD	Zero
	STORE	Local3
	CALL	FTSevSeg
FT1a:
	IN		Sonar1
	SUB		MaxReading
	JZERO	FT2
	CALL	FTFive
	JNEG	FT1a
	CALL	FTFail
	
FT2:
	CALL	FTSevSeg
FT2a:
	IN		Sonar2
	SUB		MaxReading
	JZERO	FT3
	CALL	FTFive
	JNEG	FT2a
	CALL	FTFail
	
FT3:
	CALL	FTSevSeg
FT3a:
	IN		Sonar3
	SUB		MaxReading
	JZERO	FT4
	CALL	FTFive
	JNEG	FT3a
	CALL	FTFail
	
FT4:
	CALL	FTSevSeg
FT4a:
	IN		Sonar4
	SUB		MaxReading
	JZERO	FT5
	CALL	FTFive
	JNEG	FT4a
	CALL	FTFail
	
FT5:
	CALL	FTSevSeg
FT5a:
	IN		Sonar5
	SUB		MaxReading
	JZERO	FT6
	CALL	FTFive
	JNEG	FT5a
	CALL	FTFail
	
FT6:
	CALL	FTSevSeg
FT6a:
	IN		Sonar6
	SUB		MaxReading
	JZERO	FT7
	CALL	FTFive
	JNEG	FT6a
	CALL	FTFail
	
FT7:
	CALL	FTSevSeg
FT7a:
	IN		Sonar7
	SUB		MaxReading
	JZERO	FT8
	CALL	FTFive
	JNEG	FT7a
	CALL	FTFail
	
FT8:
	CALL	FTSevSeg
FT8a:
	IN		Sonar8
	SUB		MaxReading
	JZERO	FTend
	CALL	FTFive
	JNEG	FT8a
	CALL	FTFail
	
FTend:
	LOAD	Zero
	ADDI	&HAA
	STORE	In1
	CALL	WaitPB2
	RETURN
	
RightAngleTest:
		; Description: This is designed to find the angle making the robot perpindicular
		;		to the wall
		; Inputs: None
		; Outputs: None
		; Locked Variables:
		;     MinAngleNum
		;     MinReading3
		;	  MinReading4
		;     NewReading
		;Order: 2
		CALL	EnableWheels
		STORE	IN1
		CALL	WaitPB2

RAT_A:
		IN		Sonar3					; In Sonar3
		STORE	Temp1					; Store
		IN		Sonar4					; In Sonar4
		SUB		Temp1					; Subtract 3
		JPOS	RAT_B					; Positive, 3 smaller, turn left
		JNEG	RAT_C					; Negative, 4 smaller, turn right
		JUMP	RAT_A
		
RAT_B:
		LOAD	One
		OUT		DeltaHeading
		LOAD	Two
		CALL	RAT_1
		JPOS	RAT_B
		LOAD	Zero
		ADDI	-2
		OUT		DeltaHeading
		CALL	Delay
		Return
		
RAT_C:
		LOAD	Zero
		SUB		One
		OUT		DeltaHeading
		LOAD	Three
		CALL	RAT_1
		JNEG	RAT_C
		LOAD	Two
		OUT		DeltaHeading
		CALL	Delay
		Return
		
RAT_1:
	STORE	In1
	STORE	In2
	CALL	Wait
	IN		Sonar3					; In Sonar3
	STORE	Temp1					; Store
	IN		Sonar4					; In Sonar4
	SUB		Temp1
	RETURN
		
ToWall:
	; Description - This routine carries the robot to the wall and then back
	; 	one meter to continue the test
	; Inputs - None
	; Outputs - None
	; Locked variables - None
	; Order - 2
	   
	   LOAD     Twenty
	   OUT      Velocity
	   CALL		Start
	   CALL		Stop
	   CALL		WaitHalfSecond
		   
AtWall:
		LOAD	Two
		OUT		Enable
		OUT		SevenSeg
		LOAD	Zero
		ADDI	-200			  ; Backwards 200 mm/s
		OUT		Velocity
		CALL	Start
		CALL	ResetTimer
AtWallLoop:
		CALL	FTFive
		JNEG	ATWallLoop
		CALL	StopRobot
		CALL	WaitHalfSecond
		RETURN

INCLocal3:
	LOAD	Local3
	ADD		One
	STORE	Local3
	RETURN		
		
SATFail:
	JPOS	SATFail_1
	ADDI	100
	JNEG	SATFail_1
	CALL	INCLocal3
	RETURN
	SATFail_1:
	CALL	INCLocal3
	LOAD	Temp1
	STORE	In1
	LOAD	SATread
	CALL	StoreInDiff
	STORE	In2
	LOAD	Local3
	ADDI	&H50
	STORE	In1
	CALL	Fail_by
	RETURN

SAT_Condense_1:
	STORE	Temp1
	CALL	WaitHalfSecond
	RETURN
	
SAT_Condense_2:
	OUT		DeltaHeading
	CALL	WaitHalfSecond
	CALL	ResetTimer
	RETURN

SonarAccTest:
	CALL	WaitHalfSecond
	LOAD	Zero
	STORE	Local3
	ADDI	-90
	CALL	SAT_Condense_2
	
SAT_1:
	IN		Sonar1
	CALL	SAT_Condense_1
	IN		Sonar1
	SUB		Temp1
	JZERO	SAT_1A
	CALL	FTFive
	JNEG	SAT_1
	CALL	SATFailFifty
	
SAT_1A:
	LOAD	Temp1
	SUB		SATread
	JZERO	SAT2
	CALL	SATFail
	
SAT2:
	LOAD	Zero
	ADDI	46
	CALL	SAT_Condense_2
SAT_2:
	IN		Sonar2
	CALL	SAT_Condense_1
	IN		Sonar2
	SUB		Temp1
	JZERO	SAT_2A
	CALL	FTFive
	JNEG	SAT_2
	CALL	SATFailFifty
	
SAT_2A:
	LOAD	Temp1
	SUB		SATread
	JZERO	SAT3
	CALL	SATFail
	
SAT3:
	LOAD	Zero
	ADDI	32
	CALL	SAT_Condense_2
SAT_3:
	IN		Sonar3
	CALL	SAT_Condense_1
	IN		Sonar3
	SUB		Temp1
	JZERO	SAT_3A
	CALL	FTFive
	JNEG	SAT_3
	CALL	SATFailFifty
	
SAT_3A:
	LOAD	Temp1
	SUB		SATread
	JZERO	SAT4
	CALL	SATFail
	
SAT4:
	LOAD	Zero
	ADDI	24
	CALL	SAT_Condense_2
SAT_4:
	IN		Sonar4
	CALL	SAT_Condense_1
	IN		Sonar4
	SUB		Temp1
	JZERO	SAT_4A
	CALL	FTFive
	JNEG	SAT_4
	CALL	SATFailFifty
	
SAT_4A:
	LOAD	Temp1
	SUB		SATread
	JZERO	SAT5
	CALL	SATFail
	
SAT5:
	LOAD	Zero
	ADDI	32
	CALL	SAT_Condense_2
SAT_5:
	IN		Sonar5
	CALL	SAT_Condense_1
	IN		Sonar5
	SUB		Temp1
	JZERO	SAT_5A
	CALL	FTFive
	JNEG	SAT_5
	CALL	SATFailFifty
	
SAT_5A:
	LOAD	Temp1
	SUB		SATread
	JZERO	SAT6
	CALL	SATFail
	
SAT6:
	LOAD	Zero
	ADDI	46
	CALL	SAT_Condense_2
SAT_6:
	IN		Sonar6
	CALL	SAT_Condense_1
	IN		Sonar6
	SUB		Temp1
	JZERO	SAT_6A
	CALL	FTFive
	JNEG	SAT_6
	CALL	SATFailFifty
	
SAT_6A:
	LOAD	Temp1
	SUB		SATread
	JZERO	SAT7
	CALL	SATFail
	
SAT7:
	LOAD	Zero
	ADDI	54
	CALL	SAT_Condense_2
SAT_7:
	IN		Sonar7
	CALL	SAT_Condense_1
	IN		Sonar7
	SUB		Temp1
	JZERO	SAT_7A
	CALL	FTFive
	JNEG	SAT_7
	CALL	SATFailFifty
	
SAT_7A:
	LOAD	Temp1
	SUB		SATread
	JZERO	SAT8
	CALL	SATFail
	
SAT8:
	LOAD	Zero
	ADDI	72
	CALL	SAT_Condense_2
SAT_8:
	IN		Sonar8
	CALL	SAT_Condense_1
	IN		Sonar8
	SUB		Temp1
	JZERO	SAT_8A
	CALL	FTFive
	JNEG	SAT_8
	CALL	SATFailFifty
	
SAT_8A:
	LOAD	Temp1
	SUB		SATread
	JZERO	SATend
	CALL	SATFail
	
SATend:
	LOAD	Zero
	ADDI	&HAA
	STORE	In1
	CALL	WaitPB2
	RETURN
	
EnableWheels:
	LOAD	One
	OUT		Enable
	RETURN
	
StopRobot:
	LOAD	Zero
	OUT		Velocity
	RETURN

StoreInDiff:
	STORE	In2
	CALL	Diff
	RETURN
	
; --------------------------
; End Experimental Functions
; --------------------------------------------------


; --------------------------------------------------
; Good Functions
; --------------
; Please do not modify these.  They have been determined to be good
; through testing.  Meet with group for approval before changing.

TestBumpers:
	; Description: This routine tests the bumpers.
	; Inputs: <none>
	; Outputs: <none>
	; Locked Variables: In1, Local1, Local2, Local3, Local4
	; Order: 5
	
	; first, run into a wall and output to the seven segment
	CALL	EnableWheels
	STORE	Local2
	LOAD	BumperForward
	STORE	Local4
	LOAD	Zero
	ADDI	&he1 ;load "E1" for "experimenting 1"
	OUT		SevenSeg
	LOAD	Zero
	ADDI	&H101
	STORE	Local3 ;expected value of the bumpers
	CALL	TestBumpers_3
	CALL	WaitHalfSecond
	; push the left wheel to expect a stall
	LOAD	UserPBMask
	STORE	Local3
	STORE	Local4
	CALL	TestBumpers_3
	CALL	WaitHalfSecond
	; push the right wheel to expect a right stall
	LOAD	One
	STORE	Local4
	STORE	Local3
	CALL	TestBumpers_3
	CALL	WaitHalfSecond
	;back the robot up a little
	LOAD	Zero
	SUB		Twenty
	OUT		Velocity
	CALL	Start
	CALL	WaitHalfSecond
	CALL	StopRobot
	CALL	Stop
	;;experimental rotation
	LOAD	Zero
	ADDI	180
	OUT		DeltaHeading
	CALL	Delay ;delay before going backwards
	;;end experimental rotation
	; backwards 2 wheel test
	CALL	WaitSecond
	LOAD	Zero
	SUB		BumperForward ; now go back
	SUB		One
	STORE	Local4
	LOAD	Zero
	ADDI	&H101
	STORE	Local3 ;expected value of the bumpers
	CALL	TestBumpers_3
	CALL	WaitHalfSecond
	; push the right wheel to expect a right stall
	LOAD	Zero
	ADDI	&H00FD
	STORE	Local4
	LOAD	One
	STORE	Local3
	CALL	TestBumpers_3
	CALL	WaitHalfSecond
	; push the left wheel to expect a stall
	LOAD	UserPBMask
	STORE	Local3
	LOAD	BumperBackLeft
	STORE	Local4
	CALL	TestBumpers_3
	RETURN
	TestSingleBumper:
	CALL	Start ; wait for the wheels to start moving
	CALL	ResetTimer
	TestBumpers_1:
		IN		Bumpers
		STORE	Local1 ;store the bumper info into local1
		AND		Local3
		JPOS	TestBumpers_4 ;test OK
		IN		Timer
		ADDI	-70 ;maximum timeout of 7 seconds
		JNEG	TestBumpers_1 ;loop if time not up
	LOAD	Local2
	ADDI	&H61
	STORE	In1
	CALL	StopRobot
	CALL	Stop
	CALL	Fail
	RETURN
	TestBumpers_4:
		;both bumpers working
		LOAD	Zero
		ADDI	&HA0
		ADD		Local2
		RETURN
	TestBumpers_3:
		;waits half a second and displays pass/fail codes
		CALL	EnableWheels
		LOAD	Local4
		OUT		LRVelCommand
		CALL	TestSingleBumper
		OUT		SevenSeg
		CALL	StopRobot
		CALL	Stop
		CALL	WaitHalfSecond
		CALL	Delay
		CALL	EnableWheels
		CALL	Delay
		CALL	Delay
		LOAD	Local2
		ADD		One
		STORE	Local2
		ADDI	&HE0
		OUT		Sevenseg
		RETURN

DipTest:
	; Description: This routine tests DIP switches.
	; Inputs: <none>
	; Outputs: <none>
	; Locked Variables: In1
	; Order: 2
	DipTest_Low:
		LOAD	Two			; '2' refers to low DIP test
		STORE	In1
		CALL	WaitPB2		; Wait until user presses PB2
		IN		Switches	; Read DIP switch values
		JZERO	DipTest_Intermediate	; If all low, call intermediate subroutine
		JUMP	DipTest_Fail			; Else, test fails
	DipTest_High:
		LOAD	Three		; '3' refers to high DIP test
		STORE	In1
		CALL	WaitPB2		; Wait until user presses PB2
		IN		Switches	; Read DIP switch values
		ADD		DipHigh		; Test against 8-bit value of 255: 00FF
		JZERO	DipTest_Pass_High	
		JUMP	DipTest_Fail_High
	DipTest_Fail:
	LOAD	Zero
	ADDI	&H10				; Display 'B' when low test fails
	STORE	IN1
	CALL	Fail_All
	RETURN
	DipTest_Pass:
	CALL	Pass
	RETURN
	DipTest_Intermediate:	; Intermediate subroutine
	JUMP	DipTest_Pass
	JUMP	DipTest_High
	DipTest_Pass_High:		; Display 'A' and hold for high test pass
	CALL	Pass
	RETURN
	DipTest_Fail_High:		; Display 'B' and hold for high test fail
	LOAD	Zero
	ADDI	&H11
	STORE	IN1
	CALL	Fail_All
	CALL	WaitHalfSecond
	RETURN

L_test:
	; Description: Performs the L-test
	; Inputs: <none>
	; Outputs:
	; Locked Variables: Local1,Local2,Local3,In1,In2
	; Order: 1
	LOAD	One
	OUT		Reset
	ADDI	&H00E0
	OUT		SevenSeg	
	CALL	ResetTimer
	L_test_1:				;Verifies X is changing
		CALL	FTFive
		JPOS	L_test_fail_1		;ADD IN1 Error Code
	L_test_1_1:
		IN		Xposition
		JZERO	L_test_1
		CALL	WaitPB2
		IN		Xposition
		STORE	Local1
		STORE	IN1
		LOAD	SixFifty
		CALL	StoreInDiff
		ADDI	-65		
		JPOS	L_test_fail_2		;X position not changing
	L_test_1_2:
		CALL	ResetTimer
		IN		ThetaPosition
		STORE	Local2
	L_test_2:
		LOAD	Zero
		ADDI	&H00E2
		OUT		SevenSeg
		CALL	FTFive
		JPOS	L_test_fail_3		;ADD IN1 Error Code
	L_test_2_1:
		IN		Thetaposition
		SUB		Local2
		JZERO	L_test_2
		CALL	WaitPB2
		IN		Thetaposition
		STORE	Local2
		STORE	IN1
		LOAD	NientyDegrees
		CALL	StoreInDiff
		ADDI	-102
		JPOS	L_test_fail_4		;ADD FAIL CONDITION
	L_test_2_2:
		CALL	ResetTimer
		IN		Yposition
		STORE	Local3	
	L_test_3:
		LOAD	Zero
		ADDI	&H00E3
		OUT		SevenSeg
		CALL	FTFive
		JPOS	L_test_fail_5		;ADD IN1 Error Code
	L_test_3_1:
		IN		Yposition
		SUB		Local3
		JZERO	L_test_3
		CALL	WaitPB2
		IN		Yposition
		STORE	Local3
		STORE	IN1
		LOAD	SixFifty
		CALL	StoreInDiff
		ADDI	-65
		JPOS	L_test_fail_6		;ADD FAIL CONDITION
	L_test_move:
		CALL	EnableWheels
		LOAD	Zero
		ADDI	180
		OUT		DeltaHeading	;TEST to find if delay is needed
		CALL	START
		CALL	STOP
		LOAD	NormSpeed
		OUT		Velocity		;Begin Moving in negative Y direction
		CALL	Start
		L_test_move_y:
			IN		Yposition
			JPOS	L_test_move_y
			CALL	StopRobot
			CALL	Stop
			LOAD	Zero
			ADDI	180
			OUT		Heading		;TEST to find if delay is needed
			LOAD	Twenty
			STORE	IN1
			CALL	Delay
			LOAD	NormSpeed
			OUT		Velocity
			CALL	Start
		L_test_move_x:
			IN		Xposition
			JPOS	L_test_move_x
			CALL	StopRobot
			CALL	Stop
			LOAD	Zero
			ADDI	&H000A
			OUT		SevenSeg
			RETURN	
	L_test_fail_1:
		LOAD	Fourty
		STORE	IN1
		CALL	FAIL
		RETURN
	L_test_fail_2:
		LOAD	Zero
		ADDI	&H0041
		CALL	LTest_1
		CALL	FAIL_By
		JUMP	L_test_1_2
	L_test_fail_3:
		LOAD	Zero
		ADDI	&H0042
		STORE	IN1
		CALL	FAIL
		RETURN
	L_test_fail_4:
		LOAD	Zero
		ADDI	&H0043
		CALL	LTest_1
		CALL	FAIL_By
		JUMP	L_test_2_2
	L_test_fail_5:
		LOAD	Zero
		ADDI	&H0044
		STORE	IN1
		CALL	FAIL
		RETURN
	L_test_fail_6:
		LOAD	Zero
		ADDI	&H0045
		CALL	LTest_1
		CALL	FAIL_By
		JUMP	L_test_move
	LTest_1:
		STORE	IN1
		LOAD	OUT1
		STORE	IN2
		RETURN

LedTest:
	; Description: This routine runs 00-FF on Seven Segment Display.
	; Inputs: <none>
	; Outputs: <none>
	; Locked Variables: Local1, In1
	; Order: 3
	LOAD 	Zero
	STORE	Local1
	LedTest_1:
		LOAD	Local1
		ADDI	&H0011		; Add 11 to Local variable, Local1
		OUT		SevenSeg
		STORE	Local1
		ADDI	&HFE01		; Test versus negative EE
		JZERO	LedTest_Finish		
		CALL	WaitHalfSecond
		LOAD	Local1
		ADD		DipHigh
		JNEG	LedTest_1	; While under FF, continue adding 11
	LedTest_Finish:
		RETURN
		
FuncTest:
	; Description: This routine tests all SCOMP functions.
	; Inputs: <none>
	; Outputs: <none>
	; Locked Variables: Local1, In1
	; Order: 5
	LOAD	Zero
	STORE	Local1
	
	LOAD	Five
	ADD		One
	SUB		Two
	ADDI	-4
	JZERO	Test1
	JUMP	FuncTest_Fail
	
	Test1:
		LOAD 	Local1
		ADDI	5
		JPOS	Test2
		JUMP	FuncTest_Fail
	Test2:
		LOAD	Local1
		ADDI	-6
		JNEG	Test3
		JUMP  	FuncTest_Fail
	Test3:
		LOAD	Four ;100
		AND		Five ;100
		XOR		Three ;111
		OR		Eight ;1111
		ADDI  	-15
		SHIFT	-8
   		JZERO	FuncTest_Pass
   		JUMP	FuncTest_Fail
	FuncTest_Pass:
		CALL	Pass
		RETURN
	FuncTest_Fail:
		LOAD	&H14
		STORE	In1
		CALL	Fail_All

BatteryCheck:
	; Description: This routine checks the battery level.
	; Inputs: <none>
	; Outputs:
	;	Out1 - 1 if battery is OK, 0 if battery is too low.
	; Locked Variables: Out1
	; Order: 1
	IN		Status	; Get the battery voltage
	SHIFT	-8	; (It is in the upper byte of Status word)
	STORE	In2
	SUB		MinBattLevel
	JNEG	BatteryCheck_1
	LOAD	One
	STORE	Out1
	CALL	Pass
	RETURN
	BatteryCheck_1: ;battery level too low
		LOAD	Zero
		STORE	Out1
		ADDI	&H50 ;50 = battery too low
		STORE	In1
		CALL	Fail_By
		RETURN
		
TestReset:
	; Description: This tests the reset to make sure velocity and initial positions are 0
	; Inputs: <none>
	; Outputs:
	;	Out1 - 1 for function pass, 0 for any failure.
	; Locked Variables: Out1
	; Order: 2
	LOAD	One
	OUT		Reset
	IN		Xposition
	CALL	TestReset_2
	IN		Yposition
	CALL	TestReset_2
	IN		ThetaPosition
	CALL	TestReset_2
	IN		LeftVelocity
	CALL	TestReset_2
	IN		RightVelocity
	CALL	TestReset_2
	CALL	Pass
	LOAD	One
	STORE	Out1 ;;END REPLACEMENT
	RETURN
	TestReset_1:
		LOAD	Zero
		STORE	Out1
		ADDI	&H12
		STORE	In1
		CALL	Fail
		RETURN
	TestReset_2:
		JPOS	TestReset_1
		JNEG	TestReset_1
		RETURN
		
TestWheels:
	; Description: Tests robot wheels
	; Inputs: <none>
	; Outputs: <none>
	; Locked Variables: In1, Local1
	; Order: 4
	CALL	EnableWheels
	STORE	Local1
	CALL	WaitSecond
	CALL	TestWheels_1
	LOAD	LeftForward
	CALL	TestWheels_1
	LOAD	BothForward
	CALL	TestWheels_1
	LOAD	LeftBack
	CALL	TestWheels_1
	LOAD	Zero
	ADDI	&H00FA ;left wheel back
	CALL	TestWheels_1
	LOAD	BothBack
	CALL	TestWheels_1
	RETURN
	TestWheels_1:
		OUT		LRVelCommand
		LOAD	Local1
		OUT		SevenSeg
		CALL	Start
		CALL	Delay
		CALL	StopRobot
		CALL	Stop
		CALL	Delay
		LOAD	Local1
		ADD		One
		STORE	Local1
		RETURN

CommTest:
	; Description: Tests robot communications
	; Inputs: <none>
	; Outputs: <none>
	; Locked Variables: In1
	; Order: 3
	IN		Status
	SHIFT	-8
	JPOS	CommTest_1
	LOAD	Zero
	ADDI	&H13
	STORE	In1
	CALL	Fail_All
	CommTest_1:
	CALL	Pass
	RETURN

TestVelocity:
	; Description: This routine test for a correct robot velocity
	; Inputs: <none>
	; Outputs:
	;	Out1 - The difference in number of clicks from 1 meter.
	; Locked Variables: In1, In2, Out1, Local1
	; Order: 3
	CALL	EnableWheels
	OUT		Reset
	LOAD	Zero
	ADDI	125
	CALL	TestVelocity_4
	LOAD	WholeMeter
	CALL	TestVelocity_5
	JNEG	TestVelocity_1
	LOAD	Zero
	ADDI	&H60
	STORE	In1
	CALL	Fail_By
	JUMP	TestVelocity_2
	TestVelocity_1:
		CALL	Pass
	TestVelocity_2:
		LOAD	Zero
		ADDI	-125
		CALL	TestVelocity_4
		LOAD	Zero
		OUT		Enable
		LOAD	Zero
		SUB		WholeMeter
		CALL	TestVelocity_5
		JNEG	TestVelocity_3
		LOAD	Zero
		ADDI	&H61
		STORE	In1
		CALL	Fail_By
		RETURN
	TestVelocity_3:
		CALL	Pass
		RETURN
	TestVelocity_4:
		OUT		Velocity
		CALL	Start ; wait for the wheels to start moving
		CALL	WaitSecond
		CALL	WaitSecond
		LOAD	Fourty
		OUT		Reset
		ADD		Fourty
		STORE	In1
		CALL	Delay ; wait 4 seconds
		IN		Xposition
		STORE	In1
		CALL	StopRobot
		CALL	Stop ; wait for the wheels to stop moving
		RETURN
	TestVelocity_5:
		CALL	StoreInDiff
		STORE	In2
		ADDI	-190
		RETURN
	
Fail:
	; Description: This function displays the error codes from individual tests
	; Inputs:
	;      In1- The specific error code for a function 
	; Outputs: None
	; Locked Variables: In1
	; Order: 2
	CALL	ResetTimer
	Fail_A:
	LOAD	B
	CALL	Failby_2
	JPOS	Fail_End
	CALL	Failby_1				; Display for 1s
	JNEG	Fail_A	
	CALL	ResetTimer
	Fail_B:
	LOAD	In1						; Load error code
	CALL	Failby_2
	JPOS	Fail_End
	CALL	Failby_1					; Check timer for 1s
	JNEG	Fail_B
	JUMP	Fail					; Jump back to display B for 1s
	Fail_End:
	IN		Switches				; Wait for PB release before continue
	AND		UserPBMask
	JPOS	Fail_End
	RETURN	
	
Fail_All:
	; Description: This is for catastrophic failures, basically turns robot off (endless loop)
	; Inputs:	In1- Error Code
	; Outputs:	None
	; Locked Variables: None
	; Order: 2
	LOAD	Zero
	OUT		Enable
	CALL	ResetTimer
	Failall_A:
	LOAD	B
	OUT		SevenSeg
	CALL	Failby_1
	JNEG	Failall_A
	CALL	ResetTimer
	Failall_B:
	LOAD	In1
	OUT		SevenSeg
	CALL	Failby_1
	JNEG	Failall_B
	JUMP	Fail_All
	
	
Fail_By:
	; Description: This function displays the error codes with amount from individual tests
	; Inputs:
	;      In1- The specific error code for a function (in hex)
	;	   In2- The amount the test is off by
	; Outputs: None
	; Locked Variables: In1
	; Order: 2
	CALL	ResetTimer
	Failby_A:
	LOAD	B
	CALL	Failby_2
	JPOS	Failby_End
	CALL	Failby_1					; Display for 1s
	JNEG	Failby_A
	CALL	ResetTimer
	Failby_B:
	LOAD	In1						; Load error code
	CALL	Failby_2
	JPOS	Failby_End
	CALL	Failby_1					; Check timer for 1s
	JNEG	Failby_B
	CALL	ResetTimer
	Failby_C:
	LOAD	In2						; Load error code
	CALL	Failby_2
	JPOS	Failby_End
	CALL	Failby_1				; Check timer for 1s
	JNEG	Failby_C
	JUMP	Fail_by					; Jump back to display B for 1s
	Failby_End:
	IN		Switches				; Wait for PB release before continue
	AND		UserPBMask
	JPOS	Failby_End
	RETURN
	Failby_1:
		IN		Timer
		ADDI	-10	
		RETURN
	Failby_2:
		OUT		SevenSeg				; Display
		IN		Switches				; PB end for error code
		AND		UserPBMask
		RETURN
	
Start:
	; Description: This routine waits for the bot to start moving, then returns.
	; Inputs: <none>
	; Outputs: <none>
	; Locked Variables: <none>
	; Order: 1
	IN		Status
	ADDI	-50 ; Hex 32
	JZERO	Start
	RETURN

Stop:
	; Description: This routine waits for the bot to stop moving, then returns.
	; Inputs: <none>
	; Outputs: <none>
	; Locked Variables: <none>
	; Order: 1
	IN		Status
	ADDI	-51 ; Hex 33
	JZERO	Stop
	RETURN
	
WaitPB2:
	; Description: This routine waits for the user to press PB2, let go, then returns.
	; Inputs:
	;	In1 - What to display on the seven segment display while waiting.
	; Outputs: <none>
	; Locked Variables: In1
	; Order: 1
	LOAD	In1
	OUT		SevenSeg
	IN		Switches
	AND		UserPBmask
	JZERO	WaitPB2
	WaitPB2_A:
		IN		Switches
		AND		UserPBmask
		JPOS	WaitPB2_A
	RETURN

Wait:
	; Description: This routine is a timed delay.  Minimum timer is .3 seconds
	; Inputs:
	;	In1 - The number of 1/10 seconds to let pass
	;	In2 - What to display on the seven segment display while waiting.
	; Outputs:
	;	Out1 - If the user pressed PB2 during the delay
	; Locked Variables: In1, In2, Out1
	; Order: 2
	LOAD	Zero
	STORE	Out1 ; Reset the output
	LOAD	In1
	SUB		One
	STORE	In1
	CALL	ResetTimer
	Wait_1:
		IN		Timer ; This waits for the user to press and release the pushbutton to start
		SUB		Two
		JNEG	Wait_1 ; Assumed that they don't hold it for more than 1/10 of a second
	Wait_2:
		LOAD	In2
		OUT		SevenSeg
		IN		Switches
		AND		UserPBmask
		OR		Out1
		STORE	Out1 ; Remains 0 until user pushes PB2, then holds that value
		IN		Timer
		SUB		In1
		JNEG	Wait_2
	LOAD	Out1
	SHIFT	-8
	STORE	Out1
	RETURN
	
Delay:
	; Description: This routine is a timed delay.
	; Inputs:
	;	In1 - The number of 1/10 seconds to let pass
	; Outputs: <none>
	; Locked Variables: In1
	; Order: 2
	LOAD	Zero
	CALL	ResetTimer
	Delay_1:
		IN		Timer
		SUB		In1
		JNEG	Delay_1
	RETURN
	
ResetTimer:
	; Description: This resets the timer to 0 and starts it counting.
	; Inputs: <none>
	; Outputs: <none>
	; Locked Variables: <none>
	; Order: 1
	LOAD	Zero
	OUT		Timer
	RETURN
	
Diff:
	; Description: This routine computes |A-B|
	; Inputs:
	;	In1 - A
	;	In2 - B
	; Outputs:
	;	Out1 - |A-B|
	; Locked Variables: In1, In2, Out1
	; Order: 1
	LOAD	In1
	SUB		In2
	JPOS	Diff_1
	LOAD	In2
	SUB		In1
	Diff_1:
		STORE	Out1
		RETURN
	
; Rotate:
; 	; Description: This rotates CLOCKWISE.
; 	; Inputs:
; 	;	In1 - The number of clockwise degrees to turn
; 	;   In2 - In1/.08789 (number of clicks for that many degrees)
; 	; Outputs: <none>
; 	; Locked Variables: In1, In2
; 	; Order: 2
; 	LOAD	Zero
; 	OUT		Velocity
; 	ADDI	360
; 	SUB		In1
; 	STORE	In1 ;convert to counterclockwise degrees
; 	OUT 	Heading
; 	CALL	Start
; 	Goal2:
; 		IN		ThetaPosition
; 		SUB		In2
; 		JNEG    Goal2       ; Keep turning CW until 270 degrees reached
; 	LOAD	Zero
; 	OUT		Velocity
; 	;CALL	Stop
	
; GoDistTime:
; 	; Description: This function moves the robot at In2 velocity for In1 seconds.
; 	; Inputs: 
; 	;      In1 - Time to travel in .1s
; 	;      In2 - Velocity in mm/s, negative for reverse
; 	; Outputs: <none>
; 	; Locked Variables: In1, In2
; 	; Order: 2
; 	LOAD    One ; Load a one for the engines and display
; 	OUT		Enable ; Enable motors
; 	LOAD 	In2 ; Load Desired Speed
; 	OUT		Velocity ; Send to robot
; 	CALL	Start
; 	CALL	Delay
; 	CALL	Stop
; 	RETURN
	
; GoDistX:
; 	; Description: This function moves the robot In1 distance in the x direction.
; 	; Inputs:
; 	;      In1 - Distance in mm/.5083
; 	;      In2 - Velocity in mm/s, negative for reverse
; 	; Outputs: <none>
; 	; Locked Variables: In1, In2, Local1
; 	; Order: Two
; 	IN		Xposition
; 	ADD		In1
; 	STORE	Local1	
; 	LOAD	In2 ; Load desired speed
; 	OUT		Velocity
; 	GoDistX_A:
; 	IN		Xposition ; Check x position for desired distance
; 	SUB		Local1
; 	JNEG	GoDistX_A ; Exit when robot gets to desired position
; 	LOAD	Zero ; Zero out velocity and motor
; 	OUT		Velocity
; 	RETURN
	
; GoDistY:
; 	; Description: This function moves the robot In1 distance in the y direction.
; 	; Inputs:
; 	;      In1 - Distance in mm/.5083
; 	;      In2 - Velocity in mm/s, negative for reverse
; 	; Outputs: <none>
; 	; Locked Variables: In1, In2, Local1
; 	; Order: Two
; 	IN		Yposition
; 	ADD		In1
; 	STORE	Local1	
; 	LOAD	One ; Load one for motor and display
; 	OUT		Enable				
; 	LOAD	In2 ; Load desired speed
; 	OUT		Velocity
; 	GoDistY_A:
; 	IN		Yposition ; Check x position for desired distance
; 	SUB		Local1
; 	JNEG	GoDistY_A ; Exit when robot gets to desired position		
; 	GoDistY_B:
; 	LOAD	Zero ; Zero out velocity and motor
; 	OUT		Velocity
; 	RETURN
	
; ------------------
; End Good Functions
; --------------------------------------------------

; --------------------------------------------------
; Hardware addresses
; ------------------
; Do not modify these.  Ever.

; Timer:
Timer:	EQU	&H02

;  Robot I/O registers -- The lower four bits are from the amigobot device data sheet, and the upper four bits are 
; always &H8 because  that's what must be decoded externally to Enable the amigobot device

; Outputs:
Enable:	EQU	&H80
Velocity:	EQU	&H81
Heading:	EQU 	&H82
DeltaHeading:	EQU	&H83
LRVelCommand:	EQU 	&H88
Reset:		EQU		&H84

; Inputs:
Status:	EQU	&H80
Xposition:	EQU	&H81
Yposition:	EQU	&H82
ThetaPosition:	EQU	&H83
LeftVelocity:	EQU	&H84
RightVelocity:	EQU	&H85
Bumpers:	EQU	&H86
Sonar1:	EQU	&H88
Sonar2:	EQU	&H89
Sonar3:	EQU	&H8A
Sonar4:	EQU	&H8B
Sonar5:	EQU	&H8C
Sonar6:	EQU	&H8D
Sonar7:	EQU	&H8E
Sonar8:	EQU	&H8F

; Other fixed addresses:
Switches:	EQU	&H00	; I/O read of address zero provides DIP Switches and one pushbutton
SevenSeg:	EQU	&H01	; I/O write to address zero writes to 7-segment display
IRcomm:		EQU	&H04   	; I/O write selects an IR detector, I/O read gets detected signal (and clear) 
IRemit0:	EQU	&H05	; I/O write emits an IR code (just once per OUT)
IRemit1:	EQU	&H06
IRemit2:	EQU	&H07
IRemit3:	EQU	&H08
IRemit4:	EQU	&H09
IRemit5:	EQU	&H0A
IRemit6:	EQU	&H0B
IRemit7:	EQU	&H0C

; ------------------
; End Hardware Addresses
; --------------------------------------------------


; --------------------------------------------------
; Global Constants
; ----------------
; Consult with group before adding any of these.

Zero:  	DW	&H0000	; @00 Constant of zero
One:   	DW	&H0001	; @01 Constant of one
Two:   	DW	&H0002	; 
Three: 	DW	&H0003	; 
Four:  	DW	&H0004	; 
Five:  	DW	&H0005	; 
Six:   	DW	&H0006	; 
Seven: 	DW	&H0007	; 
Eight: 	DW	&H0008	; 
Nine: 	DW	&H0009	; 
Twenty:	DW	&H0014
Fourty:	DW	&H0028	; 

UserPBmask: 	DW	&H0100	; Masks off the user pushbutton in the switch input data
MinBattLevel:	DW	&H0070	; Don't start unless battery level is > this

MaxSonar:	DW	&H1ABA

NormSpeed:	DW	100

MaxReading:       DW  &H1ABA

Failed:      DW  &H0000 ; Local Sonar Failure
SonarPassed: DW  &H0000 ; Local Sonar Passed
Temp1:       DW  &H0000 ; Temporary variable, not yet named
Temp2:       DW  &H0000 ; 
Temp3:		 DW  &H0000 ;
MinDiff:	 DW  &H0000	; Min reading from sonar 4 on accuracy test
MinAngle:    DW  &H0000 ; Smallest angle on perpendicular angle test
TravSpeed:	 DW  &H0000 ; Velocity for Move distance subfunctions
TravDist:	 DW  &H0000 ; Distance in mm/.5083 for move distance subfunctions
TravTime:    DW  &H0000 ; Time in s for travel in move distance subfunctions
AngleNum:    DW	 &H0000 ; Current Angle in Right angle test
MinAngleNum: DW  &H0000 ; Current Angle closest to perp in RAT

LeftForward: 	DW	&H0500
BothForward:	DW	&H0505
LeftBack:	 	DW	&HFA00
BothBack:	 	DW	&HFAFA
HalfTurn:	 	DW	&H800
BumperForward: 	DW	&H0202
SixFifty: 		DW	&H028A
NientyDegrees:	DW	&H0400
DipHigh:		DW	&HFF01
WholeMeter:		DW	&H7B0
B:				DW	&H000B
BumperBackLeft:	DW	&HFD00
Code:			DW	&H00DC
SATread:		DW	1050

IRE0:			DW	&H0000
IRE1:			DW	&H0000
IRE2:			DW	&H0000
IRE3:			DW	&H0000
IRE4:			DW	&H0000
IRE5:			DW	&H0000
IRE6:			DW	&H0000
IRE7:			DW	&H0000

; --------------------
; End Global Constants
; --------------------------------------------------

; --------------------------------------------------
; Variables
; ----------------
; Double check all locked variables before using one of these in your functions.  All variables initially 0.

Out1:	DW	&H0000	; Function output #1
In1:	DW	&H0000	; Function input #1
In2:	DW	&H0000	; Function input #2
Local1:	DW	&H0000	; Local variable #1
Local2:	DW	&H0000	; Local variable #2
Local3:	DW	&H0000	; Local variable #3
Local4:	DW	&H0000	; Local variable #4

; --------------------
; End Global Constants
; --------------------------------------------------