;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Jaguar Example Source Code
; Copyright (c)1994 Atari Corp.
; ALL RIGHTS RESERVED
;
; Program: hv.cof
;  Module: hv_joy.s   	- Main Program Loop
;
; Revision History:
; 9/2/94   - SDS: Created
;
		.include	"jaguar.inc"

; Globals
		.globl		JoyLoop

; Externals
		.extern		upd_freqx1
		.extern		upd_freqy1
		.extern		img_adr1
		.extern		img_adr2
		.extern		bmp_hscl2
		.extern		bmp_vscl2
		.extern		image1
		.extern		image2
		.extern		image3

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Procedure: JoyLoop
;
JoyLoop:
		jsr		ReadJoypads			; Read Joypad 1 and 2
		jsr		ParseInput			; React on Joy-Events

		bra		JoyLoop

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Procedure: ReadJoypads
;
;	Read both joypads and update state variables!
;
; Store a bitmask of the current state of the joysticks in joy1cur
; and joy2cur. The variables joy1edge and joy2edge stores a state
; bitmap of new key 'down' events (never 'up' events) since the last
; time ReadJoypads was called.
;
; The code below may be altered by removing two AND instructions so
; that joy1edge and joy2edge contain a bitmap of keys that have changed
; (not pressed). If desired, this data could be compared to joy1cur and
; joy2cur to determine the actual button state.
;
ReadJoypads:
		movem.l	d0-d2/a0,-(sp)

		lea			JOYSTICK,a0

		move.l	#$f0fffffc,d1	; d1 = Joypad data mask
		moveq.l	#-1,d2		 		; d2 = Cumulative joypad reading

		move.w	#$81fe,(a0)
		move.l	(a0),d0		 		; Read joypad, pause button, A button
		or.l		d1,d0					; Mask off unused bits
		ror.l		#4,d0
		and.l		d0,d2					; d2 = xxAPxxxx RLDUxxxx xxxxxxxx xxxxxxxx
		move.w	#$81fd,(a0)
		move.l	(a0),d0				; Read *741 keys, B button
		or.l		d1,d0					; Mask off unused bits
		ror.l		#8,d0
		and.l		d0,d2					; d2 = xxAPxxBx RLDU741* xxxxxxxx xxxxxxxx
		move.w	#$81fb,(a0)
		move.l	(a0),d0				; Read 2580 keys, C button
		or.l		d1,d0					; Mask off unused bits
		rol.l		#6,d0
		rol.l		#6,d0
		and.l		d0,d2					; d2 = xxAPxxBx RLDU741* xxCxxxxx 2580xxxx
		move.w	#$81f7,(a0)
		move.l	(a0),d0				; Read 369# keys, Option button
		or.l		d1,d0					; Mask off unused bits
		rol.l		#8,d0
		and.l		d0,d2					; d2 = xxAPxxBx RLDU741* xxCxxxOx 2580369# <== inputs active low

		moveq.l	#-1,d1
		eor.l		d2,d1					; d1 = xxAPxxBx RLDU741* xxCxxxOx 2580369# <== now inputs active high

		move.l	joy1cur,d0		; old joycur needed for determining the new joyedge
		move.l	d1,joy1cur		; Current joypad reading stored into joycur
		eor.l		d1,d0

		and.l		d1,d0					; REMOVE IF DESIRED (AS DOCUMENTED ABOVE)
		
		move.l	d0,joy1edge		;joypad, buttons, keys that were just pressed

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Now scan for player 2
;
		move.l	#$0ffffff3,d1	; d1 = Joypad data mask
		moveq.l	#-1,d2				; d2 = Cumulative joypad reading

		move.w	#$817f,(a0)
		move.l	(a0),d0				; Read joypad, pause button, A button
		or.l		d1,d0					; Mask off unused bits
		rol.b		#2,d0					; note the size of rol
		ror.l		#8,d0
		and.l		d0,d2					; d2 = xxAPxxxx RLDUxxxx xxxxxxxx xxxxxxxx
		move.w	#$81bf,(a0)
		move.l	(a0),d0				; Read *741 keys, B button
		or.l		d1,d0					; Mask off unused bits
		rol.b		#2,d0					; note the size of rol
		ror.l		#8,d0
		ror.l		#4,d0
		and.l		d0,d2					; d2 = xxAPxxBx RLDU741* xxxxxxxx xxxxxxxx
		move.w	#$81df,(a0)
		move.l	(a0),d0				; Read 2580 keys, C button
		or.l		d1,d0					; Mask off unused bits
		rol.b		#2,d0					; note the size of rol
		rol.l		#8,d0
		and.l		d0,d2					; d2 = xxAPxxBx RLDU741* xxCxxxxx 2580xxxx
		move.w	#$81ef,(a0)
		move.l	(a0),d0				; Read 369# keys, Option button
		or.l		d1,d0					; Mask off unused bits
		rol.b		#2,d0					; note the size of rol
		rol.l		#4,d0
		and.l		d0,d2					; d2 = xxAPxxBx RLDU741* xxCxxxOx 2580369# <== inputs active low

		moveq.l	#-1,d1
		eor.l		d2,d1					; d1 = xxAPxxBx RLDU741* xxCxxxOx 2580369# <== now inputs active high

		move.l	joy2cur,d0		; Old joycur needed for determining the new joyedge
		move.l	d1,joy2cur		; Current joypad reading stored into joycur
		eor.l		d1,d0

		and.l		d1,d0					; REMOVE IF DESIRED (AS DOCUMENTED ABOVE)

		move.l	d0,joy2edge		;joypad, buttons, keys that were just pressed

		movem.l	(sp)+,d0-d2/a0
		rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Procedure: ParseInput
