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