;######################################################
;　　　　外付けジョイスティック用　２ｃｈ連射回路
;5p(GP2) 連射速度設定　Hレベルで低速　Lレベルで高速
;6p(GP1) 連射on/off設定　Hレベルで連射on Lレベルでoff
;2p(GP5) トリガA入力　ジョイスティックから　Lでアクティブ
;4p(GP3) トリガB入力　ジョイスティックから
;7p(GP0) トリガA出力　4021へ
;3p(GP4) トリガB出力　4021へ
;
;######################################################

	list p=12f629
	include <p12f629.inc>
	__config _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT

;変数の定義

W1M	EQU	20H
W25M	EQU	21H
W50M	EQU	22H

;%%%%%%%%%% PIC 初期設定

RESET
	ORG	00H
	GOTO	START

START
	bsf	STATUS, RP0	;bank1

	call	3FFh		;補正値取得
	movwf	OSCCAL		;内部OSC校正

	movlw	b'00101110'	;GP0,GP4をoutput
	movwf	TRISIO

	movlw	b'00000110'	;GP1,GP2をpull up
	movwf	WPU

	movlw	b'00000000'	;GPIO Pull upイネーブル(bit7=0)
	movwf	OPTION_REG

	bcf	STATUS, RP0	;bank0

	movlw	b'00000000'	;割込みディセーブル
	movwf	INTCON

	movlw	b'00000111'	;コンパレータOFF(GPIO 0,1=digital)
	movwf	CMCON

;%%%%%%%%%% サブルーチン
;=======================================
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	11H		;0001 0001
	MOVWF	GPIO		;出力をすべてHiにする

;%%%%%%%%%% メインプログラム

;#### トリガを調べる
LOOP
	 
	BTFSC	GPIO,5		;トリガＡ押下なら２つ進む
 	GOTO 	TRIG_0X
	BTFSC	GPIO,3		;トリガＢ押下なら２つ進む
	GOTO	TRIG_A0
	GOTO	TRIG_AB

TRIG_0X
	BTFSC	GPIO,3		;トリガＢ押下なら２つ進む
	GOTO	TRIG_00
	GOTO	TRIG_0B

;#### パルス出力
;##トリガ押下なし
TRIG_00
	MOVLW	11H		;0001 0001
	MOVWF	GPIO
	GOTO	LOOP

;##トリガＡのみ押下
TRIG_A0
	BTFSC	GPIO,1		;GP1 L=連射off でスキップ
	GOTO	_A0HX
	GOTO	_A0LX

_A0HX	BTFSC	GPIO,2		;GP2 L=高速モード でスキップ
	GOTO	_A0HH
	GOTO	_A0HL

_A0LX	MOVLW	10H		;0001 0000
	MOVWF	GPIO		;トリガＡ押下あり　連射なし
	GOTO	LOOP

_A0HH	MOVLW	10H		;0001 0000
	MOVWF	GPIO		;トリガＡ押下あり　連射低速
	CALL	T50M		;50ms待つ
	MOVLW	11H		;0001 0001
	MOVWF	GPIO		;トリガＡ離す
	CALL	T50M		;50ms待つ
	GOTO	LOOP

_A0HL	MOVLW	10H		;0001 0000
	MOVWF	GPIO		;トリガＡ押下あり　連射高速
	CALL	T25M		;25ms待つ
	MOVLW	11H		;0001 0001
	MOVWF	GPIO		;トリガＡ離す
	CALL	T25M		;25ms待つ
	GOTO	LOOP


;##トリガＢのみ押下
TRIG_0B
	BTFSC	GPIO,1		;GP1 L=連射off でスキップ
	GOTO	_0BHX
	GOTO	_0BLX

_0BHX	BTFSC	GPIO,2		;GP2 L=高速モード でスキップ
	GOTO	_0BHH
	GOTO	_0BHL

_0BLX	MOVLW	01H		;0000 0001
	MOVWF	GPIO		;トリガＢ押下あり　連射なし
	GOTO	LOOP

_0BHH	MOVLW	01H		;0000 0001
	MOVWF	GPIO		;トリガＢ押下あり　連射低速
	CALL	T50M		;50ms待つ
	MOVLW	11H		;0001 0001
	MOVWF	GPIO		;トリガＢ離す
	CALL	T50M		;50ms待つ
	GOTO	LOOP

_0BHL	MOVLW	01H		;0000 0001
	MOVWF	GPIO		;トリガＢ押下あり　連射高速
	CALL	T25M		;25ms待つ
	MOVLW	11H		;0001 0001
	MOVWF	GPIO		;トリガＢ離す
	CALL	T25M		;25ms待つ
	GOTO	LOOP

;##トリガＡＢ両方押下
TRIG_AB
	BTFSC	GPIO,1		;GP1 L=連射off でスキップ
	GOTO	_ABHX
	GOTO	_ABLX

_ABHX	BTFSC	GPIO,2		;GP2 L=高速モード でスキップ
	GOTO	_ABHH
	GOTO	_ABHL	

_ABLX	MOVLW	00H		;0000 0000
	MOVWF	GPIO		;トリガＡＢ押下あり　連射なし
	GOTO	LOOP

_ABHH	MOVLW	00H		;0000 0000
	MOVWF	GPIO		;トリガＡＢ押下あり　連射低速
	CALL	T50M		;50ms待つ
	MOVLW	11H		;0001 0001
	MOVWF	GPIO		;トリガＡＢ離す
	CALL	T50M		;50ms待つ
	GOTO	LOOP

_ABHL	MOVLW	00H		;0000 0000
	MOVWF	GPIO		;トリガＡＢ押下あり　連射高速
	CALL	T25M		;25ms待つ
	MOVLW	11H		;0001 0001
	MOVWF	GPIO		;トリガＡＢ離す
	CALL	T25M		;25ms待つ
	GOTO	LOOP

	END


