misc/mfpdstest.s
;========================================================================================
;  mfpdstest.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/
;========================================================================================

;----------------------------------------------------------------
;	名前
;		mfpdstest.x
;	機能
;		MFPのTCDRにDSが反映されているか確認する
;	環境
;		X680x0シリーズ全機種およびエミュレータ
;		FLOATn.Xが組み込まれていること
;		Timer-Cが標準の設定(50us*200)で動作していること
;	操作
;		A>mfpdstest.x
;		pppp pppp pppp pppp pppp pppp pppp pppp pppp 
;		pppp pppp pppp pppp pppp pppp pppp pppp pppp 
;		72 passed, 0 failed
;		A>
;----------------------------------------------------------------

	.include	control2.mac
	.include	doscall.mac
	.include	fefunc.mac
	.include	mfp.equ
	.include	misc.mac
	.include	push2.mac
	.include	sysport.equ

d1ST	reg	d3	;TCDRの値1st
d2ND	reg	d4	;TCDRの値2nd
d3RD	reg	d5	;TCDRの値3rd
dCOND	reg	d6	;条件。-1=X68000,0=X68030でIOLDSなし,1=X68030でIOLDSあり
dLOOP	reg	d7	;ループ回数-1
aFAIL	reg	a1	;失敗数
aLIST	reg	a2	;ポートリストポインタ
aLOG	reg	a3	;ログポインタ
aPASS	reg	a4	;成功数
aPORT	reg	a5	;ポートアドレス
aTCDR	reg	a6	;TCDRアドレス

;スーパーバイザモード
	clr.l	-(sp)
	DOS	_SUPER
	move.l	d0,(sp)
;準備
	suba.l	aFAIL,aFAIL		;失敗数
	lea.l	port_list(pc),aLIST	;ポートリストポインタ
	lea.l	log(pc),aLOG		;ログポインタ
	suba.l	aPASS,aPASS		;成功数
	lea.l	MFP_TCDR,aTCDR		;TCDRアドレス
;ポートループ
	dostart
		movea.l	d0,aPORT
		move.w	(aLIST)+,dCOND		;0=X68030でIOLDSなし,1=X68030でIOLDSあり
		if	<cmpi.b #$DC,SYSPORT_MODEL>,ne	;X68000
			moveq.l	#-1,dCOND		;-1=X68000
		endif
		lea.l	pattern_1(pc),a0	;パターン1
		bsr	test
		lea.l	pattern_2(pc),a0	;パターン2
		bsr	test
		lea.l	pattern_3(pc),a0	;パターン3
		bsr	test
		lea.l	pattern_4(pc),a0	;パターン4
		bsr	test
		move.b	#' ',(aLOG)+
		lea.l	linebreak(pc),a0
		if	<cmpa.l a0,aLIST>,eq
			move.b	#13,(aLOG)+
			move.b	#10,(aLOG)+
		endif
	start
		move.l	(aLIST)+,d0
	while	pl
;ユーザモード
	DOS	_SUPER
	addq.l	#4,sp
;表示
	lea.l	-16(sp),sp
	move.b	#13,(aLOG)+
	move.b	#10,(aLOG)+
	clr.b	(aLOG)
	pea.l	log(pc)
	DOS	_PRINT
	movea.l	sp,a0
	move.l	aPASS,d0
	FPACK	__LTOS
	move.l	sp,-(sp)
	DOS	_PRINT
	pea.l	passed(pc)
	DOS	_PRINT
	move.l	aFAIL,d0
	movea.l	sp,a0
	FPACK	__LTOS
	move.l	sp,-(sp)
	DOS	_PRINT
	pea.l	failed(pc)
	DOS	_PRINT
	lea.l	4+4+4+4+4+16(sp),sp
;終了
	DOS	_EXIT

;テスト
;<a0.l:パターンアドレス
test:
	push	d0-d1
	moveq.l	#1,dLOOP
	dostart
		break	<tst.l dLOOP>,mi
		add.l	dLOOP,dLOOP
		addq.w	#1,dLOOP
	start
		jsr	(a0)
		swap.w	d0
		move.b	d1ST,d0
		sub.b	d3RD,d0			;1st→3rd
		if	lo
			add.b	#200,d0
		endif
	while	<cmp.b #20,d0>,lo
	swap.w	d0
	sub.b	d2ND,d1ST		;1st→2nd
	if	lo
		add.b	#200,d1ST
	endif
	sub.b	d3RD,d2ND		;2nd→3rd
	if	lo
		add.b	#200,d2ND
	endif
	cmp.b	d1ST,d2ND		;(2nd→3rd)-(1st→2nd)
	slo.b	d1			;観測。0=2ndは1st寄り,-1=2ndは3rd寄り
	if	<cmp.b d0,d1>,eq	;成功
		addq.l	#1,aPASS
		move.b	#'p',(aLOG)+
	else				;失敗
		addq.l	#1,aFAIL
		move.b	#'f',(aLOG)+
	endif
	pop
	rts

