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

;----------------------------------------------------------------
;	名前
;		rtcledtest.x
;	機能
;		RTCのカウンタとTIMERとPOWERの点滅が揃っていることを確認します
;	環境
;		X680x0シリーズ全機種およびエミュレータ
;		Timer-Cが標準の設定(50us*200)で動作していること
;	操作
;		A>rtcledtest.x
;		RTCのカウンタとTIMERとPOWERの点滅が揃っていることを確認します
;		電源スイッチをOFFにしてください
;		(ここでキーを押すと終了します)
;		画面とTIMERとPOWERの点滅が揃っているか目視で確認し、
;		電源スイッチをONにしてください
;		(ここでキーを押しても終了しません)
;		終了します
;		A>
;----------------------------------------------------------------

	.include	bioswork.equ
	.include	control2.mac
	.include	doscall.mac
	.include	iocscall.mac
	.include	mfp.equ
	.include	misc.mac
	.include	ppi.equ
	.include	rtc.equ
	.include	vector.equ

;レジスタ
dT	reg	d7	;テンポラリ

;ウェイト
aPPIA	reg	a5
	lea.l	PPI_PORT_A,aPPIA
wait	.macro
		tst.b	(aPPIA)
		tst.b	(aPPIA)
	.endm

;RTCアクセス
aRTC	reg	a6
	lea.l	RTC_0_ONE_SECOND,aRTC
rtc	reg	-RTC_0_ONE_SECOND(aRTC)
read_rtc	.macro	src,dst
		moveq.l	#$0F,dst
		and.b	(src)rtc,dst
		wait
	.endm
write_rtc	.macro	src,dst
		move.b	src,(dst)rtc
		wait
	.endm

;モード
mode_clear	.macro	mask
		read_rtc	RTC_MODE,dT
		and.b	#.notb.(mask),dT
		write_rtc	dT,RTC_MODE
	.endm
mode_set	.macro	mask
		read_rtc	RTC_MODE,dT
		or.b	#(mask),dT
		write_rtc	dT,RTC_MODE
	.endm
bank_0	.macro
		mode_clear	RTC_MODE_BANK_MASK
	.endm
bank_1	.macro
		mode_set	RTC_MODE_BANK_MASK
	.endm

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

;割り込み回数をクリア
	clr.b	count
;電源スイッチ割り込みを保存
	move.l	OFFSET_MFP_POWER.w,-(sp)
;電源スイッチ割り込みを設定
	move.l	#power_interrupt,OFFSET_MFP_POWER.w
;電源スイッチのアクティブエッジをON→OFFに
	bset.b	#MFP_G_POWER_BIT,MFP_AER

;タイトル
	lea.l	title_message,a1
	IOCS	_B_PRINT

;電源スイッチがOFFになるまで待つ
	do
	;キーが押されたら終了
		IOCS	_B_KEYSNS
		if	<tst.l d0>,ne
			IOCS	_B_KEYINP
			goto	<tst.b d0>,ne,abort
		endif
	while	<tst.b count>,eq

;開始
	lea.l	start_message,a1
	IOCS	_B_PRINT

;TIMER(CLKOUT)を1Hzで点滅
	bank_1
	write_rtc	#5,RTC_1_CLKOUT
;POWER(ALARM)を1Hzで点滅
	bank_0
	write_rtc	#RTC_RESET_16HZ_MASK,RTC_RESET

;電源スイッチがONになるまで繰り返す
	do

	;1秒カウンタが変化するまで待つ
		bank_0
		read_rtc	RTC_0_ONE_SECOND,d0
		do
			read_rtc	RTC_0_ONE_SECOND,d1
		while	<cmp.b d0,d1>,eq

	;白
		lea.l	while_message,a1
		IOCS	_B_PRINT

	;0.5秒待つ
		move.w	BIOS_TC_MINUTE_COUNTER.w,d0
		do
			move.w	d0,d1
			sub.w	BIOS_TC_MINUTE_COUNTER.w,d1
			if	lo
				add.w	BIOS_TC_MINUTE_PERIOD.w,d1
			endif
		while	<cmp.w #50,d1>,lo

	;黒
		lea.l	black_message,a1
		IOCS	_B_PRINT

	while	<cmpi.b #2,count>,lo

;終了
	lea.l	end_message,a1
	IOCS	_B_PRINT

abort:

;TIMER(CLKOUT)を消灯
	bank_1
	write_rtc	#7,RTC_1_CLKOUT
	bank_0

;電源スイッチのアクティブエッジをON→OFFに
	bset.b	#MFP_G_POWER_BIT,MFP_AER
;電源スイッチ割り込みを復元
	move.l	(sp)+,OFFSET_MFP_POWER.w

;ユーザモード
	usermode

;終了
	DOS	_EXIT

;電源スイッチ割り込み
power_interrupt:
;割り込み回数を増やす
	addq.b	#1,count
;電源スイッチのアクティブエッジを反転
	bchg.b	#MFP_G_POWER_BIT,MFP_AER
	rte

;メッセージ
title_message:
	.dc.b	'RTCのカウンタとTIMERとPOWERの点滅が揃っていることを確認します',13,10
	.dc.b	'電源スイッチをOFFにしてください',13,10
	.dc.b	'(ここでキーを押すと終了します)',13,10,0
start_message:
	.dc.b	27,'[>5h'		;カーソルOFF
	.dc.b	'画面とTIMERとPOWERの点滅が揃っているか目視で確認し、',13,10
	.dc.b	'電源スイッチをONにしてください',13,10
	.dc.b	'(ここでキーを押しても終了しません)',13,10,0
while_message:
	.dc.b	27,'[7m','        ',27,'[7m',13,0	;反転
black_message:
	.dc.b	'        ',13,0
end_message:
	.dc.b	27,'[>5l'		;カーソルON
	.dc.b	'終了します',13,10,0

	.bss

;割り込み回数
count:
	.ds.b	1