6-3 ベースタイマー割り込みを使ったカウンタ


ベースタイマーからかかる0.5秒ごとの割り込みを検知し、その数をカウントします。

割り込みが発生すると“GHEAD.ASM”の35行目にジャンプし、さらにその先のラベルINT_1Bにジャンプします。108行目からベースタイマー割り込み処理が始まりますが、ここでは内蔵の時計処理を行っています。112行目までのROM内の時計処理をいったん行った後、“B_TIMER1.ASM”にあるラベルint_BaseTimerにジャンプさせます。

“B_TIMER1.ASM”では、外部プログラムから参照されるラベルint_BaseTimerをPUBLIC宣言(16行目)しています。242行目以降は、ユーザー側ベースタイマー割り込みハンドラです。割り込みハンドラ内では、カウンタをインクリメントしています。

再び“GHEAD.ASM”に戻り、IEレジスタの内容をint_1bが呼び出されたときの値に戻し、割り込みからの復帰(IRET)を行います。

メインルーチンでは、カウンタの値を常にLCDに表示しています。

●GHEAD.ASM

001	chip	LC868700
002	world	external
003	; *-----------------------------------------------------*
004	; *	External header program Ver 1.00		*
005	; *					05/20-'98	*
006	; *-----------------------------------------------------*
007	
008	public	fm_wrt_ex_exit,fm_vrf_ex_exit
009	public	fm_prd_ex_exit,timer_ex_exit,_game_start,_game_end
010	other_side_symbol	fm_wrt_in,fm_vrf_in
011	other_side_symbol	fm_prd_in,timer_in,game_end
012	
013	extern	main		;ユーザープログラム側にあるシンボル
014	extern	int_BaseTimer	;ユーザープログラム側にあるシンボル
015	
016	; *-----------------------------------------------------*
017	; *	Vector table(?)					*
018	; *-----------------------------------------------------*
019	cseg
020	org	0000h
021	_game_start:
022	;reset:
023			jmpf	main		; main program jump
024	org	0003h
025	;int_03:
026			jmp	int_03
027	org	000bh
028	;int_0b:
029			jmp	int_0b
030	org	0013h
031	;int_13:
032			jmp	int_13
033	org	001bh
034	;int_1b:
035			jmp	int_1b
036	org	0023h
037	;int_23:
038			jmp	int_23
039	org	002bh
040	;int_2b:
041			jmp	int_2b
042	org	0033h
043	;int_33:
044			jmp	int_33
045	org	003bh
046	;int_3b:
047			jmp	int_3b
048	org	0043h
049	;int_43:
050			jmp	int_43
051	org	004bh
052	;int_4b:
053			jmp	int_4b
054	; *-----------------------------------------------------*
055	; *	interrupt programs				*
056	; *-----------------------------------------------------*
057	int_03:
058			reti
059	int_0b:
060			reti
061	int_13:
062			reti
063	int_23:
064			reti
065	int_2b:
066			reti
067	int_33:
068			reti
069	int_3b:
070			reti
071	; *-----------------------------------------------------*
072	int_43:
073			reti
074	int_4b:
075			clr1	p3int,1		;interrupt flag clear
076			reti
077	
078	org	0100h
079	; *-----------------------------------------------------*
080	; *	flash memory write external program		*
081	; *-----------------------------------------------------*
082	fm_wrt_ex:
083			change	fm_wrt_in
084		fm_wrt_ex_exit:
085			ret
086	org	0110h
087	; *-----------------------------------------------------*
088	; *	flash memory verify external program		*
089	; *-----------------------------------------------------*
090	fm_vrf_ex:
091			change	fm_vrf_in
092		fm_vrf_ex_exit:
093			ret
094	
095	org	0120h
096	; *-----------------------------------------------------*
097	; *	flash memory page read external program		*
098	; *-----------------------------------------------------*
099	fm_prd_ex:
100			change	fm_prd_in
101		fm_prd_ex_exit:
102			ret
103	
104	org	0130h
105	; *-----------------------------------------------------*
106	; *	flash memory => timer call external program	*
107	; *-----------------------------------------------------*
108	int_1b:
109	timer_ex:
110			push	ie
111			clr1	ie,7		;interrupt prohibition
112			change	timer_in
113		timer_ex_exit:
114			call	int_BaseTimer	;(ユーザー側ベースタイマ割り込み処理)
115			pop	ie
116			reti
117	
118	org	01f0h
119	_game_end:
120			change	game_end
121	end
●B_TIMER1.ASM
001	; Tab width = 4
002	
003	;----------------------------------------------------------------------------
004	; ** ベースタイマ割り込み利用サンプル1 **
005	;
006	; ・ベースタイマ割り込み(0.5秒ごと)をカウントする
007	; ・カウンタの値を2桁10進数でLCDに表示する
008	;----------------------------------------------------------------------------
009	; 1.01 990208 SEGA Enterprises,LTD.
010	;----------------------------------------------------------------------------
011	
012	chip	LC868700			; チップの種類をアセンブラに指定
013	world	external			; 外部メモリ用プログラム
014	
015	public	main				; ghead.asm から参照されるシンボル
016	public	int_BaseTimer		; ghead.asm から参照されるシンボル
017	
018	extern	_game_end			; ghead.asm への参照シンボル
019	
020	
021	; **** システム定数の定義 ***************************************************
022	
023								; OCR(発振制御レジスタ)設定値
024	osc_rc		equ 04dh		;	システムクロックに内蔵RC発振を指定
025	osc_xt		equ 0efh		;	システムクロックに水晶発振を指定
026	
027	
028	; *** データセグメント ******************************************************
029	
030			dseg				; データセグメント開始
031	
032	r0:		ds		1			; 間接アドレッシングレジスタ r0
033	r1:		ds		1			; 間接アドレッシングレジスタ r1
034	r2:		ds		1			; 間接アドレッシングレジスタ r2
035	r3:		ds		1			; 間接アドレッシングレジスタ r3
036			ds		12			; その他のシステム予約レジスタ
037			
038	counter: ds		1			; ベースタイマ割り込みカウンタ
039	work1:	ds		1			; 作業用 (put2digit)
040	
041	
042	; *** コードセグメント ******************************************************
043	
044			cseg				; コードセグメント開始
045			
046	; *-------------------------------------------------------------------------*
047	; * ユーザープログラム														*
048	; *-------------------------------------------------------------------------*
049	main:
050			mov		#0,counter	; カウンタの値をリセット
051			
052			call	cls			; LCD表示イメージを消去する
053			
054	loop0:
055			mov		#2,c		; 表示位置(水平)
056			mov		#1,b		; 表示位置(垂直)
057			ld		counter		; カウンタの値をaccへ
058			call	put2digit	; accの値(2桁)を数値表示する
059			
060			set1	pcon,0		; 次の割り込みまでHALTモードで待つ
061	
062								; ** [M](モード)ボタンチェック **
063			ld		P3
064			bn		acc,6,finish ; [M]ボタンが押されていたらアプリ終了
065	
066			br		loop0		; 繰り返し
067	
068	finish:						; ** アプリケーション終了処理 **
069			jmp		_game_end	; アプリケーション終了
070	
071	
072	; *-------------------------------------------------------------------------*
073	; * 2桁の数値を表示する														*
074	; * 入力 acc : 数値															*
075	; *        c : 文字水平位置												  	*
076	; *        b : 文字垂直位置												  	*
077	; *-------------------------------------------------------------------------*
078	put2digit:
079			push	b			; 座標データを退避
080			push	c			;
081			st		c			; 10の位と1の位の値をそれぞれ計算
082			xor		a			; ( acc = acc/10, work1 = acc mod 10 )
083			mov		#10,b		;
084			div					;
085			ld		b			;
086			st		work1		; 1の位の計算結果をwork1に保存
087			ld		c			;
088			pop		c			; 座標値を(c.b)に復帰
089			pop		b			; 
090			push	b			; また退避
091			push	c			;
092			call	putch		; 10の位を表示
093			ld		work1		; 1の位の値を読み込み
094			pop		c			; 座標値を(c,b)に復帰
095			pop		b			; 
096			inc		c			; 表示座標を右へ
097			call	putch		; 1の位を表示
098	
099			ret					; put2digit終わり
100	
101	
102	; *-------------------------------------------------------------------------*
103	; * LCD表示イメージを消去する												*
104	; *-------------------------------------------------------------------------*
105	cls:
106			push	OCR			; OCR値を退避
107			mov		#osc_rc,OCR ; システムクロックを指定
108	
109			mov		#0,XBNK		; 表示用RAMのバンクアドレスを指定(BANK0)
110			call	cls_s		; そのバンク内のデータをクリア
111	
112			mov		#1,XBNK		; 表示用RAMのバンクアドレスを指定(BANK1)
113			call	cls_s		; そのバンク内のデータをクリア
114			pop		OCR			; OCR値を復帰
115			
116			ret					; cls終わり
117			
118	cls_s:						; *** 表示用RAM 1BANK分の消去 ***
119			mov		#80h,r2		; 間接アドレッシングレジスタを表示用RAMの先頭に
120			mov		#80h,b 		; ループカウンタbにループ数をセット
121	loop3:
122			mov		#0,@r2		; アドレスをインクリメントしながら0を書き込む
123			inc		r2			;
124			dbnz	b,loop3		; bが0になるまで繰り返す
125			
126			ret					; cls_s終わり
127			
128	
129	; *-------------------------------------------------------------------------*
130	; * 指定位置に1キャラクタ表示する											*
131	; * 入力 acc : キャラクタコード												*
132	; *        c : 文字水平位置												  	*
133	; *        b : 文字垂直位置												  	*
134	; *-------------------------------------------------------------------------*
135	putch:
136			push	XBNK
137			push	acc
138			call	locate		; 座標から表示RAMのアドレスを計算
139			pop		acc
140			call	put_chara	; 1キャラクタ表示する
141			pop		XBNK
142			
143			ret					; putch終わり
144			
145	
146	locate:	; **** 表示位置指定から表示用RAMのアドレスを計算 ****
147			; ** 入力 c: 水平位置(0〜5) b: 垂直位置(0〜3)
148			; ** 出力 r2: RAMアドレス XBNK: 表示用RAMバンク
149	
150								; *** 表示用RAMバンクアドレスの判断 ***
151			ld		b			; b>=2 のとき next1 へ
152			sub		#2			;
153			bn		PSW,7,next1	;
154			
155			mov		#00h,XBNK	; 表示用RAMのバンクアドレスを指定(BANK0)
156			br		next2
157	next1:
158			st		b
159			mov		#01h,XBNK	; 表示用RAMのバンクアドレスを指定(BANK1)
160	next2:
161	
162								; *** 表示指定位置のRAMアドレス計算 ***
163			ld		b			; b * 40h + c + 80h
164			rol					;
165			rol					;
166			rol					;
167			rol					;
168			rol					;
169			rol					;
170			add		c			;
171			add		#80h		;
172			st		r2			; RAMアドレスをr2に格納
173					
174			ret					; locate終わり
175	
176	
177	put_chara:
178			push	PSW			; PSW値を退避
179			set1	PSW,1		; データRAMバンク1を選択
180	
181								; *** キャラクタデータアドレスの計算 ***
182			rol					; (TRH,TRL) = acc*8 + fontdata
183			rol					;
184			rol					;	
185			add		#low(fontdata)	;
186			st		TRL				;
187			mov		#0,acc			;
188			addc	#high(fontdata)	;
189			st		TRH			;
190	
191			push	OCR			; OCR値を退避
192			mov		#osc_rc,OCR ; システムクロックを指定
193	
194			mov		#0,b		; キャラクタデータ読み出し用オフセット値
195			mov		#4,c		; ループカウンタ
196	loop1:
197			ld		b			; 1ライン目の表示データを読み出す
198			ldc					;
199			inc		b			; 読み出しデータのオフセットを +1
200			st		@r2			; 表示データを表示用RAMに転送
201			ld		r2			; 表示用RAMアドレス +6
202			add		#6			;
203			st		r2			;
204	
205			ld		b			; 2ライン目の表示データを読み出す
206			ldc					;
207			inc		b			; 読み出しデータのオフセットを +1
208			st		@r2			; 表示データを表示用RAMに転送
209			ld		r2			; 表示用RAMアドレス +10
210			add		#10			;
211			st		r2			;
212			
213			dec		c			; ループカウンタのデクリメント
214			ld		c			; 
215			bnz		loop1		; 8ライン分(4回)繰り返し
216	
217			pop		OCR			; OCR値を復帰
218			pop		PSW			; PSW値を復帰
219	
220			ret					; put_chara終わり
221	
222	
223	; *-------------------------------------------------------------------------*
224	; * キャラクタのビットイメージデータ										*
225	; *-------------------------------------------------------------------------*
226	fontdata:
227			db 07ch, 0e6h, 0c6h, 0c6h, 0c6h, 0ceh, 07ch, 000h	;'0' 00 
228			db 018h, 038h, 018h, 018h, 018h, 018h, 03ch, 000h	;'1' 01
229			db 07ch, 0c6h, 0c6h, 00ch, 038h, 060h, 0feh, 000h	;'2' 02
230			db 07ch, 0e6h, 006h, 01ch, 006h, 0e6h, 07ch, 000h	;'3' 03
231			db 00ch, 01ch, 03ch, 06ch, 0cch, 0feh, 00ch, 000h	;'4' 04
232			db 0feh, 0c0h, 0fch, 006h, 006h, 0c6h, 07ch, 000h	;'5' 05
233			db 01ch, 030h, 060h, 0fch, 0c6h, 0c6h, 07ch, 000h	;'6' 06
234			db 0feh, 0c6h, 004h, 00ch, 018h, 018h, 038h, 000h	;'7' 07
235			db 07ch, 0c6h, 0c6h, 07ch, 0c6h, 0c6h, 07ch, 000h	;'8' 08
236			db 07ch, 0c6h, 0c6h, 07eh, 006h, 00ch, 078h, 000h	;'9' 09		
237	
238	
239	; *-------------------------------------------------------------------------*
240	; * ベースタイマ割り込みハンドラ部											*
241	; *-------------------------------------------------------------------------*
242	int_BaseTimer:
243			push	acc			; 使用レジスタを退避
244			inc		counter		; カウンタをインクリメント
245			ld		counter		; カウンタが100になったら..
246			bne		#100,next3	;
247			mov		#0,counter	; カウンタのリセット
248	next3:						;
249			pop		acc			; 退避レジスタを復帰
250			
251			ret					; (ユーザー側)割り込み処理終了

[]   [INDEX]   []

(C)SEGA ENTERPRISES, LTD., 1998