;FILE NAME;  Ekey4                      作成2001.7.11 rev7.12 rev7.21	Rev2002.10.13
;		JK1XKP			 Ekey4-2003.6.25 
;
;	使用環境
;		ＰＩＣ		PIC16F84-10/P
;		
;		クロック	4.0MHzセラミック
;
;       64*8bit EEPROM ﾃﾞｰﾀﾒﾓﾘのaddress
;     0  1   2   3   4   5   6   7   8   9   a   b   c   d   e  f            
; 0   -   オプション メモリー  48文字   -   -   -   
;10   -   オプション メモリー  48文字   -       -
;20   -   オプション メモリー  48文字   -
;30   -   オプション メモリー  48文字   -       -
;
;   ref p121 of CQ March 1998   JR7RAR 猪瀬秀一氏のアイデア
;			MORSEcode A=01000010b 2点構成(010b) で トツー（01）
;			MORSEcode Q=11010100b 4点構成(100b) で ツーツートツー（1101）

;	ピンアサイン
;

;	RB0(06)			＝	SW for 'TEST
;	RB1(07)			＝	SW for STAMP
;	RB2(08)			＝	SW for OPTION
;	RB3(09)			＝	SW for Write_OPTION
;	RB4(10)			＝	elekey :dash 
;	RB5(11)			＝	elekey :dot
;	RB6(12)			＝	SW for DE
;	RB7(13)			＝	SW for CQ
;	RA0(17)			＝	side tone out
;	RA1(18)			＝	出力;Key out
;	RA2(01)			＝	C=1000pF
;	RA3(02)			＝	VR=100kΩ
;	RA4(03)			＝	none
;



		.include	16f84.h		; ここでは１６Ｆ８４を選択

		.osc		xt		; オシレータＸＴ
		.wdt		off		; ウォッチドッグＯＦＦ
		.pwrt		on		; パワーアップタイマＯＮ
		.protect	off		; プロテクトＯＦＦ


BZ		equ	ra.0		;;Buzzer

		org	0ch

wait_cn		ds	1
wait_cn2	ds	1
cs		ds	1
cn		ds	1
;   --------------- adress 10&H 
speed		ds	1	;20<elekey speed<150 /when speed=50,Mark=50msec(WPM=10),
opt		ds	1	;if opt.0=1 ,option_bun save mode
code		ds 	1	;MORSEcode A=01000010b 2記号(010b) で トツー（01）
length		ds	1	;１MORSEcodeに含まれる長点、短点の合計数;自動送出時
pos		ds	1
sum		ds	1	;１MORSEcodeに含まれる長点、短点の合計数;save時
mk		ds	1	;codeから取り出してdot時mk=0,dash時mk=1 とする
N		ds	1	
d8		ds	1	;MORSEcode仮記録			
ct		ds	1	
cu		ds	1	
regrb		ds	1	
tes6		ds	1	
tes7		ds	1
tes8		ds	1
tes9		ds	1
;    ------------- adress 20&H
opbun		ds	48	;option文＝48文字;頭を必ず20h番地にお置くこと
		org	0
		
		goto	start
		org	4
		
;参考		retlw	57h	;poi=08h/letr=2eh;"."
;		retlw	95h	;poi=09h/letr=2fh;"/"
;		retlw	0fdh	;poi=0ah/letr=30h;"0" 	letrは液晶表示の場合のコード
;		retlw	7dh	;poi=0bh/letr=31h;"1"  	このEkeyでは、不使用
;		retlw	3dh	;poi=0ch/letr=32h;"2" 

;		retlw	1dh	;poi=0dh/letr=33h;"3" 
;		retlw	0dh	;poi=0eh/letr=34h;"4"
;		retlw	05h	;poi=0fh/letr=35h;"5"

;		retlw	85h	;poi=10h/letr=36h;"6" 
;		retlw	0c5h	;poi=11h/letr=37h;"7"	
;		retlw	0e5h	;poi=12h/letr=38h;"8" 

;		retlw	0f5h	;poi=13h/letr=39h;"9"
;		retlw	06h	;poi=14h/letr=3ah;"HH=[:]で返す"
;		retlw	7eh	;poi=15hletr=3bh;[;]
;		retlw	0b5h	;poi=16h/letr=3ch;"<"

