;------------------------------------------------------------------------------
; NS73M コントローラ
;------------------------------------------------------------------------------
; バージョン履歴
;
; キー操作
;  +-----+---------------------------+---------------------------+---------------------------+
;  |     | シフトOFF                 | シフトON                  | 1秒長押し                 |
;  +-----+---------------------------+---------------------------+---------------------------+
;  |  1  | ステレオ/モノラル切り替え | チャンネル＋1             | オールリセット (9)        |
;  +-----+---------------------------+---------------------------+---------------------------+
;  |  4  | エンファシス切り替え      | チャンネル−1             | シフトON       (12)       |
;  +-----+---------------------------+---------------------------+---------------------------+
;  |  2  | 音声入力ゲイン切り替え    | 電波強度切り替え          | シフトOFF      (10)       |
;  +-----+---------------------------+---------------------------+---------------------------+
;  オールリセットの値は、Ch.30(87.0MHz),Stereo,Emphasis50us,GainHigh,Power0.5mW
;
;
; Ver.1.3 2013/5/12
;	キー判定部分のプログラムの流れを見やすく変更。
;	チャンネル-1ルーチンでEEPROMへの保存を除外していた。
;	EEPROM保存を除外するキー処理から、アドレス･データセットのコードを削除。
;	シフトキーの操作を切り替えからON/OFF個別操作に切り替えた。
;
; Ver.1.2 2011/3/28
;	ステレオ、エンファシス、ゲイン、出力ワットは設定変更時にEEPROMに保存しないようにした。
;	エンファシス75usとゲイン140mVは用途がないので設定できないように変更。
;
; Ver.1.1 2011/3/20
;	水晶周りの回路を変更
;	プログラムを一部変更
;	CEXをfreq_load内で自動的に設定するように変更
;
; Ver.1.0 2011/2/24
;	完成して稼動していたのに、高周波ワニスを塗ったら発振が不安定になった。廃棄処分。
;
; Ver.0.0 2011/2/16
;	3個目のICを入手して再チャレンジ
;	EEPROMからデータを読んで起動できるようになった。
;	キーモード確認でLEDを点灯させるとハングする
;
; Ver.0.0 2011/2/11
;	また焼ききってしまった
;
; Ver.0.0 2011/2/5 - 2011/2/6
;	新しく基板を再設計する。
;	いくらプログラムを変更しても動作しないと思ったら、回路図のCKとDAが逆だった。気付くまでに7時間かかった。
;
; Ver.0.0 2011/1/29
;	基板完成。
;	ICSPでプログラムを書き込んだらNS73Mが焼ききれた。
;

;------------------------------------------------------------------------------
; デバイス	PIC12F675
; 動作周波数	INTRC 4MHz
;------------------------------------------------------------------------------
	LIST	P=12F675,R=DEC,N=0
	INCLUDE	"P12F675.INC"
	ERRORLEVEL	0,-302,-306,-307
	__CONFIG	0x31C4

;------------------------------------------------------------------------------
; 変数宣言 0x20 - 0x5F
;------------------------------------------------------------------------------
CHANNEL		EQU	0x20		; 周波数のチャンネル(84.0〜90.0,TV1-3の64通り)
CEX		EQU	0x21
STEREO		EQU	0x22
EMPHASIS	EQU	0x23
GAIN		EQU	0x24
POWER		EQU	0x25
R3		EQU	0x26		; 周波数テーブルからの戻り値
R4		EQU	0x27
NS_REG		EQU	0x28		; NS73Mのレジスタ番号
NS_DATA		EQU	0x29		; NS73Mのレジスタデータ

I2CBUF		EQU	0x30		; I2C送受信バッファ1バイト、送信後は破壊される
I2CACK		EQU	0x31		; I2CACKフラグ
EEPADDR		EQU	0x32
EEPDATA		EQU	0x33

KEY		EQU	0x32		; 入力されたキー
BEFKEY		EQU	0x33		; 前回入力されたキー
KEYCOUNT	EQU	0x34		; キー入力時間カウンタ
KEYSHIFT	EQU	0x35		; キーのシフトフラグ

TMP00		EQU	0x58
TMP01		EQU	0x59
TMP02		EQU	0x5A
TMP03		EQU	0x5B
TMP10		EQU	0x5C
TMP11		EQU	0x5D
TMP12		EQU	0x5E
TMP13		EQU	0x5F

;------------------------------------------------------------------------------
; 定数宣言
;------------------------------------------------------------------------------
SDA		EQU	0		; GPIO-1 I2Cデータ
SCL		EQU	1		; GPIO-0 I2Cクロック
LED		EQU	2		; GPIO-2 LED出力
SW1		EQU	3		; GPIO-3 SW1入力
SW3		EQU	4		; GPIO-4 SW3入力
SW2		EQU	5		; GPIO-5 SW2入力
NS_ADDR		EQU	B'11001110'	; LA=1,WRITE

