;ÂÐÅÌÅÍÍÛÅ ÌÀÊÐÎÑÛ ÂÛÑÎÊÎÓÐÎÂÍÅÂÎÃÎ ÑÈÍÒÀÊÑÈÑÀ ; ÍÎÂÛÕ ÂÅÐÑÈßÕ ml64 ÎÍÈ ÂÎÇÌÎÆÍÎ ÁÓÄÓÒ ÂÑÒÐÎÅÍÍÛ ;ÎÏÖÈß DOTNAME - ÍÅÎÁÕÎÄÈÌÀ ; vasil211@yandex.ru comment * Comparison run-time operators Operator Meaning == Equal {} Not equal } Greater than }= Greater than or equal to { Less than {= Less than or equal to & Bit test (format: expression & bitnumber) ~ Logical NOT | Bit test && Logical AND || Logical OR CARRY? Carry bit set OVERFLOW? Overflow bit set PARITY? Parity bit set SIGN? Sign bit set ZERO? Zero bit set CARRY?|ZERO? ìåíüíå èëè ðàâíî ~(CARRY?|ZERO?) áîëüøå äëÿ ñðàâíåíèÿ ÷èñåë ñî çíàêîì ~ZERO?&(SIGN?==OVERFLOW?) áîëüøå(greate than) SIGN?==OVERFLOW? áîëüøå èëè ðàâíî(greate than or equal) SIGN?{}OVERFLOW? ìåíüøå(less than) ZERO?|(SIGN?{}OVERFLOW?) ìåíüøå èëè ðàâíî(less than or equal) * ld macro ld_arg1,ld_arg2 movst ld_arg1,ld_arg2 EXITM endm lda macro ld_arg1 movReg64Arg rax,ld_arg1 EXITM endm ldea macro ld_arg1 movReg32Arg eax,ld_arg1 EXITM endm ldc macro ld_arg1 movReg64Arg rcx,ld_arg1 EXITM endm ldd macro ld_arg1 movReg64Arg rdx,ld_arg1 EXITM endm IMM_EXPR equ 100b MEM_EXPR equ 10b REG_EXPR equ 10000b LABEL_EXPR equ 1b VALID_REF equ 100000b DIRECT_ADDR equ 1000b VIMM_EXPR equ (VALID_REF OR IMM_EXPR) TAB_CHAR equ 9 SPACE_CHAR equ 20h CR_CHAR equ 13 LF_CHAR equ 10 COMMA_CHAR equ 2Ch COLON_CHAR equ 3Ah SEMICOLON_CHAR equ 3Bh LEFT_PARENTHESES equ 28h RIGHT_PARENTHESES equ 29h EXCLAMATION_MARK equ 21h LEFT_ANGLE equ 3Ch RIGHT_ANGLE equ 3Eh LEFT_SLASH equ 5Ch ;\ RIGHT_SLASH equ 2Fh ;/ NOT_A_REG64 equ 16 NOT_A_REG32 equ 16 NOT_A_REG16 equ 16 NOT_A_REG8 equ 16 NOT_A_REG equ 16 LOWER_MASK equ 20202020h SHORT_LOW equ 2020h LOW_CHAR equ 20h LT_CHAR equ 3Ch GT_CHAR equ 3Eh IFNDEF retn retn MACRO stackBytes IFIDN ,<> db 0C3h ELSE db 0C2h dw stackBytes ENDIF ENDM retnw MACRO stackBytes db 66h retn stackBytes ENDM enterw MACRO toStackRes,lvlEmb dw 0C866h,toStackRes db lvlEmb ENDM leavew MACRO dw 0C966h ENDM ENDIF TotalIfs = 0 TotalRept = 0 TotalWhile = 0 UntilConds0 TEXTEQU <> UntilConds1 TEXTEQU <> UntilConds2 TEXTEQU <> UntilConds3 TEXTEQU <> UntilConds4 TEXTEQU <> UntilConds5 TEXTEQU <> UntilConds6 TEXTEQU <> UntilConds7 TEXTEQU <> UntilConds8 TEXTEQU <> UntilConds9 TEXTEQU <> UntilConds10 TEXTEQU <> UntilConds11 TEXTEQU <> UntilConds12 TEXTEQU <> UntilConds13 TEXTEQU <> UntilConds14 TEXTEQU <> UntilConds15 TEXTEQU <> UntilConds16 TEXTEQU <> UntilConds17 TEXTEQU <> UntilConds18 TEXTEQU <> UntilConds19 TEXTEQU <> LastUntilConds TEXTEQU <> SaveUntilCondsLabel MACRO IFIDN UntilConds0,<> UntilConds0 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds0 ELSEIFIDN UntilConds1,<> UntilConds1 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds1 ELSEIFIDN UntilConds2,<> UntilConds2 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds2 ELSEIFIDN UntilConds3,<> UntilConds3 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds3 ELSEIFIDN UntilConds4,<> UntilConds4 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds4 ELSEIFIDN UntilConds5,<> UntilConds5 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds5 ELSEIFIDN UntilConds6,<> UntilConds6 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds6 ELSEIFIDN UntilConds7,<> UntilConds7 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds7 ELSEIFIDN UntilConds8,<> UntilConds8 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds8 ELSEIFIDN UntilConds9,<> UntilConds9 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds9 ELSEIFIDN UntilConds10,<> UntilConds10 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds10 ELSEIFIDN UntilConds11,<> UntilConds11 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds11 ELSEIFIDN UntilConds12,<> UntilConds12 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds12 ELSEIFIDN UntilConds13,<> UntilConds13 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds13 ELSEIFIDN UntilConds14,<> UntilConds14 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds14 ELSEIFIDN UntilConds15,<> UntilConds15 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds15 ELSEIFIDN UntilConds16,<> UntilConds16 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds16 ELSEIFIDN UntilConds17,<> UntilConds17 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds17 ELSEIFIDN UntilConds18,<> UntilConds18 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds18 ELSEIFIDN UntilConds19,<> UntilConds19 CATSTR ,@CatStr(%TotalWhile) LastUntilConds TEXTEQU UntilConds19 ELSE .err ENDIF TotalWhile = TotalWhile+1 ENDM GetUntilCondsLabel MACRO IFDIF UntilConds19,<> LastUntilConds TEXTEQU UntilConds19 ELSEIFDIF UntilConds18,<> LastUntilConds TEXTEQU UntilConds18 ELSEIFDIF UntilConds17,<> LastUntilConds TEXTEQU UntilConds17 ELSEIFDIF UntilConds16,<> LastUntilConds TEXTEQU UntilConds16 ELSEIFDIF UntilConds15,<> LastUntilConds TEXTEQU UntilConds15 ELSEIFDIF UntilConds14,<> LastUntilConds TEXTEQU UntilConds14 ELSEIFDIF UntilConds13,<> LastUntilConds TEXTEQU UntilConds13 ELSEIFDIF UntilConds12,<> LastUntilConds TEXTEQU UntilConds12 ELSEIFDIF UntilConds11,<> LastUntilConds TEXTEQU UntilConds11 ELSEIFDIF UntilConds10,<> LastUntilConds TEXTEQU UntilConds10 ELSEIFDIF UntilConds9,<> LastUntilConds TEXTEQU UntilConds9 ELSEIFDIF UntilConds8,<> LastUntilConds TEXTEQU UntilConds8 ELSEIFDIF UntilConds7,<> LastUntilConds TEXTEQU UntilConds7 ELSEIFDIF UntilConds6,<> LastUntilConds TEXTEQU UntilConds6 ELSEIFDIF UntilConds5,<> LastUntilConds TEXTEQU UntilConds5 ELSEIFDIF UntilConds4,<> LastUntilConds TEXTEQU UntilConds4 ELSEIFDIF UntilConds3,<> LastUntilConds TEXTEQU UntilConds3 ELSEIFDIF UntilConds2,<> LastUntilConds TEXTEQU UntilConds2 ELSEIFDIF UntilConds1,<> LastUntilConds TEXTEQU UntilConds1 ELSEIFDIF UntilConds0,<> LastUntilConds TEXTEQU UntilConds0 ELSE LastUntilConds TEXTEQU <> ENDIF ENDM DelUntilCondsLabel MACRO IFDIF UntilConds19,<> UntilConds19 TEXTEQU <> ELSEIFDIF UntilConds18,<> UntilConds18 TEXTEQU <> ELSEIFDIF UntilConds17,<> UntilConds17 TEXTEQU <> ELSEIFDIF UntilConds16,<> UntilConds16 TEXTEQU <> ELSEIFDIF UntilConds15,<> UntilConds15 TEXTEQU <> ELSEIFDIF UntilConds14,<> UntilConds14 TEXTEQU <> ELSEIFDIF UntilConds13,<> UntilConds13 TEXTEQU <> ELSEIFDIF UntilConds12,<> UntilConds12 TEXTEQU <> ELSEIFDIF UntilConds11,<> UntilConds11 TEXTEQU <> ELSEIFDIF UntilConds10,<> UntilConds10 TEXTEQU <> ELSEIFDIF UntilConds9,<> UntilConds9 TEXTEQU <> ELSEIFDIF UntilConds8,<> UntilConds8 TEXTEQU <> ELSEIFDIF UntilConds7,<> UntilConds7 TEXTEQU <> ELSEIFDIF UntilConds6,<> UntilConds6 TEXTEQU <> ELSEIFDIF UntilConds5,<> UntilConds5 TEXTEQU <> ELSEIFDIF UntilConds4,<> UntilConds4 TEXTEQU <> ELSEIFDIF UntilConds3,<> UntilConds3 TEXTEQU <> ELSEIFDIF UntilConds2,<> UntilConds2 TEXTEQU <> ELSEIFDIF UntilConds1,<> UntilConds1 TEXTEQU <> ELSEIFDIF UntilConds0,<> UntilConds0 TEXTEQU <> ENDIF ENDM UntilLevel0 TEXTEQU <> UntilLevel1 TEXTEQU <> UntilLevel2 TEXTEQU <> UntilLevel3 TEXTEQU <> UntilLevel4 TEXTEQU <> UntilLevel5 TEXTEQU <> UntilLevel6 TEXTEQU <> UntilLevel7 TEXTEQU <> UntilLevel8 TEXTEQU <> UntilLevel9 TEXTEQU <> UntilLevel10 TEXTEQU <> UntilLevel11 TEXTEQU <> UntilLevel12 TEXTEQU <> UntilLevel13 TEXTEQU <> UntilLevel14 TEXTEQU <> UntilLevel15 TEXTEQU <> UntilLevel16 TEXTEQU <> UntilLevel17 TEXTEQU <> UntilLevel18 TEXTEQU <> UntilLevel19 TEXTEQU <> LastUntilLabel TEXTEQU <> SaveUntilLabel MACRO IFIDN UntilLevel0,<> UntilLevel0 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel0 ELSEIFIDN UntilLevel1,<> UntilLevel1 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel1 ELSEIFIDN UntilLevel2,<> UntilLevel2 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel2 ELSEIFIDN UntilLevel3,<> UntilLevel3 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel3 ELSEIFIDN UntilLevel4,<> UntilLevel4 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel4 ELSEIFIDN UntilLevel5,<> UntilLevel5 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel5 ELSEIFIDN UntilLevel6,<> UntilLevel6 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel6 ELSEIFIDN UntilLevel7,<> UntilLevel7 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel7 ELSEIFIDN UntilLevel8,<> UntilLevel8 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel8 ELSEIFIDN UntilLevel9,<> UntilLevel9 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel9 ELSEIFIDN UntilLevel10,<> UntilLevel10 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel10 ELSEIFIDN UntilLevel11,<> UntilLevel11 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel11 ELSEIFIDN UntilLevel12,<> UntilLevel12 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel12 ELSEIFIDN UntilLevel13,<> UntilLevel13 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel13 ELSEIFIDN UntilLevel14,<> UntilLevel14 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel14 ELSEIFIDN UntilLevel15,<> UntilLevel15 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel15 ELSEIFIDN UntilLevel16,<> UntilLevel16 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel16 ELSEIFIDN UntilLevel17,<> UntilLevel17 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel17 ELSEIFIDN UntilLevel18,<> UntilLevel18 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel18 ELSEIFIDN UntilLevel19,<> UntilLevel19 CATSTR ,@CatStr(%TotalRept) LastUntilLabel TEXTEQU UntilLevel19 ELSE .err ENDIF TotalRept = TotalRept+1 ENDM GetUntilLabel MACRO IFDIF UntilLevel19,<> LastUntilLabel TEXTEQU UntilLevel19 ELSEIFDIF UntilLevel18,<> LastUntilLabel TEXTEQU UntilLevel18 ELSEIFDIF UntilLevel17,<> LastUntilLabel TEXTEQU UntilLevel17 ELSEIFDIF UntilLevel16,<> LastUntilLabel TEXTEQU UntilLevel16 ELSEIFDIF UntilLevel15,<> LastUntilLabel TEXTEQU UntilLevel15 ELSEIFDIF UntilLevel14,<> LastUntilLabel TEXTEQU UntilLevel14 ELSEIFDIF UntilLevel13,<> LastUntilLabel TEXTEQU UntilLevel13 ELSEIFDIF UntilLevel12,<> LastUntilLabel TEXTEQU UntilLevel12 ELSEIFDIF UntilLevel11,<> LastUntilLabel TEXTEQU UntilLevel11 ELSEIFDIF UntilLevel10,<> LastUntilLabel TEXTEQU UntilLevel10 ELSEIFDIF UntilLevel9,<> LastUntilLabel TEXTEQU UntilLevel9 ELSEIFDIF UntilLevel8,<> LastUntilLabel TEXTEQU UntilLevel8 ELSEIFDIF UntilLevel7,<> LastUntilLabel TEXTEQU UntilLevel7 ELSEIFDIF UntilLevel6,<> LastUntilLabel TEXTEQU UntilLevel6 ELSEIFDIF UntilLevel5,<> LastUntilLabel TEXTEQU UntilLevel5 ELSEIFDIF UntilLevel4,<> LastUntilLabel TEXTEQU UntilLevel4 ELSEIFDIF UntilLevel3,<> LastUntilLabel TEXTEQU UntilLevel3 ELSEIFDIF UntilLevel2,<> LastUntilLabel TEXTEQU UntilLevel2 ELSEIFDIF UntilLevel1,<> LastUntilLabel TEXTEQU UntilLevel1 ELSEIFDIF UntilLevel0,<> LastUntilLabel TEXTEQU UntilLevel0 ELSE LastUntilLabel TEXTEQU <> ENDIF ENDM DelUntilLabel MACRO IFDIF UntilLevel19,<> UntilLevel19 TEXTEQU <> ELSEIFDIF UntilLevel18,<> UntilLevel18 TEXTEQU <> ELSEIFDIF UntilLevel17,<> UntilLevel17 TEXTEQU <> ELSEIFDIF UntilLevel16,<> UntilLevel16 TEXTEQU <> ELSEIFDIF UntilLevel15,<> UntilLevel15 TEXTEQU <> ELSEIFDIF UntilLevel14,<> UntilLevel14 TEXTEQU <> ELSEIFDIF UntilLevel13,<> UntilLevel13 TEXTEQU <> ELSEIFDIF UntilLevel12,<> UntilLevel12 TEXTEQU <> ELSEIFDIF UntilLevel11,<> UntilLevel11 TEXTEQU <> ELSEIFDIF UntilLevel10,<> UntilLevel10 TEXTEQU <> ELSEIFDIF UntilLevel9,<> UntilLevel9 TEXTEQU <> ELSEIFDIF UntilLevel8,<> UntilLevel8 TEXTEQU <> ELSEIFDIF UntilLevel7,<> UntilLevel7 TEXTEQU <> ELSEIFDIF UntilLevel6,<> UntilLevel6 TEXTEQU <> ELSEIFDIF UntilLevel5,<> UntilLevel5 TEXTEQU <> ELSEIFDIF UntilLevel4,<> UntilLevel4 TEXTEQU <> ELSEIFDIF UntilLevel3,<> UntilLevel3 TEXTEQU <> ELSEIFDIF UntilLevel2,<> UntilLevel2 TEXTEQU <> ELSEIFDIF UntilLevel1,<> UntilLevel1 TEXTEQU <> ELSEIFDIF UntilLevel0,<> UntilLevel0 TEXTEQU <> ENDIF ENDM TotalRept = 0 UntilOut0 TEXTEQU <> UntilOut1 TEXTEQU <> UntilOut2 TEXTEQU <> UntilOut3 TEXTEQU <> UntilOut4 TEXTEQU <> UntilOut5 TEXTEQU <> UntilOut6 TEXTEQU <> UntilOut7 TEXTEQU <> UntilOut8 TEXTEQU <> UntilOut9 TEXTEQU <> UntilOut10 TEXTEQU <> UntilOut11 TEXTEQU <> UntilOut12 TEXTEQU <> UntilOut13 TEXTEQU <> UntilOut14 TEXTEQU <> UntilOut15 TEXTEQU <> UntilOut16 TEXTEQU <> UntilOut17 TEXTEQU <> UntilOut18 TEXTEQU <> UntilOut19 TEXTEQU <> LastUntilOutLabel TEXTEQU <> SaveUntilOutLabel MACRO IFIDN UntilOut0,<> UntilOut0 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut0 ELSEIFIDN UntilOut1,<> UntilOut1 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut1 ELSEIFIDN UntilOut2,<> UntilOut2 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut2 ELSEIFIDN UntilOut3,<> UntilOut3 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut3 ELSEIFIDN UntilOut4,<> UntilOut4 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut4 ELSEIFIDN UntilOut5,<> UntilOut5 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut5 ELSEIFIDN UntilOut6,<> UntilOut6 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut6 ELSEIFIDN UntilOut7,<> UntilOut7 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut7 ELSEIFIDN UntilOut8,<> UntilOut8 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut8 ELSEIFIDN UntilOut9,<> UntilOut9 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut9 ELSEIFIDN UntilOut10,<> UntilOut10 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut10 ELSEIFIDN UntilOut11,<> UntilOut11 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut11 ELSEIFIDN UntilOut12,<> UntilOut12 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut12 ELSEIFIDN UntilOut13,<> UntilOut13 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut13 ELSEIFIDN UntilOut14,<> UntilOut14 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut14 ELSEIFIDN UntilOut15,<> UntilOut15 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut15 ELSEIFIDN UntilOut16,<> UntilOut16 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut16 ELSEIFIDN UntilOut17,<> UntilOut17 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut17 ELSEIFIDN UntilOut18,<> UntilOut18 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut18 ELSEIFIDN UntilOut19,<> UntilOut19 CATSTR ,@CatStr(%TotalRept) LastUntilOutLabel TEXTEQU UntilOut19 ELSE .err ENDIF ENDM GetUntilOutLabel MACRO IFDIF UntilOut19,<> LastUntilOutLabel TEXTEQU UntilOut19 ELSEIFDIF UntilOut18,<> LastUntilOutLabel TEXTEQU UntilOut18 ELSEIFDIF UntilOut17,<> LastUntilOutLabel TEXTEQU UntilOut17 ELSEIFDIF UntilOut16,<> LastUntilOutLabel TEXTEQU UntilOut16 ELSEIFDIF UntilOut15,<> LastUntilOutLabel TEXTEQU UntilOut15 ELSEIFDIF UntilOut14,<> LastUntilOutLabel TEXTEQU UntilOut14 ELSEIFDIF UntilOut13,<> LastUntilOutLabel TEXTEQU UntilOut13 ELSEIFDIF UntilOut12,<> LastUntilOutLabel TEXTEQU UntilOut12 ELSEIFDIF UntilOut11,<> LastUntilOutLabel TEXTEQU UntilOut11 ELSEIFDIF UntilOut10,<> LastUntilOutLabel TEXTEQU UntilOut10 ELSEIFDIF UntilOut9,<> LastUntilOutLabel TEXTEQU UntilOut9 ELSEIFDIF UntilOut8,<> LastUntilOutLabel TEXTEQU UntilOut8 ELSEIFDIF UntilOut7,<> LastUntilOutLabel TEXTEQU UntilOut7 ELSEIFDIF UntilOut6,<> LastUntilOutLabel TEXTEQU UntilOut6 ELSEIFDIF UntilOut5,<> LastUntilOutLabel TEXTEQU UntilOut5 ELSEIFDIF UntilOut4,<> LastUntilOutLabel TEXTEQU UntilOut4 ELSEIFDIF UntilOut3,<> LastUntilOutLabel TEXTEQU UntilOut3 ELSEIFDIF UntilOut2,<> LastUntilOutLabel TEXTEQU UntilOut2 ELSEIFDIF UntilOut1,<> LastUntilOutLabel TEXTEQU UntilOut1 ELSEIFDIF UntilOut0,<> LastUntilOutLabel TEXTEQU UntilOut0 ELSE LastUntilOutLabel TEXTEQU <> ENDIF ENDM DelUntilOutLabel MACRO IFDIF UntilOut19,<> UntilOut19 TEXTEQU <> ELSEIFDIF UntilOut18,<> UntilOut18 TEXTEQU <> ELSEIFDIF UntilOut17,<> UntilOut17 TEXTEQU <> ELSEIFDIF UntilOut16,<> UntilOut16 TEXTEQU <> ELSEIFDIF UntilOut15,<> UntilOut15 TEXTEQU <> ELSEIFDIF UntilOut14,<> UntilOut14 TEXTEQU <> ELSEIFDIF UntilOut13,<> UntilOut13 TEXTEQU <> ELSEIFDIF UntilOut12,<> UntilOut12 TEXTEQU <> ELSEIFDIF UntilOut11,<> UntilOut11 TEXTEQU <> ELSEIFDIF UntilOut10,<> UntilOut10 TEXTEQU <> ELSEIFDIF UntilOut9,<> UntilOut9 TEXTEQU <> ELSEIFDIF UntilOut8,<> UntilOut8 TEXTEQU <> ELSEIFDIF UntilOut7,<> UntilOut7 TEXTEQU <> ELSEIFDIF UntilOut6,<> UntilOut6 TEXTEQU <> ELSEIFDIF UntilOut5,<> UntilOut5 TEXTEQU <> ELSEIFDIF UntilOut4,<> UntilOut4 TEXTEQU <> ELSEIFDIF UntilOut3,<> UntilOut3 TEXTEQU <> ELSEIFDIF UntilOut2,<> UntilOut2 TEXTEQU <> ELSEIFDIF UntilOut1,<> UntilOut1 TEXTEQU <> ELSEIFDIF UntilOut0,<> UntilOut0 TEXTEQU <> ENDIF ENDM OutLevel0 TEXTEQU <> OutLevel1 TEXTEQU <> OutLevel2 TEXTEQU <> OutLevel3 TEXTEQU <> OutLevel4 TEXTEQU <> OutLevel5 TEXTEQU <> OutLevel6 TEXTEQU <> OutLevel7 TEXTEQU <> OutLevel8 TEXTEQU <> OutLevel9 TEXTEQU <> OutLevel10 TEXTEQU <> OutLevel11 TEXTEQU <> OutLevel12 TEXTEQU <> OutLevel13 TEXTEQU <> OutLevel14 TEXTEQU <> OutLevel15 TEXTEQU <> OutLevel16 TEXTEQU <> OutLevel17 TEXTEQU <> OutLevel18 TEXTEQU <> OutLevel19 TEXTEQU <> LastOutLabel TEXTEQU <> SaveOutLabel MACRO IFIDN OutLevel0,<> OutLevel0 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel1,<> OutLevel1 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel2,<> OutLevel2 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel3,<> OutLevel3 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel4,<> OutLevel4 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel5,<> OutLevel5 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel6,<> OutLevel6 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel7,<> OutLevel7 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel8,<> OutLevel8 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel9,<> OutLevel9 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel10,<> OutLevel10 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel11,<> OutLevel11 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel12,<> OutLevel12 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel13,<> OutLevel13 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel14,<> OutLevel14 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel15,<> OutLevel15 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel16,<> OutLevel16 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel17,<> OutLevel17 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel18,<> OutLevel18 CATSTR ,@CatStr(%TotalIfs) ELSEIFIDN OutLevel19,<> OutLevel19 CATSTR ,@CatStr(%TotalIfs) ELSE .err ENDIF ENDM GetOutLabel MACRO IFDIF OutLevel19,<> LastOutLabel TEXTEQU OutLevel19 ELSEIFDIF OutLevel18,<> LastOutLabel TEXTEQU OutLevel18 ELSEIFDIF OutLevel17,<> LastOutLabel TEXTEQU OutLevel17 ELSEIFDIF OutLevel16,<> LastOutLabel TEXTEQU OutLevel16 ELSEIFDIF OutLevel15,<> LastOutLabel TEXTEQU OutLevel15 ELSEIFDIF OutLevel14,<> LastOutLabel TEXTEQU OutLevel14 ELSEIFDIF OutLevel13,<> LastOutLabel TEXTEQU OutLevel13 ELSEIFDIF OutLevel12,<> LastOutLabel TEXTEQU OutLevel12 ELSEIFDIF OutLevel11,<> LastOutLabel TEXTEQU OutLevel11 ELSEIFDIF OutLevel10,<> LastOutLabel TEXTEQU OutLevel10 ELSEIFDIF OutLevel9,<> LastOutLabel TEXTEQU OutLevel9 ELSEIFDIF OutLevel8,<> LastOutLabel TEXTEQU OutLevel8 ELSEIFDIF OutLevel7,<> LastOutLabel TEXTEQU OutLevel7 ELSEIFDIF OutLevel6,<> LastOutLabel TEXTEQU OutLevel6 ELSEIFDIF OutLevel5,<> LastOutLabel TEXTEQU OutLevel5 ELSEIFDIF OutLevel4,<> LastOutLabel TEXTEQU OutLevel4 ELSEIFDIF OutLevel3,<> LastOutLabel TEXTEQU OutLevel3 ELSEIFDIF OutLevel2,<> LastOutLabel TEXTEQU OutLevel2 ELSEIFDIF OutLevel1,<> LastOutLabel TEXTEQU OutLevel1 ELSEIFDIF OutLevel0,<> LastOutLabel TEXTEQU OutLevel0 ELSE LastOutLabel TEXTEQU <> ENDIF ENDM DelOutLabel MACRO IFDIF OutLevel19,<> OutLevel19 TEXTEQU <> ELSEIFDIF OutLevel18,<> OutLevel18 TEXTEQU <> ELSEIFDIF OutLevel17,<> OutLevel17 TEXTEQU <> ELSEIFDIF OutLevel16,<> OutLevel16 TEXTEQU <> ELSEIFDIF OutLevel15,<> OutLevel15 TEXTEQU <> ELSEIFDIF OutLevel14,<> OutLevel14 TEXTEQU <> ELSEIFDIF OutLevel13,<> OutLevel13 TEXTEQU <> ELSEIFDIF OutLevel12,<> OutLevel12 TEXTEQU <> ELSEIFDIF OutLevel11,<> OutLevel11 TEXTEQU <> ELSEIFDIF OutLevel10,<> OutLevel10 TEXTEQU <> ELSEIFDIF OutLevel9,<> OutLevel9 TEXTEQU <> ELSEIFDIF OutLevel8,<> OutLevel8 TEXTEQU <> ELSEIFDIF OutLevel7,<> OutLevel7 TEXTEQU <> ELSEIFDIF OutLevel6,<> OutLevel6 TEXTEQU <> ELSEIFDIF OutLevel5,<> OutLevel5 TEXTEQU <> ELSEIFDIF OutLevel4,<> OutLevel4 TEXTEQU <> ELSEIFDIF OutLevel3,<> OutLevel3 TEXTEQU <> ELSEIFDIF OutLevel2,<> OutLevel2 TEXTEQU <> ELSEIFDIF OutLevel1,<> OutLevel1 TEXTEQU <> ELSEIFDIF OutLevel0,<> OutLevel0 TEXTEQU <> ENDIF ENDM IfLevel0 TEXTEQU <> IfLevel1 TEXTEQU <> IfLevel2 TEXTEQU <> IfLevel3 TEXTEQU <> IfLevel4 TEXTEQU <> IfLevel5 TEXTEQU <> IfLevel6 TEXTEQU <> IfLevel7 TEXTEQU <> IfLevel8 TEXTEQU <> IfLevel9 TEXTEQU <> IfLevel10 TEXTEQU <> IfLevel11 TEXTEQU <> IfLevel12 TEXTEQU <> IfLevel13 TEXTEQU <> IfLevel14 TEXTEQU <> IfLevel15 TEXTEQU <> IfLevel16 TEXTEQU <> IfLevel17 TEXTEQU <> IfLevel18 TEXTEQU <> IfLevel19 TEXTEQU <> LastDefLabel TEXTEQU <> SaveCurrentLabel MACRO IFIDN IfLevel0,<> IfLevel0 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel0 ELSEIFIDN IfLevel1,<> IfLevel1 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel1 ELSEIFIDN IfLevel2,<> IfLevel2 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel2 ELSEIFIDN IfLevel3,<> IfLevel3 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel3 ELSEIFIDN IfLevel4,<> IfLevel4 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel4 ELSEIFIDN IfLevel5,<> IfLevel5 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel5 ELSEIFIDN IfLevel6,<> IfLevel6 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel6 ELSEIFIDN IfLevel7,<> IfLevel7 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel7 ELSEIFIDN IfLevel8,<> IfLevel8 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel8 ELSEIFIDN IfLevel9,<> IfLevel9 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel9 ELSEIFIDN IfLevel10,<> IfLevel10 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel10 ELSEIFIDN IfLevel11,<> IfLevel11 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel11 ELSEIFIDN IfLevel12,<> IfLevel12 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel12 ELSEIFIDN IfLevel13,<> IfLevel13 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel13 ELSEIFIDN IfLevel14,<> IfLevel14 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel14 ELSEIFIDN IfLevel15,<> IfLevel15 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel15 ELSEIFIDN IfLevel16,<> IfLevel16 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel16 ELSEIFIDN IfLevel17,<> IfLevel17 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel17 ELSEIFIDN IfLevel18,<> IfLevel18 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel18 ELSEIFIDN IfLevel19,<> IfLevel19 CATSTR ,@CatStr(%TotalIfs) LastDefLabel TEXTEQU IfLevel19 ELSE .err ENDIF TotalIfs = TotalIfs+1 ENDM GetCurrentLabel MACRO IFDIF IfLevel19,<> LastDefLabel TEXTEQU IfLevel19 ELSEIFDIF IfLevel18,<> LastDefLabel TEXTEQU IfLevel18 ELSEIFDIF IfLevel17,<> LastDefLabel TEXTEQU IfLevel17 ELSEIFDIF IfLevel16,<> LastDefLabel TEXTEQU IfLevel16 ELSEIFDIF IfLevel15,<> LastDefLabel TEXTEQU IfLevel15 ELSEIFDIF IfLevel14,<> LastDefLabel TEXTEQU IfLevel14 ELSEIFDIF IfLevel13,<> LastDefLabel TEXTEQU IfLevel13 ELSEIFDIF IfLevel12,<> LastDefLabel TEXTEQU IfLevel12 ELSEIFDIF IfLevel11,<> LastDefLabel TEXTEQU IfLevel11 ELSEIFDIF IfLevel10,<> LastDefLabel TEXTEQU IfLevel10 ELSEIFDIF IfLevel9,<> LastDefLabel TEXTEQU IfLevel9 ELSEIFDIF IfLevel8,<> LastDefLabel TEXTEQU IfLevel8 ELSEIFDIF IfLevel7,<> LastDefLabel TEXTEQU IfLevel7 ELSEIFDIF IfLevel6,<> LastDefLabel TEXTEQU IfLevel6 ELSEIFDIF IfLevel5,<> LastDefLabel TEXTEQU IfLevel5 ELSEIFDIF IfLevel4,<> LastDefLabel TEXTEQU IfLevel4 ELSEIFDIF IfLevel3,<> LastDefLabel TEXTEQU IfLevel3 ELSEIFDIF IfLevel2,<> LastDefLabel TEXTEQU IfLevel2 ELSEIFDIF IfLevel1,<> LastDefLabel TEXTEQU IfLevel1 ELSEIFDIF IfLevel0,<> LastDefLabel TEXTEQU IfLevel0 ELSE LastDefLabel TEXTEQU <> ENDIF ENDM DelCurrentLabel MACRO IFDIF IfLevel19,<> IfLevel19 TEXTEQU <> ELSEIFDIF IfLevel18,<> IfLevel18 TEXTEQU <> ELSEIFDIF IfLevel17,<> IfLevel17 TEXTEQU <> ELSEIFDIF IfLevel16,<> IfLevel16 TEXTEQU <> ELSEIFDIF IfLevel15,<> IfLevel15 TEXTEQU <> ELSEIFDIF IfLevel14,<> IfLevel14 TEXTEQU <> ELSEIFDIF IfLevel13,<> IfLevel13 TEXTEQU <> ELSEIFDIF IfLevel12,<> IfLevel12 TEXTEQU <> ELSEIFDIF IfLevel11,<> IfLevel11 TEXTEQU <> ELSEIFDIF IfLevel10,<> IfLevel10 TEXTEQU <> ELSEIFDIF IfLevel9,<> IfLevel9 TEXTEQU <> ELSEIFDIF IfLevel8,<> IfLevel8 TEXTEQU <> ELSEIFDIF IfLevel7,<> IfLevel7 TEXTEQU <> ELSEIFDIF IfLevel6,<> IfLevel6 TEXTEQU <> ELSEIFDIF IfLevel5,<> IfLevel5 TEXTEQU <> ELSEIFDIF IfLevel4,<> IfLevel4 TEXTEQU <> ELSEIFDIF IfLevel3,<> IfLevel3 TEXTEQU <> ELSEIFDIF IfLevel2,<> IfLevel2 TEXTEQU <> ELSEIFDIF IfLevel1,<> IfLevel1 TEXTEQU <> ELSEIFDIF IfLevel0,<> IfLevel0 TEXTEQU <> ENDIF ENDM ;ÓÑËÎÂÈß .if MACRO args:VARARG SaveOutLabel SaveCurrentLabel J_POLY_COND LastDefLabel,FALSE, ENDM .elseif MACRO args:VARARG GetOutLabel jmp LastOutLabel GetCurrentLabel LastDefLabel: DelCurrentLabel SaveCurrentLabel J_POLY_COND LastDefLabel,FALSE, ENDM .nextif MACRO args:VARARG GetCurrentLabel J_POLY_COND LastDefLabel,TRUE, ENDM .else MACRO GetOutLabel jmp LastOutLabel GetCurrentLabel LastDefLabel: DelCurrentLabel SaveCurrentLabel ENDM .endif MACRO GetCurrentLabel LastDefLabel: DelCurrentLabel GetOutLabel LastOutLabel: DelOutLabel ENDM ;SaveUntilCondsLabel ;GetUntilCondsLabel ;DelUntilCondsLabel while_cnt=0 .repeat MACRO while_cnt=while_cnt+1 SaveUntilCondsLabel SaveUntilOutLabel SaveUntilLabel LastUntilLabel: ENDM j_test equ 1 .break MACRO args:VARARG GetUntilOutLabel IF @SizeStr() NE 0 J_POLY_COND LastUntilOutLabel,TRUE,@SubStr(,5,@SizeStr()-4) GOTO EndBreak ELSE jmp LastUntilOutLabel ENDIF :EndBreak ENDM .continue MACRO args:VARARG GetUntilCondsLabel IF @SizeStr() NE 0 J_POLY_COND LastUntilConds,TRUE,@SubStr(,5,@SizeStr()-4) ELSE jmp LastUntilConds ENDIF ENDM .skip MACRO args:VARARG GetUntilLabel IF @SizeStr() NE 0 J_POLY_COND LastUntilLabel,TRUE,@SubStr(,5,@SizeStr()-4) ELSE jmp LastUntilLabel ENDIF ENDM .until MACRO args:VARARG GetUntilCondsLabel LastUntilConds: DelUntilCondsLabel GetUntilLabel IF @SizeStr() NE 0 J_POLY_COND LastUntilLabel,FALSE,args ELSE jmp LastUntilLabel ENDIF DelUntilLabel GetUntilOutLabel LastUntilOutLabel: DelUntilOutLabel while_cnt=while_cnt-1 ENDM .untilcxz MACRO GetUntilCondsLabel LastUntilConds: DelUntilCondsLabel GetUntilLabel loop LastUntilLabel DelUntilLabel GetUntilOutLabel LastUntilOutLabel: DelUntilOutLabel while_cnt=while_cnt-1 ENDM .untilcxzd MACRO GetUntilCondsLabel LastUntilConds: DelUntilCondsLabel GetUntilLabel loopd LastUntilLabel DelUntilLabel GetUntilOutLabel LastUntilOutLabel: DelUntilOutLabel while_cnt=while_cnt-1 ENDM .untilcxze MACRO GetUntilCondsLabel LastUntilConds: DelUntilCondsLabel GetUntilLabel loope LastUntilLabel DelUntilLabel GetUntilOutLabel LastUntilOutLabel: DelUntilOutLabel while_cnt=while_cnt-1 ENDM .untilcxzne MACRO GetUntilCondsLabel LastUntilConds: DelUntilCondsLabel GetUntilLabel loopne LastUntilLabel DelUntilLabel GetUntilOutLabel LastUntilOutLabel: DelUntilOutLabel while_cnt=while_cnt-1 ENDM .untilcxzed MACRO GetUntilCondsLabel LastUntilConds: DelUntilCondsLabel GetUntilLabel looped LastUntilLabel DelUntilLabel GetUntilOutLabel LastUntilOutLabel: DelUntilOutLabel while_cnt=while_cnt-1 ENDM .untilcxzned MACRO GetUntilCondsLabel LastUntilConds: DelUntilCondsLabel GetUntilLabel loopned LastUntilLabel DelUntilLabel GetUntilOutLabel LastUntilOutLabel: DelUntilOutLabel while_cnt=while_cnt-1 ENDM WhileLevel0 TEXTEQU <> WhileLevel1 TEXTEQU <> WhileLevel2 TEXTEQU <> WhileLevel3 TEXTEQU <> WhileLevel4 TEXTEQU <> WhileLevel5 TEXTEQU <> WhileLevel6 TEXTEQU <> WhileLevel7 TEXTEQU <> WhileLevel8 TEXTEQU <> WhileLevel9 TEXTEQU <> WhileLevel10 TEXTEQU <> WhileLevel11 TEXTEQU <> WhileLevel12 TEXTEQU <> WhileLevel13 TEXTEQU <> WhileLevel14 TEXTEQU <> WhileLevel15 TEXTEQU <> WhileLevel16 TEXTEQU <> WhileLevel17 TEXTEQU <> WhileLevel18 TEXTEQU <> WhileLevel19 TEXTEQU <> wcond0l=0 wcond1l=0 wcond2l=0 wcond3l=0 wcond4l=0 wcond5l=0 wcond6l=0 wcond7l=0 wcond8l=0 wcond9l=0 wcond10l=0 wcond11l=0 wcond12l=0 wcond13l=0 wcond14l=0 wcond15l=0 wcond16l=0 wcond17l=0 wcond18l=0 wcond19l=0 .while MACRO args:VARARG SaveUntilCondsLabel IFDIF , jmp LastUntilConds ENDIF SaveUntilOutLabel SaveUntilLabel LastUntilLabel: while_cnt=while_cnt+1 IF while_cnt EQ 1 WhileLevel0 TEXTEQU wcond0l SIZESTR ELSEIF while_cnt EQ 2 WhileLevel1 TEXTEQU wcond1l SIZESTR ELSEIF while_cnt EQ 3 WhileLevel2 TEXTEQU wcond2l SIZESTR ELSEIF while_cnt EQ 4 WhileLevel3 TEXTEQU wcond3l SIZESTR ELSEIF while_cnt EQ 5 WhileLevel4 TEXTEQU wcond4l SIZESTR ELSEIF while_cnt EQ 6 WhileLevel5 TEXTEQU wcond5l SIZESTR ELSEIF while_cnt EQ 7 WhileLevel6 TEXTEQU wcond6l SIZESTR ELSEIF while_cnt EQ 8 WhileLevel7 TEXTEQU wcond7l SIZESTR ELSEIF while_cnt EQ 9 WhileLevel8 TEXTEQU wcond8l SIZESTR ELSEIF while_cnt EQ 10 WhileLevel9 TEXTEQU wcond9l SIZESTR ELSEIF while_cnt EQ 11 WhileLevel10 TEXTEQU wcond10l SIZESTR ELSEIF while_cnt EQ 12 WhileLevel11 TEXTEQU wcond11l SIZESTR ELSEIF while_cnt EQ 13 WhileLevel12 TEXTEQU wcond12l SIZESTR ELSEIF while_cnt EQ 14 WhileLevel13 TEXTEQU wcond13l SIZESTR ELSEIF while_cnt EQ 15 WhileLevel14 TEXTEQU wcond14l SIZESTR ELSEIF while_cnt EQ 16 WhileLevel15 TEXTEQU wcond15l SIZESTR ELSEIF while_cnt EQ 17 WhileLevel16 TEXTEQU wcond16l SIZESTR ELSEIF while_cnt EQ 18 WhileLevel17 TEXTEQU wcond17l SIZESTR ELSEIF while_cnt EQ 19 WhileLevel18 TEXTEQU wcond18l SIZESTR ELSEIF while_cnt EQ 20 WhileLevel19 TEXTEQU wcond19l SIZESTR ELSE .err ENDIF ENDM .endw MACRO GetUntilCondsLabel LastUntilConds: DelUntilCondsLabel GetUntilLabel IF (while_cnt EQ 1) AND (wcond0l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel0 ELSEIF (while_cnt EQ 2) AND (wcond1l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel1 ELSEIF (while_cnt EQ 3) AND (wcond2l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel2 ELSEIF (while_cnt EQ 4) AND (wcond3l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel3 ELSEIF (while_cnt EQ 5) AND (wcond4l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel4 ELSEIF (while_cnt EQ 6) AND (wcond5l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel5 ELSEIF (while_cnt EQ 7) AND (wcond6l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel6 ELSEIF (while_cnt EQ 8) AND (wcond7l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel7 ELSEIF (while_cnt EQ 9) AND (wcond8l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel8 ELSEIF (while_cnt EQ 10) AND (wcond9l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel9 ELSEIF (while_cnt EQ 11) AND (wcond10l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel10 ELSEIF (while_cnt EQ 12) AND (wcond11l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel11 ELSEIF (while_cnt EQ 13) AND (wcond12l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel12 ELSEIF (while_cnt EQ 14) AND (wcond13l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel13 ELSEIF (while_cnt EQ 15) AND (wcond14l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel14 ELSEIF (while_cnt EQ 16) AND (wcond15l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel15 ELSEIF (while_cnt EQ 17) AND (wcond16l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel16 ELSEIF (while_cnt EQ 18) AND (wcond17l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel17 ELSEIF (while_cnt EQ 19) AND (wcond18l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel18 ELSEIF (while_cnt EQ 20) AND (wcond19l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel19 ENDIF DelUntilLabel GetUntilOutLabel LastUntilOutLabel: DelUntilOutLabel while_cnt=while_cnt-1 ENDM ;ÁÓÊÂÀ ÈËÈ ÖÈÔÐÀ IS_ALNUM MACRO char CharPosition INSTR 1,<0123456789abcdefghijklmnopqrstvuwxyzABCDEFGHIJKLMNOPQRSTVUWXYZ>, exitm <@CatStr(%CharPosition)> ENDM IS_INT_REG MACRO val RegPosition INSTR 1,< rsi al bl cl dl ah bh ch dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b eax ebx ecx edx esi edi ebp esp r14d r15d >, IF RegPosition EQ 0 RegPosition INSTR 1,< rax rbx rdx rcx rsi rdi rbp rsp r8w r9w r10w r11w r12w r13w r14w r15w r8d r9d r10d r11d r12d r13d r8 r9 r10 r11 r12 r13 r14 r15 >, ENDIF exitm <@CatStr(%RegPosition)> ENDM constStringsNum=0 regIndex=0 ItemLen=0 AddrArg TEXTEQU <> constStr TEXTEQU <> itemSize=0 reg32v TEXTEQU <> movReg64Arg MACRO reg:REQ,item:REQ,____regIndex:= IFDIF , IF ____regIndex EQ NOT_A_REG64 regIndex=Reg64Index(reg) ELSE regIndex=____regIndex ENDIF itemSize=8 itemOpattr=0 imm_nullification=0 IF regIndex NE NOT_A_REG64 ItemLen=@SizeStr() IF (ItemLen GE 6) and (@InStr(1,%ToLower(),) EQ 1) AddrArg SUBSTR ,6,ItemLen-5 lea reg,AddrArg ELSEIF (ItemLen GE 2) and (@InStr(1,,<&>) EQ 1) AddrArg SUBSTR ,2,ItemLen-1 lea reg,AddrArg ELSE IFIDN @SubStr(,1,1),<"> constStr CATSTR ,@CatStr(%constStringsNum) CONSTANT constStr db item,0 lea reg,constStr constStringsNum=constStringsNum+1 ELSE itemOpattr=OPATTR (item) IF itemOpattr and (MEM_EXPR or REG_EXPR) itemSize=TYPE (item) IF (itemSize EQ 8) or (itemSize EQ 0) mov reg,item ELSE reg32v TEXTEQU IF itemSize EQ 4 mov reg32v,item ELSEIF (itemSize EQ 2) or (itemSize EQ 1) movzx reg32v,item ENDIF ENDIF ELSEIF itemOpattr and LABEL_EXPR mov reg,item ELSEIF itemOpattr and IMM_EXPR imm_nullification=4 itemSize=TYPE (item) IF itemSize EQ 1 reg32v TEXTEQU IF (item) EQ 0 xor reg32v,reg32v imm_nullification=1 ELSE mov reg32v,item ENDIF ELSEIF itemSize EQ 2 reg32v TEXTEQU IF (item) EQ 0 xor reg32v,reg32v imm_nullification=1 ELSE mov reg32v,item ENDIF ELSEIF itemSize EQ 4 reg32v TEXTEQU IF (item) EQ 0 xor reg32v,reg32v imm_nullification=1 ELSEIF ((item) EQ -1) or ((item) EQ 0FFFFFFFFh) or reg32v,-1 ELSE mov reg32v,item ENDIF ELSE imm_nullification=3 IF (item) LT 0 IF ((item) EQ -1) or ((item) EQ 0FFFFFFFFFFFFFFFFh) or reg,-1 ELSE mov reg,item ENDIF itemSize=8 ELSE itemSize=4 reg32v TEXTEQU IF (item) EQ 0 xor reg32v,reg32v imm_nullification=2 ELSEIF ((item) EQ 0FFFFFFFFh) or reg32v,-1 ELSEIF ((item) LE 0FFFFFFFEh) mov reg32v,item ELSE itemSize=8 mov reg,item ENDIF ENDIF ENDIF ELSE mov reg,item ENDIF ENDIF ENDIF ELSE .err ENDIF ENDIF ENDM movReg32Arg MACRO reg:REQ,item:REQ,____regIndex:= IFDIF , IF ____regIndex EQ NOT_A_REG32 regIndex=Reg32Index(reg) ELSE regIndex=____regIndex ENDIF itemSize=4 itemOpattr=0 imm_nullification=0 IF regIndex NE NOT_A_REG32 ItemLen=@SizeStr() IF (ItemLen GE 6) and (@InStr(1,%ToLower(),) EQ 1) AddrArg SUBSTR ,6,ItemLen-5 lea reg,AddrArg ELSEIF (ItemLen GE 2) and (@InStr(1,,<&>) EQ 1) AddrArg SUBSTR ,2,ItemLen-1 lea reg,AddrArg ELSE IFIDN @SubStr(,1,1),<"> constStr CATSTR ,@CatStr(%constStringsNum) CONSTANT constStr db item,0 lea reg,constStr constStringsNum=constStringsNum+1 ELSE itemOpattr=OPATTR (item) IF itemOpattr and (MEM_EXPR or REG_EXPR) itemSize=TYPE (item) IF (itemSize EQ 4) or (itemSize EQ 0) mov reg,item ELSEIF (itemSize EQ 2) or (itemSize EQ 1) movzx reg,item ELSE mov reg,dword ptr item ENDIF ELSEIF itemOpattr and LABEL_EXPR mov reg,item ELSEIF itemOpattr and IMM_EXPR imm_nullification=4 itemSize=TYPE (item) IF itemSize EQ 1 IF (item) EQ 0 xor reg,reg imm_nullification=1 ELSE mov reg,item ENDIF ELSEIF itemSize EQ 2 IF (item) EQ 0 xor reg,reg imm_nullification=1 ELSE mov reg,item ENDIF ELSEIF itemSize EQ 4 IF (item) EQ 0 xor reg,reg imm_nullification=1 ELSEIF ((item) EQ -1) or ((item) EQ 0FFFFFFFFh) or reg,-1 ELSE mov reg,item ENDIF ELSE imm_nullification=3 IF (item) LT 0 IF ((item) EQ -1) or reg,-1 ELSE mov reg,item ENDIF itemSize=4 ELSE itemSize=4 IF (item) EQ 0 xor reg,reg imm_nullification=2 ELSEIF ((item) LE 7FFFFFFFh) mov reg,item ELSE itemSize=4 mov reg,item ENDIF ENDIF ENDIF ELSE mov reg,item ENDIF ENDIF ENDIF ELSE .err ENDIF ENDIF ENDM movReg16Arg MACRO reg:REQ,item:REQ,____regIndex:= IFDIF , IF ____regIndex EQ NOT_A_REG16 regIndex=Reg16Index(reg) ELSE regIndex=____regIndex ENDIF itemSize=2 itemOpattr=0 imm_nullification=0 IF regIndex NE NOT_A_REG16 ItemLen=@SizeStr() IF (ItemLen GE 6) and (@InStr(1,%ToLower(),) EQ 1) AddrArg SUBSTR ,6,ItemLen-5 lea reg,AddrArg ELSEIF (ItemLen GE 2) and (@InStr(1,,<&>) EQ 1) AddrArg SUBSTR ,2,ItemLen-1 lea reg,AddrArg ELSE IFIDN @SubStr(,1,1),<"> constStr CATSTR ,@CatStr(%constStringsNum) CONSTANT constStr db item,0 lea reg,constStr constStringsNum=constStringsNum+1 ELSE itemOpattr=OPATTR (item) IF itemOpattr and (MEM_EXPR or REG_EXPR) itemSize=TYPE (item) IF (itemSize EQ 2) or (itemSize EQ 0) mov reg,item ELSEIF (itemSize EQ 1) movzx reg,item ELSE mov reg,word ptr item ENDIF ELSEIF itemOpattr and LABEL_EXPR mov reg,item ELSEIF itemOpattr and IMM_EXPR imm_nullification=4 itemSize=TYPE (item) IF itemSize EQ 1 IF (item) EQ 0 xor reg,reg imm_nullification=1 ELSE mov reg,item ENDIF ELSEIF itemSize EQ 2 IF (item) EQ 0 xor reg,reg imm_nullification=1 ELSE mov reg,item ENDIF ELSEIF itemSize EQ 4 IF (item) EQ 0 xor reg,reg imm_nullification=1 ELSEIF ((item) EQ -1) or ((item) EQ 0FFFFh) or reg,-1 ELSE mov reg,item ENDIF ELSE imm_nullification=3 IF (item) LT 0 IF ((item) EQ -1) or reg,-1 ELSE mov reg,item ENDIF itemSize=2 ELSE itemSize=2 IF (item) EQ 0 xor reg,reg imm_nullification=2 ELSEIF ((item) LE 7FFFh) mov reg,item ELSE itemSize=2 mov reg,item ENDIF ENDIF ENDIF ELSE mov reg,item ENDIF ENDIF ENDIF ELSE .err ENDIF ENDIF ENDM movMem64Arg MACRO mem64:REQ,item:REQ LOCAL AddrArg,ItemLen LOCAL constStr itemSize=8 itemOpattr=0 imm_nullification=0 IFDIF , ItemLen=@SizeStr() IF (ItemLen GE 6) and (@InStr(1,%ToLower(),) EQ 1) AddrArg SUBSTR ,6,ItemLen-5 lea rax,AddrArg mov qword ptr mem64,rax ELSEIF (ItemLen GE 2) and (@InStr(1,,<&>) EQ 1) AddrArg SUBSTR ,2,ItemLen-1 lea rax,AddrArg mov qword ptr mem64,rax ELSE IFIDN @SubStr(,1,1),<"> constStr CATSTR ,@CatStr(%constStringsNum) CONSTANT constStr db item,0 lea rax,constStr mov qword ptr mem64,rax constStringsNum=constStringsNum+1 ELSE itemOpattr=OPATTR (item) IF itemOpattr and REG_EXPR itemSize=TYPE (item) IF itemSize EQ 8 mov qword ptr mem64,item ELSEIF itemSize EQ 4 mov dword ptr mem64,item ELSEIF itemSize EQ 2 mov word ptr mem64,item ELSEIF itemSize EQ 1 mov byte ptr mem64,item ENDIF ELSEIF itemOpattr and MEM_EXPR itemSize=TYPE (item) IF (itemSize EQ 8) or (itemSize EQ 0) mov rax,item mov qword ptr mem64,rax ELSEIF itemSize EQ 4 mov eax,item mov dword ptr mem64,eax ELSEIF itemSize EQ 2 mov ax,item mov word ptr mem64,ax ELSEIF itemSize EQ 1 mov al,item mov byte ptr mem64,al ENDIF ELSEIF itemOpattr and LABEL_EXPR mov rax,item mov qword ptr mem64,rax ELSEIF itemOpattr and IMM_EXPR imm_nullification=4 itemSize=TYPE (item) IF (itemSize EQ 0) or (itemSize EQ 8) imm_nullification=3 IF (item) EQ 0 and qword ptr mem64,0 imm_nullification=2 ELSEIF ((item) EQ -1) or ((item) EQ 0FFFFFFFFFFFFFFFFh) or qword ptr mem64,-1 ELSEIF ((item) GE -80000000h) AND ((item) LE 7FFFFFFFh) mov qword ptr mem64,item ELSE mov rax,item mov mem64,rax ENDIF ELSEIF itemSize EQ 2 IF (item) EQ 0 and word ptr mem64,0 imm_nullification=1 ELSEIF ((item) EQ -1) or ((item) EQ 0FFFFh) or word ptr mem64,-1 ELSE mov word ptr mem64,item ENDIF ELSEIF itemSize EQ 4 IF (item) EQ 0 and dword ptr mem64,0 imm_nullification=1 ELSEIF ((item) EQ -1) or ((item) EQ 0FFFFFFFFh) or dword ptr mem64,-1 ELSE mov dword ptr mem64,item ENDIF ELSE mov mem64,item ENDIF ELSE mov rax,item mov mem64,rax ENDIF ENDIF ENDIF ENDIF ENDM movst MACRO reg:REQ,item:REQ IFDIF , movst_rid=Reg64Index(reg) IF movst_rid NE NOT_A_REG64 movReg64Arg reg,item,movst_rid ELSE movst_rid=Reg32Index(reg) IF movst_rid NE NOT_A_REG32 movReg32Arg reg,item,movst_rid ELSE movst_rid=Reg16Index(reg) IF movst_rid NE NOT_A_REG16 movReg16Arg reg,item,movst_rid ELSE movst_rid=Reg8Index(reg) IF movst_rid NE NOT_A_REG8 mov reg,item ELSE movMem64Arg reg,item ENDIF ENDIF ENDIF ENDIF ENDIF ENDM SetType MACRO mem64:REQ,item:REQ LOCAL AddrArg,ItemLen LOCAL constStr itemSize=8 itemOpattr=0 imm_nullification=0 must_be_gt=1 IFDIF , ItemLen=@SizeStr() IF (ItemLen GE 6) and (@InStr(1,%ToLower(),) EQ 1) ELSEIF (ItemLen GE 2) and (@InStr(1,,<&>) EQ 1) ELSE IFDIF @SubStr(,1,1),<"> itemOpattr=OPATTR (item) IF itemOpattr and REG_EXPR itemSize=TYPE (item) ELSEIF itemOpattr and MEM_EXPR itemSize=TYPE (item) ELSEIF itemOpattr and IMM_EXPR imm_nullification=4 itemSize=TYPE (item) IF (itemSize EQ 0) or (itemSize EQ 8) imm_nullification=3 IF (item) EQ 0 imm_nullification=2 must_be_gt=2 ELSEIF ((item) EQ -1) or ((item) EQ 0FFFFFFFFFFFFFFFFh) must_be_gt=4 ENDIF ELSEIF itemSize EQ 2 IF (item) EQ 0 imm_nullification=1 must_be_gt=2 ELSEIF ((item) EQ -1) or ((item) EQ 0FFFFh) must_be_gt=3 ENDIF ELSEIF itemSize EQ 4 IF (item) EQ 0 imm_nullification=1 must_be_gt=2 ELSEIF ((item) EQ -1) or ((item) EQ 0FFFFFFFFh) must_be_gt=3 ENDIF ELSEIF itemSize EQ 1 IF (item) EQ 0 imm_nullification=1 must_be_gt=2 ELSEIF ((item) EQ -1) or ((item) EQ 0FFh) must_be_gt=3 ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDM fb MACRO FuncName:REQ,ArgumentList:VARARG IFIDN ,<> call FuncName ELSE invoke FuncName,ArgumentList ENDIF EXITM ENDM fw MACRO FuncName:REQ,ArgumentList:VARARG IFIDN ,<> call FuncName ELSE invoke FuncName,ArgumentList ENDIF EXITM ENDM fd MACRO FuncName:REQ,ArgumentList:VARARG IFIDN ,<> call FuncName ELSE invoke FuncName,ArgumentList ENDIF EXITM ENDM fn MACRO FuncName:REQ,ArgumentList:VARARG IFIDN ,<> call FuncName ELSE invoke FuncName,ArgumentList ENDIF EXITM ENDM mrm MACRO FirstArgument:REQ,SecondArgument:REQ itemSize=TYPE (FirstArgument) IF itemSize EQ 1 mov al,SecondArgument mov FirstArgument,al ELSEIF itemSize EQ 2 itemSize=TYPE (SecondArgument) IF (itemSize EQ 2) or (itemSize EQ 0) mov ax,SecondArgument mov FirstArgument,ax ELSE movzx eax,SecondArgument mov FirstArgument,ax ENDIF ELSEIF itemSize EQ 4 itemSize=TYPE (SecondArgument) IF (itemSize EQ 4) or (itemSize EQ 0) mov eax,SecondArgument mov FirstArgument,eax ELSE movzx eax,SecondArgument mov FirstArgument,eax ENDIF ELSE movReg64Arg rax,SecondArgument mov FirstArgument,rax ENDIF ENDM return macro valopt IFDIF ,<> movReg64Arg rax,valopt ENDIF IF ((OPATTR (ToProcsReturnPoint)) AND VALID_REF) IF (RegCnt NE 0) jmp ToProcsReturnPoint ELSE ret ENDIF ELSE ToProcsReturnPoint: ret ENDIF endm register MACRO reg,item TEX TEXTEQU <> address TEXTEQU <> IFDIF , IF @SizeStr() GE 6 TEX SUBSTR ,1,4 address SUBSTR , 6, @SizeStr() - 5 IFIDN TEX, lea reg,address ELSEIFIDN TEX, lea reg,address ELSEIFIDN TEX, lea reg,address ELSE mov reg,item ENDIF ELSE mov reg,item ENDIF ENDIF ENDM ToUpper MACRO String:VARARG LOCAL UpperStr,LowNum UpperStr TEXTEQU <> % FORC char, LowNum INSTR 1,, IF LowNum NE 0 UpperStr CATSTR UpperStr,@SubStr(,LowNum,1) ELSE UpperStr CATSTR UpperStr, ENDIF ENDM EXITM ENDM ToLower MACRO String:VARARG LOCAL UpperStr,LowNum UpperStr TEXTEQU <> % FORC char, LowNum INSTR 1,, IF LowNum NE 0 UpperStr CATSTR UpperStr,@SubStr(,LowNum,1) ELSE UpperStr CATSTR UpperStr, ENDIF ENDM EXITM ENDM JustLeaveFrame = 0 leavef MACRO JustLeaveFrame = 1 ret JustLeaveFrame = 0 ENDM altm MACRO Consts:VARARG EXITM <> ENDM rbpFrame=0 rspFrame=0 rbpFirstArgBias=0 userParmsHandler MACRO mips:=<7>,save_rcx:=<0>,save_rdx:=<0>,save_r8:=<0>,save_r9:=<0> MaxInvokeParms=mips SaveRCX=save_rcx SaveRDX=save_rdx SaveR8=save_r8 SaveR9=save_r9 ENDM SaveRegArgs MACRO IF SaveRCX EQ 1 mov [rbp+10h],cl ELSEIF SaveRCX EQ 2 mov [rbp+10h],cx ELSEIF SaveRCX EQ 4 mov [rbp+10h],ecx ELSEIF SaveRCX EQ 8 mov [rbp+10h],rcx ENDIF IF SaveRDX EQ 1 mov [rbp+18h],dl ELSEIF SaveRDX EQ 2 mov [rbp+18h],dx ELSEIF SaveRDX EQ 4 mov [rbp+18h],edx ELSEIF SaveRDX EQ 8 mov [rbp+18h],rdx ENDIF IF SaveR8 EQ 1 mov [rbp+20h],r8b ELSEIF SaveR8 EQ 2 mov [rbp+20h],r8w ELSEIF SaveR8 EQ 4 mov [rbp+20h],r8d ELSEIF SaveR8 EQ 8 mov [rbp+20h],r8 ENDIF IF SaveR9 EQ 1 mov [rbp+28h],r9b ELSEIF SaveR9 EQ 2 mov [rbp+28h],r9w ELSEIF SaveR9 EQ 4 mov [rbp+28h],r9d ELSEIF SaveR9 EQ 8 mov [rbp+28h],r9 ENDIF ENDM rbpFramePrologue MACRO procname,flags,argbytes,localbytes,reglist,userparms:VARARG RegCnt=0 IFNB FOR reg,reglist RegCnt=RegCnt+1 ENDM ENDIF userParmsHandler userparms allbytes=localbytes+8*(RegCnt+MaxInvokeParms) IF (allbytes AND 7) NE 0 allbytes=allbytes-(allbytes AND 7)+8 ENDIF IF (allbytes AND 8) NE 0 allbytes=allbytes+8 ENDIF IF (localbytes+argbytes-8) EQ 0 IFDIF reglist,<> FOR reg,reglist push reg ENDM allbytes=8*(RegCnt+MaxInvokeParms) IF (allbytes AND 8) EQ 0 allbytes=(8*MaxInvokeParms)+8 ELSE allbytes=8*MaxInvokeParms ENDIF IF allbytes LE 4096 sub rsp,allbytes ELSE IFDEF __chkstk mov rax,allbytes call __chkstk sub rsp,rax ELSE sub rsp,allbytes ENDIF ENDIF ENDIF rbpFrame=2 rspFrame=1 ELSEIF allbytes LE 4096 rbpFrame=1 rspFrame=0 enter allbytes,0 rbpFirstArgBias=allbytes allbytes=allbytes-8*MaxInvokeParms IFNB FOR reg,reglist mov [rbp-allbytes],reg allbytes=allbytes-8 ENDM ENDIF SaveRegArgs ELSE rbpFrame=1 rspFrame=0 push rbp mov rbp,rsp IFDEF __chkstk mov rax,allbytes call __chkstk sub rsp,rax ELSE sub rsp,allbytes ENDIF rbpFirstArgBias=allbytes allbytes=allbytes-8*MaxInvokeParms IFNB FOR reg,reglist mov [rbp-allbytes],reg allbytes=allbytes-8 ENDM ENDIF SaveRegArgs ENDIF EXITM ENDM rbpFrameEpilogue MACRO procname,flags,argbytes,localbytes,reglist,userparms:VARARG RegCnt=0 IFNB FOR reg,reglist RegCnt=RegCnt+1 ENDM ENDIF userParmsHandler userparms allbytes=localbytes+8*(RegCnt+MaxInvokeParms) IF (allbytes AND 7) NE 0 allbytes=allbytes-(allbytes AND 7)+8 ENDIF IF (allbytes AND 8) NE 0 allbytes=allbytes+8 ENDIF IF (localbytes+argbytes-8) EQ 0 allbytes=8*(RegCnt+MaxInvokeParms) IF (allbytes AND 8) EQ 0 allbytes=(8*MaxInvokeParms)+8 ELSE allbytes=8*MaxInvokeParms ENDIF IFDIF reglist,<> add rsp,allbytes FOR reg,reglist pop reg ENDM ENDIF ELSE allbytes=allbytes-8*(MaxInvokeParms+RegCnt) IFNB FOR reg,reglist allbytes=allbytes+8 mov reg,[rbp-allbytes] ENDM ENDIF leave ENDIF IF JustLeaveFrame EQ 0 db 0C3h ENDIF ENDM StdPrologue MACRO procname, flags, argbytes, localbytes, reglist, userparms:VARARG pushed_regs=0 FillStack = 1 ;;%echo @CatStr(%argbytes) IF (localbytes LT 4096) AND (localbytes NE 0) enter localbytes,0 ELSEIF localbytes NE 0 push rbp mov rbp,rsp sub rsp,localbytes ELSEIF argbytes GT 8 enter 0,0 ENDIF ;; USES clause IFNB FOR reg,reglist pushed_regs=pushed_regs+1 push reg ENDM ENDIF IFNB IF (localbytes EQ 0) AND (argbytes EQ 0) IF (8*(userparms+pushed_regs) AND 8) EQ 0 sub rsp,8*userparms+8 ELSE sub rsp,8*userparms ENDIF ELSE IF ((8*(userparms+pushed_regs)+localbytes) AND 8) EQ 0 sub rsp,8*userparms ELSE sub rsp,8*userparms+8 ENDIF ENDIF ENDIF EXITM endm StdEpilogue MACRO procname, flags, argbytes, localbytes, reglist, userparms:VARARG FillStack = 0 IFNB IF (localbytes EQ 0) AND (argbytes EQ 0) IF (8*(userparms+pushed_regs) AND 8) EQ 0 add rsp,8*userparms+8 ELSE add rsp,8*userparms ENDIF ELSE IF ((8*(userparms+pushed_regs)+localbytes) AND 8) EQ 0 add rsp,8*userparms ELSE add rsp,8*userparms+8 ENDIF ENDIF ENDIF IFNB FOR reg,reglist pop reg ENDM ENDIF IF (argbytes GT 8) OR (localbytes GT 0) leave ENDIF db 0C3h ENDM MaxArgs MACRO ArgsNum sub rsp,8*ArgsNum .if rsp&0Fh sub rsp,8 .endif ENDM FillStack = 1 rbpArg14 equ <[rbp-rbpFirstArgBias+8*14-8]> rbpArg13 equ <[rbp-rbpFirstArgBias+8*13-8]> rbpArg12 equ <[rbp-rbpFirstArgBias+8*12-8]> rbpArg11 equ <[rbp-rbpFirstArgBias+8*11-8]> rbpArg10 equ <[rbp-rbpFirstArgBias+8*10-8]> rbpArg9 equ <[rbp-rbpFirstArgBias+8*9-8]> rbpArg8 equ <[rbp-rbpFirstArgBias+8*8-8]> rbpArg7 equ <[rbp-rbpFirstArgBias+8*7-8]> rbpArg6 equ <[rbp-rbpFirstArgBias+8*6-8]> rbpArg5 equ <[rbp-rbpFirstArgBias+8*5-8]> rbpArg4 equ <[rbp-rbpFirstArgBias+8*4-8]> rbpArg3 equ <[rbp-rbpFirstArgBias+8*3-8]> rbpArg2 equ <[rbp-rbpFirstArgBias+8*2-8]> rbpArg1 equ <[rbp-rbpFirstArgBias+8*1-8]> rspBorder = 0A8h rspArg14 equ <[rsp+8*14-8]> rspArg13 equ <[rsp+8*13-8]> rspArg12 equ <[rsp+8*12-8]> rspArg11 equ <[rsp+8*11-8]> rspArg10 equ <[rsp+8*10-8]> rspArg9 equ <[rsp+8*9-8]> rspArg8 equ <[rsp+8*8-8]> rspArg7 equ <[rsp+8*7-8]> rspArg6 equ <[rsp+8*6-8]> rspArg5 equ <[rsp+8*5-8]> rspArg4 equ <[rsp+8*4-8]> rspArg3 equ <[rsp+8*3-8]> rspArg2 equ <[rsp+8*2-8]> rspArg1 equ <[rsp+8*1-8]> invoke14 MACRO procname,args:VARARG LOCAL numics,is_addr txt TEXTEQU <> ArgNum = 0 % FOR item, IF ArgNum EQ 0 movReg64Arg rcx,item ELSEIF ArgNum EQ 1 movReg64Arg rdx,item ELSEIF ArgNum EQ 2 movReg64Arg r8,item ELSEIF ArgNum EQ 3 movReg64Arg r9,item ELSE txt CATSTR ,,txt ENDIF % ArgNum=ArgNum+1 ENDM IF rbpFrame EQ 1 IF ArgNum GT 4 txt SUBSTR txt, 1, @SizeStr( %txt ) - 1 ArgNum=rbpFirstArgBias-8*ArgNum % FOR item, ArgNum=ArgNum+8 IFDIF , movMem64Arg [rbp-ArgNum],item ENDIF ENDM ENDIF IF (OPATTR (procname)) EQ (VALID_REF OR IMM_EXPR) mov rax,[rcx] call procname[rax] ELSE call procname ENDIF ELSEIF rspFrame EQ 1 IF ArgNum GT 4 txt SUBSTR txt, 1, @SizeStr( %txt ) - 1 % FOR item, ArgNum = ArgNum-1 ;;%echo item IF IS_INT_REG(< item >) NE 0 mov [rsp+8*ArgNum],item ELSE IF (@InStr(1,<0123456789>,@SubStr(,1,1)) NE 0) AND (@SizeStr() LE 10) mov qword ptr [rsp+8*ArgNum],item ELSE IF ( (@SizeStr() GE 4) AND (@InStr(1,,) EQ 1) ) ;;OR (@SubStr(item,1,4),) ;;OR (@SubStr(item,1,4),) lea rax,@SubStr(,6,@SizeStr()-5) ELSE mov rax,item ENDIF mov [rsp+8*ArgNum],rax ENDIF ENDIF ENDM ENDIF call procname ELSE IF ArgNum GT 4 txt SUBSTR txt, 1, @SizeStr( %txt ) - 1 %pushm txt ENDIF sub rsp,8*4 call procname IF ArgNum GT 4 add rsp,8*ArgNum ELSE add rsp,8*4 ENDIF ENDIF ENDM FREE_RAX equ (1 shl 0) FREE_RBX equ (1 shl 1) FREE_RCX equ (1 shl 2) FREE_RDX equ (1 shl 3) FREE_RSP equ (1 shl 4) FREE_RBP equ (1 shl 5) FREE_RDI equ (1 shl 6) FREE_RSI equ (1 shl 7) FREE_R8 equ (1 shl 8) FREE_R9 equ (1 shl 9) FREE_R10 equ (1 shl 10) FREE_R11 equ (1 shl 11) FREE_R12 equ (1 shl 12) FREE_R13 equ (1 shl 13) FREE_R14 equ (1 shl 14) FREE_R15 equ (1 shl 15) FreeRegs=(FREE_RAX or FREE_RCX or FREE_RDX or FREE_R8 or FREE_R9 or FREE_R10 or FREE_R11) GetVolatileReg macro IF FreeRegs and FREE_RAX FreeRegs=FreeRegs and (not FREE_RAX) EXITM<0> ELSEIF FreeRegs and FREE_RCX FreeRegs=FreeRegs and (not FREE_RCX) EXITM<1> ELSEIF FreeRegs and FREE_RDX FreeRegs=FreeRegs and (not FREE_RDX) EXITM<2> ELSEIF FreeRegs and FREE_R8 FreeRegs=FreeRegs and (not FREE_R8) EXITM<8> ELSEIF FreeRegs and FREE_R9 FreeRegs=FreeRegs and (not FREE_R9) EXITM<9> ELSEIF FreeRegs and FREE_R10 FreeRegs=FreeRegs and (not FREE_R10) EXITM<10> ELSEIF FreeRegs and FREE_R11 FreeRegs=FreeRegs and (not FREE_R11) EXITM<11> ENDIF EXITM<16> endm IN_ARG1_READY equ (1 shl 1) IN_ARG2_READY equ (1 shl 2) IN_ARG3_READY equ (1 shl 3) IN_ARG4_READY equ (1 shl 4) IN_ARG5_READY equ (1 shl 5) IN_ARG6_READY equ (1 shl 6) IN_ARG7_READY equ (1 shl 7) IN_ARG8_READY equ (1 shl 8) IN_ARG9_READY equ (1 shl 9) IN_ARG10_READY equ (1 shl 10) IN_ARG11_READY equ (1 shl 11) IN_ARG12_READY equ (1 shl 12) IN_ARG13_READY equ (1 shl 13) IN_ARG14_READY equ (1 shl 14) invoke macro procname,in_arg1,in_arg2,in_arg3,in_arg4,in_arg5,in_arg6,in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 ReadyInArgs=0 IFB ReadyInArgs=ReadyInArgs or IN_ARG14_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG13_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG12_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG11_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG10_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG9_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG8_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG7_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG6_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG5_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG4_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG3_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG2_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG1_READY ENDIF IF rbpFirstArgBias LT rspBorder % LoadEAX rbpArg5,in_arg5,IN_ARG5_READY % LoadEAX rbpArg6,in_arg6,IN_ARG6_READY % LoadEAX rbpArg7,in_arg7,IN_ARG7_READY % LoadEAX rbpArg8,in_arg8,IN_ARG8_READY % LoadEAX rbpArg9,in_arg9,IN_ARG9_READY % LoadEAX rbpArg10,in_arg10,IN_ARG10_READY % LoadEAX rbpArg11,in_arg11,IN_ARG11_READY % LoadEAX rbpArg12,in_arg12,IN_ARG12_READY % LoadEAX rbpArg13,in_arg13,IN_ARG13_READY % LoadEAX rbpArg14,in_arg14,IN_ARG14_READY IF (ReadyInArgs and IN_ARG1_READY) EQ 0 % movReg64Arg rcx,in_arg1 ReadyInArgs=ReadyInArgs or IN_ARG1_READY % LoadSameInEDX in_arg1,in_arg2,IN_ARG2_READY,rcx,ecx % LoadSameInR8 in_arg1,in_arg3,IN_ARG3_READY,rcx,ecx % LoadSameInR9 in_arg1,in_arg4,IN_ARG4_READY,rcx,ecx % LoadSameInMemR rbpArg5,in_arg1,in_arg5,IN_ARG5_READY,rcx,ecx % LoadSameInMemR rbpArg6,in_arg1,in_arg6,IN_ARG6_READY,rcx,ecx % LoadSameInMemR rbpArg7,in_arg1,in_arg7,IN_ARG7_READY,rcx,ecx % LoadSameInMemR rbpArg8,in_arg1,in_arg8,IN_ARG8_READY,rcx,ecx % LoadSameInMemR rbpArg9,in_arg1,in_arg9,IN_ARG9_READY,rcx,ecx % LoadSameInMemR rbpArg10,in_arg1,in_arg10,IN_ARG10_READY,rcx,ecx % LoadSameInMemR rbpArg11,in_arg1,in_arg11,IN_ARG11_READY,rcx,ecx % LoadSameInMemR rbpArg12,in_arg1,in_arg12,IN_ARG12_READY,rcx,ecx % LoadSameInMemR rbpArg13,in_arg1,in_arg13,IN_ARG13_READY,rcx,ecx % LoadSameInMemR rbpArg14,in_arg1,in_arg14,IN_ARG14_READY,rcx,ecx ENDIF IF (ReadyInArgs and IN_ARG2_READY) EQ 0 % movReg64Arg rdx,in_arg2 ReadyInArgs=ReadyInArgs or IN_ARG2_READY % LoadSameInR8 in_arg2,in_arg3,IN_ARG3_READY,rdx,edx % LoadSameInR9 in_arg2,in_arg4,IN_ARG4_READY,rdx,edx % LoadSameInMemR rbpArg5,in_arg2,in_arg5,IN_ARG5_READY,rdx,edx % LoadSameInMemR rbpArg6,in_arg2,in_arg6,IN_ARG6_READY,rdx,edx % LoadSameInMemR rbpArg7,in_arg2,in_arg7,IN_ARG7_READY,rdx,edx % LoadSameInMemR rbpArg8,in_arg2,in_arg8,IN_ARG8_READY,rdx,edx % LoadSameInMemR rbpArg9,in_arg2,in_arg9,IN_ARG9_READY,rdx,edx % LoadSameInMemR rbpArg10,in_arg2,in_arg10,IN_ARG10_READY,rdx,edx % LoadSameInMemR rbpArg11,in_arg2,in_arg11,IN_ARG11_READY,rdx,edx % LoadSameInMemR rbpArg12,in_arg2,in_arg12,IN_ARG12_READY,rdx,edx % LoadSameInMemR rbpArg13,in_arg2,in_arg13,IN_ARG13_READY,rdx,edx % LoadSameInMemR rbpArg14,in_arg2,in_arg14,IN_ARG14_READY,rdx,edx ENDIF IF (ReadyInArgs and IN_ARG3_READY) EQ 0 % movReg64Arg r8,in_arg3 ReadyInArgs=ReadyInArgs or IN_ARG3_READY % LoadSameInR9 in_arg3,in_arg4,IN_ARG4_READY,r8,r8d % LoadSameInMemR rbpArg5,in_arg3,in_arg5,IN_ARG5_READY,r8,r8d % LoadSameInMemR rbpArg6,in_arg3,in_arg6,IN_ARG6_READY,r8,r8d % LoadSameInMemR rbpArg7,in_arg3,in_arg7,IN_ARG7_READY,r8,r8d % LoadSameInMemR rbpArg8,in_arg3,in_arg8,IN_ARG8_READY,r8,r8d % LoadSameInMemR rbpArg9,in_arg3,in_arg9,IN_ARG9_READY,r8,r8d % LoadSameInMemR rbpArg10,in_arg3,in_arg10,IN_ARG10_READY,r8,r8d % LoadSameInMemR rbpArg11,in_arg3,in_arg11,IN_ARG11_READY,r8,r8d % LoadSameInMemR rbpArg12,in_arg3,in_arg12,IN_ARG12_READY,r8,r8d % LoadSameInMemR rbpArg13,in_arg3,in_arg13,IN_ARG13_READY,r8,r8d % LoadSameInMemR rbpArg14,in_arg3,in_arg14,IN_ARG14_READY,r8,r8d ENDIF IF (ReadyInArgs and IN_ARG4_READY) EQ 0 % movReg64Arg r9,in_arg4 ReadyInArgs=ReadyInArgs or IN_ARG4_READY % LoadSameInMemR rbpArg5,in_arg4,in_arg5,IN_ARG5_READY,r9,r9d % LoadSameInMemR rbpArg6,in_arg4,in_arg6,IN_ARG6_READY,r9,r9d % LoadSameInMemR rbpArg7,in_arg4,in_arg7,IN_ARG7_READY,r9,r9d % LoadSameInMemR rbpArg8,in_arg4,in_arg8,IN_ARG8_READY,r9,r9d % LoadSameInMemR rbpArg9,in_arg4,in_arg9,IN_ARG9_READY,r9,r9d % LoadSameInMemR rbpArg10,in_arg4,in_arg10,IN_ARG10_READY,r9,r9d % LoadSameInMemR rbpArg11,in_arg4,in_arg11,IN_ARG11_READY,r9,r9d % LoadSameInMemR rbpArg12,in_arg4,in_arg12,IN_ARG12_READY,r9,r9d % LoadSameInMemR rbpArg13,in_arg4,in_arg13,IN_ARG13_READY,r9,r9d % LoadSameInMemR rbpArg14,in_arg4,in_arg14,IN_ARG14_READY,r9,r9d ENDIF IF (ReadyInArgs and IN_ARG5_READY) EQ 0 % SetType rbpArg5,in_arg5 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg5,in_arg5 ELSE % AppearsCount in_arg5,in_arg6,in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg5 % LoadSameInMemR rbpArg5,in_arg5,in_arg5,IN_ARG5_READY,rax,eax % LoadSameInMemR rbpArg6,in_arg5,in_arg6,IN_ARG6_READY,rax,eax % LoadSameInMemR rbpArg7,in_arg5,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rbpArg8,in_arg5,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rbpArg9,in_arg5,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rbpArg10,in_arg5,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg5,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg5,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg5,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg5,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg5,in_arg5 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG5_READY ENDIF IF (ReadyInArgs and IN_ARG6_READY) EQ 0 % SetType rbpArg6,in_arg6 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg6,in_arg6 ELSE % AppearsCount in_arg6,in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg6 % LoadSameInMemR rbpArg6,in_arg6,in_arg6,IN_ARG6_READY,rax,eax % LoadSameInMemR rbpArg7,in_arg6,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rbpArg8,in_arg6,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rbpArg9,in_arg6,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rbpArg10,in_arg6,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg6,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg6,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg6,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg6,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg6,in_arg6 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG6_READY ENDIF IF (ReadyInArgs and IN_ARG7_READY) EQ 0 % SetType rbpArg7,in_arg7 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg7,in_arg7 ELSE % AppearsCount in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg7 % LoadSameInMemR rbpArg7,in_arg7,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rbpArg8,in_arg7,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rbpArg9,in_arg7,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rbpArg10,in_arg7,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg7,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg7,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg7,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg7,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg7,in_arg7 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG7_READY ENDIF IF (ReadyInArgs and IN_ARG8_READY) EQ 0 % SetType rbpArg8,in_arg8 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg8,in_arg8 ELSE % AppearsCount in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg8 % LoadSameInMemR rbpArg8,in_arg8,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rbpArg9,in_arg8,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rbpArg10,in_arg8,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg8,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg8,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg8,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg8,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg8,in_arg8 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG8_READY ENDIF IF (ReadyInArgs and IN_ARG9_READY) EQ 0 % SetType rbpArg9,in_arg9 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg9,in_arg9 ELSE % AppearsCount in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg9 % LoadSameInMemR rbpArg9,in_arg9,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rbpArg10,in_arg9,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg9,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg9,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg9,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg9,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg9,in_arg9 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG9_READY ENDIF IF (ReadyInArgs and IN_ARG10_READY) EQ 0 % SetType rbpArg10,in_arg10 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg10,in_arg10 ELSE % AppearsCount in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg10 % LoadSameInMemR rbpArg10,in_arg10,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg10,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg10,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg10,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg10,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg10,in_arg10 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG10_READY ENDIF IF (ReadyInArgs and IN_ARG11_READY) EQ 0 SetType rbpArg11,in_arg11 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg11,in_arg11 ELSE % AppearsCount in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg11 % LoadSameInMemR rbpArg11,in_arg11,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg11,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg11,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg11,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg11,in_arg11 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG11_READY ENDIF IF (ReadyInArgs and IN_ARG12_READY) EQ 0 % SetType rbpArg12,in_arg12 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg12,in_arg12 ELSE % AppearsCount in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg12 % LoadSameInMemR rbpArg12,in_arg12,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg12,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg12,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg12,in_arg12 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG12_READY ENDIF IF (ReadyInArgs and IN_ARG13_READY) EQ 0 % SetType rbpArg13,in_arg13 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg13,in_arg13 ELSE % AppearsCount in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg13 % LoadSameInMemR rbpArg13,in_arg13,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg13,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg13,in_arg13 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG13_READY ENDIF IF (ReadyInArgs and IN_ARG14_READY) EQ 0 % movMem64Arg rbpArg13,in_arg14 % ReadyInArgs=ReadyInArgs or IN_ARG14_READY ENDIF ELSE % LoadEAX rspArg5,in_arg5,IN_ARG5_READY % LoadEAX rspArg6,in_arg6,IN_ARG6_READY % LoadEAX rspArg7,in_arg7,IN_ARG7_READY % LoadEAX rspArg8,in_arg8,IN_ARG8_READY % LoadEAX rspArg9,in_arg9,IN_ARG9_READY % LoadEAX rspArg10,in_arg10,IN_ARG10_READY % LoadEAX rspArg11,in_arg11,IN_ARG11_READY % LoadEAX rspArg12,in_arg12,IN_ARG12_READY % LoadEAX rspArg13,in_arg13,IN_ARG13_READY % LoadEAX rspArg14,in_arg14,IN_ARG14_READY IF (ReadyInArgs and IN_ARG1_READY) EQ 0 % movReg64Arg rcx,in_arg1 ReadyInArgs=ReadyInArgs or IN_ARG1_READY % LoadSameInEDX in_arg1,in_arg2,IN_ARG2_READY,rcx,ecx % LoadSameInR8 in_arg1,in_arg3,IN_ARG3_READY,rcx,ecx % LoadSameInR9 in_arg1,in_arg4,IN_ARG4_READY,rcx,ecx % LoadSameInMemR rspArg5,in_arg1,in_arg5,IN_ARG5_READY,rcx,ecx % LoadSameInMemR rspArg6,in_arg1,in_arg6,IN_ARG6_READY,rcx,ecx % LoadSameInMemR rspArg7,in_arg1,in_arg7,IN_ARG7_READY,rcx,ecx % LoadSameInMemR rspArg8,in_arg1,in_arg8,IN_ARG8_READY,rcx,ecx % LoadSameInMemR rspArg9,in_arg1,in_arg9,IN_ARG9_READY,rcx,ecx % LoadSameInMemR rspArg10,in_arg1,in_arg10,IN_ARG10_READY,rcx,ecx % LoadSameInMemR rspArg11,in_arg1,in_arg11,IN_ARG11_READY,rcx,ecx % LoadSameInMemR rspArg12,in_arg1,in_arg12,IN_ARG12_READY,rcx,ecx % LoadSameInMemR rspArg13,in_arg1,in_arg13,IN_ARG13_READY,rcx,ecx % LoadSameInMemR rspArg14,in_arg1,in_arg14,IN_ARG14_READY,rcx,ecx ENDIF IF (ReadyInArgs and IN_ARG2_READY) EQ 0 % movReg64Arg rdx,in_arg2 ReadyInArgs=ReadyInArgs or IN_ARG2_READY % LoadSameInR8 in_arg2,in_arg3,IN_ARG3_READY,rdx,edx % LoadSameInR9 in_arg2,in_arg4,IN_ARG4_READY,rdx,edx % LoadSameInMemR rspArg5,in_arg2,in_arg5,IN_ARG5_READY,rdx,edx % LoadSameInMemR rspArg6,in_arg2,in_arg6,IN_ARG6_READY,rdx,edx % LoadSameInMemR rspArg7,in_arg2,in_arg7,IN_ARG7_READY,rdx,edx % LoadSameInMemR rspArg8,in_arg2,in_arg8,IN_ARG8_READY,rdx,edx % LoadSameInMemR rspArg9,in_arg2,in_arg9,IN_ARG9_READY,rdx,edx % LoadSameInMemR rspArg10,in_arg2,in_arg10,IN_ARG10_READY,rdx,edx % LoadSameInMemR rspArg11,in_arg2,in_arg11,IN_ARG11_READY,rdx,edx % LoadSameInMemR rspArg12,in_arg2,in_arg12,IN_ARG12_READY,rdx,edx % LoadSameInMemR rspArg13,in_arg2,in_arg13,IN_ARG13_READY,rdx,edx % LoadSameInMemR rspArg14,in_arg2,in_arg14,IN_ARG14_READY,rdx,edx ENDIF IF (ReadyInArgs and IN_ARG3_READY) EQ 0 % movReg64Arg r8,in_arg3 ReadyInArgs=ReadyInArgs or IN_ARG3_READY % LoadSameInR9 in_arg3,in_arg4,IN_ARG4_READY,r8,r8d % LoadSameInMemR rspArg5,in_arg3,in_arg5,IN_ARG5_READY,r8,r8d % LoadSameInMemR rspArg6,in_arg3,in_arg6,IN_ARG6_READY,r8,r8d % LoadSameInMemR rspArg7,in_arg3,in_arg7,IN_ARG7_READY,r8,r8d % LoadSameInMemR rspArg8,in_arg3,in_arg8,IN_ARG8_READY,r8,r8d % LoadSameInMemR rspArg9,in_arg3,in_arg9,IN_ARG9_READY,r8,r8d % LoadSameInMemR rspArg10,in_arg3,in_arg10,IN_ARG10_READY,r8,r8d % LoadSameInMemR rspArg11,in_arg3,in_arg11,IN_ARG11_READY,r8,r8d % LoadSameInMemR rspArg12,in_arg3,in_arg12,IN_ARG12_READY,r8,r8d % LoadSameInMemR rspArg13,in_arg3,in_arg13,IN_ARG13_READY,r8,r8d % LoadSameInMemR rspArg14,in_arg3,in_arg14,IN_ARG14_READY,r8,r8d ENDIF IF (ReadyInArgs and IN_ARG4_READY) EQ 0 % movReg64Arg r9,in_arg4 ReadyInArgs=ReadyInArgs or IN_ARG4_READY % LoadSameInMemR rspArg5,in_arg4,in_arg5,IN_ARG5_READY,r9,r9d % LoadSameInMemR rspArg6,in_arg4,in_arg6,IN_ARG6_READY,r9,r9d % LoadSameInMemR rspArg7,in_arg4,in_arg7,IN_ARG7_READY,r9,r9d % LoadSameInMemR rspArg8,in_arg4,in_arg8,IN_ARG8_READY,r9,r9d % LoadSameInMemR rspArg9,in_arg4,in_arg9,IN_ARG9_READY,r9,r9d % LoadSameInMemR rspArg10,in_arg4,in_arg10,IN_ARG10_READY,r9,r9d % LoadSameInMemR rspArg11,in_arg4,in_arg11,IN_ARG11_READY,r9,r9d % LoadSameInMemR rspArg12,in_arg4,in_arg12,IN_ARG12_READY,r9,r9d % LoadSameInMemR rspArg13,in_arg4,in_arg13,IN_ARG13_READY,r9,r9d % LoadSameInMemR rspArg14,in_arg4,in_arg14,IN_ARG14_READY,r9,r9d ENDIF IF (ReadyInArgs and IN_ARG5_READY) EQ 0 % SetType rspArg5,in_arg5 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg5,in_arg5 ELSE % AppearsCount in_arg5,in_arg6,in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg5 % LoadSameInMemR rspArg5,in_arg5,in_arg5,IN_ARG5_READY,rax,eax % LoadSameInMemR rspArg6,in_arg5,in_arg6,IN_ARG6_READY,rax,eax % LoadSameInMemR rspArg7,in_arg5,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rspArg8,in_arg5,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rspArg9,in_arg5,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rspArg10,in_arg5,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg5,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg5,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg5,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg5,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg5,in_arg5 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG5_READY ENDIF IF (ReadyInArgs and IN_ARG6_READY) EQ 0 % SetType rspArg6,in_arg6 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg6,in_arg6 ELSE % AppearsCount in_arg6,in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg6 % LoadSameInMemR rspArg6,in_arg6,in_arg6,IN_ARG6_READY,rax,eax % LoadSameInMemR rspArg7,in_arg6,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rspArg8,in_arg6,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rspArg9,in_arg6,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rspArg10,in_arg6,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg6,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg6,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg6,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg6,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg6,in_arg6 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG6_READY ENDIF IF (ReadyInArgs and IN_ARG7_READY) EQ 0 % SetType rspArg7,in_arg7 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg7,in_arg7 ELSE % AppearsCount in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg7 % LoadSameInMemR rspArg7,in_arg7,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rspArg8,in_arg7,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rspArg9,in_arg7,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rspArg10,in_arg7,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg7,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg7,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg7,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg7,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg7,in_arg7 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG7_READY ENDIF IF (ReadyInArgs and IN_ARG8_READY) EQ 0 % SetType rspArg8,in_arg8 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg8,in_arg8 ELSE % AppearsCount in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg8 % LoadSameInMemR rspArg8,in_arg8,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rspArg9,in_arg8,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rspArg10,in_arg8,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg8,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg8,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg8,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg8,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg8,in_arg8 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG8_READY ENDIF IF (ReadyInArgs and IN_ARG9_READY) EQ 0 % SetType rspArg9,in_arg9 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg9,in_arg9 ELSE % AppearsCount in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg9 % LoadSameInMemR rspArg9,in_arg9,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rspArg10,in_arg9,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg9,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg9,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg9,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg9,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg9,in_arg9 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG9_READY ENDIF IF (ReadyInArgs and IN_ARG10_READY) EQ 0 % SetType rspArg10,in_arg10 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg10,in_arg10 ELSE % AppearsCount in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg10 % LoadSameInMemR rspArg10,in_arg10,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg10,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg10,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg10,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg10,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg10,in_arg10 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG10_READY ENDIF IF (ReadyInArgs and IN_ARG11_READY) EQ 0 % SetType rspArg11,in_arg11 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg11,in_arg11 ELSE % AppearsCount in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg11 % LoadSameInMemR rspArg11,in_arg11,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg11,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg11,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg11,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg11,in_arg11 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG11_READY ENDIF IF (ReadyInArgs and IN_ARG12_READY) EQ 0 % SetType rspArg12,in_arg12 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg12,in_arg12 ELSE % AppearsCount in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg12 % LoadSameInMemR rspArg12,in_arg12,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg12,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg12,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg12,in_arg12 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG12_READY ENDIF IF (ReadyInArgs and IN_ARG13_READY) EQ 0 % SetType rspArg13,in_arg13 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg13,in_arg13 ELSE % AppearsCount in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg13 % LoadSameInMemR rspArg13,in_arg13,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg13,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg13,in_arg13 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG13_READY ENDIF IF (ReadyInArgs and IN_ARG14_READY) EQ 0 % movMem64Arg rspArg13,in_arg14 % ReadyInArgs=ReadyInArgs or IN_ARG14_READY ENDIF ENDIF IF (OPATTR (procname)) EQ (VALID_REF OR IMM_EXPR) mov rax,[rcx] call procname[rax] ELSE call procname ENDIF endm I macro procname,in_arg1,in_arg2,in_arg3,in_arg4,in_arg5,in_arg6,in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 ReadyInArgs=0 IFB ReadyInArgs=ReadyInArgs or IN_ARG14_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG13_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG12_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG11_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG10_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG9_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG8_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG7_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG6_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG5_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG4_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG3_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG2_READY ENDIF IFB ReadyInArgs=ReadyInArgs or IN_ARG1_READY ENDIF IF rbpFirstArgBias LT rspBorder % LoadEAX rbpArg5,in_arg5,IN_ARG5_READY % LoadEAX rbpArg6,in_arg6,IN_ARG6_READY % LoadEAX rbpArg7,in_arg7,IN_ARG7_READY % LoadEAX rbpArg8,in_arg8,IN_ARG8_READY % LoadEAX rbpArg9,in_arg9,IN_ARG9_READY % LoadEAX rbpArg10,in_arg10,IN_ARG10_READY % LoadEAX rbpArg11,in_arg11,IN_ARG11_READY % LoadEAX rbpArg12,in_arg12,IN_ARG12_READY % LoadEAX rbpArg13,in_arg13,IN_ARG13_READY % LoadEAX rbpArg14,in_arg14,IN_ARG14_READY IF (ReadyInArgs and IN_ARG1_READY) EQ 0 % movReg64Arg rcx,in_arg1 ReadyInArgs=ReadyInArgs or IN_ARG1_READY % LoadSameInEDX in_arg1,in_arg2,IN_ARG2_READY,rcx,ecx % LoadSameInR8 in_arg1,in_arg3,IN_ARG3_READY,rcx,ecx % LoadSameInR9 in_arg1,in_arg4,IN_ARG4_READY,rcx,ecx % LoadSameInMemR rbpArg5,in_arg1,in_arg5,IN_ARG5_READY,rcx,ecx % LoadSameInMemR rbpArg6,in_arg1,in_arg6,IN_ARG6_READY,rcx,ecx % LoadSameInMemR rbpArg7,in_arg1,in_arg7,IN_ARG7_READY,rcx,ecx % LoadSameInMemR rbpArg8,in_arg1,in_arg8,IN_ARG8_READY,rcx,ecx % LoadSameInMemR rbpArg9,in_arg1,in_arg9,IN_ARG9_READY,rcx,ecx % LoadSameInMemR rbpArg10,in_arg1,in_arg10,IN_ARG10_READY,rcx,ecx % LoadSameInMemR rbpArg11,in_arg1,in_arg11,IN_ARG11_READY,rcx,ecx % LoadSameInMemR rbpArg12,in_arg1,in_arg12,IN_ARG12_READY,rcx,ecx % LoadSameInMemR rbpArg13,in_arg1,in_arg13,IN_ARG13_READY,rcx,ecx % LoadSameInMemR rbpArg14,in_arg1,in_arg14,IN_ARG14_READY,rcx,ecx ENDIF IF (ReadyInArgs and IN_ARG2_READY) EQ 0 % movReg64Arg rdx,in_arg2 ReadyInArgs=ReadyInArgs or IN_ARG2_READY % LoadSameInR8 in_arg2,in_arg3,IN_ARG3_READY,rdx,edx % LoadSameInR9 in_arg2,in_arg4,IN_ARG4_READY,rdx,edx % LoadSameInMemR rbpArg5,in_arg2,in_arg5,IN_ARG5_READY,rdx,edx % LoadSameInMemR rbpArg6,in_arg2,in_arg6,IN_ARG6_READY,rdx,edx % LoadSameInMemR rbpArg7,in_arg2,in_arg7,IN_ARG7_READY,rdx,edx % LoadSameInMemR rbpArg8,in_arg2,in_arg8,IN_ARG8_READY,rdx,edx % LoadSameInMemR rbpArg9,in_arg2,in_arg9,IN_ARG9_READY,rdx,edx % LoadSameInMemR rbpArg10,in_arg2,in_arg10,IN_ARG10_READY,rdx,edx % LoadSameInMemR rbpArg11,in_arg2,in_arg11,IN_ARG11_READY,rdx,edx % LoadSameInMemR rbpArg12,in_arg2,in_arg12,IN_ARG12_READY,rdx,edx % LoadSameInMemR rbpArg13,in_arg2,in_arg13,IN_ARG13_READY,rdx,edx % LoadSameInMemR rbpArg14,in_arg2,in_arg14,IN_ARG14_READY,rdx,edx ENDIF IF (ReadyInArgs and IN_ARG3_READY) EQ 0 % movReg64Arg r8,in_arg3 ReadyInArgs=ReadyInArgs or IN_ARG3_READY % LoadSameInR9 in_arg3,in_arg4,IN_ARG4_READY,r8,r8d % LoadSameInMemR rbpArg5,in_arg3,in_arg5,IN_ARG5_READY,r8,r8d % LoadSameInMemR rbpArg6,in_arg3,in_arg6,IN_ARG6_READY,r8,r8d % LoadSameInMemR rbpArg7,in_arg3,in_arg7,IN_ARG7_READY,r8,r8d % LoadSameInMemR rbpArg8,in_arg3,in_arg8,IN_ARG8_READY,r8,r8d % LoadSameInMemR rbpArg9,in_arg3,in_arg9,IN_ARG9_READY,r8,r8d % LoadSameInMemR rbpArg10,in_arg3,in_arg10,IN_ARG10_READY,r8,r8d % LoadSameInMemR rbpArg11,in_arg3,in_arg11,IN_ARG11_READY,r8,r8d % LoadSameInMemR rbpArg12,in_arg3,in_arg12,IN_ARG12_READY,r8,r8d % LoadSameInMemR rbpArg13,in_arg3,in_arg13,IN_ARG13_READY,r8,r8d % LoadSameInMemR rbpArg14,in_arg3,in_arg14,IN_ARG14_READY,r8,r8d ENDIF IF (ReadyInArgs and IN_ARG4_READY) EQ 0 % movReg64Arg r9,in_arg4 ReadyInArgs=ReadyInArgs or IN_ARG4_READY % LoadSameInMemR rbpArg5,in_arg4,in_arg5,IN_ARG5_READY,r9,r9d % LoadSameInMemR rbpArg6,in_arg4,in_arg6,IN_ARG6_READY,r9,r9d % LoadSameInMemR rbpArg7,in_arg4,in_arg7,IN_ARG7_READY,r9,r9d % LoadSameInMemR rbpArg8,in_arg4,in_arg8,IN_ARG8_READY,r9,r9d % LoadSameInMemR rbpArg9,in_arg4,in_arg9,IN_ARG9_READY,r9,r9d % LoadSameInMemR rbpArg10,in_arg4,in_arg10,IN_ARG10_READY,r9,r9d % LoadSameInMemR rbpArg11,in_arg4,in_arg11,IN_ARG11_READY,r9,r9d % LoadSameInMemR rbpArg12,in_arg4,in_arg12,IN_ARG12_READY,r9,r9d % LoadSameInMemR rbpArg13,in_arg4,in_arg13,IN_ARG13_READY,r9,r9d % LoadSameInMemR rbpArg14,in_arg4,in_arg14,IN_ARG14_READY,r9,r9d ENDIF IF (ReadyInArgs and IN_ARG5_READY) EQ 0 % SetType rbpArg5,in_arg5 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg5,in_arg5 ELSE % AppearsCount in_arg5,in_arg6,in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg5 % LoadSameInMemR rbpArg5,in_arg5,in_arg5,IN_ARG5_READY,rax,eax % LoadSameInMemR rbpArg6,in_arg5,in_arg6,IN_ARG6_READY,rax,eax % LoadSameInMemR rbpArg7,in_arg5,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rbpArg8,in_arg5,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rbpArg9,in_arg5,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rbpArg10,in_arg5,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg5,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg5,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg5,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg5,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg5,in_arg5 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG5_READY ENDIF IF (ReadyInArgs and IN_ARG6_READY) EQ 0 % SetType rbpArg6,in_arg6 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg6,in_arg6 ELSE % AppearsCount in_arg6,in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg6 % LoadSameInMemR rbpArg6,in_arg6,in_arg6,IN_ARG6_READY,rax,eax % LoadSameInMemR rbpArg7,in_arg6,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rbpArg8,in_arg6,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rbpArg9,in_arg6,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rbpArg10,in_arg6,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg6,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg6,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg6,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg6,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg6,in_arg6 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG6_READY ENDIF IF (ReadyInArgs and IN_ARG7_READY) EQ 0 % SetType rbpArg7,in_arg7 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg7,in_arg7 ELSE % AppearsCount in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg7 % LoadSameInMemR rbpArg7,in_arg7,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rbpArg8,in_arg7,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rbpArg9,in_arg7,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rbpArg10,in_arg7,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg7,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg7,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg7,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg7,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg7,in_arg7 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG7_READY ENDIF IF (ReadyInArgs and IN_ARG8_READY) EQ 0 % SetType rbpArg8,in_arg8 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg8,in_arg8 ELSE % AppearsCount in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg8 % LoadSameInMemR rbpArg8,in_arg8,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rbpArg9,in_arg8,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rbpArg10,in_arg8,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg8,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg8,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg8,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg8,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg8,in_arg8 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG8_READY ENDIF IF (ReadyInArgs and IN_ARG9_READY) EQ 0 % SetType rbpArg9,in_arg9 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg9,in_arg9 ELSE % AppearsCount in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg9 % LoadSameInMemR rbpArg9,in_arg9,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rbpArg10,in_arg9,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg9,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg9,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg9,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg9,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg9,in_arg9 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG9_READY ENDIF IF (ReadyInArgs and IN_ARG10_READY) EQ 0 % SetType rbpArg10,in_arg10 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg10,in_arg10 ELSE % AppearsCount in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg10 % LoadSameInMemR rbpArg10,in_arg10,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rbpArg11,in_arg10,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg10,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg10,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg10,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg10,in_arg10 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG10_READY ENDIF IF (ReadyInArgs and IN_ARG11_READY) EQ 0 SetType rbpArg11,in_arg11 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg11,in_arg11 ELSE % AppearsCount in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg11 % LoadSameInMemR rbpArg11,in_arg11,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rbpArg12,in_arg11,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg11,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg11,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg11,in_arg11 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG11_READY ENDIF IF (ReadyInArgs and IN_ARG12_READY) EQ 0 % SetType rbpArg12,in_arg12 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg12,in_arg12 ELSE % AppearsCount in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg12 % LoadSameInMemR rbpArg12,in_arg12,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rbpArg13,in_arg12,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg12,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg12,in_arg12 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG12_READY ENDIF IF (ReadyInArgs and IN_ARG13_READY) EQ 0 % SetType rbpArg13,in_arg13 IF (itemOpattr and REG_EXPR) % movMem64Arg rbpArg13,in_arg13 ELSE % AppearsCount in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg13 % LoadSameInMemR rbpArg13,in_arg13,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rbpArg14,in_arg13,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rbpArg13,in_arg13 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG13_READY ENDIF IF (ReadyInArgs and IN_ARG14_READY) EQ 0 % movMem64Arg rbpArg13,in_arg14 % ReadyInArgs=ReadyInArgs or IN_ARG14_READY ENDIF ELSE % LoadEAX rspArg5,in_arg5,IN_ARG5_READY % LoadEAX rspArg6,in_arg6,IN_ARG6_READY % LoadEAX rspArg7,in_arg7,IN_ARG7_READY % LoadEAX rspArg8,in_arg8,IN_ARG8_READY % LoadEAX rspArg9,in_arg9,IN_ARG9_READY % LoadEAX rspArg10,in_arg10,IN_ARG10_READY % LoadEAX rspArg11,in_arg11,IN_ARG11_READY % LoadEAX rspArg12,in_arg12,IN_ARG12_READY % LoadEAX rspArg13,in_arg13,IN_ARG13_READY % LoadEAX rspArg14,in_arg14,IN_ARG14_READY IF (ReadyInArgs and IN_ARG1_READY) EQ 0 % movReg64Arg rcx,in_arg1 ReadyInArgs=ReadyInArgs or IN_ARG1_READY % LoadSameInEDX in_arg1,in_arg2,IN_ARG2_READY,rcx,ecx % LoadSameInR8 in_arg1,in_arg3,IN_ARG3_READY,rcx,ecx % LoadSameInR9 in_arg1,in_arg4,IN_ARG4_READY,rcx,ecx % LoadSameInMemR rspArg5,in_arg1,in_arg5,IN_ARG5_READY,rcx,ecx % LoadSameInMemR rspArg6,in_arg1,in_arg6,IN_ARG6_READY,rcx,ecx % LoadSameInMemR rspArg7,in_arg1,in_arg7,IN_ARG7_READY,rcx,ecx % LoadSameInMemR rspArg8,in_arg1,in_arg8,IN_ARG8_READY,rcx,ecx % LoadSameInMemR rspArg9,in_arg1,in_arg9,IN_ARG9_READY,rcx,ecx % LoadSameInMemR rspArg10,in_arg1,in_arg10,IN_ARG10_READY,rcx,ecx % LoadSameInMemR rspArg11,in_arg1,in_arg11,IN_ARG11_READY,rcx,ecx % LoadSameInMemR rspArg12,in_arg1,in_arg12,IN_ARG12_READY,rcx,ecx % LoadSameInMemR rspArg13,in_arg1,in_arg13,IN_ARG13_READY,rcx,ecx % LoadSameInMemR rspArg14,in_arg1,in_arg14,IN_ARG14_READY,rcx,ecx ENDIF IF (ReadyInArgs and IN_ARG2_READY) EQ 0 % movReg64Arg rdx,in_arg2 ReadyInArgs=ReadyInArgs or IN_ARG2_READY % LoadSameInR8 in_arg2,in_arg3,IN_ARG3_READY,rdx,edx % LoadSameInR9 in_arg2,in_arg4,IN_ARG4_READY,rdx,edx % LoadSameInMemR rspArg5,in_arg2,in_arg5,IN_ARG5_READY,rdx,edx % LoadSameInMemR rspArg6,in_arg2,in_arg6,IN_ARG6_READY,rdx,edx % LoadSameInMemR rspArg7,in_arg2,in_arg7,IN_ARG7_READY,rdx,edx % LoadSameInMemR rspArg8,in_arg2,in_arg8,IN_ARG8_READY,rdx,edx % LoadSameInMemR rspArg9,in_arg2,in_arg9,IN_ARG9_READY,rdx,edx % LoadSameInMemR rspArg10,in_arg2,in_arg10,IN_ARG10_READY,rdx,edx % LoadSameInMemR rspArg11,in_arg2,in_arg11,IN_ARG11_READY,rdx,edx % LoadSameInMemR rspArg12,in_arg2,in_arg12,IN_ARG12_READY,rdx,edx % LoadSameInMemR rspArg13,in_arg2,in_arg13,IN_ARG13_READY,rdx,edx % LoadSameInMemR rspArg14,in_arg2,in_arg14,IN_ARG14_READY,rdx,edx ENDIF IF (ReadyInArgs and IN_ARG3_READY) EQ 0 % movReg64Arg r8,in_arg3 ReadyInArgs=ReadyInArgs or IN_ARG3_READY % LoadSameInR9 in_arg3,in_arg4,IN_ARG4_READY,r8,r8d % LoadSameInMemR rspArg5,in_arg3,in_arg5,IN_ARG5_READY,r8,r8d % LoadSameInMemR rspArg6,in_arg3,in_arg6,IN_ARG6_READY,r8,r8d % LoadSameInMemR rspArg7,in_arg3,in_arg7,IN_ARG7_READY,r8,r8d % LoadSameInMemR rspArg8,in_arg3,in_arg8,IN_ARG8_READY,r8,r8d % LoadSameInMemR rspArg9,in_arg3,in_arg9,IN_ARG9_READY,r8,r8d % LoadSameInMemR rspArg10,in_arg3,in_arg10,IN_ARG10_READY,r8,r8d % LoadSameInMemR rspArg11,in_arg3,in_arg11,IN_ARG11_READY,r8,r8d % LoadSameInMemR rspArg12,in_arg3,in_arg12,IN_ARG12_READY,r8,r8d % LoadSameInMemR rspArg13,in_arg3,in_arg13,IN_ARG13_READY,r8,r8d % LoadSameInMemR rspArg14,in_arg3,in_arg14,IN_ARG14_READY,r8,r8d ENDIF IF (ReadyInArgs and IN_ARG4_READY) EQ 0 % movReg64Arg r9,in_arg4 ReadyInArgs=ReadyInArgs or IN_ARG4_READY % LoadSameInMemR rspArg5,in_arg4,in_arg5,IN_ARG5_READY,r9,r9d % LoadSameInMemR rspArg6,in_arg4,in_arg6,IN_ARG6_READY,r9,r9d % LoadSameInMemR rspArg7,in_arg4,in_arg7,IN_ARG7_READY,r9,r9d % LoadSameInMemR rspArg8,in_arg4,in_arg8,IN_ARG8_READY,r9,r9d % LoadSameInMemR rspArg9,in_arg4,in_arg9,IN_ARG9_READY,r9,r9d % LoadSameInMemR rspArg10,in_arg4,in_arg10,IN_ARG10_READY,r9,r9d % LoadSameInMemR rspArg11,in_arg4,in_arg11,IN_ARG11_READY,r9,r9d % LoadSameInMemR rspArg12,in_arg4,in_arg12,IN_ARG12_READY,r9,r9d % LoadSameInMemR rspArg13,in_arg4,in_arg13,IN_ARG13_READY,r9,r9d % LoadSameInMemR rspArg14,in_arg4,in_arg14,IN_ARG14_READY,r9,r9d ENDIF IF (ReadyInArgs and IN_ARG5_READY) EQ 0 % SetType rspArg5,in_arg5 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg5,in_arg5 ELSE % AppearsCount in_arg5,in_arg6,in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg5 % LoadSameInMemR rspArg5,in_arg5,in_arg5,IN_ARG5_READY,rax,eax % LoadSameInMemR rspArg6,in_arg5,in_arg6,IN_ARG6_READY,rax,eax % LoadSameInMemR rspArg7,in_arg5,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rspArg8,in_arg5,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rspArg9,in_arg5,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rspArg10,in_arg5,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg5,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg5,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg5,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg5,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg5,in_arg5 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG5_READY ENDIF IF (ReadyInArgs and IN_ARG6_READY) EQ 0 % SetType rspArg6,in_arg6 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg6,in_arg6 ELSE % AppearsCount in_arg6,in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg6 % LoadSameInMemR rspArg6,in_arg6,in_arg6,IN_ARG6_READY,rax,eax % LoadSameInMemR rspArg7,in_arg6,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rspArg8,in_arg6,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rspArg9,in_arg6,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rspArg10,in_arg6,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg6,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg6,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg6,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg6,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg6,in_arg6 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG6_READY ENDIF IF (ReadyInArgs and IN_ARG7_READY) EQ 0 % SetType rspArg7,in_arg7 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg7,in_arg7 ELSE % AppearsCount in_arg7,in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg7 % LoadSameInMemR rspArg7,in_arg7,in_arg7,IN_ARG7_READY,rax,eax % LoadSameInMemR rspArg8,in_arg7,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rspArg9,in_arg7,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rspArg10,in_arg7,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg7,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg7,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg7,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg7,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg7,in_arg7 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG7_READY ENDIF IF (ReadyInArgs and IN_ARG8_READY) EQ 0 % SetType rspArg8,in_arg8 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg8,in_arg8 ELSE % AppearsCount in_arg8,in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg8 % LoadSameInMemR rspArg8,in_arg8,in_arg8,IN_ARG8_READY,rax,eax % LoadSameInMemR rspArg9,in_arg8,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rspArg10,in_arg8,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg8,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg8,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg8,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg8,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg8,in_arg8 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG8_READY ENDIF IF (ReadyInArgs and IN_ARG9_READY) EQ 0 % SetType rspArg9,in_arg9 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg9,in_arg9 ELSE % AppearsCount in_arg9,in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg9 % LoadSameInMemR rspArg9,in_arg9,in_arg9,IN_ARG9_READY,rax,eax % LoadSameInMemR rspArg10,in_arg9,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg9,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg9,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg9,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg9,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg9,in_arg9 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG9_READY ENDIF IF (ReadyInArgs and IN_ARG10_READY) EQ 0 % SetType rspArg10,in_arg10 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg10,in_arg10 ELSE % AppearsCount in_arg10,in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg10 % LoadSameInMemR rspArg10,in_arg10,in_arg10,IN_ARG10_READY,rax,eax % LoadSameInMemR rspArg11,in_arg10,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg10,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg10,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg10,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg10,in_arg10 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG10_READY ENDIF IF (ReadyInArgs and IN_ARG11_READY) EQ 0 % SetType rspArg11,in_arg11 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg11,in_arg11 ELSE % AppearsCount in_arg11,in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg11 % LoadSameInMemR rspArg11,in_arg11,in_arg11,IN_ARG11_READY,rax,eax % LoadSameInMemR rspArg12,in_arg11,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg11,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg11,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg11,in_arg11 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG11_READY ENDIF IF (ReadyInArgs and IN_ARG12_READY) EQ 0 % SetType rspArg12,in_arg12 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg12,in_arg12 ELSE % AppearsCount in_arg12,in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg12 % LoadSameInMemR rspArg12,in_arg12,in_arg12,IN_ARG12_READY,rax,eax % LoadSameInMemR rspArg13,in_arg12,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg12,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg12,in_arg12 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG12_READY ENDIF IF (ReadyInArgs and IN_ARG13_READY) EQ 0 % SetType rspArg13,in_arg13 IF (itemOpattr and REG_EXPR) % movMem64Arg rspArg13,in_arg13 ELSE % AppearsCount in_arg13,in_arg14 IF __AppearsCount GT 1 % movReg64Arg rax,in_arg13 % LoadSameInMemR rspArg13,in_arg13,in_arg13,IN_ARG13_READY,rax,eax % LoadSameInMemR rspArg14,in_arg13,in_arg14,IN_ARG14_READY,rax,eax ELSE % movMem64Arg rspArg13,in_arg13 ENDIF ENDIF ReadyInArgs=ReadyInArgs or IN_ARG13_READY ENDIF IF (ReadyInArgs and IN_ARG14_READY) EQ 0 % movMem64Arg rspArg13,in_arg14 % ReadyInArgs=ReadyInArgs or IN_ARG14_READY ENDIF ENDIF IF (OPATTR (procname)) EQ (VALID_REF OR IMM_EXPR) mov rax,[rcx] call procname[rax] ELSE call procname ENDIF endm AppearsCount macro appear_string,__in___args:VARARG __AppearsCount=1 % FOR parm,<__in___args> % IFIDN , __AppearsCount=__AppearsCount+1 ENDIF ENDM IF __AppearsCount LE must_be_gt __AppearsCount=1 ENDIF endm LoadEAX macro mem_in_arg,in_argx,in_arg_flag IF (ReadyInArgs and in_arg_flag) EQ 0 RegPosition=@InStr(1,,) IF RegPosition movMem64Arg mem_in_arg,in_argx ReadyInArgs=ReadyInArgs or in_arg_flag ENDIF ENDIF endm LoadSameInEDX macro in_argx,in_argx2,in_arg_flag,reg64w,reg32w IF (ReadyInArgs and in_arg_flag) EQ 0 IFIDN , IFDIF , IF (itemOpattr and REG_EXPR) IF (itemSize EQ 8) mov rdx,in_arg2 ELSEIF (itemSize EQ 4) regIndex=Reg32Index(in_arg2) IF regIndex LT 8 mov edx,in_arg2 ELSE mov edx,reg32w ENDIF ELSE mov edx,reg32w ENDIF ELSEIF (itemSize EQ 8) or (itemSize EQ 0) mov rdx,reg64w ELSEIF (imm_nullification EQ 1) or (imm_nullification EQ 2) xor edx,edx ELSE mov edx,reg32w ENDIF ENDIF ReadyInArgs=ReadyInArgs or in_arg_flag ENDIF ENDIF endm LoadSameInR8 macro in_argx,in_argx2,in_arg_flag,reg64w,reg32w IF (ReadyInArgs and in_arg_flag) EQ 0 IFIDN , IFDIF , IF (itemOpattr and REG_EXPR) IF (itemSize EQ 8) mov r8,in_argx2 ELSEIF (itemSize EQ 4) mov r8d,in_argx2 ELSE mov r8d,reg32w ENDIF ELSEIF (itemSize EQ 8) or (itemSize EQ 0) mov r8,reg64w ELSEIF (imm_nullification EQ 1) or (imm_nullification EQ 2) xor r8d,r8d ELSE mov r8d,reg32w ENDIF ENDIF ReadyInArgs=ReadyInArgs or in_arg_flag ENDIF ENDIF endm LoadSameInMemR macro mem_in_arg,in_argx,in_argx2,in_arg_flag,reg64w,reg32w IF (ReadyInArgs and in_arg_flag) EQ 0 IFIDN , IF (itemOpattr and REG_EXPR) IF (itemSize EQ 8) mov mem_in_arg,in_argx2 ELSEIF (itemSize EQ 4) mov mem_in_arg,in_argx2 ELSE mov mem_in_arg,reg32w ENDIF ELSE IF (imm_nullification EQ 2) or (imm_nullification EQ 3) mov mem_in_arg,reg64w ELSE IF (itemSize EQ 8) or (itemSize EQ 0) mov mem_in_arg,reg64w ELSE mov mem_in_arg,reg32w ENDIF ENDIF ENDIF ReadyInArgs=ReadyInArgs or in_arg_flag ENDIF ENDIF endm LoadSameInR9 macro in_argx,in_argx2,in_arg_flag,reg64w,reg32w IF (ReadyInArgs and in_arg_flag) EQ 0 IFIDN , IFDIF , IF (itemOpattr and REG_EXPR) IF (itemSize EQ 8) mov r9,in_argx2 ELSEIF (itemSize EQ 4) mov r9d,in_argx2 ELSE mov r9d,reg32w ENDIF ELSEIF (itemSize EQ 8) or (itemSize EQ 0) mov r9,reg64w ELSEIF (imm_nullification EQ 1) or (imm_nullification EQ 2) xor r9d,r9d ELSE mov r9d,reg32w ENDIF ENDIF ReadyInArgs=ReadyInArgs or in_arg_flag ENDIF ENDIF endm GetVal MACRO NumStr:REQ % EXITM ENDM comment $Ìàêðîñ äëÿ óäîáíîãî îïðåäåëåíèÿ äàííûõ â ñòàíäàðòíîé ñåêöèè êîíñòàíò .const. Ïåðåä íåêîòîðûìè ñèìâîëàìè íåîáõîäèìî ñòàâèòü âîñêëèöàòåëüíûé çíàê. Íàïðèìåð âìåñòî < âåçäå äîëæíî áûòü !<, à âìåñòî > ñîîòâåòñòâåííî !>$ CONSTANT MACRO string:VARARG .const string .code ENDM comment $Ìàêðîñ äëÿ óäîáíîãî îïðåäåëåíèÿ äàííûõ â ñòàíäàðòíîé ñåêöèè äàííûõ .data. Ïåðåä íåêîòîðûìè ñèìâîëàìè íåîáõîäèìî ñòàâèòü âîñêëèöàòåëüíûé çíàê. Íàïðèìåð âìåñòî < âåçäå äîëæíî áûòü !<, à âìåñòî > ñîîòâåòñòâåííî !>$ STATIC MACRO string:VARARG .data string .code ENDM comment $Ìàêðîñ äëÿ óäîáíîãî îïðåäåëåíèÿ äàííûõ â ñòàíäàðòíîé ñåêöèè íå èíèöèëèçèðîâàííûõ äàííûõ .data?. Ïåðåä íåêîòîðûìè ñèìâîëàìè íåîáõîäèìî ñòàâèòü âîñêëèöàòåëüíûé çíàê. Íàïðèìåð âìåñòî < âåçäå äîëæíî áûòü !<, à âìåñòî > ñîîòâåòñòâåííî !>$ RESERV MACRO string:VARARG .data? align 8 string .code ENDM unicode MACRO page,string,zero LOCAL Zstr % FORC char, Zstr CATSTR ,,<',>, % Zstr ENDM % IFDIF ,<> Zstr CATSTR , % Zstr ENDIF ENDM RegIndex macro reg:REQ LOCAL Index Index=Reg64Index(reg) IF Index NE NOT_A_REG64 exitm <@CatStr(%Index)> ENDIF Index=Reg32Index(reg) IF Index NE NOT_A_REG32 exitm <@CatStr(%Index)> ENDIF Index=Reg16Index(reg) IF Index NE NOT_A_REG16 exitm <@CatStr(%Index)> ENDIF Index=Reg8Index(reg) exitm <@CatStr(%Index)> endm Reg64Index macro reg:REQ LOCAL Reg64,Reg64Pos IF @SizeStr() GT 3 exitm <@CatStr(%NOT_A_REG64)> ENDIF Reg64 CATSTR < >,ToLower(),< > Reg64Pos INSTR 1,< rax rcx rdx rbx rsp rbp rsi rdi r8 r9 r10 r11 r12 r13 r14 r15 >,Reg64 IF Reg64Pos NE 0 Reg64Pos=(Reg64Pos-1) shr 2 ELSE Reg64Pos=NOT_A_REG64 ENDIF exitm <@CatStr(%Reg64Pos)> endm Reg32Index macro reg:REQ LOCAL Reg32,Reg32Pos IF @SizeStr() GT 4 exitm <@CatStr(%NOT_A_REG32)> ENDIF Reg32 CATSTR < >,ToLower(),< > Reg32Pos INSTR 1,< eax ecx edx ebx esp ebp esi edi r8d r9d r10d r11d r12d r13d r14d r15d >,Reg32 IF Reg32Pos NE 0 Reg32Pos=(Reg32Pos-1) shr 3 ELSE Reg32Pos=NOT_A_REG32 ENDIF exitm <@CatStr(%Reg32Pos)> endm Reg16Index macro reg:REQ LOCAL Reg16,Reg16Pos IF @SizeStr() GT 4 exitm <@CatStr(%NOT_A_REG16)> ENDIF Reg16 CATSTR < >,ToLower(),< > Reg16Pos INSTR 1,< ax cx dx bx sp bp si di r8w r9w r10w r11w r12w r13w r14w r15w >,Reg16 IF Reg16Pos NE 0 Reg16Pos=(Reg16Pos-1) shr 3 ELSE Reg16Pos=NOT_A_REG16 ENDIF exitm <@CatStr(%Reg16Pos)> endm Reg8Index macro reg:REQ LOCAL Reg8,Reg8Pos IF @SizeStr() GT 4 exitm <@CatStr(%NOT_A_REG8)> ENDIF Reg8 CATSTR < >,ToLower(),< > Reg8Pos INSTR 1,< al cl dl bl spl bpl sil dil r8b r9b r10b r11b r12b r13b r14b r15b >,Reg8 IF Reg8Pos NE 0 Reg8Pos=(Reg8Pos-1) shr 3 ELSE Reg8Pos=NOT_A_REG8 ENDIF exitm <@CatStr(%Reg8Pos)> endm RegHigh8Index macro reg:REQ LOCAL Reg8,Reg8Pos IF @SizeStr() GT 4 exitm <@CatStr(%NOT_A_REG8)> ENDIF Reg8 CATSTR < >,ToLower(),< > Reg8Pos INSTR 1,< ah ch dh bh >,Reg8 IF Reg8Pos NE 0 Reg8Pos=(Reg8Pos-1) shr 3 ELSE Reg8Pos=NOT_A_REG8 ENDIF exitm <@CatStr(%Reg8Pos)> endm GetReg64 macro Index:REQ exitm <@SubStr(< rax rcx rdx rbx rsp rbp rsi rdi r8 r9 r10 r11 r12 r13 r14 r15>,4*Index+1,4)> endm GetReg32 macro Index:REQ exitm <@SubStr(< eax ecx edx ebx esp ebp esi edi r8d r9dr10dr11dr12dr13dr14dr15d>,4*Index+1,4)> endm GetReg16 macro Index:REQ exitm <@SubStr(< ax cx dx bx sp bp si di r8w r9wr10wr11wr12wr13wr14wr15w>,4*Index+1,4)> endm GetReg8 macro Index:REQ exitm <@SubStr(< al cl dl bl spl bpl sil dil r8b r9br10br11br12br13br14br15b>,4*Index+1,4)> endm GetRegHigh8 macro Index:REQ exitm <@SubStr(,2*Index+1,2)> endm ;ÑÈÌÂÎËÛ ÄËß ÈÌ¨Í IsCharForNames MACRO char CharPosition INSTR 1,<0123456789abcdefghijklmnopqrstvuwxyzABCDEFGHIJKLMNOPQRSTVUWXYZ_.?$@>, EXITM<@CatStr(%CharPosition)> ENDM SelectValidSymbols MACRO CondString:VARARG ;;LOCAL SkipState,cnt_letter,curr_letter,c_char SkipState=0 curr_letter=0 ph_count=0 cnt_letter SIZESTR WHILE cnt_letter curr_letter=curr_letter+1 c_char SUBSTR ,curr_letter,1 IF SkipState EQ 0 IF IsCharForNames(%c_char) EQ 0 IFIDN c_char,<[> SkipState=1 ELSEIFIDN c_char,<(> SkipState=2 ph_count=1 ELSEIFIDN c_char,<"> SkipState=5 ELSEIFIDN c_char,<'> SkipState=6 ELSEIFDIF c_char,< > EXITM ENDIF ENDIF ELSEIF SkipState EQ 1 IFIDN c_char,<]> SkipState=0 ELSEIFIDN c_char,<"> SkipState=7 ELSEIFIDN c_char,<'> SkipState=8 ENDIF ELSEIF SkipState EQ 2 IFIDN c_char,<)> ph_count=ph_count-1 IF ph_count EQ 0 SkipState=0 ENDIF ELSEIFIDN c_char,<(> ph_count=ph_count+1 ELSEIFIDN c_char,<"> SkipState=3 ELSEIFIDN c_char,<'> SkipState=4 ENDIF ELSEIF SkipState EQ 3 IFIDN c_char,<"> SkipState=2 ENDIF ELSEIF SkipState EQ 4 IFIDN c_char,<'> SkipState=2 ENDIF ELSEIF SkipState EQ 5 IFIDN c_char,<"> SkipState=0 ENDIF ELSEIF SkipState EQ 6 IFIDN c_char,<'> SkipState=0 ENDIF ELSEIF SkipState EQ 7 IFIDN c_char,<"> SkipState=1 ENDIF ELSEIF SkipState EQ 8 IFIDN c_char,<'> SkipState=1 ENDIF ENDIF cnt_letter=cnt_letter-1 ENDM IF cnt_letter EQ 0 curr_letter=0 ENDIF EXITM<@CatStr(%curr_letter)> ENDM ;;LOCAL ;fletter TEXTEQU <> ;lletter TEXTEQU <> ;fchar=0 ;schar=0 ;blchar=0 ;lchar=0 ;cond_len=0 ;reg_ind=NOT_A_REG ;reg_high_ind=NOT_A_REG8 ;is_jxcxz=0 sxb equ sxw equ sxd equ sxq equ j_one_bt_pow=0 j_one_bt_pow2=0 j_one_bt_pow3=0 j_one_bt_pow4=0 j_one_bt_uses=1 J_ONE_COND MACRO LabelName,IsTrueCondition,ConditionOne:VARARG cond_len SIZESTR fletter SUBSTR ,1,1 lletter SUBSTR ,cond_len,1 fchar=0 schar=0 lchar=0 blchar=0 IF cond_len GE 2 IFIDN fletter,<(> fchar=1 ELSEIFIDN fletter,<~> fchar=2 ENDIF IFIDN @SubStr(,2,1),<(> schar=1 ENDIF IFIDN lletter,<)> lchar=1 ENDIF IFIDN lletter, lchar=2 ENDIF IFIDN @SubStr(,cond_len-1,1), blchar=2 ENDIF ENDIF IF fchar EQ 2 IF (schar EQ 1) AND (lchar EQ 1) J_ONE_COND LabelName,(IsTrueCondition xor 1),@SubStr(,3,cond_len-3) ELSE J_ONE_COND LabelName,(IsTrueCondition xor 1),@SubStr(,2,cond_len-1) ENDIF ELSEIF (fchar EQ 1) AND (lchar EQ 1) J_ONE_COND LabelName,IsTrueCondition,@SubStr(,2,cond_len-2) ELSE IF IsTrueCondition EQ FALSE NegateChar TEXTEQU TrueChar TEXTEQU <> ELSE NegateChar TEXTEQU <> TrueChar TEXTEQU ENDIF OperatorPos=SelectValidSymbols(ConditionOne) IF OperatorPos NE 0 SingleRunTimeOperator SUBSTR ,OperatorPos,1 ELSE SingleRunTimeOperator TEXTEQU <> ENDIF CmpCmd TEXTEQU <> JCOND TEXTEQU <> IF OperatorPos EQ 0 IF (OPATTR ConditionOne) EQ (IMM_EXPR OR VALID_REF) IF (ConditionOne NE 0) IF (IsTrueCondition NE 0) JCOND CATSTR , ENDIF ELSEIF IsTrueCondition EQ 0 JCOND CATSTR , ENDIF ELSE IF lchar EQ 2 IFIDN , JCOND CATSTR ,NegateChar,, ELSEIFIDN , JCOND CATSTR ,NegateChar,, ELSEIFIDN , JCOND CATSTR ,NegateChar,, ELSEIFIDN , JCOND CATSTR ,NegateChar,

, ELSEIFIDN , JCOND CATSTR ,NegateChar,, ENDIF ENDIF IFIDN JCOND,<> FirstArg TEXTEQU reg_ind=RegIndex(%FirstArg) reg_high_ind=RegHigh8Index(%FirstArg) is_jxcxz=0 IF (reg_ind EQ 1) AND (IsTrueCondition EQ FALSE) IFDIF fletter, is_jxcxz=1 ENDIF ENDIF IF (is_jxcxz EQ 1) JCOND CATSTR ,FirstArg,, ELSEIF (reg_ind EQ NOT_A_REG) AND (reg_high_ind EQ NOT_A_REG8) CmpCmd CATSTR ,FirstArg,<,0> JCOND CATSTR ,TrueChar,, ELSE CmpCmd CATSTR ,FirstArg,<,>,FirstArg JCOND CATSTR ,TrueChar,, ENDIF ENDIF ENDIF ELSE IF lchar EQ 2 IFIDN , JCOND CATSTR ,NegateChar,, ELSEIFIDN , JCOND CATSTR ,NegateChar,, ELSEIFIDN , JCOND CATSTR ,NegateChar,, ELSEIFIDN , JCOND CATSTR ,NegateChar,, ENDIF ELSEIF (lchar EQ 1) AND (blchar EQ 2) IFIDN , JCOND CATSTR ,NegateChar,, ELSEIFIDN , JCOND CATSTR ,NegateChar,, ELSEIFIDN , JCOND CATSTR ,TrueChar,, ENDIF ENDIF IFIDN JCOND,<> RunTimeOperator SUBSTR ,OperatorPos,2 FirstArg SUBSTR ,1,OperatorPos-1 is_signed_expr=0 first_arg_length SIZESTR FirstArg IF first_arg_length GT 10 IF first_arg_length GT 11 first_arg_type_spec SUBSTR FirstArg,1,11 first_arg_type_spec_len=11 ELSE first_arg_type_spec SUBSTR FirstArg,1,10 first_arg_type_spec_len=10 ENDIF IFIDNI first_arg_type_spec, is_signed_expr=4 ELSEIFIDNI first_arg_type_spec, is_signed_expr=8 ELSE IF first_arg_type_spec_len EQ 11 first_arg_type_spec SUBSTR first_arg_type_spec,1,10 ENDIF IFIDNI first_arg_type_spec, is_signed_expr=1 ELSEIFIDNI first_arg_type_spec, is_signed_expr=2 ENDIF ENDIF ENDIF IF cond_len GE (OperatorPos+2) SecondArg SUBSTR ,OperatorPos+2,cond_len-OperatorPos-1 ENDIF IFIDN RunTimeOperator,<==> JCOND CATSTR ,NegateChar,, ELSEIFIDN RunTimeOperator,<~=> JCOND CATSTR ,TrueChar,, ELSEIFIDN RunTimeOperator,<{}> JCOND CATSTR ,TrueChar,, ELSEIFIDN RunTimeOperator,<}=> IF is_signed_expr JCOND CATSTR ,NegateChar,, ELSE JCOND CATSTR ,NegateChar,, ENDIF ELSEIFIDN RunTimeOperator,<{=> IF is_signed_expr JCOND CATSTR ,NegateChar,, ELSE JCOND CATSTR ,NegateChar,, ENDIF ELSEIFIDN RunTimeOperator,<={> IF is_signed_expr JCOND CATSTR ,NegateChar,, ELSE JCOND CATSTR ,NegateChar,, ENDIF ELSEIFIDN RunTimeOperator,<&&> IFIDN SecondArg, reg_ind=RegIndex(%FirstArg) reg_high_ind=RegHigh8Index(%FirstArg) IF (reg_ind EQ NOT_A_REG) AND (reg_high_ind EQ NOT_A_REG8) CmpCmd TEXTEQU ,FirstArg,<,0> ELSE CmpCmd TEXTEQU ,FirstArg,<,>,FirstArg ENDIF JCOND CATSTR ,NegateChar,, ELSE CmpCmd CATSTR ,FirstArg,<,>,SecondArg JCOND CATSTR ,TrueChar,, ENDIF ENDIF IFIDN JCOND,<> SecondArg SUBSTR ,OperatorPos+1,cond_len-OperatorPos IFIDN SingleRunTimeOperator,<}> IF is_signed_expr JCOND CATSTR ,NegateChar,, ELSE JCOND CATSTR ,NegateChar,, ENDIF ELSEIFIDN SingleRunTimeOperator,<{> IF is_signed_expr JCOND CATSTR ,NegateChar,, ELSE JCOND CATSTR ,NegateChar,, ENDIF ELSEIFIDN SingleRunTimeOperator,<|> CmpCmd CATSTR ,FirstArg,<,>,SecondArg JCOND CATSTR ,TrueChar,, ELSEIFIDN SingleRunTimeOperator,<&> IFIDN SecondArg, reg_ind=RegIndex(%FirstArg) reg_high_ind=RegHigh8Index(%FirstArg) IF (reg_ind EQ NOT_A_REG) AND (reg_high_ind EQ NOT_A_REG8) CmpCmd TEXTEQU ,FirstArg,<,0> ELSE CmpCmd TEXTEQU ,FirstArg,<,>,FirstArg ENDIF JCOND CATSTR ,NegateChar,, ELSEIF ((OPATTR (SecondArg)) EQ VIMM_EXPR) AND (TYPE FirstArg GT 1) AND (j_one_bt_uses EQ 1) j_one_bt_pow=0 j_one_bt_pow4=0 IF (SecondArg) EQ 0 j_one_bt_pow4=-1 ENDIF j_one_bt_pow2=(SecondArg) AND 0FFFFFFFFh j_one_bt_pow3=(SecondArg) SHR 32 IF j_one_bt_pow2 EQ 0 j_one_bt_pow=32 j_one_bt_pow2=j_one_bt_pow3 ELSEIF j_one_bt_pow3 NE 0 j_one_bt_pow4=-1 ENDIF j_one_bt_pow3=j_one_bt_pow2 SHR 16 j_one_bt_pow2=j_one_bt_pow2 AND 0FFFFh IF j_one_bt_pow2 EQ 0 j_one_bt_pow=j_one_bt_pow+16 j_one_bt_pow2=j_one_bt_pow3 ELSEIF j_one_bt_pow3 NE 0 j_one_bt_pow4=-1 ENDIF j_one_bt_pow3=j_one_bt_pow2 SHR 8 j_one_bt_pow2=j_one_bt_pow2 AND 0FFh IF j_one_bt_pow2 EQ 0 j_one_bt_pow=j_one_bt_pow+8 j_one_bt_pow2=j_one_bt_pow3 ELSEIF j_one_bt_pow3 NE 0 j_one_bt_pow4=-1 ENDIF j_one_bt_pow3=j_one_bt_pow2 SHR 4 j_one_bt_pow2=j_one_bt_pow2 AND 0Fh IF j_one_bt_pow2 EQ 0 j_one_bt_pow=j_one_bt_pow+4 j_one_bt_pow2=j_one_bt_pow3 ELSEIF j_one_bt_pow3 NE 0 j_one_bt_pow4=-1 ENDIF j_one_bt_pow3=j_one_bt_pow2 SHR 2 j_one_bt_pow2=j_one_bt_pow2 AND 11y IF j_one_bt_pow2 EQ 0 j_one_bt_pow=j_one_bt_pow+2 j_one_bt_pow2=j_one_bt_pow3 ELSEIF j_one_bt_pow3 NE 0 j_one_bt_pow4=-1 ENDIF j_one_bt_pow3=j_one_bt_pow2 SHR 1 j_one_bt_pow2=j_one_bt_pow2 AND 1y IF j_one_bt_pow2 EQ 0 j_one_bt_pow=j_one_bt_pow+1 j_one_bt_pow2=j_one_bt_pow3 ELSEIF j_one_bt_pow3 NE 0 j_one_bt_pow4=-1 ENDIF IF j_one_bt_pow4 EQ 0 j_one_bt_pow4=((TYPE FirstArg) EQ 2) AND (j_one_bt_pow EQ 15) j_one_bt_pow4=j_one_bt_pow4 OR (((TYPE FirstArg) EQ 4) AND (j_one_bt_pow EQ 31)) j_one_bt_pow4=j_one_bt_pow4 OR (((TYPE FirstArg) EQ 8) AND (j_one_bt_pow EQ 63)) IF j_one_bt_pow4 EQ 0 CmpCmd CATSTR ,FirstArg,<,>,@CatStr(%j_one_bt_pow) JCOND CATSTR ,NegateChar,, ELSE reg_ind=RegIndex(%FirstArg) IF reg_ind EQ NOT_A_REG CmpCmd TEXTEQU ,FirstArg,<,0> ELSE CmpCmd TEXTEQU ,FirstArg,<,>,FirstArg ENDIF JCOND CATSTR ,NegateChar,, ENDIF ELSE CmpCmd CATSTR ,FirstArg,<,>,SecondArg JCOND CATSTR ,TrueChar,, ENDIF ELSE CmpCmd CATSTR ,FirstArg,<,>,SecondArg JCOND CATSTR ,TrueChar,, ENDIF ELSE .err ENDIF ENDIF IFDIF SecondArg,<> IFIDN CmpCmd,<> CmpCmd CATSTR ,FirstArg,<,>,SecondArg ENDIF ENDIF ENDIF ENDIF CmpCmd JCOND ENDIF ENDM GetIfsPosition MACRO CondString:VARARG ;;LOCAL SkipState,cnt_letter,curr_letter,c_char,c_log_operator,total_conds,ph_count SkipState=0 curr_letter=0 cnt_letter SIZESTR IF cnt_letter LT 6 EXITM<0> ENDIF ph_count=0 WHILE cnt_letter GT 5 curr_letter=curr_letter+1 c_char SUBSTR ,curr_letter,1 IF SkipState EQ 0 IFIDN c_char,<[> SkipState=1 ELSEIFIDN c_char,<"> SkipState=2 ELSEIFIDN c_char,<'> SkipState=3 ELSEIFIDN c_char,<(> SkipState=4 ph_count=1 ELSEIFIDN c_char,< > c_log_operator SUBSTR ,curr_letter,5 IFIDN c_log_operator,< .if > EXITM ENDIF ENDIF ELSEIF SkipState EQ 1 IFIDN c_char,<]> SkipState=0 ELSEIFIDN c_char,<"> SkipState=7 ELSEIFIDN c_char,<'> SkipState=8 ENDIF ELSEIF SkipState EQ 2 IFIDN c_char,<"> SkipState=0 ENDIF ELSEIF SkipState EQ 3 IFIDN c_char,<'> SkipState=0 ENDIF ELSEIF SkipState EQ 4 IFIDN c_char,<)> ph_count=ph_count-1 IF ph_count EQ 0 SkipState=0 ENDIF ELSEIFIDN c_char,<(> ph_count=ph_count+1 ELSEIFIDN c_char,<"> SkipState=5 ELSEIFIDN c_char,<'> SkipState=6 ENDIF ELSEIF SkipState EQ 5 IFIDN c_char,<"> SkipState=4 ENDIF ELSEIF SkipState EQ 6 IFIDN c_char,<'> SkipState=4 ENDIF ELSEIF SkipState EQ 7 IFIDN c_char,<"> SkipState=1 ENDIF ELSEIF SkipState EQ 8 IFIDN c_char,<'> SkipState=1 ENDIF ENDIF cnt_letter=cnt_letter-1 ENDM IF cnt_letter LE 5 EXITM<0> ENDIF EXITM<@CatStr(%curr_letter)> ENDM SelectOrValidConds MACRO CondString:VARARG ;;LOCAL SkipState,cnt_letter,curr_letter,c_char,c_log_operator,total_conds,ph_count SkipState=0 curr_letter=0 cnt_letter SIZESTR IF cnt_letter LT 6 EXITM<0> ENDIF ph_count=0 WHILE cnt_letter GT 4 curr_letter=curr_letter+1 c_char SUBSTR ,curr_letter,1 IF SkipState EQ 0 IFIDN c_char,<[> SkipState=1 ELSEIFIDN c_char,<"> SkipState=2 ELSEIFIDN c_char,<'> SkipState=3 ELSEIFIDN c_char,<(> SkipState=4 ph_count=1 ELSEIFIDN c_char,< > c_log_operator SUBSTR ,curr_letter,4 IFIDN c_log_operator,< || > EXITM ENDIF ENDIF ELSEIF SkipState EQ 1 IFIDN c_char,<]> SkipState=0 ENDIF ELSEIF SkipState EQ 2 IFIDN c_char,<"> SkipState=0 ENDIF ELSEIF SkipState EQ 3 IFIDN c_char,<'> SkipState=0 ENDIF ELSEIF SkipState EQ 4 IFIDN c_char,<)> ph_count=ph_count-1 IF ph_count EQ 0 SkipState=0 ENDIF ELSEIFIDN c_char,<(> ph_count=ph_count+1 ELSEIFIDN c_char,<"> SkipState=5 ELSEIFIDN c_char,<'> SkipState=6 ENDIF ELSEIF SkipState EQ 5 IFIDN c_char,<"> SkipState=4 ENDIF ELSEIF SkipState EQ 6 IFIDN c_char,<'> SkipState=4 ENDIF ENDIF cnt_letter=cnt_letter-1 ENDM IF cnt_letter LE 4 EXITM<0> ENDIF EXITM<@CatStr(%curr_letter)> ENDM SelectValidCond MACRO CondString:VARARG ;;LOCAL SkipState,cnt_letter,curr_letter,c_char,c_log_operator,total_conds,ph_count SkipState=0 curr_letter=0 cnt_letter SIZESTR IF cnt_letter LT 6 EXITM<0> ENDIF ph_count=0 WHILE cnt_letter GT 4 curr_letter=curr_letter+1 c_char SUBSTR ,curr_letter,1 IF SkipState EQ 0 IFIDN c_char,<[> SkipState=1 ELSEIFIDN c_char,<"> SkipState=2 ELSEIFIDN c_char,<'> SkipState=3 ELSEIFIDN c_char,<(> SkipState=4 ph_count=1 ELSEIFIDN c_char,< > c_log_operator SUBSTR ,curr_letter,4 IFIDN c_log_operator,< || > EXITM ELSEIFIDN c_log_operator,< && > EXITM ENDIF ENDIF ELSEIF SkipState EQ 1 IFIDN c_char,<]> SkipState=0 ENDIF ELSEIF SkipState EQ 2 IFIDN c_char,<"> SkipState=0 ENDIF ELSEIF SkipState EQ 3 IFIDN c_char,<'> SkipState=0 ENDIF ELSEIF SkipState EQ 4 IFIDN c_char,<)> ph_count=ph_count-1 IF ph_count EQ 0 SkipState=0 ENDIF ELSEIFIDN c_char,<(> ph_count=ph_count+1 ELSEIFIDN c_char,<"> SkipState=5 ELSEIFIDN c_char,<'> SkipState=6 ENDIF ELSEIF SkipState EQ 5 IFIDN c_char,<"> SkipState=4 ENDIF ELSEIF SkipState EQ 6 IFIDN c_char,<'> SkipState=4 ENDIF ENDIF cnt_letter=cnt_letter-1 ENDM IF cnt_letter LE 4 EXITM<0> ENDIF EXITM<@CatStr(%curr_letter)> ENDM IsSingleCond MACRO CondString:VARARG ;;LOCAL SkipState,cnt_letter,curr_letter,c_char,c_log_operator SkipState=0 curr_letter=0 cnt_letter SIZESTR IF cnt_letter LT 6 EXITM<1> ENDIF WHILE cnt_letter GT 4 curr_letter=curr_letter+1 c_char SUBSTR ,curr_letter,1 IF SkipState EQ 0 IFIDN c_char,<[> SkipState=1 ELSEIFIDN c_char,<"> SkipState=2 ELSEIFIDN c_char,<'> SkipState=3 ELSEIFIDN c_char,< > c_log_operator SUBSTR ,curr_letter,4 IFIDN c_log_operator,< || > EXITM ELSEIFIDN c_log_operator,< && > EXITM ENDIF ENDIF ELSEIF SkipState EQ 1 IFIDN c_char,<]> SkipState=0 ENDIF ELSEIF SkipState EQ 2 IFIDN c_char,<"> SkipState=0 ENDIF ELSEIF SkipState EQ 3 IFIDN c_char,<'> SkipState=0 ENDIF ENDIF cnt_letter=cnt_letter-1 ENDM IF cnt_letter GT 4 EXITM<0> ENDIF EXITM<1> ENDM IntermedLabel=0 J_POLY_COND MACRO LabelName,TrueConditions,ConditionsString:VARARG LOCAL BeginCond,EndCond,LogOperator,locLabel,SetLabel,IsTrueConditions,NegCond,EndLabel,LastConds BeginCond=1 EndCond=1 SetLabel=0 NegCond=0 LastConds=0 IsTrueConditions=TrueConditions IF IsSingleCond() NE 0 J_ONE_COND LabelName,IsTrueConditions,ConditionsString ELSE EndLabel CATSTR ,@CatStr(%IntermedLabel) IntermedLabel=IntermedLabel+1 SetLabel=0 LogOperator=0 :NextCond IFIDN @SubStr(,BeginCond,2),<~(> IsTrueConditions=IsTrueConditions xor 1 BeginCond=BeginCond+1 NegCond=1 ENDIF EndCond=SelectValidCond(@SubStr(,BeginCond,@SizeStr()-BeginCond+1)) IF EndCond EQ 0 EndCond=@SizeStr()+1 LogOperator=0 ELSE EndCond=EndCond+BeginCond-1 LogOperator=EndCond ENDIF IFIDN @SubStr(,BeginCond,1),<(> BeginCond=BeginCond+1 EndCond=EndCond-1 IF NegCond EQ 1 IF IsSingleCond(@SubStr(,BeginCond,EndCond-BeginCond)) EQ 1 IsTrueConditions=IsTrueConditions xor 1 BeginCond=BeginCond-2 EndCond=EndCond+1 NegCond=0 ENDIF ENDIF ENDIF IF LogOperator EQ 0 J_POLY_COND LabelName,IsTrueConditions,@SubStr(,BeginCond,EndCond-BeginCond) IF SetLabel NE 0 locLabel: ENDIF EndLabel: GOTO EndConditions ENDIF IF SetLabel EQ 0 IFIDN @SubStr(,LogOperator,4),< || > IF IsTrueConditions NE 0 J_POLY_COND LabelName,1,@SubStr(,BeginCond,EndCond-BeginCond) GOTO forward ELSE J_POLY_COND EndLabel,1,@SubStr(,BeginCond,EndCond-BeginCond) GOTO forward ENDIF ELSE SetLabel=1 locLabel CATSTR ,@CatStr(%IntermedLabel) IntermedLabel=IntermedLabel+1 RemnConds SUBSTR ,LogOperator+4,@SizeStr()-LogOperator-3 LastConds=1 IF (@SizeStr(RemnConds) NE 0) AND (SelectOrValidConds(RemnConds) NE 0) LastConds=0 ENDIF IF IsTrueConditions EQ 0 IF LastConds EQ 1 IF NegCond EQ 1 J_POLY_COND locLabel,1,@SubStr(,BeginCond,EndCond-BeginCond) ELSE J_POLY_COND LabelName,0,@SubStr(,BeginCond,EndCond-BeginCond) ENDIF GOTO forward ELSE J_POLY_COND locLabel,1,@SubStr(,BeginCond,EndCond-BeginCond) GOTO forward ENDIF ELSE IF (LastConds EQ 1) AND (NegCond EQ 1) J_POLY_COND LabelName,1,@SubStr(,BeginCond,EndCond-BeginCond) GOTO forward ENDIF J_POLY_COND locLabel,0,@SubStr(,BeginCond,EndCond-BeginCond) ENDIF ENDIF GOTO forward ELSE IFIDN @SubStr(,LogOperator,4),< || > IF IsTrueConditions NE 0 J_POLY_COND LabelName,1,@SubStr(,BeginCond,EndCond-BeginCond) ELSE J_POLY_COND EndLabel,1,@SubStr(,BeginCond,EndCond-BeginCond) ENDIF locLabel: SetLabel=0 ELSEIF IsTrueConditions EQ 0 IF LastConds EQ 1 J_POLY_COND LabelName,0,@SubStr(,BeginCond,EndCond-BeginCond) GOTO forward ELSE J_POLY_COND locLabel,1,@SubStr(,BeginCond,EndCond-BeginCond) GOTO forward ENDIF ELSE J_POLY_COND locLabel,0,@SubStr(,BeginCond,EndCond-BeginCond) ENDIF ENDIF :forward IF NegCond EQ 1 IsTrueConditions=IsTrueConditions xor 1 NegCond=0 ENDIF BeginCond=LogOperator+4 IF IsSingleCond(@SubStr(,BeginCond,@SizeStr()-BeginCond+1)) EQ 1 % J_POLY_COND LabelName,IsTrueConditions,@SubStr(,BeginCond,@SizeStr()-BeginCond+1) IF SetLabel NE 0 locLabel: ENDIF EndLabel: GOTO EndConditions ENDIF GOTO NextCond ENDIF :EndConditions ENDM .goto MACRO IfCondString:VARARG IfsPos=GetIfsPosition(IfCondString) IF IfsPos NE 0 gtLabel SUBSTR ,1,(IfsPos-1) gtConds SUBSTR ,IfsPos+5,@SizeStr(IfCondString)+1-(IfsPos+5) gtLabelAttr=(OPATTR gtLabel) IF (gtLabelAttr AND MEM_EXPR) % .if gtConds jmp gtLabel .endif ELSE % J_POLY_COND gtLabel,1,gtConds ENDIF ELSE jmp IfCondString ENDIF ENDM .esc MACRO IfCondString:VARARG GetOutLabel IFIDN ,<> jmp LastOutLabel ELSE gtConds SUBSTR ,5 % J_POLY_COND LastOutLabel,1,gtConds ENDIF ENDM c2asmhex MACRO c_num:REQ LOCAL lenc,asm_hex lenc=@SizeStr() IF (lenc GT 2) IF (@InStr(1,,<0X>) EQ 1) OR (@InStr(1,,<0x>) EQ 1) asm_hex CATSTR <0>,@SubStr(,3,(lenc-2)), ELSE asm_hex TEXTEQU ENDIF ELSE asm_hex TEXTEQU ENDIF EXITM ENDM DEFINE_GUID MACRO iid_name,Data1,Data2,Data3,Data4_0,Data4_1,Data4_2,Data4_3,Data4_4:REQ,Data4_5,Data4_6,Data4_7 iid_name LABEL GUID dd c2asmhex(Data1) dw c2asmhex(Data2) dw c2asmhex(Data3) db c2asmhex(Data4_0) db c2asmhex(Data4_1) db c2asmhex(Data4_2) db c2asmhex(Data4_3) db c2asmhex(Data4_4) db c2asmhex(Data4_5) db c2asmhex(Data4_6) db c2asmhex(Data4_7) EXITM<> ENDM pushm MACRO args:VARARG TEX TEXTEQU <> address TEXTEQU <> FOR item, IF @SizeStr() GE 6 TEX SUBSTR ,1,4 address SUBSTR , 6, @SizeStr() - 5 IFIDN TEX, lea rax,address push rax ELSEIFIDN TEX, lea rax,address push rax ELSEIFIDN TEX, lea rax,address push rax ELSE push item ENDIF ELSE push item ENDIF ENDM ENDM altm MACRO Consts:VARARG EXITM <> ENDM pword TYPEDEF PTR FAR16 vstrstr MACRO CondString,__SubStr__,InitialPos:=<0> ;;LOCAL SkipState,cnt_letter,curr_letter,c_char,c_log_operator,total_conds,ph_count SkipState=0 curr_letter=InitialPos cnt_letter SIZESTR cnt_letter=cnt_letter-curr_letter __SubStr__len SIZESTR <__SubStr__> IF cnt_letter LT __SubStr__len EXITM<0> ENDIF ph_count=0 WHILE cnt_letter GE __SubStr__len curr_letter=curr_letter+1 c_char SUBSTR ,curr_letter,1 IF SkipState EQ 0 IFIDN c_char,<[> SkipState=1 ELSEIFIDN c_char,<"> SkipState=2 ELSEIFIDN c_char,<'> SkipState=3 ELSEIFIDN c_char,<(> SkipState=4 ph_count=1 ELSE c_log_operator SUBSTR ,curr_letter,__SubStr__len IFIDN c_log_operator,<__SubStr__> cnt_letter=1000 EXITM ENDIF ENDIF ELSEIF SkipState EQ 1 IFIDN c_char,<]> SkipState=0 ELSEIFIDN c_char,<"> SkipState=7 ELSEIFIDN c_char,<'> SkipState=8 ENDIF ELSEIF SkipState EQ 2 IFIDN c_char,<"> SkipState=0 ENDIF ELSEIF SkipState EQ 3 IFIDN c_char,<'> SkipState=0 ENDIF ELSEIF SkipState EQ 4 IFIDN c_char,<)> ph_count=ph_count-1 IF ph_count EQ 0 SkipState=0 ENDIF ELSEIFIDN c_char,<(> ph_count=ph_count+1 ELSEIFIDN c_char,<"> SkipState=5 ELSEIFIDN c_char,<'> SkipState=6 ENDIF ELSEIF SkipState EQ 5 IFIDN c_char,<"> SkipState=4 ENDIF ELSEIF SkipState EQ 6 IFIDN c_char,<'> SkipState=4 ENDIF ELSEIF SkipState EQ 7 IFIDN c_char,<"> SkipState=1 ENDIF ELSEIF SkipState EQ 8 IFIDN c_char,<'> SkipState=1 ENDIF ENDIF cnt_letter=cnt_letter-1 ENDM IF cnt_letter GE __SubStr__len EXITM<@CatStr(%curr_letter)> ENDIF EXITM<0> ENDM defined MACRO Arg1:REQ IFDEF Arg1 EXITM<1> ENDIF EXITM<0> ENDM ;ÏÐÎÒÎÒÈÏÛ ÌÀÊÐÎÑΠv MACRO vl_expr:VARARG ENDM v1 MACRO vl_expr:VARARG ENDM v2 MACRO vl_expr:VARARG ENDM v3 MACRO vl_expr:VARARG ENDM v4 MACRO vl_expr:VARARG ENDM v1 MACRO vl_expr:VARARG LOCAL vl_def_add,vl_cpos,vl_expr_len,vl_dest,vl_plus vl_def_add=0 vl_expr_len SIZESTR vl_cpos=vstrstr(,<=>)+1 vl_dest SUBSTR ,1,(vl_cpos-2) vl_char SUBSTR ,(vl_cpos-3),2 IFIDN vl_char,<}}> vl_dest SUBSTR ,1,(vl_cpos-4) vl_def_add=1 GOTO vl_loop ENDIF IFIDN vl_char,<{{> vl_dest SUBSTR ,1,(vl_cpos-4) vl_def_add=2 GOTO vl_loop ENDIF ;;;;;; ÓÌÍÎÆÅÍÈÅ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vl_char SUBSTR ,(vl_cpos-2),1 IFIDN vl_char,<*> vl_dest SUBSTR ,1,(vl_cpos-3) vl_def_add=3 GOTO vl_loop ENDIF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vl_ph=0 ;;ÈÍÈÖÈÀËÈÇÀÖÈß ÌÅÑÒÀ ÍÀÇÍÀ×ÅÍÈß ÏÅÐÂÛÌ ÀÐÃÓÌÅÍÒÎÌ vl_char SUBSTR ,vl_cpos,1 ;;ÏÎÈÑÊ ÀÐÃÓÌÅÍÒÀ IFIDN vl_char,<(> ;;ÂÛÐÀÆÅÍÈÅ Â ÑÊÎÁÊÀÕ vl_ph=1 ENDIF IFIDN vl_char,<&> vl_ph=2 ENDIF IF vl_cpos GT vl_expr_len GOTO vl_exit ENDIF vl_def_add=1 vl_plus=vstrstr(,<}}>,vl_cpos) vl_plus2=vstrstr(,<{{>,vl_cpos) IF vl_plus IF vl_plus2 AND (vl_plus2 LT vl_plus) vl_def_add=2 vl_plus=vl_plus2 ENDIF ELSE vl_def_add=2 vl_plus=vl_plus2 ENDIF ;;;;;; ÓÌÍÎÆÅÍÈÅ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vl_plus2=vstrstr(,<*>,vl_cpos) IF vl_plus IF vl_plus2 AND (vl_plus2 LT vl_plus) vl_def_add=3 vl_plus=vl_plus2 ENDIF ELSE vl_def_add=3 vl_plus=vl_plus2 ENDIF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IF vl_plus NE 0 ;ÍÀ ÑËÓ×ÀÉ ÁÎËÅÅ ×ÅÌ ÎÄÍÎÃÎ ÀÐÃÓÌÅÍÒÀ GOTO v1_many_args ENDIF vl_char2 SUBSTR ,vl_expr_len,1 IF vl_ph EQ 1 ;;ÅÑËÈ ÂÛÐÀÆÅÍÈÅ ÍÅ ÖÅËÈÊÎÌ Â ÑÊÎÁÊÀÕ IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ;;ÐÀÑÊÐÛÒÈÅ ÑÊÎÁÎÊ ____v_last_arg SUBSTR ,vl_cpos+1,(vl_expr_len-vl_cpos-1) vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add EQ 1 % movst vl_dest,____v_last_arg ELSE % v vl_dest=____v_last_arg ENDIF GOTO vl_exit ENDIF IF vl_ph EQ 2 ____v_last_arg SUBSTR ,vl_cpos+1 lea vl_dest,____v_last_arg GOTO vl_exit ENDIF ____v_last_arg SUBSTR ,vl_cpos vl_plus=vstrstr(<%____v_last_arg>,<~>)+vstrstr(<%____v_last_arg>,<|>)+vstrstr(<%____v_last_arg>,<^>) IF vl_plus EQ 0 AND ((OPATTR (____v_last_arg)) AND (VALID_REF)) % movst vl_dest,____v_last_arg GOTO vl_exit ENDIF % v vl_dest=____v_last_arg GOTO vl_exit :v1_many_args vl_char2 SUBSTR ,vl_plus-1,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-1-vl_cpos-1) vl_ph=vstrstr(<%____v_last_arg>,<|>)+vstrstr(<%____v_last_arg>,<^>) vl_ph=vl_ph+vstrstr(<%____v_last_arg>,< and >)+vstrstr(<%____v_last_arg>,<~>) vl_ph=vl_ph+vstrstr(<%____v_last_arg>,<}}>)+vstrstr(<%____v_last_arg>,<{{>) IF vl_ph % v vl_dest=____v_last_arg GOTO pre_vl_loop ENDIF vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add EQ 1 % movst vl_dest,____v_last_arg GOTO pre_vl_loop ENDIF % v vl_dest=____v_last_arg ELSEIF vl_ph EQ 2 ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-vl_cpos-1) lea vl_dest,____v_last_arg ELSE ____v_last_arg SUBSTR ,vl_cpos,(vl_plus-vl_cpos) vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add EQ 1 % movst vl_dest,____v_last_arg ELSE vl_add=((OPATTR (____v_last_arg)) AND (VALID_REF)) vl_ph=vstrstr(<%____v_last_arg>,<+>)+vstrstr(<%____v_last_arg>,<->) vl_ph=vl_ph+vstrstr(<%____v_last_arg>,< and >)+vstrstr(<%____v_last_arg>,<~>) vl_ph=vl_ph+vstrstr(<%____v_last_arg>,<|>)+vstrstr(<%____v_last_arg>,<^>) IF vl_ph OR (vl_add EQ 0) % v vl_dest=____v_last_arg ELSE % movst vl_dest,____v_last_arg ENDIF ENDIF ENDIF :pre_vl_loop vl_cpos=vl_plus+2 ;;ÌÅÑÒÎ ÍÀÇÍÀ×ÅÍÈß ÇÀÃÐÓÆÅÍÎ ÏÅÐÂÛÌ ÑËÀÃÀÅÌÛÌ IF vl_def_add EQ 3 vl_cpos=vl_cpos-1 ENDIF :vl_loop WHILE vl_cpos LE vl_expr_len ;;ÍÀ ÊÀÆÄÎÉ ÈÒÒÅÐÀÖÈÈ ÎÁÐÀÁÀÒÛÂÀÅÒÑß 1 ÀÐÃÓÌÅÍÒ vl_add=vl_def_add vl_ph=0 vl_char SUBSTR ,vl_cpos,1 IFIDN vl_char,<(> vl_ph=1 ENDIF IFIDN vl_char,<&> vl_ph=2 ENDIF IF vl_cpos GT vl_expr_len EXITM ENDIF vl_def_add=1 vl_plus=vstrstr(,<}}>,vl_cpos) vl_plus2=vstrstr(,<{{>,vl_cpos) IF vl_plus IF vl_plus2 AND (vl_plus2 LT vl_plus) vl_def_add=2 vl_plus=vl_plus2 ENDIF ELSE vl_def_add=2 vl_plus=vl_plus2 ENDIF ;;;;;; ÓÌÍÎÆÅÍÈÅ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vl_plus2=vstrstr(,<*>,vl_cpos) IF vl_plus IF vl_plus2 AND (vl_plus2 LT vl_plus) vl_def_add=3 vl_plus=vl_plus2 ENDIF ELSE vl_def_add=3 vl_plus=vl_plus2 ENDIF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IF vl_plus EQ 0 ;;ÎÁÐÀÁÎÒÊÀ ÏÎÑËÅÄÍÅÃÎ ÀÐÃÓÌÅÍÒÀ vl_char2 SUBSTR ,vl_expr_len,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ;ÐÀÑÊÐÛÒÈÅ ÑÊÎÁÎÊ ____v_last_arg SUBSTR ,vl_cpos+1,(vl_expr_len-vl_cpos-1) vl_ph=vstrstr(<%____v_last_arg>,<+>)+vstrstr(<%____v_last_arg>,<->) vl_ph=vl_ph+vstrstr(<%____v_last_arg>,< and >)+vstrstr(<%____v_last_arg>,<~>) vl_ph=vl_ph+vstrstr(<%____v_last_arg>,<|>)+vstrstr(<%____v_last_arg>,<^>) IF vl_ph EQ 0 IF vl_add EQ 1 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph shr vl_dest,____v_last_arg ENDIF ELSEIF vl_ph shr vl_dest,____v_last_arg ELSE % v cl=____v_last_arg shr vl_dest,cl ENDIF ELSEIF vl_add EQ 2 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph shl vl_dest,____v_last_arg ENDIF ELSEIF vl_ph shl vl_dest,____v_last_arg ELSE % v cl=____v_last_arg shl vl_dest,cl ENDIF ELSEIF vl_add EQ 3 imul vl_dest,____v_last_arg ENDIF ELSE vl_ph=vstrstr(<%____v_last_arg>,<|>)+vstrstr(<%____v_last_arg>,<^>) IF vl_ph IF vl_add EQ 1 % v cl=____v_last_arg shr vl_dest,cl ELSEIF vl_add EQ 2 % v cl=____v_last_arg shl vl_dest,cl ELSEIF vl_add EQ 3 imul vl_dest,____v_last_arg ENDIF ELSE vl_ph=vstrstr(<%____v_last_arg>,< and >) IF vl_ph IF vl_add EQ 1 % v4 cl=____v_last_arg shr vl_dest,cl ELSEIF vl_add EQ 2 % v4 cl=____v_last_arg shl vl_dest,cl ELSEIF vl_add EQ 3 imul vl_dest,____v_last_arg ENDIF ELSE vl_ph=vstrstr(<%____v_last_arg>,<~>) IF vl_ph IF vl_add EQ 1 % v4 cl=____v_last_arg shr vl_dest,cl ELSEIF vl_add EQ 2 % v4 cl=____v_last_arg shl vl_dest,cl ELSEIF vl_add EQ 3 imul vl_dest,____v_last_arg ENDIF GOTO mac_label1 ENDIF IF vl_add EQ 1 % v2 cl=____v_last_arg shr vl_dest,cl GOTO mac_label1 ENDIF IF vl_add EQ 2 % v2 cl=____v_last_arg shl vl_dest,cl GOTO mac_label1 ENDIF IF vl_add EQ 3 imul vl_dest,____v_last_arg ENDIF ENDIF ENDIF ENDIF :mac_label1 vl_cpos=vl_expr_len+1 GOTO v1_terminal ENDIF IF vl_ph EQ 2 ____v_last_arg SUBSTR ,(vl_cpos+1) lea rcx,____v_last_arg IF vl_add EQ 1 shr vl_dest,cl ELSEIF vl_add EQ 2 shl vl_dest,cl ELSEIF vl_add EQ 3 imul vl_dest,rcx ENDIF EXITM ENDIF ____v_last_arg SUBSTR ,vl_cpos IF vl_add EQ 1 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF (vl_add OR vl_ph) shr vl_dest,____v_last_arg ELSE % v cl=____v_last_arg shr vl_dest,cl ENDIF ELSEIF vl_add EQ 2 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF (vl_add OR vl_ph) shl vl_dest,____v_last_arg ELSE % v cl=____v_last_arg shl vl_dest,cl ENDIF ELSEIF vl_add EQ 3 imul vl_dest,____v_last_arg ENDIF EXITM ENDIF vl_char2 SUBSTR ,vl_plus-1,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ;;ÎÁÐÀÁÎÒÊÀ Î×ÅÐÅÄÍÎÃÎ ÀÐÃÓÌÅÍÒÀ ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-1-vl_cpos-1) IF vl_add EQ 1 vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add OR vl_ph shr vl_dest,____v_last_arg ELSE % v cl=____v_last_arg shr vl_dest,cl ENDIF ELSEIF vl_add EQ 2 vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add OR vl_ph shl vl_dest,____v_last_arg ELSE % v cl=____v_last_arg shl vl_dest,cl ENDIF ELSEIF vl_add EQ 3 imul vl_dest,____v_last_arg ENDIF ELSEIF vl_ph EQ 2 ____v_last_arg SUBSTR ,(vl_cpos+1),(vl_plus-vl_cpos) lea rcx,____v_last_arg IF vl_def_add EQ 1 shr vl_dest,cl ELSEIF vl_def_add EQ 2 shl vl_dest,cl ELSEIF vl_add EQ 3 imul vl_dest,rcx ENDIF ELSE ____v_last_arg SUBSTR ,vl_cpos,(vl_plus-vl_cpos) IF vl_add EQ 1 vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF (vl_add OR vl_ph) shr vl_dest,____v_last_arg ELSE % v cl=____v_last_arg shr vl_dest,cl ENDIF ELSEIF vl_add EQ 2 vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF (vl_add OR vl_ph) shl vl_dest,____v_last_arg ELSE % v cl=____v_last_arg shl vl_dest,cl ENDIF ELSEIF vl_add EQ 3 imul vl_dest,____v_last_arg ENDIF ENDIF vl_cpos=vl_plus+2 IF vl_def_add EQ 3 vl_cpos=vl_cpos-1 ENDIF :v1_terminal ENDM :vl_exit ENDM ;;ÑËÎÆÅÍÈÅ È ÂÛ×ÈÒÀÍÈÅ v2 MACRO vl_expr:VARARG LOCAL vl_def_add,vl_cpos,vl_expr_len,vl_dest,vl_plus vl_def_add=1 vl_expr_len SIZESTR vl_cpos=vstrstr(,<=>)+1 vl_dest SUBSTR ,1,(vl_cpos-2) vl_char SUBSTR ,(vl_cpos-2),1 IFIDN vl_char,<+> vl_dest SUBSTR ,1,(vl_cpos-3) GOTO vl_loop ENDIF IFIDN vl_char,<-> vl_dest SUBSTR ,1,(vl_cpos-3) vl_def_add=0 GOTO vl_loop ENDIF vl_add=vl_def_add ;;ÈÍÈÖÈÀËÈÇÀÖÈß ÌÅÑÒÀ ÍÀÇÍÀ×ÅÍÈß ÏÅÐÂÛÌ ÑËÀÃÀÅÌÛÌ ÈËÈ ÂÛ×ÈÒÀÅÌÛÌ vl_ph=0 WHILE vl_cpos LT vl_expr_len ;;ÏÎÈÑÊ ÑËÀÃÀÅÌÎÃÎ ÈËÈ ÂÛ×ÈÒÀÅÌÎÃÎ vl_char SUBSTR ,vl_cpos,1 IFIDN vl_char,<+> vl_cpos=vl_cpos+1 ELSEIFIDN vl_char,< > vl_cpos=vl_cpos+1 ELSEIFIDN vl_char,<-> vl_cpos=vl_cpos+1 vl_add=vl_add XOR 1 ELSE EXITM ENDIF ENDM IFIDN vl_char,<(> ;;ÂÛÐÀÆÅÍÈÅ Â ÑÊÎÁÊÀÕ vl_ph=1 ENDIF IFIDN vl_char,<&> vl_ph=2 ENDIF IF vl_cpos GT vl_expr_len GOTO vl_exit ENDIF vl_plus=vstrstr(,<+>,vl_cpos-1) vl_minus=vstrstr(,<->,vl_cpos-1) IF vl_plus EQ 0 vl_plus=vl_minus ELSEIF vl_minus NE 0 IF vl_plus GT vl_minus vl_plus=vl_minus ENDIF ENDIF IF vl_plus NE 0 ;ÍÀ ÑËÓ×ÀÉ ÎÄÍÎÃÎ ÀÐÃÓÌÅÍÒÀ GOTO v2_many_args ENDIF vl_char2 SUBSTR ,vl_expr_len,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF IF vl_ph EQ 1 vl_ph=vstrstr(,<}}>,vl_cpos-1)+vstrstr(,<{{>,vl_cpos-1) IF vl_ph EQ 0 vl_ph=1 ENDIF ENDIF ENDIF IF vl_ph EQ 1 ____v_last_arg SUBSTR ,vl_cpos+1,(vl_expr_len-vl_cpos-1) IF vl_add EQ 1 % v vl_dest=____v_last_arg GOTO vl_exit ENDIF % v vl_dest=____v_last_arg neg vl_dest GOTO vl_exit ENDIF IF vl_ph EQ 2 ____v_last_arg SUBSTR ,vl_cpos+1 lea vl_dest,____v_last_arg IF vl_add EQ 0 neg vl_dest ENDIF GOTO vl_exit ENDIF ____v_last_arg SUBSTR ,vl_cpos IF vl_add EQ 1 % v1 vl_dest=____v_last_arg GOTO vl_exit ENDIF vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add EQ 1 % movst vl_dest,-____v_last_arg ELSE % v1 vl_dest=____v_last_arg neg vl_dest ENDIF GOTO vl_exit :v2_many_args vl_char2 SUBSTR ,vl_plus-1,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-1-vl_cpos-1) IF vl_add EQ 1 % v vl_dest=____v_last_arg vl_cpos=vl_plus GOTO vl_loop ENDIF % v vl_dest=____v_last_arg neg vl_dest ELSEIF vl_ph EQ 2 ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-vl_cpos-1) lea vl_dest,____v_last_arg IF vl_add EQ 0 neg vl_dest ENDIF ELSE ____v_last_arg SUBSTR ,vl_cpos,(vl_plus-vl_cpos) IF vl_add EQ 1 vl_ph=vstrstr(<%____v_last_arg>,<}}>)+vstrstr(<%____v_last_arg>,<{{>) IF vl_ph % v1 vl_dest=____v_last_arg ELSE % movst vl_dest,____v_last_arg ENDIF ELSE vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add EQ 1 % movst vl_dest,-____v_last_arg ELSE % v1 vl_dest=____v_last_arg neg vl_dest ENDIF ENDIF ENDIF vl_cpos=vl_plus ;;ÌÅÑÒÎ ÍÀÇÍÀ×ÅÍÈß ÇÀÃÐÓÆÅÍÎ ÏÅÐÂÛÌ ÑËÀÃÀÅÌÛÌ :vl_loop WHILE vl_cpos LE vl_expr_len ;;ÍÀ ÊÀÆÄÎÉ ÈÒÒÅÐÀÖÈÈ ÏÐÈÁÀÂËßÅÒÑß 1 ÀÐÃÓÌÅÍÒ vl_add=vl_def_add vl_ph=0 WHILE vl_cpos LT vl_expr_len vl_char SUBSTR ,vl_cpos,1 IFIDN vl_char,<+> vl_cpos=vl_cpos+1 ELSEIFIDN vl_char,< > vl_cpos=vl_cpos+1 ELSEIFIDN vl_char,<-> vl_cpos=vl_cpos+1 vl_add=vl_add XOR 1 ELSE EXITM ENDIF ENDM IFIDN vl_char,<(> vl_ph=1 ENDIF IFIDN vl_char,<&> vl_ph=2 ENDIF IF vl_cpos GT vl_expr_len EXITM ENDIF vl_plus=vstrstr(,<+>,vl_cpos-1) vl_minus=vstrstr(,<->,vl_cpos-1) IF vl_plus EQ 0 vl_plus=vl_minus ELSEIF vl_minus NE 0 IF vl_plus GT vl_minus vl_plus=vl_minus ENDIF ENDIF IF vl_plus EQ 0 ;;ÎÁÐÀÁÎÒÊÀ ÏÎÑËÅÄÍÅÃÎ ÀÐÃÓÌÅÍÒÀ vl_char2 SUBSTR ,vl_expr_len,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ____v_last_arg SUBSTR ,vl_cpos+1,(vl_expr_len-vl_cpos-1) IF vl_add EQ 1 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph EQ 1 inc vl_dest ELSEIF vl_ph add vl_dest,____v_last_arg ENDIF ELSE % v2 vl_dest+=____v_last_arg ENDIF EXITM ENDIF vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph EQ 1 dec vl_dest ELSEIF vl_ph sub vl_dest,____v_last_arg ENDIF ELSE % v2 vl_dest-=____v_last_arg ENDIF EXITM ENDIF IF vl_ph EQ 2 ____v_last_arg SUBSTR ,(vl_cpos+1) IF ((OPATTR (____v_last_arg)) AND LABEL_EXPR) % movst [rsp-8],vl_dest lea vl_dest,____v_last_arg IF vl_add EQ 1 add vl_dest,[rsp-8] ELSE sub vl_dest,[rsp-8] neg vl_dest ENDIF ELSE IF vl_add EQ 1 lea vl_dest,____v_last_arg[vl_dest] ELSE % movst [rsp-8],vl_dest lea vl_dest,____v_last_arg sub vl_dest,[rsp-8] neg vl_dest ENDIF ENDIF EXITM ENDIF ____v_last_arg SUBSTR ,vl_cpos IF vl_add EQ 1 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph EQ 1 inc vl_dest ELSEIF vl_ph add vl_dest,____v_last_arg ENDIF ELSE vl_add=((OPATTR (____v_last_arg)) AND (VALID_REF)) vl_ph=vstrstr(<%____v_last_arg>,<}}>)+vstrstr(<%____v_last_arg>,<{{>) IF vl_add AND (vl_ph EQ 0) add vl_dest,____v_last_arg ELSE % v1 [rsp-8]=____v_last_arg add vl_dest,[rsp-8] ENDIF ENDIF ELSE vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph EQ 1 dec vl_dest ELSEIF vl_ph sub vl_dest,____v_last_arg ENDIF ELSE vl_add=((OPATTR (____v_last_arg)) AND (VALID_REF)) vl_ph=vstrstr(<%____v_last_arg>,<}}>)+vstrstr(<%____v_last_arg>,<{{>) IF vl_add AND (vl_ph EQ 0) sub vl_dest,____v_last_arg ELSE % v1 [rsp-8]=____v_last_arg sub vl_dest,[rsp-8] ENDIF ENDIF ENDIF EXITM ENDIF vl_char2 SUBSTR ,vl_plus-1,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ;;ÎÁÐÀÁÎÒÊÀ Î×ÅÐÅÄÍÎÃÎ ÀÐÃÓÌÅÍÒÀ ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-1-vl_cpos-1) IF vl_add EQ 1 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph EQ 1 inc vl_dest ELSEIF vl_ph add vl_dest,____v_last_arg ENDIF ELSE % v2 vl_dest+=____v_last_arg ENDIF ELSE vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph EQ 1 dec vl_dest ELSEIF vl_ph sub vl_dest,____v_last_arg ENDIF ELSE % v2 vl_dest-=____v_last_arg ENDIF ENDIF ELSEIF vl_ph EQ 2 ____v_last_arg SUBSTR ,(vl_cpos+1),(vl_plus-vl_cpos-1) IF ((OPATTR (____v_last_arg)) AND LABEL_EXPR) % movst [rsp-8],vl_dest lea vl_dest,____v_last_arg IF vl_add EQ 1 add vl_dest,[rsp-8] ELSE sub vl_dest,[rsp-8] neg vl_dest ENDIF ELSE IF vl_add EQ 1 lea vl_dest,____v_last_arg[vl_dest] ELSE % movst [rsp-8],vl_dest lea vl_dest,____v_last_arg sub vl_dest,[rsp-8] neg vl_dest ENDIF ENDIF ELSE ____v_last_arg SUBSTR ,vl_cpos,(vl_plus-vl_cpos) IF vl_add EQ 1 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph EQ 1 inc vl_dest ELSEIF vl_ph add vl_dest,____v_last_arg ENDIF ELSE vl_add=((OPATTR (____v_last_arg)) AND (VALID_REF)) vl_ph=vstrstr(<%____v_last_arg>,<}}>)+vstrstr(<%____v_last_arg>,<{{>) IF vl_add AND (vl_ph EQ 0) add vl_dest,____v_last_arg ELSE % v1 [rsp-8]=____v_last_arg add vl_dest,[rsp-8] ENDIF ENDIF ELSE vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph EQ 1 dec vl_dest ELSEIF vl_ph sub vl_dest,____v_last_arg ENDIF ELSE vl_add=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF vl_add sub vl_dest,____v_last_arg ELSE % v1 [rsp-8]=____v_last_arg sub vl_dest,[rsp-8] ENDIF ENDIF ENDIF ENDIF vl_cpos=vl_plus ENDM :vl_exit ENDM ;ÇÄÅÑÜ ÈÍÂÅÐÑÈß ~ NotCount MACRO vl_expr:VARARG ____vl_expr_len SIZESTR ____not_count=0 ____vl_expr_pos=1 WHILE ____vl_expr_pos LE ____vl_expr_len ____not_count_char SUBSTR ,____vl_expr_pos,1 IFIDN ____not_count_char,<~> ____not_count=____not_count+1 ELSEIFDIF ____not_count_char,< > EXITM ENDIF ____vl_expr_pos=____vl_expr_pos+1 ENDM ENDM ;ÇÄÅÑÜ ËÎÃÈ×ÅÑÊÎÅ È and v4 MACRO vl_expr:VARARG LOCAL vl_def_add,vl_cpos,vl_expr_len,vl_dest,vl_plus vl_def_add=1 vl_expr_len SIZESTR vl_cpos=vstrstr(,<=>)+1 vl_dest SUBSTR ,1,(vl_cpos-2) vl_char SUBSTR ,(vl_cpos-2),1 IFIDN vl_char,<&> vl_dest SUBSTR ,1,(vl_cpos-3) GOTO vl_loop ENDIF vl_add=vl_def_add ;;ÈÍÈÖÈÀËÈÇÀÖÈß ÌÅÑÒÀ ÍÀÇÍÀ×ÅÍÈß ÏÅÐÂÛÌ ÀÐÃÓÌÅÍÒÎÌ vl_ph=0 vl_char SUBSTR ,vl_cpos,1 ;;ÏÎÈÑÊ ÀÐÃÓÌÅÍÒÀ IFIDN vl_char,<(> ;;ÂÛÐÀÆÅÍÈÅ Â ÑÊÎÁÊÀÕ vl_ph=1 ENDIF IFIDN vl_char,<&> vl_ph=2 ENDIF IF vl_cpos GT vl_expr_len GOTO vl_exit ENDIF vl_plus=vstrstr(,< and >,vl_cpos-1) IF vl_plus NE 0 ;ÍÀ ÑËÓ×ÀÉ ÎÄÍÎÃÎ ÀÐÃÓÌÅÍÒÀ GOTO v4_many_args ENDIF vl_char2 SUBSTR ,vl_expr_len,1 IF vl_ph EQ 1 ;;ÅÑËÈ ÂÛÐÀÆÅÍÈÅ ÍÅ ÖÅËÈÊÎÌ Â ÑÊÎÁÊÀÕ IFDIF vl_char2,<)> vl_ph=0 ENDIF IF vl_ph EQ 1 vl_ph=vstrstr(,<}}>,vl_cpos-1)+vstrstr(,<{{>,vl_cpos-1) IF vl_ph EQ 0 vl_ph=1 ENDIF ENDIF ENDIF IF vl_ph EQ 1 ;;ÐÀÑÊÐÛÒÈÅ ÑÊÎÁÎÊ ____v_last_arg SUBSTR ,vl_cpos+1,(vl_expr_len-vl_cpos-1) vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add EQ 1 % movst vl_dest,____v_last_arg ELSE % v vl_dest=____v_last_arg ENDIF GOTO vl_exit ENDIF ;; IF vl_ph EQ 2 ;; ____v_last_arg SUBSTR ,vl_cpos+1 ;; lea vl_dest,____v_last_arg ;; GOTO vl_exit ;; ENDIF ____v_last_arg SUBSTR ,vl_cpos vl_plus=vstrstr(<%____v_last_arg>,<~>)+vstrstr(<%____v_last_arg>,<|>)+vstrstr(<%____v_last_arg>,<^>) vl_plus=vl_plus+vstrstr(<%____v_last_arg>,<{>)+vstrstr(<%____v_last_arg>,<}>) vl_plus=vl_plus+vstrstr(<%____v_last_arg>,<+>)+vstrstr(<%____v_last_arg>,<->) IF vl_plus NE 0 GOTO v4_call_v2 ENDIF IF vl_ph EQ 2 GOTO v4_call_v2 ENDIF vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add % movst vl_dest,____v_last_arg GOTO vl_exit ENDIF :v4_call_v2 NotCount %____v_last_arg IF ____vl_expr_pos GT 1 ____v_last_arg SUBSTR ____v_last_arg,____vl_expr_pos ENDIF IF ____not_count AND 1 % v2 vl_dest=____v_last_arg not vl_dest GOTO vl_exit ENDIF % v2 vl_dest=____v_last_arg GOTO vl_exit :v4_many_args vl_char2 SUBSTR ,vl_plus-1,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-1-vl_cpos-1) vl_ph=vstrstr(<%____v_last_arg>,<|>)+vstrstr(<%____v_last_arg>,<^>)+vstrstr(<%____v_last_arg>,<~>) vl_ph=vl_ph+vstrstr(<%____v_last_arg>,<{{>)+vstrstr(<%____v_last_arg>,<}}>) IF vl_ph % v vl_dest=____v_last_arg GOTO pre_vl_loop ENDIF vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add EQ 1 % movst vl_dest,____v_last_arg ELSE % v vl_dest=____v_last_arg ENDIF ELSEIF vl_ph EQ 2 ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-vl_cpos-1) lea vl_dest,____v_last_arg GOTO pre_vl_loop ENDIF ____v_last_arg SUBSTR ,vl_cpos,(vl_plus-vl_cpos) vl_ph=vstrstr(<%____v_last_arg>,<}}>)+vstrstr(<%____v_last_arg>,<~>) IF vl_ph NE 0 GOTO v4_call_v ENDIF vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add EQ 1 % movst vl_dest=____v_last_arg GOTO pre_vl_loop ENDIF :v4_call_v % v vl_dest=____v_last_arg :pre_vl_loop vl_cpos=vl_plus+5 ;;ÌÅÑÒÎ ÍÀÇÍÀ×ÅÍÈß ÇÀÃÐÓÆÅÍÎ ÏÅÐÂÛÌ ÑËÀÃÀÅÌÛÌ :vl_loop WHILE vl_cpos LE vl_expr_len ;;ÍÀ ÊÀÆÄÎÉ ÈÒÒÅÐÀÖÈÈ ÏÐÈÁÀÂËßÅÒÑß 1 ÀÐÃÓÌÅÍÒ vl_add=vl_def_add vl_ph=0 vl_char SUBSTR ,vl_cpos,1 IFIDN vl_char,<(> vl_ph=1 ENDIF IFIDN vl_char,<&> vl_ph=2 ENDIF IF vl_cpos GT vl_expr_len EXITM ENDIF vl_plus=vstrstr(,< and >,vl_cpos-1) IF vl_plus EQ 0 ;;ÎÁÐÀÁÎÒÊÀ ÏÎÑËÅÄÍÅÃÎ ÀÐÃÓÌÅÍÒÀ vl_char2 SUBSTR ,vl_expr_len,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ;ÐÀÑÊÐÛÒÈÅ ÑÊÎÁÎÊ ____v_last_arg SUBSTR ,vl_cpos+1,(vl_expr_len-vl_cpos-1) vl_ph=vstrstr(<%____v_last_arg>,<|>)+vstrstr(<%____v_last_arg>,<^>) IF vl_ph EQ 0 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph and vl_dest,____v_last_arg ENDIF ELSEIF vl_ph and vl_dest,____v_last_arg ELSE % v [rsp-8]=____v_last_arg and vl_dest,[rsp-8] ENDIF ELSE % v [rsp-8]=____v_last_arg and vl_dest,[rsp-8] ENDIF EXITM ENDIF IF vl_ph EQ 2 ____v_last_arg SUBSTR ,(vl_cpos+1) % movst [rsp-8],vl_dest lea vl_dest,____v_last_arg and vl_dest,[rsp-8] EXITM ENDIF ____v_last_arg SUBSTR ,vl_cpos vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF (vl_add OR vl_ph) and vl_dest,____v_last_arg ELSE NotCount %____v_last_arg IF ____vl_expr_pos GT 1 ____v_last_arg SUBSTR <%____v_last_arg>,____vl_expr_pos ENDIF IF ____not_count AND 1 % v2 [rsp-8]=____v_last_arg not qptr [rsp-8] ELSE % v2 [rsp-8]=____v_last_arg ENDIF and vl_dest,[rsp-8] ENDIF EXITM ENDIF vl_char2 SUBSTR ,vl_plus-1,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ;;ÎÁÐÀÁÎÒÊÀ Î×ÅÐÅÄÍÎÃÎ ÀÐÃÓÌÅÍÒÀ ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-1-vl_cpos-1) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add OR vl_ph and vl_dest,____v_last_arg ELSE % v vl_dest|=____v_last_arg ENDIF ELSEIF vl_ph EQ 2 ____v_last_arg SUBSTR ,(vl_cpos+1),(vl_plus-vl_cpos) % movst [rsp-8],vl_dest lea vl_dest,____v_last_arg and vl_dest,[rsp-8] ELSE ____v_last_arg SUBSTR ,vl_cpos,(vl_plus-vl_cpos) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF (vl_add OR vl_ph) and vl_dest,____v_last_arg ELSE NotCount %____v_last_arg IF ____vl_expr_pos GT 1 ____v_last_arg SUBSTR <%____v_last_arg>,____vl_expr_pos ENDIF IF ____not_count AND 1 % v2 [rsp-8]=____v_last_arg not qptr [rsp-8] ELSE % v2 [rsp-8]=____v_last_arg ENDIF and vl_dest,[rsp-8] ENDIF ENDIF vl_cpos=vl_plus+5 ENDM :vl_exit ENDM v MACRO vl_expr:VARARG LOCAL vl_def_add,vl_cpos,vl_expr_len,vl_dest,vl_plus vl_def_add=1 vl_expr_len SIZESTR vl_cpos=vstrstr(,<=>)+1 vl_dest SUBSTR ,1,(vl_cpos-2) vl_char SUBSTR ,(vl_cpos-2),1 IFIDN vl_char,<|> vl_dest SUBSTR ,1,(vl_cpos-3) GOTO vl_loop ENDIF IFIDN vl_char,<^> vl_dest SUBSTR ,1,(vl_cpos-3) vl_def_add=0 GOTO vl_loop ENDIF vl_add=vl_def_add ;;ÈÍÈÖÈÀËÈÇÀÖÈß ÌÅÑÒÀ ÍÀÇÍÀ×ÅÍÈß ÏÅÐÂÛÌ ÑËÀÃÀÅÌÛÌ ÈËÈ ÂÛ×ÈÒÀÅÌÛÌ vl_ph=0 vl_char SUBSTR ,vl_cpos,1 IFIDN vl_char,<(> ;;ÂÛÐÀÆÅÍÈÅ Â ÑÊÎÁÊÀÕ vl_ph=1 ENDIF IFIDN vl_char,<&> vl_ph=2 ENDIF IF vl_cpos GT vl_expr_len GOTO vl_exit ENDIF vl_plus=vstrstr(,<|>,vl_cpos-1) vl_minus=vstrstr(,<^>,vl_cpos-1) IF vl_plus EQ 0 vl_plus=vl_minus ELSEIF vl_minus NE 0 IF vl_plus GT vl_minus vl_plus=vl_minus ENDIF ENDIF IF vl_plus NE 0 ;ÍÀ ÑËÓ×ÀÉ ÎÄÍÎÃÎ ÀÐÃÓÌÅÍÒÀ GOTO v_many_args ENDIF vl_char2 SUBSTR ,vl_expr_len,1 IF vl_ph EQ 1 ;;ÅÑËÈ ÂÛÐÀÆÅÍÈÅ ÍÅ ÖÅËÈÊÎÌ Â ÑÊÎÁÊÀÕ IFDIF vl_char2,<)> vl_ph=0 ENDIF IF vl_ph EQ 1 vl_ph=vstrstr(,<}}>,vl_cpos-1)+vstrstr(,<{{>,vl_cpos-1) IF vl_ph EQ 0 vl_ph=1 ENDIF ENDIF ENDIF IF vl_ph EQ 1 ____v_last_arg SUBSTR ,vl_cpos+1,(vl_expr_len-vl_cpos-1) % v vl_dest=____v_last_arg GOTO vl_exit ENDIF ;; IF vl_ph EQ 2 ;; ____v_last_arg SUBSTR ,vl_cpos+1 ;; lea vl_dest,____v_last_arg ;; GOTO vl_exit ;; ENDIF ____v_last_arg SUBSTR ,vl_cpos % v4 vl_dest=____v_last_arg GOTO vl_exit :v_many_args vl_char2 SUBSTR ,vl_plus-1,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph NE 1 GOTO v_is_vl_ph_2 ENDIF ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-1-vl_cpos-1) % v vl_dest=____v_last_arg GOTO v_pre_vl_loop :v_is_vl_ph_2 IF vl_ph EQ 2 ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-vl_cpos-1) lea vl_dest,____v_last_arg GOTO v_pre_vl_loop ENDIF ____v_last_arg SUBSTR ,vl_cpos,(vl_plus-vl_cpos) % v4 vl_dest=____v_last_arg :v_pre_vl_loop vl_cpos=vl_plus ;;ÌÅÑÒÎ ÍÀÇÍÀ×ÅÍÈß ÇÀÃÐÓÆÅÍÎ ÏÅÐÂÛÌ ÑËÀÃÀÅÌÛÌ :vl_loop WHILE vl_cpos LE vl_expr_len ;;ÍÀ ÊÀÆÄÎÉ ÈÒÒÅÐÀÖÈÈ ÏÐÈÁÀÂËßÅÒÑß 1 ÀÐÃÓÌÅÍÒ vl_add=vl_def_add vl_ph=0 WHILE vl_cpos LT vl_expr_len vl_char SUBSTR ,vl_cpos,1 IFIDN vl_char,<|> vl_cpos=vl_cpos+1 ELSEIFIDN vl_char,< > vl_cpos=vl_cpos+1 ELSEIFIDN vl_char,<^> vl_cpos=vl_cpos+1 vl_add=vl_add XOR 1 ELSE EXITM ENDIF ENDM IFIDN vl_char,<(> vl_ph=1 ENDIF IFIDN vl_char,<&> vl_ph=2 ENDIF IF vl_cpos GT vl_expr_len EXITM ENDIF vl_plus=vstrstr(,<|>,vl_cpos-1) vl_minus=vstrstr(,<^>,vl_cpos-1) IF vl_plus EQ 0 vl_plus=vl_minus ELSEIF vl_minus NE 0 IF vl_plus GT vl_minus vl_plus=vl_minus ENDIF ENDIF IF vl_plus EQ 0 ;;ÎÁÐÀÁÎÒÊÀ ÏÎÑËÅÄÍÅÃÎ ÀÐÃÓÌÅÍÒÀ vl_char2 SUBSTR ,vl_expr_len,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ;ÐÀÑÊÐÛÒÈÅ ÑÊÎÁÎÊ ____v_last_arg SUBSTR ,vl_cpos+1,(vl_expr_len-vl_cpos-1) vl_ph=vstrstr(%____v_last_arg,<|>)+vstrstr(%____v_last_arg,<^>) IF vl_add EQ 1 IF vl_ph EQ 0 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph or vl_dest,____v_last_arg ENDIF ELSEIF vl_ph or vl_dest,____v_last_arg ELSE % v vl_dest|=____v_last_arg ENDIF ELSE % v vl_dest|=____v_last_arg ENDIF EXITM ENDIF IF vl_ph EQ 0 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph xor vl_dest,____v_last_arg ENDIF ELSEIF vl_ph xor vl_dest,____v_last_arg ELSE % v vl_dest^=____v_last_arg ENDIF ELSE % v vl_dest^=____v_last_arg ENDIF EXITM ENDIF IF vl_ph EQ 2 ____v_last_arg SUBSTR ,(vl_cpos+1) % movst [rsp-8],vl_dest lea vl_dest,____v_last_arg IF vl_add EQ 1 or vl_dest,[rsp-8] ELSE xor [rsp-8],vl_dest % movst vl_dest,[rsp-8] ENDIF EXITM ENDIF ____v_last_arg SUBSTR ,vl_cpos IF vl_add EQ 1 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph or vl_dest,____v_last_arg ENDIF ELSEIF vl_ph or vl_dest,____v_last_arg ELSE % v4 [rsp-8]=____v_last_arg or vl_dest,[rsp-8] ENDIF ELSE vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph xor vl_dest,____v_last_arg ENDIF ELSEIF vl_ph xor vl_dest,____v_last_arg ELSE % v4 [rsp-8]=____v_last_arg xor vl_dest,[rsp-8] ENDIF ENDIF EXITM ENDIF vl_char2 SUBSTR ,vl_plus-1,1 IF vl_ph EQ 1 IFDIF vl_char2,<)> vl_ph=0 ENDIF ENDIF IF vl_ph EQ 1 ;;ÎÁÐÀÁÎÒÊÀ Î×ÅÐÅÄÍÎÃÎ ÀÐÃÓÌÅÍÒÀ ____v_last_arg SUBSTR ,vl_cpos+1,(vl_plus-1-vl_cpos-1) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF vl_add EQ 1 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph or vl_dest,____v_last_arg ENDIF ELSEIF vl_ph or vl_dest,____v_last_arg ELSE % v vl_dest|=____v_last_arg ENDIF ELSE vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph xor vl_dest,____v_last_arg ENDIF ELSEIF vl_ph xor vl_dest,____v_last_arg ELSE % v vl_dest^=____v_last_arg ENDIF ENDIF ELSEIF vl_ph EQ 2 ____v_last_arg SUBSTR ,(vl_cpos+1),(vl_plus-vl_cpos) % movst [rsp-8],vl_dest lea vl_dest,____v_last_arg IF vl_add EQ 1 or vl_dest,[rsp-8] ELSE xor [rsp-8],vl_dest % movst vl_dest,[rsp-8] ENDIF ELSE ____v_last_arg SUBSTR ,vl_cpos,(vl_plus-vl_cpos) vl_ph=((OPATTR (____v_last_arg)) AND (VALID_REF)) IF vl_add EQ 1 vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph or vl_dest,____v_last_arg ENDIF ELSEIF vl_ph or vl_dest,____v_last_arg ELSE % v4 [rsp-8]=____v_last_arg or vl_dest,[rsp-8] ENDIF ELSE vl_add=((OPATTR (____v_last_arg)) EQ (VALID_REF OR IMM_EXPR)) IF vl_add vl_ph=@CatStr(%(____v_last_arg)) IF vl_ph xor vl_dest,____v_last_arg ENDIF ELSEIF vl_ph xor vl_dest,____v_last_arg ELSE % v4 [rsp-8]=____v_last_arg xor vl_dest,[rsp-8] ENDIF ENDIF ENDIF vl_cpos=vl_plus ENDM :vl_exit ENDM PreTestCond0 TEXTEQU <> PreTestCond1 TEXTEQU <> PreTestCond2 TEXTEQU <> PreTestCond3 TEXTEQU <> PreTestCond4 TEXTEQU <> PreTestCond5 TEXTEQU <> PreTestCond6 TEXTEQU <> PreTestCond7 TEXTEQU <> PreTestCond8 TEXTEQU <> PreTestCond9 TEXTEQU <> PreTestCond10 TEXTEQU <> PreTestCond11 TEXTEQU <> PreTestCond12 TEXTEQU <> PreTestCond13 TEXTEQU <> PreTestCond14 TEXTEQU <> PreTestCond15 TEXTEQU <> PreTestCond16 TEXTEQU <> PreTestCond17 TEXTEQU <> PreTestCond18 TEXTEQU <> PreTestCond19 TEXTEQU <> .for MACRO PreLoopAction,args,PreTestCondAction:VARARG v PreLoopAction SaveUntilCondsLabel IFDIF , jmp LastUntilConds ENDIF SaveUntilOutLabel SaveUntilLabel LastUntilLabel: while_cnt=while_cnt+1 IF while_cnt EQ 1 WhileLevel0 TEXTEQU PreTestCond0 TEXTEQU wcond0l SIZESTR ELSEIF while_cnt EQ 2 WhileLevel1 TEXTEQU PreTestCond1 TEXTEQU wcond1l SIZESTR ELSEIF while_cnt EQ 3 WhileLevel2 TEXTEQU PreTestCond2 TEXTEQU wcond2l SIZESTR ELSEIF while_cnt EQ 4 WhileLevel3 TEXTEQU PreTestCond3 TEXTEQU wcond3l SIZESTR ELSEIF while_cnt EQ 5 WhileLevel4 TEXTEQU PreTestCond4 TEXTEQU wcond4l SIZESTR ELSEIF while_cnt EQ 6 WhileLevel5 TEXTEQU PreTestCond5 TEXTEQU wcond5l SIZESTR ELSEIF while_cnt EQ 7 WhileLevel6 TEXTEQU PreTestCond6 TEXTEQU wcond6l SIZESTR ELSEIF while_cnt EQ 8 WhileLevel7 TEXTEQU PreTestCond7 TEXTEQU wcond7l SIZESTR ELSEIF while_cnt EQ 9 WhileLevel8 TEXTEQU PreTestCond8 TEXTEQU wcond8l SIZESTR ELSEIF while_cnt EQ 10 WhileLevel9 TEXTEQU PreTestCond9 TEXTEQU wcond9l SIZESTR ELSEIF while_cnt EQ 11 WhileLevel10 TEXTEQU PreTestCond10 TEXTEQU wcond10l SIZESTR ELSEIF while_cnt EQ 12 WhileLevel11 TEXTEQU PreTestCond11 TEXTEQU wcond11l SIZESTR ELSEIF while_cnt EQ 13 WhileLevel12 TEXTEQU PreTestCond12 TEXTEQU wcond12l SIZESTR ELSEIF while_cnt EQ 14 WhileLevel13 TEXTEQU PreTestCond13 TEXTEQU wcond13l SIZESTR ELSEIF while_cnt EQ 15 WhileLevel14 TEXTEQU PreTestCond14 TEXTEQU wcond14l SIZESTR ELSEIF while_cnt EQ 16 WhileLevel15 TEXTEQU PreTestCond15 TEXTEQU wcond15l SIZESTR ELSEIF while_cnt EQ 17 WhileLevel16 TEXTEQU PreTestCond16 TEXTEQU wcond16l SIZESTR ELSEIF while_cnt EQ 18 WhileLevel17 TEXTEQU PreTestCond17 TEXTEQU wcond17l SIZESTR ELSEIF while_cnt EQ 19 WhileLevel18 TEXTEQU PreTestCond18 TEXTEQU wcond18l SIZESTR ELSEIF while_cnt EQ 20 WhileLevel19 TEXTEQU PreTestCond19 TEXTEQU wcond19l SIZESTR ELSE .err ENDIF EXITM<> ENDM .endf MACRO IF while_cnt EQ 1 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 2 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 3 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 4 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 5 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 6 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 7 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 8 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 9 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 10 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 11 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 12 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 13 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 14 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 15 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 16 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 17 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 18 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 19 % FOR parm, v parm ENDM ELSEIF while_cnt EQ 20 % FOR parm, v parm ENDM ENDIF GetUntilCondsLabel LastUntilConds: DelUntilCondsLabel GetUntilLabel IF (while_cnt EQ 1) AND (wcond0l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel0 ELSEIF (while_cnt EQ 2) AND (wcond1l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel1 ELSEIF (while_cnt EQ 3) AND (wcond2l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel2 ELSEIF (while_cnt EQ 4) AND (wcond3l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel3 ELSEIF (while_cnt EQ 5) AND (wcond4l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel4 ELSEIF (while_cnt EQ 6) AND (wcond5l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel5 ELSEIF (while_cnt EQ 7) AND (wcond6l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel6 ELSEIF (while_cnt EQ 8) AND (wcond7l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel7 ELSEIF (while_cnt EQ 9) AND (wcond8l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel8 ELSEIF (while_cnt EQ 10) AND (wcond9l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel9 ELSEIF (while_cnt EQ 11) AND (wcond10l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel10 ELSEIF (while_cnt EQ 12) AND (wcond11l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel11 ELSEIF (while_cnt EQ 13) AND (wcond12l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel12 ELSEIF (while_cnt EQ 14) AND (wcond13l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel13 ELSEIF (while_cnt EQ 15) AND (wcond14l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel14 ELSEIF (while_cnt EQ 16) AND (wcond15l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel15 ELSEIF (while_cnt EQ 17) AND (wcond16l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel16 ELSEIF (while_cnt EQ 18) AND (wcond17l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel17 ELSEIF (while_cnt EQ 19) AND (wcond18l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel18 ELSEIF (while_cnt EQ 20) AND (wcond19l GT 0) % J_POLY_COND LastUntilLabel,TRUE,WhileLevel19 ENDIF DelUntilLabel GetUntilOutLabel LastUntilOutLabel: DelUntilOutLabel while_cnt=while_cnt-1 ENDM