;		retlw	8dh	;poi=17h/letr=3dh;"="BT
;		retlw	0b7h	;poi=18h/letr=3eh;">"
;		retlw	36h	;poi=19h/letr=3fh;"?"
;		retlw	17h	;poi=1ah/letr=40h;"VA"=[@]で返す"
;		retlw	42h	;poi=1bh/letr=41h;"A"
;		retlw	84h	;poi=1ch/letr=42h;"B"
;		retlw	0a4h	;poi=1dh/letr=43h;"C"	

;		retlw	83h	;poi=1eh/letr=44h;"D"
;		retlw	01h	;poi=1fh/letr=45h;"E"
;		retlw	24h	;poi=20h/letr=46h;"F"
			
;		retlw	0c3h	;poi=21h/letr=47h;"G"
;		retlw	04h	;poi=22h/letr=48h;"H"
;		retlw	02h	;poi=23h/letr=49h;"I"

;		retlw	74h	;poi=24h/letr=4ah;"J"
;		retlw	0a3h	;poi=25h/letr=4bh;"K"
;		retlw	44h	;poi=26h/letr=4ch;"L"

;		retlw	0c2h	;poi=27h/letr=4dh;"M"
;		retlw	82h	;poi=28h/letr=4eh;"N"
;		retlw	0e3h	;poi=29h/letr=4fh;"O"
	 		
;		retlw	64h	;poi=2ah/letr=50h;"P"
;		retlw	0d4h	;poi=2bh/letr=51h;"Q"
;		retlw	43h	;poi=2ch/letr=52h;"R"
			
;		retlw	03h	;poi=2dh/letr=53h;"S"
;		retlw	81h	;poi=2eh/letr=54h;"T"
;		retlw	23h	;poi=2fh/letr=55h;"U"
					
;		retlw	14h	;poi=30h/letr=56h;"V"
;		retlw	63h	;poi=31h/letr=57h;"W"
;		retlw	94h	;poi=32h/letr=58h;"X"
		
;		retlw	0b4h	;poi=33h/letr=59h;"Y"
;		retlw	0c4h	;poi=34h/letr=5ah;"Z"
;		retlw	0b5h	;poi=35h/letr=XX;"KN"
;		retlw	15h	;poi=36h/	;"VE"

cq_bun		addwf	pc,1
		
		retlw	0a4h		;"C" pos=0
		retlw	0d4h		;"Q" pos=1
		retlw	0h		;"_" pos=2	
		retlw	0a4h		;"C" pos=3
		retlw	0d4h		;"Q" pos=4
		retlw	0h		;"_" pos=5
		retlw	0a4h		;"C" pos=6
		retlw	0d4h		;"Q" pos=7
		retlw	0h		;"_" pos=8
		retlw	83h		;"D" pos=9
		retlw	01h		;"E" pos=10
		retlw	0h		;"_" pos=11
		retlw	0ffh		;END pos=12  0ffh で最後を判断
		nop

te_bun		addwf	pc,1
		
		retlw	81h		;"T" pos=0
		retlw	01h		;"E" pos=1
		retlw	03h		;"S" pos=2	
		retlw	81h		;"T" pos=3
		retlw	0h		;"_" pos=4
		retlw	0ffh		;END pos=5  0ffh で最後を判断
		nop

de_bun		addwf	pc,1
		retlw	83h		;"D" pos=0
		retlw	01h		;"E" pos=1
		retlw	0h		;"_" pos=2
		retlw	0ffh		;END pos=3  0ffh で最後を判断
		nop
		
xkp_bun		addwf	pc,1
		retlw	74h		;"J" pos=0;ctm;CusTaMise required!!
		retlw	0a3h		;"K" pos=1;ctm
		retlw	7dh		;"1" pos=2;ctm
		retlw	94h		;"X" pos=3;ctm
		retlw	0a3h		;"K" pos=4;ctm
		retlw	64h		;"P" pos=5;ctm
		retlw	0h		;"_" pos=6
		retlw	0ffh		;END pos=7  0ffh で最後を判断
		nop

k_bun		addwf	pc,1
		retlw	0a3h		;"K" pos=0
		retlw	0ffh		;END pos=1  0ffh で最後を判断
		nop