EE_CHANNEL	EQU	0x00
EE_STEREO	EQU	0x01
EE_EMPHASIS	EQU	0x02
EE_GAIN		EQU	0x03
EE_POWER	EQU	0x04

DEF_CHANNEL	EQU	30		; 87.0MHz
DEF_STEREO	EQU	1		; 0:Mono 1:Stereo
DEF_EMPHASIS	EQU	0		; 0:On,50us 1:OFF 2:On,75us
DEF_GAIN	EQU	0		; 0:100mV[高感度] 1:140mV 2:200mV[低感度]
DEF_POWER	EQU	1		; 1:0.5mW 2:1.0mW 3:2.0mW

;------------------------------------------------------------------------------
; EEPROMの初期値
;------------------------------------------------------------------------------
	ORG	0x2100	
	DE	DEF_CHANNEL		; チャンネル
	DE	DEF_STEREO		; ステレオ
	DE	DEF_EMPHASIS		; エンファシス
	DE	DEF_GAIN		; ゲイン
	DE	DEF_POWER		; 出力
	
;------------------------------------------------------------------------------
; プログラム開始
;------------------------------------------------------------------------------
		ORG	0
	GOTO	POWER_ON		; 割り込みベクタをスキップ

;------------------------------------------------------------------------------
; 割り込み分岐
;------------------------------------------------------------------------------
		ORG	4		; 割り込み
	RETFIE

;------------------------------------------------------------------------------
; 電源投入時の初期化
;------------------------------------------------------------------------------
POWER_ON				; 電源ON
	BCF	STATUS,RP0		; GPIO初期化
	MOVLW	B'00000000'		; LED点灯
	MOVWF	GPIO
	MOVLW	B'00000111'		; コンパレータをOFFにする
	MOVWF	CMCON

	BSF	STATUS,RP0
	CALL	0x03FF			; OSCCAL校正
	MOVWF	OSCCAL
	CLRF	ANSEL			; A/D入力OFF
	MOVLW	B'01111111'		; GPIOプルアップ
	MOVWF	OPTION_REG
	MOVLW	B'00111011'		; LEDのポートだけ出力にしておく
	MOVWF	TRISIO			; I2CをHレベルにする時はTRISIOで変更する
	MOVLW	B'00110000'		; スイッチ入力の2ポートのみプルアップを行う
	MOVWF	WPU
	MOVLW	B'00111000'		; ポート変化割り込みを使う
	MOVWF	IOC

INITIALIZE				; 電源投入後のウエイトは、PICのパワーアップタイマを使用する
	MOVLW	EE_CHANNEL		; EEPROMから設定値を読む
	MOVWF	EEADR			; チャンネル設定
	BSF	EECON1,RD
	MOVF	EEDATA,W
	MOVWF	CHANNEL

	MOVLW	EE_STEREO		; ステレオ設定
	MOVWF	EEADR
	BSF	EECON1,RD
	MOVF	EEDATA,W
	MOVWF	STEREO

	MOVLW	EE_EMPHASIS		; エンファシス設定
	MOVWF	EEADR
	BSF	EECON1,RD
	MOVF	EEDATA,W
	MOVWF	EMPHASIS

	MOVLW	EE_GAIN			; ゲイン設定
	MOVWF	EEADR
	BSF	EECON1,RD
	MOVF	EEDATA,W
	MOVWF	GAIN

	MOVLW	EE_POWER		; 出力設定
	MOVWF	EEADR
	BSF	EECON1,RD
	MOVF	EEDATA,W
	MOVWF	POWER

	CALL	serial_init		; シリアル初期化
					; 以下レジスタ初期設定
	MOVLW	14			; R14 ソフトウエアリセット
	MOVWF	NS_REG
	MOVLW	0x05
	MOVWF	NS_DATA
	CALL	send_command

	CALL	send_stereo		; R1 Stereo
	CALL	send_power		; R2 Power
	CALL	freq_load		; R3,R4 Freq R8 CEX

	MOVLW	6			; R6 チャージポンプ
	MOVWF	NS_REG
	MOVLW	B'00011010'		; 固定値
	MOVWF	NS_DATA
	CALL	send_command
	CLRF	NS_DATA
	MOVLW	5			; R5 未使用=0x00
	MOVWF	NS_REG
	CALL	send_command
	MOVLW	7			; R7 未使用=0x00
	MOVWF	NS_REG
	CALL	send_command
	MOVLW	9			; R9 未使用=0x00
	MOVWF	NS_REG
	CALL	send_command
	MOVLW	10			; R10 未使用=0x00
	MOVWF	NS_REG
	CALL	send_command
	MOVLW	11			; R11 未使用=0x00
	MOVWF	NS_REG
	CALL	send_command

	CALL	send_R0			; R0 RFOut,Emphasis,Gain
					; 初期化終了

	CLRF	KEYSHIFT		; シフト状態クリア
