このサンプルでは、LCD(XRAM)に“SEGA 1998”という文字を表示させます。
内蔵のフォントはアプリケーションから利用できないので、表示させるフォントパターンをあらかじめ用意する必要があります。
メインルーチンのB,Cレジスタで指定した座標に指定のフォントパターンを書き込むputchを呼び出します。フォント情報は、222行目以降に8×8ドットのデータを持たせています。
001 ; Tab width = 4 002 003 ;---------------------------------------------------------------------------- 004 ; ** LCD表示処理サンプル2 ** 005 ; 006 ; ・表示用RAMを0でフィルして表示イメージを消去する 007 ; ・キャラクタパターンを指定位置に表示する 008 ;---------------------------------------------------------------------------- 009 ; 1.01 990208 SEGA Enterprises,LTD. 010 ;---------------------------------------------------------------------------- 011 012 chip LC868700 ; チップの種類をアセンブラに指定 013 world external ; 外部メモリ用プログラム 014 015 public main ; 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 027 ; *** データセグメント ****************************************************** 028 029 dseg ; データセグメント開始 030 031 r0: ds 1 ; 間接アドレッシングレジスタ r0 032 r1: ds 1 ; 間接アドレッシングレジスタ r1 033 r2: ds 1 ; 間接アドレッシングレジスタ r2 034 r3: ds 1 ; 間接アドレッシングレジスタ r3 035 ds 12 ; その他のシステム予約レジスタ 036 037 038 ; *** コードセグメント ****************************************************** 039 040 cseg ; コードセグメント開始 041 042 ; *-------------------------------------------------------------------------* 043 ; * ユーザープログラム * 044 ; *-------------------------------------------------------------------------* 045 main: 046 call cls ; LCD表示イメージを消去する 047 048 mov #1,c ; 水平座標 049 mov #1,b ; 垂直座標 050 mov #0ah,acc ; キャラクタコード 'S' 051 call putch ; 一文字表示 052 053 mov #2,c 054 mov #1,b 055 mov #0bh,acc ; 'E' 056 call putch 057 058 mov #3,c 059 mov #1,b 060 mov #0ch,acc ; 'G' 061 call putch 062 063 mov #4,c 064 mov #1,b 065 mov #0dh,acc ; 'A' 066 call putch 067 068 mov #1,c 069 mov #2,b 070 mov #1,acc ; '1' 071 call putch 072 073 mov #2,c 074 mov #2,b 075 mov #9,acc ; '9' 076 call putch 077 078 mov #3,c 079 mov #2,b 080 mov #9,acc ; '9' 081 call putch 082 083 mov #4,c 084 mov #2,b 085 mov #8,acc ; '8' 086 call putch 087 088 loop0: ; ** [M](モード)ボタンチェック ** 089 ld P3 090 bn acc,6,finish ; [M]ボタンが押されていたらアプリ終了 091 092 jmp loop0 ; ループして待つ 093 094 finish: ; ** アプリケーション終了処理 ** 095 jmp _game_end ; アプリケーション終了 096 097 098 ; *-------------------------------------------------------------------------* 099 ; * LCD表示イメージを消去する * 100 ; *-------------------------------------------------------------------------* 101 cls: 102 push OCR ; OCR値を退避 103 mov #osc_rc,OCR ; システムクロックを指定 104 105 mov #0,XBNK ; 表示用RAMのバンクアドレスを指定(BANK0) 106 call cls_s ; そのバンク内のデータをクリア 107 108 mov #1,XBNK ; 表示用RAMのバンクアドレスを指定(BANK1) 109 call cls_s ; そのバンク内のデータをクリア 110 pop OCR ; OCR値を復帰 111 112 ret ; cls終わり 113 114 cls_s: ; *** 表示用RAM 1BANK分の消去 *** 115 mov #80h,r2 ; 間接アドレッシングレジスタを表示用RAMの先頭に 116 mov #80h,b ; ループカウンタbにループ数をセット 117 loop3: 118 mov #0,@r2 ; アドレスをインクリメントしながら0を書き込む 119 inc r2 ; 120 dbnz b,loop3 ; bが0になるまで繰り返す 121 122 ret ; cls_s終わり 123 124 125 ; *-------------------------------------------------------------------------* 126 ; * 指定位置に1キャラクタ表示する * 127 ; * 入力 acc : キャラクタコード * 128 ; * c : 文字水平位置 * 129 ; * b : 文字垂直位置 * 130 ; *-------------------------------------------------------------------------* 131 putch: 132 push XBNK 133 push acc 134 call locate ; 座標から表示RAMのアドレスを計算 135 pop acc 136 call put_chara ; 1キャラクタ表示する 137 pop XBNK 138 139 ret ; putch終わり 140 141 142 locate: ; **** 表示位置指定から表示用RAMのアドレスを計算 **** 143 ; ** 入力 c: 水平位置(0〜5) b: 垂直位置(0〜3) 144 ; ** 出力 r2: RAMアドレス XBNK: 表示用RAMバンク 145 146 ; *** 表示用RAMバンクアドレスの判断 *** 147 ld b ; b>=2 のとき next1 へ 148 sub #2 ; 149 bn PSW,7,next1 ; 150 151 mov #00h,XBNK ; 表示用RAMのバンクアドレスを指定(BANK0) 152 br next2 153 next1: 154 st b 155 mov #01h,XBNK ; 表示用RAMのバンクアドレスを指定(BANK1) 156 next2: 157 158 ; *** 表示指定位置のRAMアドレス計算 *** 159 ld b ; b * 40h + c + 80h 160 rol ; 161 rol ; 162 rol ; 163 rol ; 164 rol ; 165 rol ; 166 add c ; 167 add #80h ; 168 st r2 ; RAMアドレスをr2に格納 169 170 ret ; locate終わり 171 172 173 put_chara: 174 push PSW ; PSW値を退避 175 set1 PSW,1 ; データRAMバンク1を選択 176 177 ; *** キャラクタデータアドレスの計算 *** 178 rol ; (TRH,TRL) = acc*8 + fontdata 179 rol ; 180 rol ; 181 add #low(fontdata) ; 182 st TRL ; 183 mov #0,acc ; 184 addc #high(fontdata) ; 185 st TRH ; 186 187 push OCR ; OCR値を退避 188 mov #osc_rc,OCR ; システムクロックを指定 189 190 mov #0,b ; キャラクタデータ読み出し用オフセット値 191 mov #4,c ; ループカウンタ 192 loop1: 193 ld b ; 1ライン目の表示データを読み出す 194 ldc ; 195 inc b ; 読み出しデータのオフセットを +1 196 st @r2 ; 表示データを表示用RAMに転送 197 ld r2 ; 表示用RAMアドレス +6 198 add #6 ; 199 st r2 ; 200 201 ld b ; 2ライン目の表示データを読み出す 202 ldc ; 203 inc b ; 読み出しデータのオフセットを +1 204 st @r2 ; 表示データを表示用RAMに転送 205 ld r2 ; 表示用RAMアドレス +10 206 add #10 ; 207 st r2 ; 208 209 dec c ; ループカウンタのデクリメント 210 ld c ; 211 bnz loop1 ; 8ライン分(4回)繰り返し 212 213 pop OCR ; OCR値を復帰 214 pop PSW ; PSW値を復帰 215 216 ret ; put_chara終わり 217 218 219 ; *-------------------------------------------------------------------------* 220 ; * キャラクタのビットイメージデータ * 221 ; *-------------------------------------------------------------------------* 222 fontdata: 223 db 07ch, 0e6h, 0c6h, 0c6h, 0c6h, 0ceh, 07ch, 000h ;'0' 00 224 db 018h, 038h, 018h, 018h, 018h, 018h, 03ch, 000h ;'1' 01 225 db 07ch, 0c6h, 0c6h, 00ch, 038h, 060h, 0feh, 000h ;'2' 02 226 db 07ch, 0e6h, 006h, 01ch, 006h, 0e6h, 07ch, 000h ;'3' 03 227 db 00ch, 01ch, 03ch, 06ch, 0cch, 0feh, 00ch, 000h ;'4' 04 228 db 0feh, 0c0h, 0fch, 006h, 006h, 0c6h, 07ch, 000h ;'5' 05 229 db 01ch, 030h, 060h, 0fch, 0c6h, 0c6h, 07ch, 000h ;'6' 06 230 db 0feh, 0c6h, 004h, 00ch, 018h, 018h, 038h, 000h ;'7' 07 231 db 07ch, 0c6h, 0c6h, 07ch, 0c6h, 0c6h, 07ch, 000h ;'8' 08 232 db 07ch, 0c6h, 0c6h, 07eh, 006h, 00ch, 078h, 000h ;'9' 09 233 234 db 07ch, 0e6h, 076h, 038h, 0dch, 0ceh, 07ch, 000h ;'S' 0a 235 db 0feh, 0c0h, 0c0h, 0f8h, 0c0h, 0c0h, 0feh, 000h ;'E' 0b 236 db 07ch, 0e6h, 0c0h, 0dch, 0c6h, 0e6h, 07ch, 000h ;'G' 0c 237 db 01eh, 036h, 066h, 0c6h, 0c6h, 0feh, 0c6h, 000h ;'A' 0d
[←] | [INDEX] | [→] |
(C)SEGA ENTERPRISES, LTD., 1998