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


;	INCDIR	include:
	include workbench:utilities/devpac/system.gs"
	INCLUDE	utils:sysinc/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 jump_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_REVERSE,d0
 sne (a5,d5.w)

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

 tst.b PLR1_GunFrame
 bne.s .nonextweappre

 tst.b .heldlast
 bne.s .nonextweap
 st .heldlast

 moveq #0,d0
 move.b PLR1_GunSelected,d0
 move.l #PLAYERONEGUNS,a0


.findnext
 addq #1,d0
 cmp.w #9,d0
 ble.s .okgun
 moveq #0,d0
.okgun:
 tst.w (a0,d0.w*2)
 beq.s .findnext
 
 move.b d0,PLR1_GunSelected 
 jsr SHOWPLR1GUNNAME
  
 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 jump_key,d5
 move.l d1,d0
 and.l #JPF_BUTTON_REVERSE,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_PLAY,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,d0
 move.l #PLAYERTWOGUNS,a0

.findnext
 addq #1,d0
 cmp.w #9,d0
 ble.s .okgun
 moveq #0,d0
.okgun:
 tst.w (a0,d0.w*2)
 beq.s .findnext
 
 move.b d0,PLR2_GunSelected 
 jsr SHOWPLR2GUNNAME
 
 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
	