;------------------------------------------------------------------------------
; キーループ
;------------------------------------------------------------------------------
KEYLOOP
	MOVLW	B'00001000'		; GPIEをON,GPIFクリア
	MOVWF	INTCON
	SLEEP				; キー待ちスリープ、ただし0x04へ飛ばさない
	MOVLW	B'00000000'		; GPIEをOFF,GPIFクリア
	MOVWF	INTCON

	CALL	getkey			; キーを入力
	MOVF	KEY,W
	BTFSC	STATUS,Z		; KEY=0ならば誤入力と判断し、キー待ちに戻る
	GOTO	KEYLOOP

KEY1					; --- キー1 ---
	MOVLW	1
	SUBWF	KEY,W
	BTFSS	STATUS,Z
	GOTO	KEY2
	BTFSS	KEYSHIFT,0		; キーシフト判定
	GOTO	CHG_STEREO		;  通常はステレオ
	GOTO	INC_CHANNEL		;  シフト時はチャンネル+

KEY4					; --- キー4 ---
	MOVLW	4
	SUBWF	KEY,W
	BTFSS	STATUS,Z
	GOTO	KEY9
	BTFSS	KEYSHIFT,0		; キーシフト判定
	GOTO	CHG_EMPHASIS		;  通常はエンファシス
	GOTO	DEC_CHANNEL		;  シフト時はチャンネル-

KEY2					; --- キー2 ---
	MOVLW	2
	SUBWF	KEY,W
	BTFSS	STATUS,Z
	GOTO	KEY4
	BTFSS	KEYSHIFT,0		; キーシフト判定
	GOTO	CHG_GAIN		;  通常はゲイン
	GOTO	CHG_POWER		;  シフト時は出力パワー

KEY9					; --- キー1長押し ---
	MOVLW	9
	SUBWF	KEY,W
	BTFSC	STATUS,Z
	GOTO	ALL_RESET		; 設定リセット

KEY12					; --- キー4長押し ---
	MOVLW	12
	SUBWF	KEY,W
	BTFSC	STATUS,Z
	GOTO	SHIFT_ON		; シフト状態ON

KEY10					; --- キー2長押し ---
	MOVLW	10
	SUBWF	KEY,W
	BTFSC	STATUS,Z
	GOTO	SHIFT_OFF		; シフト状態OFF

KEYLOOPEND				; キーループ終了処理
	CALL	getkey			; キーを入力
	MOVF	KEY,W
	BTFSS	STATUS,Z
	GOTO	KEYLOOPEND		; KEY=0になるまでループ
	GOTO	KEYLOOP

;------------------------------------------------------------------------------
CHG_STEREO				; ステレオ変更
	BTFSC	STEREO,0		; STEREOのbit0でON/OFFを切り替える
	GOTO	TO_MONO
TO_STEREO				; 0:MONO->1:STEREO
	MOVLW	1
	GOTO	CHG_STEREO_EXEC
TO_MONO					; 1:STEREO->0:MONO
	MOVLW	0
CHG_STEREO_EXEC
	MOVWF	STEREO
	CALL	send_stereo
	GOTO	KEYLOOPEND		; 保存せずに戻る
;------------------------------------------------------------------------------
CHG_EMPHASIS				; エンファシス変更
	BTFSC	EMPHASIS,0		; EMPHASISのbit0で50us/OFFを切り替える
	GOTO	TO_50us
TO_OFF					; 0:50us->1:OFF
	MOVLW	1
	GOTO	CHG_EMPHASIS_EXEC
TO_50us					; 1:OFF->0:50us
	MOVLW	0
CHG_EMPHASIS_EXEC
	MOVWF	EMPHASIS
	CALL	send_emphasis
	GOTO	KEYLOOPEND		; 保存せずに戻る
;------------------------------------------------------------------------------
CHG_GAIN				; ゲイン変更
	BTFSC	GAIN,1			; GAINのbit1でON/OFFを切り替える
	GOTO	TO_HIGHGAIN
TO_LOWGAIN				; 0:HIGH->2:LOW
	MOVLW	2
	GOTO	CHG_GAIN_EXEC
TO_HIGHGAIN				; 2:LOW->0:HIGH
	MOVLW	0
