
;	opt	O+,D+,L+,P=68020


	INCDIR	utils:sysinc
	include "workbench:utilities/devpac/system.gs"
	INCLUDE	libraries/lowlevel.i
;	INCLUDE	exec/exec_lib.i

_LVOReadJoyPort	EQU	-$1e


;	XDEF	_InitLowLevel

_InitLowLevel
	lea	_lowlevel(pc),a1
	moveq	#1,d0
	move.l	4.w,a6
	jsr	_LVOOpenLibrary(a6)
	tst.l	d0
	beq.s	.NoLowLib
	move.l	d0,_LowBase
	rts

.NoLowLib
	moveq	#-1,d0
	rts


;	XDEF	_CloseLowLevel

_CloseLowLevel
	move.l	_LowBase(pc),a1
	tst.l	a1
	beq.s	.Exit
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
.Exit
	rts



; pass port number in d0 0-3

;	XDEF	_ReadJoy
_ReadJoy1
	move.l a6,-(a7)
	move.l #1,d0
	move.l	_LowBase(pc),a6
	jsr	_LVOReadJoyPort(a6)

	move.l (a7)+,a6
	move.l d0,d1
;	and.l #$00FF000F,d0

	and.l	#JP_TYPE_MASK,d1
;
; bits in d1
;
;
	cmp.l	#JP_TYPE_NOTAVAIL,d1 	
	beq.b	.Empty

	cmp.l	#JP_TYPE_GAMECTLR,d1 
	beq.b	.GameCtrl

	cmp.l	#JP_TYPE_MOUSE,d1    
	beq	.Mouse

	cmp.l	#JP_TYPE_JOYSTK,d1   
	beq	.Joystick

;	cmp.l	#JP_TYPE_UNKNOWN,d1  
;
;
; type is an unknown type 
;
.Empty
;
	rts
;
.GameCtrl

;	these are the bit defs..
;
;     JPF_BUTTON_BLUE         Blue - Stop
;     JPF_BUTTON_RED          Red - Select
;     JPF_BUTTON_YELLOW       Yellow - Repeat
;     JPF_BUTTON_GREEN        Green - Shuffle
;     JPF_BUTTON_FORWARD      Charcoal - Forward
;     JPF_BUTTON_REVERSE      Charcoal - Reverse
;     JPF_BUTTON_PLAY         Grey - Play/Pause
;     JPF_JOY_UP              Up
;     JPF_JOY_DOWN            Down
;     JPF_JOY_LEFT            Left
;     JPF_JOY_RIGHT           Right

 move.l #KeyMap,a5
 moveq #0,d5
 move.b forward_key,d5
 move.l d0,d1
 and.l #JPF_JOY_UP,d0
 sne (a5,d5.w)
 move.b backward_key,d5
 move.l d1,d0
 and.l #JPF_JOY_DOWN,d0
 sne (a5,d5.w)
 move.b turn_left_key,d5
 move.l d1,d0
 and.l #JPF_JOY_LEFT,d0
 sne (a5,d5.w)
 move.b turn_right_key,d5
 move.l d1,d0
 and.l #JPF_JOY_RIGHT,d0
 sne (a5,d5.w)

 move.b fire_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_GREEN,d0
 sne (a5,d5.w)

 move.b operate_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_YELLOW,d0
 sne (a5,d5.w)

 move.b run_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_RED,d0
 sne (a5,d5.w)

 move.b duck_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_BLUE,d0
 beq.s .notduckbutpre
 tst.b .ducklast
 bne.s .notduckbut
 st (a5,d5.w)
 st .ducklast
 bra.s .notduckbut
.notduckbutpre:
 clr.b .ducklast
