misc/bgcstest.s
;========================================================================================
;  bgcstest.s
;  Copyright (C) 2003-2026 Makoto Kamada
;
;  This file is part of the XEiJ (X68000 Emulator in Java).
;  You can use, modify and redistribute the XEiJ if the conditions are met.
;  Read the XEiJ License for more details.
;  https://stdkmd.net/xeij/
;========================================================================================

	.include	control2.mac
	.include	doscall.mac
	.include	iocscall.mac
	.include	misc.mac
	.include	sprc.equ
	.include	vicon.equ

dPARAM	reg	d7			;引数

;引数を読み取る
	addq.l	#1,a2
	moveq.l	#0,dPARAM
	moveq.l	#7-1,d1
	for	d1
		do
			move.b	(a2)+,d0
			if	eq
				pea.l	usage
				DOS	_PRINT
				addq.l	#4,sp
				goto	exit
			endif
		whileor	<cmp.b #'0',d0>,lo,<cmp.b #'1',d0>,hi
		if	<cmp.b #'1',d0>,eq
			bset.l	d1,dPARAM
		endif
	next

;sizeに応じてスプライト画面を初期化する
	if	<btst.l #6,dPARAM>,eq	;8x8
		moveq.l	#2,d1			;256x256 1024x1024x16
	else				;16x16
		moveq.l	#0,d1			;512x512 1024x1024x16
	endif
	IOCS	_CRTMOD
	IOCS	_SP_INIT
	IOCS	_SP_ON
;		  SP TX GR G4 G3 G2 G1
	move.w	#%01_00_10_11_10_01_00,d1	;TX>SP>GR
	IOCS	_PRIORITY

;スーパーバイザモード
	supervisormode

;cs0のtext0を$0FFBで埋め尽くす
	andi.w	#.notw.$0400,SPRC_CONTROL	;mpucs=0
	lea.l	SPRC_TEXT_0,a0
	move.w	#$0FFB,d0
	move.w	#64*64-1,d1
	for	d1
		move.w	d0,(a0)+
	next

;cs0のtext1を$0FFCで埋め尽くす
	andi.w	#.notw.$0400,SPRC_CONTROL	;mpucs=0
	lea.l	SPRC_TEXT_1,a0
	move.w	#$0FFC,d0
	move.w	#64*64-1,d1
	for	d1
		move.w	d0,(a0)+
	next

;cs1のtext0を$0FFDで埋め尽くす
	ori.w	#$0400,SPRC_CONTROL	;mpucs=1
	lea.l	SPRC_TEXT_0,a0
	move.w	#$0FFD,d0
	move.w	#64*64-1,d1
	for	d1
		move.w	d0,(a0)+
	next

;cs1のtext1を$0FFEで埋め尽くす
	ori.w	#$0400,SPRC_CONTROL	;mpucs=1
	lea.l	SPRC_TEXT_1,a0
	move.w	#$0FFE,d0
	move.w	#64*64-1,d1
	for	d1
		move.w	d0,(a0)+
	next

;sizeに応じてcs0のパターン$FB~$FFに異なるパターンを設定する
	andi.w	#.notw.$0400,SPRC_CONTROL	;mpucs=0
	if	<btst.l #6,dPARAM>,eq	;8x8
		lea.l	SPRC_PATTERN+4*8*$FB,a0
		lea.l	pattern_8x8_FB,a1
		moveq.l	#8*5-1,d1
		for	d1
			move.l	(a1)+,(a0)+
		next
	else				;16x16
		lea.l	SPRC_PATTERN+4*32*$FB,a0
		lea.l	pattern_16x16_FB,a1
		move.w	#32*5-1,d1
		for	d1
			move.l	(a1)+,(a0)+
		next
	endif

;パレットブロック$Fを設定する
	lea.l	VICON_TSPALET+2*16*$F,a0
	lea.l	palet,a1
	moveq.l	#16-1,d1
	for	d1
		move.w	(a1)+,(a0)+
	next

;$00EB0808 bit5-0にb1cs b1tx b1on b0cs b0tx b0onを設定する
	moveq.l	#63,d0
	and.w	dPARAM,d0
	or.w	#SPRC_SPRITE_ON,d0
	move.w	d0,SPRC_CONTROL