CHG_GAIN_EXEC
	MOVWF	GAIN
	CALL	send_gain
	GOTO	KEYLOOPEND		; 保存せずに戻る
;------------------------------------------------------------------------------
INC_CHANNEL				; チャンネル+1
	INCF	CHANNEL,F		; チャンネル+1
	MOVLW	63			; 64でロールオーバーして0に戻す
	ANDWF	CHANNEL,F
INC_CHANNEL_EXEC
	MOVF	CHANNEL,W
	MOVWF	EEPDATA
	MOVLW	EE_CHANNEL
	MOVWF	EEPADDR
	CALL	eepwrite
	CALL	freq_load
	GOTO	KEYLOOPEND
;------------------------------------------------------------------------------
DEC_CHANNEL				; チャンネル-1
	DECF	CHANNEL,F		; チャンネル-1
	MOVLW	63			; 255でマスクして63に戻す
	ANDWF	CHANNEL,F
DEC_CHANNEL_EXEC
	MOVF	CHANNEL,W
	MOVWF	EEPDATA
	MOVLW	EE_CHANNEL
	MOVWF	EEPADDR
	CALL	eepwrite
	CALL	freq_load
	GOTO	KEYLOOPEND
;------------------------------------------------------------------------------
CHG_POWER				; 出力ワット変更
	INCF	POWER,W
	ANDLW	3			; 1->2->3->1になるよう4を0にしてZフラグ判定で1を代入
	BTFSC	STATUS,Z
	MOVLW	1
CHG_POWER_EXEC
	MOVWF	POWER
	CALL	send_power
	GOTO	KEYLOOPEND		; 保存せずに戻る
;------------------------------------------------------------------------------
SHIFT_ON				; シフト状態ON
	BSF	KEYSHIFT,0
	GOTO	KEYLOOPEND
;------------------------------------------------------------------------------
SHIFT_OFF				; シフト状態OFF
	BCF	KEYSHIFT,0
	GOTO	KEYLOOPEND
;------------------------------------------------------------------------------
ALL_RESET				; オールリセット
	CLRF	KEYSHIFT		; キーシフト解除
					; 以下、初期データロード
	MOVLW	DEF_CHANNEL		; チャンネル
	MOVWF	CHANNEL
	MOVWF	EEPDATA
	MOVLW	EE_CHANNEL
	MOVWF	EEPADDR
	CALL	eepwrite

	MOVLW	DEF_STEREO		; ステレオ
	MOVWF	STEREO

	MOVLW	DEF_EMPHASIS		; エンファシス
	MOVWF	EMPHASIS

	MOVLW	DEF_GAIN		; ゲイン
	MOVWF	GAIN

	MOVLW	DEF_POWER		; 出力
	MOVWF	POWER

	CALL	send_stereo		; R1 Stereo
	CALL	send_power		; R2 Power
	CALL	freq_load		; R3,R4 Freq R8 CEX
	CALL	send_R0			; R0 RFOut,Emphasis,Gain
	GOTO	KEYLOOPEND
;------------------------------------------------------------------------------
; NS73M初期化パルス送信ルーチン
;------------------------------------------------------------------------------
serial_init				; NS73Mのシリアルインターフェースを初期化
	MOVLW	26			; I/Fリセット
	MOVWF	TMP00
	CALL	send_start
	BSF	TRISIO,SDA
SERIAL_INIT1
	CALL	send_clock
	DECFSZ	TMP00,F
	GOTO	SERIAL_INIT1
	CALL	send_start
	GOTO	$+1
	CALL	send_stop
	RETURN

;------------------------------------------------------------------------------
; レジスタ設定ルーチン
;------------------------------------------------------------------------------
send_R0
send_gain
send_emphasis
	MOVF	EMPHASIS,W		; 4ビット左へ
	MOVWF	NS_DATA
	RLF	NS_DATA,F
	RLF	NS_DATA,F
	RLF	NS_DATA,F
	RLF	NS_DATA,W
	ANDLW	B'00110000'
	MOVWF	NS_DATA

	MOVF	GAIN,W
	MOVWF	TMP00			; 3ビット右へ
	RRF	TMP00,F
	RRF	TMP00,F
	RRF	TMP00,W
	ANDLW	B'11000000'
	IORWF	NS_DATA,F

	MOVLW	0			; R0
	MOVWF	NS_REG			; RF出力、プリエンファシス、ゲイン
	MOVLW	B'00000001'
	IORWF	NS_DATA,F
	CALL	send_command
	RETURN

send_stereo
	MOVF	STEREO,F		; STEREOが0(=モノラル)か?
	BTFSS	STATUS,Z
	GOTO	SEND_R1_STEREO
