6-4 ボタン押下の検出


ビジュアルメモリのボタン押下状態(リセットボタンと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