6-2 LCDキャラクタパターン表示


このサンプルでは、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