;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
;　姫路城_受信側（本体）
;　内部クロック（4MHz）使用
;				Ver　00.00.01
;				06/22/2006
;				by. すきやき工房
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

	list      p=12f675           ; list directive to define processor
	#include <p12f675.inc>        ; processor specific variable definitions

	errorlevel  -302              ; suppress message 302 from list file

	__CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON &  _INTRC_OSC_NOCLKOUT


;********　変数定義
w_temp        EQU     0x20        ; コンテキスト保存用
status_temp   EQU     0x21        ; コンテキスト保存用
CNT1	EQU	0x022
CNT2	EQU	0x023
CNT3	EQU	0x024
CNT4	EQU	0x025

CMD1	EQU	0x026
CMD2	EQU	0x027
CMD3	EQU	0x028
CMD4	EQU	0x029
CMD5	EQU	0x030
CMD6	EQU	0x031
CMD7	EQU	0x032
CMD8	EQU	0x033
CMD9	EQU	0x034

CMD	EQU	0x035
MDAT	EQU	0x036

MD_OL	EQU	0x037

SG_F	EQU	0x038

;********
	ORG     0x000             ;プロセッサー　リセットベクタ
	goto	main

	ORG	0x004             ; interrupt vector location
;********　割り込み処理

		movwf   w_temp            ; save off current W register contents
		movf	STATUS,w          ; move status register into W register
		movwf	status_temp       ; save off contents of STATUS register

	bcf		PIR1,TMR1IF		;割り込みフラグクリア

	movlw	0x0B			;カウント初期値設定     0x0BDC
	movwf	TMR1H			;((1/(4*10^6))　*　4　*　8　*　(65536-0x0bdc))=0.5sec
	movlw	0xDC			;１サイクル＝４クロック：プリスケーラ8
	movwf	TMR1L
;

	btfss	SG_F,0
	clrf		MDAT

	movf	MDAT,w
	movwf	GPIO

	bcf		SG_F,0

; isr code can go here or be located as a call subroutine elsewhere


		movf    status_temp,w     ; retrieve copy of STATUS register
		movwf	STATUS            ; restore pre-isr STATUS register contents
		swapf   w_temp,f
		swapf   w_temp,w          ; restore pre-isr W register contents
		retfie                    ; return from interrupt

;********　メインプログラム
main
	;内部オシレータの校正

		call    0x3FF             ; retrieve factory calibration value
		bsf     STATUS,RP0		;バンク１に切り替え
		movwf   OSCCAL            ; update register with factory cal value 
		bcf     STATUS,RP0		;バンク0に切り替え

	;ポートの初期設定

	bcf 		STATUS,RP0		;バンク0に切り替え
	clrf 	GPIO				 ;Init GPIO
	movlw 	b'00000111'			 ;Set GP<2:0> to   (コンパレータoff)
	movwf 	CMCON 			;(COMPARATOR CONTROL REGISTER)digital IO
	bsf 		STATUS,RP0		;バンク１に切り替え
	clrf 	ANSEL				 ;(ANALOG SELECT REGISTER) Digital I/O

	movlw b'00001000'	 ;Set GP<3> as inputs  （1：input 0:output 下位ビットより0→5　［--543210］）
	movwf TRISIO ;an-d set GP<54210>as outputs


	;timerの初期設定

	bsf		STATUS,RP0		;バンク１に切り替え

	bsf		PIE1,TMR1IE		;タイマ1割り込み許可

	bcf		STATUS,RP0		;バンク0に切り替え

	;タイマー1の初期設定
	movlw	b'00110001'		;プリスケーラ8；内部クロック
	movwf	T1CON	;プリセットカウンタへ出力
	movlw	0x0B			;カウント初期値設定     0x0BDC
	movwf	TMR1H			;((1/(4*10^6))　*　4　*　8　*　(65536-0x0BDC))=0.5sec
	movlw	0xDC			;１サイクル＝４クロック：プリスケーラ8
	movwf	TMR1L
	bsf		INTCON,PEIE		;周辺割り込み許可
	bsf		INTCON,GIE		;全体割り込み許可

;*************

	bcf 		STATUS,RP0		;バンク0に切り替え

; remaining code goes here
	movlw	b'00000001'			;コマンドデータ格納
	movwf	CMD1
	movlw	b'10000001'		
	movwf	CMD2
	movlw	b'01000001'		
	movwf	CMD3
	movlw	b'11000001'		
	movwf	CMD4
	movlw	b'00100001'		
	movwf	CMD5
	movlw	b'10100001'		
	movwf	CMD6
	movlw	b'01100001'		
	movwf	CMD7
	movlw	b'11100001'		
	movwf	CMD8
	movlw	b'00010001'		
	movwf	CMD9

;*************
_main_loop
	clrf		CMD

	btfsc	GPIO,3			;立ち上がり
	goto	_main_loop
	call		TIM300u		;300um待つ

	btfsc	GPIO,3			;リーダーチェック L
	goto	_main_loop
	call		TIM600u

	btfsc	GPIO,3			;リーダーチェック L
	goto	_main_loop
	call		TIM600u

	btfsc	GPIO,3			;リーダーチェック L
	goto	_main_loop
	call		TIM600u

	btfsc	GPIO,3			;リーダーチェック L
	goto	_main_loop
	call		TIM600u

	btfss	GPIO,3			;リーダーチェック H
	goto	_main_loop
	call		TIM600u
	call		TIM600u


	btfsc	GPIO,3			;H:0　L:1
	goto	cm7_0
	bsf 		CMD,7
	call		TIM600u