SEND_R1_MONO
	MOVLW	B'11111100'		; モノラル
	GOTO	SEND_R1_RET
SEND_R1_STEREO
	MOVLW	B'10110100'		; ステレオ
SEND_R1_RET
	MOVWF	NS_DATA
	MOVLW	1			; R1
	MOVWF	NS_REG			; ステレオ選択
	CALL	send_command
	RETURN

send_power
	MOVLW	2			; R2
	MOVWF	NS_REG			; 送信レベル
	MOVF	POWER,W
	MOVWF	NS_DATA
	CALL	send_command
	RETURN

send_cex
	MOVLW	8			; R8
	MOVWF	NS_REG			; CEX
	MOVF	CEX,W
	IORLW	B'00011000'
	MOVWF	NS_DATA
	CALL	send_command
	RETURN

;------------------------------------------------------------------------------
; キー入力ルーチン
;------------------------------------------------------------------------------
getkey					; キーを入力し、キーコードをKEYに生成する
	BCF	STATUS,RP0
	CLRF	KEY
GETKEYLOOP
	MOVF	KEY,W			; 前回のキーを初期化
	MOVWF	BEFKEY
	MOVLW	20			; 20回ループ(=1秒)で長時間入力状態にする
	MOVWF	KEYCOUNT
GETKEYLOOP1
	COMF	GPIO,W			; キー入力
	MOVWF	KEY
	MOVLW	5			; 50msウエイト
	CALL	wait
	COMF	GPIO,W			; チャタリングのためもう一度入力
	ANDWF	KEY,W
	ANDLW	B'00111000'
	MOVWF	KEY

	BTFSC	STATUS,Z		; 今回のキー番号はゼロか？
	GOTO	GETKEYRET		; リターン処理
GETKEYLOOP2
	MOVF	BEFKEY,W		; 今回のキーは前回と同じか？
	XORWF	KEY,W			; 前回と同じならばZフラグが立つ
	BTFSS	STATUS,Z
	GOTO	GETKEYLOOP		; 違うならばキーを保存してはじめからやり直し
GETKEYLOOP3
	DECFSZ	KEYCOUNT,F		; 同じ時はカウント-1
	GOTO	GETKEYLOOP1		; カウントオーバーしていない時は再びキー入力
	MOVLW	B'01000000'		; オーバーしている時はキー番号の上にフラグを立てる
	IORWF	BEFKEY,F
GETKEYRET
	RRF	BEFKEY,F
	RRF	BEFKEY,F
	RRF	BEFKEY,W
	ANDLW	B'00001111'
	MOVWF	KEY
	RETURN

;------------------------------------------------------------------------------
; I2Cルーチン
;------------------------------------------------------------------------------
send_start				; スタートコンディション送信
	BSF	STATUS,RP0
	MOVLW	B'00111011'		; SCL=H SDA=H
	MOVWF	TRISIO
	MOVLW	B'00111010'		; tSU:STA
	MOVWF	TRISIO			; SCL=H SDA=L
	MOVLW	B'00111000'		; tHD:STA
	MOVWF	TRISIO			; SCL=L SDA=L
	RETURN				; RP0は1のまま戻る

send_clock				; クロック送信
	BSF	STATUS,RP0
	BSF	TRISIO,SCL		; SCL=H
	NOP
	BCF	TRISIO,SCL		; SCL=L
	RETURN				; RP0は1のまま戻る

send_stop				; ストップコンディション送信
	BSF	STATUS,RP0
	MOVLW	B'00111000'		; SCL=L SDA=L
	MOVWF	TRISIO			; tSU:STO
	MOVLW	B'00111010'		; SCL=H SDA=L
	MOVWF	TRISIO			; tSU:STO
	MOVLW	B'00111011'		; SCL=H SDA=H
	MOVWF	TRISIO
	BCF	STATUS,RP0		; tBUF
	RETURN				; RP0を戻して戻る

send_data				; データを8ビット分送信しACKを受信する
	BSF	STATUS,RP0
	MOVLW	8
	MOVWF	TMP00
SEND_DATA1
	RLF	I2CBUF,F		; 左シフトでCフラグへ送る
	BTFSC	STATUS,C
	GOTO	SEND_DATA_H
SEND_DATA_L				; 0の時SDA=L
	BCF	TRISIO,SDA
	GOTO	SEND_DATA_CLK
SEND_DATA_H				; 1の時SDA=H
	BSF	TRISIO,SDA
SEND_DATA_CLK
	CALL	send_clock
	DECFSZ	TMP00,F
	GOTO	SEND_DATA1
