;オートバイ速度表示		bitメカ工房			2017-07-15(土)
;
;メーターVer2を流用修正使用する｡(PICは88→819に変更)
;メッツラー/カルー3装着　タイヤ半径330mm(リフトスタンドで実測)として｡
;
;実走行すると今一つ安定性がよくない気がして定電圧リセットを確認すると､本プロ
;グラムだけOFFになっていた｡ONに変更する｡
;
;距離100m補正メモリー時にスピードカウント係数も補正メモリーする｡
;方法は近接センサー100mカウント値からテーブルを参照する｡
;
;100m補正時の近接センサー100mカウント値はスピードメーターにT秒間表示する｡
;
;[プログラム概要]
; ･オートバイ用の走行速度を表示するプログラム｡
; ･7セグメントLEDにロジック化PICで表示する｡(16F630使用)
; ･100km/h以上の3桁目【1】は､RA3とRA4を使用して表示する｡
;
; 1桁目…RB7,RB6,RB5,RB4の4ビット送信｡
; 2桁目…RB3,RB2,RB1,RB0の4ビット送信｡
;
; ･オシレーターは1.0000MHzの水晶発信器を使用する｡
;   (1命令=0.000004秒(1/1000000*4))
;
; ･ディスクブレーキのアームが9本あるが､それを近接センサーで感知し､ONとONの
;  間隔時間から車速を算出表示する｡(時間が短ければ車速は早い｡)
;　実際のソフトとしては､正確な水晶で一定間隔のパルスを加算してゆき､ON～ON感の
;　パルス数を数える｡そのカウント数から計算でスピードを算出する｡
;
;  アームとアームの1区間で 0.000016秒(1/1000000x4x4)に1回のパルスを何回
;　カウントするか？
;　たとえばタイヤ半径330mmとして時速1kmの場合は､51836
;　
;　  1kmの場合…51836カウント
;　180kmの場合…  288カウント
;
;  ※51836÷実際のカウント数= XXX km/h となる｡ (16bit割り算が必要)
;
; ･具体的にはタイマー1をプリスケール4で利用する｡
;　　タイマー1をON､OFFして値を読む｡次の計測時はリセット後ONする｡
;
; ･停車(0km/h)の判定が必要である｡
;　　カウント数がオーバーフローすると正しく表示されなくなる｡
;　　タイマー1がオーバーフロー(10進だと65535)した時でどうか｡
;
;(その他)
; ･電源ON時は､約【 2 】秒間の全点灯チェックモードとする｡
;
; ･再表示間隔が短いと1桁目がパカパカ見づらいことが多かった｡
;　約0.5秒毎くらいの更新がよいようだ｡
;
;(タイマー)
; ･タイマー0を使用する｡(再表示の待ち時間用)
; 　プリスケーラを【 256 】にした場合のオーバーフロータイム
;　　1/1000000x4x256x256=0.262144秒
;　　2回繰り返しで約0.52秒
;
; ･タイマー1を使用する｡(電源ON時のﾗﾝﾌﾟﾁｪｯｸ用と速度計測カウンター用)
; 　プリスケーラを【 4 】にした場合のオーバーフロータイム
;　　1/1000000x4x256x256x4=1.048576秒 (最後の4はプリスケーラ値)
;
; ･割り込みは､タイマー1のオーバーフローのみ使用する｡(停車判定用)
;
; ･ウォッチドックタイマーは使用しない｡
;
;
;[PIC選定その他仕様]
;			     ┌─┰─┐
;	(未使用)	 RA2 ┥	     ┝ RA1	警告LED 赤
;	3桁目1のLED	 RA3 ┥	     ┝ RA0	警告LED 黄
;	3桁目1のLED	 RA4 ┥	     ┝ RA7	水晶
;	近接ｾﾝｻｰ	 RA5 ┥PIC   ┝ RA6	SET0
;	GND		 Vss ┥16F819┝ Vdd	5.0V
;	LED_2桁目	 RB0 ┥	     ┝ RB7	LED_1桁目
;	LED_2桁目	 RB1 ┥	     ┝ RB6	LED_1桁目
;	LED_2桁目	 RB2 ┥	     ┝ RB5	LED_1桁目
;	LED_2桁目	 RB3 ┥	     ┝ RB4	LED_1桁目
;			     └───┘
;
;[プログラムの基本流れ概要]
;	電源ON
;	↓
;　100m設定実走記録ボタンONか？→YES 設定モードへジャンプ
;	↓
;	約2秒間 LED点灯(ﾗﾝﾌﾟﾁｪｯｸ)
;	↓
;	0km/h表示
;	↓
;	アーム位置チェック		←
;	↓				　↑
;	変化無ければ変化あるまで待つ　	→┘
;	↓
;	タイマー1スタート
;	↓
;	計測･計算(0km/h判定も行う)
;	↓				　↑
;	警告LED判定
;	↓
;	7セグメントLEDへデーター送信
;	↓
;	約0.5秒待つ			→┘
;
;
;[凡例] (自分で分かりやすいように目印を付ける)
; mXXX:メモリー  rXXX:ラベル  sXXX:サブルーチン  vXXX:変数  ★:調整箇所など
;
; CVASM16アセンブラ用記述
;-------PICコンフィギュレーション設定---;

	include	'16f819.inc'

	fuses	_cp_off			;　コードプロテクト→無効
	fuses	_ccp1_rb2		;　PWMピン選定(_rb0or_rb3)
	fuses	_debug_off		;　インサーキットデバックモード→無効
	fuses	_wrt_enable_off		;　eeconのFlashメモリ可能→しない
	fuses	_cpd_off		;　eepromのコードプロテクト→無効
	fuses	_lvp_off		;　低電圧プログミング(5V)→無効
	fuses	_boden_on		;　低電圧リセット(約4V以下)→【有効】
	fuses	_mclr_off		;　MCLR端子(リセット)→設定しない
	fuses	_pwrte_on		;　電源投入72ms間リセット→有効
	fuses	_wdt_off		;　ウォッチドックタイマー→無効
	fuses	_extclk			;　オシレーター設定→外部発信

	id	'0301'			;Ver3.01