;ユーザーモード
	usermode

;引数を表示する
	lea.l	-16(sp),sp
	movea.l	sp,a0
	moveq.l	#7-1,d1
	for	d1
		moveq.l	#'0',d0
		if	<btst.l d1,d7>,ne
			moveq.l	#'1',d0
		endif
		move.b	d0,(a0)+
	next
	move.b	#13,(a0)+
	move.b	#10,(a0)+
	clr.b	(a0)
	move.l	sp,-(sp)
	DOS	_PRINT
	lea.l	4+16(sp),sp

;終了
exit:
	DOS	_EXIT

;パターン8x8
pattern_8x8_FB:
;8x8 $FB
	.dc.l	$BBBBBBBB
	.dc.l	$BBBBBBB0
	.dc.l	$BBBBBB00
	.dc.l	$BBBBB000
	.dc.l	$BBBB0000
	.dc.l	$BBB00000
	.dc.l	$BB000000
	.dc.l	$B0000000
;8x8 $FC
	.dc.l	$CCCCCCCC
	.dc.l	$0CCCCCCC
	.dc.l	$00CCCCCC
	.dc.l	$000CCCCC
	.dc.l	$0000CCCC
	.dc.l	$00000CCC
	.dc.l	$000000CC
	.dc.l	$0000000C
;8x8 $FD
	.dc.l	$D0000000
	.dc.l	$DD000000
	.dc.l	$DDD00000
	.dc.l	$DDDD0000
	.dc.l	$DDDDD000
	.dc.l	$DDDDDD00
	.dc.l	$DDDDDDD0
	.dc.l	$DDDDDDDD
;8x8 $FE
	.dc.l	$0000000E
	.dc.l	$000000EE
	.dc.l	$00000EEE
	.dc.l	$0000EEEE
	.dc.l	$000EEEEE
	.dc.l	$00EEEEEE
	.dc.l	$0EEEEEEE
	.dc.l	$EEEEEEEE
;8x8 $FF
	.dc.l	$00000000
	.dc.l	$0F000F00
	.dc.l	$00F0F000
	.dc.l	$000F0000
	.dc.l	$00F0F000
	.dc.l	$0F000F00
	.dc.l	$00000000
	.dc.l	$00000000

;パターン16x16
pattern_16x16_FB:
;16x16 $FB
;左
  .rept 8
	.dc.l	$BBBBBBBB
  .endm
	.dc.l	$BBBBBBBB
	.dc.l	$BBBBBBB0
	.dc.l	$BBBBBB00
	.dc.l	$BBBBB000
	.dc.l	$BBBB0000
	.dc.l	$BBB00000
	.dc.l	$BB000000
	.dc.l	$B0000000
;右
	.dc.l	$BBBBBBBB
	.dc.l	$BBBBBBB0
	.dc.l	$BBBBBB00
	.dc.l	$BBBBB000
	.dc.l	$BBBB0000
	.dc.l	$BBB00000
	.dc.l	$BB000000
	.dc.l	$B0000000
  .rept 8
	.dc.l	$00000000
  .endm
;16x16 $FC
;左
	.dc.l	$CCCCCCCC
	.dc.l	$0CCCCCCC
	.dc.l	$00CCCCCC
	.dc.l	$000CCCCC
	.dc.l	$0000CCCC
	.dc.l	$00000CCC
	.dc.l	$000000CC
	.dc.l	$0000000C
  .rept 8
	.dc.l	$00000000
  .endm
;右
  .rept 8
	.dc.l	$CCCCCCCC
  .endm
	.dc.l	$CCCCCCCC
	.dc.l	$0CCCCCCC
	.dc.l	$00CCCCCC
	.dc.l	$000CCCCC
	.dc.l	$0000CCCC
	.dc.l	$00000CCC
	.dc.l	$000000CC
	.dc.l	$0000000C
;16x16 $FD
;左
	.dc.l	$D0000000
	.dc.l	$DD000000
	.dc.l	$DDD00000
	.dc.l	$DDDD0000
	.dc.l	$DDDDD000
	.dc.l	$DDDDDD00
	.dc.l	$DDDDDDD0
	.dc.l	$DDDDDDDD
  .rept 8
	.dc.l	$DDDDDDDD
  .endm