;パターン1
;	-1=X68000のとき2ndは3rd寄り
;	0=X68030でIOLDSなしのとき2ndは1st寄り
;	1=X68030でIOLDSありのとき2ndは1st寄り
;>d0.b:条件。0=2ndは1st寄り,-1=2ndは3rd寄り
pattern_1:
	di
	tst.b	(aTCDR)
	move.b	(aTCDR),d1ST
	move.l	dLOOP,d0
	forlong	d0
		movea.l	a0,a0
	next
	move.b	(aTCDR),d2ND
	move.b	(aTCDR),d3RD
	ei
	tst.w	dCOND
	smi.b	d0
	rts

;パターン2
;	-1=X68000のとき2ndは3rd寄り
;	0=X68030でIOLDSなしのとき2ndは1st寄り
;	1=X68030でIOLDSありのとき2ndは1st寄り
;>d0.b:条件。0=2ndは1st寄り,-1=2ndは3rd寄り
pattern_2:
	di
	tst.b	(aTCDR)
	move.b	(aTCDR),d1ST
	tst.w	(aPORT)
	move.l	dLOOP,d0
	forlong	d0
		movea.l	a0,a0
	next
	move.b	(aTCDR),d2ND
	move.b	(aTCDR),d3RD
	ei
	tst.w	dCOND
	smi.b	d0
	rts

;パターン3
;	-1=X68000のとき2ndは3rd寄り
;	0=X68030でIOLDSなしのとき2ndは1st寄り
;	1=X68030でIOLDSありのとき2ndは3rd寄り
;>d0.b:条件。0=2ndは1st寄り,-1=2ndは3rd寄り
pattern_3:
	di
	tst.b	(aTCDR)
	move.b	(aTCDR),d1ST
	move.l	dLOOP,d0
	forlong	d0
		movea.l	a0,a0
	next
	tst.w	(aPORT)
	move.b	(aTCDR),d2ND
	move.b	(aTCDR),d3RD
	ei
	tst.w	dCOND
	sne.b	d0
	rts

;パターン4
;	-1=X68000のとき2ndは3rd寄り
;	0=X68030でIOLDSなしのとき2ndは1st寄り
;	1=X68030でIOLDSありのとき2ndは3rd寄り
;>d0.b:条件。0=2ndは1st寄り,-1=2ndは3rd寄り
pattern_4:
	di
	tst.b	(aTCDR)
	move.b	(aTCDR),d1ST
	tst.w	(aPORT)
	move.l	dLOOP,d0
	forlong	d0
		movea.l	a0,a0
	next
	tst.w	(aPORT)
	move.b	(aTCDR),d2ND
	move.b	(aTCDR),d3RD
	ei
	tst.w	dCOND
	sne.b	d0
	rts

;ポートリスト
;	ポートアドレスとIOLDSの有無
PORT	.macro	address,iolds
	.dc.l	address
	.dc.w	iolds
	.endm
port_list:
	PORT	$00C00000,0	;GVRAM
	PORT	$00E00000,0	;TVRAM
	PORT	$00E80028,0	;CRTC R20
	PORT	$00E82000,0	;VCN PALETTE
	PORT	$00E84000,0	;DMA 0 CSR/CER
;	PORT	$00E86000,0	;SVS
	PORT	$00E88000,1	;MFP GPDR
	PORT	$00E8A000,1	;RTC ONESEC/CLKOUT
	PORT	$00E8C000,0	;PRN READY
	PORT	$00E8E000,0	;SYS CONTRAST
linebreak:
	PORT	$00E90002,1	;OPM STATUS
	PORT	$00E92000,1	;PCM STATUS
	PORT	$00E94000,1	;FDC STATUS
	PORT	$00E9602C,1	;HDC RESET(GHOST)/SPC STATUS
	PORT	$00E98000,1	;SCC B REGISTER
	PORT	$00E9A000,1	;PPI A
	PORT	$00E9C000,1	;IOI STATUS
	PORT	$00EB0800,0	;SPR BG0X
	PORT	$00ED0000,0	;SRAM
	.dc.l	-1

passed:
	.dc.b	' passed, ',0
failed:
	.dc.b	' failed',13,10,0

	.bss
log:
	.ds.b	200