;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; World 4A Boss (Jelectro)
;;
;;    Created by cstutor89
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Constants
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	HIT_POINTS = $03
	DANGER_ZONE = $02
	ORIGINAL_PALETTE = $3D
	ELEC_PALETTE = $35
	HURT_PALETTE = $39

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; INIT/MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
	LDA #$00
	STA $C2,x
	LDA #$FF
	STA $1540,x
	LDA #$00
	STA $7F888C
	LDA #ORIGINAL_PALETTE 
	STA $15F6,x
	LDA #$08
	STA $14C8,x
	RTL

dcb "MAIN"
	PHB		;\
	PHK		; | Change the data bank to the one our code is running from.
	PLB		; | This is a good practice.
	JSR SpriteCode	; | Jump to the sprite's function.
	PLB		; | Restore old data bank.
	RTL		;/ And return.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Sprite Main Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SpriteCode:	JSR Graphics
		LDA $9D
		BNE Return
		JSR HitDetection
		JSR $01A7DC
		BCC ChooseSt
		JSL $00F5B7
ChooseSt:	LDA $C2,x
		BEQ STATE_0
		CMP #$01
		BEQ STATE_1
		CMP #$02
		BEQ STATE_2
		CMP #$03
		BEQ STATE_3
		CMP #$04
		BEQ STATE_4
		CMP #$05
		BEQ STATE_5
		CMP #$06
		BEQ STATE_6
		CMP #$07
		BEQ STATE_7
		CMP #$08
		BEQ STATE_8
		CMP #$09
		BEQ STATE_9
		CMP #$0A
		BEQ STATE_A
		BRA Return
STATE_0:	JMP Follow
STATE_1:	JMP Stall
STATE_2:	JMP FlyUp
STATE_3:	JMP Electricity
STATE_4:	JMP Homing
STATE_5:	JMP Sweep
STATE_6:	JMP Hurt
STATE_7:	JMP Goal
STATE_8:	JMP PositionUp
STATE_9:	JMP PositionDown
STATE_A:	JMP Rain
Return:		RTS

HitDetection:	LDA $1558,x
		BNE Return	
		LDA $14D4,x
		BNE Return
		LDA $D8,x
		CMP #$98
		BCC Return
		CMP #$C9
		BCS Return
		LDA $14E0,x
		BEQ X1_Check
		CMP #$FF
		BEQ X2_Check
		BRA Return

X1_Check:	LDA $E4,x
		CLC
		ADC #$07
		CMP #$E0
		BCS Was_Hit
		LDA $E4,x
		CMP #$09
		BCC Was_Hit	
		RTS

X2_Check:	LDA $E4,x
		CMP #$E8
		BCS Was_Hit
		RTS

Was_Hit:	INC $1528,x		; Increase the HP's used.
		LDA #$68
		STA $1540,x
		STA $1558,x		; Set Hurt Invincibility
		LDA #$06
		STA $C2,x		; Set Jelectro's State to Hurt (6).
		LDA #$28                ; \ sound effect
		STA $1DFC               ; /
		STZ $AA,x
		STZ $B6,x
		LDA #HURT_PALETTE
		STA $15F6,x
		RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; State 0: Follow Mario
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

AccelerationX:	db $01,$FF
MaxSpeedX:	db $0C,$F4
AccelerationY:	db $01,$FF
MaxSpeedY:	db $0C,$F4
State_Mach:	db $00,$01,$02,$00,$00,$01,$04,$00,$01,$03,$00,$01,$08,$00,$01,$04
State_Time:	db $FF,$40,$58,$FF,$FF,$FF,$FF,$FF,$FF

Follow:		LDA $1540,x
		BEQ Next_State
		LDA $14
		AND #$01
		BNE ApplySpeed
		JSR SubHorzPos		;\ if max horizontal speed in the appropriate
		LDA $B6,x		; | direction achieved,
		CMP MaxSpeedX,y		; |
		BEQ MaxXSpeed		;/ don't change horizontal speed
		CLC			;\ else,
		ADC AccelerationX,y	; | accelerate in appropriate direction
		STA $B6,x		;/
MaxXSpeed:	JSR SubVertPos		;\ if max vertical speed in the appropriate
		LDA $AA,x		; | direction achieved,
		CMP MaxSpeedY,y		; |
		BEQ ApplySpeed		;/ don't change vertical speed
		CLC			;\ else,
		ADC AccelerationY,y	; | accelerate in appropriate direction
		STA $AA,x		;/
ApplySpeed:	JSL $018022		; apply x speed
		JSL $01801A		; apply y speed
		RTS