;右
  .rept 8
	.dc.l	$00000000
  .endm
	.dc.l	$D0000000
	.dc.l	$DD000000
	.dc.l	$DDD00000
	.dc.l	$DDDD0000
	.dc.l	$DDDDD000
	.dc.l	$DDDDDD00
	.dc.l	$DDDDDDD0
	.dc.l	$DDDDDDDD
;16x16 $FE
;左
  .rept 8
	.dc.l	$00000000
  .endm
	.dc.l	$0000000E
	.dc.l	$000000EE
	.dc.l	$00000EEE
	.dc.l	$0000EEEE
	.dc.l	$000EEEEE
	.dc.l	$00EEEEEE
	.dc.l	$0EEEEEEE
	.dc.l	$EEEEEEEE
;右
	.dc.l	$0000000E
	.dc.l	$000000EE
	.dc.l	$00000EEE
	.dc.l	$0000EEEE
	.dc.l	$000EEEEE
	.dc.l	$00EEEEEE
	.dc.l	$0EEEEEEE
	.dc.l	$EEEEEEEE
  .rept 8
	.dc.l	$EEEEEEEE
  .endm
;16x16 $FF
;左
	.dc.l	$00000000
	.dc.l	$00F00000
	.dc.l	$0FFF0000
	.dc.l	$00FFF000
	.dc.l	$000FFF00
	.dc.l	$0000FFF0
	.dc.l	$00000FFF
	.dc.l	$000000FF
	.dc.l	$00000FFF
	.dc.l	$0000FFF0
	.dc.l	$000FFF00
	.dc.l	$00FFF000
	.dc.l	$0FFF0000
	.dc.l	$00F00000
	.dc.l	$00000000
	.dc.l	$00000000
;右
	.dc.l	$00000000
	.dc.l	$0000F000
	.dc.l	$000FFF00
	.dc.l	$00FFF000
	.dc.l	$0FFF0000
	.dc.l	$FFF00000
	.dc.l	$FF000000
	.dc.l	$F0000000
	.dc.l	$FF000000
	.dc.l	$FFF00000
	.dc.l	$0FFF0000
	.dc.l	$00FFF000
	.dc.l	$000FFF00
	.dc.l	$0000F000
	.dc.l	$00000000
	.dc.l	$00000000

;パレット
palet:
	dchsv	0,0,0			;$0
	dchsv	0,0,0			;$1
	dchsv	0,0,0			;$2
	dchsv	0,0,0			;$3
	dchsv	0,0,0			;$4
	dchsv	0,0,0			;$5
	dchsv	0,0,0			;$6
	dchsv	0,0,0			;$7
	dchsv	0,0,0			;$8
	dchsv	0,0,0			;$9
	dchsv	0,0,0			;$A
	dchsv	128,31,16		;$B 青
	dchsv	96,31,16		;$C 水
	dchsv	64,31,16		;$D 緑
	dchsv	32,31,16		;$E 黄
	dchsv	0,31,16			;$F 赤

;使用法
usage:
	.dc.b	'BG chip select test',13,10
	.dc.b	'usage: bgcstest.x size b1cs b1tx b1on b0cs b0tx b0on',13,10
	.dc.b	'  size  0=8x8    1=16x16  pattern size',13,10
	.dc.b	'  b1cs  0=PCS0   1=PCS1   chip select for text used by BG1',13,10
	.dc.b	'  b1tx  0=TEXT0  1=TEXT1  text used by BG1',13,10
	.dc.b	'  b1on  0=OFF    1=ON     whether to display BG1',13,10
	.dc.b	'  b0cs  0=PCS0   1=PCS1   chip select for text used by BG0',13,10
	.dc.b	'  b0tx  0=TEXT0  1=TEXT1  text used by BG0',13,10
	.dc.b	'  b0on  0=OFF    1=ON     whether to display BG0',13,10
	.dc.b	'colors:',13,10
	.dc.b	'  blue    PCS0 TEXT0',13,10
	.dc.b	'  cyan    PCS0 TEXT1',13,10
	.dc.b	'  green   PCS1 TEXT0',13,10
	.dc.b	'  yellow  PCS1 TEXT1',13,10
	.dc.b	'  red     full pattern memory is not available',13,10
	.dc.b	0