;-------プログラムメモリー割当----------;

mFREE_A		=	20h		;割り算
mFREE_B		=	21h		;割り算
mDIVI_H		=	22h		;割られる数上位　（終了時には０になって戻る）
mDIVI_L		=	23h		;割られる数下位
mJOSUU_H	=	24h		;割る数上位       (変化せず戻る）
mJOSUU_L	=	25h		;割る数下位
mFREE_C		=	26h		;答え上位　　　　（答えが返る）
mKMH_X		=	27h		;答え下位
mFREE_D		=	28h		;余り上位　　　　（余りが返る、内部ワークにも使用）
mFREE_E		=	29h		;余り下位
mDIVI_ER	=	2Ah		;割る数が０であった場合に１をセットして戻る

mKM_xx0		=	2Bh		;1桁目(10進数)
mKM_x0x		=	2Ch		;2桁目
mKM_1xx		=	2Dh		;3桁目
mBCD_X		=	2Eh		;
mSHOW		=	2Fh		;商

vmTIRE_H	=	30h		;ﾀｲﾔ径係数計算用(上位8bit)
vmTIRE_L	=	31h		;ﾀｲﾔ径係数計算用(下位8bit)

mCOUNT_H	=	32h		;100m補正時近接ｾﾝｻｰｶｳﾝﾄ用(上位8bit)
mCOUNT_L	=	33h		;100m補正時近接ｾﾝｻｰｶｳﾝﾄ用(下位8bit)

;---EEPROM値強制設定--------------------;(PIC書込時のみ)

	eeorg	0			;
	eedata	0CAh,7Ch		;


;★タイヤ径330】mmの場合
;(330/1000x2x3.14159x60x60)/(1000*9*(1/1000000x4*4)
;=51836
;テーブル値の計算根拠はエクセル別表を参照
;vTIRE_H	=	0CAh		;★最初がｱﾙﾌｧﾍﾞｯﾄの場合は｢0｣を付ける
;vTIRE_L	=	7Ch		;★

;=======プログラム開始==================;

	org	0			;
	jmp	rSTART			;

;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii;
;---ﾀｲﾏｰ1ｵｰﾊﾞｰﾌﾛｰ(停車判定)割り込み---
;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii;

	org	4			;

	clrb	tmr1if			;タイマー1割込旗解除

	clr	ra			;全消灯
	mov	rb,#00001111b		;0km/h信号送信

	reti				;

;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii;



;-------初期設定(電源ON時)--------------;
rSTART
	clr	ra			;
	clr	rb			;

;(Bank 0)
;	mov	intcon,#11000000b	;割り込み設定
;	初期状態	0000 000x
	setb	peie			;周辺割り込み許可
	mov	t1con,#00100001b	;
;	初期状態	0000 0000
					;bit7…設定項目無し
					;bit6…設定項目無し
					;bit5～4…プリスケールレート【4】
					;bit3…0 タイマー1専用オシレーター
					;bit2…0 外部クロック同期
					;bit1…0 タイマー1クロックソース選択
					;bit0…1 タイマー1オン
;Bank 1
	setb	rp0			;ページ変更(Bank 1へ)
	mov	option_reg,#10000111b	;
;	初期状態	1111 1111
					;bit7…1 RBプルアップ【無】
					;bit6…割り込みエッジ
					;bit5…0 タイマー0は内蔵クロック使用
					;bit4…タイマー0エッジ
					;bit3…プリスケーラはタイマー0へ割当
					;bit2～0…プリスケールレート【256】

	mov	trisa,#11100000b	;RAの入出力ピン設定
	mov	trisb,#00000000b	;RBの入出力ピン設定
	mov	pie1,#00000001b		;タイマー1割り込み有効
;	初期状態	-000 0000
	mov	adcon1,#00000110b	;A/Dはすべてデジタルピンに設定

	clrb	rp0			;ページ変更(Bank 0へ戻す)





;=======================================;
;100mEEPROMｶｳﾝﾄ→ﾀｲﾔ径係数再設定チェック

	jnb	ra.6,rEEP100		;記録開始するか？ボタン押しチェック

;=======================================;
;---------------------------------------;
;電源ON時にEEPROM読み出して通常メモリーへコピーする｡
rSTART_X
	setb	rp1			;ページ変更(Bank 2へ)
	mov	eeadr,#0		;アドレスセット
	setb	rp0			;ページ変更(Bank 3へ)
	setb	rd			;Read Control bit
	clrb	rp0			;ページ変更(Bank 2へ)
	mov	w,eedata		;
	clrb	rp1			;ページ変更(Bank 0へ)
	mov	vmTIRE_H,w		;

	setb	rp1			;ページ変更(Bank 2へ)
	mov	eeadr,#1		;アドレスセット
	setb	rp0			;ページ変更(Bank 3へ)
	setb	rd			;Read Control bit
	clrb	rp0			;ページ変更(Bank 2へ)
	mov	w,eedata		;
	clrb	rp1			;ページ変更(Bank 0へ)
	mov	vmTIRE_L,w		;


;---------------------------------------;
;電源ONﾗﾝﾌﾟﾁｪｯｸ　約2.0秒

	mov	ra,#00011001b		;速度警告灯[黄]点灯､3桁目[1]点灯
	mov	rb,#10001000b		;88km/h信号送信

	clr	tmr1l			;タイマー1クリア
	clr	tmr1h			;

	clrb	tmr1if			;
	jnb	tmr1if,$		;約1秒


	mov	ra,#00011010b		;速度警告灯[黄]消灯､[赤]点灯

	clrb	tmr1if			;
	jnb	tmr1if,$		;約1秒

	mov	rb,#00001111b		; 0km/h信号送信
	clr	ra			;速度警告灯[黄･赤]消灯､3桁目[1]消灯

	setb	gie			;割り込み許可



;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ;
;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ;
;***[ メインループ ]********************;

rREPEAT

;アーム位置チェック　(アーム有はビット無)

	clr	tmr1l			;
	clr	tmr1h			;
	setb	tmr1on			;タイマー1 ON
	jb	ra.5,r_CHK1		;回転センサー信号｢1｣なら｢0｣まで待つ
					;｢0｣なら｢1｣まで待つ
;アーム有
r_CHK0
	jnb	ra.5,$			;回転センサー信号｢1｣まで待つ

	clrb	tmr1on			;タイマー1 OFF
	clr	tmr1l			;タイマー1クリア
	clr	tmr1h			;
	clrb	tmr1if			;
	setb	tmr1on			;タイマー1 ON

	jb	ra.5,$			;回転センサー信号｢0｣まで待つ
	jnb	ra.5,$			;回転センサー信号｢1｣まで待つ

	nop				;tmr1onまでの命令数を合わせる
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	clrb	tmr1on			;タイマー1 OFF

	jmp	rCALC			;

;アーム無
r_CHK1
	jb	ra.5,$			;回転センサー信号｢0｣まで待つ

	clrb	tmr1on			;タイマー1 OFF
	clr	tmr1l			;タイマー1クリア
	clr	tmr1h			;
	clrb	tmr1if			;
	setb	tmr1on			;タイマー1 ON

	jnb	ra.5,$			;回転センサー信号｢0｣まで待つ
	jb	ra.5,$			;回転センサー信号｢0｣まで待つ

	nop				;tmr1onまでの命令数を合わせる
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	clrb	tmr1on			;タイマー1 OFF


;---計算準備---
rCALC
	mov	mJOSUU_H,tmr1h		;タイマー値をコピー
	mov	mJOSUU_L,tmr1l		;

; 51836(★タイヤ径で修正必要)÷カウント数=　[km/h]
	mov	mDIVI_H,vmTIRE_H	;
	mov	mDIVI_L,vmTIRE_L	;

;---速度計算---
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;
	call	sDIV16			;16bit÷16bit 割り算
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;

;割る数がゼロエラーの場合
	jnb	mDIVI_ER,rWARNING	;

rWARNING

;---速度警告灯---
	cjae	mKMH_X,#073,rLEDCHK	;73km/h以上か？
	clrb	ra.0			;黄LED 消灯
	clrb	ra.1			;赤LED 消灯
	jmp	rLEDEND			;
rLEDCHK
	cjae	mKMH_X,#080,rREDLED	;80km/h以上か？
	setb	ra.0			;黄LED 点灯
	clrb	ra.1			;赤LED 消灯
	jmp	rLEDEND			;
rREDLED
	clrb	ra.0			;黄LED 消灯
	setb	ra.1			;赤LED 点灯
rLEDEND

;---3桁目判定---
	cjae	mKMH_X,#100,r_100KM	;100km/h以上か？
	clrb	ra.3			;
	clrb	ra.4			;
	jmp	r100END			;
r_100KM
	setb	ra.3			;
	setb	ra.4			;
r100END



;---2桁目7ｾｸﾞﾒﾝﾄLEDの消灯判定---

	cjae	mKMH_X,#10,r_010KM	;10km/h以上か？

;1桁表示
	call	sBCDCAL			;桁分割

	swap	mKM_xx0			;4ビット入れ替え
	or	mKM_xx0,#00001111b	;2桁目の消灯信号

	mov	rb,mKM_xx0		;7ｾｸﾞﾒﾝﾄLEDへ送信

	jmp	rWAIT			;


;---10km/h以上の2桁表示---

r_010KM
	call	sBCDCAL			;桁分割

	swap	mKM_xx0			;4ビット入れ替え
	or	mKM_xx0,mKM_x0x		;1桁目と2桁目を合成

	mov	rb,mKM_xx0		;7ｾｸﾞﾒﾝﾄLEDへ送信


;---再計測･表示までの待ち時間調整---
rWAIT
	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;約0.26秒

	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;約0.26秒

	jmp	rREPEAT			;


;***[ メインループここまで ]************;
;↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ;
;↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ;





;---------------------------------------
;*** 100mカウントEEPROM書き込み ***
;---------------------------------------
rEEP100
	setb	ra.1			;速度警告灯[赤]点灯
	mov	rb,#11111111b		;  km/h消灯

	jnb	ra.6,$			;ボタン離すまで待つ

;　チャタリング防止　約0.26秒
	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;約0.26秒

;　回転カウンタークリア
	clr	mCOUNT_L		;
	clr	mCOUNT_H		;キャリーカウント用

;　現在の回転センサーアーム位置チェック
	jb	ra.5,rBB_CHK0		;｢ON｣で+1するか｢OFF｣で+1するかの分岐


;回転センサーアーム信号｢ON｣の場合…次ONで+1
rBA_CHK0
	jnb	ra.6,r100_CHK		;記録ボタン押しチェック
	jnb	ra.5,rBA_CHK0		;回転センサー信号出るまで待つ

rBA_CHK1
	jnb	ra.6,r100_CHK		;記録ボタン押しチェック
	jb	ra.5,rBA_CHK1		;回転センサー信号消えるまで待つ

	add	mCOUNT_L,#1		;+1(incはキャリー付かないのでダメ)
	snc				;スキップノットキャリー
	inc	mCOUNT_H.0		;+1
	cjae	mCOUNT_H,#2,rERROR	;｢2｣以上はエラー

	jmp	rBA_CHK0		;



;回転センサーアーム信号｢OFF｣の場合…次OFFで+1
rBB_CHK0
	jnb	ra.6,r100_CHK		;記録ボタン押しチェック
	jb	ra.5,rBB_CHK0		;回転センサー信号消えるまで待つ

rBB_CHK1
	jnb	ra.6,r100_CHK		;記録ボタン押しチェック
	jnb	ra.5,rBB_CHK1		;回転センサー信号出るまで待つ

	add	mCOUNT_L,#1		;+1(incはキャリー付かないのでダメ)
	snc				;スキップノットキャリー
	inc	mCOUNT_H.0		;+1
	cjae	mCOUNT_H,#2,rERROR	;｢2｣以上はエラー

	jmp	rBB_CHK0		;



;　範囲内チェック
r100_CHK
	cjne	mCOUNT_H,#1,rERROR	;｢1｣以外はエラー
	cjb	mCOUNT_L,#153,rERROR	;★｢153｣未満はエラー
	cja	mCOUNT_L,#202,rERROR	;★｢202｣超えるはエラー

	call	s100mv			;


;　カウント数をスピードに表示
;---2桁表示---
;　とりあえず3桁目は考えない

	clrb	ra.1			;速度警告灯[赤]消灯
	mov	mKMH_X,mCOUNT_L		;

	call	sBCDCAL			;桁分割

	swap	mKM_xx0			;4ビット入れ替え
	or	mKM_xx0,mKM_x0x		;1桁目と2桁目を合成

	mov	rb,mKM_xx0		;7ｾｸﾞﾒﾝﾄLEDへ送信


;　値をEEPROMに書き込む｡
	setb	rp1			;ページ変更(Bank 2へ)
	mov	eeadr,#0		;アドレスセット
	clrb	rp1			;ページ変更(Bank 0へ)
	mov	w,vmTIRE_H		;
	setb	rp1			;ページ変更(Bank 2へ)
	mov	eedata,w		;
	setb	rp0			;ページ変更(Bank 3へ)
	clrb	eepgd			;
	setb	wren			;EEPROM Write Enable bit
	mov	eecon2,#55h		;
	mov	eecon2,#0AAh		;
	setb	wr			;Write Control bit
	jb	wr,$			;書き込み終了をここで待つ
	clrb	wren			;EEPROM Write Enable bit
	clrb	rp0			;ページ変更(Bank 2へ)

	mov	eeadr,#1		;アドレスセット
	clrb	rp1			;ページ変更(Bank 0へ)
	mov	w,vmTIRE_L		;
	setb	rp1			;ページ変更(Bank 2へ)
	mov	eedata,w		;
	setb	rp0			;ページ変更(Bank 3へ)
	clrb	eepgd			;
	setb	wren			;EEPROM Write Enable bit
	mov	eecon2,#55h		;
	mov	eecon2,#0AAh		;
	setb	wr			;Write Control bit
	jb	wr,$			;書き込み終了をここで待つ
	clrb	wren			;EEPROM Write Enable bit
	clrb	rp0			;ページ変更(Bank 2へ)
	clrb	rp1			;ページ変更(Bank 0へ)

	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;約0.26秒
	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;約0.26秒
	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;約0.26秒

	jmp	rSTART_X		;



;---------------------------------------
;*** 100m設定エラー停止 ***
;---------------------------------------
rERROR
	mov	ra,#00000010b		;速度警告灯[赤]点灯､3桁目[1]消灯
	clr	rb			;00km/h表示

	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;約0.26秒

	clrb	ra.1			;
	mov	rb,#11111111b		;  km/h消灯

	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;約0.26秒

	jmp	rERROR			;永久ループ=電源OFF必要



;SSSSSS 100m距離近接ｾﾝｻｰｶｳﾝﾄ値→係数 SSS;

s100mv	nop				;

r100m153
	cjne	mCOUNT_L,#153,r100m154	;
	mov	vmTIRE_H,#0D6h		;
	mov	vmTIRE_L,#0E4h		;
	ret				;

r100m154
	cjne	mCOUNT_L,#154,r100m155	;
	mov	vmTIRE_H,#0D6h		;
	mov	vmTIRE_L,#5Eh		;
	ret				;

r100m155
	cjne	mCOUNT_L,#155,r100m156	;
	mov	vmTIRE_H,#0D5h		;
	mov	vmTIRE_L,#0D9h		;
	ret				;

r100m156
	cjne	mCOUNT_L,#156,r100m157	;
	mov	vmTIRE_H,#0D5h		;
	mov	vmTIRE_L,#54h		;
	ret				;

r100m157
	cjne	mCOUNT_L,#157,r100m158	;
	mov	vmTIRE_H,#0D4h		;
	mov	vmTIRE_L,#0CFh		;
	ret				;

r100m158
	cjne	mCOUNT_L,#158,r100m159	;
	mov	vmTIRE_H,#0D4h		;
	mov	vmTIRE_L,#4Ch		;
	ret				;

r100m159
	cjne	mCOUNT_L,#159,r100m160	;
	mov	vmTIRE_H,#0D3h		;
	mov	vmTIRE_L,#0C9h		;
	ret				;

r100m160
	cjne	mCOUNT_L,#160,r100m161	;
	mov	vmTIRE_H,#0D3h		;
	mov	vmTIRE_L,#47h		;
	ret				;

r100m161
	cjne	mCOUNT_L,#161,r100m162	;
	mov	vmTIRE_H,#0D2h		;
	mov	vmTIRE_L,#0C5h		;
	ret				;

r100m162
	cjne	mCOUNT_L,#162,r100m163	;
	mov	vmTIRE_H,#0D2h		;
	mov	vmTIRE_L,#44h		;
	ret				;

r100m163
	cjne	mCOUNT_L,#163,r100m164	;
	mov	vmTIRE_H,#0D1h		;
	mov	vmTIRE_L,#0C3h		;
	ret				;

r100m164
	cjne	mCOUNT_L,#164,r100m165	;
	mov	vmTIRE_H,#0D1h		;
	mov	vmTIRE_L,#43h		;
	ret				;

r100m165
	cjne	mCOUNT_L,#165,r100m166	;
	mov	vmTIRE_H,#0D0h		;
	mov	vmTIRE_L,#0C4h		;
	ret				;

r100m166
	cjne	mCOUNT_L,#166,r100m167	;
	mov	vmTIRE_H,#0D0h		;
	mov	vmTIRE_L,#46h		;
	ret				;

r100m167
	cjne	mCOUNT_L,#167,r100m168	;
	mov	vmTIRE_H,#0CFh		;
	mov	vmTIRE_L,#0C7h		;
	ret				;

r100m168
	cjne	mCOUNT_L,#168,r100m169	;
	mov	vmTIRE_H,#0CFh		;
	mov	vmTIRE_L,#4Ah		;
	ret				;

r100m169
	cjne	mCOUNT_L,#169,r100m170	;
	mov	vmTIRE_H,#0CEh		;
	mov	vmTIRE_L,#0CDh		;
	ret				;

r100m170
	cjne	mCOUNT_L,#170,r100m171	;
	mov	vmTIRE_H,#0CEh		;
	mov	vmTIRE_L,#51h		;
	ret				;

r100m171
	cjne	mCOUNT_L,#171,r100m172	;
	mov	vmTIRE_H,#0CDh		;
	mov	vmTIRE_L,#0D5h		;
	ret				;

r100m172
	cjne	mCOUNT_L,#172,r100m173	;
	mov	vmTIRE_H,#0CDh		;
	mov	vmTIRE_L,#5Ah		;
	ret				;

r100m173
	cjne	mCOUNT_L,#173,r100m174	;
	mov	vmTIRE_H,#0CCh		;
	mov	vmTIRE_L,#0E0h		;
	ret				;

r100m174
	cjne	mCOUNT_L,#174,r100m175	;
	mov	vmTIRE_H,#0CCh		;
	mov	vmTIRE_L,#66h		;
	ret				;

r100m175
	cjne	mCOUNT_L,#175,r100m176	;
	mov	vmTIRE_H,#0CBh		;
	mov	vmTIRE_L,#0ECh		;
	ret				;

r100m176
	cjne	mCOUNT_L,#176,r100m177	;
	mov	vmTIRE_H,#0CBh		;
	mov	vmTIRE_L,#73h		;
	ret				;

r100m177
	cjne	mCOUNT_L,#177,r100m178	;
	mov	vmTIRE_H,#0CAh		;
	mov	vmTIRE_L,#0FBh		;
	ret				;

r100m178
	cjne	mCOUNT_L,#178,r100m179	;
	mov	vmTIRE_H,#0CAh		;
	mov	vmTIRE_L,#83h		;
	ret				;

r100m179
	cjne	mCOUNT_L,#179,r100m180	;
	mov	vmTIRE_H,#0CAh		;
	mov	vmTIRE_L,#0Ch		;
	ret				;

r100m180
	cjne	mCOUNT_L,#180,r100m181	;
	mov	vmTIRE_H,#0C9h		;
	mov	vmTIRE_L,#96h		;
	ret				;

r100m181
	cjne	mCOUNT_L,#181,r100m182	;
	mov	vmTIRE_H,#0C9h		;
	mov	vmTIRE_L,#1Fh		;
	ret				;

r100m182
	cjne	mCOUNT_L,#182,r100m183	;
	mov	vmTIRE_H,#0C8h		;
	mov	vmTIRE_L,#0AAh		;
	ret				;

r100m183
	cjne	mCOUNT_L,#183,r100m184	;
	mov	vmTIRE_H,#0C8h		;
	mov	vmTIRE_L,#35h		;
	ret				;

r100m184
	cjne	mCOUNT_L,#184,r100m185	;
	mov	vmTIRE_H,#0C7h		;
	mov	vmTIRE_L,#0C0h		;
	ret				;

r100m185
	cjne	mCOUNT_L,#185,r100m186	;
	mov	vmTIRE_H,#0C7h		;
	mov	vmTIRE_L,#4Ch		;
	ret				;

r100m186
	cjne	mCOUNT_L,#186,r100m187	;
	mov	vmTIRE_H,#0C6h		;
	mov	vmTIRE_L,#0D9h		;
	ret				;

r100m187
	cjne	mCOUNT_L,#187,r100m188	;
	mov	vmTIRE_H,#0C6h		;
	mov	vmTIRE_L,#66h		;
	ret				;

r100m188
	cjne	mCOUNT_L,#188,r100m189	;
	mov	vmTIRE_H,#0C5h		;
	mov	vmTIRE_L,#0F4h		;
	ret				;

r100m189
	cjne	mCOUNT_L,#189,r100m190	;
	mov	vmTIRE_H,#0C5h		;
	mov	vmTIRE_L,#82h		;
	ret				;

r100m190
	cjne	mCOUNT_L,#190,r100m191	;
	mov	vmTIRE_H,#0C5h		;
	mov	vmTIRE_L,#10h		;
	ret				;

r100m191
	cjne	mCOUNT_L,#191,r100m192	;
	mov	vmTIRE_H,#0C4h		;
	mov	vmTIRE_L,#0A0h		;
	ret				;

r100m192
	cjne	mCOUNT_L,#192,r100m193	;
	mov	vmTIRE_H,#0C4h		;
	mov	vmTIRE_L,#2Fh		;
	ret				;

r100m193
	cjne	mCOUNT_L,#193,r100m194	;
	mov	vmTIRE_H,#0C3h		;
	mov	vmTIRE_L,#0BFh		;
	ret				;

r100m194
	cjne	mCOUNT_L,#194,r100m195	;
	mov	vmTIRE_H,#0C3h		;
	mov	vmTIRE_L,#50h		;
	ret				;

r100m195
	cjne	mCOUNT_L,#195,r100m196	;
	mov	vmTIRE_H,#0C2h		;
	mov	vmTIRE_L,#0E1h		;
	ret				;

r100m196
	cjne	mCOUNT_L,#196,r100m197	;
	mov	vmTIRE_H,#0C2h		;
	mov	vmTIRE_L,#73h		;
	ret				;

r100m197
	cjne	mCOUNT_L,#197,r100m198	;
	mov	vmTIRE_H,#0C0h		;
	mov	vmTIRE_L,#05h		;
	ret				;

r100m198
	cjne	mCOUNT_L,#198,r100m199	;
	mov	vmTIRE_H,#0C1h		;
	mov	vmTIRE_L,#97h		;
	ret				;

r100m199
	cjne	mCOUNT_L,#199,r100m200	;
	mov	vmTIRE_H,#0C1h		;
	mov	vmTIRE_L,#2Bh		;
	ret				;

r100m200
	cjne	mCOUNT_L,#200,r100m201	;
	mov	vmTIRE_H,#0C0h		;
	mov	vmTIRE_L,#0BEh		;
	ret				;

r100m201
	cjne	mCOUNT_L,#201,r100m202	;
	mov	vmTIRE_H,#0C0h		;
	mov	vmTIRE_L,#52h		;
	ret				;

r100m202
	mov	vmTIRE_H,#0BFh		;
	mov	vmTIRE_L,#0E7h		;
	ret				;




;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ;
;sss 16bit÷16bit計算 sss
;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ;
;"ELECTRONICS SHELVES"より引用
;(メモリー名は自分で分かりやすいように変更)

sDIV16			;１６ビットの割り算ルーチン
			;秋月 PA (PICアセンブラ) 用
;--------------------	div16 での使用変数
;mDIVI_H	ds	1		;割られる数上位　（終了時には０になって戻る）
;mDIVI_L	ds	1		;割られる数下位
;mJOSUU_H	ds	1		;割る数上位       (変化せず戻る）
;mJOSUU_L	ds	1		;割る数下位
;mFREE_C	ds	1		;答え上位　　　　（答えが返る）
;mKMH_X		ds	1		;答え下位
;mFREE_D	ds	1		;余り上位　　　　（余りが返る、内部ワークにも使用）
;mFREE_E	ds	1		;余り下位
;mFREE_A	ds	1		;内部ループ用
;mFREE_B	ds	1		;内部ループ用
;mDIVI_ER	ds	1		;割る数が０であった場合に１をセットして戻る
;--------------------	使用例
;	mov	mDIVI_H,#0ffh		;割られる数上位   (ffffh=65535)
;	mov	mDIVI_L,#0ffh		;割られる数下位
;	mov	mJOSUU_H,#027h		;割る数上位       (2710h=10000)
;	mov	mJOSUU_L,#010h		;割る数下位
;	call	div16			;答えは mFREE_C,a 、余りは mFREE_D,a に返る
;--------------------	主ルーチン
	mov	mFREE_A,#16
	mov	mFREE_E,mJOSUU_L	;割る数下位をワークにコピー
	mov	mFREE_D,mJOSUU_H	;割る数上位をワークにコピー
di1601
	rl	mFREE_E			;左シフトする
	rl	mFREE_D
	jc	di1602			;割る数の上位ビット位置を探す
	djnz	mFREE_A,di1601
	mov	mDIVI_ER,#1		;割る数が０である、エラー
	ret
di1602
	clr	mKMH_X			;答え下位をクリアしておく
	clr	mFREE_C			;上位
	clr	mFREE_E			;ワーク下位をクリアしておく
	clr	mFREE_D			;上位
	mov	mFREE_B,#16
	sub	mFREE_B,mFREE_A		;残り、実ループの回数
di1603
	clc				;キャリフラグを０に
	rl	mDIVI_L			;有効位置までシフトする
	rl	mDIVI_H
	rl	mFREE_E			;押し出されたビットをワークに
	rl	mFREE_D
	djnz	mFREE_A,di1603		;割られる数を初期位置までシフトしておく
di1604					;現位置での減算が可能かチェック
	cjb	mFREE_D,mJOSUU_H,di1606
	cja	mFREE_D,mJOSUU_H,di1605
	;上位が＝
	cjb	mFREE_E,mJOSUU_L,di1606
di1605
	sub	mFREE_E,mJOSUU_L	;ワークから下位を引く
	sc				;キャリフラグが 1（正）なら次をスキップ
	dec	mFREE_D			;上位 -1
	sub	mFREE_D,mJOSUU_H	;ワークから上位を引く
	stc				;キャリフラグを１に
	goto	di1607
di1606
	clc				;キャリフラグを０に
di1607
	rl	mKMH_X			;キャリフラグの内容を答えにシフトしてゆく
	rl	mFREE_C
	cje	mFREE_B,#0,di1608	;最下位まで処理したなら終了
	dec	mFREE_B			;ビット位置を１つ下げる（右へ）
	clc				;キャリフラグを０に
	rl	mDIVI_L			;ワークへ１ビット左シフト
	rl	mDIVI_H
	rl	mFREE_E
	rl	mFREE_D
	goto	di1604
di1608
	clr	mDIVI_ER		;正常終了
	ret
;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ;



;sssssss BCD割り算(8bit÷10) sssssssssss;
sBCDCAL
	call	sBCDZAN			;1桁目
	mov	mKM_xx0,mBCD_X		;余りを入れる

	mov	mKMH_X,mSHOW		;商を入れる
	call	sBCDZAN			;2桁目
	mov	mKM_x0x,mBCD_X		;余りを入れる
	mov	mKM_1xx,mSHOW		;商を入れる

;結果は1桁目→mKM_xx0､2桁目→mKM_x0x､3桁目→mKM_1xx

	ret				;リターン(サブルーチン終わり)


;サブルーチンのサブルーチン
;---桁移動比較---
sBCDZAN
	mov	mFREE_A,#8		;ループ数設定
	clr	mBCD_X			;
rBCD_0	rl	mKMH_X			;
	rl	mBCD_X			;

	jc	rBCD_2			;比較8ビット超判定
	cjae	mBCD_X,#10,rBCD_1	;勝ち負け判定
	clrb	c			;キャリー0
	jmp	rWARI_4			;
rBCD_1	sub	mBCD_X,#10		;引き算(余りはここに残る)
	jmp	rBCD_3			;
rBCD_2	clr	mFREE_B			;0にする
	sub	mFREE_B,#10		;
	add	mBCD_X,mFREE_B		;
rBCD_3	setb	c			;キャリー1

;---計算結果入れ---
rWARI_4
	rl	mSHOW			;計算結果を入れる
	djnz	mFREE_A,rBCD_0		;ループ継続判定
	ret				;リターン(サブルーチン終わり)

