
;---------------------------------------------------------------------
;		ＣＲＡＭ上に１６色キャラクタデータを展開
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;		入力：
;		R0 <= データバンク
;		R1 <= データアドレス
;		R3 <= 展開ライン数 ( ドット単位 1 - 128 )
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;		破壊：
;		ＲＯＭバンクレジスタ
;		プロットオプションレジスタ
;		ＣＲＡＭ 0000h - 0081h
;		ＣＲＡＭ スクリーンベース
;---------------------------------------------------------------------
DEF_CHR

RomBank_WK	equ	080h	;偶数番地であればどこでも

;Ymax_RG		rgs	3
;Flag_RG		rgs	4
;Temp_RG		rgs	4
;Color_RG	rgs	5
;Palet10_RG	rgs	6
;Palet32_RG	rgs	7
;Palet54_RG	rgs	8
;Palet76_RG	rgs	9
;BitCount_RG	rgs	10


		romb
		sm	(RomBank_WK),r0
		move	r14,r1

		ibt	r0,#10001b
		cmode

		ibt	r2,#0

;		パレットの初期化
;---------------------------------------
		iwt	r4,#00F0Fh

		getb
		add	r0
		add	r0
		add	r0
		to	r6
		add	r0

		link	#4
		iwt	r15,#GET_DATA
		getb
		rol

		or	r6

		to	r6
		and	r4

;- - - - - - - - - - - - - - - - - - - -
		getb
		add	r0
		add	r0
		add	r0
		to	r7
		add	r0

		link	#4
		iwt	r15,#GET_DATA
		getb
		rol

		or	r7

		to	r7
		and	r4

;- - - - - - - - - - - - - - - - - - - -
		getb
		add	r0
		add	r0
		add	r0
		to	r8
		add	r0

		link	#4
		iwt	r15,#GET_DATA
		getb
		rol

		or	r8

		to	r8
		and	r4

;- - - - - - - - - - - - - - - - - - - -
		getb

		to	r9
		and	r4

;		プロットバッファの初期化
;---------------------------------------
		sub	r0
		ibt	r1,#0
		ibt	r12,#64

		cache

		move	r13,r15

		stw	(r1)
		inc	r1
		loop
		inc	r1

		dec	r1	; <= 127

;		ビットデータの初期化
;---------------------------------------
		link	#4
		iwt	r15,#GET_DATA
		getb

		ibt	r10,#5

		lsr
		lsr
		iwt	r15,#START_LINE
		lsr

;		区間処理フラグ読み込み
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
FLAG_X1
		bne	Read$
		lsr

		link	#4
		iwt	r15,#GET_DATA
		getb
Read$
		move	r4,r0			;ビットデータ退避

		to	r5
		ldb	(r1)

		bcs	FLAG_11
		dec	r1

;		X ドット区間を伸ばす
;-------------------------------------------------------
FLAG_01
		ldb	(r1)
		cmp	r5
		beq	FLAG_01
		dec	r1
		inc	r1

		move	r13,r15

		from	r5
		stb	(r1)
		loop
		dec	r1

		bpl	SET_GOMA
		alt1
		nop

		bra	PLOT_BUFF2
		inc	r1	;<= 0

;		X ドット区間を縮ます
;-------------------------------------------------------
Zero11
		and	r1
		bra	Loop11
		sub	r0
FLAG_11
		bmi	Zero11
		ldb	(r1)
		cmp	r5
		beq	FLAG_11
		dec	r1
		inc	r1
Loop11
		with	r1
		add	r12

;		ゴマを置く
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
		alt1
SET_GOMA
		stw	(r1)
		move	r0,r4

		db	0ACh		;ibt	LoopCount_RG,#0

;		カウント読み込み
;-------------------------------------------------------
READ_COUNT
		db	0
		ibt	r4,#1
		bra	ReadF$
		dec	r10

;		有効ビット読み込み
;- - - - - - - - - - - - - - - - - - - -
ReadX$
		dec	r10
		bne	Readn$
		lsr

		link	#4
		iwt	r15,#GET_DATA
		getb
Readn$
		bcc	NextBit$

		with	r12
		or	r4

;		次のビット
;- - - - - - - - - - - - - - - - - - - -
NextBit$
		with	r4
		add	r4

;		次のビットが有効か判断
;- - - - - - - - - - - - - - - - - - - -
		dec	r10
ReadF$
		bne	Read$
		lsr

		link	#4
		iwt	r15,#GET_DATA
		getb
Read$
		bcs	ReadX$

;		カウント決定
;- - - - - - - - - - - - - - - - - - - -
SetCount$
		with	r12
		or	r4

;		区間処理フラグ読み込み
;-------------------------------------------------------
READ_FLAG
		moves	r9,r9
		bpl	SHINKUKAN

		dec	r10
		bne	Read$
		lsr

		link	#4
		iwt	r15,#GET_DATA
		getb
Read$
		bcs	FLAG_X1
		dec	r10
FLAG_X0
		bne	Read$
		lsr

		link	#4
		iwt	r15,#GET_DATA
		getb