HR_bun		addwf	pc,1
		retlw	04h		;"H" pos=0
		retlw	43h		;"R" pos=1
		retlw	0h		;"_" pos=2
		retlw	04h		;"H" pos=3
		retlw	43h		;"R" pos=4
		retlw	0h		;"_" pos=5
		retlw	8dh		;"BT" pos=6
		retlw	0ffh		;END pos=7  0ffh で最後を判断
		nop

stamp_bun	addwf	pc,1
		retlw	81h		;"T" pos=0
		retlw	82h		;"N" pos=1
		retlw	94h		;"X" pos=2
		retlw	0h		;"_" pos=3
		retlw	24h		;"F" pos=4
		retlw	01h		;"E" pos=5
		retlw	43h		;"R" pos=6
		retlw	0h		;"_" pos=7
		retlw	23h		;"U" pos=8
		retlw	43h		;"R" pos=9
		retlw	0h		;"_" pos=10
		retlw	0a4h		;"C" pos=11
		retlw	42h		;"A" pos=12
		retlw	44h		;"L" pos=13
		retlw	44h		;"L" pos=14
		retlw	0h		;"_" pos=15
		retlw	8dh		;"BT" pos=16
		retlw	0h		;"_" pos=17
		retlw	23h		;"U" pos=18
		retlw	43h		;"R" pos=19
		retlw	0h		;"_" pos=20
		retlw	43h		;"R" pos=21
		retlw	03h		;"S" pos=22
		retlw	81h		;"T" pos=23
		retlw	0h		;"_" pos=24
		retlw	43h		;"R" pos=25
		retlw	03h		;"S" pos=26
		retlw	81h		;"T" pos=27
		retlw	0h		;"_" pos=28
		retlw	05h		;"5" pos=29
		retlw	0f5h		;"9" pos=30
		retlw	0f5h		;"9" pos=31
		retlw	0h		;"_" pos=32
		retlw	05h		;"5" pos=33
		retlw	82h		;"N" pos=34
		retlw	82h		;"N" pos=35
		retlw	0h		;"_" pos=36
		retlw	8dh		;"BT" pos=37
		retlw	0h		;"_" pos=38
		retlw	04h		;"H" pos=39
		retlw	43h		;"R" pos=40
		retlw	0h		;"_" pos=41
		retlw	0d4h		;"Q" pos=42
		retlw	81h		;"T" pos=43
		retlw	04h		;"H" pos=44
		retlw	0h		;"_" pos=45
		retlw	0d4h		;"Q" pos=46
		retlw	81h		;"T" pos=47
		retlw	04h		;"H" pos=48
		retlw	0h		;"_" pos=49
		retlw	0b4h		;"Y" pos=50;ctm
		retlw	0e3h		;"O" pos=51;ctm
		retlw	0a3h		;"K" pos=52;ctm
		retlw	0e3h		;"O" pos=53;ctm
		retlw	04h		;"H" pos=54;ctm
		retlw	42h		;"A" pos=55;ctm
		retlw	0c2h		;"M" pos=56;ctm
		retlw	42h		;"A" pos=57;ctm
		retlw	0h		;"_" pos=58
		retlw	0b4h		;"Y" pos=59;ctm
		retlw	0e3h		;"O" pos=60;ctm
		retlw	0a3h		;"K" pos=61;ctm
		retlw	0e3h		;"O" pos=62;ctm
		retlw	04h		;"H" pos=63;ctm
		retlw	42h		;"A" pos=64;ctm
		retlw	0c2h		;"M" pos=65;ctm
		retlw	42h		;"A" pos=66;ctm
		retlw	0h		;"_" pos=67
		retlw	01h		;"E" pos=68
		retlw	03h		;"S" pos=69
		retlw	0h		;"_" pos=70
		retlw	82h		;"N" pos=71
		retlw	42h		;"A" pos=72
		retlw	0c2h		;"M" pos=73
		retlw	01h		;"E" pos=74
		retlw	0h		;"_" pos=70
		retlw	0b4h		;"Y" pos=71;ctm
		retlw	23h		;"U" pos=72;ctm
		retlw	74h		;"J" pos=73;ctm
		retlw	02h		;"I" pos=74;ctm
		retlw	0h		;"_" pos=75
		retlw	0b4h		;"Y" pos=76;ctm
		retlw	23h		;"U" pos=77;ctm
		retlw	74h		;"J" pos=78;ctm
		retlw	02h		;"I" pos=79;ctm
		retlw	0h		;"_" pos=82
		retlw	04h		;"H" pos=83
		retlw	63h		;"W" pos=84
		retlw	36h		;"?" pos=85
		retlw	0h		;"_" pos=86
		retlw	0b5h		;"KN" pos=87
		retlw	0ffh		;END pos=88  0ffh で最後を判断
		nop