Next_State:	PHX
		LDA $7F888C
		CLC
		ADC #$01
		AND #$0F
		STA $7F888C
		TAX
		LDA State_Mach,x
		PLX
		STA $C2,x
		PHX
		TAX
		LDA State_Time,x
		PLX
		STA $1540,x
		STZ $AA,x
		STZ $B6,x
		LDA $14D4,x
		STA $192C
		RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; State 1: Stall Time
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Stall:		LDA $1540,x
		BEQ Next_State
		AND #$1F
		TAY
		LDA Sweep_SpeedX,y
		STA $AA,x		
		JSL $01801A		
		RTS
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; State 2: Fly To Corner
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Fly_Direct:	db $08,$F8

FlyUp:		LDA $D8,x
		CMP #$30
		BCC Change_Fly
		LDA $1540,x
		CMP #$57
		BNE Calc_Fly
		JSR Deter_Dir
Calc_Fly:	DEC $AA,x
		JSL $018022		; apply x speed
		JSL $01801A		; apply y speed
		RTS

Deter_Dir:	JSL $01ACF9
		LDA $148D
		AND #$01
		TAY
		LDA Fly_Direct,y
		STA $B6,x
		STZ $1936
		LDA #$01
		STA $1937
		LDA $B6,x
		CMP #$10
		BNE End_Fly
		LDA #$02
		STA $1936
		LDA #$FF
		STA $1937
End_Fly:	RTS

Change_Fly:	LDA #$05
		STA $C2,x
		LDA #$02
		STA $1540,x
		RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; State 3: Shoot Electricity
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

T_SPEEDX:	db $24,$DC,$40,$C0
T_SPEEDY:	db $00,$00,$00,$00

Electricity:	LDA $1540,x
		BNE ShootCharge
		JMP Next_State
ShootCharge:	LDA $1540,x
		AND #$3F
		BEQ ShootElec
		CMP #$28
		BCS GlowElec
		LDA #ORIGINAL_PALETTE  
		STA $15F6,x
		JMP Follow
		
ShootElec:	LDA #ORIGINAL_PALETTE 
		STA $15F6,x
		LDY #$01
		LDA $1528,x
		CMP #DANGER_ZONE
		BCC No_8Shot
		LDY #$03
No_8Shot:	LDA #$06
		STA $170B,y
		LDA $E4,x
		CLC
		ADC #$08
		STA $171F,y
		LDA $14E0,x
		STA $1733,y
		LDA $D8,x
		CLC
		ADC #$08
		STA $1715,y
		LDA $14D4,x
		STA $1729,y
		LDA T_SPEEDY,y
		STA $173D,y
		LDA T_SPEEDX,y
		STA $1747,y
		LDA #$FF
		STA $176F,y
		DEY
		BPL No_8Shot
End_Shots:	LDA #$10
		STA $1DF9
		RTS

GlowElec:	LDA #ELEC_PALETTE 
		STA $15F6,x
		RTS	

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; State 4: Homing 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Homing_AccX:	db $02,$FE
Homing_MaxX:	db $30,$D0
Homing_AccY:	db $02,$FE
Homing_MaxY:	db $30,$D0

Homing:		LDA $1540,x
		BNE Move_Home
		JMP Next_State
Move_Home:	LDA $1540,x
		AND #$7F
		CMP #$60
		BEQ Make_Noise
		BCC Move_Jel
		BRA Hom_Stall
Make_Noise:	LDA #$25
		STA $1DF9
Hom_Stall:	LDA $1540,x
		AND #$1F
		TAY
		LDA Sweep_SpeedX,y
		STA $AA,x		
		JSL $01801A		
		RTS

Move_Jel:	LDA $13
		AND #$01
		BNE ApplySpeed2
		JSR SubHorzPos		;\ if max horizontal speed in the appropriate
		LDA $B6,x		; | direction achieved,
		CMP Homing_MaxX,y		; |
		BEQ HomXSpeed		;/ don't change horizontal speed
		CLC			;\ else,
		ADC Homing_AccX,y	; | accelerate in appropriate direction
		STA $B6,x		;/
HomXSpeed:	JSR SubVertPos		;\ if max vertical speed in the appropriate
		LDA $AA,x		; | direction achieved,
		CMP Homing_MaxY,y		; |
		BEQ ApplySpeed2		;/ don't change vertical speed
		CLC			;\ else,
		ADC Homing_AccY,y	; | accelerate in appropriate direction
		STA $AA,x		;/