.notduckbut:

 move.b force_sidestep_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_FORWARD,d0
 sne (a5,d5.w)


 move.b #$19,d5
 move.l d1,d0
 and.l #JPF_BUTTON_PLAY,d0
 sne (a5,d5.w)


 move.l d1,d0
 and.l #JPF_BUTTON_REVERSE,d0
 beq.s .nonextweappre

 tst.b PLR1_GunFrame
 bne.s .nonextweappre

 tst.b .heldlast
 bne.s .nonextweap
 st .heldlast
 moveq #0,d0
 moveq #0,d2
 move.b PLR1_GunSelected,d2
 move.l #PLR1_GunData,a6
 move.l #GUNVALS,a5

.findcurrent: 
 cmp.b (a5,d0.w),d2
 beq.s .foundcurrent
 add.b #1,d0
 bra .findcurrent

.foundcurrent:
 
 moveq #0,d2
.picknext:
 add.b #1,d0
 cmp.b #4,d0
 ble.s .notfirst
 move.b #0,d0
.notfirst:
 
 moveq #0,d2
 moveq #0,d3 
 move.b (a5,d0.w),d2
 move.b d2,d3
 lsl.w #5,d2
 tst.b 7(a6,d2.w)
 beq.s .picknext
 move.b d3,PLR1_GunSelected
 
 bra .nonextweap
 
.nonextweappre:
 clr.b .heldlast
.nonextweap:


 rts

.heldlast: dc.b 0
.ducklast: dc.b 0

.Joystick

 move.l #KeyMap,a5
 move.l #SineTable,a0

 btst #1,$dff00c
 sne d0
 btst #1,$dff00d
 sne d1
 btst #0,$dff00c
 sne d2
 btst #0,$dff00d
 sne d3
 moveq #0,d5
 move.b fire_key,d5
 btst #7,$bfe001
 seq (a5,d5.w)

 move.b turn_left_key,d5
 move.b d0,(a5,d5.w)
 move.b turn_right_key,d5
 move.b d1,(a5,d5.w)
 eor.b d0,d2
 move.b forward_key,d5
 move.b d2,(a5,d5.w)
 eor.b d1,d3
 move.b backward_key,d5
 move.b d3,(a5,d5.w)
 rts

.Mouse
	rts




_ReadJoy2
	move.l a6,-(a7)
	move.l #1,d0
	move.l	_LowBase(pc),a6
	jsr	_LVOReadJoyPort(a6)

	move.l (a7)+,a6
	move.l d0,d1
;	and.l #$00FF000F,d0

	and.l	#JP_TYPE_MASK,d1
;
; bits in d1
;
;
	cmp.l	#JP_TYPE_NOTAVAIL,d1 	
	beq.b	.Empty

	cmp.l	#JP_TYPE_GAMECTLR,d1 
	beq.b	.GameCtrl

	cmp.l	#JP_TYPE_MOUSE,d1    
	beq	.Mouse

	cmp.l	#JP_TYPE_JOYSTK,d1   
	beq	.Joystick

;	cmp.l	#JP_TYPE_UNKNOWN,d1  
;
;
; type is an unknown type 
;
.Empty
;
	rts
;
.GameCtrl

;	these are the bit defs..
;
;     JPF_BUTTON_BLUE         Blue - Stop
;     JPF_BUTTON_RED          Red - Select
;     JPF_BUTTON_YELLOW       Yellow - Repeat
;     JPF_BUTTON_GREEN        Green - Shuffle
;     JPF_BUTTON_FORWARD      Charcoal - Forward
;     JPF_BUTTON_REVERSE      Charcoal - Reverse
;     JPF_BUTTON_PLAY         Grey - Play/Pause
;     JPF_JOY_UP              Up
;     JPF_JOY_DOWN            Down
;     JPF_JOY_LEFT            Left
;     JPF_JOY_RIGHT           Right

 move.l #KeyMap,a5
 moveq #0,d5
 move.b forward_key,d5
 move.l d0,d1
 and.l #JPF_JOY_UP,d0
 sne (a5,d5.w)
 move.b backward_key,d5
 move.l d1,d0
 and.l #JPF_JOY_DOWN,d0
 sne (a5,d5.w)
 move.b turn_left_key,d5
 move.l d1,d0
 and.l #JPF_JOY_LEFT,d0
 sne (a5,d5.w)
 move.b turn_right_key,d5
 move.l d1,d0
 and.l #JPF_JOY_RIGHT,d0
 sne (a5,d5.w)

 move.b fire_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_GREEN,d0
 sne (a5,d5.w)

 move.b operate_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_YELLOW,d0
 sne (a5,d5.w)

 move.b run_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_RED,d0
 sne (a5,d5.w)

 move.b duck_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_BLUE,d0
 beq.s .notduckbutpre 
 tst.b .ducklast
 bne.s .notduckbut
 st .ducklast
 st (a5,d5.w)
 bra .notduckbut
