シリアルインターフェイスを使って、0〜99のデータを送信します。
![]() シリアル通信は、水晶発振で動作させてください。 |
受信は、次に掲載されいる「シリアル通信(受信側)」で行ってください。
53行目ではローバッテリ自動検出を禁止しています。実体は158行目以降のBattChkOnとBattChkOffです。
56行目では、シリアルインターフェイスの初期化を行っています。初期化の実体は95行目以降のルーチンです。非常に手間がかかるので、このロジックをそのままコピーして利用することをお勧めします。
初期化を行った後は、0.5秒ごとに発生するベースタイマー割り込みでカウンタをインクリメントします。このカウンタの数値をシリアルインターフェイスで送信します。
MODEボタンによりプログラムが中断されると、シリアルインターフェイスを規定の値に書き戻し(126行目からのSioEndルーチン)、ローバッテリ自動検出を有効にしてプログラムを終了します。
●GHEAD.ASM
●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 ; ・一定期間ごとにシリアル通信ポートから単純なデータを送信する 007 ;---------------------------------------------------------------------------- 008 ; 1.01 990208 SEGA Enterprises,LTD. 009 ;---------------------------------------------------------------------------- 010 011 chip LC868700 ; チップの種類をアセンブラに指定 012 world external ; 外部メモリ用プログラム 013 014 public main ; ghead.asm から参照されるシンボル 015 public int_BaseTimer ; ghead.asm から参照されるシンボル 016 017 extern _game_end ; アプリケーション終了 018 019 020 ; **** システム定数の定義 *************************************************** 021 022 ; OCR(発振制御レジスタ)設定値 023 osc_rc equ 04dh ; システムクロックに内蔵RC発振を指定 024 osc_xt equ 0efh ; システムクロックに水晶発振を指定 025 026 LowBattChk equ 06eh ; ローバッテリ検出フラグ(RAMバンク0) 027 028 029 ; *** データセグメント ****************************************************** 030 031 dseg ; データセグメント開始 032 033 r0: ds 1 ; 間接アドレッシングレジスタ r0 034 r1: ds 1 ; 間接アドレッシングレジスタ r1 035 r2: ds 1 ; 間接アドレッシングレジスタ r2 036 r3: ds 1 ; 間接アドレッシングレジスタ r3 037 ds 12 ; その他のレジスタ 038 039 counter: ds 1 ; カウンタ 040 041 042 ; *** コードセグメント ****************************************************** 043 044 cseg ; コードセグメント開始 045 046 ; *-------------------------------------------------------------------------* 047 ; * ユーザープログラム * 048 ; *-------------------------------------------------------------------------* 049 main: 050 push PSW ; PSW値を退避 051 set1 PSW,1 ; データRAMバンク1を選択 052 053 call BattChkOff ; ローバッテリ自動検出機能 OFF 054 055 cwait: 056 call SioInit ; シリアル通信の初期化 057 bz start ; VM が接続されていればスタート 058 059 ld P3 ; [M]ボタンチェック 060 bn acc,6,finish ; [M]ボタンが押されていたらアプリ終了 061 062 jmp cwait ; VM が接続されるまで待機 063 start: 064 065 set1 pcon,0 ; 次の割り込みまで(0.5秒)HALTで待つ 066 067 mov #0,counter ; カウンタの値を0にリセット 068 loop0: 069 ld counter ; カウンタの値を読み込む 070 071 call SioSend1 ; 1byte送信する 072 073 set1 pcon,0 ; 次の割り込みまで(0.5秒)HALTで待つ 074 075 ; ** [M](モード)ボタンチェック ** 076 ld P3 077 bn acc,6,finish ; [M]ボタンが押されていたらアプリ終了 078 079 jmp loop0 ; 繰り返し 080 081 finish: ; ** アプリケーション終了処理 ** 082 call SioEnd ; シリアル通信終了処理 083 call BattChkOn ; ローバッテリ自動検出機能 ON 084 pop PSW ; PSW値を復帰 085 jmp _game_end ; アプリケーション終了 086 087 ; *-------------------------------------------------------------------------* 088 ; * シリアル通信の初期化 * 089 ; * 出力: acc = 0 : 正常終了 * 090 ; * acc = 0ffh: VM が接続されていない * 091 ; *-------------------------------------------------------------------------* 092 ; シリアル通信の初期化 093 ; システムクロックが水晶モードであることを前提としています。 094 095 SioInit: 096 ; **** VM同士の接続を確認 **** 097 ld P7 ; 接続状態の確認 098 and #%00001101 ; P70, P72, P73 をチェック 099 sub #%00001000 ; P70=0, P72=0, P73=1 か判定 100 bz next2 ; 接続されているときnext2へ 101 102 mov #0ffh,acc ; 接続されていないとき acc=0ffh として異常終了 103 ret ; SioInit終わり 104 next2: 105 106 ; **** シリアル通信の初期化 **** 107 mov #0,SCON0 ; LSBを先頭に出力するよう指定 108 mov #0,SCON1 ; LSBを先頭に入力するよう指定 109 mov #088h,SBR ; 転送レートを設定する 110 clr1 P1,0 ; P10ラッチをクリア(P10/SO0) 111 clr1 P1,2 ; P12ラッチをクリア(P12/SCK0) 112 clr1 P1,3 ; P13ラッチをクリア(P13/SO1) 113 114 mov #%00000101,P1FCR ; 端子機能設定 115 mov #%00000101,P1DDR ; 端子機能設定 116 117 mov #0,SBUF0 ; 転送バッファクリア 118 mov #0,SBUF1 ; 転送バッファクリア 119 120 ret ; SioInit終わり 121 122 123 ; *-------------------------------------------------------------------------* 124 ; * シリアル通信の終了 * 125 ; *-------------------------------------------------------------------------* 126 SioEnd: ; **** シリアル通信終了処理 **** 127 128 mov #0,SCON0 ; SCON0 = 0 129 mov #0, SCON1 ; SCON1 = 0 130 mov #0bfh,P1FCR ; P1FCR = 0bfh 131 mov #0a4h,P1DDR ; P1DDR = 0a4h 132 133 ret ; SioEnd終わり 134 135 136 ; *-------------------------------------------------------------------------* 137 ; * シリアルポートから1byte送信する * 138 ; * 入力 acc: 送信データ * 139 ; *-------------------------------------------------------------------------* 140 SioSend1: ; **** 1byte送信する **** 141 142 push acc ; 送信データの退避 143 144 sslp1: ld SCON0 ; 前のデータの送信中なら待つ 145 bp acc,3,sslp1 ; 146 147 pop acc ; 送信データの復帰 148 149 st SBUF0 ; 転送するデータをセットする 150 set1 SCON0,3 ; 送信開始 151 152 ret ; SioSend1終わり 153 154 155 ; *-------------------------------------------------------------------------* 156 ; * ローバッテリ自動検出機能 ON * 157 ; *-------------------------------------------------------------------------* 158 BattChkOn: 159 push PSW ; PSW値を退避 160 161 clr1 PSW,1 ; データRAMバンク0を選択 162 mov #0,acc ; ローバッテリ検出をする(0) 163 st LowBattChk ; ローバッテリ自動検出フラグ(RAMバンク0) 164 165 pop PSW ; PSW値を復帰 166 ret ; BattChkOn終わり 167 168 169 ; *-------------------------------------------------------------------------* 170 ; * ローバッテリ自動検出機能 OFF * 171 ; *-------------------------------------------------------------------------* 172 BattChkOff: 173 push PSW ; PSW値を退避 174 175 clr1 PSW,1 ; データRAMバンク0を選択 176 mov #0ffh,acc ; ローバッテリ検出をしない(0ffh) 177 st LowBattChk ; ローバッテリ自動検出フラグ(RAMバンク0) 178 179 pop PSW ; PSW値を復帰 180 ret ; BattChkOff終わり 181 182 183 ; *-------------------------------------------------------------------------* 184 ; * ベースタイマ割り込みハンドラ * 185 ; *-------------------------------------------------------------------------* 186 int_BaseTimer: 187 push PSW ; PSW値を退避 188 push acc 189 190 set1 PSW,1 ; データRAMバンク1を選択 191 192 inc counter ; カウンタを進める 193 194 ld counter ; カウンタの値が.. 195 bne #100,next1 ; 100でなければnext1 196 mov #0,counter ; 100ならば0にリセット 197 next1: 198 pop acc 199 pop PSW ; PSW値復帰 200 201 clr1 BTCR,1 ; ベースタイマ割り込み要因クリア 202 ret ; ユーザー側割り込み処理終了
[←] | [INDEX] | [→] |
(C)SEGA ENTERPRISES, LTD., 1998