18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * fp_decode.h 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright Roman Zippel, 1997. All rights reserved. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 78c2ecf20Sopenharmony_ci * modification, are permitted provided that the following conditions 88c2ecf20Sopenharmony_ci * are met: 98c2ecf20Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 108c2ecf20Sopenharmony_ci * notice, and the entire permission notice in its entirety, 118c2ecf20Sopenharmony_ci * including the disclaimer of warranties. 128c2ecf20Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 138c2ecf20Sopenharmony_ci * notice, this list of conditions and the following disclaimer in the 148c2ecf20Sopenharmony_ci * documentation and/or other materials provided with the distribution. 158c2ecf20Sopenharmony_ci * 3. The name of the author may not be used to endorse or promote 168c2ecf20Sopenharmony_ci * products derived from this software without specific prior 178c2ecf20Sopenharmony_ci * written permission. 188c2ecf20Sopenharmony_ci * 198c2ecf20Sopenharmony_ci * ALTERNATIVELY, this product may be distributed under the terms of 208c2ecf20Sopenharmony_ci * the GNU General Public License, in which case the provisions of the GPL are 218c2ecf20Sopenharmony_ci * required INSTEAD OF the above restrictions. (This clause is 228c2ecf20Sopenharmony_ci * necessary due to a potential bad interaction between the GPL and 238c2ecf20Sopenharmony_ci * the restrictions contained in a BSD-style copyright.) 248c2ecf20Sopenharmony_ci * 258c2ecf20Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 268c2ecf20Sopenharmony_ci * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 278c2ecf20Sopenharmony_ci * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 288c2ecf20Sopenharmony_ci * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 298c2ecf20Sopenharmony_ci * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 308c2ecf20Sopenharmony_ci * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 318c2ecf20Sopenharmony_ci * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 328c2ecf20Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 338c2ecf20Sopenharmony_ci * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 348c2ecf20Sopenharmony_ci * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 358c2ecf20Sopenharmony_ci * OF THE POSSIBILITY OF SUCH DAMAGE. 368c2ecf20Sopenharmony_ci */ 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#ifndef _FP_DECODE_H 398c2ecf20Sopenharmony_ci#define _FP_DECODE_H 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci/* These macros do the dirty work of the instr decoding, several variables 428c2ecf20Sopenharmony_ci * can be defined in the source file to modify the work of these macros, 438c2ecf20Sopenharmony_ci * currently the following variables are used: 448c2ecf20Sopenharmony_ci * ... 458c2ecf20Sopenharmony_ci * The register usage: 468c2ecf20Sopenharmony_ci * d0 - will contain source operand for data direct mode, 478c2ecf20Sopenharmony_ci * otherwise scratch register 488c2ecf20Sopenharmony_ci * d1 - upper 16bit are reserved for caller 498c2ecf20Sopenharmony_ci * lower 16bit may contain further arguments, 508c2ecf20Sopenharmony_ci * is destroyed during decoding 518c2ecf20Sopenharmony_ci * d2 - contains first two instruction words, 528c2ecf20Sopenharmony_ci * first word will be used for extension word 538c2ecf20Sopenharmony_ci * a0 - will point to source/dest operand for any indirect mode 548c2ecf20Sopenharmony_ci * otherwise scratch register 558c2ecf20Sopenharmony_ci * a1 - scratch register 568c2ecf20Sopenharmony_ci * a2 - base addr to the task structure 578c2ecf20Sopenharmony_ci * 588c2ecf20Sopenharmony_ci * the current implementation doesn't check for every disallowed 598c2ecf20Sopenharmony_ci * addressing mode (e.g. pc relative modes as destination), as long 608c2ecf20Sopenharmony_ci * as it only means a new addressing mode, which should not appear 618c2ecf20Sopenharmony_ci * in a program and that doesn't crash the emulation, I think it's 628c2ecf20Sopenharmony_ci * not a problem to allow these modes. 638c2ecf20Sopenharmony_ci */ 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cido_fmovem=0 668c2ecf20Sopenharmony_cido_fmovem_cr=0 678c2ecf20Sopenharmony_cido_no_pc_mode=0 688c2ecf20Sopenharmony_cido_fscc=0 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci| first decoding of the instr type 718c2ecf20Sopenharmony_ci| this separates the conditional instr 728c2ecf20Sopenharmony_ci.macro fp_decode_cond_instr_type 738c2ecf20Sopenharmony_ci bfextu %d2{#8,#2},%d0 748c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci .align 4 778c2ecf20Sopenharmony_ci0: 788c2ecf20Sopenharmony_ci| .long "f<op>","fscc/fdbcc" 798c2ecf20Sopenharmony_ci| .long "fbccw","fbccl" 808c2ecf20Sopenharmony_ci.endm 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci| second decoding of the instr type 838c2ecf20Sopenharmony_ci| this separates most move instr 848c2ecf20Sopenharmony_ci.macro fp_decode_move_instr_type 858c2ecf20Sopenharmony_ci bfextu %d2{#16,#3},%d0 868c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci .align 4 898c2ecf20Sopenharmony_ci0: 908c2ecf20Sopenharmony_ci| .long "f<op> fpx,fpx","invalid instr" 918c2ecf20Sopenharmony_ci| .long "f<op> <ea>,fpx","fmove fpx,<ea>" 928c2ecf20Sopenharmony_ci| .long "fmovem <ea>,fpcr","fmovem <ea>,fpx" 938c2ecf20Sopenharmony_ci| .long "fmovem fpcr,<ea>","fmovem fpx,<ea>" 948c2ecf20Sopenharmony_ci.endm 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci| extract the source specifier, specifies 978c2ecf20Sopenharmony_ci| either source fp register or data format 988c2ecf20Sopenharmony_ci.macro fp_decode_sourcespec 998c2ecf20Sopenharmony_ci bfextu %d2{#19,#3},%d0 1008c2ecf20Sopenharmony_ci.endm 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci| decode destination format for fmove reg,ea 1038c2ecf20Sopenharmony_ci.macro fp_decode_dest_format 1048c2ecf20Sopenharmony_ci bfextu %d2{#19,#3},%d0 1058c2ecf20Sopenharmony_ci.endm 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci| decode source register for fmove reg,ea 1088c2ecf20Sopenharmony_ci.macro fp_decode_src_reg 1098c2ecf20Sopenharmony_ci bfextu %d2{#22,#3},%d0 1108c2ecf20Sopenharmony_ci.endm 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci| extract the addressing mode 1138c2ecf20Sopenharmony_ci| it depends on the instr which of the modes is valid 1148c2ecf20Sopenharmony_ci.macro fp_decode_addr_mode 1158c2ecf20Sopenharmony_ci bfextu %d2{#10,#3},%d0 1168c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci .align 4 1198c2ecf20Sopenharmony_ci0: 1208c2ecf20Sopenharmony_ci| .long "data register direct","addr register direct" 1218c2ecf20Sopenharmony_ci| .long "addr register indirect" 1228c2ecf20Sopenharmony_ci| .long "addr register indirect postincrement" 1238c2ecf20Sopenharmony_ci| .long "addr register indirect predecrement" 1248c2ecf20Sopenharmony_ci| .long "addr register + index16" 1258c2ecf20Sopenharmony_ci| .long "extension mode1","extension mode2" 1268c2ecf20Sopenharmony_ci.endm 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci| extract the register for the addressing mode 1298c2ecf20Sopenharmony_ci.macro fp_decode_addr_reg 1308c2ecf20Sopenharmony_ci bfextu %d2{#13,#3},%d0 1318c2ecf20Sopenharmony_ci.endm 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci| decode the 8bit displacement from the brief extension word 1348c2ecf20Sopenharmony_ci.macro fp_decode_disp8 1358c2ecf20Sopenharmony_ci move.b %d2,%d0 1368c2ecf20Sopenharmony_ci ext.w %d0 1378c2ecf20Sopenharmony_ci.endm 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci| decode the index of the brief/full extension word 1408c2ecf20Sopenharmony_ci.macro fp_decode_index 1418c2ecf20Sopenharmony_ci bfextu %d2{#17,#3},%d0 | get the register nr 1428c2ecf20Sopenharmony_ci btst #15,%d2 | test for data/addr register 1438c2ecf20Sopenharmony_ci jne 1\@f 1448c2ecf20Sopenharmony_ci printf PDECODE,"d%d",1,%d0 1458c2ecf20Sopenharmony_ci jsr fp_get_data_reg 1468c2ecf20Sopenharmony_ci jra 2\@f 1478c2ecf20Sopenharmony_ci1\@: printf PDECODE,"a%d",1,%d0 1488c2ecf20Sopenharmony_ci jsr fp_get_addr_reg 1498c2ecf20Sopenharmony_ci move.l %a0,%d0 1508c2ecf20Sopenharmony_ci2\@: 1518c2ecf20Sopenharmony_cidebug lea "'l'.w,%a0" 1528c2ecf20Sopenharmony_ci btst #11,%d2 | 16/32 bit size? 1538c2ecf20Sopenharmony_ci jne 3\@f 1548c2ecf20Sopenharmony_cidebug lea "'w'.w,%a0" 1558c2ecf20Sopenharmony_ci ext.l %d0 1568c2ecf20Sopenharmony_ci3\@: printf PDECODE,":%c",1,%a0 1578c2ecf20Sopenharmony_ci move.w %d2,%d1 | scale factor 1588c2ecf20Sopenharmony_ci rol.w #7,%d1 1598c2ecf20Sopenharmony_ci and.w #3,%d1 1608c2ecf20Sopenharmony_cidebug move.l "%d1,-(%sp)" 1618c2ecf20Sopenharmony_cidebug ext.l "%d1" 1628c2ecf20Sopenharmony_ci printf PDECODE,":%d",1,%d1 1638c2ecf20Sopenharmony_cidebug move.l "(%sp)+,%d1" 1648c2ecf20Sopenharmony_ci lsl.l %d1,%d0 1658c2ecf20Sopenharmony_ci.endm 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci| decode the base displacement size 1688c2ecf20Sopenharmony_ci.macro fp_decode_basedisp 1698c2ecf20Sopenharmony_ci bfextu %d2{#26,#2},%d0 1708c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci .align 4 1738c2ecf20Sopenharmony_ci0: 1748c2ecf20Sopenharmony_ci| .long "reserved","null displacement" 1758c2ecf20Sopenharmony_ci| .long "word displacement","long displacement" 1768c2ecf20Sopenharmony_ci.endm 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci.macro fp_decode_outerdisp 1798c2ecf20Sopenharmony_ci bfextu %d2{#30,#2},%d0 1808c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci .align 4 1838c2ecf20Sopenharmony_ci0: 1848c2ecf20Sopenharmony_ci| .long "no memory indirect action/reserved","null outer displacement" 1858c2ecf20Sopenharmony_ci| .long "word outer displacement","long outer displacement" 1868c2ecf20Sopenharmony_ci.endm 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci| get the extension word and test for brief or full extension type 1898c2ecf20Sopenharmony_ci.macro fp_get_test_extword label 1908c2ecf20Sopenharmony_ci fp_get_instr_word %d2,fp_err_ua1 1918c2ecf20Sopenharmony_ci btst #8,%d2 1928c2ecf20Sopenharmony_ci jne \label 1938c2ecf20Sopenharmony_ci.endm 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci| test if %pc is the base register for the indirect addr mode 1978c2ecf20Sopenharmony_ci.macro fp_test_basereg_d16 label 1988c2ecf20Sopenharmony_ci btst #20,%d2 1998c2ecf20Sopenharmony_ci jeq \label 2008c2ecf20Sopenharmony_ci.endm 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci| test if %pc is the base register for one of the extended modes 2038c2ecf20Sopenharmony_ci.macro fp_test_basereg_ext label 2048c2ecf20Sopenharmony_ci btst #19,%d2 2058c2ecf20Sopenharmony_ci jeq \label 2068c2ecf20Sopenharmony_ci.endm 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci.macro fp_test_suppr_index label 2098c2ecf20Sopenharmony_ci btst #6,%d2 2108c2ecf20Sopenharmony_ci jne \label 2118c2ecf20Sopenharmony_ci.endm 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci| addressing mode: data register direct 2158c2ecf20Sopenharmony_ci.macro fp_mode_data_direct 2168c2ecf20Sopenharmony_ci fp_decode_addr_reg 2178c2ecf20Sopenharmony_ci printf PDECODE,"d%d",1,%d0 2188c2ecf20Sopenharmony_ci.endm 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci| addressing mode: address register indirect 2218c2ecf20Sopenharmony_ci.macro fp_mode_addr_indirect 2228c2ecf20Sopenharmony_ci fp_decode_addr_reg 2238c2ecf20Sopenharmony_ci printf PDECODE,"(a%d)",1,%d0 2248c2ecf20Sopenharmony_ci jsr fp_get_addr_reg 2258c2ecf20Sopenharmony_ci.endm 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ci| adjust stack for byte moves from/to stack 2288c2ecf20Sopenharmony_ci.macro fp_test_sp_byte_move 2298c2ecf20Sopenharmony_ci .if !do_fmovem 2308c2ecf20Sopenharmony_ci .if do_fscc 2318c2ecf20Sopenharmony_ci move.w #6,%d1 2328c2ecf20Sopenharmony_ci .endif 2338c2ecf20Sopenharmony_ci cmp.w #7,%d0 2348c2ecf20Sopenharmony_ci jne 1\@f 2358c2ecf20Sopenharmony_ci .if !do_fscc 2368c2ecf20Sopenharmony_ci cmp.w #6,%d1 2378c2ecf20Sopenharmony_ci jne 1\@f 2388c2ecf20Sopenharmony_ci .endif 2398c2ecf20Sopenharmony_ci move.w #4,%d1 2408c2ecf20Sopenharmony_ci1\@: 2418c2ecf20Sopenharmony_ci .endif 2428c2ecf20Sopenharmony_ci.endm 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_ci| addressing mode: address register indirect with postincrement 2458c2ecf20Sopenharmony_ci.macro fp_mode_addr_indirect_postinc 2468c2ecf20Sopenharmony_ci fp_decode_addr_reg 2478c2ecf20Sopenharmony_ci printf PDECODE,"(a%d)+",1,%d0 2488c2ecf20Sopenharmony_ci fp_test_sp_byte_move 2498c2ecf20Sopenharmony_ci jsr fp_get_addr_reg 2508c2ecf20Sopenharmony_ci move.l %a0,%a1 | save addr 2518c2ecf20Sopenharmony_ci .if do_fmovem 2528c2ecf20Sopenharmony_ci lea (%a0,%d1.w*4),%a0 2538c2ecf20Sopenharmony_ci .if !do_fmovem_cr 2548c2ecf20Sopenharmony_ci lea (%a0,%d1.w*8),%a0 2558c2ecf20Sopenharmony_ci .endif 2568c2ecf20Sopenharmony_ci .else 2578c2ecf20Sopenharmony_ci add.w (fp_datasize,%d1.w*2),%a0 2588c2ecf20Sopenharmony_ci .endif 2598c2ecf20Sopenharmony_ci jsr fp_put_addr_reg 2608c2ecf20Sopenharmony_ci move.l %a1,%a0 2618c2ecf20Sopenharmony_ci.endm 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci| addressing mode: address register indirect with predecrement 2648c2ecf20Sopenharmony_ci.macro fp_mode_addr_indirect_predec 2658c2ecf20Sopenharmony_ci fp_decode_addr_reg 2668c2ecf20Sopenharmony_ci printf PDECODE,"-(a%d)",1,%d0 2678c2ecf20Sopenharmony_ci fp_test_sp_byte_move 2688c2ecf20Sopenharmony_ci jsr fp_get_addr_reg 2698c2ecf20Sopenharmony_ci .if do_fmovem 2708c2ecf20Sopenharmony_ci .if !do_fmovem_cr 2718c2ecf20Sopenharmony_ci lea (-12,%a0),%a1 | setup to addr of 1st reg to move 2728c2ecf20Sopenharmony_ci neg.w %d1 2738c2ecf20Sopenharmony_ci lea (%a0,%d1.w*4),%a0 2748c2ecf20Sopenharmony_ci add.w %d1,%d1 2758c2ecf20Sopenharmony_ci lea (%a0,%d1.w*4),%a0 2768c2ecf20Sopenharmony_ci jsr fp_put_addr_reg 2778c2ecf20Sopenharmony_ci move.l %a1,%a0 2788c2ecf20Sopenharmony_ci .else 2798c2ecf20Sopenharmony_ci neg.w %d1 2808c2ecf20Sopenharmony_ci lea (%a0,%d1.w*4),%a0 2818c2ecf20Sopenharmony_ci jsr fp_put_addr_reg 2828c2ecf20Sopenharmony_ci .endif 2838c2ecf20Sopenharmony_ci .else 2848c2ecf20Sopenharmony_ci sub.w (fp_datasize,%d1.w*2),%a0 2858c2ecf20Sopenharmony_ci jsr fp_put_addr_reg 2868c2ecf20Sopenharmony_ci .endif 2878c2ecf20Sopenharmony_ci.endm 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci| addressing mode: address register/programm counter indirect 2908c2ecf20Sopenharmony_ci| with 16bit displacement 2918c2ecf20Sopenharmony_ci.macro fp_mode_addr_indirect_disp16 2928c2ecf20Sopenharmony_ci .if !do_no_pc_mode 2938c2ecf20Sopenharmony_ci fp_test_basereg_d16 1f 2948c2ecf20Sopenharmony_ci printf PDECODE,"pc" 2958c2ecf20Sopenharmony_ci fp_get_pc %a0 2968c2ecf20Sopenharmony_ci jra 2f 2978c2ecf20Sopenharmony_ci .endif 2988c2ecf20Sopenharmony_ci1: fp_decode_addr_reg 2998c2ecf20Sopenharmony_ci printf PDECODE,"a%d",1,%d0 3008c2ecf20Sopenharmony_ci jsr fp_get_addr_reg 3018c2ecf20Sopenharmony_ci2: fp_get_instr_word %a1,fp_err_ua1 3028c2ecf20Sopenharmony_ci printf PDECODE,"@(%x)",1,%a1 3038c2ecf20Sopenharmony_ci add.l %a1,%a0 3048c2ecf20Sopenharmony_ci.endm 3058c2ecf20Sopenharmony_ci 3068c2ecf20Sopenharmony_ci| perform preindex (if I/IS == 0xx and xx != 00) 3078c2ecf20Sopenharmony_ci.macro fp_do_preindex 3088c2ecf20Sopenharmony_ci moveq #3,%d0 3098c2ecf20Sopenharmony_ci and.w %d2,%d0 3108c2ecf20Sopenharmony_ci jeq 1f 3118c2ecf20Sopenharmony_ci btst #2,%d2 3128c2ecf20Sopenharmony_ci jne 1f 3138c2ecf20Sopenharmony_ci printf PDECODE,")@(" 3148c2ecf20Sopenharmony_ci getuser.l (%a1),%a1,fp_err_ua1,%a1 3158c2ecf20Sopenharmony_cidebug jra "2f" 3168c2ecf20Sopenharmony_ci1: printf PDECODE,"," 3178c2ecf20Sopenharmony_ci2: 3188c2ecf20Sopenharmony_ci.endm 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci| perform postindex (if I/IS == 1xx) 3218c2ecf20Sopenharmony_ci.macro fp_do_postindex 3228c2ecf20Sopenharmony_ci btst #2,%d2 3238c2ecf20Sopenharmony_ci jeq 1f 3248c2ecf20Sopenharmony_ci printf PDECODE,")@(" 3258c2ecf20Sopenharmony_ci getuser.l (%a1),%a1,fp_err_ua1,%a1 3268c2ecf20Sopenharmony_cidebug jra "2f" 3278c2ecf20Sopenharmony_ci1: printf PDECODE,"," 3288c2ecf20Sopenharmony_ci2: 3298c2ecf20Sopenharmony_ci.endm 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci| all other indirect addressing modes will finally end up here 3328c2ecf20Sopenharmony_ci.macro fp_mode_addr_indirect_extmode0 3338c2ecf20Sopenharmony_ci .if !do_no_pc_mode 3348c2ecf20Sopenharmony_ci fp_test_basereg_ext 1f 3358c2ecf20Sopenharmony_ci printf PDECODE,"pc" 3368c2ecf20Sopenharmony_ci fp_get_pc %a0 3378c2ecf20Sopenharmony_ci jra 2f 3388c2ecf20Sopenharmony_ci .endif 3398c2ecf20Sopenharmony_ci1: fp_decode_addr_reg 3408c2ecf20Sopenharmony_ci printf PDECODE,"a%d",1,%d0 3418c2ecf20Sopenharmony_ci jsr fp_get_addr_reg 3428c2ecf20Sopenharmony_ci2: move.l %a0,%a1 3438c2ecf20Sopenharmony_ci swap %d2 3448c2ecf20Sopenharmony_ci fp_get_test_extword 3f 3458c2ecf20Sopenharmony_ci | addressing mode: address register/programm counter indirect 3468c2ecf20Sopenharmony_ci | with index and 8bit displacement 3478c2ecf20Sopenharmony_ci fp_decode_disp8 3488c2ecf20Sopenharmony_cidebug ext.l "%d0" 3498c2ecf20Sopenharmony_ci printf PDECODE,"@(%x,",1,%d0 3508c2ecf20Sopenharmony_ci add.w %d0,%a1 3518c2ecf20Sopenharmony_ci fp_decode_index 3528c2ecf20Sopenharmony_ci add.l %d0,%a1 3538c2ecf20Sopenharmony_ci printf PDECODE,")" 3548c2ecf20Sopenharmony_ci jra 9f 3558c2ecf20Sopenharmony_ci3: | addressing mode: address register/programm counter memory indirect 3568c2ecf20Sopenharmony_ci | with base and/or outer displacement 3578c2ecf20Sopenharmony_ci btst #7,%d2 | base register suppressed? 3588c2ecf20Sopenharmony_ci jeq 1f 3598c2ecf20Sopenharmony_ci printf PDECODE,"!" 3608c2ecf20Sopenharmony_ci sub.l %a1,%a1 3618c2ecf20Sopenharmony_ci1: printf PDECODE,"@(" 3628c2ecf20Sopenharmony_ci fp_decode_basedisp 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_ci .long fp_ill,1f 3658c2ecf20Sopenharmony_ci .long 2f,3f 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_ci#ifdef FPU_EMU_DEBUG 3688c2ecf20Sopenharmony_ci1: printf PDECODE,"0" | null base displacement 3698c2ecf20Sopenharmony_ci jra 1f 3708c2ecf20Sopenharmony_ci#endif 3718c2ecf20Sopenharmony_ci2: fp_get_instr_word %a0,fp_err_ua1 | 16bit base displacement 3728c2ecf20Sopenharmony_ci printf PDECODE,"%x:w",1,%a0 3738c2ecf20Sopenharmony_ci jra 4f 3748c2ecf20Sopenharmony_ci3: fp_get_instr_long %a0,fp_err_ua1 | 32bit base displacement 3758c2ecf20Sopenharmony_ci printf PDECODE,"%x:l",1,%a0 3768c2ecf20Sopenharmony_ci4: add.l %a0,%a1 3778c2ecf20Sopenharmony_ci1: 3788c2ecf20Sopenharmony_ci fp_do_postindex 3798c2ecf20Sopenharmony_ci fp_test_suppr_index 1f 3808c2ecf20Sopenharmony_ci fp_decode_index 3818c2ecf20Sopenharmony_ci add.l %d0,%a1 3828c2ecf20Sopenharmony_ci1: fp_do_preindex 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_ci fp_decode_outerdisp 3858c2ecf20Sopenharmony_ci 3868c2ecf20Sopenharmony_ci .long 5f,1f 3878c2ecf20Sopenharmony_ci .long 2f,3f 3888c2ecf20Sopenharmony_ci 3898c2ecf20Sopenharmony_ci#ifdef FPU_EMU_DEBUG 3908c2ecf20Sopenharmony_ci1: printf PDECODE,"0" | null outer displacement 3918c2ecf20Sopenharmony_ci jra 1f 3928c2ecf20Sopenharmony_ci#endif 3938c2ecf20Sopenharmony_ci2: fp_get_instr_word %a0,fp_err_ua1 | 16bit outer displacement 3948c2ecf20Sopenharmony_ci printf PDECODE,"%x:w",1,%a0 3958c2ecf20Sopenharmony_ci jra 4f 3968c2ecf20Sopenharmony_ci3: fp_get_instr_long %a0,fp_err_ua1 | 32bit outer displacement 3978c2ecf20Sopenharmony_ci printf PDECODE,"%x:l",1,%a0 3988c2ecf20Sopenharmony_ci4: add.l %a0,%a1 3998c2ecf20Sopenharmony_ci1: 4008c2ecf20Sopenharmony_ci5: printf PDECODE,")" 4018c2ecf20Sopenharmony_ci9: move.l %a1,%a0 4028c2ecf20Sopenharmony_ci swap %d2 4038c2ecf20Sopenharmony_ci.endm 4048c2ecf20Sopenharmony_ci 4058c2ecf20Sopenharmony_ci| get the absolute short address from user space 4068c2ecf20Sopenharmony_ci.macro fp_mode_abs_short 4078c2ecf20Sopenharmony_ci fp_get_instr_word %a0,fp_err_ua1 4088c2ecf20Sopenharmony_ci printf PDECODE,"%x.w",1,%a0 4098c2ecf20Sopenharmony_ci.endm 4108c2ecf20Sopenharmony_ci 4118c2ecf20Sopenharmony_ci| get the absolute long address from user space 4128c2ecf20Sopenharmony_ci.macro fp_mode_abs_long 4138c2ecf20Sopenharmony_ci fp_get_instr_long %a0,fp_err_ua1 4148c2ecf20Sopenharmony_ci printf PDECODE,"%x.l",1,%a0 4158c2ecf20Sopenharmony_ci.endm 4168c2ecf20Sopenharmony_ci 4178c2ecf20Sopenharmony_ci#endif /* _FP_DECODE_H */ 418