ApplySpeed2:	JSL $018022		; apply x speed
		JSL $01801A		; apply y speed
		RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; State 5: Sweep Grounds
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Start_PosX:	db $48,$70,$A8
Start_PosY_Lo:	db $28,$48,$28
Start_PosY_Hi:	db $00,$01,$00
Finish_PosY_Lo:	db $48,$28,$48
Finish_PosY_Hi:	db $01,$00,$01
Sweep_SpeedX:	db $00,$01,$02,$04,$07,$0B,$0F,$16,$16,$0F,$0B,$07,$04,$02,$01,$00,$FF,$FE,$FD,$FB,$F9,$F4,$F0,$EA,$EA,$F0,$F4,$F9,$FB,$FD,$FE,$FF
Sweep_SpeedY:	db $1C,$D4,$1C

Sweep:		LDA $1540,x
		CMP #$01
		BEQ FirstSweep
		LDY $1936
		LDA Finish_PosY_Hi,y
		CMP $14D4,x
		BNE NotThereYet
		LDA $1936
		CMP #$01
		BEQ Going_Up
		LDA Finish_PosY_Lo,y
		CMP $D8,x
		BCC ChangeSweep
		BRA NotThereYet
Going_Up:	LDA Finish_PosY_Lo,y
		CMP $D8,x
		BCS ChangeSweep
NotThereYet:	LDA Sweep_SpeedY,y
		STA $AA,x
		LDA $1564,x
		AND #$3F
		SEC
		SBC #$20
		STA $B6,x
		LDA $1564,x
		AND #$40
		BEQ Update_Sweep
		LDA $B6,x
		EOR #$FF
		STA $B6,x
Update_Sweep:	JSL $018022		; apply x speed
		JSL $01801A		; apply y speed
		RTS
StopSweep:	JMP Next_State

ChangeSweep:	LDA #$C0
		STA $1564,x
		LDA $1936
		CMP #$01
		BEQ Next_Sweep
Next_Sweep:	LDA $1936
		CLC
		ADC $1937
		STA $1936
		CMP #$FF
		BEQ StopSweep
		CMP #$03
		BEQ StopSweep
FirstSweep:	LDA #$C0
		STA $1564,x
		LDY $1936
		LDA Start_PosX,y
		STA $E4,x
		STZ $14E0,x
		LDA Start_PosY_Lo,y
		STA $D8,x
		LDA Start_PosY_Hi,y
		STA $14D4,x
		RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; State 6: Hurt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Hurt:		LDA $1558,x
		BNE CheckDeath
		LDA $1528,x
		CMP #DANGER_ZONE
		BNE GoState
		LDA #$01
		STA $14AF
GoState:	LDA #ORIGINAL_PALETTE
		STA $15F6,x
		JMP Next_State
CheckDeath:	LDA $1528,x
		CMP #HIT_POINTS
		BEQ SetDState
		JMP Follow
		
SetDState:	LDA #$20
		STA $1540,x
		LDA #$07
		STA $C2,x
		RTS
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; State 7: Goal
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	
Goal:		LDA $1540,x
		BNE Goal_wait
		LDA #$04
		STA $14C8,x             ; Destroy Sprite 
		LDA #$1F
		STA $1540,x
		LDA #$08
		STA $1DF9
		INC $13C6               ; Prevent Mario from walking.
		LDA #$FF                ; \ Set Goal
		STA $1493               ; /
		LDA #$0B                ; \ Set Ending Eusic
		STA $1DFB               ; /
Goal_Wait:	RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; State 8: Going Up Position
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	
PositionUp:	LDA $14D4,x
		BNE G_Up
		LDA $D8,x
		CMP #$30
		BCS G_Up
		LDA #$09
		STA $C2,x
		LDA #$30
		STA $E4,x
		STA $D8,x
		STZ $AA,x
		RTS
G_Up:		DEC $AA,x
		JSL $01801A		; apply y speed
		RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; State 9: Going Down Position
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PositionDown:	LDA $D8,x
		CMP #$70
		BCC Keep_Going
		LDA #$0A
		STA $C2,x
		LDA #$FF
		STA $1540,x
		STZ $157C,x
		RTS
Keep_Going:	INC $AA,x
		JSL $01801A		; apply y speed
		RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; State A: Electric Rain
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		
Rain:		LDA $1540,x
		BNE MaybeShower
		LDA #ORIGINAL_PALETTE
		STA $15F6,x
		JMP Next_State
MaybeShower:	LDA #ELEC_PALETTE 
		STA $15F6,x
		LDA $1540,x
		AND #$1F
		BEQ Create_Ball
		LDA $E4,x
		CMP #$B0
		BCS Change_Dir
		CMP #$30
		BCC Change_Dir
		BRA No_Change_Dir