SEND_DATA_ACK				; ACK受信
	BSF	TRISIO,SDA		; SDAを開放(=H)
	BSF	TRISIO,SCL		; SCL=H アクノリッジビット
	BCF	STATUS,RP0
	BTFSC	GPIO,SDA
	GOTO	SEND_DATA_ACK_H
SEND_DATA_ACK_L
	CLRF	I2CACK			; フラグ=0
	GOTO	SEND_DATA_ACK1
SEND_DATA_ACK_H
	BSF	I2CACK,0		; フラグ=1
SEND_DATA_ACK1
	BSF	STATUS,RP0
	BCF	TRISIO,SCL		; SCL=L アクノリッジビット
	RETURN				; RP0は戻さない

send_command				; NS73M用の3オクテットを送信する
	CALL	send_start
SEND_COMMAND1
	MOVLW	NS_ADDR
	MOVWF	I2CBUF
	CALL	send_data
	BTFSC	I2CACK,0
	GOTO	SEND_COMMAND1		; NACKならもう一度実行
SEND_COMMAND2
	MOVF	NS_REG,W
	MOVWF	I2CBUF
	CALL	send_data
	BTFSC	I2CACK,0
	GOTO	SEND_COMMAND2		; NACKならもう一度実行
SEND_COMMAND3
	MOVF	NS_DATA,W
	MOVWF	I2CBUF
	CALL	send_data
	BTFSC	I2CACK,0
	GOTO	SEND_COMMAND3		; NACKならもう一度実行
	CALL	send_stop
	RETURN
	
;------------------------------------------------------------------------------
; 内蔵EEPROMアクセスルーチン群
;------------------------------------------------------------------------------
eepwrite
	BSF	STATUS,RP0
	MOVF	EEPADDR,W		; 書き込みアドレスのロード
	MOVWF	EEADR
	MOVF	EEPDATA,W		; 書き込みデータのロード
	MOVWF	EEDATA
	BSF	EECON1,WREN
	MOVLW	0x55			; 書き込みパターン
	MOVWF	EECON2
	MOVLW	0xAA
	MOVWF	EECON2
	BSF	EECON1,WR		; 書き込み
EEPWRITEPOLL
	BTFSC	EECON1,WR		; 書き込みが終わるまでループ
	GOTO	EEPWRITEPOLL
	BCF	EECON1,WREN		; 書き込み保護
	RETURN

;------------------------------------------------------------------------------
; W * 10ミリ秒ウエイト
;------------------------------------------------------------------------------
wait
	MOVWF	TMP00
WAIT1
	MOVLW	13
	MOVWF	TMP01
WAIT2
	MOVLW	255
	MOVWF	TMP02
WAIT3
	DECFSZ	TMP02,F
	GOTO	WAIT3
	DECFSZ	TMP01,F
	GOTO	WAIT2
	DECFSZ	TMP00,F
	GOTO	WAIT1
	RETURN

;------------------------------------------------------------------------------
; 周波数テーブル CHANNELの中身をロードし、転送する
;------------------------------------------------------------------------------
freq_load
	MOVF	CHANNEL,W
	ADDLW	1
	MOVWF	TMP00
	MOVLW	LOW R3_TABLE
	ADDWF	TMP00,F
	MOVLW	HIGH R3_TABLE
	BTFSC	STATUS,C
	ADDLW	1
	MOVWF	PCLATH
	MOVF	TMP00,W
	CALL	R3_TABLE
	MOVWF	R3

	MOVF	CHANNEL,W
	ADDLW	1
	MOVWF	TMP00
	MOVLW	LOW R4_TABLE
	ADDWF	TMP00,F
	MOVLW	HIGH R4_TABLE
	BTFSC	STATUS,C
	ADDLW	1
	MOVWF	PCLATH
	MOVF	TMP00,W
	CALL	R4_TABLE
	MOVWF	R4
	CLRF	PCLATH

	MOVLW	3			; R3
	MOVWF	NS_REG			; 下位周波数
	MOVF	R3,W
	MOVWF	NS_DATA
	CALL	send_command

	MOVLW	4			; R4
	MOVWF	NS_REG			; 上位周波数
	MOVF	R4,W
	MOVWF	NS_DATA
	CALL	send_command

CEX_FM					; CEX判定
	MOVLW	3			; 通常はCEX=3
	MOVWF	CEX
	MOVLW	61			; Ch.0〜Ch.60の時はそのまま送信
	SUBWF	CHANNEL,W
	BTFSS	STATUS,C
	GOTO	CEX_EXEC
CEX_TV
	MOVLW	60			; Ch.61 CEX=2
	SUBWF	CHANNEL,W		; Ch.62 CEX=1
	SUBWF	CEX,F			; Ch.63 CEX=0 になるように計算で導く