;---------------------------------------------------

beepH		mov	cn,#10
bpH2		bsf	BZ		;Beep 2400Hz
		nop
		nop
		nop
		nop
		nop
		bcf	BZ		
		nop
		nop
		nop
		nop		
		djnz	cn,bpH2
		ret

bspace		mov	cn,#20
bspace0		mov	wait_cn,#1
		call 	wait_us	
		djnz	cn,bspace0
		ret
;  ----------------------------------------------
		
;-------------------------------------------
OPmain		ret


;------------------------------------------------------
start		call	wait_255		;wait_255  255msec待つ

		bsf	status,5	;バンク1
	;	;movlw	01011010b	;誤//RBプルアップ,prescaler=４(f pulse=2msec)　
					;タイマモード，	
		movlw	00010000b	;正//RBプルアップ,prescaler=2(f pulse=2msec) 2003.6.24
					;タイマモード，
		movwf	option	
		movlw	00000000b	;ra.4-ra.0ピンをOUTに !ra,#00000000b	
		movwf	5		;trisA
		movlw	11111111b	;rb.0-rb.7ピンをIN に !rb,#11111111b	
		movwf	6		;trisb
		bcf	status,5	;バンク0
		
		clr	opt
		clrf	portb
		mov	porta,#00001100b
		mov	speed,#50
		call	xkp		;初期 call sign 送出
		call	loadopt		;option文のload
		
; ---------------------------------
Ekey		clr	cn		;if cn=250,sleep



ek0		btfsc	portb,1
		goto	ek1
		call	STAMP		;;TNX_FER_UR_CALL_BT_UR_RST_RST_599_5NN_ES 
					;;HR_QTH_QTH_YOKOHAMA_YOKOHAMA_ES_NAME_YUJI_YUJI_
					;;HW_?_KN

ek1		btfsc	portb,2		;;OPTION_ 送出
		goto	ek2
		call	OPTN

ek2		btfsc	portb,0
		goto	ek3
		call	TEST		;;TEST_ 送出
		call	xkp		;;JK1XKP_ 送出


ek3		btfsc	portb,3		;if portb,3=L ,call  
		goto	ek4
		bsf	opt,0		;if option作成、opt=#0000 0001b 
		call	HR
		mov	fsr,#20h


ek4		btfsc	portb,7
		goto	ek5
		call	CQ		;;CQ_CQ_CQ_DE_ 送出
		call	xkp		;;JK1XKP_ 送出
		call	xkp		;;JK1XKP_ 送出
		call	xkp		;;JK1XKP_ 送出
		call	K		;;_K 送出
		
ek5		btfsc	portb,6
		goto	ek6
		call	DE		;;DE_ 送出
		call	xkp		;;JK1XKP_ 送出

ek6
;--------------------
dot0		clrf	sum		;option 文書込みの設定
		clrf	d8		;option 文書込みの設定

		btfss	portb,5		;if rb.5=L,then dot
		goto	dot

dot01		btfss	portb,4		;if rb.4=L,then dash
		goto	dash
dot02		incf	cn
		call	space1

dot03		movlw	250		;cje,#250,then   Ekend
		subwf	cn,0	
		btfsc	z
		goto	Ekend
		
dot04		btfss	opt,0		;if not option文 save, goto ek0
		goto	ek0
		
		movlw	14		;cje,#14,then   opt[]=space;CW_code=0h
		subwf	cn,0	
		btfss	z
		goto	ek0
		
		mov	d8,#0h
		goto	ek9


Ekend		bcf	porta,0
		bsf	porta,3		;2003.6.24 省電力化のため　VRを+Vddに
		bcf	intcon,0	;RBIF クリア
		bcf	intcon,1	;INTF クリア
		bsf	intcon,3	;Rb割り込み、RBIEをenable
		bsf	intcon,4	;INT割り込み、RBIEをenable

		sleep		;power down mode 省電力