.notduckbutpre:
 clr.b .ducklast
.notduckbut:


 move.b #$19,d5
 move.l d1,d0
 and.l #JPF_BUTTON_PLAY,d0
 sne (a5,d5.w)

 move.b force_sidestep_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_FORWARD,d0
 sne (a5,d5.w)

 move.l d1,d0
 and.l #JPF_BUTTON_REVERSE,d0
 beq.s .nonextweappre
 
 tst.b PLR2_GunFrame
 bne.s .nonextweappre
 
 tst.b .heldlast
 bne.s .nonextweap
 st .heldlast
 moveq #0,d0
 move.b PLR2_GunSelected,d2
 move.l #PLR2_GunData,a6
 move.l #GUNVALS,a5

.findcurrent: 
 cmp.b (a5,d0.w),d2
 beq.s .foundcurrent
 add.b #1,d0
 bra .findcurrent

.foundcurrent: 

 moveq #0,d2

.picknext:
 add.b #1,d0
 cmp.b #4,d0
 ble.s .notfirst
 move.b #0,d0
.notfirst:
 
 moveq #0,d2
 moveq #0,d3
 move.b (a5,d0.w),d2
 move.b d2,d3
 lsl.w #5,d2
 tst.b 7(a6,d2.w)
 beq.s .picknext
 move.b d3,PLR2_GunSelected
 
 bra .nonextweap
 
.nonextweappre:
 clr.b .heldlast
.nonextweap:


 rts

.heldlast: dc.b 0
.ducklast: dc.b 0

.Joystick

 move.l #KeyMap,a5
 move.l #SineTable,a0

 btst #1,$dff00c
 sne d0
 btst #1,$dff00d
 sne d1
 btst #0,$dff00c
 sne d2
 btst #0,$dff00d
 sne d3
 moveq #0,d5
 move.b fire_key,d5
 btst #7,$bfe001
 seq (a5,d5.w)

 move.b turn_left_key,d5
 move.b d0,(a5,d5.w)
 move.b turn_right_key,d5
 move.b d1,(a5,d5.w)
 eor.b d0,d2
 move.b forward_key,d5
 move.b d2,(a5,d5.w)
 eor.b d1,d3
 move.b backward_key,d5
 move.b d3,(a5,d5.w)
 rts

.Mouse
	rts


;BUTVALS
; dc.l JPF_BUTTON_BLUE         Blue - Stop
; dc.l JPF_BUTTON_RED          Red - Select
; dc.l JPF_BUTTON_YELLOW       Yellow - Repeat
; dc.l JPF_BUTTON_GREEN        Green - Shuffle
; dc.l JPF_BUTTON_FORWARD      Charcoal - Forward
; dc.l JPF_BUTTON_REVERSE      Charcoal - Reverse
; dc.l JPF_BUTTON_PLAY         Grey - Play/Pause
; dc.l JPF_JOY_UP              Up
; dc.l JPF_JOY_DOWN            Down
; dc.l JPF_JOY_LEFT            Left
; dc.l JPF_JOY_RIGHT           Right

Data:

_LowBase
	dc.l	0

_lowlevel
	dc.b	'lowlevel.library',0
	even

;	END
	