CEX_EXEC
	CALL	send_cex
	RETURN

R3_TABLE
	MOVWF	PCL
	RETLW	LOW 0x2833	; Ch.00 84.0
	RETLW	LOW 0x283F	; Ch.01 84.1
	RETLW	LOW 0x284B	; Ch.02 84.2
	RETLW	LOW 0x2858	; Ch.03 84.3
	RETLW	LOW 0x2864	; Ch.04 84.4
	RETLW	LOW 0x2870	; Ch.05 84.5
	RETLW	LOW 0x287C	; Ch.06 84.6
	RETLW	LOW 0x2888	; Ch.07 84.7
	RETLW	LOW 0x2895	; Ch.08 84.8
	RETLW	LOW 0x28A1	; Ch.09 84.9
	RETLW	LOW 0x28AD	; Ch.10 85.0
	RETLW	LOW 0x28B9	; Ch.11 85.1
	RETLW	LOW 0x28C6	; Ch.12 85.2
	RETLW	LOW 0x28D2	; Ch.13 85.3
	RETLW	LOW 0x28DE	; Ch.14 85.4
	RETLW	LOW 0x28EA	; Ch.15 85.5
	RETLW	LOW 0x28F6	; Ch.16 85.6
	RETLW	LOW 0x2903	; Ch.17 85.7
	RETLW	LOW 0x290F	; Ch.18 85.8
	RETLW	LOW 0x291B	; Ch.19 85.9
	RETLW	LOW 0x2927	; Ch.20 86.0
	RETLW	LOW 0x2933	; Ch.21 86.1
	RETLW	LOW 0x2940	; Ch.22 86.2
	RETLW	LOW 0x294C	; Ch.23 86.3
	RETLW	LOW 0x2958	; Ch.24 86.4
	RETLW	LOW 0x2964	; Ch.25 86.5
	RETLW	LOW 0x2970	; Ch.26 86.6
	RETLW	LOW 0x297D	; Ch.27 86.7
	RETLW	LOW 0x2989	; Ch.28 86.8
	RETLW	LOW 0x2995	; Ch.29 86.9
	RETLW	LOW 0x29A1	; Ch.30 87.0
	RETLW	LOW 0x29AD	; Ch.31 87.1
	RETLW	LOW 0x29BA	; Ch.32 87.2
	RETLW	LOW 0x29C6	; Ch.33 87.3
	RETLW	LOW 0x29D2	; Ch.34 87.4
	RETLW	LOW 0x29DE	; Ch.35 87.5 Manual's Lower Limit
	RETLW	LOW 0x29EA	; Ch.36 87.6
	RETLW	LOW 0x29F7	; Ch.37 87.7
	RETLW	LOW 0x2A03	; Ch.38 87.8
	RETLW	LOW 0x2A0F	; Ch.39 87.9
	RETLW	LOW 0x2A1B	; Ch.40 88.0
	RETLW	LOW 0x2A28	; Ch.41 88.1
	RETLW	LOW 0x2A34	; Ch.42 88.2
	RETLW	LOW 0x2A40	; Ch.43 88.3
	RETLW	LOW 0x2A4C	; Ch.44 88.4
	RETLW	LOW 0x2A58	; Ch.45 88.5
	RETLW	LOW 0x2A65	; Ch.46 88.6
	RETLW	LOW 0x2A71	; Ch.47 88.7
	RETLW	LOW 0x2A7D	; Ch.48 88.8
	RETLW	LOW 0x2A89	; Ch.49 88.9
	RETLW	LOW 0x2A95	; Ch.50 89.0
	RETLW	LOW 0x2AA2	; Ch.51 89.1
	RETLW	LOW 0x2AAE	; Ch.52 89.2
	RETLW	LOW 0x2ABA	; Ch.53 89.3
	RETLW	LOW 0x2AC6	; Ch.54 89.4
	RETLW	LOW 0x2AD2	; Ch.55 89.5
	RETLW	LOW 0x2ADF	; Ch.56 89.6
	RETLW	LOW 0x2AEB	; Ch.57 89.7
	RETLW	LOW 0x2AF7	; Ch.58 89.8
	RETLW	LOW 0x2B03	; Ch.59 89.9
	RETLW	LOW 0x2B0F	; Ch.60 90.0
	RETLW	LOW 0x2DCD	; Ch.61 95.75  TV-1
	RETLW	LOW 0x30AA	; Ch.62 101.75 TV-2
	RETLW	LOW 0x3386	; Ch.63 107.75 TV-3

