Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;-----------------------------------------------------------------------------
  2. TokenEnd       = 1
  3. TokenReg       = 2
  4. TokenHex       = 3
  5. TokenOr        = 4
  6. TokenAnd       = 5
  7. TokenXor       = 6
  8. TokenAdd       = 7
  9. TokenSub       = 8
  10. TokenMul       = 9
  11. TokenDiv       = 10
  12. TokenLP        = 11
  13. TokenRP        = 12
  14. TokenErr       = -1
  15. ;-----------------------------------------------------------------------------
  16. RegTable:
  17.         db 2,'al',0
  18.         db 2,'cl',1
  19.         db 2,'dl',2
  20.         db 2,'bl',3
  21.         db 2,'ah',4
  22.         db 2,'ch',5
  23.         db 2,'dh',6
  24.         db 2,'bh',7
  25.         db 2,'ax',8
  26.         db 2,'cx',9
  27.         db 2,'dx',10
  28.         db 2,'bx',11
  29.         db 2,'sp',12
  30.         db 2,'bp',13
  31.         db 2,'si',14
  32.         db 2,'di',15
  33.         db 3,'eax',16
  34.         db 3,'ecx',17
  35.         db 3,'edx',18
  36.         db 3,'ebx',19
  37.         db 3,'esp',20
  38.         db 3,'ebp',21
  39.         db 3,'esi',22
  40.         db 3,'edi',23
  41.         db 3,'eip',24
  42.         db 0
  43. ;-----------------------------------------------------------------------------
  44. ;                   Check if byte is hex digit
  45. IsHexDigit:
  46.         cmp     al,'0'
  47.         jb      .No
  48.         cmp     al,'9'
  49.         jbe     .09
  50.         cmp     al,'A'
  51.         jb      .No
  52.         cmp     al,'F'
  53.         jbe     .AF
  54.         cmp     al,'a'
  55.         jb      .No
  56.         cmp     al,'f'
  57.         jbe     .FA
  58.     .No:
  59.         stc
  60.         ret
  61.     .09:
  62.         sub     al,'0'
  63. ;       clc
  64.         ret
  65.     .AF:
  66.         sub     al,'A'-10
  67. ;       clc
  68.         ret
  69.     .FA:
  70.         sub     al,'a'-10
  71. ;       clc
  72.         ret
  73.  
  74. ;-----------------------------------------------------------------------------
  75. ;                      Find register in the table
  76. FindReg:
  77.         mov     edi,RegTable
  78.     .FindReg:
  79.         movzx   ecx,byte [edi]
  80.         stc
  81.         jecxz   .RegNotFound
  82.         inc     edi
  83.         push    esi edi ecx
  84.     @@:
  85.         lodsb
  86.         or      al,20h
  87.         scasb
  88.         loopz   @B
  89.         pop     ecx edi esi
  90.         lea     edi,[edi+ecx+1]
  91.         jnz     .FindReg
  92.         movzx   edi,byte [edi-1]
  93.         add     esi,ecx
  94.     .RegNotFound:
  95.         ret
  96.  
  97. ;-----------------------------------------------------------------------------
  98. ;                      Tokenize expressions
  99. ExprGetToken:
  100.         lodsb
  101.         cmp     al,0
  102.         jz      .EndToken
  103.         cmp     al,' '
  104.         jbe     ExprGetToken
  105.         cmp     al,'|'
  106.         jz      .Or
  107.         cmp     al,'&'
  108.         jz      .And
  109.         cmp     al,'^'
  110.         jz      .Xor
  111.         cmp     al,'+'
  112.         jz      .Add
  113.         cmp     al,'-'
  114.         jz      .Sub
  115.         cmp     al,'*'
  116.         jz      .Mul
  117.         cmp     al,'/'
  118.         jz      .Div
  119.         cmp     al,'('
  120.         jz      .LP
  121.         cmp     al,')'
  122.         jnz     .NotSign
  123.     .RP:
  124.         mov     al,TokenRP
  125.         ret
  126.     .Or:
  127.         mov     al,TokenOr
  128.         ret
  129.     .And:
  130.         mov     al,TokenAnd
  131.         ret
  132.     .Xor:
  133.         mov     al,TokenXor
  134.         ret
  135.     .Div:
  136.         mov     al,TokenDiv
  137.         ret
  138.     .EndToken:
  139.         mov     al,TokenEnd
  140.         ret
  141.     .Add:
  142.         mov     al,TokenAdd
  143.         ret
  144.     .Sub:
  145.         mov     al,TokenSub
  146.         ret
  147.     .Mul:
  148.         mov     al,TokenMul
  149.         ret
  150.     .LP:
  151.         mov     al,TokenLP
  152.         ret
  153.     .NotSign:
  154.         dec     esi
  155.         call    FindReg
  156.         jc      .RegNotFound
  157.         mov     al,TokenReg
  158.         ret
  159.     .RegNotFound:
  160.     ; test for symbol
  161.         push    esi
  162.     @@:
  163.         lodsb
  164.         cmp     al,' '
  165.         ja      @B
  166.         push    eax
  167.         mov     byte [esi],0
  168.         xchg    esi,[esp+4]
  169.         call    FindSymbolName
  170.         mov     edi,eax
  171.         pop     eax
  172.         xchg    esi,[esp]
  173.         mov     byte [esi],al
  174.         jc      @F
  175.         add     esp,4
  176.         mov     al,TokenHex
  177.         ret
  178.     @@:
  179.         pop     esi
  180.     ; test for hex number
  181.         xor     ecx,ecx
  182.         xor     edi,edi
  183.         xor     eax,eax
  184.     @@:
  185.         lodsb
  186.         call    IsHexDigit
  187.         jc      @F
  188.         shl     edi,4
  189.         or      edi,eax
  190.         inc     ecx
  191.         jmp     @B
  192.     @@:
  193.         dec     esi
  194.         jecxz   .Err
  195.         cmp     ecx,8
  196.         ja      .Err
  197.         mov     al,TokenHex
  198.         ret
  199.     .Err:
  200.         mov     al,TokenErr
  201.         mov     esi,aParseError
  202.         ret
  203.  
  204. ;-----------------------------------------------------------------------------
  205. ExprRead2:
  206.         cmp     al,TokenHex
  207.         jz      .Hex
  208.         cmp     al,TokenReg
  209.         jz      .Reg
  210.         cmp     al,TokenLP
  211.         jz      .LP
  212.         mov     al,TokenErr
  213.         mov     esi,aParseError
  214.         ret
  215.     .Hex:
  216.         mov     ebp,edi
  217.     .Ret:
  218.         jmp     ExprGetToken
  219.     .Reg:
  220.         cmp     edi,24
  221.         jz      .EIP
  222.         sub     edi,4
  223.         jb      .8LO
  224.         sub     edi,4
  225.         jb      .8HI
  226.         sub     edi,8
  227.         jb      .16
  228.         mov     ebp,[_EAX+edi*4]
  229.         jmp     .Ret
  230.     .16:
  231.         movzx   ebp,word [_EAX+(edi+8)*4]
  232.         jmp     .Ret
  233.     .8LO:
  234.         movzx   ebp,byte [_EAX+(edi+4)*4]
  235.         jmp     .Ret
  236.     .8HI:
  237.         movzx   ebp,byte [_EAX+(edi+4)*4+1]
  238.         jmp     .Ret
  239.     .EIP:
  240.         mov     ebp,[_EIP]
  241.         jmp     .Ret
  242.     .LP:
  243.         call    ExprGetToken
  244.         call    ExprRead0
  245.         cmp     al,TokenErr
  246.         jz      @F
  247.         cmp     al,TokenRP
  248.         jz      ExprGetToken
  249.         mov     al,TokenErr
  250.         mov     esi,aParseError
  251.     @@:
  252.         ret
  253.  
  254. ;-----------------------------------------------------------------------------
  255. ExprRead1:
  256.         call    ExprRead2
  257.     .1:
  258.         cmp     al,TokenMul
  259.         jz      .Mul
  260.         cmp     al,TokenDiv
  261.         jz      .Div
  262.         ret
  263.     .Mul:
  264.         push    ebp
  265.         call    ExprGetToken
  266.         call    ExprRead2
  267.         pop     edx
  268.     ; ebp := edx*ebp
  269.         imul    ebp,edx
  270.         jmp     .1
  271.     .Div:
  272.         push    ebp
  273.         call    ExprGetToken
  274.         call    ExprRead2
  275.         pop     edx
  276.     ; ebp := edx/ebp
  277.         test    ebp,ebp
  278.         jz      .Div0
  279.         push    eax
  280.         xor     eax,eax
  281.         xchg    eax,edx
  282.         div     ebp
  283.         xchg    eax,ebp
  284.         pop     eax
  285.         jmp     .1
  286.     .Div0:
  287.         mov     al,TokenErr
  288.         mov     esi,aDivByZero
  289.         ret
  290.  
  291. ;-----------------------------------------------------------------------------
  292. ExprRead0:
  293.         xor     ebp,ebp
  294.         cmp     al,TokenOr
  295.         jz      .Or
  296.         cmp     al,TokenAnd
  297.         jz      .And
  298.         cmp     al,TokenXor
  299.         jz      .Xor
  300.         cmp     al,TokenAdd
  301.         jz      .Add
  302.         cmp     al,TokenSub
  303.         jz      .Sub
  304.         call    ExprRead1
  305.     .1:
  306.         cmp     al,TokenOr
  307.         jz      .Or
  308.         cmp     al,TokenAnd
  309.         jz      .And
  310.         cmp     al,TokenXor
  311.         jz      .Xor
  312.         cmp     al,TokenAdd
  313.         jz      .Add
  314.         cmp     al,TokenSub
  315.         jz      .Sub
  316.         ret
  317.     .Or:
  318.         push    ebp
  319.         call    ExprGetToken
  320.         call    ExprRead1
  321.         pop     edx
  322.     ; ebp := edx | ebp
  323.         or      ebp,edx
  324.         jmp     .1
  325.     .And:
  326.         push    ebp
  327.         call    ExprGetToken
  328.         call    ExprRead1
  329.         pop     edx
  330.     ; ebp := edx & ebp
  331.         and     ebp,edx
  332.         jmp     .1
  333.     .Xor:
  334.         push    ebp
  335.         call    ExprGetToken
  336.         call    ExprRead1
  337.         pop     edx
  338.     ; ebp := edx ^ ebp
  339.         xor     ebp,edx
  340.         jmp     .1
  341.     .Add:
  342.         push    ebp
  343.         call    ExprGetToken
  344.         call    ExprRead1
  345.         pop     edx
  346.     ; ebp := edx+ebp
  347.         add     ebp,edx
  348.         jmp     .1
  349.     .Sub:
  350.         push    ebp
  351.         call    ExprGetToken
  352.         call    ExprRead1
  353.         pop     edx
  354.     ; ebp := edx-ebp
  355.         xchg    edx,ebp
  356.         sub     ebp,edx
  357.         jmp     .1
  358.  
  359. ;-----------------------------------------------------------------------------
  360. ; in: esi->expression
  361. ; out: CF=1 if error
  362. ;      CF=0 and ebp=value if ok
  363. CalcExpression:
  364.         call    ExprGetToken
  365.         call    ExprRead0
  366.         cmp     al,TokenEnd
  367.         jz      .End
  368.         cmp     al,TokenErr
  369.         jz      @F
  370.         mov     esi,aParseError
  371.     @@:
  372.         call    PutMessage
  373.         stc
  374.         ret
  375.     .End:
  376.         clc
  377.         ret
  378.  
  379. GetArg:
  380.         lodsb
  381.         cmp     al,' '
  382.         ja      GetArg
  383.         mov     byte [esi-1],0
  384.         cmp     al,0
  385.         jnz     .SkipSpaces
  386.         dec     esi
  387.  
  388.     .SkipSpaces:
  389.         lodsb
  390.         cmp     al,0
  391.         jz      @F
  392.         cmp     al,' '
  393.         jbe     .SkipSpaces
  394.     @@:
  395.         dec     esi
  396.         ret
  397.