Advertisement
xiahanlu

Untitled

Dec 21st, 2018
424
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.   .686            
  2.   .mmx
  3.   .xmm  
  4.   .model flat, c    
  5.   option casemap :none
  6.  
  7. ;; mmu read/write
  8. ;; internal will set arm7tdmi::waitState
  9. extrn agb_mbus_rb@8:proc  ;; prototype uint8_t __stdcall agb_mbus_rb (struct gameboy_adv *agb, uint16_t addresss)
  10. extrn agb_mbus_rhw@8:proc  ;; prototype uint16_t __stdcall agb_mbus_rhw (struct gameboy_adv *agb, uint16_t addresss)
  11. extrn agb_mbus_rw@8:proc  ;; prototype uint32_t __stdcall agb_mbus_rw (struct gameboy_adv *agb, uint16_t addresss)
  12. extrn agb_mbus_wb@12:proc ;; prototype void __stdcall agb_mbus_wb (struct gameboy_adv *agb, uint16_t addresss, uint8_t value)
  13. extrn agb_mbus_whw@12:proc ;; prototype void __stdcall agb_mbus_whw (struct gameboy_adv *agb, uint16_t addresss, uint16_t value)
  14. extrn agb_mbus_ww@12:proc ;; prototype void __stdcall agb_mbus_ww (struct gameboy_adv *agb, uint16_t addresss, uint32_t value)
  15. extrn agb_code_rhw@8:proc  ;; prototype uint16_t __stdcall agb_code_rhw (struct gameboy_adv *agb, uint16_t addresss)
  16. extrn agb_code_rw@8:proc  ;; prototype uint32_t __stdcall agb_code_rw (struct gameboy_adv *agb, uint16_t addresss)
  17.  
  18. ;; ARM7 Exceptions Address
  19. ;; In GBA, We just need to care about RESET, IRQ and BIOS software interrupts.
  20. ARM7_VECTOR_RESET equ 000h
  21. ARM7_VECTOR_UNDEF equ  004h
  22. ARM7_VECTOR_SOFTWARE equ 008h
  23. ARM7_VECTOR_PREFETCH_ABORT equ 00Ch
  24. ARM7_VECTOR_DATA_ABORT equ 010h
  25. ARM7_VECTOR_IRQ equ 018h
  26. ARM7_VECTOR_FIQ equ 01Ch
  27.  
  28. ARM7_DEBUG equ 1
  29. GBA_IE_IF_MASK equ 00EFFFh
  30. ARM7_MODE_CLR_MASK equ 0E0FFFFFFh
  31. ARM7_MODE_IRQ_MASK equ 012000000h
  32. ARM7_MODE_MGR_MASK equ 013000000h
  33. ARM7_MODE_USER_MASK equ 010000000h
  34. ARM7_MODE_FIQ_MASK equ 011000000h
  35. ARM7_MODE_UNDEF_MASK equ 01B000000h
  36. ARM7_MODE_SYS_MASK equ 01F000000h
  37. ARM7_MODE_ABT_MASK equ 017000000h
  38. ARM7_MODE_GET_MASK equ 01F000000h
  39. ARM7_THUMB_BIT equ 29
  40. ARM7_MODE_SFT_BIT equ 24
  41.  
  42. ERRORS_ASSERT equ MOECMKS_DONE
  43. ALIGN_Z equ align 16
  44.  
  45. .data
  46. s_ModeUser__ db 'MODE:USER', 0
  47. s_ModeSys__ db 'MODE:SYS', 0
  48. s_ModeUdef__ db 'MODE:Undef', 0
  49. s_ModeABT__ db 'MODE:Abort', 0
  50. s_ModeIRQ__ db 'MODE:IRQ', 0
  51. s_ModeFIQ__ db 'MODE:FIQ', 0
  52. s_ModeMGR__ db 'MODE:MGR', 0
  53.  
  54. s_ModeTabs       dd s_ModeUser__, s_ModeFIQ__, s_ModeIRQ__, s_ModeMGR__
  55.                 dd s_ModeUser__, s_ModeUser__, s_ModeUser__, s_ModeABT__
  56.                 dd s_ModeUser__, s_ModeUser__, s_ModeUser__, s_ModeUdef__
  57.                 dd s_ModeUser__, s_ModeUser__, s_ModeUser__, s_ModeSys__
  58.  
  59. IF ARM7_DEBUG eq 0
  60. DEBUG_OUT macro format, arglist:vararg
  61.  ;; nodone in non-debug mode
  62. endm
  63. ELSEIF  ARM7_DEBUG eq 1
  64. printf PROTO C :DWORD,:VARARG
  65.  
  66. ;; input : "content"
  67. rdata_mak macro format
  68.  
  69.  LOCAL mID  ;; loop's iterator
  70.  LOCAL mLEN
  71.  LOCAL mCHSET ; eg. "Hello World", 00Ah, "Goddbyte word", 0
  72.  LOCAL mN ;; Pos init left.
  73.  LOCAL mTAIL_COMP ;; :BOOL init tail comp ,
  74.  LOCAL mT1 ;; fro calc temp
  75.  LOCAL mT2  ;; fro calc temp
  76.  
  77.  mN = 1
  78.  mID = 0
  79.  mTAIL_COMP = 0
  80.  mLEN = @SizeStr (format)
  81.  mCHSET TEXTEQU <>
  82.  ;; mCHSET CATSTR mCHSET, <ccc db >
  83.  
  84.  ;; echo format
  85.  FORC CHS, <format>
  86.    IFIDN <CHS>, <\>
  87.      IF mID ne (mLEN-2)
  88.        CHR_N TEXTEQU @SubStr (format, mID+2, 1)
  89.        %FORC CHS_N, CHR_N
  90.          IFIDN <CHS_N>, <n>
  91.            IF mID eq (mLEN-3)
  92.              mTAIL_COMP = 1
  93.            ENDIF  
  94.            IF mID ne 1
  95.              IF (mID-mN) ne 0
  96.                mT1 = mN+1
  97.                mT2 = mID - mN
  98.                mCHSET CATSTR mCHSET,  <!">, @SubStr (format, mT1, mT2), <!"!,>
  99.              ENDIF          
  100.            ENDIF  
  101.            mN = mID + 2          
  102.            mCHSET CATSTR mCHSET, <00Ah>, <!,>
  103.          ENDIF
  104.        ENDM
  105.      ENDIF
  106.    ENDIF  
  107.    mID = mID + 1
  108.  ENDM
  109.  ;; add tail
  110.  IF mTAIL_COMP ne 1
  111. ;; echo <mTAIL_INCOMP>
  112.            mLEN = mLEN - mN - 1
  113.            mN = mN + 1
  114.            mCHSET CATSTR mCHSET, <!">, @SubStr (format, mN, mLEN), <!"!, 0>
  115.  ELSEIF mTAIL_COMP eq 1
  116.   ;; echo <mTAIL_COMP>
  117.            mCHSET CATSTR mCHSET, <0>
  118.  ENDIF
  119.  ;; %echo mCHSET
  120.  EXITM <mCHSET>
  121. endm
  122.  
  123. tem_rev_arg macro arg1,  arglist:vararg
  124.   LOCAL mCHSET
  125.   mCHSET TEXTEQU <arg1>
  126.  
  127.   FOR ARG, <arglist>
  128.   mCHSET CATSTR <ARG>, <!,>, mCHSET
  129.   ENDM
  130.  
  131.   EXITM <mCHSET>
  132. endm
  133.  
  134. tem_alphatoint macro arg
  135.  
  136.     IFIDNI <arg>, <0>
  137.       EXITM <0>
  138.     ELSEIFIDNI <arg>, <1>
  139.       EXITM <1>
  140.     ELSEIFIDNI <arg>, <2>  
  141.       EXITM <2>
  142.     ELSEIFIDNI <arg>, <3>
  143.       EXITM <3>
  144.     ELSEIFIDNI <arg>, <4>  
  145.       EXITM <4>
  146.      ELSEIFIDNI <arg>, <5>
  147.       EXITM <5>
  148.     ELSEIFIDNI <arg>, <6>
  149.       EXITM <6>
  150.     ELSEIFIDNI <arg>, <7>
  151.       EXITM <7>
  152.     ELSEIFIDNI <arg>, <8>
  153.       EXITM <8>
  154.     ELSEIFIDNI <arg>, <9>
  155.       EXITM <9>
  156.     ELSEIFIDNI <arg>, <A>  
  157.       EXITM <10>
  158.     ELSEIFIDNI <arg>, <B>
  159.       EXITM <11>
  160.     ELSEIFIDNI <arg>, <C>  
  161.       EXITM <12>
  162.      ELSEIFIDNI <arg>, <D>
  163.       EXITM <13>
  164.     ELSEIFIDNI <arg>, <E>
  165.       EXITM <14>
  166.     ELSEIFIDNI <arg>, <F>
  167.       EXITM <15>
  168.     ELSE
  169.       ERRORS_ASSERT
  170.     ENDIF
  171. endm
  172.  
  173. tem_push_arg macro arglist0:vararg
  174.  
  175.   ;; e.g. "eax>7&00Ah", "ecx<5&ecx"
  176.   ;; op } shift right 0
  177.   ;; op { shift left 1
  178.   ;; op + add 2
  179.   ;; op - sub 3
  180.   ;; op & and 4
  181.   ;; op ^ xor 5
  182.   ;; op | or 6
  183.   ;; op ~ ror right 7
  184.   ;; op ? 8 lhs rhs link sym, after ?, must offer a op symbol
  185.  
  186.   ;; src/dst : reg or imm (e.g. 0A00h, 1, 2, 3)
  187.   ;;
  188.   ;; Z0-ZF Mapper register 0-15 (current)
  189.   ;; U0-UF Mapper register 0-15 (sys/user)
  190.   ;; Q0-QF Mapper register 0-15 (irq) F:=SPSR
  191.   ;; M0-MF Mapper register 0-15 (mgr) F:=SPSR
  192.   ;; O0-O1 pipeline opcode
  193.   ;;
  194.   ;; $alu, get value register index, outval
  195.  
  196.   LOCAL mRSC_POS  ;; lhs's end pos
  197.   LOCAL mLEN
  198.   LOCAL mID
  199.   LOCAL mOP
  200.   LOCAL mT
  201.   LOCAL mT2
  202.   LOCAL mT3
  203.   LOCAL mSET_TYPE ;;
  204.   LOCAL mTEMP
  205.   LOCAL mID2
  206.   LOCAL mTEMP2
  207.   LOCAL mSIGJ
  208.   LOCAL mACRG
  209.   LOCAL mCC
  210.   LOCAL mDIS
  211.   LOCAL mLINK
  212.   LOCAL mAGQ
  213.  
  214.   FOR arg, <arglist0>
  215.  
  216.     mRSC_POS = 1
  217.     mLEN  = @SizeStr (arg)
  218.     mID = 0
  219.     mOP = -1
  220.     mSIGJ = 0
  221.     mACRG = 0
  222.     mDIS = 0
  223.     mLINK = 0
  224.     mAGQ TEXTEQU <!?>
  225.    
  226.     FORC CHS, <arg>
  227.       IFIDN <CHS>, <!#>
  228.         mDIS =1
  229.       ENDIF
  230.     ENDM
  231.     IF mDIS eq 1
  232.       GOTO IBGS
  233.     ENDIF
  234.  
  235.     ;; %echo arg
  236.     FORC CHS, <arg>
  237.      ; echo CHS
  238.       mSET_TYPE = -1
  239.       mT = 0
  240.       mT2 = 0
  241.       mACRG = 0
  242.       IF mLINK ne 0
  243.         mLINK = mLINK - 1 ;; skip n.
  244.         GOTO IBGA
  245.       ENDIF
  246.       IFIDN <CHS>, <!">
  247.        IF mID eq (mLEN-1)
  248.          mSET_TYPE = 0      
  249.        ENDIF
  250.      ELSEIFIDN <CHS>, < >
  251.        ;; Skip it.  
  252.      ELSEIFIDN <CHS>, <!?>
  253.        ;; adjust pos, to rhs
  254.        mT =  mID + 2
  255.        mAGQ SUBSTR <arg>, mT, 1
  256.        mACRG = 1
  257.        mSET_TYPE = 0
  258.      ELSEIFIDN <CHS>, <!$> ;; set reg
  259.        mSIGJ = 1  
  260.        mRSC_POS = mRSC_POS + 1              
  261.      ELSEIFIDN <CHS>, <!{>
  262.        mSET_TYPE = 0
  263.      ELSEIFIDN <CHS>, <!}>  
  264.        mSET_TYPE = 1
  265.      ELSEIFIDN <CHS>, <!+>  
  266.        mSET_TYPE = 2    
  267.      ELSEIFIDN <CHS>, <!->  
  268.        mSET_TYPE = 3    
  269.      ELSEIFIDN <CHS>, <!&>  
  270.        mSET_TYPE = 4      
  271.      ELSEIFIDN <CHS>, <!^>  
  272.        mSET_TYPE = 5    
  273.      ELSEIFIDN <CHS>, <!|>    
  274.        mSET_TYPE = 6  
  275.      ELSEIFIDN <CHS>, <!~>    
  276.        mSET_TYPE = 7        
  277.      ENDIF
  278.  
  279.      IF mSET_TYPE ne -1
  280.        ;; Check MAPPER
  281.        mT =  mRSC_POS + 1
  282.        mT2 = mID - 1 - mRSC_POS + 1
  283.        mTEMP TEXTEQU @SubStr (<arg>, mT, mT2)
  284.        mT = 0
  285.        mT2= 1
  286.        mID2 = 0
  287.        %FORC CHS_N, mTEMP
  288.          IFIDNI <CHS_N>, <Z>  
  289.            mT = mID2+2
  290.            mCC SubStr mTEMP, mT, 1
  291.            mTEMP2 CATSTR <![SC_ARM7!].Regs![0>, mCC, <h*4!]>  
  292.            mT2 = 0
  293.          ELSEIFIDNI <CHS_N>, <O>
  294.            mT = mID2+2
  295.            mCC SubStr mTEMP, mT, 1
  296.            mTEMP2 CATSTR <![SC_ARM7!].Opcode![>, <0>, mCC, <h*4!]>    
  297.            mT2 = 0
  298.          ELSEIFIDNI <CHS_N>, <U> ;;sys/user
  299.            mT = mID2+2          
  300.            mCC SubStr mTEMP, mT, 1
  301.            mT3 = tem_alphatoint (%mCC)
  302.            mT2 = 0
  303.            mT3 = mT3 + 1  
  304.            mT3 = mT3 and 15    
  305.            mTEMP2 CATSTR <![SC_ARM7!].Regs![>, <0>, mCC, <h*4!]>              
  306.            IF mT3 GE 14
  307.              mTEMP2 TEXTEQU <>
  308.              mTEMP2 CATSTR <![SC_ARM7!].R1314_T![R1314b_SYSUSER>, <!(0>, mCC, <h-13!)*4!]>  
  309.            ENDIF
  310.          ELSEIFIDNI <CHS_N>, <Q> ;;IRQ  
  311.            mT = mID2+2
  312.            mCC SubStr mTEMP, mT, 1
  313.            mT3 = tem_alphatoint (%mCC)
  314.            mT3 = mT3 + 1  
  315.            mT3 = mT3 and 15    
  316.            mT2 = 0
  317.            mTEMP2 CATSTR <![SC_ARM7!].Regs![>, <0>, mCC, <h*4!]>              
  318.            IF mT3 GE 14
  319.              mTEMP2 CATSTR <![SC_ARM7!].R1314_T![R1314b_IRQ>, <!(0>, mCC, <h-13!)*4!]>  
  320.            ELSEIF mT3 EQ 0
  321.              mTEMP2 TEXTEQU <>
  322.              mTEMP2 CATSTR <![SC_ARM7!].SPSR_T![SPSRb_IRQ]>      
  323.            ENDIF        
  324.          ELSEIFIDNI <CHS_N>, <M> ;;MGR  
  325.            mT = mID2+2
  326.            mCC SubStr mTEMP, mT, 1
  327.            mT3 = tem_alphatoint (%mCC)
  328.            mT3 = mT3 + 1  
  329.            mT2 = 0
  330.            mT3 = mT3 and 15    
  331.            mTEMP2 CATSTR <![SC_ARM7!].Regs![>, <0>, mCC, <h*4!]>              
  332.            IF mT3 GE 14
  333.              mTEMP2 TEXTEQU <>
  334.              mTEMP2 CATSTR <![SC_ARM7!].R1314_T![R1314b_MGR>, <!(0>, mCC, <h-13!)*4!]>  
  335.            ELSEIF mT3 EQ 0
  336.              mTEMP2 TEXTEQU <>
  337.              mTEMP2 CATSTR <![SC_ARM7!].SPSR_T![SPSRb_MGR]>      
  338.            ENDIF
  339.          ENDIF
  340.          mID2 = mID2 +1
  341.        ENDM
  342.        IF mT2 eq 0
  343.          mTEMP TEXTEQU  mTEMP2        
  344.        ENDIF
  345.        
  346.        movd xmm7, eax
  347.        mov eax, mTEMP
  348.        movd xmm1, eax
  349.        movd eax, xmm7
  350.        
  351.        IF mOP eq -1 ;; mem/imm/reg.
  352.          movdqa xmm0, xmm1
  353.        ELSEIF mOP eq 0
  354.          movd xmm7, eax
  355.          movd xmm6, ecx
  356.          movd ecx, xmm1
  357.          movd eax, xmm0
  358.          shl eax, cl
  359.          movd xmm0, eax
  360.          movd eax, xmm7
  361.          movd ecx, xmm6
  362.        ELSEIF mOP eq 1
  363.          movd xmm7, eax
  364.          movd xmm6, ecx
  365.          movd ecx, xmm1
  366.          movd eax, xmm0
  367.          shr eax, cl
  368.          movd xmm0, eax
  369.          movd eax, xmm7
  370.          movd ecx, xmm6      
  371.        ELSEIF mOP eq 2 ;; +  mem/imm/reg.  
  372.          paddd  xmm0, xmm1          
  373.        ELSEIF mOP eq 3
  374.          psubd  xmm0, xmm1    
  375.        ELSEIF mOP eq 4 ;; &
  376.          pand  xmm0, xmm1  
  377.        ELSEIF mOP eq 5
  378.          pxor  xmm0, xmm1  
  379.        ELSEIF mOP eq 6
  380.          por  xmm0, xmm1  
  381.        ELSEIF mOP eq 7 ;; ror it.
  382.          movd xmm7, eax
  383.          movd xmm6, ecx
  384.          movd ecx, xmm1
  385.          movd eax, xmm0
  386.          ror eax, cl
  387.          movd xmm0, eax
  388.          movd eax, xmm7
  389.          movd ecx, xmm6
  390.        ELSE
  391.          ERRORS_ASSERT        
  392.        ENDIF  
  393.        mOP = mSET_TYPE
  394.        mRSC_POS = mID+1
  395.        
  396.        IF mACRG ne 0
  397.          mACRG = 0
  398.          mLINK = 1
  399.          mOP = -1
  400.          mRSC_POS = mID + 2
  401.          mSIGJ = 0
  402.          movdqa xmm5, xmm0
  403.        ENDIF
  404.      ENDIF
  405.      :IBGA
  406.      mID = mID + 1
  407.    ENDM
  408.    
  409.    %FORC CHS_N, mAGQ
  410.      IFIDNI <CHS_N>, <!?>
  411.        IF mSIGJ eq 1
  412.            movd xmm1, eax
  413.            movd eax, xmm0
  414.            and eax, 15
  415.            push dword ptr[SC_ARM7].Regs[eax*4]
  416.            movd eax, xmm1
  417.        ELSE
  418.            movd xmm1, eax
  419.            movd eax, xmm0
  420.            push eax
  421.            movd eax, xmm1
  422.        ENDIF  
  423.      ELSE  
  424.        IFIDN <CHS_N>, <!{>
  425.          movd xmm7, eax
  426.          movd xmm6, ecx
  427.          movd ecx, xmm0
  428.          movd eax, xmm5
  429.          shl eax, cl
  430.          movd xmm5, eax
  431.          movd eax, xmm7
  432.          movd ecx, xmm6
  433.        ELSEIFIDN <CHS_N>, <!}>  
  434.          movd xmm7, eax
  435.          movd xmm6, ecx
  436.          movd ecx, xmm0
  437.          movd eax, xmm5
  438.          shr eax, cl
  439.          movd xmm5, eax
  440.          movd eax, xmm7
  441.          movd ecx, xmm6
  442.        ELSEIFIDN <CHS_N>, <!+>  
  443.          paddd xmm5, xmm0  
  444.        ELSEIFIDN <CHS_N>, <!->  
  445.          psubd xmm5, xmm0      
  446.        ELSEIFIDN <CHS_N>, <!&>  
  447.          pand xmm5, xmm0      
  448.        ELSEIFIDN <CHS_N>, <!^>  
  449.          pxor xmm5, xmm0    
  450.        ELSEIFIDN <CHS_N>, <!|>    
  451.          por xmm5, xmm0
  452.        ELSEIFIDN <CHS_N>, <!~>    
  453.          movd xmm7, eax
  454.          movd xmm6, ecx
  455.          movd ecx, xmm0
  456.          movd eax, xmm5
  457.          ror eax, cl
  458.          movd xmm5, eax
  459.          movd eax, xmm7
  460.          movd ecx, xmm6
  461.        ELSE      
  462.        ENDIF
  463.        movd xmm7, eax
  464.        movd eax, xmm5
  465.        push eax
  466.        movd eax, xmm7      
  467.      ENDIF
  468.    ENDM
  469.    
  470.    :IBGS
  471.    IF mDIS eq 1
  472.      ;; MAKE DISPLAY.
  473.      movd xmm0, eax
  474.      movd xmm1, ebx
  475.      mov eax, SC_CPSR
  476.      shr eax, ARM7_MODE_SFT_BIT
  477.      and eax, 01Fh
  478.      sub eax, 16
  479.      push dword ptr [s_ModeTabs+eax*4]
  480.      movd eax, xmm0
  481.      movd ebx, xmm1
  482.      .code
  483.    ENDIF
  484.    
  485.    :IBGC
  486.  ENDM
  487. endm
  488.  
  489.  
  490. tem_print macro format, arglist:vararg
  491.  LOCAL cstr
  492.  ARGLIST_EMPTY = 0
  493.  FOR ARG,<arglist>
  494.      ARGLIST_EMPTY = ARGLIST_EMPTY + 4
  495.  ENDM
  496.  
  497.  .data
  498.  cstr db rdata_mak (format)
  499.     .code
  500.  push eax
  501.  push edx
  502.  push ecx
  503.  
  504.  %tem_push_arg tem_rev_arg (arglist)
  505.  
  506.  push offset cstr
  507.  CALLIt printf
  508.  add esp, 4
  509.  add esp, ARGLIST_EMPTY
  510.  
  511.  pop ecx
  512.  pop edx
  513.  pop eax
  514. endm
  515. DEBUG_OUT equ tem_print
  516.  
  517. ENDIF
  518.  
  519.  
  520. ;; GBA Mmu Operate
  521. MmuReadByte equ agb_mbus_rb@8
  522. MmuReadHalfWord equ agb_mbus_rhw@8
  523. MmuReadWord equ agb_mbus_rw@8
  524. MmuWriteByte equ agb_mbus_wb@12
  525. MmuWriteHalfWord equ agb_mbus_whw@12
  526. MmuWriteWord equ agb_mbus_ww@12
  527. FetchARM7Code equ agb_code_rw@8
  528. FetchThumbCode equ agb_code_rhw@8
  529.  
  530. IF 1
  531. CALLIt macro Symbol
  532.  call Symbol
  533. endm
  534. ELSE
  535. CALLIt macro Symbol
  536.  CALLIt dword ptr[Symbol]
  537. endm
  538. ENDIF
  539.  
  540. CallMemOrIO macro Symbol
  541.  push [SC_ARM7].agb
  542.  CALLIt Symbol
  543. endm
  544. CallMemOrIOAddWaitState macro Symbol
  545.  push [SC_ARM7].agb
  546.  CALLIt Symbol
  547.  add SC_GOAL_COUNT, [SC_ARM7].waitState
  548. endm
  549.  
  550. Add_WaitStateClks equ add SC_GOAL_COUNT, [SC_ARM7].waitState
  551.  
  552. ;;  XXX:memory order indep
  553. arm7tdmi struct
  554.  
  555. SZ_STACK equ 13
  556. SZ_LRLINK equ 14
  557. SZ_PC equ 15
  558. SZ_CPSR equ 16
  559.  
  560.  Regs dd 17 dup (?)
  561.  R812_T dd 10 dup (?)
  562.  R1314_T dd 12 dup (?)
  563.  SPSR_T dd 6 dup (?)
  564.  Opcode dd 2 dup (?)
  565.  IME dd ?
  566.  IFS dd ?
  567.  IE dd ?
  568.  waitState dd ?
  569.  waitStateTemp dd ?
  570.  agb dd ?
  571.  ;; owiBank dd ? ;; for opcode cache switch, always pointer to next empty opcode
  572. arm7tdmi ends
  573.  
  574. IRQ_INHIBI_MASK equ 080000000h
  575. FIQ_INHIBI_MASK equ 040000000h
  576.  
  577. MODE_SYS equ 001Fh
  578. MODE_USER equ 00010h
  579. MODE_SFT_BASE_PSR equ 24
  580. FLAG_THUMB equ 020000000H
  581. FLAG_CZ equ (FLAG_C or FLAG_Z)
  582. FLAG_NZ equ (FLAG_N or FLAG_Z)
  583. FLAG_C equ 000100H
  584. FLAG_V equ 000001H
  585. FLAG_N equ 008000H
  586. FLAG_Z equ 004000H
  587. FLAG_N_TOLSB_BIT equ 15
  588. FLAG_N_TO_V_ALIGN_BIT equ 15
  589. FLAG_N_TO_V_ALIGN_SHIFT equ shr
  590. FLAG_V_TOLSB_BIT equ 0
  591. FLAG_Z_TOLSB_BIT equ 14
  592. FLAG_C_TOLSB_BIT equ 8
  593. FLAG_CHECK_C_X86_BT equ 8
  594. FLAG_MSR_FLAGS equ 00080000h
  595. FLAG_MSR_CTL equ 00010000h
  596. R812b_BLOCK equ 20
  597. R812b_FIQ equ R812b_BLOCK *0
  598. R812b_OTHER equ R812b_BLOCK *1
  599. R1314b_BLOCK equ 8
  600. R1314b_SYSUSER equ R1314b_BLOCK*0
  601. R1314b_FIQ equ R1314b_BLOCK*1
  602. R1314b_IRQ equ R1314b_BLOCK*2
  603. R1314b_UNDEF equ R1314b_BLOCK*3
  604. R1314b_MGR equ R1314b_BLOCK*4
  605. R1314b_ABORT equ R1314b_BLOCK*5
  606. SPSRb_BLOCK equ 4
  607. SPSRb_FIQ equ SPSRb_BLOCK*0
  608. SPSRb_SYSUSER equ SPSRb_BLOCK*1
  609. SPSRb_IRQ equ SPSRb_BLOCK*2
  610. SPSRb_UNDEF equ SPSRb_BLOCK*3
  611. SPSRb_MGR equ SPSRb_BLOCK*4
  612. SPSRb_ABORT equ SPSRb_BLOCK*5
  613. XRFI equ dword ptr[SC_ARM7].Regs
  614. XRFI16 equ word ptr[SC_ARM7].Regs
  615. XRFI8 equ byte ptr[SC_ARM7].Regs
  616.  
  617. SetNZCV_A macro sub_bit ;; 1 indicate sub otherwise 0
  618.  lahf
  619.  seto al
  620.  xor ah, sub_bit
  621.  mov SC_CPSR16, ax
  622. endm
  623. SetNZC_A macro sub_bit ;; 1 indicate sub otherwise 0
  624.  lahf
  625.  mov SC_CPSR16H, ah
  626. endm
  627. ClrNZ_SetC_A macro
  628.  lahf
  629.  and SC_CPSR, not (FLAG_N or FLAG_Z or FLAG_C)
  630.  and eax, FLAG_C
  631.  or SC_CPSR, eax
  632. endm
  633. SetNZ_A macro
  634.  lahf
  635.  and SC_CPSR, not (FLAG_N or FLAG_Z) ;; nz clear
  636.  and eax, FLAG_NZ ;; save nz
  637.  or SC_CPSR, eax ;;nz reset  
  638. endm
  639.  
  640. Set_NZmul32 macro out_reg
  641.  sub out_reg, 0
  642.  SetNZ_A
  643. endm
  644.  
  645. Set_NZmul64 macro out_lo, out_hi
  646.  and SC_CPSR, not (FLAG_N or FLAG_Z) ;; nz clear
  647.  test out_hi, 080000000H
  648.  jne @F
  649.  or SC_CPSR, FLAG_N
  650. @@: or out_hi, out_lo
  651.  jne @F
  652.  or SC_CPSR, FLAG_Z
  653. @@:
  654. endm
  655.  
  656. ;; ToStandCPSR
  657. ;; destroy :  ecx, eax
  658. ToStandCPSR macro _PostRegs, _REC, TRegs1_Alpha, TRegs2_Alpha
  659. ;; 31 30 29 28  27 26 25 24  23 22 21 20  19 18 17 16  15 14 13 12  11 10 9 8  7 6 5 4  3 2 1 0 (MINE)
  660. ;;  I  F  T  M   M  M  M  M   R  R  R  R   R  R  R  R   N  Z  R  R   R  R R C  R R R R  R R R V
  661. ;; 31 30 29 28  27 26 25 24  23 22 21 20  19 18 17 16  15 14 13 12  11 10 9 8  7 6 5 4  3 2 1 0 (STD)
  662. ;;  N  Z  C  V   R  R  R  R   R  R  R  R   R  R  R  R   R  R  R  R   R  R R R  I F T M  M M M M
  663. epx equ e&TRegs1_Alpha&x
  664. px equ TRegs1_Alpha&x
  665. emx equ e&TRegs2_Alpha&x  
  666. mx equ TRegs2_Alpha&x  
  667. pl equ TRegs1_Alpha&l
  668. ph equ TRegs1_Alpha&h
  669. ml equ TRegs2_Alpha&l
  670. mh equ TRegs2_Alpha&h
  671.  mov epx, _PostRegs
  672.  mov emx, _PostRegs
  673.  ror epx, 16
  674.  ror px, 8
  675.  shl mh, 1
  676.  and ml, 1
  677.  or mh, ml
  678.  and emx, 3
  679.  and epx, 0CFFFFFFFH
  680.  shl emx, 28
  681.  or epx, emx
  682.  or epx, 00FFFFF00H
  683.  mov _REC, epx
  684. endm
  685. ;; ToFastCPSR
  686. ;; destroy :  ecx, eax
  687. ToFastCPSR macro _PostRegs, _REC, TRegs1_Alpha, TRegs2_Alpha
  688. ;; 31 30 29 28  27 26 25 24  23 22 21 20  19 18 17 16  15 14 13 12  11 10 9 8  7 6 5 4  3 2 1 0 (MINE)
  689. ;;  I  F  T  M   M  M  M  M   R  R  R  R   R  R  R  R   N  Z  R  R   R  R R C  R R R R  R R R V
  690. ;; 31 30 29 28  27 26 25 24  23 22 21 20  19 18 17 16  15 14 13 12  11 10 9 8  7 6 5 4  3 2 1 0 (STD)
  691. ;;  N  Z  C  V   R  R  R  R   R  R  R  R   R  R  R  R   R  R  R  R   R  R R R  I F T M  M M M M
  692. epx equ e&TRegs1_Alpha&x
  693. px equ TRegs1_Alpha&x
  694. emx equ e&TRegs2_Alpha&x  
  695. mx equ TRegs2_Alpha&x  
  696. pl equ TRegs1_Alpha&l
  697. ph equ TRegs1_Alpha&h
  698. ml equ TRegs2_Alpha&l
  699. mh equ TRegs2_Alpha&h
  700.  mov epx, _PostRegs
  701.  mov emx, _PostRegs
  702.  ror epx, 8
  703.  ror emx, 20
  704.  mov pl, mh
  705.  mov ph, mh
  706.  shr ph, 1
  707.  shl emx, 4
  708.  and emx, 00000C000h
  709.  and epx, 0FFFF3FFFh
  710.  or epx, emx
  711.  or epx, 000FF3EFEh
  712.  mov _REC, epx
  713. endm
  714.  
  715. ;; destroy eax, ecx
  716. Imm8BitmapSft_AC macro Sft4Imm8, REC
  717.  mov eax, Sft4Imm8
  718.  mov ecx, Sft4Imm8
  719.  and eax, 0FFh
  720.  and ecx, 0F00h
  721.  shr ecx, 7
  722.  ror eax, cl
  723.  mov REC, eax
  724. endm
  725.  
  726. C_op_Care equ 0
  727. C_op_NOCare equ 1
  728.  
  729. ;; XXX: better case
  730. ShiftRegImm5 macro Post, REC, tr1c, tr2, lSym, C_op
  731.  mov tr1c, Post
  732.  mov tr2,   Post
  733.  shr tr1c, 5
  734.  and tr1c, 3
  735. IF C_op eq C_op_NOCare
  736.  mov [esp-8], SC_CPSR
  737.  IF ARM7_DEBUG ne 0
  738.    sub esp, 32
  739.  ENDIF
  740. ENDIF
  741.  jmp si5TAB&lSym[tr1c*4]
  742.  
  743. Si5SftOp macro X86Sft
  744.  mov tr1c, tr2
  745.  and tr2, 15
  746.  mov tr2, XRFI[tr2*4] ;; Get Rm.
  747.  shr tr1c, 7
  748.  and tr1c, 31
  749.  je @F
  750.  and SC_CPSR, not FLAG_C
  751.  X86Sft tr2, cl ;; check c
  752.  sbb tr1c, tr1c
  753.  and tr1c, FLAG_C
  754.  or SC_CPSR, tr1c
  755.  mov REC, tr2
  756.  jmp si5fi&lSym
  757. endm
  758.  ;; tr1c := 0
  759.  
  760.  si5LSL&lSym:
  761.    DEBUG_OUT "LSL #%d ", "SC_INVOLATILE}6 & 31"
  762.    Si5SftOp shl
  763.  @@:
  764.    mov REC, tr2
  765.    jmp si5fi&lSym
  766.    
  767.  si5LSR&lSym:
  768.    DEBUG_OUT "LSR #%d ", "SC_INVOLATILE}6 & 31"
  769.    Si5SftOp shr
  770. @@:
  771.    and SC_CPSR, not FLAG_C
  772.    xor tr1c, tr1c
  773.    bt tr2, 31 ;; check c[31]
  774.    sbb tr2, tr2
  775.    and tr2, FLAG_C
  776.    or SC_CPSR, tr2
  777.    mov REC, tr1c
  778.    jmp si5fi&lSym
  779.    
  780.  si5ASR&lSym:
  781.    DEBUG_OUT "ASR #%d ", "SC_INVOLATILE}6 & 31"
  782.    Si5SftOp sar
  783. @@:
  784.    and SC_CPSR, not FLAG_C
  785.    bt tr2, 31
  786.    sbb tr1c, tr1c
  787.    mov tr2, tr1c
  788.    and tr1c, FLAG_C
  789.    or SC_CPSR, tr1c
  790.    mov REC, tr2
  791.    jmp si5fi&lSym
  792.    
  793.  si5ROR&lSym:
  794.    DEBUG_OUT "ROR #%d ", "SC_INVOLATILE}6 & 31"
  795.    Si5SftOp ror
  796.  @@: ;; RRX.
  797.    DEBUG_OUT "...RRX "
  798.    and SC_CPSR, not FLAG_C
  799.    rcr tr2,  1 ;; check c
  800.    sbb tr1c, tr1c
  801.    and tr1c,  FLAG_C
  802.    or SC_CPSR, tr1c
  803.    mov REC, tr2
  804.    jmp si5fi&lSym
  805.  
  806.  si5TAB&lSym  dd si5LSL&lSym, si5LSR&lSym, si5ASR&lSym, si5ROR&lSym
  807.  si5fi&lSym:
  808. IF C_op eq C_op_NOCare
  809.  IF ARM7_DEBUG ne 0
  810.    add esp, 32
  811.  ENDIF
  812.  mov SC_CPSR, [esp-8]
  813. ENDIF  
  814.  DEBUG_OUT "Sft Result:%08X  ", "&REC&"
  815. endm
  816.  
  817. ;; XXX: better case
  818. ShiftRegRs macro Post, REC, tr1c, tr2, lSym, C_op
  819.  mov tr1c, Post
  820.  mov tr2,   Post
  821.  shr tr1c, 5
  822.  and tr1c, 3
  823. IF C_op eq C_op_NOCare
  824.  mov [esp-8], SC_CPSR
  825.  IF ARM7_DEBUG ne 0
  826.    sub esp, 32
  827.  ENDIF
  828. ENDIF
  829.  jmp rsTABcc&lSym[tr1c*4]
  830.  
  831. Rs_SftOp macro X86Sft
  832.  and SC_CPSR, not FLAG_C
  833.  X86Sft tr2, cl ;; check c
  834.  sbb tr1c, tr1c
  835.  and tr1c,  FLAG_C
  836.  or SC_CPSR, tr1c
  837.  mov REC, tr2
  838.  jmp rsfi&lSym
  839. endm  
  840. Rs_Stiff macro
  841.  mov tr1c, tr2
  842.  and tr2, 15
  843.  mov tr2, XRFI[tr2*4] ;; Get Rm.
  844.  shr tr1c, 8
  845.  and tr1c, 15
  846.  movzx tr1c, XRFI8[tr1c*4]
  847.  ;; TODO:better case ?
  848.  cmp tr1c, 32
  849.  jl @F
  850. endm
  851.  
  852.  rsLSL&lSym:
  853.    DEBUG_OUT "LSL R%d ", "SC_INVOLATILE}8 & 15"
  854.    Rs_Stiff
  855.    ;; Rs >= 32
  856.    sete cl
  857.    and ecx, 1
  858.    and SC_CPSR, not FLAG_C  
  859.    and tr1c, tr2
  860.    shl tr1c, FLAG_CHECK_C_X86_BT
  861.    or SC_CPSR, tr1c
  862.    xor REC, REC
  863.    jmp rsfi&lSym
  864.  @@:
  865.    test tr1c, tr1c
  866.    jne @F
  867.    ;; Rs := 0
  868.    mov REC, tr2
  869.    jmp rsfi&lSym
  870.  @@:
  871.    Rs_SftOp shl
  872.    
  873.  rsLSR&lSym:
  874.    DEBUG_OUT "LSR R%d ", "SC_INVOLATILE}8 & 15"
  875.    Rs_Stiff
  876.    ;; Rs >= 32
  877.    sete cl
  878.    and ecx, 1
  879.    and SC_CPSR, not FLAG_C
  880.    bt tr2, 31
  881.    sbb tr2, tr2      
  882.    and tr1c, tr2
  883.    shl tr1c, FLAG_CHECK_C_X86_BT
  884.    or SC_CPSR, tr1c
  885.    xor REC, REC
  886.    jmp rsfi&lSym  
  887.  @@:
  888.    test tr1c, tr1c
  889.    jne @F
  890.    ;; Rs := 0
  891.    mov REC, tr2
  892.    jmp rsfi&lSym
  893.  @@:
  894.    Rs_SftOp shr  
  895.    
  896.  rsASR&lSym:
  897.    DEBUG_OUT "ASR R%d ", "SC_INVOLATILE}8 & 15"
  898.    Rs_Stiff
  899.    ;; Rs >= 32
  900.    and SC_CPSR, not FLAG_C
  901.    shl tr2, 1
  902.    sbb tr2, tr2
  903.    mov tr1c, tr2
  904.    and tr2, 1
  905.    shl tr2, FLAG_CHECK_C_X86_BT
  906.    or SC_CPSR, tr2
  907.    mov REC, tr1c
  908.    jmp rsfi&lSym    
  909.  @@:
  910.    test tr1c, tr1c
  911.    jne @F
  912.    ;; Rs := 0
  913.    mov REC, tr2
  914.    jmp rsfi&lSym
  915.  @@:
  916.    Rs_SftOp sar  
  917.    
  918.  rsROR&lSym:
  919.    DEBUG_OUT "ROR R%d ", "SC_INVOLATILE}8 & 15"
  920.    mov tr1c, Post
  921.    shr tr1c, 8
  922.    and tr1c, 15
  923.    movzx tr1c, XRFI8[tr1c*4]
  924.    test tr1c, tr1c
  925.    jne @F
  926.    ;; Rs := 0
  927.    mov REC, tr2
  928.    jmp rsfi&lSym  
  929. @@:
  930.    and tr1c, 31
  931.    jne @F
  932.    and SC_CPSR, not FLAG_C
  933.    bt tr1c, 31
  934.    sbb tr1c, tr1c
  935.    and tr1c, FLAG_C
  936.    or SC_CPSR, tr1c
  937.    mov REC, tr2
  938.    jmp rsfi&lSym  
  939. @@:
  940.    Rs_SftOp ror  
  941.    
  942.  rsTABcc&lSym  dd rsLSL&lSym, rsLSR&lSym, rsASR&lSym, rsROR&lSym
  943.  rsfi&lSym:
  944. IF C_op eq C_op_NOCare
  945.  IF ARM7_DEBUG ne 0
  946.    add esp, 32
  947.  ENDIF
  948.  mov SC_CPSR, [esp-8]
  949. ENDIF
  950.  DEBUG_OUT "Sft Result:%08X  ", "&REC&"
  951. endm
  952.  
  953. SPSRToCPSR macro tr
  954.  ;; Copy SPSR to CPSR.
  955.  GetCurSPSRP tr
  956.  mov tr, [tr]
  957.  ;; Switch CPU mode.
  958.  SwitchMode tr
  959. endm
  960.  
  961. SC_CPSR8 equ bl
  962. SC_CPSR16 equ bx
  963. SC_CPSR16H equ bh
  964. SC_CPSR equ ebx
  965. SC_GOAL_COUNT equ ebp
  966. SC_GOAL_COUNT16 equ bp
  967. SC_ARM7 equ esi
  968. SC_INVOLATILE equ edi
  969.  
  970. ;; std fetch .
  971. arm7ClksFetch1 macro
  972.  add SC_GOAL_COUNT, 1
  973.  mov SC_INVOLATILE, XRFI[SZ_PC*4]
  974.  mov eax, SC_INVOLATILE
  975.  and eax, -4
  976.  push eax
  977.  CallMemOrIOAddWaitState FetchARM7Code
  978.  mov [SC_ARM7].Opcode[4], eax
  979.  add SC_INVOLATILE, 4
  980.  mov XRFI[SZ_PC*4], SC_INVOLATILE
  981.  jmp clksloop
  982. endm
  983. arm7ClksFetchN macro Clks
  984.  add SC_GOAL_COUNT, Clks
  985.  mov SC_INVOLATILE, XRFI[SZ_PC*4]
  986.  mov eax, SC_INVOLATILE
  987.  and eax, -4
  988.  push eax
  989.  CallMemOrIOAddWaitState FetchARM7Code
  990.  mov [SC_ARM7].Opcode[4], eax
  991.  add SC_INVOLATILE, 4
  992.  mov XRFI[SZ_PC*4], SC_INVOLATILE
  993.  jmp clksloop
  994. endm
  995. tbClksFetch1 macro
  996.  add SC_GOAL_COUNT, 1
  997.  mov SC_INVOLATILE, XRFI[SZ_PC*4]
  998.  mov eax, SC_INVOLATILE
  999.  and eax, -2
  1000.  push eax
  1001.  CallMemOrIOAddWaitState FetchThumbCode
  1002.  mov [SC_ARM7].Opcode[4], eax
  1003.  add SC_INVOLATILE, 2
  1004.  mov XRFI[SZ_PC*4], SC_INVOLATILE
  1005.  jmp clksloop
  1006. endm
  1007. tbClksFetchN macro Clks
  1008.  add SC_GOAL_COUNT, Clks
  1009.  mov SC_INVOLATILE, XRFI[SZ_PC*4]
  1010.  mov eax, SC_INVOLATILE
  1011.  and eax, -2
  1012.  push eax
  1013.  CallMemOrIOAddWaitState FetchThumbCode
  1014.  mov [SC_ARM7].Opcode[4], eax
  1015.  add SC_INVOLATILE, 2
  1016.  mov XRFI[SZ_PC*4], SC_INVOLATILE
  1017.  jmp clksloop
  1018. endm
  1019. arm7PipelineFlush macro Clks
  1020.  mov SC_INVOLATILE, XRFI[SZ_PC*4]
  1021.  add SC_GOAL_COUNT, Clks
  1022.  mov eax, SC_INVOLATILE
  1023.  add SC_INVOLATILE, 4
  1024.  and eax, -4
  1025.  push eax  
  1026.  CallMemOrIOAddWaitState FetchThumbCode
  1027.  mov ecx, SC_INVOLATILE
  1028.  add SC_INVOLATILE, 4
  1029.  and ecx, -4
  1030.  push ecx  
  1031.  mov dword ptr[SC_ARM7].Opcode[0], eax
  1032.  CallMemOrIOAddWaitState FetchThumbCode  
  1033.  mov dword ptr[SC_ARM7].Opcode[4], eax
  1034.  mov XRFI[SZ_PC*4], SC_INVOLATILE
  1035.  jmp clksloop
  1036. endm
  1037. tbPipelineFlush macro Clks
  1038.  mov SC_INVOLATILE, XRFI[SZ_PC*4]
  1039.  add SC_GOAL_COUNT, Clks
  1040.  mov eax, SC_INVOLATILE
  1041.  add SC_INVOLATILE, 2
  1042.  and eax, -2
  1043.  push eax  
  1044.  CallMemOrIOAddWaitState FetchThumbCode
  1045.  mov ecx, SC_INVOLATILE
  1046.  add SC_INVOLATILE, 2
  1047.  and ecx, -2
  1048.  push ecx  
  1049.  mov dword ptr[SC_ARM7].Opcode[0], eax
  1050.  CallMemOrIOAddWaitState FetchThumbCode  
  1051.  mov dword ptr[SC_ARM7].Opcode[4], eax
  1052.  mov XRFI[SZ_PC*4], SC_INVOLATILE
  1053.  jmp clksloop
  1054. endm
  1055.  
  1056. GetRFI macro Post, BitStart, REC
  1057.  mov REC, Post
  1058.  shr REC, BitStart
  1059.  and REC, 00Fh  
  1060. endm
  1061. GetRFIV macro Post, BitStart, REC
  1062.  GetRFI  Post, BitStart, REC
  1063.  mov REC, XRFI[REC*4]
  1064. endm
  1065. GetRFI_T macro Post, BitStart, REC
  1066.  mov REC, Post
  1067.  shr REC, BitStart
  1068.  and REC, 07h  
  1069. endm
  1070. GetRFIV_T macro Post, BitStart, REC
  1071.  GetRFI  Post, BitStart, REC
  1072.  mov REC, XRFI[REC*4]
  1073. endm
  1074.  
  1075. GetCurSPSRP macro REC
  1076.  
  1077.  LOCAL FIQ
  1078.  LOCAL IRQ
  1079.  LOCAL UDEF
  1080.  LOCAL SYS
  1081.  LOCAL USER
  1082.  LOCAL SVC
  1083.  LOCAL ABT
  1084.  LOCAL FINAL
  1085.  LOCAL SPSR_TABLE
  1086.  
  1087.  mov REC, SC_CPSR
  1088.  and REC, 01F000000h
  1089.  shr REC, 24
  1090.  jmp dword ptr [SPSR_TABLE+REC*4]
  1091.  
  1092.  ;; ---------------------------------------------------------------------------------
  1093.  SYS:
  1094.  USER:
  1095.    lea REC, [SC_ARM7].SPSR_T[SPSRb_SYSUSER]
  1096.    jmp FINAL
  1097.  FIQ:
  1098.    lea REC, [SC_ARM7].SPSR_T[SPSRb_FIQ]
  1099.    jmp FINAL
  1100.  UDEF:
  1101.    lea REC, [SC_ARM7].SPSR_T[SPSRb_UNDEF]
  1102.    jmp FINAL
  1103.  ABT:
  1104.    lea REC, [SC_ARM7].SPSR_T[SPSRb_FIQ]
  1105.    jmp FINAL
  1106.  SVC:
  1107.    lea REC, [SC_ARM7].SPSR_T[SPSRb_MGR]
  1108.    jmp FINAL
  1109.  IRQ:
  1110.    lea REC, [SC_ARM7].SPSR_T[SPSRb_IRQ]
  1111.    jmp FINAL
  1112.  .data
  1113.  ALIGN_Z
  1114.  SPSR_TABLE       dd USER, FIQ, IRQ, SVC
  1115.                    dd USER, USER, USER, ABT
  1116.                    dd USER, USER, USER, UDEF
  1117.                    dd USER, USER, USER, SYS
  1118.  .code
  1119.  FINAL:
  1120. endm
  1121.  
  1122. ;; switch SC_ARM7 mode
  1123. ;; destroy: eax, ecx, edx
  1124. SwitchMode macro SG_PSR, CPSR_Copy_dis:=<0>
  1125.  
  1126.  LOCAL FIQ
  1127.  LOCAL IRQ
  1128.  LOCAL UDEF
  1129.  LOCAL USER
  1130.  LOCAL SVC
  1131.  LOCAL ABT
  1132.  LOCAL SPSR_TABLE
  1133.  LOCAL FIQ2
  1134.  LOCAL IRQ2  
  1135.  LOCAL UDEF2  
  1136.  LOCAL USER2  
  1137.  LOCAL SVC2
  1138.  LOCAL ABT2
  1139.  LOCAL SPSR2_TABLE
  1140.  LOCAL FINAL
  1141.  
  1142.  mov eax, SG_PSR
  1143.  mov edx, SC_CPSR
  1144.  mov ecx, SC_CPSR
  1145.  mov SC_CPSR, eax
  1146.  and eax, 01F000000h
  1147.  and edx, 01F000000h
  1148.  shr eax, 24
  1149.  shr edx, 24
  1150.  cmp eax, edx ;; edx:old mode.  eax:new mode  ecx: old full
  1151.  je FINAL
  1152.  sub eax, 16
  1153.  sub edx, 16
  1154.  jmp dword ptr [SPSR_TABLE+edx*4]
  1155.  
  1156.  saveR8_12 macro R812Bank, Post
  1157.    mov Post, XRFI[8*4]
  1158.    mov [SC_ARM7].R812_T[R812Bank+0*4], Post
  1159.    mov Post, XRFI[9*4]
  1160.    mov [SC_ARM7].R812_T[R812Bank+1*4], Post
  1161.    mov Post, XRFI[10*4]
  1162.    mov [SC_ARM7].R812_T[R812Bank+2*4], Post
  1163.    mov Post, XRFI[11*4]
  1164.    mov [SC_ARM7].R812_T[R812Bank+3*4], Post  
  1165.    mov Post, XRFI[12*4]
  1166.    mov [SC_ARM7].R812_T[R812Bank+4*4], Post  
  1167.  endm
  1168.  saveR13_14 macro R1314Bank, Post
  1169.    mov Post, XRFI[13*4]
  1170.    mov [SC_ARM7].R1314_T[R1314Bank+0*4], Post
  1171.    mov Post, XRFI[14*4]
  1172.    mov [SC_ARM7].R1314_T[R1314Bank+1*4], Post
  1173.  endm
  1174.  loadR8_12 macro R812Bank, Post
  1175.    mov Post,  [SC_ARM7].R812_T[R812Bank+0*4]
  1176.    mov XRFI[8*4], Post
  1177.    mov Post,  [SC_ARM7].R812_T[R812Bank+1*4]
  1178.    mov XRFI[9*4] , Post
  1179.    mov Post,  [SC_ARM7].R812_T[R812Bank+2*4]
  1180.    mov XRFI[10*4], Post
  1181.    mov Post,  [SC_ARM7].R812_T[R812Bank+3*4]
  1182.    mov XRFI[11*4], Post  
  1183.    mov Post,  [SC_ARM7].R812_T[R812Bank+4*4]
  1184.    mov XRFI[12*4], Post  
  1185.  endm
  1186.  loadR13_14 macro R1314Bank, Post
  1187.    mov Post,  [SC_ARM7].R1314_T[R1314Bank+0*4]
  1188.    mov XRFI[13*4] , Post
  1189.    mov Post,  [SC_ARM7].R1314_T[R1314Bank+1*4]
  1190.    mov XRFI[14*4] , Post
  1191.  endm  
  1192.  ;; -------------------------------------- Mode Current Check Save to banklk --------------------------------------------
  1193.  USER:
  1194.    saveR8_12 R812b_OTHER, edx
  1195.    saveR13_14 R1314b_SYSUSER, edx
  1196.    jmp dword ptr [SPSR2_TABLE+eax*4]
  1197.  FIQ:
  1198.    saveR8_12 R812b_FIQ, edx
  1199.    saveR13_14 R1314b_FIQ, edx  
  1200.    jmp dword ptr [SPSR2_TABLE+eax*4]
  1201.  UDEF:
  1202.    saveR8_12 R812b_OTHER, edx
  1203.    saveR13_14 R1314b_UNDEF, edx
  1204.    jmp dword ptr [SPSR2_TABLE+eax*4]
  1205.  ABT:
  1206.    saveR8_12 R812b_OTHER, edx
  1207.    saveR13_14 R1314b_ABORT, edx  
  1208.    jmp dword ptr [SPSR2_TABLE+eax*4]
  1209.  SVC:
  1210.    saveR8_12 R812b_OTHER, edx
  1211.    saveR13_14 R1314b_MGR, edx  
  1212.    jmp dword ptr [SPSR2_TABLE+eax*4]
  1213.  IRQ:
  1214.    saveR8_12 R812b_OTHER, edx
  1215.    saveR13_14 R1314b_IRQ, edx  
  1216.    jmp dword ptr [SPSR2_TABLE+eax*4]    
  1217.  ;; -------------------------------------- Mode New Check Store to runtime regs group --------------------------------------------
  1218.  USER2:  
  1219.    loadR8_12 R812b_OTHER, eax
  1220.    loadR13_14 R1314b_SYSUSER, eax  
  1221.    jmp FINAL
  1222.  FIQ2:
  1223.    loadR8_12 R812b_FIQ, eax
  1224.    loadR13_14 R1314b_FIQ, eax
  1225.    IF CPSR_Copy_dis eq 0
  1226.      mov [SC_ARM7].SPSR_T[SPSRb_FIQ], ecx
  1227.    ENDIF
  1228.    jmp FINAL
  1229.  UDEF2:
  1230.    loadR8_12 R812b_OTHER, eax
  1231.    loadR13_14 R1314b_UNDEF, eax
  1232.    IF CPSR_Copy_dis eq 0
  1233.      mov [SC_ARM7].SPSR_T[SPSRb_UNDEF], ecx
  1234.    ENDIF
  1235.    jmp FINAL
  1236.  ABT2:
  1237.    loadR8_12 R812b_OTHER, eax
  1238.    loadR13_14 R1314b_ABORT, eax
  1239.    IF CPSR_Copy_dis eq 0
  1240.      mov [SC_ARM7].SPSR_T[SPSRb_ABORT], ecx
  1241.    ENDIF
  1242.    jmp FINAL
  1243.  SVC2:
  1244.    loadR8_12 R812b_OTHER, eax
  1245.    loadR13_14 R1314b_MGR, eax
  1246.    IF CPSR_Copy_dis eq 0
  1247.      mov [SC_ARM7].SPSR_T[SPSRb_MGR], ecx
  1248.    ENDIF
  1249.    jmp FINAL
  1250.  IRQ2:
  1251.    loadR8_12 R812b_OTHER, eax
  1252.    loadR13_14 R1314b_IRQ, eax
  1253.    IF CPSR_Copy_dis eq 0
  1254.      mov [SC_ARM7].SPSR_T[SPSRb_IRQ], ecx
  1255.    ENDIF
  1256.    jmp FINAL
  1257.    
  1258.  .data
  1259.  ALIGN_Z
  1260.  SPSR_TABLE       dd USER, FIQ, IRQ, SVC
  1261.                    dd USER, USER, USER, ABT
  1262.                    dd USER, USER, USER, UDEF
  1263.                    dd USER, USER, USER, USER
  1264.  SPSR2_TABLE       dd USER2, FIQ2, IRQ2, SVC2
  1265.                    dd USER2, USER2, USER2, ABT2
  1266.                    dd USER2, USER2, USER2, UDEF2
  1267.                    dd USER2, USER2, USER2, USER2                  
  1268.  .code
  1269.  FINAL:
  1270. endm
  1271.  
  1272. .code
  1273. ;; arm7tdmi_ticks c prototype
  1274. ;; uint16_t arm7tdmi_ticks (struct arm7tdmi *arm7, int16_t runticks)
  1275. ;; runticks < 0?exec one instruction : exec ticks.
  1276. ;; ret: real exec ticks.
  1277. arm7tdmi_ticks proc c
  1278.             option prologue:none, epilogue:none
  1279.  
  1280.  push edi
  1281.  push esi
  1282.  push ebp
  1283.  push ebx
  1284.  
  1285.  STACK_PUSH equ 16
  1286.    assume SC_ARM7:ptr arm7tdmi
  1287.    
  1288.    mov SC_ARM7, [esp+4+STACK_PUSH]
  1289.    mov SC_GOAL_COUNT, [esp+8+STACK_PUSH]
  1290.    mov SC_CPSR, XRFI[SZ_CPSR*4]
  1291.    shl SC_GOAL_COUNT, 16
  1292.    ;; DEBUG_OUT 'HelloWorld:%d'
  1293.    
  1294.      ;; Instruction parsing main loop
  1295.      ALIGN_Z
  1296.      @@:
  1297.      ;; Check IRQ Interrpt
  1298.      test [SC_ARM7].IME, -1
  1299.      je dec_op  
  1300.      
  1301.      ;; IRQ Interrupt Gen, resume GBA's halt status
  1302.      test SC_CPSR, IRQ_INHIBI_MASK
  1303.      jne dec_op
  1304.      
  1305.      ;; Check IE, IF Mask
  1306.      mov eax, [SC_ARM7].IFS
  1307.      and eax, [SC_ARM7].IE
  1308.      and eax, GBA_IE_IF_MASK
  1309.      test eax, eax
  1310.      je dec_op
  1311.      
  1312.      mov eax, XRFI[SZ_PC*4]
  1313.      mov ecx, SC_CPSR
  1314.      and ecx, ARM7_MODE_CLR_MASK
  1315.      or ecx, ARM7_MODE_IRQ_MASK  ;; Set IRQ mode.
  1316.      and ecx, not FLAG_THUMB ;; Clear Thumb exec flag
  1317.      or ecx, IRQ_INHIBI_MASK ;; Set IRQ inhibit mask
  1318.      ;; PC to IRQ's LR, LR:= Current Instruction +4
  1319.      bt SC_CPSR, ARM7_THUMB_BIT
  1320.      sbb edx, edx
  1321.      xor edx, -1
  1322.      and edx, -4
  1323.      add edx, eax  
  1324.      mov [SC_ARM7].R1314_T[R1314b_IRQ +1*4], edx  
  1325.      ;; Adjust PC Pointer to IRQ Interrupt vector address
  1326.      mov XRFI[SZ_PC*4], ARM7_VECTOR_IRQ
  1327.      ;; switch Mode
  1328.      SwitchMode ecx
  1329.      ;; Prefetch Opcode pipeline
  1330.      arm7PipelineFlush 5 ;; minimum interrupt cycle delay  
  1331.    clksloop:
  1332.      mov eax, SC_GOAL_COUNT
  1333.      shr eax, 16
  1334.      cmp SC_GOAL_COUNT16, ax
  1335.      jl @B
  1336.      mov XRFI[SZ_CPSR*4], SC_CPSR
  1337.      movzx eax, SC_GOAL_COUNT16  
  1338.      pop ebx
  1339.      pop ebp
  1340.      pop esi
  1341.      pop edi
  1342.      ret  
  1343.      
  1344.      ;; CPU simulation.
  1345.      ;; According to the order section of the official manual DDI0210B.pdf of ARM7TDMI,
  1346.      ;; Because of the pipeline relationship, the PC pointer always points to the two instructions
  1347.      ;; after the current execution address before each instruction is executed by SC_ARM7.
  1348.      ;; This implicitly points out the following points.
  1349.      ;;
  1350.      ;; (1) Instruction execution is always in pipeline cycle >= 2 execution, which means
  1351.      ;; (2) Previous and at least two Fetch scripts (this operation may be included with specific implementation instructions)
  1352.      ;; (3) The first instruction code has been decoded, the second instruction code has been pushed to the first instruction code
  1353.      
  1354.    dec_op:
  1355.      mov eax, [SC_ARM7].Opcode[0]
  1356.      mov ecx, [SC_ARM7].Opcode[4]  
  1357.      mov [SC_ARM7].Opcode[0], ecx  
  1358.      mov SC_INVOLATILE, eax  ;; XCC: SC_INVOLATILE:init opcode.
  1359.      shr eax, 8
  1360.      nop
  1361.      test SC_CPSR, FLAG_THUMB
  1362.      je @F
  1363.      DEBUG_OUT "\n------------------------%08X------------------------\n", "ZF-4"
  1364.      DEBUG_OUT "R0:%08X R1:%08X R2:%08X R3:%08X \n", "Z0", "Z1", "Z2", "Z3"
  1365.      DEBUG_OUT "R4:%08X R5:%08X R6:%08X R7:%08X \n", "Z4", "Z5", "Z6", "Z7"
  1366.      DEBUG_OUT "R8:%08X R9:%08X R10:%08X R11:%08X R12:%08X \n", "Z8", "Z9", "ZA", "ZB", "ZC"
  1367.      DEBUG_OUT "SP:%08X LR:%08X  \n", "ZD", "ZE"
  1368.      DEBUG_OUT "OP:%04X M:%s \n", "O0&0FFFFh", "#"
  1369.      DEBUG_OUT "IRQ:%d N:%d Z:%d C:%d V:%d\n", "SC_CPSR}31 & 1", "SC_CPSR}15 & 1", "SC_CPSR}14 & 1", "SC_CPSR}8 & 1", "SC_CPSR & 1"
  1370.      and eax, 0FFh
  1371.      jmp sTAB[eax*4]  
  1372.      ALIGN_Z
  1373.      @@:  
  1374.      DEBUG_OUT "\n------------------------%08X------------------------\n", "ZF-8"
  1375.      DEBUG_OUT "R0:%08X R1:%08X R2:%08X R3:%08X \n", "Z0", "Z1", "Z2", "Z3"
  1376.      DEBUG_OUT "R4:%08X R5:%08X R6:%08X R7:%08X \n", "Z4", "Z5", "Z6", "Z7"
  1377.      DEBUG_OUT "R8:%08X R9:%08X R10:%08X R11:%08X R12:%08X \n", "Z8", "Z9", "ZA", "ZB", "ZC"
  1378.      DEBUG_OUT "SP:%08X LR:%08X  \n", "ZD", "ZE"
  1379.      DEBUG_OUT "OP:%08X M:%s \n", "O0", "#"
  1380.      DEBUG_OUT "IRQ:%d N:%d Z:%d C:%d V:%d\n", "SC_CPSR}31 & 1", "SC_CPSR}15 & 1", "SC_CPSR}14 & 1", "SC_CPSR}8 & 1", "SC_CPSR & 1"
  1381.      shr eax, 20
  1382.      jmp fTAB[eax*4]
  1383.      
  1384.      fEQ:
  1385.        DEBUG_OUT "Cond:EQ "
  1386.        test SC_CPSR, FLAG_Z
  1387.        jne fAL
  1388.      fNV:
  1389.        DEBUG_OUT  ":Skip "
  1390.        arm7ClksFetch1
  1391.      fNE:  
  1392.        DEBUG_OUT "Cond:NE "
  1393.        test SC_CPSR, FLAG_Z
  1394.        je fAL
  1395.        arm7ClksFetch1    
  1396.      fCS:
  1397.        DEBUG_OUT "Cond:CS "
  1398.        test SC_CPSR, FLAG_C
  1399.        jne fAL
  1400.        jmp fNV
  1401.      fCC:
  1402.        DEBUG_OUT "Cond:CC "
  1403.        test SC_CPSR, FLAG_C
  1404.        je fAL
  1405.        jmp fNV
  1406.      fMI:      
  1407.        DEBUG_OUT "Cond:MI "
  1408.        test SC_CPSR, FLAG_N
  1409.        jne fAL  
  1410.        jmp fNV      
  1411.      fPL:
  1412.        DEBUG_OUT "Cond:PL "
  1413.        test SC_CPSR, FLAG_N
  1414.        je fAL
  1415.        jmp fNV
  1416.      fVS:
  1417.        DEBUG_OUT "Cond:VS "
  1418.        test SC_CPSR, FLAG_V
  1419.        jne fAL
  1420.        jmp fNV
  1421.      fVC:
  1422.        DEBUG_OUT "Cond:VC "
  1423.        test SC_CPSR, FLAG_V
  1424.        je fAL
  1425.        jmp fNV
  1426.      fHI: ;; C = 1 && Z = 0
  1427.        DEBUG_OUT "Cond:HI "
  1428.        mov ecx, SC_CPSR
  1429.        and ecx, FLAG_CZ
  1430.        cmp ecx, FLAG_C
  1431.        je fAL
  1432.        jmp fNV
  1433.      fLS: ;; C = 0 || Z = 1
  1434.        DEBUG_OUT "Cond:LS "
  1435.        mov ecx, SC_CPSR
  1436.        and ecx, FLAG_CZ
  1437.        xor ecx, FLAG_C
  1438.        jne fAL
  1439.        jmp fNV
  1440.      fGE: ;; N = V
  1441.        DEBUG_OUT "Cond:GE "
  1442.        mov eax, SC_CPSR
  1443.        mov ecx, SC_CPSR
  1444.        shr eax, FLAG_V_TOLSB_BIT
  1445.        shr ecx, FLAG_N_TOLSB_BIT  
  1446.        and eax, 1
  1447.        and ecx, 1
  1448.        xor eax, ecx
  1449.        je fAL
  1450.        jmp fNV
  1451.      fLT:  ;; N != V
  1452.        DEBUG_OUT "Cond:LT "
  1453.        mov eax, SC_CPSR
  1454.        mov ecx, SC_CPSR
  1455.        shr eax, FLAG_V_TOLSB_BIT
  1456.        shr ecx, FLAG_N_TOLSB_BIT  
  1457.        and eax, 1
  1458.        and ecx, 1
  1459.        xor eax, ecx
  1460.        jne fAL
  1461.        jmp fNV  
  1462.      fGT: ;;    N = V  && Z= 0
  1463.        DEBUG_OUT "Cond:GT "
  1464.        mov eax, SC_CPSR
  1465.        mov ecx, SC_CPSR
  1466.        shr eax, FLAG_V_TOLSB_BIT
  1467.        shr ecx, FLAG_N_TOLSB_BIT  
  1468.        and eax, 1
  1469.        and ecx, 1
  1470.        xor eax, ecx
  1471.        mov ecx, SC_CPSR
  1472.        shr ecx, FLAG_Z_TOLSB_BIT
  1473.        and ecx, 1
  1474.        or eax, ecx
  1475.        je fAL
  1476.        jmp fNV
  1477.      fLE: ;;  Z = 1 || N!=V
  1478.        DEBUG_OUT "Cond:LE "
  1479.        mov eax, SC_CPSR
  1480.        mov ecx, SC_CPSR
  1481.        shr eax, FLAG_V_TOLSB_BIT
  1482.        shr ecx, FLAG_N_TOLSB_BIT  
  1483.        and eax, 1
  1484.        and ecx, 1
  1485.        xor eax, ecx
  1486.        mov ecx, SC_CPSR
  1487.        shr ecx, FLAG_Z_TOLSB_BIT
  1488.        and ecx, 1
  1489.        or eax, ecx
  1490.        je fNV  
  1491.      fAL: ;; 1110
  1492.        mov ecx, SC_INVOLATILE
  1493.        mov eax, SC_INVOLATILE
  1494.        mov edx, SC_INVOLATILE
  1495.        and edx, -1
  1496.        rol ecx,  8
  1497.        nop
  1498.        rol cx, 4
  1499.        nop
  1500.        and ecx, 0FFh
  1501.        nop
  1502.        jmp jTAB[ecx*4]
  1503.  
  1504.        AND_OP equ 0
  1505.        EOR_OP equ 1
  1506.        SUB_OP equ 2
  1507.        RSB_OP equ 3
  1508.        ADD_OP equ 4
  1509.        ADC_OP equ 5
  1510.        SBC_OP equ 6
  1511.        RSC_OP equ 7
  1512.        TST_OP equ 8
  1513.        TEQ_OP equ 9
  1514.        CMP_OP equ 10
  1515.        CMN_OP equ 11
  1516.        ORR_OP equ 12
  1517.        MOV_OP equ 13
  1518.        BIC_OP equ 14
  1519.        MVN_OP equ 15
  1520.        
  1521.        i8r4TAB dd i8r4AND, i8r4ANDS, i8r4EOR, i8r4EORS
  1522.                  dd i8r4SUB, i8r4SUBS, i8r4RSB, i8r4RSBS
  1523.                  dd i8r4ADD, i8r4ADDS, i8r4ADC, i8r4ADCS
  1524.                  dd i8r4SBC, i8r4SBCS, i8r4RSC, i8r4RSCS
  1525.                  dd i8r4UB, i8r4TST, i8r4ToCPSR, i8r4TEQ
  1526.                  dd i8r4UB, i8r4CMP, i8r4ToSPSR, i8r4CMN  
  1527.                  dd i8r4ORR, i8r4ORRS, i8r4MOV, i8r4MOVS
  1528.                  dd i8r4BIC, i8r4BICS, i8r4MVN, i8r4MVNS
  1529.        si5TAB dd si5AND, si5ANDS, si5EOR, si5EORS
  1530.                  dd si5SUB, si5SUBS, si5RSB, si5RSBS
  1531.                  dd si5ADD, si5ADDS, si5ADC, si5ADCS
  1532.                  dd si5SBC, si5SBCS, si5RSC, si5RSCS
  1533.                  dd si5PSR1, si5TST, si5PSR2, si5TEQ
  1534.                  dd si5PSR3, si5CMP, si5PSR4, si5CMN  
  1535.                  dd si5ORR, si5ORRS, si5MOV, si5MOVS
  1536.                  dd si5BIC, si5BICS, si5MVN, si5MVNS
  1537.        rsTAB dd rsAND, rsANDS, rsEOR, rsEORS ;; 0  0  0  0  0
  1538.                  dd rsSUB, rsSUBS, rsRSB, rsRSBS ;; 0  0  1  0  0
  1539.                  dd rsADD, rsADDS, rsADC, rsADCS ;; 0  1  0  0  0
  1540.                  dd rsSBC, rsSBCS, rsRSC, rsRSCS ;; 0  1  1  0  0
  1541.                  dd rsUB, rsTST, rsBX, rsTEQ   ;; 1  0  0  0  0
  1542.                  dd rsUB, rsCMP, rsUB, rsCMN ;; 1  0  1  0  0
  1543.                  dd rsORR, rsORRS, rsMOV, rsMOVS ;; 1  1  0  0  0
  1544.                  dd rsBIC, rsBICS, rsMVN, rsMVNS ;; 1  1  1  0  0    
  1545.                  ;; LDR/STR Word/Byte Imm12
  1546.                                 ;; P  U  B  W  L            
  1547.        nTAB    dd n0, n1, n2, n3 ;; 0  0  0  0  0
  1548.                  dd n4, n5, n6, n7 ;; 0  0  1  0  0
  1549.                  dd n8, n9, n10, n11 ;; 0  1  0  0  0
  1550.                  dd n12, n13, n14, n15 ;; 0  1  1  0  0
  1551.                  dd n16, n17, n18, n19 ;; 1  0  0  0  0
  1552.                  dd n20, n21, n22, n23 ;; 1  0  1  0  0
  1553.                  dd n24, n25, n26, n27 ;; 1  1  0  0  0
  1554.                  dd n28, n29, n30, n31 ;; 1  1  1  0  0    
  1555.                ;; LDR/STR Word/Byte Scaled                  
  1556.                                 ;; P  U  B  W  L            
  1557.        eTAB    dd e0, e1, e2, e3 ;; 0  0  0  0  0
  1558.                  dd e4, e5, e6, e7 ;; 0  0  1  0  0
  1559.                  dd e8, e9, e10, e11 ;; 0  1  0  0  0
  1560.                  dd e12, e13, e14, e15 ;; 0  1  1  0  0
  1561.                  dd e16, e17, e18, e19 ;; 1  0  0  0  0
  1562.                  dd e20, e21, e22, e23 ;; 1  0  1  0  0
  1563.                  dd e24, e25, e26, e27 ;; 1  1  0  0  0
  1564.                  dd e28, e29, e30, e31 ;; 1  1  1  0  0  
  1565.                  
  1566.                  ;; LDR/STR HalfWord/SByte Imm8 Hash
  1567.                              ;; P  U  X1 W X2      
  1568.        cTAB    dd c0, c1, c2, c3 ;; 0  0  0  0  0
  1569.                  dd c4, c5, c6, c7 ;; 0  0  1  0  0
  1570.                  dd c8, c9, c10, c11 ;; 0  1  0  0  0
  1571.                  dd c12, c13, c14, c15 ;; 0  1  1  0  0
  1572.                  dd c16, c17, c18, c19 ;; 1  0  0  0  0
  1573.                  dd c20, c21, c22, c23 ;; 1  0  1  0  0
  1574.                  dd c24, c25, c26, c27 ;; 1  1  0  0  0
  1575.                  dd c28, c29, c30, c31 ;; 1  1  1  0  0
  1576.                    ;; LDR/STR HalfWord/SByte  Rm, Rn Hash
  1577.                                                   ;; P  U  X1 W X2            
  1578.        pTAB    dd p0, p1, p2, p3 ;; 0  0  0  0  0
  1579.                  dd p4, p5, p6, p7 ;; 0  0  1  0  0
  1580.                  dd p8, p9, p10, p11 ;; 0  1  0  0  0
  1581.                  dd p12, p13, p14, p15 ;; 0  1  1  0  0
  1582.                  dd p16, p17, p18, p19 ;; 1  0  0  0  0
  1583.                  dd p20, p21, p22, p23 ;; 1  0  1  0  0
  1584.                  dd p24, p25, p26, p27 ;; 1  1  0  0  0
  1585.                  dd p28, p29, p30, p31 ;; 1  1  1  0  0
  1586.                                                  ;; P  U  X1 W X2  
  1587.                                                   ;; X1 X2     3:= LDRSH (7)
  1588.                                                   ;;        2:= STRHW (1)  
  1589.                                                   ;;        1:= LDRSB (6)
  1590.                                                   ;;        0:= LDRUH (5)  
  1591.                                 ;; LDM/STM Hash
  1592.                                 ;; P  U  S  W  L            
  1593.        zTAB    dd z0, z1, z2, z3 ;; 0  0  0  0  0
  1594.                  dd z4, z5, z6, z7 ;; 0  0  1  0  0
  1595.                  dd z8, z9, z10, z11 ;; 0  1  0  0  0
  1596.                  dd z12, z13, z14, z15 ;; 0  1  1  0  0
  1597.                  dd z16, z17, z18, z19 ;; 1  0  0  0  0
  1598.                  dd z20, z21, z22, z23 ;; 1  0  1  0  0
  1599.                  dd z24, z25, z26, z27 ;; 1  1  0  0  0
  1600.                  dd z28, z29, z30, z31 ;; 1  1  1  0  0
  1601.          fTAB dd fEQ, fNE, fCS, fCC
  1602.                   dd fMI, fPL, fVS, fVC
  1603.                  dd fHI, fLS, fGE, fLT
  1604.                  dd fGT, fLE, fAL, fNV
  1605.  
  1606.        pcMTAB dd 000h, 100h ;; 0 0 0
  1607.                   dd 000h, 000h ;; 0 1 0
  1608.                    dd 000h, 000h ;; 0 0 0
  1609.                   dd 0001h, 0101h ;; 0 1 0  
  1610.        MUL_OP equ 0
  1611.        MLA_OP equ 1
  1612.        UMUL64_OP equ 2
  1613.        UMLA64_OP equ 3  
  1614.        SMUL64_OP equ 4
  1615.        SMLA64_OP equ 5        
  1616.      
  1617.        ARM7_MUL_TAB dd mMUL, mMULS, mMLA, mMLAS
  1618.                     dd mUB, mUB, mUB, mUB
  1619.                     dd mUMUL64, mUMUL64S, mUMLA64, mUMLA64S
  1620.                     dd mSMUL64, mSMUL64S, mSMLA64, mSMLA64S
  1621.  
  1622.        ;; ARM7 Instruction Entry -----------------------------------------------------------------------------------
  1623.      AS_I8:
  1624.        DEBUG_OUT "I:AS_I8 **** "
  1625.        mov eax, edx
  1626.        and eax, 001F00000h
  1627.        shr eax, 20
  1628.        jmp i8r4TAB[eax*4]  
  1629.      SF_RS:
  1630.        DEBUG_OUT "I:SF_RS **** "
  1631.        mov eax, edx
  1632.        and eax, 001F00000h
  1633.        shr eax, 20  
  1634.        jmp rsTAB[eax*4]
  1635.      SF_I5:
  1636.        DEBUG_OUT "I:SF_I5 **** "
  1637.        mov eax, edx
  1638.        and eax, 001F00000h
  1639.        shr eax, 20  
  1640.        jmp si5TAB[eax*4]
  1641.      A7MUL:
  1642.        DEBUG_OUT "I:A7MUL **** "
  1643.        mov eax, edx
  1644.        and eax, 000F00000h
  1645.        shr eax, 20
  1646.        jmp ARM7_MUL_TAB[eax*4]        
  1647.      LDI12:    
  1648.        DEBUG_OUT "I:LDI12 **** "
  1649.        mov eax, edx
  1650.        and eax, 001F00000h
  1651.        shr eax, 20    
  1652.        jmp nTAB[eax*4]  
  1653.      LDIRS:
  1654.        DEBUG_OUT "I:LDIRS **** "
  1655.        mov eax, edx
  1656.        and eax, 001F00000h
  1657.        shr eax, 20
  1658.        jmp eTAB[eax*4]          
  1659.      LDRHW: ;; FIXME
  1660.        DEBUG_OUT "I:LDRHW **** "
  1661.        mov eax, edx
  1662.        mov ecx, edx
  1663.        and ecx, 060h
  1664.        and eax, 010000h
  1665.        shr eax, 18
  1666.        shr ecx, 5
  1667.        or ecx,  eax ;;
  1668.        and ecx, 7
  1669.        mov eax, SC_INVOLATILE
  1670.        and eax, 01a00000h
  1671.        shr eax, 20
  1672.        or eax, pcMTAB[ecx*4]
  1673.        test edx, 0400000h
  1674.        je @F    
  1675.        jmp cTAB[eax*4]    
  1676.     @@:jmp pTAB[eax*4]    
  1677.      RGSET:
  1678.        DEBUG_OUT "I:RGSET **** "
  1679.        mov eax,  SC_INVOLATILE
  1680.        shr eax, 20
  1681.        and eax, 31
  1682.        jmp zTAB[eax*4]  
  1683.        
  1684.        ARM7_ALU_BASE macro lSym, OPID
  1685.          IF OPID eq AND_OP
  1686.            and ecx, eax
  1687.          ELSEIF OPID eq EOR_OP
  1688.            xor ecx, eax
  1689.          ELSEIF OPID eq ORR_OP
  1690.            or ecx, eax  
  1691.          ELSEIF OPID eq SUB_OP
  1692.            sub ecx, eax
  1693.          ELSEIF OPID eq ADD_OP        
  1694.            add ecx, eax
  1695.          ELSEIF OPID eq MOV_OP            
  1696.            mov ecx, eax            
  1697.          ELSEIF OPID eq MVN_OP          
  1698.            not eax          
  1699.            mov ecx, eax    
  1700.          ELSEIF OPID eq BIC_OP          
  1701.            not eax                      
  1702.            and ecx, eax  
  1703.          ELSEIF OPID eq RSB_OP
  1704.            sub eax, ecx
  1705.            mov ecx, eax
  1706.          ELSEIF OPID eq SBC_OP          
  1707.            xor SC_CPSR, FLAG_C
  1708.            bt SC_CPSR, FLAG_CHECK_C_X86_BT            
  1709.            sbb ecx, eax
  1710.            xor SC_CPSR, FLAG_C
  1711.          ELSEIF OPID eq RSC_OP  
  1712.            xor SC_CPSR, FLAG_C
  1713.            bt SC_CPSR, FLAG_CHECK_C_X86_BT            
  1714.            sbb eax, ecx
  1715.            xor SC_CPSR, FLAG_C          
  1716.            mov ecx, eax
  1717.          ELSEIF OPID eq ADC_OP  
  1718.            bt SC_CPSR, FLAG_CHECK_C_X86_BT            
  1719.            adc ecx, eax        
  1720.          ELSEIF OPID eq TST_OP  
  1721.            and ecx, eax
  1722.            SetNZ_A            
  1723.          ELSEIF OPID eq TEQ_OP        
  1724.            xor ecx, eax
  1725.            SetNZ_A        
  1726.          ELSEIF OPID eq CMP_OP  
  1727.            cmp ecx, eax
  1728.            SetNZCV_A 1            
  1729.          ELSEIF OPID eq CMN_OP  
  1730.            add ecx, eax
  1731.            SetNZCV_A 0
  1732.          ELSE
  1733.            ;;  never reach here, make a simple syntax errors
  1734.            ERRORS_ASSERT
  1735.          ENDIF
  1736.        endm
  1737.        ARM7_ALU_SIGN_BASE macro lSym, OPID
  1738.          IF OPID eq AND_OP
  1739.            and ecx, eax
  1740.            SetNZ_A
  1741.          ELSEIF OPID eq EOR_OP
  1742.            xor ecx, eax
  1743.            SetNZ_A
  1744.          ELSEIF OPID eq ORR_OP
  1745.            or ecx, eax  
  1746.            SetNZ_A
  1747.          ELSEIF OPID eq SUB_OP
  1748.            sub ecx, eax
  1749.            SetNZCV_A 1
  1750.          ELSEIF OPID eq ADD_OP            
  1751.            add ecx, eax
  1752.            SetNZCV_A 0
  1753.          ELSEIF OPID eq MOV_OP              
  1754.            mov ecx, eax
  1755.            add ecx, 0              
  1756.            SetNZ_A              
  1757.          ELSEIF OPID eq MVN_OP  
  1758.            not eax          
  1759.            mov ecx, eax  
  1760.            add ecx, 0
  1761.            SetNZ_A              
  1762.          ELSEIF OPID eq BIC_OP  
  1763.            not eax                      
  1764.            and ecx, eax  
  1765.            SetNZ_A
  1766.          ELSEIF OPID eq RSB_OP
  1767.            sub eax, ecx
  1768.            mov ecx, eax
  1769.            SetNZCV_A 1
  1770.          ELSEIF OPID eq SBC_OP  
  1771.            xor SC_CPSR, FLAG_C
  1772.            bt SC_CPSR, FLAG_CHECK_C_X86_BT            
  1773.            sbb ecx, eax
  1774.            SetNZCV_A 1
  1775.          ELSEIF OPID eq RSC_OP  
  1776.            xor SC_CPSR, FLAG_C
  1777.            bt SC_CPSR, FLAG_CHECK_C_X86_BT            
  1778.            sbb eax, ecx        
  1779.            mov ecx, eax
  1780.            SetNZCV_A 1
  1781.          ELSEIF OPID eq ADC_OP  
  1782.            bt SC_CPSR, FLAG_CHECK_C_X86_BT            
  1783.            adc ecx, eax    
  1784.            SetNZCV_A 0            
  1785.          ELSE
  1786.            ;;  never reach here, make a simple syntax errors
  1787.            ERRORS_ASSERT
  1788.          ENDIF
  1789.        endm    
  1790.  
  1791.        ARM7_bba1 macro
  1792.          DEBUG_OUT " #%08X (IMM8:%02X, ROR:%d)", "SC_INVOLATILE & 255 ?~ SC_INVOLATILE}8 & 15 { 1", "SC_INVOLATILE & 255", "SC_INVOLATILE}8 & 15 { 1"
  1793.        endm
  1794.        
  1795.        ARM7_ALU_BASE_1 macro OPID
  1796.          IF OPID eq AND_OP
  1797.            DEBUG_OUT "AND R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1798.            ARM7_bba1
  1799.          ELSEIF OPID eq EOR_OP
  1800.            DEBUG_OUT "EOR R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1801.            ARM7_bba1
  1802.          ELSEIF OPID eq ORR_OP
  1803.            DEBUG_OUT "ORR R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1804.            ARM7_bba1  
  1805.          ELSEIF OPID eq SUB_OP
  1806.            DEBUG_OUT "SUB R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1807.            ARM7_bba1
  1808.          ELSEIF OPID eq ADD_OP
  1809.            DEBUG_OUT "ADD R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1810.            ARM7_bba1
  1811.          ELSEIF OPID eq MOV_OP    
  1812.            DEBUG_OUT "MOV R%d", "SC_INVOLATILE}12 & 15"
  1813.            ARM7_bba1          
  1814.          ELSEIF OPID eq MVN_OP
  1815.            DEBUG_OUT "MVN R%d", "SC_INVOLATILE}12 & 15"
  1816.            ARM7_bba1    
  1817.          ELSEIF OPID eq BIC_OP
  1818.            DEBUG_OUT "BIC R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1819.            ARM7_bba1  
  1820.          ELSEIF OPID eq RSB_OP
  1821.            DEBUG_OUT "RSB R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1822.            ARM7_bba1
  1823.          ELSEIF OPID eq SBC_OP
  1824.            DEBUG_OUT "SBC R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1825.            ARM7_bba1
  1826.          ELSEIF OPID eq RSC_OP  
  1827.            DEBUG_OUT "RSC R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1828.            ARM7_bba1
  1829.          ELSEIF OPID eq ADC_OP  
  1830.            DEBUG_OUT "ADC R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1831.            ARM7_bba1
  1832.          ELSEIF OPID eq TST_OP            
  1833.          ELSEIF OPID eq TEQ_OP      
  1834.          ELSEIF OPID eq CMP_OP              
  1835.          ELSEIF OPID eq CMN_OP            
  1836.          ELSE  
  1837.            ERRORS_ASSERT
  1838.          ENDIF
  1839.        endm
  1840.          
  1841.        ARM7_ALU_SIGN_BASE_1 macro OPID
  1842.          IF OPID eq AND_OP
  1843.            DEBUG_OUT "ANDS R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1844.            ARM7_bba1
  1845.          ELSEIF OPID eq EOR_OP
  1846.            DEBUG_OUT "EORS R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1847.            ARM7_bba1
  1848.          ELSEIF OPID eq ORR_OP
  1849.            DEBUG_OUT "ORRS R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1850.            ARM7_bba1  
  1851.          ELSEIF OPID eq SUB_OP
  1852.            DEBUG_OUT "SUBS R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1853.            ARM7_bba1
  1854.          ELSEIF OPID eq ADD_OP
  1855.            DEBUG_OUT "ADDS R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1856.            ARM7_bba1
  1857.          ELSEIF OPID eq MOV_OP    
  1858.            DEBUG_OUT "MOVS R%d", "SC_INVOLATILE}12 & 15"
  1859.            ARM7_bba1          
  1860.          ELSEIF OPID eq MVN_OP
  1861.            DEBUG_OUT "MVNS R%d", "SC_INVOLATILE}12 & 15"
  1862.            ARM7_bba1    
  1863.          ELSEIF OPID eq BIC_OP
  1864.            DEBUG_OUT "BICS R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1865.            ARM7_bba1  
  1866.          ELSEIF OPID eq RSB_OP
  1867.            DEBUG_OUT "RSBS R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1868.            ARM7_bba1
  1869.          ELSEIF OPID eq SBC_OP
  1870.            DEBUG_OUT "SBCS R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1871.            ARM7_bba1
  1872.          ELSEIF OPID eq RSC_OP  
  1873.            DEBUG_OUT "RSCS R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1874.            ARM7_bba1
  1875.          ELSEIF OPID eq ADC_OP  
  1876.            DEBUG_OUT "ADCS R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15"
  1877.            ARM7_bba1      
  1878.          ELSEIF OPID eq TST_OP  
  1879.            DEBUG_OUT "TST R%d", "SC_INVOLATILE}16 & 15"
  1880.            ARM7_bba1          
  1881.          ELSEIF OPID eq TEQ_OP
  1882.            DEBUG_OUT "TEQ R%d", "SC_INVOLATILE}16 & 15"
  1883.            ARM7_bba1        
  1884.          ELSEIF OPID eq CMP_OP  
  1885.            DEBUG_OUT "CMP R%d", "SC_INVOLATILE}16 & 15"
  1886.            ARM7_bba1            
  1887.          ELSEIF OPID eq CMN_OP  
  1888.            DEBUG_OUT "CMN R%d", "SC_INVOLATILE}16 & 15"
  1889.            ARM7_bba1
  1890.          ELSE
  1891.            ERRORS_ASSERT
  1892.          ENDIF
  1893.        endm
  1894.        ARM7_ALU_BASE_2 macro OPID
  1895.          IF OPID eq AND_OP  ;; LSL #2
  1896.            DEBUG_OUT "AND R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1897.          ELSEIF OPID eq EOR_OP
  1898.            DEBUG_OUT "EOR R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1899.          ELSEIF OPID eq ORR_OP
  1900.            DEBUG_OUT "ORR R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1901.          ELSEIF OPID eq SUB_OP
  1902.            DEBUG_OUT "SUB R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1903.          ELSEIF OPID eq ADD_OP
  1904.            DEBUG_OUT "ADD R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1905.          ELSEIF OPID eq MOV_OP    
  1906.            DEBUG_OUT "MOV R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE & 15"          
  1907.          ELSEIF OPID eq MVN_OP
  1908.            DEBUG_OUT "MVN R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE & 15"  
  1909.          ELSEIF OPID eq BIC_OP
  1910.            DEBUG_OUT "BIC R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1911.          ELSEIF OPID eq RSB_OP
  1912.            DEBUG_OUT "RSB R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1913.          ELSEIF OPID eq SBC_OP
  1914.            DEBUG_OUT "SBC R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1915.          ELSEIF OPID eq RSC_OP  
  1916.            DEBUG_OUT "RSC R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1917.          ELSEIF OPID eq ADC_OP  
  1918.            DEBUG_OUT "ADC R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1919.          ELSEIF OPID eq TST_OP            
  1920.          ELSEIF OPID eq TEQ_OP      
  1921.          ELSEIF OPID eq CMP_OP              
  1922.          ELSEIF OPID eq CMN_OP            
  1923.          ELSE  
  1924.            ERRORS_ASSERT
  1925.          ENDIF
  1926.        endm
  1927.          
  1928.        ARM7_ALU_SIGN_BASE_2 macro OPID
  1929.          IF OPID eq AND_OP  ;; LSL #2
  1930.            DEBUG_OUT "ANDS R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1931.          ELSEIF OPID eq EOR_OP
  1932.            DEBUG_OUT "EORS R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1933.          ELSEIF OPID eq ORR_OP
  1934.            DEBUG_OUT "ORRS R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1935.          ELSEIF OPID eq SUB_OP
  1936.            DEBUG_OUT "SUBS R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1937.          ELSEIF OPID eq ADD_OP
  1938.            DEBUG_OUT "ADDS R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1939.          ELSEIF OPID eq MOV_OP    
  1940.            DEBUG_OUT "MOVS R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE & 15"          
  1941.          ELSEIF OPID eq MVN_OP
  1942.            DEBUG_OUT "MVNS R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE & 15"  
  1943.          ELSEIF OPID eq BIC_OP
  1944.            DEBUG_OUT "BICS R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1945.          ELSEIF OPID eq RSB_OP
  1946.            DEBUG_OUT "RSBS R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1947.          ELSEIF OPID eq SBC_OP
  1948.            DEBUG_OUT "SBCS R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1949.          ELSEIF OPID eq RSC_OP  
  1950.            DEBUG_OUT "RSCS R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1951.          ELSEIF OPID eq ADC_OP  
  1952.            DEBUG_OUT "ADCS R%d, R%d, R%d, ", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"
  1953.          ELSEIF OPID eq TST_OP      
  1954.            DEBUG_OUT "TST R%d, R%d, ", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"              
  1955.          ELSEIF OPID eq TEQ_OP  
  1956.            DEBUG_OUT "TEQ R%d, R%d, ", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"          
  1957.          ELSEIF OPID eq CMP_OP  
  1958.            DEBUG_OUT "CMP R%d, R%d, ", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"          
  1959.          ELSEIF OPID eq CMN_OP
  1960.            DEBUG_OUT "CMN R%d, R%d, ", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15"          
  1961.          ELSE  
  1962.            ERRORS_ASSERT
  1963.          ENDIF  
  1964.        endm
  1965.  
  1966.        i8r4_interpret macro lSym, OPID
  1967.          i8r4&lSym:            
  1968.          Imm8BitmapSft_AC SC_INVOLATILE, eax   ;; Rm
  1969.          GetRFIV SC_INVOLATILE, 16, ecx        ;; Rn
  1970.          GetRFI SC_INVOLATILE, 12, edx       ;; RdIs
  1971.          ARM7_ALU_BASE lSym, OPID  
  1972.          ARM7_ALU_BASE_1 OPID        
  1973.          IF (OPID and 1100b) ne 1000b    
  1974.            ;; Write Back, Check R15.
  1975.            mov XRFI[edx*4], ecx
  1976.            cmp edx, 15
  1977.            jne  @F
  1978.            arm7PipelineFlush 3 ;; +1S +1N
  1979.            @@:    
  1980.          ENDIF
  1981.          arm7ClksFetch1 ;; 1 clks  
  1982.          IF (OPID and 1100b) ne 1000b
  1983.            i8r4&lSym&S:
  1984.            ARM7_ALU_SIGN_BASE_1 OPID
  1985.            Imm8BitmapSft_AC SC_INVOLATILE, eax   ;; Rm
  1986.            GetRFIV SC_INVOLATILE, 16, ecx        ;; Rn
  1987.            GetRFI SC_INVOLATILE, 12, edx       ;; RdIs
  1988.            mov SC_INVOLATILE, SC_CPSR ;; save old CPSR.
  1989.            ARM7_ALU_SIGN_BASE lSym, OPID
  1990.            mov XRFI[edx*4], ecx  
  1991.            cmp edx, 15
  1992.            je @F
  1993.            arm7ClksFetch1 ;; 1 clks  
  1994.          @@:
  1995.            ;; R15 resume old CPSR.
  1996.            mov SC_CPSR, SC_INVOLATILE
  1997.            SPSRToCPSR edx
  1998.            test SC_CPSR, FLAG_THUMB
  1999.            je @F
  2000.            tbPipelineFlush 2    
  2001.          @@:
  2002.            arm7PipelineFlush 3 ;; +1S +1N      
  2003.          ENDIF
  2004.        endm
  2005.                  
  2006.        ;; ------------------------- ALU+Imm8+Sft            
  2007.        ;;  27 26 25 24 23 22 21 20   19 - 16     15 - 12       11 10 9 8  7 6 5 4  3 2 1 0
  2008.        ;;   0  0  1    Opcode    S      Rn          Rd             Imm8+Sft
  2009.        ;;   0  0  1  1  0  R  1  0    fmask        SBO             Imm8+Sft  
  2010.        i8r4_interpret AND, AND_OP
  2011.        i8r4_interpret EOR, EOR_OP      
  2012.        i8r4_interpret SUB, SUB_OP    
  2013.        i8r4_interpret RSB, RSB_OP  
  2014.        i8r4_interpret ADD, ADD_OP
  2015.        i8r4_interpret ADC, ADC_OP      
  2016.        i8r4_interpret SBC, SBC_OP    
  2017.        i8r4_interpret RSC, RSC_OP
  2018.        i8r4_interpret TST, TST_OP
  2019.        i8r4_interpret TEQ, TEQ_OP      
  2020.        i8r4_interpret CMP, CMP_OP    
  2021.        i8r4_interpret CMN, CMN_OP  
  2022.        i8r4_interpret ORR, ORR_OP
  2023.        i8r4_interpret MOV, MOV_OP      
  2024.        i8r4_interpret BIC, BIC_OP    
  2025.        i8r4_interpret MVN, MVN_OP
  2026.        mUB:  
  2027.        i8r4UB:  
  2028.          int 3    
  2029.        si5_interpret macro lSym, OPID
  2030.          si5&lSym:  
  2031.          ARM7_ALU_BASE_2 OPID
  2032.          ShiftRegImm5 edx, eax, ecx, eax, lSym, C_op_NOCare
  2033.          GetRFIV edx, 16, ecx        ;; Rn
  2034.          GetRFI edx, 12, edx       ;; RdIs  
  2035.          ARM7_ALU_BASE lSym, OPID
  2036.          IF (OPID and 1100b) ne 1000b
  2037.            ;; Write Back, Check R15.
  2038.            mov XRFI[edx*4], ecx
  2039.            cmp edx, 15
  2040.            jne  @F
  2041.            arm7PipelineFlush 3 ;; +1S +1N
  2042.            @@:    
  2043.          ENDIF
  2044.          arm7ClksFetch1 ;; 1 clks  
  2045.          
  2046.          IF (OPID and 1100b) ne 1000b
  2047.            si5&lSym&S:
  2048.            ARM7_ALU_SIGN_BASE_2 OPID
  2049.            mov SC_INVOLATILE, SC_CPSR ;; save old .
  2050.            ShiftRegImm5 edx, eax, ecx, eax, lSym&S, C_op_Care ;; Rm
  2051.            GetRFIV edx, 16, ecx        ;; Rn
  2052.            GetRFI edx, 12, edx       ;; RdIs
  2053.            ARM7_ALU_SIGN_BASE lSym, OPID
  2054.            mov XRFI[edx*4], ecx  
  2055.            cmp edx, 15
  2056.            je @F
  2057.            arm7ClksFetch1 ;; 1 clks  
  2058.          @@:
  2059.            ;; R15 resume old CPSR.
  2060.            mov SC_CPSR, SC_INVOLATILE
  2061.            SPSRToCPSR edx
  2062.            test SC_CPSR, FLAG_THUMB
  2063.            je @F
  2064.            tbPipelineFlush 2    
  2065.          @@:
  2066.            arm7PipelineFlush 3 ;; +1S +1N        
  2067.          ENDIF
  2068.        endm  
  2069.        ;;  ------------------------- ALU+Imm5            
  2070.        ;;  27 26 25 24 23 22 21 20   19 - 16     15 - 12       11 10 9 8  7 6 5 4  3 2 1 0
  2071.        ;;   0  0  0    Opcode    S      Rn          Rd             Imm5     T T 0    Rm
  2072.        ;;   0  0  0  1  0  R  1  0    fmask        SBO             SBZ    0 0 0 0    Rm  MSR PSR,  Rm    
  2073.        si5_interpret AND, AND_OP
  2074.        si5_interpret EOR, EOR_OP      
  2075.        si5_interpret SUB, SUB_OP    
  2076.        si5_interpret RSB, RSB_OP  
  2077.        si5_interpret ADD, ADD_OP
  2078.        si5_interpret ADC, ADC_OP      
  2079.        si5_interpret SBC, SBC_OP    
  2080.        si5_interpret RSC, RSC_OP
  2081.        si5_interpret TST, TST_OP
  2082.        si5_interpret TEQ, TEQ_OP      
  2083.        si5_interpret CMP, CMP_OP    
  2084.        si5_interpret CMN, CMN_OP  
  2085.        si5_interpret ORR, ORR_OP
  2086.        si5_interpret MOV, MOV_OP      
  2087.        si5_interpret BIC, BIC_OP    
  2088.        si5_interpret MVN, MVN_OP
  2089.  
  2090.        rs_interpret macro lSym, OPID
  2091.          rs&lSym:  
  2092.          ShiftRegRs SC_INVOLATILE, eax, ecx, edx, lSym, C_op_NOCare
  2093.          GetRFIV SC_INVOLATILE, 16, ecx        ;; Rn
  2094.          GetRFI SC_INVOLATILE, 12, edx       ;; RdIs
  2095.          ARM7_ALU_BASE_2 OPID
  2096.          ARM7_ALU_BASE lSym, OPID
  2097.          IF (OPID and 1100b) ne 1000b
  2098.            ;; Write Back, Check R15.
  2099.            mov XRFI[edx*4], ecx
  2100.            cmp edx, 15
  2101.            jne  @F
  2102.            arm7PipelineFlush 3 ;; +1S +1N
  2103.            @@:    
  2104.          ENDIF
  2105.          arm7ClksFetch1 ;; 1 clks  
  2106.          
  2107.          IF (OPID and 1100b) ne 1000b
  2108.            rs&lSym&S:
  2109.            mov SC_INVOLATILE, SC_CPSR ;; save old .
  2110.            ShiftRegRs SC_INVOLATILE, eax, ecx, edx, lSym&S, C_op_Care
  2111.            GetRFIV edx, 16, ecx        ;; Rn
  2112.            GetRFI edx, 12, edx       ;; RdIs
  2113.            ARM7_ALU_SIGN_BASE_2 OPID
  2114.            ARM7_ALU_SIGN_BASE lSym, OPID
  2115.            mov XRFI[edx*4], ecx  
  2116.            cmp edx, 15
  2117.            je @F
  2118.            arm7ClksFetch1 ;; 1 clks  
  2119.          @@:
  2120.            ;; R15 resume old CPSR.
  2121.            mov SC_CPSR, SC_INVOLATILE
  2122.            SPSRToCPSR edx
  2123.            test SC_CPSR, FLAG_THUMB
  2124.            je @F
  2125.            tbPipelineFlush 2    
  2126.          @@:
  2127.            arm7PipelineFlush 3 ;; +1S +1N        
  2128.          ENDIF
  2129.        endm
  2130.        ;;  ------------------------- ALU+RegSft            
  2131.        ;;  27 26 25 24 23 22 21 20   19 - 16     15 - 12       11 10 9 8  7 6 5 4  3 2 1 0
  2132.        ;;   0  0  0    Opcode    S      Rn          Rd             Rs     0 T T 1    Rm    
  2133.        ;;   0  0  0  1  0  0  1  0   1 1 1 1     1 1 1 1        1  1 1 1  0 0 0 1    Rn   branch exchange
  2134.        rs_interpret AND, AND_OP
  2135.        rs_interpret EOR, EOR_OP      
  2136.        rs_interpret SUB, SUB_OP    
  2137.        rs_interpret RSB, RSB_OP  
  2138.        rs_interpret ADD, ADD_OP
  2139.        rs_interpret ADC, ADC_OP      
  2140.        rs_interpret SBC, SBC_OP    
  2141.        rs_interpret RSC, RSC_OP
  2142.        rs_interpret TST, TST_OP
  2143.        rs_interpret TEQ, TEQ_OP      
  2144.        rs_interpret CMP, CMP_OP    
  2145.        rs_interpret CMN, CMN_OP  
  2146.        rs_interpret ORR, ORR_OP
  2147.        rs_interpret MOV, MOV_OP      
  2148.        rs_interpret BIC, BIC_OP    
  2149.        rs_interpret MVN, MVN_OP
  2150.        
  2151.        i8r4ToCPSR:      ;; !!!!!!!!!!
  2152.          Imm8BitmapSft_AC edx, eax
  2153.          DEBUG_OUT "MSR #%08X(org)", "eax"
  2154.          ToFastCPSR eax, eax, a, c
  2155.          DEBUG_OUT " #%08X(fast) to spsr_", "eax"
  2156.          mov ecx, SC_CPSR  ;; ecx : old
  2157.          test edx, FLAG_MSR_FLAGS
  2158.          je @F
  2159.          mov SC_CPSR16, ax ;; XXX:bitfield indep  
  2160.          DEBUG_OUT "f"
  2161.          @@:          
  2162.          mov ax, SC_CPSR16
  2163.          test edx, FLAG_MSR_CTL
  2164.          je @F  
  2165.          DEBUG_OUT "c"        
  2166.          SwitchMode eax      
  2167.        IF  1
  2168.          ;;'Cehck Thumb flags .
  2169.          test SC_CPSR, FLAG_THUMB
  2170.          je @F
  2171.          sub XRFI[SZ_PC*4], 4 ;; backup to next instruction
  2172.          tbPipelineFlush 2
  2173.        ENDIF
  2174.          @@:
  2175.          arm7ClksFetch1
  2176.        i8r4ToSPSR:
  2177.          Imm8BitmapSft_AC edx, eax
  2178.          DEBUG_OUT "MSR #%08X(org)", "eax"
  2179.          ToFastCPSR eax, eax, a, c
  2180.          DEBUG_OUT " #%08X(fast) to spsr_", "eax"
  2181.          GetCurSPSRP ecx
  2182.          test edx, FLAG_MSR_FLAGS
  2183.          je @F
  2184.          mov [ecx], ax ;; XXX:bitfield indep
  2185.          DEBUG_OUT "f"
  2186.          @@:          
  2187.          test edx, FLAG_MSR_CTL
  2188.          je @F  
  2189.          DEBUG_OUT "c"
  2190.          shr eax, 24
  2191.          mov [ecx+3], al ;; XXX:bitfield indep
  2192.          @@:
  2193.          arm7ClksFetch1
  2194.          
  2195.          MUL_CLKS_M_S3 macro Post, TReg, Recv ;; XXX: TReg ^  Post ^ Recv
  2196.            LOCAL MClks3
  2197.            LOCAL MClks2
  2198.            LOCAL MClks1
  2199.            
  2200.            ;; multiplier's clks, m
  2201.            ;; see ARM7TDMI Technical Reference Manual's 6.20 Instruction speed summary
  2202.            ;; m is:
  2203.            ;; 1 if bits [31:8] of the multiplier operand are all zero or one, else
  2204.            ;; 2 if bits [31:16] of the multiplier operand are all zero or one, else
  2205.            ;; 3 if bits [31:24] of the multiplier operand are all zero or all one, else
  2206.            ;; 4.
  2207.            
  2208.            ;;            
  2209.            ;; Check multiplier's Mod Shift bit
  2210.            ;; if NEG, not it. else nodone.
  2211.            bt Post, 31
  2212.            sbb TReg, TReg
  2213.            xor TReg, Post
  2214.            xor Recv, Recv
  2215.            test TReg, 0FFFFFF00h
  2216.            je MClks1
  2217.            test TReg, 0FFFF0000h
  2218.            je MClks2        
  2219.            test TReg, 0FF000000h
  2220.            je MClks3
  2221.            add Recv, 1    
  2222.           MClks3:
  2223.            add Recv, 1
  2224.           MClks2:
  2225.            add Recv, 1
  2226.           MClks1:
  2227.            add Recv, 1
  2228.          endm
  2229.          
  2230.          mul_interpret_b macro OPID
  2231.            GetRFIV SC_INVOLATILE, 0, eax ;; Rm.      
  2232.            GetRFIV SC_INVOLATILE, 8, ecx ;; Rs.                  
  2233.            IF OPID eq MUL_OP
  2234.              DEBUG_OUT "MUL R%d, R%d, R%d", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15", "SC_INVOLATILE}8 & 15"
  2235.              mul ecx
  2236.              GetRFI SC_INVOLATILE, 16, edx ;; Rd
  2237.              mov XRFI[edx*4], eax  
  2238.            ELSEIF  OPID eq MLA_OP
  2239.              DEBUG_OUT "MLA R%d, R%d, R%d, R%d", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15", "SC_INVOLATILE}8 & 15",  "SC_INVOLATILE}12 & 15"
  2240.              mul ecx        
  2241.              GetRFIV SC_INVOLATILE, 12, edx ;; Rn
  2242.              add eax, edx
  2243.              GetRFI SC_INVOLATILE, 16, edx ;; Rd
  2244.              mov XRFI[edx*4], eax              
  2245.            ELSEIF  OPID eq UMUL64_OP
  2246.              DEBUG_OUT "UMULL R%d, R%d, R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15",  "SC_INVOLATILE}8 & 15"
  2247.              movd xmm0, ecx
  2248.              mul ecx
  2249.              GetRFI SC_INVOLATILE, 12, ecx ;; RdLO
  2250.              GetRFI SC_INVOLATILE, 16, SC_INVOLATILE ;; RdHI          
  2251.              mov XRFI[ecx*4], eax        
  2252.              mov XRFI[SC_INVOLATILE*4], edx
  2253.              movd ecx, xmm0
  2254.            ELSEIF  OPID eq UMLA64_OP
  2255.              DEBUG_OUT "UMLAL R%d, R%d, R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15",  "SC_INVOLATILE}8 & 15"
  2256.              movd xmm0, ecx
  2257.              mul ecx
  2258.              GetRFI SC_INVOLATILE, 12, ecx ;; RdLO
  2259.              GetRFI SC_INVOLATILE, 16, SC_INVOLATILE ;; RdHI          
  2260.              add eax, XRFI[ecx*4]
  2261.              adc edx, XRFI[SC_INVOLATILE*4]
  2262.              mov XRFI[ecx*4], eax        
  2263.              mov XRFI[SC_INVOLATILE*4], edx
  2264.              movd ecx, xmm0            
  2265.            ELSEIF  OPID eq SMUL64_OP  
  2266.              DEBUG_OUT "SMULL R%d, R%d, R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15",  "SC_INVOLATILE}8 & 15"            
  2267.              movd xmm0, ecx
  2268.              imul ecx
  2269.              GetRFI SC_INVOLATILE, 12, ecx ;; RdLO
  2270.              GetRFI SC_INVOLATILE, 16, SC_INVOLATILE ;; RdHI          
  2271.              mov XRFI[ecx*4], eax        
  2272.              mov XRFI[SC_INVOLATILE*4], edx
  2273.              movd ecx, xmm0        
  2274.            ELSEIF  OPID eq SMLA64_OP
  2275.              DEBUG_OUT "SMLAL R%d, R%d, R%d, R%d", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE}16 & 15", "SC_INVOLATILE & 15",  "SC_INVOLATILE}8 & 15"
  2276.              movd xmm0, ecx
  2277.              imul ecx
  2278.              GetRFI SC_INVOLATILE, 12, ecx ;; RdLO
  2279.              GetRFI SC_INVOLATILE, 16, SC_INVOLATILE ;; RdHI          
  2280.              add eax, XRFI[ecx*4]
  2281.              adc edx, XRFI[SC_INVOLATILE*4]
  2282.              mov XRFI[ecx*4], eax        
  2283.              mov XRFI[SC_INVOLATILE*4], edx
  2284.              movd ecx, xmm0            
  2285.            ELSE
  2286.              ERRORS_ASSERT
  2287.            ENDIF    
  2288.          endm
  2289.          mul_interpret macro lSym, OPID  
  2290.           ;;LOCAL StdLink
  2291.           ;;LOCAL StdLinkWithSymbol
  2292.           LOCAL SetMClks
  2293.          
  2294.           m&lSym:
  2295.             DEBUG_OUT "NOSET_SIGN "
  2296.             mul_interpret_b  OPID
  2297.             jmp SetMClks
  2298.           m&lSym&S:
  2299.            DEBUG_OUT "SET_SIGN "
  2300.            mul_interpret_b OPID              
  2301.            IF OPID eq MUL_OP
  2302.              Set_NZmul32 eax              
  2303.            ELSEIF  OPID eq MLA_OP
  2304.              Set_NZmul32 eax                    
  2305.            ELSEIF  OPID eq UMUL64_OP
  2306.              Set_NZmul64 eax, edx
  2307.            ELSEIF  OPID eq UMLA64_OP
  2308.              Set_NZmul64 eax, edx            
  2309.            ELSEIF  OPID eq SMUL64_OP  
  2310.              Set_NZmul64 eax, edx  
  2311.            ELSEIF  OPID eq SMLA64_OP
  2312.              Set_NZmul64 eax, edx            
  2313.            ELSE
  2314.              ERRORS_ASSERT
  2315.            ENDIF    
  2316.          SetMClks:
  2317.            MUL_CLKS_M_S3 ecx, edx, eax
  2318.            
  2319.            IF OPID eq MUL_OP
  2320.              ;; MUL := M Clks.  
  2321.            ELSEIF  OPID eq MLA_OP
  2322.              ;; MLA := M+1 Clks
  2323.              add eax, 1              
  2324.            ELSEIF  OPID eq UMUL64_OP
  2325.              ;; UMULL := M+1 Clks
  2326.              add eax, 1  
  2327.            ELSEIF  OPID eq UMLA64_OP
  2328.              ;; UMLAL := M+2 Clks    
  2329.              add eax, 2              
  2330.            ELSEIF  OPID eq SMUL64_OP  
  2331.              ;; SMULL := M+1 Clks  
  2332.              add eax, 1                
  2333.            ELSEIF  OPID eq SMLA64_OP
  2334.              ;; SMLAL := M+2 Clks  
  2335.              add eax, 2              
  2336.            ELSE
  2337.              ERRORS_ASSERT
  2338.            ENDIF    
  2339.            add SC_GOAL_COUNT, eax
  2340.            arm7ClksFetch1
  2341.          endm  
  2342.        ALIGN_Z                                                  
  2343.  
  2344.        mul_interpret MUL, MUL_OP
  2345.        mul_interpret MLA, MLA_OP      
  2346.        mul_interpret UMUL64, UMUL64_OP      
  2347.        mul_interpret UMLA64, UMLA64_OP
  2348.        mul_interpret SMUL64, SMUL64_OP      
  2349.        mul_interpret SMLA64, SMLA64_OP
  2350.  
  2351.        ;;  27 26 25 24 23 22 21 20   19 - 16     15 - 12       11 10 9 8  7 6 5 4  3 2 1 0
  2352.        ;;   0  0  0    Opcode    S      Rn          Rd             Imm5     T T 0    Rm
  2353.        ;;   0  0  0  1  0  R  1  0    fmask        SBO             SBZ    0 0 0 0    Rm  MSR PSR,  Rm    
  2354.        ALIGN_Z
  2355.        si5PSR2: ;; 0   1 MSR Rs  CPSR  TODO:Check d4-d7 := 0
  2356.          DEBUG_OUT "MSR R%d to cpsr_", "SC_INVOLATILE & 15"
  2357.          GetRFIV edx, 0, eax
  2358.          ToFastCPSR eax, eax, a, c
  2359.          mov ecx, SC_CPSR  ;; ecx : old
  2360.          test edx, FLAG_MSR_FLAGS
  2361.          je @F
  2362.          mov SC_CPSR16, ax ;; XXX:bitfield indep  
  2363.          DEBUG_OUT "f"
  2364.          @@:          
  2365.          mov ax, SC_CPSR16
  2366.          test edx, FLAG_MSR_CTL
  2367.          je @F  
  2368.          ;; mode equal ??
  2369.          DEBUG_OUT "c"
  2370.          SwitchMode eax
  2371.        IF  1
  2372.          ;;'Cehck Thumb flags .
  2373.          test SC_CPSR, FLAG_THUMB
  2374.          je @F
  2375.          sub XRFI[SZ_PC*4], 4 ;; backup to next instruction
  2376.          tbPipelineFlush 2
  2377.        ENDIF          
  2378.          @@:
  2379.          arm7ClksFetch1  
  2380.        ;; TODO: assert mode, flags
  2381.        si5PSR4: ;; 1   1 MSR Rs  SPSR
  2382.          DEBUG_OUT "MSR R%d to spsr_", "SC_INVOLATILE & 15"
  2383.          GetRFIV edx, 0, eax
  2384.          ToFastCPSR eax, eax, a, c
  2385.          GetCurSPSRP ecx
  2386.          test edx, FLAG_MSR_FLAGS
  2387.          je @F
  2388.          mov [ecx], ax ;; XXX:bitfield indep
  2389.          DEBUG_OUT "f"
  2390.          @@:          
  2391.          test edx, FLAG_MSR_CTL
  2392.          je @F  
  2393.          shr eax, 24
  2394.          mov [ecx+3], al ;; XXX:bitfield indep
  2395.          DEBUG_OUT "c"
  2396.          @@:
  2397.          arm7ClksFetch1
  2398.        si5PSR1: ;; 0   0 MRS Rs  CPSR
  2399.          DEBUG_OUT "MRS R%d, CPSR", "SC_INVOLATILE}12 & 15"
  2400.          ToStandCPSR SC_CPSR, ecx, a, c
  2401.          GetRFI edx, 12, eax
  2402.          mov [eax], ecx
  2403.          arm7ClksFetch1
  2404.        si5PSR3: ;; 1   0 MRS Rs  SPSR, TODO: Check SBO/SBZ
  2405.          DEBUG_OUT "MRS R%d, SPSR", "SC_INVOLATILE}12 & 15"
  2406.          GetCurSPSRP eax
  2407.          mov eax, [eax]
  2408.          ToStandCPSR eax, ecx, a, c
  2409.          GetRFI edx, 12, eax
  2410.          mov [eax], ecx          
  2411.          arm7ClksFetch1            
  2412.        ;;  ------------------------- branch clks:3 2Seq + 1N Cycles
  2413.        ;;  27 26 25 24 23 22 21 20   19 - 16     15 - 12       11 10 9 8  7 6 5 4  3 2 1 0
  2414.        ;;   1  0  1  L          Sign Offset 24  
  2415.        JPL_BASE macro
  2416.          and edx, 0FFFFFFh
  2417.          bt edx, 23
  2418.          sbb ecx, ecx
  2419.          and ecx, 03F000000h  ;; save 30 bit
  2420.          or ecx, edx
  2421.          shl ecx, 2 ;; shift 2  
  2422.          DEBUG_OUT "%06X- (%d)", ecx, ecx      
  2423.          add XRFI[SZ_PC*4], ecx          
  2424.        endm
  2425.        JMP24: ;; without LR
  2426.          DEBUG_OUT "B "
  2427.          JPL_BASE  
  2428.          arm7PipelineFlush 3      
  2429.        JMPLR: ;; with LR
  2430.          DEBUG_OUT "BL "
  2431.          mov SC_INVOLATILE, XRFI[SZ_PC*4]
  2432.          JPL_BASE
  2433.          lea eax, [SC_INVOLATILE-4]
  2434.          DEBUG_OUT "LINK %08X- (%d) ", "eax", "eax"
  2435.          mov XRFI[SZ_LRLINK*4], eax ;; next pc save to LR.
  2436.          arm7PipelineFlush 3
  2437.  
  2438.        ;;  ---------------------------------------------------------------------------------------------        
  2439.        ;;  27 26 25 24 23 22 21 20   19 - 16     15 - 12       11 10 9 8  7 6 5 4  3 2 1 0    
  2440.        ;;   0  0  0  1  0  0  1  0   1 1 1 1     1 1 1 1        1  1 1 1  0 0 0 1    Rn   branch exchange
  2441.        ALIGN_Z
  2442.        rsBX: ;; BX Rn
  2443.          ;; Adjust PC. Check Rn's d0
  2444.          GetRFIV edx, 0, eax
  2445.          DEBUG_OUT "BX R%d %08X- (%d) ", "SC_INVOLATILE & 15", "eax", "eax"
  2446.          test eax, 1
  2447.          jne @F
  2448.          mov XRFI[SZ_PC*4], eax
  2449.          arm7PipelineFlush 3
  2450.        @@:
  2451.          and eax, -2
  2452.          or SC_CPSR, FLAG_THUMB ;; set thumb flag
  2453.          mov XRFI[SZ_PC*4], eax
  2454.          tbPipelineFlush 4 ;; thumb prefetch maybe slow.
  2455.        rsUB:  
  2456.          int 3  
  2457.      A7SWP: ;; SWAP. S+2N+1
  2458.        GetRFIV SC_INVOLATILE, 16, eax ;; Rn:= Address
  2459.        GetRFIV SC_INVOLATILE, 0, ecx ;; Rm:        
  2460.        push ecx
  2461.        push eax
  2462.        push [SC_ARM7].agb
  2463.        push eax
  2464.        push [SC_ARM7].agb
  2465.        test SC_INVOLATILE, 00400000h
  2466.        je @F
  2467.        CALLIt MmuReadByte
  2468.        DEBUG_OUT "SWPB R%d, R%d, [R%d]", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE & 15", "SC_INVOLATILE}16 & 15"
  2469.        GetRFI SC_INVOLATILE, 12, SC_INVOLATILE ;; Rd:= Rd.
  2470.        mov XRFI8[SC_INVOLATILE*4], al
  2471.        Add_WaitStateClks
  2472.        CALLIt MmuWriteByte
  2473.        add SC_GOAL_COUNT, 3
  2474.        arm7ClksFetch1
  2475.        ;; Word.
  2476.      @@:
  2477.        CALLIt MmuReadWord
  2478.        DEBUG_OUT "SWP R%d, R%d, [R%d]", "SC_INVOLATILE}12 & 15", "SC_INVOLATILE & 15", "SC_INVOLATILE}16 & 15"
  2479.        GetRFI SC_INVOLATILE, 12, SC_INVOLATILE ;; Rd:= Rd.      
  2480.        mov XRFI[SC_INVOLATILE*4], eax
  2481.        ;; Read/Write Same Cache Region. Add one waitState
  2482.        Add_WaitStateClks
  2483.        CALLIt MmuWriteWord  
  2484.        add SC_GOAL_COUNT, 3
  2485.        arm7ClksFetch1
  2486.        
  2487.        LDR_SET macro ldrtype, pre, link  
  2488.        
  2489.          LDR_L equ 1
  2490.          LDR_W equ 2
  2491.          LDR_B equ 4
  2492.          LDR_U equ 8
  2493.          LDR_P equ 16      
  2494.          
  2495.          LDR_STD_IMM12 equ 0 ;;->
  2496.          LDR_STD_SCALED equ 1  ;;->
  2497.          LDR_EXT_LOHI8BIT equ 2 ;;->
  2498.          LDR_EXT_RNMD equ 3 ;; :: ldrtype
  2499.        
  2500.          IF ldrtype eq LDR_STD_IMM12 or (ldrtype eq LDR_STD_SCALED)
  2501.            IF (link and LDR_L) eq 0
  2502.              DEBUG_OUT "STR"        
  2503.            ELSEIF (link and LDR_L) ne 0
  2504.              DEBUG_OUT "LDR"
  2505.            ENDIF
  2506.            IF (link and LDR_B) ne 0
  2507.              DEBUG_OUT "B"
  2508.            ENDIF
  2509.            IF  ((link and LDR_W) eq 0) and ((link and LDR_P) eq 0)
  2510.              DEBUG_OUT "T"
  2511.            ENDIF  
  2512.          ELSEIF ldrtype eq LDR_EXT_LOHI8BIT or (ldrtype eq LDR_EXT_RNMD)
  2513.            IF (link and 5) eq 4
  2514.              DEBUG_OUT "STRH"
  2515.            ELSEIF  (link and 5) ne 4
  2516.              DEBUG_OUT "LDR"
  2517.              IF (link and 5) eq 0
  2518.                DEBUG_OUT "H"
  2519.              ELSEIF  (link and 5) eq 1
  2520.                DEBUG_OUT "SB"              
  2521.              ELSEIF  (link and 5) eq 5
  2522.                DEBUG_OUT "SH"
  2523.              ELSE
  2524.                ERRORS_ASSERT
  2525.              ENDIF  
  2526.            ELSE
  2527.              ERRORS_ASSERT
  2528.            ENDIF    
  2529.          ELSE
  2530.            ERRORS_ASSERT
  2531.          ENDIF    
  2532.          
  2533.          IF (link and LDR_U) eq 0
  2534.            DEBUG_OUT "-"
  2535.          ENDIF
  2536.          IF  (link and LDR_P) ne 0
  2537.            DEBUG_OUT " R%d, [R%d, ", "SC_INVOLATILE } 12 & 15", "SC_INVOLATILE } 16 & 15"          
  2538.          ELSEIF (link and LDR_P) eq 0
  2539.            DEBUG_OUT " R%d, [R%d], ", "SC_INVOLATILE } 12 & 15", "SC_INVOLATILE } 16 & 15"        
  2540.          ENDIF  
  2541.          
  2542.          pre&link:
  2543.          ;; Fetch Source .
  2544.                                                  ;; P  U  X1 W X2  
  2545.                                                   ;; X1 X2     3:= LDRSH (7)
  2546.                                                   ;;        2:= STRHW (1)  
  2547.                                                   ;;        1:= LDRSB (6)
  2548.                                                   ;;        0:= LDRUH (5)
  2549.          ;; eax:temp value, ecx:rn                                      
  2550.          IF ldrtype eq LDR_STD_IMM12
  2551.            mov eax, SC_INVOLATILE
  2552.            and eax, 0FFFh ;; GetImm12
  2553.            DEBUG_OUT "#%03X", "eax"
  2554.          ELSEIF ldrtype eq LDR_STD_SCALED
  2555.            DEBUG_OUT "R%d, ", "SC_INVOLATILE & 15"
  2556.            ShiftRegImm5 SC_INVOLATILE, eax, ecx, edx, pre&link, C_op_NOCare ;; Rm Sft.
  2557.          ELSEIF ldrtype eq LDR_EXT_LOHI8BIT
  2558.            mov eax, SC_INVOLATILE
  2559.            shl al, 4
  2560.            shr eax, 4
  2561.            and eax, 255                   ;; LO|HI
  2562.            DEBUG_OUT "#%02X", "eax"    
  2563.          ELSEIF ldrtype eq LDR_EXT_RNMD
  2564.            DEBUG_OUT "R%d", "eax & 15"
  2565.            GetRFIV SC_INVOLATILE,  0, eax ;; GetRm
  2566.          ELSE
  2567.            ERRORS_ASSERT
  2568.          ENDIF
  2569.          
  2570.          IF  (link and LDR_P) ne 0
  2571.            DEBUG_OUT "]"          
  2572.            IF  (link and LDR_P) ne 0
  2573.              DEBUG_OUT "!"
  2574.            ENDIF      
  2575.          ENDIF
  2576.          
  2577.          GetRFI SC_INVOLATILE,  16, ecx ;; GetRn
  2578.          
  2579.          IF (link and LDR_U) eq 0
  2580.            neg eax
  2581.          ENDIF
  2582.          
  2583.          ;; Post-Index??
  2584.          IF (link and LDR_P) ne 0
  2585.            mov edx, XRFI[ecx*4]
  2586.            add eax, edx
  2587.          ELSEIF (link and LDR_P) eq 0
  2588.            mov edx, eax
  2589.            add edx, XRFI[ecx*4]
  2590.            mov eax, edx
  2591.          ENDIF
  2592.          
  2593.          IF (((link and LDR_P) eq 0) or ((link and LDR_W) ne 0))
  2594.            mov XRFI[ecx*4], eax
  2595.          ENDIF
  2596.          
  2597.          mov eax, SC_INVOLATILE
  2598.          GetRFI SC_INVOLATILE,  12, SC_INVOLATILE ;; GetRd
  2599.          
  2600.          ;; Check Access type
  2601.          IF ldrtype eq LDR_STD_IMM12 or (ldrtype eq LDR_STD_SCALED)
  2602.            IF (link and LDR_L) eq 0
  2603.              ;; STR. STRB
  2604.              push XRFI[SC_INVOLATILE*4]
  2605.              push edx
  2606.              push [SC_ARM7].agb
  2607.              IF (link and LDR_B) ne 0              
  2608.                CALLIt MmuWriteByte            
  2609.              ELSEIF  (link and LDR_B) eq 0
  2610.                CALLIt MmuWriteWord
  2611.              ENDIF  
  2612.              Add_WaitStateClks
  2613.              arm7ClksFetchN 2 ;; 2 noSEQ clks.
  2614.            ELSEIF  (link and LDR_L) ne 0
  2615.              ;; LDR. LDRB
  2616.              push edx
  2617.              push [SC_ARM7].agb
  2618.              IF (link and LDR_B) ne 0  
  2619.                CALLIt MmuReadByte  
  2620.                movzx eax, al
  2621.              ELSEIF  (link and LDR_B) eq 0
  2622.                CALLIt MmuReadWord
  2623.              ENDIF  
  2624.              Add_WaitStateClks
  2625.              mov XRFI[SC_INVOLATILE* 4], eax
  2626.              cmp SC_INVOLATILE, 15
  2627.              je @F
  2628.              arm7ClksFetchN 3 ;; S+N+1 3Clks.
  2629.            @@:
  2630.              and XRFI[SC_INVOLATILE *4], -4
  2631.              arm7PipelineFlush 5      
  2632.            ENDIF
  2633.          ELSEIF ldrtype eq LDR_EXT_LOHI8BIT or (ldrtype eq LDR_EXT_RNMD)
  2634.            IF (link and 5) eq 4
  2635.              push XRFI[SC_INVOLATILE*4]
  2636.              push edx
  2637.              CallMemOrIOAddWaitState MmuWriteHalfWord
  2638.              arm7ClksFetchN 2 ;; 2 noSEQ clks.
  2639.            ELSEIF  (link and 5) ne 4
  2640.              push edx
  2641.              push [SC_ARM7].agb
  2642.              IF (link and 5) eq 0
  2643.                CALLIt MmuReadHalfWord
  2644.                movzx eax, ax
  2645.              ELSEIF  (link and 5) eq 1
  2646.                CALLIt MmuReadByte
  2647.                movsx eax, al              
  2648.              ELSEIF  (link and 5) eq 5
  2649.                CALLIt MmuReadHalfWord
  2650.                movsx eax, ax
  2651.              ENDIF
  2652.              Add_WaitStateClks
  2653.              mov XRFI[SC_INVOLATILE* 4], eax
  2654.              cmp SC_INVOLATILE, 15
  2655.              je @F
  2656.              arm7ClksFetchN 3 ;; S+N+1 3Clks.
  2657.            @@:
  2658.              and XRFI[SC_INVOLATILE *4], -4
  2659.              arm7PipelineFlush 5  
  2660.            ENDIF    
  2661.          ELSE
  2662.            ERRORS_ASSERT
  2663.          ENDIF      
  2664.        endm
  2665.        
  2666.        IRL_PUSH_b macro num
  2667.          LDR_SET LDR_STD_IMM12, n, num
  2668.          LDR_SET LDR_STD_SCALED, e, num
  2669.          LDR_SET LDR_EXT_LOHI8BIT, c, num
  2670.          LDR_SET LDR_EXT_RNMD, p, num
  2671.          REGS_SET_OP num
  2672.        endm          
  2673.        
  2674.        IRL_PUSH macro
  2675.          ID = 0
  2676.          WHILE ID ne 32
  2677.            IRL_PUSH_b %ID
  2678.            ID = ID + 1
  2679.          ENDM
  2680.        endm
  2681.      
  2682.        ;; XXX: This macro branch is actually terrible to write.
  2683.        REGS_SET_OP macro link
  2684.        z&link:
  2685.          ;; have to use variables.
  2686.        RSO_STACK_REQUIRE equ 128
  2687.        RSO_L equ 1
  2688.        RSO_W equ 2
  2689.        RSO_S equ 4
  2690.        RSO_U equ 8
  2691.        RSO_P equ 16
  2692.        
  2693.          IF  (link and RSO_L) eq 0
  2694.            DEBUG_OUT "STM"
  2695.          ELSEIF (link and RSO_L) ne 0
  2696.            DEBUG_OUT "LDM"
  2697.          ENDIF
  2698.          
  2699.          IF (link and RSO_U) eq 0
  2700.            DEBUG_OUT "D"
  2701.          ELSEIF (link and RSO_U) ne 0
  2702.            DEBUG_OUT "I"
  2703.          ENDIF
  2704.          
  2705.          IF  (link and RSO_P)  eq 0
  2706.            DEBUG_OUT "A"
  2707.          ELSEIF  (link and RSO_P)  ne 0
  2708.            DEBUG_OUT "B"
  2709.          ENDIF        
  2710.          
  2711.          DEBUG_OUT " R%d", "SC_INVOLATILE } 16 & 15"
  2712.          
  2713.          IF (link and RSO_W)  ne 0
  2714.            DEBUG_OUT "!"
  2715.          ENDIF
  2716.          
  2717.          DEBUG_OUT ", "
  2718.          DEBUG_OUT "[ R15-R12:%01X, R11-R8:%01X ", "SC_INVOLATILE } 12 & 15", "SC_INVOLATILE } 8 & 15"
  2719.          DEBUG_OUT "  R7-R4:%01X, R3-R0:%01X ]", "SC_INVOLATILE } 4 & 15", "SC_INVOLATILE & 15"      
  2720.          
  2721.          IF (link and RSO_S) ne 0
  2722.            DEBUG_OUT "^"
  2723.          ENDIF
  2724.          
  2725.          sub esp, RSO_STACK_REQUIRE
  2726.          RnTemp equ dword ptr[esp+16]
  2727.          RnIndex equ dword ptr[esp+20]
  2728.          RnCount equ dword ptr[esp+28]
  2729.          RegList equ dword ptr[esp+32]
  2730.          RnTempG equ dword ptr[esp+36]
  2731.          RnAdjust equ dword ptr[esp+40]
  2732.          ;; Reset Context
  2733.          xor eax, eax                  
  2734.          mov RnIndex, eax          
  2735.          mov RnCount, eax
  2736.          GetRFI SC_INVOLATILE, 16, eax ;;Rn.
  2737.          mov ecx, SC_INVOLATILE
  2738.          mov edx, XRFI[eax*4] ;;GetRn
  2739.          and ecx, 0FFFFh
  2740.          mov RnIndex, eax
  2741.          mov RnTemp, edx
  2742.          mov RnAdjust, eax
  2743.          IF (link and RSO_U) ne 0
  2744.            mov  SC_INVOLATILE, 4
  2745.          ELSEIF (link and RSO_U) eq 0
  2746.            mov  SC_INVOLATILE, -4
  2747.          ENDIF
  2748.          mov RegList, ecx
  2749.          mov eax, ecx
  2750.          xor ecx, ecx
  2751.          mov edx, 16
  2752.          @@:
  2753.          shr ax, 1
  2754.          adc cx, 0  
  2755.          dec dx
  2756.          jne @B
  2757.          ;; TODO: assert 0
  2758.          shl ecx, 2
  2759.          mov edx, RnTemp
  2760.        IF (link and RSO_U) ne 0
  2761.          add  edx, ecx
  2762.        ELSEIF (link and RSO_U) eq 0
  2763.          sub  edx, ecx
  2764.          lea  eax, [edx+4]
  2765.          mov  RnTemp, eax
  2766.        ENDIF
  2767.          mov RnTempG, edx    
  2768.        IF (link and RSO_P) ne 0
  2769.          add  RnTemp, SC_INVOLATILE
  2770.        ENDIF  
  2771.        mov SC_INVOLATILE, RnTemp
  2772.        
  2773.      ;; STM-------------------------------------------------------
  2774.      IF (link and RSO_L) eq 0
  2775.        ;; Check Rn's adjust
  2776.        mov ecx, RnIndex
  2777.        bt RegList, ecx
  2778.        jnc @F
  2779.        sbb edx, edx  
  2780.        ;; Check is First Vailed bit
  2781.        mov eax, edx
  2782.        shl eax, cl
  2783.        xor eax, edx
  2784.        test RegList, eax
  2785.        je @F
  2786.        ;; Dirty register, write directly
  2787.        mov eax, RnIndex
  2788.        mov ecx, RnTempG
  2789.        mov XRFI[eax*4], ecx
  2790.        @@:    
  2791.        IF (link and RSO_S) ne 0
  2792.          ;; In User mode, Check Current is user/sys mode
  2793.          ;; If hit, use std copy . (Because the user-mode cache register may not have been updated)
  2794.          mov eax, SC_CPSR
  2795.          and eax, ARM7_MODE_GET_MASK
  2796.          cmp eax, ARM7_MODE_SYS_MASK
  2797.          je rsgStdPush&link
  2798.          cmp eax, ARM7_MODE_USER_MASK
  2799.          je rsgStdPush&link
  2800.          cmp eax, ARM7_MODE_FIQ_MASK
  2801.          je rsgFIQPush&link
  2802.          jmp rsgUserPush&link              
  2803.        ELSEIF (link and RSO_S) eq 0
  2804.          jmp rsgStdPush&link
  2805.        ENDIF
  2806.        ;; STM  User Mode -------------------------------------------------------
  2807.        rsgUserPush&link:
  2808.          shr RegList, 1
  2809.          jnc @F            
  2810.          mov eax, RnCount
  2811.          mov ecx, XRFI[eax*4]
  2812.          add eax, 1
  2813.          and eax, 15
  2814.          cmp eax, 14
  2815.          jb rsgUserPushSkip&link
  2816.          sub eax, 14
  2817.          mov ecx, [SC_ARM7].R1314_T[R1314b_SYSUSER+ eax*4]
  2818.        rsgUserPushSkip&link:
  2819.          push ecx
  2820.          mov eax, SC_INVOLATILE
  2821.          and eax, -4
  2822.          push eax
  2823.          CallMemOrIOAddWaitState MmuWriteWord
  2824.          add SC_INVOLATILE, 4  
  2825.        @@:
  2826.          add RnCount, 1            
  2827.          cmp RnCount, 16
  2828.          jb rsgUserPush&link
  2829.          jmp rspushOut&link
  2830.        ;; STM  FIQ Mode -------------------------------------------------------
  2831.        rsgFIQPush&link:
  2832.          shr RegList, 1
  2833.          jnc @F            
  2834.          mov eax, RnCount
  2835.          mov ecx, XRFI[eax*4]
  2836.          add eax, 1
  2837.          and eax, 15
  2838.          cmp eax, 9
  2839.          jb rsgFIQPushSkip&link
  2840.          cmp eax, 13
  2841.          jb rsgFIQPushSkip&link
  2842.          mov ecx, [SC_ARM7].R812_T[R812b_FIQ+ eax*4]
  2843.          jmp rsgFIQPushSkip&link
  2844.          sub eax, 14
  2845.          mov ecx, [SC_ARM7].R1314_T[R1314b_FIQ+ eax*4]
  2846.        rsgFIQPushSkip&link:
  2847.          push ecx
  2848.          mov eax, SC_INVOLATILE
  2849.          and eax, -4
  2850.          push eax
  2851.          CallMemOrIOAddWaitState MmuWriteWord
  2852.          add SC_INVOLATILE, 4  
  2853.        @@:
  2854.          add RnCount, 1            
  2855.          cmp RnCount, 16
  2856.          jb rsgFIQPush&link
  2857.          jmp rspushOut&link
  2858.        ;; STM  Std Mode --------------------------------------------------------
  2859.        rsgStdPush&link:
  2860.          shr RegList, 1
  2861.          jnc @F            
  2862.          mov eax, RnCount
  2863.          push XRFI[eax*4]
  2864.          mov eax, SC_INVOLATILE
  2865.          and eax, -4
  2866.          push eax
  2867.          CallMemOrIOAddWaitState MmuWriteWord
  2868.          add SC_INVOLATILE, 4  
  2869.        @@:
  2870.          add RnCount, 1            
  2871.          cmp RnCount, 16
  2872.          jb  rsgStdPush&link
  2873.        rspushOut&link:  
  2874.        IF (link and RSO_W) ne 0
  2875.          mov eax, RnIndex
  2876.          mov ecx, RnTempG
  2877.          mov XRFI[eax*4], ecx  ;; TODO: RnCheck with Reglist
  2878.        ENDIF  
  2879.        add esp, RSO_STACK_REQUIRE
  2880.        arm7ClksFetch1
  2881.      ELSEIF (link and RSO_L) ne 0
  2882.        ;; LDM ----------------------------------------------------------------------    
  2883.        ;; Check Rn's adjust
  2884.        mov ecx, RnIndex
  2885.        bt RegList, ecx
  2886.        jnc @F
  2887.        mov RnAdjust, 1 ;; NoAdjust Base Register.    
  2888.        @@:        
  2889.        IF (link and RSO_S) ne 0      
  2890.          test RegList, 08000h
  2891.          jne rspop&link
  2892.          mov eax, SC_CPSR
  2893.          and eax, ARM7_MODE_GET_MASK
  2894.          cmp eax, ARM7_MODE_SYS_MASK
  2895.          je rspop&link
  2896.          cmp eax, ARM7_MODE_USER_MASK
  2897.          je rspop&link
  2898.          cmp eax, ARM7_MODE_FIQ_MASK
  2899.          je rsgFIQPop&link
  2900.          jmp rsgUserPop&link              
  2901.        ELSEIF (link and RSO_S) eq 0
  2902.          jmp rspop&link
  2903.        ENDIF
  2904.        ;; LDM  User Mode -------------------------------------------------------
  2905.        rsgUserPop&link:
  2906.          shr RegList, 1
  2907.          jnc @F            
  2908.          mov eax, RnCount
  2909.          lea SC_INVOLATILE, XRFI[eax*4]
  2910.          add eax, 1
  2911.          and eax, 15
  2912.          cmp eax, 14
  2913.          jb rsgUserPopSkip&link
  2914.          sub eax, 14
  2915.          lea SC_INVOLATILE, [SC_ARM7].R1314_T[R1314b_SYSUSER+ eax*4]          
  2916.        rsgUserPopSkip&link:
  2917.          mov eax, RnTemp
  2918.          and eax, -4
  2919.          push eax
  2920.          CallMemOrIOAddWaitState MmuReadWord
  2921.          mov [SC_INVOLATILE], eax
  2922.          add RnTemp, 4  
  2923.        @@:
  2924.          add RnCount, 1            
  2925.          cmp RnCount, 16
  2926.          jb rsgUserPop&link
  2927.          jmp rsgPopOut&link
  2928.        ;; LDM  FIQ Mode -------------------------------------------------------
  2929.        rsgFIQPop&link:
  2930.          shr RegList, 1
  2931.          jnc @F            
  2932.          mov eax, RnCount
  2933.          lea SC_INVOLATILE, XRFI[eax*4]
  2934.          add eax, 1
  2935.          and eax, 15
  2936.          cmp eax, 9
  2937.          jb rsgFIQPopSkip&link
  2938.          cmp eax, 13
  2939.          jb rsgFIQPopSkip&link
  2940.          lea SC_INVOLATILE, [SC_ARM7].R812_T[R812b_FIQ+ eax*4]
  2941.          jmp rsgFIQPopSkip&link
  2942.          sub eax, 14
  2943.          lea SC_INVOLATILE, [SC_ARM7].R1314_T[R1314b_FIQ+ eax*4]
  2944.        rsgFIQPopSkip&link:
  2945.          mov eax, RnTemp
  2946.          and eax, -4
  2947.          push eax
  2948.          CallMemOrIOAddWaitState MmuReadWord
  2949.          add RnTemp, 4  
  2950.        @@:
  2951.          add RnCount, 1            
  2952.          cmp RnCount, 16
  2953.          jb rsgFIQPop&link
  2954.          jmp rsgPopOut&link
  2955.        ;; LDM  Std Mode --------------------------------------------------------
  2956.        rspop&link:
  2957.          shr RegList, 1
  2958.          jnc @F            
  2959.          mov eax, RnCount
  2960.          lea SC_INVOLATILE, XRFI[eax*4]
  2961.          mov eax, RnTemp
  2962.          and eax, -4
  2963.          push eax
  2964.          CallMemOrIOAddWaitState MmuReadWord
  2965.          mov [SC_INVOLATILE], eax
  2966.          add RnTemp, 4  
  2967.          mov [SC_INVOLATILE], eax
  2968.          ;; Check is finial??
  2969.          cmp RnCount, 15
  2970.          jne @F
  2971.          IF (link and RSO_W) ne 0
  2972.            cmp RnAdjust, 1
  2973.            je RnAdjustSkip&link
  2974.            mov eax, RnIndex
  2975.            mov ecx, RnTempG
  2976.            mov XRFI[eax*4], ecx
  2977.            RnAdjustSkip&link:
  2978.          ENDIF
  2979.          IF (link and RSO_S) ne 0
  2980.            SPSRToCPSR eax  
  2981.          ENDIF
  2982.          add esp, RSO_STACK_REQUIRE
  2983.          test SC_CPSR, FLAG_THUMB
  2984.          jne rspopTFetch&link
  2985.          arm7PipelineFlush 2
  2986.      rspopTFetch&link:
  2987.          tbPipelineFlush 2
  2988.        @@:
  2989.          add RnCount, 1            
  2990.          cmp RnCount, 16
  2991.          jb  rspop&link
  2992.        rsgPopOut&link:  
  2993.        IF (link and RSO_W) ne 0
  2994.          cmp RnAdjust, 1
  2995.          je @F
  2996.          mov eax, RnIndex
  2997.          mov ecx, RnTempG
  2998.          mov XRFI[eax*4], ecx  
  2999.        @@:
  3000.        ENDIF  
  3001.        add esp, RSO_STACK_REQUIRE
  3002.        arm7ClksFetch1      
  3003.      ENDIF
  3004.      endm
  3005.            
  3006.        IRL_PUSH
  3007.        
  3008.        SWINT:
  3009.          DEBUG_OUT "Software Interrupt "
  3010.          mov eax, XRFI[SZ_PC*4]
  3011.          mov ecx, SC_CPSR
  3012.          and ecx, ARM7_MODE_CLR_MASK
  3013.          or ecx, ARM7_MODE_MGR_MASK  ;; Set SVC mode.
  3014.          and ecx, not FLAG_THUMB ;; Clear Thumb exec flag
  3015.          or ecx, IRQ_INHIBI_MASK ;; Set IRQ inhibit mask
  3016.          ;; PC to SVC's LR, LR:= Current Instruction +4
  3017.          lea edx, [eax-4]
  3018.          mov [SC_ARM7].R1314_T[R1314b_MGR+1*4], edx  
  3019.          ;; Adjust PC Pointer to IRQ Interrupt vector address
  3020.          mov XRFI[SZ_PC*4], ARM7_VECTOR_SOFTWARE
  3021.          ;; switch Mode
  3022.          SwitchMode ecx
  3023.          ;; Prefetch Opcode pipeline
  3024.          arm7PipelineFlush 3    
  3025.        COPMO:
  3026.        COPDT:
  3027.        UDEFI: ;; undef opcode abnormal
  3028.         int 3  
  3029.      
  3030.    
  3031.      ;; ALU Shift Imm5 / Shift Rs / MUL / MISC
  3032. jTAB dd  SF_I5, SF_RS, SF_I5, SF_RS, SF_I5, SF_RS, SF_I5, SF_RS, SF_I5, A7MUL, SF_I5, LDRHW, SF_I5, LDRHW, SF_I5, LDRHW
  3033.      dd  SF_I5, SF_RS, SF_I5, SF_RS, SF_I5, SF_RS, SF_I5, SF_RS, SF_I5, A7SWP, SF_I5, LDRHW, SF_I5, LDRHW, SF_I5, LDRHW
  3034.      ;; ALU Imm8 Bitmap + 4bit Even Shift
  3035.      dd  AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8
  3036.      dd  AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8, AS_I8  
  3037.      ;; LDR/ STR Imm
  3038.      dd  LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12 ;;post index
  3039.      dd  LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12, LDI12 ;;preindex or std index
  3040.      ;; LDR/ STR Shift Rm
  3041.      dd  LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI
  3042.      dd  LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI, LDIRS, UDEFI
  3043.      
  3044.      ;; Negtive --------------------------------------------------------------------------------------------------------------------------------
  3045.      
  3046.      ;; Load/Stroe Multi
  3047.      dd  RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET
  3048.      dd  RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET, RGSET
  3049.      ;; Branch Sign Imm24 Without LRLINK
  3050.      dd  JMP24, JMP24, JMP24, JMP24, JMP24, JMP24, JMP24, JMP24, JMP24, JMP24, JMP24, JMP24, JMP24, JMP24, JMP24, JMP24
  3051.      ;; Branch Sign Imm24 With LRLINK
  3052.      dd  JMPLR, JMPLR, JMPLR, JMPLR, JMPLR, JMPLR, JMPLR, JMPLR, JMPLR, JMPLR, JMPLR, JMPLR, JMPLR, JMPLR, JMPLR, JMPLR
  3053.      ;; FPU, GBA doesn't have to deal with these things, For Simple, Link it to int 3
  3054.      dd  COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT
  3055.      dd  COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT, COPDT
  3056.      dd  COPMO, COPMO, COPMO, COPMO, COPMO, COPMO, COPMO, COPMO, COPMO, COPMO, COPMO, COPMO, COPMO, COPMO, COPMO, COPMO
  3057.      ;; GBA Bios Software Interrupt.
  3058.      dd  SWINT, SWINT, SWINT, SWINT, SWINT, SWINT, SWINT, SWINT, SWINT, SWINT, SWINT, SWINT, SWINT, SWINT, SWINT, SWINT  
  3059.      
  3060.      ;; Thumb Instruction Entry -----------------------------------------------------------------------------------
  3061.      INSFT_DEPLOY macro lSym
  3062.      lSym:
  3063.        mov ecx, SC_INVOLATILE
  3064.        GetRFIV_T SC_INVOLATILE, 3, edx  ;;Rm.
  3065.        GetRFI_T SC_INVOLATILE, 0,  eax  ;;Rd's Index .
  3066.        shr ecx, 6  
  3067.      endm
  3068.      INSFT_DEPLOY2 macro Op
  3069.        and ecx, 31  
  3070.        jne @B
  3071.        tbClksFetch1
  3072.      @@:
  3073.        Op edx, cl
  3074.        mov XRFI[eax*4], edx            
  3075.        SetNZC_A  
  3076.        tbClksFetch1
  3077.      endm
  3078.      
  3079.      INSFT_DEPLOY INLSL
  3080.        DEBUG_OUT "LSL R%d, R%d, #%d", "SC_INVOLATILE & 7", "SC_INVOLATILE }3 & 7", "SC_INVOLATILE } 6 & 31"
  3081.        or edx, edx
  3082.        mov XRFI[eax*4], edx
  3083.        SetNZ_A
  3084.        INSFT_DEPLOY2 shl
  3085.      INSFT_DEPLOY INLSR
  3086.        DEBUG_OUT "LSR R%d, R%d, #%d", "SC_INVOLATILE & 7", "SC_INVOLATILE }3 & 7", "SC_INVOLATILE } 6 & 31"
  3087.        shl edx, 1
  3088.        mov XRFI[eax*4], ecx
  3089.        ClrNZ_SetC_A
  3090.        INSFT_DEPLOY2 shr
  3091.      INSFT_DEPLOY INASR
  3092.        DEBUG_OUT "ASR R%d, R%d, #%d", "SC_INVOLATILE & 7", "SC_INVOLATILE }3 & 7", "SC_INVOLATILE } 6 & 31"
  3093.        shl edx, 1
  3094.        sbb ecx, ecx  ;; 0 or -1
  3095.        mov XRFI[eax*4], ecx          
  3096.        SetNZC_A  
  3097.        INSFT_DEPLOY2 sar  
  3098.      ADDI3:
  3099.        DEBUG_OUT "ADD R%d, R%d, #%d", "SC_INVOLATILE & 7", "SC_INVOLATILE }3 & 7", "SC_INVOLATILE } 6 & 7"
  3100.        GetRFIV_T SC_INVOLATILE, 3, edx  ;;Rn.
  3101.        GetRFI_T SC_INVOLATILE, 0, eax  ;;Rd's Index .  
  3102.        GetRFI_T SC_INVOLATILE, 6, ecx  ;;Imm3
  3103.        add edx, ecx  
  3104.        mov XRFI[eax*4], edx
  3105.        SetNZCV_A 0
  3106.        tbClksFetch1
  3107.      SUBI3:
  3108.        DEBUG_OUT "SUB R%d, R%d, #%d", "SC_INVOLATILE & 7", "SC_INVOLATILE }3 & 7", "SC_INVOLATILE } 6 & 7"
  3109.        GetRFIV_T SC_INVOLATILE, 3, edx  ;;Rn.
  3110.        GetRFI_T SC_INVOLATILE, 0, eax  ;;Rd's Index .  
  3111.        GetRFI_T SC_INVOLATILE, 6, ecx  ;;Imm3
  3112.        sub edx, ecx  
  3113.        mov XRFI[eax*4], edx
  3114.        SetNZCV_A 1
  3115.        tbClksFetch1      
  3116.      MOVI8:
  3117.        DEBUG_OUT "MOV R%d, #%d", "SC_INVOLATILE }8 & 7", "SC_INVOLATILE & 255"
  3118.        GetRFI_T SC_INVOLATILE, 8, ecx  ;;Rd's Index .  
  3119.        and SC_INVOLATILE, 255
  3120.        mov XRFI[ecx*4], SC_INVOLATILE
  3121.        SetNZ_A
  3122.        tbClksFetch1    
  3123.      CMPI8:
  3124.        DEBUG_OUT "CMP R%d, #%d", "SC_INVOLATILE }8 & 7", "SC_INVOLATILE & 255"
  3125.        GetRFIV_T SC_INVOLATILE, 8, ecx  ;;Rn's Value .  
  3126.        and SC_INVOLATILE, 255
  3127.        cmp ecx, SC_INVOLATILE
  3128.        SetNZCV_A 1
  3129.        tbClksFetch1
  3130.      ADDI8:
  3131.        DEBUG_OUT "ADD R%d, #%d", "SC_INVOLATILE }8 & 7", "SC_INVOLATILE & 255"
  3132.        GetRFI_T SC_INVOLATILE, 8, ecx  ;;Rd's Index .  
  3133.        and SC_INVOLATILE, 255
  3134.        add XRFI[ecx*4], SC_INVOLATILE
  3135.        SetNZCV_A 0
  3136.        tbClksFetch1      
  3137.      SUBI8:
  3138.        DEBUG_OUT "SUB R%d, #%d", "SC_INVOLATILE }8 & 7", "SC_INVOLATILE & 255"
  3139.        GetRFI_T SC_INVOLATILE, 8, ecx  ;;Rd's Index .  
  3140.        and SC_INVOLATILE, 255
  3141.        sub XRFI[ecx*4], SC_INVOLATILE
  3142.        SetNZCV_A 0
  3143.        tbClksFetch1
  3144.      ALUOP:
  3145.        ;; ALU Unwind ------------------------
  3146.        GetRFI_T SC_INVOLATILE, 0, edx  ;;Rd's Index .
  3147.        GetRFIV_T SC_INVOLATILE, 3, ecx  ;;Rs/Rm/Rn
  3148.        mov eax, SC_INVOLATILE
  3149.        shr eax, 6
  3150.        and eax, 15
  3151.        jmp taTAB[eax*4]
  3152.      taAND:
  3153.        DEBUG_OUT "AND R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3154.        and XRFI[eax*4], ecx
  3155.        SetNZ_A
  3156.        tbClksFetch1
  3157.      taEOR:
  3158.        DEBUG_OUT "EOR R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3159.        xor XRFI[eax*4], ecx
  3160.        SetNZ_A
  3161.        tbClksFetch1    
  3162.      taORR:
  3163.        DEBUG_OUT "ORR R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3164.        or XRFI[eax*4], ecx
  3165.        SetNZ_A
  3166.        tbClksFetch1    
  3167.      taLSL:
  3168.        DEBUG_OUT "LSL R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3169.        and ecx, 255
  3170.        jne @F
  3171.        ;; ZERO.
  3172.        xor ecx, ecx
  3173.        or XRFI[edx*4], ecx
  3174.        SetNZ_A
  3175.        tbClksFetch1
  3176.      @@:
  3177.        xor eax, eax
  3178.        xor SC_INVOLATILE, SC_INVOLATILE
  3179.        cmp ecx, 32
  3180.        jb @F
  3181.        sete al
  3182.        and SC_CPSR, not FLAG_C
  3183.        bt XRFI[edx*4], eax
  3184.        mov XRFI[edx*4], SC_INVOLATILE
  3185.        sbb SC_INVOLATILE, SC_INVOLATILE ;; -1 OR 0  
  3186.        shl eax, FLAG_CHECK_C_X86_BT
  3187.        or eax, SC_INVOLATILE
  3188.        or SC_CPSR, eax
  3189.        or SC_CPSR, FLAG_Z
  3190.        and SC_CPSR, not FLAG_N
  3191.        tbClksFetch1
  3192.      @@:
  3193.        shl XRFI[edx*4], cl
  3194.        SetNZC_A
  3195.        tbClksFetch1
  3196.      taLSR:
  3197.        DEBUG_OUT "LSR R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3198.        and ecx, 255
  3199.        jne @F
  3200.        ;; ZERO.
  3201.        xor ecx, ecx
  3202.        or XRFI[edx*4], ecx
  3203.        SetNZ_A
  3204.        tbClksFetch1
  3205.      @@:
  3206.        xor eax, eax
  3207.        xor SC_INVOLATILE, SC_INVOLATILE
  3208.        cmp ecx, 32
  3209.        jb @F
  3210.        sete al
  3211.        and SC_CPSR, not FLAG_C
  3212.        bt XRFI[edx*4], 31
  3213.        mov XRFI[edx*4], SC_INVOLATILE
  3214.        sbb SC_INVOLATILE, SC_INVOLATILE ;; -1 OR 0  
  3215.        shl eax, FLAG_CHECK_C_X86_BT
  3216.        or eax, SC_INVOLATILE
  3217.        or SC_CPSR, eax
  3218.        or SC_CPSR, FLAG_Z
  3219.        and SC_CPSR, not FLAG_N
  3220.        tbClksFetch1
  3221.      @@:
  3222.        shr XRFI[edx*4], cl
  3223.        SetNZC_A
  3224.        tbClksFetch1      
  3225.      taASR:
  3226.        DEBUG_OUT "ASR R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3227.        and ecx, 255
  3228.        jne @F
  3229.        ;; ZERO.
  3230.        xor ecx, ecx
  3231.        or XRFI[edx*4], ecx
  3232.        SetNZ_A
  3233.        tbClksFetch1
  3234.      @@:
  3235.        xor eax, eax
  3236.        xor SC_INVOLATILE, SC_INVOLATILE
  3237.        cmp ecx, 32
  3238.        jb @F
  3239.        bt XRFI[edx*4], 31
  3240.        sbb ecx, ecx  
  3241.        mov XRFI[edx*4], ecx
  3242.        SetNZC_A
  3243.        tbClksFetch1
  3244.      @@:
  3245.        sar XRFI[edx*4], cl
  3246.        SetNZC_A
  3247.        tbClksFetch1
  3248.      taROR:
  3249.        DEBUG_OUT "ROR R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3250.        and ecx, 255
  3251.        jne @F
  3252.        ;; ZERO.
  3253.        xor ecx, ecx
  3254.        or XRFI[edx*4], ecx
  3255.        SetNZ_A
  3256.        tbClksFetch1
  3257.      @@:
  3258.        xor eax, eax
  3259.        xor SC_INVOLATILE, SC_INVOLATILE
  3260.        test ecx, 31
  3261.        jne @F
  3262.        and SC_CPSR, not FLAG_C
  3263.        bt XRFI[edx*4], 31
  3264.        sbb ecx, ecx  
  3265.        shl ecx, FLAG_CHECK_C_X86_BT
  3266.        and ecx, FLAG_C
  3267.        or SC_CPSR, FLAG_C    
  3268.        or XRFI[edx*4], eax
  3269.        SetNZ_A
  3270.        tbClksFetch1
  3271.      @@:
  3272.        and ecx, 31
  3273.        ror XRFI[edx*4], cl
  3274.        SetNZC_A
  3275.        tbClksFetch1
  3276.      taADC:
  3277.        DEBUG_OUT "ADC R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3278.        bt SC_CPSR, FLAG_CHECK_C_X86_BT
  3279.        adc XRFI[edx*4], ecx
  3280.        SetNZCV_A 0
  3281.        tbClksFetch1
  3282.      taSBC:
  3283.        DEBUG_OUT "SBC R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3284.        xor SC_CPSR, FLAG_C
  3285.        bt SC_CPSR, FLAG_CHECK_C_X86_BT
  3286.        adc XRFI[edx*4], ecx
  3287.        SetNZCV_A 1
  3288.        tbClksFetch1
  3289.      taCMP:
  3290.        DEBUG_OUT "CMP R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3291.        cmp XRFI[edx*4], ecx
  3292.        SetNZCV_A 1
  3293.        tbClksFetch1  
  3294.      taCMN:
  3295.        DEBUG_OUT "CMN R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3296.        mov eax, XRFI[edx*4]
  3297.        add eax, ecx
  3298.        SetNZCV_A 0
  3299.        tbClksFetch1
  3300.      taTST:
  3301.        DEBUG_OUT "TST R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3302.        test XRFI[edx*4], ecx
  3303.        SetNZ_A
  3304.        tbClksFetch1
  3305.      taNEG:
  3306.        DEBUG_OUT "NEG R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3307.        xor eax, eax
  3308.        sub eax, ecx
  3309.        mov XRFI[edx*4], eax
  3310.        SetNZCV_A 1
  3311.        tbClksFetch1
  3312.      taBIC:
  3313.        DEBUG_OUT "BIC R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3314.        not ecx
  3315.        and XRFI[edx*4], ecx
  3316.        SetNZ_A
  3317.        tbClksFetch1      
  3318.      taMVN:
  3319.        DEBUG_OUT "MVN R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3320.        not ecx
  3321.        or ecx, ecx
  3322.        mov XRFI[edx*4], ecx
  3323.        SetNZ_A  
  3324.        tbClksFetch1        
  3325.      taMUL:
  3326.        DEBUG_OUT "MUL R%d, R%d", "SC_INVOLATILE & 7", "SC_INVOLATILE } 3 & 7"
  3327.        mov eax, ecx
  3328.        mul XRFI[edx*4]
  3329.        mov XRFI[edx*4], eax
  3330.        MUL_CLKS_M_S3 eax, ecx, edx
  3331.        or eax, eax
  3332.        SetNZ_A  
  3333.        tbClksFetchN edx        
  3334.      
  3335.        taTAB dd taAND, taEOR, taLSL, taLSR
  3336.              dd taASR, taADC, taSBC, taROR
  3337.              dd taTST, taNEG, taCMP, taCMN
  3338.              dd taORR, taMUL, taBIC, taMVN
  3339.              
  3340.      ih1h2Get macro Post, RdRev, RmRev
  3341.        mov RmRev, Post
  3342.        bt Post, 7
  3343.        sbb RdRev, RdRev
  3344.        and RdRev, 8
  3345.        and RmRev, 7
  3346.        or RdRev, RmRev
  3347.        mov RmRev, Post
  3348.        and RmRev, 078h
  3349.        shr RmRev, 3  ;; TODO: Check LO-LO Trans UB.
  3350.      endm
  3351.      
  3352.      ADD16:
  3353.        ih1h2Get SC_INVOLATILE, ecx, edx
  3354.        DEBUG_OUT "ADD R%d, R%d", "ecx", "edx"
  3355.        mov edx, XRFI[edx*4]
  3356.        add XRFI[ecx*4], edx        
  3357.        cmp ecx, 15
  3358.        jne @B
  3359.        and XRFI[ecx*4], -2
  3360.        tbPipelineFlush 2
  3361.      @@:        
  3362.        tbClksFetch1
  3363.      MOV16:
  3364.        ih1h2Get SC_INVOLATILE, ecx, edx
  3365.        DEBUG_OUT "MOV R%d, R%d", "ecx", "edx"
  3366.        mov edx, XRFI[edx*4]
  3367.        mov XRFI[ecx*4], edx  
  3368.        cmp ecx, 15
  3369.        jne @B
  3370.        and XRFI[ecx*4], -2
  3371.        tbPipelineFlush 2
  3372.      @@:        
  3373.        tbClksFetch1        
  3374.      CMP16:
  3375.        ih1h2Get SC_INVOLATILE, ecx, edx
  3376.        DEBUG_OUT "CMP R%d, R%d", "ecx", "edx"
  3377.        mov edx, XRFI[edx*4]
  3378.        cmp XRFI[ecx*4], edx      
  3379.        SetNZCV_A 1        
  3380.        tbClksFetch1        
  3381.      BX_TB:
  3382.        mov eax, SC_INVOLATILE
  3383.        and eax, 078h
  3384.        shr eax, 3
  3385.        DEBUG_OUT "BX R%d", "eax"
  3386.        mov ecx, XRFI[eax*4]
  3387.        test ecx, 1
  3388.        je @F
  3389.        or SC_CPSR, FLAG_THUMB
  3390.        and ecx, -2
  3391.        mov XRFI[SZ_PC*4], ecx
  3392.        tbPipelineFlush 3
  3393.      @@:
  3394.        and SC_CPSR, not FLAG_THUMB
  3395.        and ecx, -2  
  3396.        mov XRFI[SZ_PC*4], ecx
  3397.        tbPipelineFlush 3
  3398.        
  3399.      STRsc macro Routine
  3400.        mov eax, SC_INVOLATILE
  3401.        mov ecx, SC_INVOLATILE
  3402.        mov edx, SC_INVOLATILE
  3403.        and eax, 7
  3404.        shr ecx, 3
  3405.        and ecx, 7
  3406.        shr edx, 6
  3407.        and edx, 7
  3408.        DEBUG_OUT "R%d, [R%d, R%d]", "eax", "ecx", "edx"
  3409.        mov ecx, XRFI[ecx*4]
  3410.        mov eax, XRFI[eax*4]      
  3411.        add ecx, XRFI[edx*4]  
  3412.        push eax
  3413.        push ecx
  3414.        CallMemOrIOAddWaitState Routine
  3415.        tbClksFetchN 2
  3416.      endm
  3417.      LDRsc macro Routine, MovSt, rhs  
  3418.        mov eax, SC_INVOLATILE
  3419.        mov ecx, SC_INVOLATILE
  3420.        mov edx, SC_INVOLATILE
  3421.        and eax, 7
  3422.        shr ecx, 3
  3423.        and ecx, 7
  3424.        shr edx, 6
  3425.        and edx, 7
  3426.        DEBUG_OUT "R%d, [R%d, R%d]", "eax", "ecx", "edx"
  3427.        mov ecx, XRFI[ecx*4]
  3428.        mov SC_INVOLATILE, eax    
  3429.        add ecx, XRFI[edx*4]  
  3430.        push ecx  
  3431.        CallMemOrIOAddWaitState Routine
  3432.        MovSt eax, rhs
  3433.        mov XRFI[SC_INVOLATILE*4], eax
  3434.        tbClksFetchN 3
  3435.      endm
  3436.      
  3437.      STRWD:  
  3438.        DEBUG_OUT "STR "
  3439.        STRsc MmuWriteWord
  3440.      STRHW:
  3441.        DEBUG_OUT "STRH "
  3442.        STRsc MmuWriteHalfWord  
  3443.      STRUB:
  3444.        DEBUG_OUT "STRB "
  3445.        STRsc MmuWriteByte
  3446.      LDRWD:
  3447.        DEBUG_OUT "LDR "
  3448.        LDRsc MmuReadWord, mov, eax
  3449.      LDHW2:
  3450.        DEBUG_OUT "LDRH "
  3451.        LDRsc MmuReadHalfWord, movzx, ax  
  3452.      LDRSW:
  3453.        DEBUG_OUT "LDRSH "
  3454.        LDRsc MmuReadHalfWord, movsx, ax  
  3455.      LDRUB:
  3456.        DEBUG_OUT "LDRB "
  3457.        LDRsc MmuReadByte, movzx, al      
  3458.      LDRSB:
  3459.        DEBUG_OUT "LDRSB "
  3460.        LDRsc MmuReadByte, movsx, al
  3461.      
  3462.      ;; encode: d0-d2 rd, d3-d5 rn, r6-r10 imm5*sizeof(bitdepth/8)      
  3463.      ADR5 macro SftBit ;; eax:rdi, edx:address
  3464.        mov eax, SC_INVOLATILE
  3465.        mov ecx, SC_INVOLATILE
  3466.        mov edx, SC_INVOLATILE
  3467.        and eax, 7 ;; Rd
  3468.        shr ecx, 3
  3469.        and ecx, 7 ;; Rn
  3470.        shr edx, 6
  3471.        and edx, 31 ;; Imm5  
  3472.        shl edx, SftBit    
  3473.        DEBUG_OUT "R%d, [R%d, %d]", "eax", "ecx", "edx"
  3474.        add edx, XRFI[ecx*4]    
  3475.      endm
  3476.      STR5 macro SftBit, CallRoutine
  3477.        ADR5 SftBit
  3478.        push XRFI[eax*4]
  3479.        push edx
  3480.        CallMemOrIOAddWaitState CallRoutine
  3481.        tbClksFetchN 2
  3482.      endm
  3483.      LDR5 macro SftBit, BitLimit, CallRoutine
  3484.        ADR5 SftBit
  3485.        mov SC_INVOLATILE, eax
  3486.        push edx
  3487.        CallMemOrIOAddWaitState CallRoutine
  3488.        and eax, BitLimit
  3489.        mov [SC_INVOLATILE*4], eax
  3490.        tbClksFetchN 2
  3491.      endm
  3492.      SIM08 macro lSym, SZ_BODY
  3493.       lSym:
  3494.        mov eax, SC_INVOLATILE
  3495.        mov ecx, SC_INVOLATILE
  3496.        mov edx, XRFI[SZ_BODY*4] ;; edx:PC or SP
  3497.        and eax, 255 ;; Imm8
  3498.        shr ecx, 8
  3499.        and ecx, 7 ;; ecx: RdI
  3500.        shl eax, 2 ;; eax: address temp  
  3501.        IF SZ_BODY eq SZ_STACK
  3502.          DEBUG_OUT "ADD R%d, SP, %d-%03X", "ecx", "eax", "eax"
  3503.        ELSEIF SZ_BODY eq SZ_PC
  3504.          DEBUG_OUT "ADD R%d, PC, %d-%03X", "ecx", "eax", "eax"
  3505.        ELSE
  3506.          ERRORS_ASSERT
  3507.        ENDIF
  3508.      endm
  3509.      
  3510.      LDSTR1315 macro lSym
  3511.       lSym:
  3512.        mov eax, SC_INVOLATILE
  3513.        mov ecx, SC_INVOLATILE
  3514.        mov edx, SC_INVOLATILE
  3515.        and eax, 255 ;; Imm8
  3516.        shr ecx, 8
  3517.        and ecx, 7 ;; Rd
  3518.        shl eax, 2 ;; *4 address temp
  3519.      endm
  3520.      
  3521.      STRW5:
  3522.        DEBUG_OUT "STR "
  3523.        STR5 2, MmuWriteWord
  3524.      STRH5:
  3525.        DEBUG_OUT "STRH "
  3526.        STR5 1, MmuWriteHalfWord
  3527.      STRB5:
  3528.        DEBUG_OUT "STRB "
  3529.        STR5 0, MmuWriteByte
  3530.      LDRW5:
  3531.        DEBUG_OUT "LDR "
  3532.        LDR5 2, 0FFFFFFFFh, MmuReadWord
  3533.      LDRH5:
  3534.        DEBUG_OUT "LDRH "
  3535.        LDR5 1, 0FFFFh, MmuReadHalfWord
  3536.      LDRB5:
  3537.        DEBUG_OUT "LDRB "
  3538.        LDR5 0, 0FFh, MmuReadByte
  3539.        
  3540.      LDSTR1315 LDRPC
  3541.        DEBUG_OUT "LDR R%d, [PC, #%d-%03X]", "ecx", "eax", "eax"
  3542.        mov edx, XRFI[SZ_PC*4]
  3543.        and edx, -4
  3544.        add eax, edx
  3545.        mov SC_INVOLATILE, ecx
  3546.        push eax
  3547.        CallMemOrIOAddWaitState MmuReadWord
  3548.        mov XRFI[SC_INVOLATILE*4], eax
  3549.        tbClksFetchN 3
  3550.      LDSTR1315 LDRSP
  3551.        DEBUG_OUT "LDR R%d, [SP, #%d-%03X]", "ecx", "eax", "eax"
  3552.        add eax, XRFI[SZ_LRLINK*4]  
  3553.        mov SC_INVOLATILE, ecx  
  3554.        push eax
  3555.        CallMemOrIOAddWaitState MmuReadWord
  3556.        mov XRFI[SC_INVOLATILE*4], eax
  3557.        tbClksFetchN 3          
  3558.      LDSTR1315 STRSP
  3559.        DEBUG_OUT "STR R%d, [SP, #%d-%03X]", "ecx", "eax", "eax"
  3560.        add eax, XRFI[SZ_LRLINK*4]  
  3561.        push XRFI[ecx*4]
  3562.        push eax
  3563.        CallMemOrIOAddWaitState MmuWriteWord
  3564.        tbClksFetchN 2    
  3565.        
  3566.      SIM08 PCI08, SZ_PC
  3567.        and edx, -4
  3568.        add edx, eax
  3569.        mov XRFI[ecx*4], edx
  3570.        tbClksFetch1
  3571.      SIM08 SPI08, SZ_STACK
  3572.        add edx, eax
  3573.        mov XRFI[ecx*4], edx
  3574.        tbClksFetch1      
  3575.      STKS7:
  3576.        bt SC_INVOLATILE, 7
  3577.        sbb eax, eax  
  3578.        and SC_INVOLATILE, 127
  3579.        xor SC_INVOLATILE, eax
  3580.        and eax, 1
  3581.        add SC_INVOLATILE, eax
  3582.        shl SC_INVOLATILE, 2
  3583.        DEBUG_OUT "ADD SP, #%d", "SC_INVOLATILE"
  3584.        add XRFI[SZ_STACK*4], SC_INVOLATILE
  3585.        tbClksFetch1  
  3586.          
  3587.        ;; Thumb  PUSH/POP RegSet.
  3588.        ;; ------------------------------------------------------------------------------------------
  3589.    PUSHR: ;; PUSH is DB stack opreate type, if R spec, Push LRLINK to stack.
  3590.      TCount equ dword ptr[esp+12]
  3591.      RnTemp equ dword ptr[esp+16]
  3592.      RnTempi equ dword ptr[esp+20]
  3593.        DEBUG_OUT "PUSH R:%d R7-R4:%01X R3-R0:%01X", "SC_INVOLATILE } 8 & 1", "SC_INVOLATILE } 4 & 15", "SC_INVOLATILE & 15"
  3594.        sub esp, 32
  3595.        sub XRFI[SZ_STACK*4], 4
  3596.        mov TCount, 8
  3597.        shl SC_INVOLATILE, 23
  3598.     @@:
  3599.        shl SC_INVOLATILE, 1
  3600.        jnc PUSHR_c
  3601.        mov eax, TCount
  3602.        bt eax, 3  ;; Check R Spec
  3603.        sbb ecx, ecx
  3604.        and ecx, SZ_LRLINK
  3605.        or eax, ecx ;; XXX: LRLINK must be 14        
  3606.        push XRFI[eax*4]
  3607.        push XRFI[SZ_STACK*4]
  3608.        CallMemOrIOAddWaitState MmuWriteWord
  3609.        add SC_GOAL_COUNT, 1
  3610.        sub XRFI[SZ_STACK*4], 4
  3611.      PUSHR_c:
  3612.        sub TCount, 1
  3613.        jge @B
  3614.        add XRFI[SZ_STACK*4], 4
  3615.        add esp, 32
  3616.        tbClksFetchN 1 ;; clks: (n-1)S+2N
  3617.        
  3618.    POPRP:  ;; POP is IA stack opreate type, if R spec, Pop PC from stack.
  3619.        DEBUG_OUT "POP R:%d R7-R4:%01X R3-R0:%01X", "SC_INVOLATILE } 8 & 1", "SC_INVOLATILE } 4 & 15", "SC_INVOLATILE & 15"
  3620.        sub esp, 32
  3621.        mov TCount, 0
  3622.     @@:
  3623.        shr SC_INVOLATILE, 1
  3624.        jnc POPRP_c        
  3625.        push XRFI[SZ_STACK*4]
  3626.        CallMemOrIOAddWaitState MmuReadWord
  3627.        mov edx, TCount
  3628.        bt edx, 3 ;; Check R Spec
  3629.        sbb ecx, ecx
  3630.        and ecx, SZ_PC
  3631.        or edx, ecx ;; XXX: PC must be 15  
  3632.        mov XRFI[edx*4], eax    
  3633.        add SC_GOAL_COUNT, 1
  3634.        add XRFI[SZ_STACK*4], 4
  3635.        cmp edx, SZ_PC ;; PC Flush? Flush Pipeline : nodone.
  3636.        jne POPRP_c2
  3637.      POPRP_c:
  3638.        add TCount, 1
  3639.        cmp TCount, 9
  3640.        jne @B
  3641.        add esp, 32
  3642.        tbClksFetchN 2
  3643.      POPRP_c2: ;; pc calc in final list
  3644.        add esp, 32
  3645.        tbPipelineFlush 4 ;; clks: nS+N+I HitPC +S+N    
  3646.          
  3647.    STMIA: ;;!!!!!!!!!!!!!!SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
  3648.        DEBUG_OUT "STMIA [R%d]!, R7-R4:%01X R3-R0:%01X", "SC_INVOLATILE } 8 & 7", "SC_INVOLATILE } 4 & 15", "SC_INVOLATILE & 15"
  3649.        sub esp, 32
  3650.        mov TCount, 0
  3651.        mov eax, SC_INVOLATILE
  3652.        shr eax, 8
  3653.        and eax, 7
  3654.        mov RnTempi, eax
  3655.        mov eax, XRFI[eax*4]
  3656.        mov RnTemp, eax
  3657.     @@:
  3658.        shr SC_INVOLATILE, 1
  3659.        jnc STMIA_c        
  3660.        mov eax, TCount
  3661.        push XRFI[eax*4]
  3662.        push RnTemp
  3663.        CallMemOrIOAddWaitState MmuWriteWord
  3664.        add SC_GOAL_COUNT, 1
  3665.        add RnTemp, 4
  3666.      STMIA_c:
  3667.        add TCount, 1
  3668.        cmp TCount, 8
  3669.        jne @B
  3670.        mov ecx, RnTemp
  3671.        mov eax, RnTempi
  3672.        mov XRFI[eax*4], ecx
  3673.        add esp, 32
  3674.        tbClksFetchN 1    
  3675.    LDMIA:
  3676.        DEBUG_OUT "LDMIA [R%d]!, R7-R4:%01X R3-R0:%01X", "SC_INVOLATILE } 8 & 7", "SC_INVOLATILE } 4 & 15", "SC_INVOLATILE & 15"
  3677.        sub esp, 32
  3678.        mov TCount, 0
  3679.        mov eax, SC_INVOLATILE
  3680.        shr eax, 8
  3681.        and eax, 7
  3682.        mov RnTempi, eax
  3683.        mov eax, XRFI[eax*4]
  3684.        mov RnTemp, eax
  3685.     @@:
  3686.        shr SC_INVOLATILE, 1
  3687.        jnc LDMIA_c        
  3688.        push RnTemp
  3689.        CallMemOrIOAddWaitState MmuReadWord
  3690.        mov ecx, TCount
  3691.        mov XRFI[ecx*4], eax
  3692.        add SC_GOAL_COUNT, 1
  3693.        add RnTemp, 4
  3694.      LDMIA_c:
  3695.        add TCount, 1
  3696.        cmp TCount, 8
  3697.        jne @B
  3698.        mov ecx, RnTemp
  3699.        mov eax, RnTempi
  3700.        mov XRFI[eax*4], ecx
  3701.        add esp, 32
  3702.        tbClksFetchN 2
  3703.      
  3704.      ;; Thumb JCC -----------------------------------------------------------------
  3705.      JCCEQ:
  3706.        DEBUG_OUT "JCC EQ "
  3707.        test SC_CPSR, FLAG_Z
  3708.        jne JCCAL
  3709.      JCCNV:
  3710.        DEBUG_OUT "Never exec "
  3711.        tbClksFetch1
  3712.      JCCNE:  
  3713.        DEBUG_OUT "JCC NE "
  3714.        test SC_CPSR, FLAG_Z
  3715.        je JCCAL
  3716.        tbClksFetch1    
  3717.      JCCCS:
  3718.        DEBUG_OUT "JCC CS "
  3719.        test SC_CPSR, FLAG_C
  3720.        jne JCCAL
  3721.        jmp JCCNV
  3722.      JCCCC:
  3723.        DEBUG_OUT "JCC CC "
  3724.        test SC_CPSR, FLAG_C
  3725.        je JCCAL
  3726.        jmp JCCNV
  3727.      JCCMI:      
  3728.        DEBUG_OUT "JCC MI "
  3729.        test SC_CPSR, FLAG_N
  3730.        jne JCCAL  
  3731.        jmp JCCNV      
  3732.      JCCPL:
  3733.        DEBUG_OUT "JCC PL "
  3734.        test SC_CPSR, FLAG_N
  3735.        je JCCAL
  3736.        jmp JCCNV
  3737.      JCCVS:
  3738.        DEBUG_OUT "JCC VS "
  3739.        test SC_CPSR, FLAG_V
  3740.        jne JCCAL
  3741.        jmp JCCNV
  3742.      JCCVC:
  3743.        DEBUG_OUT "JCC VC "
  3744.        test SC_CPSR, FLAG_V
  3745.        je JCCAL
  3746.        jmp JCCNV
  3747.      JCCHI: ;; C = 1 && Z = 0
  3748.        DEBUG_OUT "JCC HI "
  3749.        mov ecx, SC_CPSR
  3750.        and ecx, FLAG_CZ
  3751.        cmp ecx, FLAG_C
  3752.        je JCCAL
  3753.        jmp JCCNV
  3754.      JCCLS: ;; C = 0 || Z = 1
  3755.        DEBUG_OUT "JCC LS "
  3756.        mov ecx, SC_CPSR
  3757.        and ecx, FLAG_CZ
  3758.        xor ecx, FLAG_C
  3759.        jne JCCAL
  3760.        jmp JCCNV
  3761.      JCCGE: ;; N = V
  3762.        DEBUG_OUT "JCC GE "
  3763.        mov eax, SC_CPSR
  3764.        FLAG_N_TO_V_ALIGN_SHIFT eax, FLAG_N_TO_V_ALIGN_BIT
  3765.        xor eax, SC_CPSR
  3766.        and eax, FLAG_V
  3767.        je JCCAL
  3768.        jmp JCCNV
  3769.      JCCLT:  ;; N != V
  3770.        DEBUG_OUT "JCC LT "
  3771.        mov eax, SC_CPSR
  3772.        FLAG_N_TO_V_ALIGN_SHIFT eax, FLAG_N_TO_V_ALIGN_BIT
  3773.        xor eax, SC_CPSR
  3774.        and eax, FLAG_V
  3775.        jne JCCAL
  3776.        jmp JCCNV
  3777.      JCCGT: ;;    N = V  && Z= 0
  3778.        DEBUG_OUT "JCC GT "
  3779.        mov eax, SC_CPSR
  3780.        mov edx, SC_CPSR
  3781.        FLAG_N_TO_V_ALIGN_SHIFT eax, FLAG_N_TO_V_ALIGN_BIT
  3782.        and edx, FLAG_Z
  3783.        xor eax, SC_CPSR
  3784.        and eax, FLAG_V
  3785.        or eax, edx
  3786.        je JCCAL
  3787.        jmp JCCNV  
  3788.      JCCLE: ;;  Z = 1 || N!=V
  3789.        DEBUG_OUT "JCC LE "
  3790.        mov eax, SC_CPSR
  3791.        mov edx, SC_CPSR
  3792.        FLAG_N_TO_V_ALIGN_SHIFT eax, FLAG_N_TO_V_ALIGN_BIT
  3793.        and edx, FLAG_Z
  3794.        xor eax, SC_CPSR
  3795.        and eax, FLAG_V
  3796.        or eax, edx
  3797.        jne JCCAL
  3798.        jmp JCCNV
  3799.      JCCAL: ;; 1110
  3800.        DEBUG_OUT "Exec It.:"
  3801.        mov eax, SC_INVOLATILE
  3802.        and eax, 255
  3803.        mov [esp-8], eax
  3804.        movsx eax, byte ptr [esp-8]
  3805.        DEBUG_OUT ":Offset %d-%08X ", "eax", "eax"
  3806.        shl eax, 1
  3807.        add XRFI[SZ_PC*4], eax
  3808.        DEBUG_OUT ":CurrentPC %d-%08X", "ZF", "ZF"
  3809.        tbPipelineFlush 2    
  3810.      SWI08: ;; Thumb Software Interrupt
  3811.        DEBUG_OUT "Thumb Software Interrupt "
  3812.        mov eax, XRFI[SZ_PC*4]
  3813.        mov ecx, SC_CPSR
  3814.        and ecx, ARM7_MODE_CLR_MASK
  3815.        or ecx, ARM7_MODE_MGR_MASK  ;; Set SVC mode.
  3816.        and ecx, not FLAG_THUMB ;; Clear Thumb exec flag
  3817.        or ecx, IRQ_INHIBI_MASK ;; Set IRQ inhibit mask
  3818.        ;; PC to SVC's LR, LR:= Current Instruction next ins
  3819.        lea edx, [eax-2]
  3820.        mov [SC_ARM7].R1314_T[R1314b_MGR+1*4], edx  
  3821.        ;; Adjust PC Pointer to IRQ Interrupt vector address
  3822.        mov XRFI[SZ_PC*4], ARM7_VECTOR_SOFTWARE
  3823.        ;; switch Mode
  3824.        SwitchMode ecx
  3825.        ;; Prefetch Opcode pipeline
  3826.        arm7PipelineFlush 3
  3827.      ;; JMP Sign Offset 11bit. @!SMARK.
  3828.      JMP11:
  3829.        and SC_INVOLATILE, 07FFh
  3830.        bt SC_INVOLATILE, 10
  3831.        sbb eax, eax
  3832.        shl eax, 10
  3833.        or SC_INVOLATILE, eax
  3834.        shl SC_INVOLATILE, 1
  3835.        DEBUG_OUT ":JMP 11 Offset %d-%08X ", "SC_INVOLATILE", "SC_INVOLATILE"
  3836.        add XRFI[SZ_PC*4], SC_INVOLATILE
  3837.        DEBUG_OUT ":CurrentPC %d-%08X", "ZF", "ZF"
  3838.        tbPipelineFlush 2
  3839.      ;; BL Ext
  3840.      BLEXT:
  3841.        ;; Fetch Ext High  
  3842.        and SC_INVOLATILE, 07FFh
  3843.        bt SC_INVOLATILE, 10
  3844.        sbb eax, eax
  3845.        shl eax, 10
  3846.        or SC_INVOLATILE, eax
  3847.        shl SC_INVOLATILE, 12
  3848.        mov XRFI[SZ_LRLINK*4], SC_INVOLATILE
  3849.        ;; Fetch Next Opcode Must be BLSTD (TODO: Opcode Check)
  3850.        mov eax, [SC_ARM7].Opcode[4]
  3851.        and eax, 07FFh
  3852.        shl eax, 1
  3853.        add eax, XRFI[SZ_LRLINK*4]
  3854.        DEBUG_OUT ":BL Offset %d-%08X ", "ZE", "ZE"
  3855.        mov ecx, XRFI[SZ_PC*4]
  3856.        mov XRFI[SZ_PC*4], eax
  3857.        DEBUG_OUT ":CurrentPC %d-%08X ", "ZF", "ZF"
  3858.        sub ecx, 0 ;; backup to next instruction base current instruction
  3859.        or ecx, 1 ;; With Thumb flags, for BX
  3860.        DEBUG_OUT ":LINK %d-%08X ", "ecx", "ecx"
  3861.        mov XRFI[SZ_LRLINK*4] ,ecx
  3862.        ;; prefetch opcode .
  3863.        tbPipelineFlush 3
  3864.      BLSTD: ;;(in fact, with BLEXT).
  3865.      UNDEF:
  3866.        int 3
  3867.  
  3868. sTAB dd  INLSL, INLSL, INLSL, INLSL, INLSL, INLSL, INLSL, INLSL, INLSR, INLSR, INLSR, INLSR, INLSR, INLSR, INLSR, INLSR
  3869.      dd  INASR, INASR, INASR, INASR, INASR, INASR, INASR, INASR, UNDEF, UNDEF, UNDEF, UNDEF, ADDI3, ADDI3, SUBI3, SUBI3
  3870.      dd  MOVI8, MOVI8, MOVI8, MOVI8, MOVI8, MOVI8, MOVI8, MOVI8,  CMPI8, CMPI8, CMPI8, CMPI8, CMPI8, CMPI8, CMPI8, CMPI8  
  3871.      dd  ADDI8, ADDI8, ADDI8, ADDI8, ADDI8, ADDI8, ADDI8, ADDI8, SUBI8, SUBI8, SUBI8, SUBI8, SUBI8, SUBI8, SUBI8, SUBI8    
  3872.      dd  ALUOP, ALUOP, ALUOP, ALUOP, ADD16, CMP16, MOV16, BX_TB, LDRPC, LDRPC, LDRPC, LDRPC, LDRPC, LDRPC, LDRPC, LDRPC
  3873.      dd  STRWD, STRWD, STRHW, STRHW, STRUB, STRUB, LDRSB, LDRSB, LDRWD, LDRWD, LDHW2, LDHW2, LDRUB, LDRUB, LDRSW, LDRSW
  3874.      dd  STRW5, STRW5, STRW5, STRW5, STRW5, STRW5, STRW5, STRW5, LDRW5, LDRW5, LDRW5, LDRW5, LDRW5, LDRW5, LDRW5, LDRW5
  3875.      dd  STRB5, STRB5, STRB5, STRB5, STRB5, STRB5, STRB5, STRB5, LDRB5, LDRB5, LDRB5, LDRB5, LDRB5, LDRB5, LDRB5, LDRB5
  3876.      
  3877.      ;; Negtive --------------------------------------------------------------------------------------------------------------------------------
  3878.      dd  STRH5, STRH5, STRH5, STRH5, STRH5, STRH5, STRH5, STRH5, LDRH5, LDRH5, LDRH5, LDRH5, LDRH5, LDRH5, LDRH5, LDRH5  
  3879.      dd  STRSP, STRSP, STRSP, STRSP, STRSP, STRSP, STRSP, STRSP, LDRSP, LDRSP, LDRSP, LDRSP, LDRSP, LDRSP, LDRSP, LDRSP
  3880.      dd  PCI08, PCI08, PCI08, PCI08, PCI08, PCI08, PCI08, PCI08, SPI08, SPI08, SPI08, SPI08, SPI08, SPI08, SPI08, SPI08
  3881.      dd  STKS7, UNDEF, UNDEF, UNDEF, PUSHR, PUSHR, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, POPRP, POPRP, UNDEF, UNDEF      
  3882.      dd  STMIA, STMIA, STMIA, STMIA, STMIA, STMIA, STMIA, STMIA, LDMIA, LDMIA, LDMIA, LDMIA, LDMIA, LDMIA, LDMIA, LDMIA
  3883.      dd  JCCEQ, JCCNE, JCCCS, JCCCC, JCCMI, JCCPL, JCCVS, JCCVC, JCCHI, JCCLS, JCCGE, JCCLT, JCCGT, JCCLE, JCCAL, SWI08  
  3884.      dd  JMP11, JMP11, JMP11, JMP11, JMP11, JMP11, JMP11, JMP11, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF
  3885.      dd  BLEXT, BLEXT, BLEXT, BLEXT, BLEXT, BLEXT, BLEXT, BLEXT, BLSTD, BLSTD, BLSTD, BLSTD, BLSTD, BLSTD, BLSTD, BLSTD    
  3886.          
  3887. arm7tdmi_ticks endp
  3888.  
  3889.                  
  3890. end
  3891.  
  3892.  
  3893. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement