--- nono/exp/fmovemc.php 2026/04/29 17:05:28 1.1.1.3 +++ nono/exp/fmovemc.php 2026/04/29 17:05:36 1.1.1.4 @@ -29,6 +29,7 @@ .xref hexstr_long .include doscall.mac + .include iocscall.mac .list .cpu 68030 @@ -38,16 +39,6 @@ PRINT .macro msg addq.l #4,sp .endm -SET_FLINE_TRAP .macro - move.l (a5),a4 - lea.l fline_handler(pc),a1 - move.l a1,(a5) - .endm - -RESTORE_FLINE_TRAP .macro - move.l a4,(a5) - .endm - .text .even start: @@ -61,7 +52,6 @@ start: // a0/a1 work // a3 検査対象命令の次の位置 (Fライン例外から戻るのに使用) // a4 元のFライン例外ハンドラ置き場 - // a5 Fライン例外ベクタの位置 $002c ?> - start2: clr.l -(sp) DOS _SUPER - movem.l d7/a3-a5,-(sp) + movem.l d7/a3-a4,-(sp) ; rough argument check cmpi.b #4,(a2)+ ; strlen(arg)>=4 ? bcs @f @@ -629,9 +616,6 @@ disp_hard: disp_easy: PRINT msg_easy @@: - - moveq.l #$2c,d0 ; alternate of "lea.l $2c,a5" - move.l d0,a5 ; $text) { // FPcr が1つもないケースは hard の時だけ実行。 @@ -646,7 +630,7 @@ disp_easy: } } ?> - movem.l (sp)+,d7/a3-a5 + movem.l (sp)+,d7/a3-a4 DOS _EXIT ; 結果表示 @@ -676,6 +660,28 @@ result: unlk a6 rts +; Fライン例外をテスト用のものに差し替える。 +; 変更前のアドレスを a4 に格納する。 +; a1 は破壊する。 +set_fline: + movem.l d0-d1,-(sp) + moveq.l #$b,d1 + lea.l fline_handler(pc),a1 + IOCS _B_INTVCS + movea.l d0,a4 + movem.l (sp)+,d0-d1 + rts + +; Fライン例外を元に戻す。 +; a1 は破壊する。 +restore_fline: + movem.l d0-d1,-(sp) + moveq.l #$b,d1 + movea.l a4,a1 + IOCS _B_INTVCS + movem.l (sp)+,d0-d1 + rts + ; Fライン例外ハンドラ ; a3 に戻りアドレスをセットしてあること ; d7 を 1 にして帰る @@ -691,11 +697,11 @@ msg_fail_notrap: .dc.b $9,"FAIL: trap ex msg_fail_trap: .dc.b $9,"FAIL: unexpected trap occured",$d,$a,0 msg_ok: .dc.b $9,"ok",$d,$a,0 -msg_fail: .dc.b $9,"fail",$d,$a,0 msg_fail_cr: .dc.b $9,"FAIL: fpcr expects ",0 msg_fail_sr: .dc.b $9,"FAIL: fpsr expects ",0 msg_fail_ir: .dc.b $9,"FAIL: fpiar expects ",0 msg_fail_addr: .dc.b $9,"FAIL: an expects ",0 +msg_fail_dst: .dc.b $9,"FAIL: dst expects ",0 msg_but: .dc.b " but ",0 msg_crlf: .dc.b $d,$a,0