ビジュアルメモリは、ローバッテリを検出するとその旨のメッセージを表示し、自動的にスリープ状態になる機能を内蔵しています。このサンプルは、アプリケーションが独自にローバッテリを検知し、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