cm7_0	
	call		TIM600u
	call		TIM600u

	btfsc	GPIO,3			;H:0　L:1
	goto	cm6_0
	bsf 		CMD,6
	call		TIM600u
cm6_0	
	call		TIM600u
	call		TIM600u

	btfsc	GPIO,3			;H:0　L:1
	goto	cm5_0
	bsf 		CMD,5
	call		TIM600u
cm5_0	
	call		TIM600u
	call		TIM600u

	btfsc	GPIO,3			;H:0　L:1
	goto	cm4_0
	bsf 		CMD,4
	call		TIM600u
cm4_0	
	call		TIM600u
	call		TIM600u

	btfsc	GPIO,3			;H:0　L:1
	goto	cm3_0
	bsf 		CMD,3
	call		TIM600u
cm3_0	
	call		TIM600u
	call		TIM600u

	btfsc	GPIO,3			;H:0　L:1
	goto	cm2_0
	bsf 		CMD,2
	call		TIM600u
cm2_0	
	call		TIM600u
	call		TIM600u

	btfsc	GPIO,3			;H:0　L:1
	goto	cm1_0
	bsf 		CMD,1
	call		TIM600u
cm1_0	
	call		TIM600u
	call		TIM600u

	btfsc	GPIO,3			;H:0　L:1
	goto	cm0_0
	bsf 		CMD,0
	call		TIM600u
cm0_0	


	call		TIM600u
	call		TIM600u
	call		TIM600u
	call		TIM600u
	call		TIM600u
	call		TIM600u
	call		TIM600u
	call		TIM600u

	call		TIM600u

	movf	CMD,w
	xorwf	CMD1,w
	btfss	STATUS,Z
	goto	md_2
	movlw	b'00010010'		
	movwf	MDAT

md_2	
	movf	CMD,w
	xorwf	CMD2,w
	btfss	STATUS,Z
	goto	md_3
	movlw	b'00000010'		
	movwf	MDAT

md_3
	movf	CMD,w
	xorwf	CMD3,w
	btfss	STATUS,Z
	goto	md_4
	movlw	b'00100010'		
	movwf	MDAT

md_4	
	movf	CMD,w
	xorwf	CMD4,w
	btfss	STATUS,Z
	goto	md_5
	movlw	b'00010000'		
	movwf	MDAT

md_5	
	movf	CMD,w
	xorwf	CMD5,w
	btfss	STATUS,Z
	goto	md_6
	movlw	b'00110011'		
	movwf	MDAT

md_6	
	movf	CMD,w
	xorwf	CMD6,w
	btfss	STATUS,Z
	goto	md_7
	movlw	b'00100000'		
	movwf	MDAT

md_7	
	movf	CMD,w
	xorwf	CMD7,w
	btfss	STATUS,Z
	goto	md_8
	movlw	b'00010001'		
	movwf	MDAT

md_8	
	movf	CMD,w
	xorwf	CMD8,w
	btfss	STATUS,Z
	goto	md_9
	movlw	b'00000001'		
	movwf	MDAT

md_9	
	movf	CMD,w
	xorwf	CMD9,w
	btfss	STATUS,Z
	goto	CM_OUT
	movlw	b'00100001'		
	movwf	MDAT


CM_OUT

	movf	MD_OL,w
	xorlw	b'00000000'
	btfss	STATUS,Z
	goto	mo_cm

	movf	MD_OL,w
	xorwf	MDAT,w
	btfsc	STATUS,Z
	goto	mo_cm
	movlw	b'00000000'		
	movwf	GPIO
	CALL	TIM300u

mo_cm
	bsf		SG_F,0		;ヘッダ信号受けた場合1

	movf	MDAT,w
	movwf	GPIO

	movf	MDAT,w
	movwf	MD_OL
;	movf	MD_OL,w
;	xorwf	MDAT,w
;	btfss	STATUS,Z
;	goto	_main_loop
;	bcf		T1CON,TMR1ON		;タイマ1停止
;	movlw	0x0B			;カウント初期値設定     0x0BDC
;	movwf	TMR1H			;((1/(4*10^6))　*　4　*　8　*　(65536-0x0bdc))=0.5sec
;	movlw	0xDC			;１サイクル＝４クロック：プリスケーラ8
;	movwf	TMR1L
;	bsf		T1CON,TMR1ON		;タイマ1動作

	goto _main_loop
;*************
;ウェイトサブルーチン（300us）
;4クロックで１サイクル、4MHz では 1cycleで、1usec
TIM300u

	movlw	d'74'
	movwf	CNT1

LOOP3
	nop			;4*74-1=295	cycle	
	decfsz	CNT1,F
	goto	LOOP3
	return			;2+ 295 +2=299 cycle


;*************
;ウェイトサブルーチン（600us）
;4クロックで１サイクル、4MHz では 1cycleで、1usec
TIM600u

	movlw	0x95
	movwf	CNT1

LOOP4
	nop			;4*0x95-1=595	cycle	
	decfsz	CNT1,F
	goto	LOOP4
	return			;2+ 595 +2=599 cycle


;*************
;ウェイトサブルーチン(約1ミリ秒)
;4クロックで１サイクル、4MHz では 1cycleで、1usec
TIM1m
	movlw	0xf9
	movwf	CNT1
LOOP5
	nop			;4*0xf9-1=995	cycle	
	decfsz	CNT1,F
	goto	LOOP5
	return			;2+ 995 +2=999 cycle

		END                       ; directive 'end of program'