Read$
		bcs	FLAG_10

;		X 個の区間をそのままにする
;-------------------------------------------------------
FLAG_00
		move	r4,r0

		move	r13,r15

		to	r5
		ldb	(r1)
		dec	r1
Loop$
		bmi	PLOT_BUFF1
		ldb	(r1)
		cmp	r5
		beq	Loop$
		dec	r1

		loop
		inc	r1

		move	r0,r4

		bra	READ_COUNT
		db	0ACh		;ibt	LoopCount_RG,#0

;		ＲＡＭのデータをプロット
;---------------------------------------------------------------------
PLOT_BUFF0
		to	r4		;move
PLOT_BUFF1
		inc	r1	;<= 0
PLOT_BUFF2
		iwt	r12,#128
		move	r13,r15

		ldb	(r1)
		color
		loop
		plot

		inc	r2
		from	r2
		cmp	r3
		bcc	NEXT_LINE
		dec	r1	; <= 127

		rpix
		stop
		nop

;		パレット１３５の色
;---------------------------------------
PALET_High
		to	r5
		swap
		with	r5
		and	#15

;		色をセット
;---------------------------------------
SET_COLOR
		with	r15
SET_COLOR1
		to	r13

		from	r5
		stb	(r1)
		loop
		dec	r1

		bpl	READ_COUNT
		ibt	r12,#0

		bra	PLOT_BUFF0
		with	r0		;move

;		ライン描画開始
;---------------------------------------------------------------------
NEXT_LINE
		move	r0,r4		;ビットデータ復帰
START_LINE
		with	r9
		rol

		dec	r10
		bne	Read$
		lsr

		link	#4
		iwt	r15,#GET_DATA
		getb
Read$
		with	r9
		ror

		iwt	r15,#READ_COUNT
		db	0ACh		;ibt	LoopCount_RG,#0

;		新区間作成
;-------------------------------------------------------
FLAG_10
		dec	r10
SHINKUKAN
		bne	Read$
		lsr

		link	#4
		iwt	r15,#GET_DATA
		getb
Read$
		bcs	PALET_1XX
		dec	r10
PALET_0XX
		bne	Read$
		lsr

		link	#3
		bra	GET_DATA
		getb
Read$
		bcs	PALET_01X
		dec	r10
PALET_00X
		bne	Read$
		lsr

		link	#3
		bra	GET_DATA
		getb
Read$
		bcs	PALET_High
		from	r6

;		パレット０の色
;---------------------------------------
PALET_000
		to	r5
		alt2
		bra	SET_COLOR
		and	r15

;		パレット読み込み
;- - - - - - - - - - - - - - - - - - - -
PALET_1XX
		bne	Read$
		lsr

		link	#3
		bra	GET_DATA
		getb
Read$
		bcs	PALET_11X
		dec	r10
PALET_10X
		bne	Read$
		lsr

		link	#3
		bra	GET_DATA
		getb
Read$
		bcs	PALET_High
		from	r8

;		パレット４の色
;---------------------------------------
PALET_100
		to	r5
		alt2
		bra	SET_COLOR
		and	r15

;		パレット読み込み
;- - - - - - - - - - - - - - - - - - - -
PALET_01X
		bne	Read$
		lsr

		link	#3
		bra	GET_DATA
		getb
Read$
		bcs	PALET_High
		from	r7

;		パレット２の色
;---------------------------------------
PALET_010
		to	r5
		alt2
		bra	SET_COLOR
		and	r15

;		パレット読み込み
;- - - - - - - - - - - - - - - - - - - -
PALET_11X
		bne	Read$
		lsr

		link	#3
		bra	GET_DATA
		getb
Read$
		bcs	PALET_111
		from	r9

;		パレット６の色
;---------------------------------------
PALET_110
		to	r5
		and	#15
		iwt	r15,#SET_COLOR1
		with	r15

;		新しい色
;---------------------------------------
PALET_111
		ibt	r5,#0

		dec	r10
		bne	c8$
		lsr

		link	#3
		bra	GET_DATA
		getb
c8$
		with	r5
		rol

		dec	r10
		bne	c4$
		lsr

		link	#3
		bra	GET_DATA
		getb
c4$
		with	r5
		rol

		dec	r10
		bne	c2$
		lsr

		link	#3
		bra	GET_DATA
		getb
c2$
		with	r5
		rol

		dec	r10
		bne	c1$
		lsr

		link	#3
		bra	GET_DATA
		getb
c1$
		with	r5
		rol
		iwt	r15,#SET_COLOR1
		with	r15


;		ＲＯＭからデータを読む
;-------------------------------------------------------
GET_DATA
		inc	r14
		bne	OK$
		ibt	r10,#8

		lm	r10,(RomBank_WK)
		inc	r10
		from	r10
		sbk

		from	r10
		romb
		ibt	r14,#0
		db	0AAh		;ibt	BitCount_RG,#8
OK$
		db	8

		move	r15,r11
		lsr


;=======================================================================