Change_Dir:	LDA $157C,x
		EOR #$01
		STA $157C,x
No_Change_Dir:	LDA $157C,x
		BEQ Shower_Right
		DEC $E4,x
		RTS
Shower_Right:	INC $E4,x
		RTS

Create_Ball:	JSL $02A9DE             ; \ get an index to an unused sprite slot, return if all slots full
                BMI NOBALL 	         ; / after: Y has index of sprite being generated

		LDA #$08                ; \ set sprite status for new sprite
              	STA $14C8,y             ; /

              	PHX
		LDA #$B1
               	TYX
               	STA $7FAB9E,x
               	PLX

		LDA #$08
		STA $7FAB10,x

		JSL $01ACF9
		LDA $148D
		AND #$0F
		CLC
		ADC #$04
		CLC
              	ADC $E4,x               ; \ set x position for new sprite
            	STA $00E4,y

           	LDA $14E0,x             ;  |
               	STA $14E0,y             ; /

		LDA $D8,x               ; \ set y position for new sprite
               	SEC                     ;  | (y position of generator - 1)
             	SBC #$00                ;  |
             	STA $00D8,y             ;  |
            	LDA $14D4,x             ;  |
          	SBC #$00                ;  |
              	STA $14D4,y             ; /

		PHX                     ; \ before: X must have index of sprite being generated
                TYX                     ;  | routine clears *all* old sprite values...
                JSL $07F7D2             ;  | ...and loads in new values for the 6 main sprite tables
                JSL $0187A7             ;  get table values for custom sprite
		JSL $01ACF9
		LDA $148D
		AND #$01 
             	ORA #$88
             	STA $7FAB10,x
		PLX                     ; / 

		LDA #$10
		STA $1DF9
NOBALL:		RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Jelectro Graphics
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

X_DISP:		db $10,$00,$10,$00
Y_DISP:		db $10,$10,$00,$00
TILE:		db $22,$20,$02,$00,$26,$24,$06,$04
TILE_S6:	db $62,$60,$42,$40,$66,$64,$46,$44

Graphics:	JSL $20CA4F
		LDA $14
		LSR A
		LSR A
		LSR A
		AND #$01
		ASL
		ASL
		STA $03
		LDA $15F6,x
		STA $04		
		LDA $C2,x
		CMP #$06
		BEQ State_6G
		CMP #$07
		BEQ State_6G
			
State_0G:	PHX
		LDX #$03
Graph_Loop:	LDA $00
		CLC
		ADC X_DISP,x
		STA $0300,y
	
		LDA $01
		CLC
		ADC Y_DISP,x
		STA $0301,y
		
		PHX
		TXA
		CLC
		ADC $03
		TAX
		LDA TILE,x
		STA $0302,y
		PLX
		
		LDA $04
		STA $0303,y
		
		INY
		INY
		INY
		INY
		DEX
		
		BPL Graph_Loop
	
Graph_End:	PLX
		LDY #$02		; Y ends with the tile size .. 02 means it's 16x16
		LDA #$03		; A -> number of tiles drawn - 1.
					; I drew 2 tiles, so 2-1 = 1. A = 01.

		JSL $01B7B3		; Call the routine that draws the sprite.
		RTS			; Never forget this!

State_6G:	PHX
		LDX #$03
Graph_Loop6:	LDA $00
		CLC
		ADC X_DISP,x
		STA $0300,y
	
		LDA $01
		CLC
		ADC Y_DISP,x
		STA $0301,y
		
		PHX
		TXA
		CLC
		ADC $03
		TAX
		LDA TILE_S6,x
		STA $0302,y
		PLX
		
		LDA $04
		STA $0303,y
		
		INY
		INY
		INY
		INY
		DEX
		
		BPL Graph_Loop6
		JMP Graph_End



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_HORZ_POS
; This routine determines which side of the sprite Mario is on.  It sets the Y register
; to the direction such that the sprite would face Mario
; It is ripped from $03B817
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SubHorzPos:		LDY #$00
			LDA $D1
			SEC
			SBC $E4,x
			STA $0F
			LDA $D2
			SBC $14E0,x
			BPL Return1
			INY
Return1			RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_VERT_POS
; This routine determines if Mario is above or below the sprite.  It sets the Y register
; to the direction such that the sprite would face Mario
; It is ripped from $03B829
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SubVertPos:		LDY #$00
			LDA $D3
			SEC
			SBC $D8,x
			STA $0F
			LDA $D4
			SBC $14D4,x
			BPL Return2
			INY
Return2			RTS