R4_TABLE
	MOVWF	PCL
	RETLW	HIGH 0x2833	; Ch.00 84.0
	RETLW	HIGH 0x283F	; Ch.01 84.1
	RETLW	HIGH 0x284B	; Ch.02 84.2
	RETLW	HIGH 0x2858	; Ch.03 84.3
	RETLW	HIGH 0x2864	; Ch.04 84.4
	RETLW	HIGH 0x2870	; Ch.05 84.5
	RETLW	HIGH 0x287C	; Ch.06 84.6
	RETLW	HIGH 0x2888	; Ch.07 84.7
	RETLW	HIGH 0x2895	; Ch.08 84.8
	RETLW	HIGH 0x28A1	; Ch.09 84.9
	RETLW	HIGH 0x28AD	; Ch.10 85.0
	RETLW	HIGH 0x28B9	; Ch.11 85.1
	RETLW	HIGH 0x28C6	; Ch.12 85.2
	RETLW	HIGH 0x28D2	; Ch.13 85.3
	RETLW	HIGH 0x28DE	; Ch.14 85.4
	RETLW	HIGH 0x28EA	; Ch.15 85.5
	RETLW	HIGH 0x28F6	; Ch.16 85.6
	RETLW	HIGH 0x2903	; Ch.17 85.7
	RETLW	HIGH 0x290F	; Ch.18 85.8
	RETLW	HIGH 0x291B	; Ch.19 85.9
	RETLW	HIGH 0x2927	; Ch.20 86.0
	RETLW	HIGH 0x2933	; Ch.21 86.1
	RETLW	HIGH 0x2940	; Ch.22 86.2
	RETLW	HIGH 0x294C	; Ch.23 86.3
	RETLW	HIGH 0x2958	; Ch.24 86.4
	RETLW	HIGH 0x2964	; Ch.25 86.5
	RETLW	HIGH 0x2970	; Ch.26 86.6
	RETLW	HIGH 0x297D	; Ch.27 86.7
	RETLW	HIGH 0x2989	; Ch.28 86.8
	RETLW	HIGH 0x2995	; Ch.29 86.9
	RETLW	HIGH 0x29A1	; Ch.30 87.0
	RETLW	HIGH 0x29AD	; Ch.31 87.1
	RETLW	HIGH 0x29BA	; Ch.32 87.2
	RETLW	HIGH 0x29C6	; Ch.33 87.3
	RETLW	HIGH 0x29D2	; Ch.34 87.4
	RETLW	HIGH 0x29DE	; Ch.35 87.5 Manual's Lower Limit
	RETLW	HIGH 0x29EA	; Ch.36 87.6
	RETLW	HIGH 0x29F7	; Ch.37 87.7
	RETLW	HIGH 0x2A03	; Ch.38 87.8
	RETLW	HIGH 0x2A0F	; Ch.39 87.9
	RETLW	HIGH 0x2A1B	; Ch.40 88.0
	RETLW	HIGH 0x2A28	; Ch.41 88.1
	RETLW	HIGH 0x2A34	; Ch.42 88.2
	RETLW	HIGH 0x2A40	; Ch.43 88.3
	RETLW	HIGH 0x2A4C	; Ch.44 88.4
	RETLW	HIGH 0x2A58	; Ch.45 88.5
	RETLW	HIGH 0x2A65	; Ch.46 88.6
	RETLW	HIGH 0x2A71	; Ch.47 88.7
	RETLW	HIGH 0x2A7D	; Ch.48 88.8
	RETLW	HIGH 0x2A89	; Ch.49 88.9
	RETLW	HIGH 0x2A95	; Ch.50 89.0
	RETLW	HIGH 0x2AA2	; Ch.51 89.1
	RETLW	HIGH 0x2AAE	; Ch.52 89.2
	RETLW	HIGH 0x2ABA	; Ch.53 89.3
	RETLW	HIGH 0x2AC6	; Ch.54 89.4
	RETLW	HIGH 0x2AD2	; Ch.55 89.5
	RETLW	HIGH 0x2ADF	; Ch.56 89.6
	RETLW	HIGH 0x2AEB	; Ch.57 89.7
	RETLW	HIGH 0x2AF7	; Ch.58 89.8
	RETLW	HIGH 0x2B03	; Ch.59 89.9
	RETLW	HIGH 0x2B0F	; Ch.60 90.0
	RETLW	HIGH 0x2DCD	; Ch.61 95.75  TV-1
	RETLW	HIGH 0x30AA	; Ch.62 101.75 TV-2
	RETLW	HIGH 0x3386	; Ch.63 107.75 TV-3

	ORG	0x03FF
	RETLW	0xA0		; 何かの拍子でOSCCALのデータが消えた時用

	END
