;######################################################
;　　　　外付けジョイスティック用　２ｃｈ連射回路
;2p(GP5) 連射速度設定　Lレベルで低速　Hレベルで高速
;3p(GP4) 連射on/off設定　Lレベルで連射on Hレベルでoff
;4p(GP3) トリガA入力　ジョイスティックから　Lでアクティブ
;5p(GP2) トリガB入力　ジョイスティックから
;6p(GP1) トリガA出力　本体へ
;7p(GP0) トリガB出力　本体へ
;
;######################################################

	list p=12f509
	include <p12f509.inc>
	__config _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC

;変数の定義

W1M	EQU	07H
W25M	EQU	09H
W50M	EQU	10H

;%%%%%%%%%% PIC 初期設定

RESET
	GOTO	START
	ORG	04H
START
	MOVLW	09FH
	OPTION
	GOTO	SETUP

;%%%%%%%%%% サブルーチン
;=======================================
T50M				;50ミリ秒待つルーチン

	MOVLW	32H
	MOVWF	W50M
W50
	MOVLW	0F9H
	MOVWF	W1M
W50A
	NOP
	DECFSZ	W1M,	F
	GOTO	W50A

	DECFSZ	W50M,	F
	GOTO	W50
	RETLW	00H
;=======================================
T25M				;25ミリ秒待つルーチン

	MOVLW	19H
	MOVWF	W25M
W25
	MOVLW	0F9H
	MOVWF	W1M
W25A
	NOP
	DECFSZ	W1M,	F
	GOTO	W25A

	DECFSZ	W25M,	F
	GOTO	W25
	RETLW	00H
;=======================================
T1M				;1ミリ秒待つルーチン

	MOVLW	0F9H
	MOVWF	W1M
W1
	NOP
	DECFSZ	W1M,	F
	GOTO	W1
	RETLW	00H

;%%%%%%%%%% I/O 初期設定

SETUP
	MOVLW	03CH		;0011 1100
	TRIS	GPIO		;6,7番ピンを出力。2,3,4,5番ピンを入力にする

	MOVLW	03H		;0000 0011
	MOVWF	GPIO		;出力をすべてHiにする

;%%%%%%%%%% メインプログラム

;#### トリガを調べる
LOOP
	 
	BTFSC	GPIO,3		;トリガＡ押下なら２つ進む
 	GOTO 	TRIG_0X
	BTFSC	GPIO,2		;トリガＢ押下なら２つ進む
	GOTO	TRIG_A0
	GOTO	TRIG_AB

TRIG_0X
	BTFSC	GPIO,2		;トリガＢ押下なら２つ進む
	GOTO	TRIG_00
	GOTO	TRIG_0B

;#### パルス出力
;##トリガ押下なし
TRIG_00
	MOVLW	03H		;0000 0011
	MOVWF	GPIO
	GOTO	LOOP

;##トリガＡのみ押下
TRIG_A0
	BTFSC	GPIO,4		;GP4 L でスキップ
	GOTO	_A0HX
	BTFSC	GPIO,5		;GP5 L でスキップ
	GOTO	_A0LH
	GOTO	_A0LL

_A0HX	MOVLW	01H		;0000 0001
	MOVWF	GPIO		;トリガＡ押下あり　連射なし
	GOTO	LOOP

_A0LL	MOVLW	01H		;0000 0001
	MOVWF	GPIO		;トリガＡ押下あり　連射低速
	CALL	T50M		;50ms待つ
	MOVLW	03H		;0000 0011
	MOVWF	GPIO		;トリガＡ離す
	CALL	T50M		;50ms待つ
	GOTO	LOOP

_A0LH	MOVLW	01H		;0000 0001
	MOVWF	GPIO		;トリガＡ押下あり　連射高速
	CALL	T25M		;25ms待つ
	MOVLW	03H		;0000 0011
	MOVWF	GPIO		;トリガＡ離す
	CALL	T25M		;25ms待つ
	GOTO	LOOP


;##トリガＢのみ押下
TRIG_0B
	BTFSC	GPIO,4		;GP4 L でスキップ
	GOTO	_0BHX
	BTFSC	GPIO,5		;GP5 L でスキップ
	GOTO	_0BLH
	GOTO	_0BLL

_0BHX	MOVLW	02H		;0000 0010
	MOVWF	GPIO		;トリガＢ押下あり　連射なし
	GOTO	LOOP

_0BLL	MOVLW	02H		;0000 0010
	MOVWF	GPIO		;トリガＢ押下あり　連射低速
	CALL	T50M		;50ms待つ
	MOVLW	03H		;0000 0011
	MOVWF	GPIO		;トリガＢ離す
	CALL	T50M		;50ms待つ
	GOTO	LOOP

_0BLH	MOVLW	02H		;0000 0010
	MOVWF	GPIO		;トリガＢ押下あり　連射高速
	CALL	T25M		;25ms待つ
	MOVLW	03H		;0000 0011
	MOVWF	GPIO		;トリガＢ離す
	CALL	T25M		;25ms待つ
	GOTO	LOOP

;##トリガＡＢ両方押下
TRIG_AB
	BTFSC	GPIO,4		;GP4 L でスキップ
	GOTO	_ABHX
	BTFSC	GPIO,5		;GP5 L でスキップ
	GOTO	_ABLH
	GOTO	_ABLL

_ABHX	MOVLW	00H		;0000 0000
	MOVWF	GPIO		;トリガＡＢ押下あり　連射なし
	GOTO	LOOP

_ABLL	MOVLW	00H		;0000 0000
	MOVWF	GPIO		;トリガＡＢ押下あり　連射低速
	CALL	T50M		;50ms待つ
	MOVLW	03H		;0000 0011
	MOVWF	GPIO		;トリガＢ離す
	CALL	T50M		;50ms待つ
	GOTO	LOOP

_ABLH	MOVLW	00H		;0000 0000
	MOVWF	GPIO		;トリガＡＢ押下あり　連射高速
	CALL	T25M		;25ms待つ
	MOVLW	03H		;0000 0011
	MOVWF	GPIO		;トリガＡＢ離す
	CALL	T25M		;25ms待つ
	GOTO	LOOP

	END