Loop		bcf	intcon,7	;GIE クリア
		btfsc	intcon,7
		goto	Loop
		bcf	intcon,3	;Rb割り込み、RBIEをdisable
		bcf	intcon,4	;INT割り込み、RBIEをdisable
		bcf	porta,3		;2003.6.24

		goto	Ekey				

dot		incf	sum,1		;option 文書込みの設定
		bcf	c		;option 文書込みの設定
		rlf	d8,1		;option 文書込みの設定

		call	mark2

		call	space1
		mov	regrb,portb
		call	space1

		btfss	regrb,4		;履歴if rb.4=L,then dash	
		goto	dash
		btfss	regrb,5		;履歴if rb.5=L,then dot	
		goto	dot

dot_a		btfss	portb,4		;if rb.4=L,then dash	
		goto	dash
		btfss	portb,5		;if rb.5=L,then dot	
		goto	dot
		
dot1		call	space1

		btfss	portb,4		;if rb.4=L,then dash	
		goto	dash
		btfss	portb,5		;if rb.5=L,then dot	
		goto	dot
		
		call	space2
		call	space1

dotend		btfsc	opt,0
		goto 	ek7
		goto	Ekey

dash		incf	sum,1		;option 文書込みの設定
		bsf	c		;option 文書込みの設定
		rlf	d8,1		;option 文書込みの設定

		call	mark4
		call	mark1	
		mov	regrb,portb
		call	mark1
		
		btfss	regrb,5		;if rb.5=L,then goto dash1 (dot) 
		goto	dash1
		
		btfss	portb,5		;if rb.5=L,then goto dash1 (dot) 
		goto	dash1
		btfss	portb,4		;if rb.4=L,then dash 
		goto	dash2
		call	space2
		goto	dot_a

dash1		call	space2
		goto	dot
dash2		call	space2
		goto	dash

;---------------以下 option文の EEPROM への書込み 
ek7		movf	sum,0		;sum=cw_code長・短点構成数
		andlw	00000111b
		movwf	sum		;sum<=7
		sublw	8		;W← 8-sum
		movwf	cs		;cs← 8-sum
ek8		bcf	c
		rlf	d8,1
		djnz	cs,ek8
		
		movf	sum,0		;W← sum
		xorwf	d8,1		;d8 ← CW_code	
		movf	d8,0
		
ek9		sublw	15h		;if d8="VE"?,then goto ek11
		btfsc	z
		goto	ek11
		
		movlw	4fh		;4fh=register 最終番地
		subwf	fsr,0
		btfsc	z
		goto	ek11

ek10		movf	d8,0
		movwf	indirect 	;opbun[0-48]に書込み
		incf	fsr,1
		goto	Ekey	

ek11		movlw	0ffh		;0ffh=END で最後を判断
		movwf	indirect	;opbun[最後]に 0ffhを書込み
		
		movlw	20h
		subwf	fsr,0		;W=fsr(max)-20h
		addlw	1
		movwf	cs		;cs=option文の文字数
		call	save_opt

		bcf	opt,0
		call	dt_5		;save終了ﾉ合図 10点dot
		call	dt_5
		goto	Ekey

;--------------------
space14		call	space6		;if 7*space, then space6+8
space8		call	space2		; space2+6
space6		call	space2		; space2+4
space4		call	space2		; space2+2
space2		call	space1		;if space, then space2
space1		bcf	porta,1
		bcf	porta,0
		mov	wait_cn,speed	
		call	wait_mk		;Time='speed 'msec
		ret
;-------------------
mark6		call	mark2		;if dash, then mark6
mark4		call	mark2		;if dash, then mark4+mark2
mark2		call	mark1		;if dot, then mark2
mark1		bsf	porta,1
		bsf	porta,0
		call	spdch		;speed チェック;R=10kΩ＋C=100pFの時定数check
		mov	wait_cn,speed	
		call	wait_mk
		ret
;-----------------------------
wait_mk		 ;250 * (1+3)=1000μsec
		nop		

wtm1		mov	wait_cn2,#250	;-------- ---------     
					;	| 	|    
