6-11 ローバッテリ検出とデータ退避


ビジュアルメモリは、ローバッテリを検出するとその旨のメッセージを表示し、自動的にスリープ状態になる機能を内蔵しています。このサンプルは、アプリケーションが独自にローバッテリを検知し、RAMのデータをフラッシュメモリに退避するものです。

このプログラムの本質は、115〜124行目のローバッテリ検出ルーチンです。ポート7のローバッテリフラグをチェックします。

ポート7割り込みを利用することも可能ですが、割り込み処理ルーチン内でシステムBIOSを呼び出さないように配慮してください。

001	; Tab width = 4
002	
003	;----------------------------------------------------------------------------
004	; ** ローバッテリ検出とデータ退避サンプル1 **
005	;
006	; ローバッテリ状態を検出して、必要なデータをフラッシュメモリに退避する
007	;----------------------------------------------------------------------------
008	; 1.01 990208 SEGA Enterprises,LTD.
009	;----------------------------------------------------------------------------
010	
011	chip	LC868700			; チップの種類をアセンブラに指定
012	world	external			; 外部メモリ用プログラム
013	
014	public	main				; ghead.asm から参照されるシンボル
015	
016	extern	_game_end			; ghead.asm への参照シンボル
017	extern	fm_wrt_ex, fm_vrf_ex, fm_prd_ex	; ghead.asm への参照シンボル
018	
019	
020	; **** システム定数の定義 ***************************************************
021	
022								; OCR(発振制御レジスタ)設定値
023	osc_rc		equ 04dh		;	システムクロックに内蔵RC発振を指定(1/12)
024	osc_rcfw	equ 0cdh		;	システムクロックに内蔵RC発振を指定(1/6)
025	osc_xt		equ 0efh		;	システムクロックに水晶発振を指定
026	
027	LowBattChk	equ 06eh		; ローバッテリ検出フラグ(RAMバンク0)
028	
029	fmflag		equ 07ch		; フラッシュメモリ書き込み終了検出方式
030	fmbank		equ 07dh		; フラッシュメモリバンク切替え
031	fmadd_h		equ 07eh		; フラッシュメモリ上位アドレス
032	fmadd_l		equ 07fh		; フラッシュメモリ下位アドレス
033	
034	fmbuff		equ 080h		; フラッシュメモリ読み書き用バッファ先頭
035	
036	; *** データセグメント ******************************************************
037	
038			dseg				; データセグメント開始
039	
040	r0:		ds		1			; 間接アドレッシングレジスタ r0
041	r1:		ds		1			; 間接アドレッシングレジスタ r1
042	r2:		ds		1			; 間接アドレッシングレジスタ r2
043	r3:		ds		1			; 間接アドレッシングレジスタ r3
044			ds		12			; その他のシステム予約レジスタ
045	
046	
047	; *** コードセグメント ******************************************************
048	
049			cseg				; コードセグメント開始
050	
051	; *-------------------------------------------------------------------------*
052	; * ユーザープログラム														*
053	; *-------------------------------------------------------------------------*
054	main:
055			call	cls			; LCD表示イメージを消去する
056	
057	loop0:						; テストメインループ先頭
058	
059			; アプリケーションメイン処理
060	
061								; ** [M](モード)ボタンチェック **
062			ld		P3
063			bn		acc,6,finish ; [M]ボタンが押されていたらアプリ終了
064	
065								; ** バッテリ状態チェック **
066			call	ChkBatt		; バッテリの状態をチェック
067			bz		loop0		; acc=0 ならバッテリ正常でループ
068	
069								; **  ローバッテリ 処理 **
070			call	prepare		; テスト退避用のデータを用意する。
071								; 実際のアプリケーションでは退避すべきデータを
072								; 収集してフラッシュROM書きこみ用のバッファに配置
073								; するようにする。
074	
075			call	WriteData	; フラッシュメモリへバッファに用意した(退避すべき)
076								; データを書きこむ
077	
078	finish:						; ** アプリケーション終了処理 **
079			jmp		_game_end	; アプリケーション終了
080	
081			
082	; *-------------------------------------------------------------------------*
083	
084	prepare:					; **** テスト退避用のデータを準備する ****
085								; fmbuff に 10h〜8fh の 128byte のデータを用意
086	
087			push	PSW			; PSW値を退避
088			set1	PSW,1		; データRAMバンク1を選択
089	
090			mov		#fmbuff,r0	; 読み書きバッファのアドレスを r0 に
091			mov		#128,c		; ループカウンタ(128回)
092			mov		#010h,b		; 書き込むデータの初期値
093	loop4:
094			ld		b			; データをバッファに置く
095			st		@r0			;
096		
097			inc		b			; 書き込みテスト用データを変える
098		
099			inc		r0			; バッファのアドレスをインクリメント
100		
101			dec		c			; ループカウンタのデクリメント
102			ld		c
103			bnz		loop4		; 128回の繰り返し
104	
105			pop		PSW			; PSW値を復帰
106	
107			ret					; prepare 終わり
108	
109	
110	; *-------------------------------------------------------------------------*
111	; * ローバッテリ状態を検出する											*
112	; * 出力: acc = 0    : 電池状態正常											*
113	; *       acc = 0ffh : ローバッテリ										*
114	; *-------------------------------------------------------------------------*
115	ChkBatt:
116			ld		P7			; P71の状態をチェックする
117			bn		acc,1,next3	; 電池ないとき分岐
118	
119								; ** 電池ある **
120			mov		#0,acc		; acc = 0
121			ret					; ChkBatt終わり。電池ありなら acc=0 として返る
122	
123	next3:						; ** 電池なし **
124			mov		#0ffh,acc	; acc = 0ffh
125			ret					; ChkBatt終わり。電池なしなら acc=0ffh として返る
126	
127	
128	; *-------------------------------------------------------------------------*
129	; * バッファのデータをフラッシュメモリへ書きこむ							*
130	; *-------------------------------------------------------------------------*
131	WriteData:					; **** フラッシュメモリへの書き込み ****
132								
133			push	PSW			; PSW値を退避
134			set1	PSW,1		; データRAMバンク1を選択
135	
136			mov		#0,fmbank	; フラッシュメモリのバンク指定 = 0		
137			mov		#high(fmarea),fmadd_h	; 書き込み先アドレス(上位)
138			mov		#low(fmarea),fmadd_l	; 書き込み先アドレス(下位)		
139			mov		#0,fmflag	; トクルビット方式により終了を検出
140			
141			clr1	PSW,1		; データRAMバンク0を選択
142			mov		#0ffh,acc	; ローバッテリ検出をしない(0ffh)
143			st		LowBattChk	; ローバッテリ自動検出フラグ(RAMバンク0)
144	
145			pop		PSW			; PSW値を復帰
146	
147			push	OCR			; OCR値を退避
148			mov		#osc_rcfw,OCR ; システムクロックを指定(RC)
149			call	fm_wrt_ex	; BIOS「フラッシュメモリへの書き込み」
150			pop		OCR			; OCR値を復帰
151	
152			push	PSW			; PSW値を退避
153			clr1	PSW,1		; データRAMバンク0を選択
154			mov		#0,acc		; ローバッテリ検出をする(0)
155			st		LowBattChk	; ローバッテリ自動検出フラグ(RAMバンク0)
156			pop		PSW			; PSW値を復帰
157	
158			ret					; WriteData終わり
159	
160	
161	; *-------------------------------------------------------------------------*
162	; * LCD表示イメージを消去する												*
163	; *-------------------------------------------------------------------------*
164	cls:
165			push	OCR			; OCR値を退避
166			mov		#osc_rc,OCR ; システムクロックを指定
167	
168			mov		#0,XBNK		; 表示用RAMのバンクアドレスを指定(BANK0)
169			call	cls_s		; そのバンク内のデータをクリア
170	
171			mov		#1,XBNK		; 表示用RAMのバンクアドレスを指定(BANK1)
172			call	cls_s		; そのバンク内のデータをクリア
173			pop		OCR			; OCR値を復帰
174			
175			ret					; cls終わり
176			
177	cls_s:						; *** 表示用RAM 1BANK分の消去 ***
178			mov		#80h,r2		; 間接アドレッシングレジスタを表示用RAMの先頭に
179			mov		#80h,b 		; ループカウンタbにループ数をセット
180	loop3:
181			mov		#0,@r2		; アドレスをインクリメントしながら0を書き込む
182			inc		r2			;
183			dbnz	b,loop3		; bが0になるまで繰り返す
184			
185			ret					; cls_s終わり
186			
187	
188	; *-------------------------------------------------------------------------*
189	; * データ保存用フラッシュメモリ領域										*
190	; *-------------------------------------------------------------------------*
191			org ((*-1) land 0ff80h) + 80h		; 128byte アライン
192	fmarea:
193			; 128byte フラッシュメモリ領域を確保する
194			db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
195			db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
196			db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
197			db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
198			db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
199			db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
200			db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
201			db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
202	
203	end		

[]   [INDEX]

(C)SEGA ENTERPRISES, LTD., 1998