ベースタイマーからかかる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
●B_TIMER1.ASM001 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
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