wtm2		nop			;1  (1msec)	|
					;	|	|
		djnz	wait_cn2,wtm2	;3------- 	|
					;	("speed" msec)
		djnz	wait_cn,wtm1   	;	   	|
		ret			;	  -----------	
			
;-------------------------------------------
;start     	;			;temp  
 		;goto	CR		;temp
		;---------------
;CR		call	spdch	 	;temp<BR>
		;mov	code,tes7	;temp<BR>
		;call	trans		;temp<BR>
		;mov	code,#0h
		;call	trans
		;goto   	CR	;temp<BR>

;-----------------
spdch			;720usec		
		bcf	intcon,2	;clr TOIF
		bcf	status,5	;バンク0		
		clrf	tmr0		;TMR0をクリア
		bsf	status,5	;バンク1	
		clrwdt		
		movlw	00000100b	;ra2  output→input
		movwf	5
		bcf	status,5	;バンク0	
		
		bcf	porta,3		;R接地		
spd2		btfsc	intcon,2	;2 step;---if overflow, goto spd3			
		goto	spd3		;0	|
					;	| 1Loop=5step	
		btfsc	porta,2		;1step	|	
		goto	spd2		;2step------
		movf	tmr0,0		;W ←TRM0
		goto	spd4			
						
spd3		movlw	150	
		
spd4		movwf	tes7	 ;debug用 
		movwf	speed

		bsf	status,5	;バンク1	
		movlw	00000000b	;ra2  input→output
		movwf	5
		bcf	status,5	;バンク0	

	;	bsf	porta,3		;2003.6.24 削除
		bsf	porta,2

		ret

;--------------------------------------------------
CQ		clr	pos		;CQ_CQ_CQ_DE_ 送出
cq1		movf	pos,0
		call	cq_bun
		movwf	code

		sublw	0ffh
		btfsc	z
		goto	cq3

		call	trans
		incf	pos,1
		goto	cq1

cq3		ret
;-------------------------------
xkp		clr	pos		;JK1XKP_ 送出
xkp1		movf	pos,0
		call	xkp_bun
		movwf	code

		sublw	0ffh
		btfsc	z
		goto	xkp3

		call	trans
		incf	pos,1
		goto	xkp1

xkp3		ret

;--------------------------------------------------
K		clr	pos		;_K 送出
k1		movf	pos,0
		call	k_bun
		movwf	code

		sublw	0ffh
		btfsc	z
		goto	k3

		call	trans
		incf	pos,1
		goto	k1

k3		ret

;--------------------------------------------------
DE		clr	pos		;DE_ 送出
de1		movf	pos,0
		call	de_bun
		movwf	code

		sublw	0ffh
		btfsc	z
		goto	de3

		call	trans
		incf	pos,1
		goto	de1

de3		ret	

;--------------------------------------------------
HR		clr	pos		;HR_HR_BT 送出
hr1		movf	pos,0
		call	HR_bun
		movwf	code

		sublw	0ffh
		btfsc	z
		goto	hr3

		call	trans
		incf	pos,1
		goto	hr1

hr3		ret	
;--------------------------------------------------
TEST		clr	pos		;TEST_ 送出
te1		movf	pos,0
		call	te_bun
		movwf	code

		sublw	0ffh
		btfsc	z
		goto	te3

		call	trans
		incf	pos,1
		goto	te1

te3		ret	
;--------------------------------------------------
STAMP		clr	pos		;ラバースタンプ文_送出
st1		movf	pos,0
		call	stamp_bun
		movwf	code

		sublw	0ffh
		btfsc	z
		goto	st3

		call	trans
		incf	pos,1
		goto	st1
st3		ret

;--------------------------------------------------
OPTN		mov	fsr,#20h		;option文_送出
opt1		movf	indirect,0
		movwf	code

		sublw	0ffh
		btfsc	z
		goto	opt3

	
		call	trans
		incf	fsr,1
		goto	opt1
opt3		ret
;----------------------------------------------------
dt_5		mov  	code,#05h
		call	trans
		ret	
;----------------------------------------------------

trans		movf	code,0
		andlw	00000111b
		movwf	length

		movf	code,0
		andlw	11111000b
		movwf	code

		cse	length,#0
		goto	trans0
		call	spce14		
		ret
