; Tab width = 4

;---------------------------------------------------------------------------
; ** LCD表示処理サンプル1 **
;
; 表示用RAMにデータを転送してLCDに単純なパターンを表示する
;----------------------------------------------------------------------------
; 1.01 990208 SEGA Enterprises,LTD.
;----------------------------------------------------------------------------

chip	LC868700			; チップの種類をアセンブラに指定
world	external			; 外部メモリ用プログラム

public	main				; ghead.asm から参照されるシンボル

extern	_game_end			; アプリケーション終了


; **** システム定数の定義 ***************************************************

							; OCR(発振制御レジスタ)設定値
osc_rc		equ 04dh		;	システムクロックに内蔵RC発振を指定
osc_xt		equ 0efh		;	システムクロックに水晶発振を指定


; *** データセグメント ******************************************************

		dseg				; データセグメント開始

r0:		ds		1			; 間接アドレッシングレジスタ r0
r1:		ds		1			; 間接アドレッシングレジスタ r1
r2:		ds		1			; 間接アドレッシングレジスタ r2
r3:		ds		1			; 間接アドレッシングレジスタ r3
		ds		12			; その他のシステム予約レジスタ


; *** コードセグメント ******************************************************

		cseg				; コードセグメント開始

; *-------------------------------------------------------------------------*
; * ユーザープログラム														*
; *-------------------------------------------------------------------------*
main:
		mov		#0f0h,c		; 表示用データ
		call	matrix		; LCDにパターンを表示
		set1	PCON,0		; HALTモードに移行して割り込みを待つ。
							; ベースタイマの割り込みがかかることにより
							; HALTモードは解除され処理が先に進む。

		mov		#00fh,c		; 以下同様に何パターンか表示する
		call	matrix
		set1	PCON,0

		mov		#0cch,c
		call	matrix
		set1	PCON,0

		mov		#033h,c
		call	matrix
		set1	PCON,0

		mov		#055h,c
		call	matrix
		set1	PCON,0

		mov		#0aah,c
		call	matrix
		set1	PCON,0

							; ** [M](モード)ボタンチェック **
		ld		P3
		bn		acc,6,finish ; [M]ボタンが押されていたらアプリ終了

		jmp		main		; 繰り返す

finish:						; ** アプリケーション終了処理 **
		jmp		_game_end	; アプリケーション終了


; *-------------------------------------------------------------------------*
; *	LCD全体にパターンを表示する												*
; * 入力	c: 基本表示パターン												*
; *-------------------------------------------------------------------------*
matrix:						; **** LCD 一面を描く ****

		push	acc			; 各レジスタを退避する
		push	b
		push	c
		push	XBNK

xb0_a:	mov		#000h,XBNK	; 表示用RAMのバンクアドレスを指定(BANK0)
		mov		#080h,b
		 
la1:	ld		c			; c:表示データ
		call	line2		; 2行表示
		ld		b			; 2行先へアドレスを進める
		add		#010h		;
		st		b			;
		bnz		la1			; バンクの終端まで繰り返し
		
xb1_a:	mov		#001h,XBNK	; 表示用RAMのバンクアドレスを指定(BANK1)
		mov		#080h,b

la2:	ld		c			; c:表示データ
		call	line2		; 2行表示
		ld		b			; 2行先へアドレスを進める
		add		#010h		;
		st		b			;
		bnz		la2			; バンクの終端まで繰り返し

		pop		XBNK		; 退避レジスタの復帰
		pop		c
		pop		b
		pop		acc

		ret					; matrix終了


line2:						; **** LCD 2行分表示 ****

		push	acc			; 各レジスタを退避する
		push	b			;
		push	c			;
		push	PSW			;
		push	OCR			;
		mov		#osc_rc,OCR	; システムクロックを指定
		set1	PSW,1		; データRAMバンク1を選択
		st		c			; 表示データを c に退避
		ld		b			; 表示用RAMアドレスを、r2にセット
		st		r2			;

lp1:						; **** 1行目表示処理 ****
		ld		c			; 表示データを表示用RAMに転送
		st		@r2			;
		inc		r2			; 次の表示位置にアドレスを移動
		ld		r2
		and		#00fh		; 表示位置が 1行目右端にくるまで..
		xor		#006h		; 
		bnz		lp1			; 繰り返し
		
		ld		c			; cレジスタのビットパターンを反転する
		xor		#0ffh		;
		st c				;

lp2:						; **** 2行目表示処理 ****
		ld		c			; 表示データを表示用RAMに転送
		st		@r2			;
		inc		r2			; 次の表示位置にアドレスを移動
		ld		r2			;
		and		#00fh		; 表示位置が 2行目右端にくるまで..
		xor		#00ch		;
		bnz		lp2			; 繰り返し

		pop		OCR			; 退避レジスタを復帰
		pop		PSW			;
		pop		c			;
		pop		b			;
		pop		acc			;
		
		ret					; line2終了

		end
