ビジュアルメモリのボタン押下状態(リセットボタンとMODEボタンを除く)を調べ、押されているボタンをLCDに表示します。
46行目でポート3に0FFHを書き込み、全ビットをプルアップします。
ボタンの押下状態は、51行目でポート3の状態をACCに読み込みます。この時点で押されているボタンがあれば、対応するビットが0にリセットされています。
52行目では、そのビットがセット(ボタンが押されていない)されているかをチェックし、次のボタンチェック処理に移ります。もしボタンが押されている場合は、52行目の条件は偽となり、対応するボタンを表示する処理を行います。
![]() システムBIOSから呼び出された直後は、ポート3割り込みが有効になっています。また、ポート3割り込みはレベル割り込みなので、ボタンが押されている間は割り込みが上がり続けます。 そこで、ポート3割り込みを無効にすると、アプリケーション全体のパフォーマンスが向上します。 なお、ポート3割り込みでHALTモードの解除を行うアプリケーションは、その直前でポート3割り込みを許可する必要があります。 |
001 ; Tab width = 4 002 003 ;---------------------------------------------------------------------------- 004 ; ** ボタン状態検出サンプル1 ** 005 ; 006 ; ・ボタンの状態を読み込んで、押下されているボタンをLCDに表示する 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 018 019 ; **** システム定数の定義 *************************************************** 020 021 ; OCR(発振制御レジスタ)設定値 022 osc_rc equ 04dh ; システムクロックに内蔵RC発振を指定 023 osc_xt equ 0efh ; システムクロックに水晶発振を指定 024 025 026 ; *** データセグメント ****************************************************** 027 028 dseg ; データセグメント開始 029 030 r0: ds 1 ; 間接アドレッシングレジスタ r0 031 r1: ds 1 ; 間接アドレッシングレジスタ r1 032 r2: ds 1 ; 間接アドレッシングレジスタ r2 033 r3: ds 1 ; 間接アドレッシングレジスタ r3 034 ds 12 ; その他のシステム予約レジスタ 035 036 ; *** コードセグメント ****************************************************** 037 038 cseg ; コードセグメント開始 039 040 ; *-------------------------------------------------------------------------* 041 ; * ユーザープログラム * 042 ; *-------------------------------------------------------------------------* 043 main: 044 call cls ; LCD表示イメージを消去する 045 046 mov #0ffh,P3 ; P3の初期化(プルアップ設定) 047 048 loop0: 049 ; ** [A]ボタンのチェック ** 050 mov #0,b 051 ld P3 ; P3の状態を読み込む 052 bp acc,4,next3 ; [A]ボタン押されてなければ next3 053 mov #1,b ; 表示文字コード 'A' 054 next3: 055 ld b 056 mov #4,c ; 表示座標(水平) 057 mov #3,b ; 表示座標(垂直) 058 call putch ; 一文字表示 059 060 ; ** [B]ボタンのチェック ** 061 mov #0,b 062 ld P3 063 bp acc,5,next4 ; [B]ボタン押されてなければ next4 064 mov #2,b ; 表示文字コード 'B' 065 next4: 066 ld b 067 mov #5,c 068 mov #2,b 069 call putch 070 071 ; ** [↑]ボタンのチェック ** 072 mov #0,b 073 ld P3 074 bp acc,0,next5 ; [↑]ボタン押されてなければ next5 075 mov #3,b ; 表示文字コード '↑' 076 next5: 077 ld b 078 mov #1,c 079 mov #1,b 080 call putch 081 082 ; ** [→]ボタンのチェック ** 083 mov #0,b 084 ld P3 085 bp acc,3,next6 ; [→]ボタン押されてなければ next6 086 mov #4,b ; 表示文字コード '→' 087 next6: 088 ld b 089 mov #2,c 090 mov #2,b 091 call putch 092 093 ; ** [↓]ボタンのチェック ** 094 mov #0,b 095 ld P3 096 bp acc,1,next7 ; [↓]ボタン押されてなければ next7 097 mov #5,b ; 表示文字コード '↓' 098 next7: 099 ld b 100 mov #1,c 101 mov #3,b 102 call putch 103 104 ; ** [←]ボタンのチェック ** 105 mov #0,b 106 ld P3 107 bp acc,2,next8 ; [←]ボタン押されてなければ next8 108 mov #6,b ; 表示文字コード '←' 109 next8: 110 ld b 111 mov #0,c 112 mov #2,b 113 call putch 114 115 ; ** [S]ボタンのチェック ** 116 mov #0,b 117 ld P3 118 bp acc,7,next9 ; [S]ボタン押されてなければ next9 119 mov #8,b ; 表示文字コード 'S' 120 next9: 121 ld b 122 mov #4,c 123 mov #1,b 124 call putch 125 126 ; ** [M]ボタンのチェック ** 127 ld P3 128 bn acc,6,finish ; [M]ボタンが押されていたらアプリ終了 129 130 brf loop0 ; 繰り返し 131 132 finish: ; ** アプリケーション終了処理 ** 133 jmp _game_end ; アプリケーション終了 134 135 136 ; *-------------------------------------------------------------------------* 137 ; * LCD表示イメージを消去する * 138 ; *-------------------------------------------------------------------------* 139 cls: 140 push OCR ; OCR値を退避 141 mov #osc_rc,OCR ; システムクロックを指定 142 143 mov #0,XBNK ; 表示用RAMのバンクアドレスを指定(BANK0) 144 call cls_s ; そのバンク内のデータをクリア 145 146 mov #1,XBNK ; 表示用RAMのバンクアドレスを指定(BANK1) 147 call cls_s ; そのバンク内のデータをクリア 148 pop OCR ; OCR値を復帰 149 150 ret ; cls終わり 151 152 cls_s: ; *** 表示用RAM 1BANK分の消去 *** 153 mov #80h,r2 ; 間接アドレッシングレジスタを表示用RAMの先頭に 154 mov #80h,b ; ループカウンタbにループ数をセット 155 loop3: 156 mov #0,@r2 ; アドレスをインクリメントしながら0を書き込む 157 inc r2 ; 158 dbnz b,loop3 ; bが0になるまで繰り返す 159 160 ret ; cls_s終わり 161 162 163 ; *-------------------------------------------------------------------------* 164 ; * 指定位置に1キャラクタ表示する * 165 ; * 入力 acc : キャラクタコード * 166 ; * c : 文字水平位置 * 167 ; * b : 文字垂直位置 * 168 ; *-------------------------------------------------------------------------* 169 putch: 170 push XBNK 171 push acc 172 call locate ; 座標から表示RAMのアドレスを計算 173 pop acc 174 call put_chara ; 1キャラクタ表示する 175 pop XBNK 176 177 ret ; putch終わり 178 179 180 locate: ; **** 表示位置指定から表示用RAMのアドレスを計算 **** 181 ; ** 入力 c: 水平位置(0〜5) b: 垂直位置(0〜3) 182 ; ** 出力 r2: RAMアドレス XBNK: 表示用RAMバンク 183 184 ; *** 表示用RAMバンクアドレスの判断 *** 185 ld b ; b>=2 のとき next1 へ 186 sub #2 ; 187 bn PSW,7,next1 ; 188 189 mov #00h,XBNK ; 表示用RAMのバンクアドレスを指定(BANK0) 190 br next2 191 next1: 192 st b 193 mov #01h,XBNK ; 表示用RAMのバンクアドレスを指定(BANK1) 194 next2: 195 196 ; *** 表示指定位置のRAMアドレス計算 *** 197 ld b ; b * 40h + c + 80h 198 rol ; 199 rol ; 200 rol ; 201 rol ; 202 rol ; 203 rol ; 204 add c ; 205 add #80h ; 206 st r2 ; RAMアドレスをr2に格納 207 208 ret ; locate終わり 209 210 211 put_chara: 212 push PSW ; PSW値を退避 213 set1 PSW,1 ; データRAMバンク1を選択 214 215 ; *** キャラクタデータアドレスの計算 *** 216 rol ; (TRH,TRL) = acc*8 + fontdata 217 rol ; 218 rol ; 219 add #low(fontdata) ; 220 st TRL ; 221 mov #0,acc ; 222 addc #high(fontdata) ; 223 st TRH ; 224 225 push OCR ; OCR値を退避 226 mov #osc_rc,OCR ; システムクロックを指定 227 228 mov #0,b ; キャラクタデータ読み出し用オフセット値 229 mov #4,c ; ループカウンタ 230 loop1: 231 ld b ; 1ライン目の表示データを読み出す 232 ldc ; 233 inc b ; 読み出しデータのオフセットを +1 234 st @r2 ; 表示データを表示用RAMに転送 235 ld r2 ; 表示用RAMアドレス +6 236 add #6 ; 237 st r2 ; 238 239 ld b ; 2ライン目の表示データを読み出す 240 ldc ; 241 inc b ; 読み出しデータのオフセットを +1 242 st @r2 ; 表示データを表示用RAMに転送 243 ld r2 ; 表示用RAMアドレス +10 244 add #10 ; 245 st r2 ; 246 247 dec c ; ループカウンタのデクリメント 248 ld c ; 249 bnz loop1 ; 8ライン分(4回)繰り返し 250 251 pop OCR ; OCR値を復帰 252 pop PSW ; PSW値を復帰 253 254 ret ; put_chara終わり 255 256 257 ; *-------------------------------------------------------------------------* 258 ; * キャラクタのビットイメージデータ * 259 ; *-------------------------------------------------------------------------* 260 fontdata: 261 db 000h, 000h, 038h, 038h, 038h, 000h, 000h, 000h ;'・' 00 262 db 01eh, 036h, 066h, 0c6h, 0c6h, 0feh, 0c6h, 000h ;'A' 01 263 db 0fch, 066h, 066h, 07ch, 066h, 066h, 0fch, 000h ;'B' 02 264 265 db 010h, 038h, 07ch, 0feh, 038h, 038h, 038h, 000h ;'↑' 03 266 db 010h, 018h, 0fch, 0feh, 0fch, 018h, 010h, 000h ;'→' 04 267 db 038h, 038h, 038h, 0feh, 07ch, 038h, 010h, 000h ;'↓' 05 268 db 010h, 030h, 07eh, 0feh, 07eh, 030h, 010h, 000h ;'←' 06 269 270 db 0c6h, 0eeh, 0feh, 0d6h, 0c6h, 0c6h, 0c6h, 000h ;'M' 07 271 db 07ch, 0e6h, 076h, 038h, 0dch, 0ceh, 07ch, 000h ;'S' 08
[←] | [INDEX] | [→] |
(C)SEGA ENTERPRISES, LTD., 1998