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