trans0		rlf	code
		btfsc	c
		bsf	mk,0
		btfss	c
		bcf	mk,0

		btfsc	mk,0
		call	mrk6
		btfss	mk,0
		call	mrk2
		call    spce2
		djnz	length,trans0
		call	spce6
		ret

;-----------------------------------
;spce14		call	spce6		;if 7*space, then space6+8;  2003.6.24 修正
;spce8		call	spce2		; space2+6		
;spce6		call	spce2		; space2+4
;spce4		call	spce2		; space2+2
;spce2		call	spce1		;if space, then space2

spce14		call	spce1		;2003.6.23 修正
		call	spce1
		call	spce1
		call	spce1
		call	spce1
		call	spce1
		call	spce1
spce8		call	spce1
		call	spce1
spce6		call	spce1
		call	spce1
spce4		call	spce1
		call	spce1
spce2		call	spce1
spce1		bcf	porta,1
		bcf	porta,0
		mov	wait_cn,speed	
		call	wait_mk2	;Time='speed 'msec
		ret
;-------------------
;mrk6		call	mrk2		;if dash, then mark6	;  2003.6.24 修正
;mrk4		call	mrk2		;if dash, then mark4+mark2
;mrk2		call	mrk1		;if dot, then mark2

mrk6		call	mrk1
		call	mrk1
mrk4		call	mrk1
		call	mrk1
mrk2		call	mrk1
mrk1		bsf	porta,1
		bsf	porta,0
		call	spdch		;speed チェック;R=10kΩ＋C=100pFの時定数check
		mov	wait_cn,speed	
		call	wait_mk2
		ret
;-----------------------------
wait_mk2	btfss	opt,0		;option save 時key割りこみなしへの分岐。
		goto	wtm20		;key 割り込みありの１msec ウェイト
		call	wait_mk		;key 割り込みなしの１msec ウェイト
		ret	

wtm20		     	;125 * (2+2+1+3) =1000 μsec
		nop
wtm21		mov	wait_cn2,#125	;-------- ---------     
					;	| 	|    
wtm22		btfss	portb,4		;2	| 	| key 変化?
		ret			;0	| 	|
		btfss	portb,5		;2	| 	| key 変化?
		ret			;0	| 	|
		nop			;1  (1msec)	|
					;	|	|
		djnz	wait_cn2,wtm22	;3------- 	|
					;	("speed" msec)
		djnz	wait_cn,wtm21   	;	   	|
		ret	

;---------------------------------------------------------------------------------
;		ｍｓオーダーのウェイト
;
wait_255	mov	wait_cn,#255
		goto	wait_ms

wait_20		mov	wait_cn,#20

wait_ms  
		
wait_ms0
		mov	wait_cn2,#0
wait_ms1
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		djnz	wait_cn2,wait_ms1
		djnz	wait_cn,wait_ms0
		ret

;
;		μｓオーダーのウェイト
;
wait_us
wait_us0
		djnz	wait_cn,wait_us0
		ret

;----------------
		nop
		nop
		nop
;    ------------------------------------
save_opt	mov	pos,#0h		;EEPROM address 0&h
		mov	fsr,#20h	;opbun[0] resistor指定

savert		mov	eeadr,pos
		mov	eedata,indirect
		call	datawrite
		inc	pos
		inc	fsr
		djnz	cs,savert
		ret

;-----------------------------------------------
loadopt		mov	pos,#0h			;EEPROM address 0&h
		mov	fsr,#20h		;option文 resistor指定
		mov	cs,#48
		
load_rt		mov	eeadr,pos		;EEPROM address 0&h
		bsf	rp0
		bsf	eecon1,0
		bcf	rp0
		mov	indirect,eedata		
		incf	pos,1
		incf	fsr,1
		djnz	cs,load_rt
		ret				;2002.9.21
;   ----------------------------------------		

datawrite	clr	intcon
		bsf	rp0
		bsf	eecon1,2		;WRENﾋﾞｯﾄ on

		movlw	55h
		movwf	eecon2
		movlw	0aah
		movwf	eecon2

		bsf	eecon1,1		;WRﾋﾞｯﾄ書き込み
		bcf	eecon1,4	
		bcf	eecon1,2		;WRENﾋﾞｯﾄ off
		bcf	rp0

		mov	wait_cn,#15		; wait 15ms
		call	wait_ms
		ret

;	---------------	end of Ekey.asm

