--- nono/exp/fmovemn.has 2026/04/29 17:04:28 1.1.1.1 +++ nono/exp/fmovemn.has 2026/04/29 17:05:28 1.1.1.3 @@ -1,11 +1,31 @@ ; ; nono -; Copyright (C) 2019 isaki@NetBSD.org +; Copyright (C) 2020 nono project ; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; 1. Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; +; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +; BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +; AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +; SUCH DAMAGE. ; How to compile: -; > has fmovem_n.has -; > hlk fmovem_n.o si_util.o +; > has fmovemn.has +; > hlk fmovemn.o si_util.o .xref hexstr_long .include doscall.mac @@ -30,6 +50,9 @@ RESTORE_FLINE_TRAP .macro .text .even +start: + bra start2 + test_fmovem_dn_to_fpn_pred_sta: PRINT msg_fmovem_dn_to_fpn_pred_sta SET_FLINE_TRAP @@ -268,22 +291,6 @@ test_fmovem_anpd_to_fpn_pred_sta: PRINT msg_oktrap rts -test_fmovem_imm_to_fpn_pred_sta: - PRINT msg_fmovem_imm_to_fpn_pred_sta - SET_FLINE_TRAP - moveq.l #0,d7 - lea.l @f,a3 - .dc.w $f23c, $c060 -@@: - RESTORE_FLINE_TRAP - tst.l d7 - bne @f - PRINT msg_fail_notrap - rts -@@: - PRINT msg_oktrap - rts - test_fmovem_dn_to_fpn_pred_dyn: PRINT msg_fmovem_dn_to_fpn_pred_dyn SET_FLINE_TRAP @@ -524,22 +531,6 @@ test_fmovem_anpd_to_fpn_pred_dyn: PRINT msg_oktrap rts -test_fmovem_imm_to_fpn_pred_dyn: - PRINT msg_fmovem_imm_to_fpn_pred_dyn - SET_FLINE_TRAP - moveq.l #0,d7 - lea.l @f,a3 - .dc.w $f23c, $c860 -@@: - RESTORE_FLINE_TRAP - tst.l d7 - bne @f - PRINT msg_fail_notrap - rts -@@: - PRINT msg_oktrap - rts - test_fmovem_dn_to_fpn_ctrl_sta: PRINT msg_fmovem_dn_to_fpn_ctrl_sta SET_FLINE_TRAP @@ -778,22 +769,6 @@ test_fmovem_anpd_to_fpn_ctrl_sta: PRINT msg_oktrap rts -test_fmovem_imm_to_fpn_ctrl_sta: - PRINT msg_fmovem_imm_to_fpn_ctrl_sta - SET_FLINE_TRAP - moveq.l #0,d7 - lea.l @f,a3 - .dc.w $f23c, $d060 -@@: - RESTORE_FLINE_TRAP - tst.l d7 - bne @f - PRINT msg_fail_notrap - rts -@@: - PRINT msg_oktrap - rts - test_fmovem_dn_to_fpn_ctrl_dyn: PRINT msg_fmovem_dn_to_fpn_ctrl_dyn SET_FLINE_TRAP @@ -1034,22 +1009,6 @@ test_fmovem_anpd_to_fpn_ctrl_dyn: PRINT msg_oktrap rts -test_fmovem_imm_to_fpn_ctrl_dyn: - PRINT msg_fmovem_imm_to_fpn_ctrl_dyn - SET_FLINE_TRAP - moveq.l #0,d7 - lea.l @f,a3 - .dc.w $f23c, $d860 -@@: - RESTORE_FLINE_TRAP - tst.l d7 - bne @f - PRINT msg_fail_notrap - rts -@@: - PRINT msg_oktrap - rts - test_fmovem_fpn_to_dn_pred_sta: PRINT msg_fmovem_fpn_to_dn_pred_sta SET_FLINE_TRAP @@ -1209,22 +1168,6 @@ test_fmovem_fpn_to_anpd_pred_sta: @@: rts -test_fmovem_fpn_to_imm_pred_sta: - PRINT msg_fmovem_fpn_to_imm_pred_sta - SET_FLINE_TRAP - moveq.l #0,d7 - lea.l @f,a3 - .dc.w $f23c, $e060 -@@: - RESTORE_FLINE_TRAP - tst.l d7 - bne @f - PRINT msg_fail_notrap - rts -@@: - PRINT msg_oktrap - rts - test_fmovem_fpn_to_dn_pred_dyn: PRINT msg_fmovem_fpn_to_dn_pred_dyn SET_FLINE_TRAP @@ -1386,22 +1329,6 @@ test_fmovem_fpn_to_anpd_pred_dyn: @@: rts -test_fmovem_fpn_to_imm_pred_dyn: - PRINT msg_fmovem_fpn_to_imm_pred_dyn - SET_FLINE_TRAP - moveq.l #0,d7 - lea.l @f,a3 - .dc.w $f23c, $e860 -@@: - RESTORE_FLINE_TRAP - tst.l d7 - bne @f - PRINT msg_fail_notrap - rts -@@: - PRINT msg_oktrap - rts - test_fmovem_fpn_to_dn_ctrl_sta: PRINT msg_fmovem_fpn_to_dn_ctrl_sta SET_FLINE_TRAP @@ -1561,22 +1488,6 @@ test_fmovem_fpn_to_anpd_ctrl_sta: @@: rts -test_fmovem_fpn_to_imm_ctrl_sta: - PRINT msg_fmovem_fpn_to_imm_ctrl_sta - SET_FLINE_TRAP - moveq.l #0,d7 - lea.l @f,a3 - .dc.w $f23c, $f060 -@@: - RESTORE_FLINE_TRAP - tst.l d7 - bne @f - PRINT msg_fail_notrap - rts -@@: - PRINT msg_oktrap - rts - test_fmovem_fpn_to_dn_ctrl_dyn: PRINT msg_fmovem_fpn_to_dn_ctrl_dyn SET_FLINE_TRAP @@ -1738,22 +1649,6 @@ test_fmovem_fpn_to_anpd_ctrl_dyn: @@: rts -test_fmovem_fpn_to_imm_ctrl_dyn: - PRINT msg_fmovem_fpn_to_imm_ctrl_dyn - SET_FLINE_TRAP - moveq.l #0,d7 - lea.l @f,a3 - .dc.w $f23c, $f860 -@@: - RESTORE_FLINE_TRAP - tst.l d7 - bne @f - PRINT msg_fail_notrap - rts -@@: - PRINT msg_oktrap - rts - test_fmovem_nofpn: PRINT msg_fmovem_nofpn lea.l initdata(pc),a0 @@ -1831,62 +1726,82 @@ test_fmovem_illegal_dyn: @@: rts -start: +start2: clr.l -(sp) DOS _SUPER movem.l d6-d7/a2-a5,-(sp) moveq.l #$2c,d0 ; alternate of "lea.l $2c,a5" move.l d0,a5 ; + moveq.l #0,d0 + fmove.l d0,fpcr ; Init FPCR, especially round mode and round prec. + + ; rough argument check + ;moveq.l #0,d0 ; d0 is already cleared. + cmpi.b #4,(a2)+ ; strlen(arg)<4 ? + bcs @f + cmpi.l #$68617264,(a2) ; "hard" + seq.b d0 +@@: + tst.b d0 + bne hardmode +easymode: + PRINT msg_easy + bsr test_fmovem_anin_to_fpn_ctrl_sta + bsr test_fmovem_anpi_to_fpn_ctrl_sta + bsr test_fmovem_anin_to_fpn_ctrl_dyn + bsr test_fmovem_anpi_to_fpn_ctrl_dyn + bsr test_fmovem_fpn_to_anpd_pred_sta + bsr test_fmovem_fpn_to_anpd_pred_dyn + bsr test_fmovem_fpn_to_anin_ctrl_sta + bsr test_fmovem_fpn_to_anin_ctrl_dyn + bra done + +hardmode: + PRINT msg_hard bsr test_fmovem_dn_to_fpn_pred_sta bsr test_fmovem_an_to_fpn_pred_sta bsr test_fmovem_anin_to_fpn_pred_sta bsr test_fmovem_anpi_to_fpn_pred_sta bsr test_fmovem_anpd_to_fpn_pred_sta - bsr test_fmovem_imm_to_fpn_pred_sta bsr test_fmovem_dn_to_fpn_pred_dyn bsr test_fmovem_an_to_fpn_pred_dyn bsr test_fmovem_anin_to_fpn_pred_dyn bsr test_fmovem_anpi_to_fpn_pred_dyn bsr test_fmovem_anpd_to_fpn_pred_dyn - bsr test_fmovem_imm_to_fpn_pred_dyn bsr test_fmovem_dn_to_fpn_ctrl_sta bsr test_fmovem_an_to_fpn_ctrl_sta bsr test_fmovem_anin_to_fpn_ctrl_sta bsr test_fmovem_anpi_to_fpn_ctrl_sta bsr test_fmovem_anpd_to_fpn_ctrl_sta - bsr test_fmovem_imm_to_fpn_ctrl_sta bsr test_fmovem_dn_to_fpn_ctrl_dyn bsr test_fmovem_an_to_fpn_ctrl_dyn bsr test_fmovem_anin_to_fpn_ctrl_dyn bsr test_fmovem_anpi_to_fpn_ctrl_dyn bsr test_fmovem_anpd_to_fpn_ctrl_dyn - bsr test_fmovem_imm_to_fpn_ctrl_dyn bsr test_fmovem_fpn_to_dn_pred_sta bsr test_fmovem_fpn_to_an_pred_sta bsr test_fmovem_fpn_to_anin_pred_sta bsr test_fmovem_fpn_to_anpi_pred_sta bsr test_fmovem_fpn_to_anpd_pred_sta - bsr test_fmovem_fpn_to_imm_pred_sta bsr test_fmovem_fpn_to_dn_pred_dyn bsr test_fmovem_fpn_to_an_pred_dyn bsr test_fmovem_fpn_to_anin_pred_dyn bsr test_fmovem_fpn_to_anpi_pred_dyn bsr test_fmovem_fpn_to_anpd_pred_dyn - bsr test_fmovem_fpn_to_imm_pred_dyn bsr test_fmovem_fpn_to_dn_ctrl_sta bsr test_fmovem_fpn_to_an_ctrl_sta bsr test_fmovem_fpn_to_anin_ctrl_sta bsr test_fmovem_fpn_to_anpi_ctrl_sta bsr test_fmovem_fpn_to_anpd_ctrl_sta - bsr test_fmovem_fpn_to_imm_ctrl_sta bsr test_fmovem_fpn_to_dn_ctrl_dyn bsr test_fmovem_fpn_to_an_ctrl_dyn bsr test_fmovem_fpn_to_anin_ctrl_dyn bsr test_fmovem_fpn_to_anpi_ctrl_dyn bsr test_fmovem_fpn_to_anpd_ctrl_dyn - bsr test_fmovem_fpn_to_imm_ctrl_dyn bsr test_fmovem_nofpn bsr test_fmovem_illegal_dyn + +done: movem.l (sp)+,d6-d7/a2-a5 DOS _EXIT @@ -1999,6 +1914,8 @@ srcdata: zerodata: .dc.l $0, $0, $0 +msg_hard: .dc.b "hard mode",$d,$a,0 +msg_easy: .dc.b "easy mode",$d,$a,0 msg_oktrap: .dc.b $9,"ok(trap)",$d,$a,0, 0,0 msg_fail_notrap: .dc.b $9,"FAIL: trap expected but not occured",$d,$a,0 msg_fail_trap: .dc.b $9,"FAIL: unexpected trap occured",$d,$a,0 @@ -2018,60 +1935,52 @@ msg_fail_addr: .dc.b $9,"FAIL: an expect msg_but: .dc.b " but ",0 msg_crlf: .dc.b $d,$a,0 -msg_fmovem_dn_to_fpn_pred_sta: .dc.b "fmovem_dn_to_fpn_pred_sta",0 -msg_fmovem_an_to_fpn_pred_sta: .dc.b "fmovem_an_to_fpn_pred_sta",0 -msg_fmovem_anin_to_fpn_pred_sta: .dc.b "fmovem_anin_to_fpn_pred_sta",0 -msg_fmovem_anpi_to_fpn_pred_sta: .dc.b "fmovem_anpi_to_fpn_pred_sta",0 -msg_fmovem_anpd_to_fpn_pred_sta: .dc.b "fmovem_anpd_to_fpn_pred_sta",0 -msg_fmovem_imm_to_fpn_pred_sta: .dc.b "fmovem_imm_to_fpn_pred_sta",0 -msg_fmovem_dn_to_fpn_pred_dyn: .dc.b "fmovem_dn_to_fpn_pred_dyn",0 -msg_fmovem_an_to_fpn_pred_dyn: .dc.b "fmovem_an_to_fpn_pred_dyn",0 -msg_fmovem_anin_to_fpn_pred_dyn: .dc.b "fmovem_anin_to_fpn_pred_dyn",0 -msg_fmovem_anpi_to_fpn_pred_dyn: .dc.b "fmovem_anpi_to_fpn_pred_dyn",0 -msg_fmovem_anpd_to_fpn_pred_dyn: .dc.b "fmovem_anpd_to_fpn_pred_dyn",0 -msg_fmovem_imm_to_fpn_pred_dyn: .dc.b "fmovem_imm_to_fpn_pred_dyn",0 -msg_fmovem_dn_to_fpn_ctrl_sta: .dc.b "fmovem_dn_to_fpn_ctrl_sta",0 -msg_fmovem_an_to_fpn_ctrl_sta: .dc.b "fmovem_an_to_fpn_ctrl_sta",0 -msg_fmovem_anin_to_fpn_ctrl_sta: .dc.b "fmovem_anin_to_fpn_ctrl_sta",0 -msg_fmovem_anpi_to_fpn_ctrl_sta: .dc.b "fmovem_anpi_to_fpn_ctrl_sta",0 -msg_fmovem_anpd_to_fpn_ctrl_sta: .dc.b "fmovem_anpd_to_fpn_ctrl_sta",0 -msg_fmovem_imm_to_fpn_ctrl_sta: .dc.b "fmovem_imm_to_fpn_ctrl_sta",0 -msg_fmovem_dn_to_fpn_ctrl_dyn: .dc.b "fmovem_dn_to_fpn_ctrl_dyn",0 -msg_fmovem_an_to_fpn_ctrl_dyn: .dc.b "fmovem_an_to_fpn_ctrl_dyn",0 -msg_fmovem_anin_to_fpn_ctrl_dyn: .dc.b "fmovem_anin_to_fpn_ctrl_dyn",0 -msg_fmovem_anpi_to_fpn_ctrl_dyn: .dc.b "fmovem_anpi_to_fpn_ctrl_dyn",0 -msg_fmovem_anpd_to_fpn_ctrl_dyn: .dc.b "fmovem_anpd_to_fpn_ctrl_dyn",0 -msg_fmovem_imm_to_fpn_ctrl_dyn: .dc.b "fmovem_imm_to_fpn_ctrl_dyn",0 -msg_fmovem_fpn_to_dn_pred_sta: .dc.b "fmovem_fpn_to_dn_pred_sta",0 -msg_fmovem_fpn_to_an_pred_sta: .dc.b "fmovem_fpn_to_an_pred_sta",0 -msg_fmovem_fpn_to_anin_pred_sta: .dc.b "fmovem_fpn_to_anin_pred_sta",0 -msg_fmovem_fpn_to_anpi_pred_sta: .dc.b "fmovem_fpn_to_anpi_pred_sta",0 -msg_fmovem_fpn_to_anpd_pred_sta: .dc.b "fmovem_fpn_to_anpd_pred_sta",0 -msg_fmovem_fpn_to_imm_pred_sta: .dc.b "fmovem_fpn_to_imm_pred_sta",0 -msg_fmovem_fpn_to_dn_pred_dyn: .dc.b "fmovem_fpn_to_dn_pred_dyn",0 -msg_fmovem_fpn_to_an_pred_dyn: .dc.b "fmovem_fpn_to_an_pred_dyn",0 -msg_fmovem_fpn_to_anin_pred_dyn: .dc.b "fmovem_fpn_to_anin_pred_dyn",0 -msg_fmovem_fpn_to_anpi_pred_dyn: .dc.b "fmovem_fpn_to_anpi_pred_dyn",0 -msg_fmovem_fpn_to_anpd_pred_dyn: .dc.b "fmovem_fpn_to_anpd_pred_dyn",0 -msg_fmovem_fpn_to_imm_pred_dyn: .dc.b "fmovem_fpn_to_imm_pred_dyn",0 -msg_fmovem_fpn_to_dn_ctrl_sta: .dc.b "fmovem_fpn_to_dn_ctrl_sta",0 -msg_fmovem_fpn_to_an_ctrl_sta: .dc.b "fmovem_fpn_to_an_ctrl_sta",0 -msg_fmovem_fpn_to_anin_ctrl_sta: .dc.b "fmovem_fpn_to_anin_ctrl_sta",0 -msg_fmovem_fpn_to_anpi_ctrl_sta: .dc.b "fmovem_fpn_to_anpi_ctrl_sta",0 -msg_fmovem_fpn_to_anpd_ctrl_sta: .dc.b "fmovem_fpn_to_anpd_ctrl_sta",0 -msg_fmovem_fpn_to_imm_ctrl_sta: .dc.b "fmovem_fpn_to_imm_ctrl_sta",0 -msg_fmovem_fpn_to_dn_ctrl_dyn: .dc.b "fmovem_fpn_to_dn_ctrl_dyn",0 -msg_fmovem_fpn_to_an_ctrl_dyn: .dc.b "fmovem_fpn_to_an_ctrl_dyn",0 -msg_fmovem_fpn_to_anin_ctrl_dyn: .dc.b "fmovem_fpn_to_anin_ctrl_dyn",0 -msg_fmovem_fpn_to_anpi_ctrl_dyn: .dc.b "fmovem_fpn_to_anpi_ctrl_dyn",0 -msg_fmovem_fpn_to_anpd_ctrl_dyn: .dc.b "fmovem_fpn_to_anpd_ctrl_dyn",0 -msg_fmovem_fpn_to_imm_ctrl_dyn: .dc.b "fmovem_fpn_to_imm_ctrl_dyn",0 -msg_fmovem_nofpn: .dc.b "fmovem_nofpn",0 -msg_fmovem_illegal_dyn: .dc.b "fmovem_illegal_dyn",0 +msg_fmovem_dn_to_fpn_pred_sta: .dc.b "fmovem.l d0,fplist",0 +msg_fmovem_an_to_fpn_pred_sta: .dc.b "fmovem.l a0,fplist",0 +msg_fmovem_anin_to_fpn_pred_sta: .dc.b "fmovem.l (a0),fplist",0 +msg_fmovem_anpi_to_fpn_pred_sta: .dc.b "fmovem.l (a0)+,fplist",0 +msg_fmovem_anpd_to_fpn_pred_sta: .dc.b "fmovem.l -(a0),fplist",0 +msg_fmovem_dn_to_fpn_pred_dyn: .dc.b "fmovem.l d0,d6",0 +msg_fmovem_an_to_fpn_pred_dyn: .dc.b "fmovem.l a0,d6",0 +msg_fmovem_anin_to_fpn_pred_dyn: .dc.b "fmovem.l (a0),d6",0 +msg_fmovem_anpi_to_fpn_pred_dyn: .dc.b "fmovem.l (a0)+,d6",0 +msg_fmovem_anpd_to_fpn_pred_dyn: .dc.b "fmovem.l -(a0),d6",0 +msg_fmovem_dn_to_fpn_ctrl_sta: .dc.b "fmovem.l d0,fplist",0 +msg_fmovem_an_to_fpn_ctrl_sta: .dc.b "fmovem.l a0,fplist",0 +msg_fmovem_anin_to_fpn_ctrl_sta: .dc.b "fmovem.l (a0),fplist",0 +msg_fmovem_anpi_to_fpn_ctrl_sta: .dc.b "fmovem.l (a0)+,fplist",0 +msg_fmovem_anpd_to_fpn_ctrl_sta: .dc.b "fmovem.l -(a0),fplist",0 +msg_fmovem_dn_to_fpn_ctrl_dyn: .dc.b "fmovem.l d0,d6",0 +msg_fmovem_an_to_fpn_ctrl_dyn: .dc.b "fmovem.l a0,d6",0 +msg_fmovem_anin_to_fpn_ctrl_dyn: .dc.b "fmovem.l (a0),d6",0 +msg_fmovem_anpi_to_fpn_ctrl_dyn: .dc.b "fmovem.l (a0)+,d6",0 +msg_fmovem_anpd_to_fpn_ctrl_dyn: .dc.b "fmovem.l -(a0),d6",0 +msg_fmovem_fpn_to_dn_pred_sta: .dc.b "fmovem.l fplist,d0",0 +msg_fmovem_fpn_to_an_pred_sta: .dc.b "fmovem.l fplist,a0",0 +msg_fmovem_fpn_to_anin_pred_sta: .dc.b "fmovem.l fplist,(a0)",0 +msg_fmovem_fpn_to_anpi_pred_sta: .dc.b "fmovem.l fplist,(a0)+",0 +msg_fmovem_fpn_to_anpd_pred_sta: .dc.b "fmovem.l fplist,-(a0)",0 +msg_fmovem_fpn_to_dn_pred_dyn: .dc.b "fmovem.l d6,d0",0 +msg_fmovem_fpn_to_an_pred_dyn: .dc.b "fmovem.l d6,a0",0 +msg_fmovem_fpn_to_anin_pred_dyn: .dc.b "fmovem.l d6,(a0)",0 +msg_fmovem_fpn_to_anpi_pred_dyn: .dc.b "fmovem.l d6,(a0)+",0 +msg_fmovem_fpn_to_anpd_pred_dyn: .dc.b "fmovem.l d6,-(a0)",0 +msg_fmovem_fpn_to_dn_ctrl_sta: .dc.b "fmovem.l fplist,d0",0 +msg_fmovem_fpn_to_an_ctrl_sta: .dc.b "fmovem.l fplist,a0",0 +msg_fmovem_fpn_to_anin_ctrl_sta: .dc.b "fmovem.l fplist,(a0)",0 +msg_fmovem_fpn_to_anpi_ctrl_sta: .dc.b "fmovem.l fplist,(a0)+",0 +msg_fmovem_fpn_to_anpd_ctrl_sta: .dc.b "fmovem.l fplist,-(a0)",0 +msg_fmovem_fpn_to_dn_ctrl_dyn: .dc.b "fmovem.l d6,d0",0 +msg_fmovem_fpn_to_an_ctrl_dyn: .dc.b "fmovem.l d6,a0",0 +msg_fmovem_fpn_to_anin_ctrl_dyn: .dc.b "fmovem.l d6,(a0)",0 +msg_fmovem_fpn_to_anpi_ctrl_dyn: .dc.b "fmovem.l d6,(a0)+",0 +msg_fmovem_fpn_to_anpd_ctrl_dyn: .dc.b "fmovem.l d6,-(a0)",0 +msg_fmovem_nofpn: .dc.b "fmovem.l nofpn,(a0)",0 +msg_fmovem_illegal_dyn: .dc.b "fmovem.l (a0),d6_illegal",0 .data .even workarea: .ds.b 24 -buf: .dc.b 64 +buf: .ds.b 64 .end start