;
ParseInput:
		movem.l	d0-d1/a0-a1,-(sp)

		move.l	#upd_freqx1,a0
		move.l	#upd_freqy1,a1

		move.l	joy1edge,d0
ck_up1:
		btst.l	#JOY_UP,d0
		beq.b		ck_down1
		sub.w		#1,(a1)
		bra.b		ck_left1
ck_down1:
		btst.l	#JOY_DOWN,d0
		beq.b		ck_left1
		add.w		#1,(a1)
ck_left1:
		btst.l	#JOY_LEFT,d0
		beq.b		ck_right1
		add.w		#1,(a0)
		bra			ck_joy_2player
ck_right1:
		btst.l	#JOY_RIGHT,d0
		beq.b		ck_fireABC1
		sub.w		#1,(a0)

ck_fireABC1:
		move.l	#img_adr1,a0

		move.l	joy1cur,d0
ck_fireA1:
		btst.l	#FIRE_A,d0
		beq.b		ck_fireB1
		move.l	#image1,(a0)
ck_fireB1:
		btst.l	#FIRE_B,d0
		beq.b		ck_fireC1
		move.l	#image2,(a0)
ck_fireC1:
		btst.l	#FIRE_C,d0
		beq.b		ck_joy_2player
		move.l	#image3,(a0)

ck_joy_2player:
		move.l	#bmp_hscl2,a0
		move.l	#bmp_vscl2,a1

		move.l	joy2edge,d0
ck_up2:
		btst.l	#JOY_UP,d0
		beq.b		ck_down2
		sub.w		#1,(a1)
		bra.b		ck_left2
ck_down2:
		btst.l	#JOY_DOWN,d0
		beq.b		ck_left2
		add.w		#1,(a1)
ck_left2:
		btst.l	#JOY_LEFT,d0
		beq.b		ck_right2
		sub.w		#1,(a0)
		bra			end_joy
ck_right2:
		btst.l	#JOY_RIGHT,d0
		beq.b		ck_fireABC2
		add.w		#1,(a0)

ck_fireABC2:
		move.l	#img_adr2,a0

		move.l	joy2cur,d0
ck_fireA2:
		btst.l	#FIRE_A,d0
		beq.b		ck_fireB2
		move.l	#image1,(a0)
ck_fireB2:
		btst.l	#FIRE_B,d0
		beq.b		ck_fireC2
		move.l	#image2,(a0)
ck_fireC2:
		btst.l	#FIRE_C,d0
		beq.b		end_joy
		move.l	#image3,(a0)

end_joy:
		movem.l	(sp)+,d0-d1/a0-a1
		rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Uninitialized Data!!!
;
		.bss

joy1edge:	.ds.l		1
joy1cur:	.ds.l		1
joy2edge:	.ds.l		1
joy2cur:	.ds.l		1

	.end