Subversion Repositories Kolibri OS

Rev

Rev 317 | Rev 551 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;      hex2dec2bin 0.2 by Alexei Ershov    ;;
  2. ;;      16.11.2006                          ;;
  3.  
  4.   use32              ; âêëþ÷èòü 32-áèòíûé ðåæèì àññåìáëåðà
  5.   org    0x0         ; àäðåñàöèÿ ñ íóëÿ
  6.  
  7.   db     'MENUET01'  ; 8-áàéòíûé èäåíòèôèêàòîð MenuetOS
  8.   dd     0x01        ; âåðñèÿ çàãîëîâêà (âñåãäà 1)
  9.   dd     START       ; àäðåñ ïåðâîé êîìàíäû
  10.   dd     I_END       ; ðàçìåð ïðîãðàììû
  11.   dd     0x1000      ; êîëè÷åñòâî ïàìÿòè
  12.   dd     0x1000      ; àäðåñ âåðøèíû ñòýêà
  13.   dd     0x0         ; àäðåñ áóôåðà äëÿ ïàðàìåòðîâ (íå èñïîëüçóåòñÿ)
  14.   dd     0x0         ; çàðåçåðâèðîâàíî
  15.  
  16. include '..\..\..\MACROS.INC' ; ìàêðîñû îáëåã÷àþò æèçíü àññåìáëåðùèêîâ!
  17.  
  18.  
  19. START:
  20. red:
  21.  
  22.     call draw_window
  23.  
  24. still:
  25.     mcall 10            ; ôóíêöèÿ 10 - æäàòü ñîáûòèÿ
  26.  
  27.     cmp  eax,1          ; ïåðåðèñîâàòü îêíî ?
  28.     je   red            ; åñëè äà - íà ìåòêó red
  29.     cmp  eax,2          ; íàæàòà êëàâèøà ?
  30.     je   key            ; åñëè äà - íà key
  31.     cmp  eax,3          ; íàæàòà êíîïêà ?
  32.     je   button         ; åñëè äà - íà button
  33.  
  34.     jmp  still          ; åñëè äðóãîå ñîáûòèå - â íà÷àëî öèêëà
  35.  
  36. ;---------------------------------------------------------------------
  37.  
  38.  key:                  ; íàæàòà êëàâèøà íà êëàâèàòóðå
  39.     mov   eax, 2
  40.     mcall
  41.     mov   edi, [index]
  42.     cmp   edi, string1
  43.     jz    no_back
  44.  
  45.     cmp   ah, 8
  46.     jnz   no_back
  47.  
  48.     dec   edi
  49.     mov   byte [edi], ' '
  50.     mov   [index], edi
  51.     call  Draw_String
  52.     jmp   still
  53. no_back:
  54.     cmp   ah, 13
  55.     jz    read_str
  56.  
  57.     cmp   edi, string1_end
  58.     jae   still
  59.     mov   al, ah
  60.     stosb
  61.     mov   [index], edi
  62.     call  Draw_String
  63.     jmp  still          ; âåðíóòüñÿ ê íà÷àëó öèêëà
  64.  
  65. read_str:
  66.     dec   edi
  67.     mov   esi, string1
  68.  
  69.     call  GetBase
  70.  
  71.     xor   ecx, ecx
  72.     inc   ecx           ; ecx = 1
  73.  
  74. make_bin:
  75.     xor   eax, eax
  76.  
  77. next_digit:
  78.     xor   edx, edx
  79.     cmp   edi, esi
  80.     jb    .done
  81.  
  82.     mov   dl, [edi]
  83.     cmp   dl, '-'
  84.     jne   @f
  85.     neg   eax
  86.     jmp   .done
  87. @@:
  88.     cmp   dl, 'F'
  89.     jbe   @f
  90.     and   dl, 11011111b
  91. @@:
  92.     sub   dl, '0'
  93.     cmp   dl, 9
  94.     jbe   @f
  95.     sub   dl, 'A'-'9'-1
  96. @@:
  97.     cmp   dl, bl
  98.     jb    @f
  99.     ; Çäåñü îáðàáîòàòü îøèáêó
  100.  
  101.     jmp   .done
  102. @@:
  103.     push  ecx
  104.     xchg  eax, ecx
  105.     mul   edx ;        edx:eax = eax * edx
  106.     add   ecx, eax
  107.     pop   eax
  108.     mul   ebx
  109.     xchg  eax, ecx
  110.     dec   edi
  111.     jmp   next_digit
  112.  
  113. .done:
  114.    mov    [num], eax    ; ñîõðàíÿåì ââåäåííîå ÷èñëî
  115.    xor    eax, eax
  116.    mov    al, ' '
  117.    mov    edi, string1
  118.    mov    [index], edi
  119.    mov    ecx, string1_end-string1
  120.    rep    stosb         ; ñòèðàåì ââåäåííóþ ñòðîêó
  121.    jmp    red
  122.  
  123. ;---------------------------------------------------------------------
  124.  
  125.   button:
  126.     mcall 17            ; 17 - ïîëó÷èòü èäåíòèôèêàòîð íàæàòîé êíîïêè
  127.     cmp   ah, 1         ; åñëè ÍÅ íàæàòà êíîïêà ñ íîìåðîì 1,
  128.     jne   @f
  129.     mcall -1
  130. @@:
  131.     cmp   ah, 2
  132.     jne   @f
  133.     shl   [num], 1
  134.     jmp   red
  135. @@:
  136.     cmp   ah, 3
  137.     jne   @f
  138.     shr   [num], 1
  139.     jmp   red
  140. @@:
  141.     cmp   ah, 4
  142.     jne   still
  143.     sar   [num], 1
  144.     jmp   red
  145.  
  146. ;------------------------------------------------
  147.     draw_window:
  148. ;------------------------------------------------
  149.     mcall 12, 1
  150.     mcall 0, 200*65536+300, 200*65536+175, 0x13AABBCC,,title
  151.  
  152.     mcall  8, 15      *65536+ 38, 90*65536+ 15, 2, 0x6688DD ; êíîïêà shl
  153.     mcall  ,                   ,110*65536+ 15,  ,          ; êíîïêà sal
  154.     mcall  , (300-53)*65536+ 38, 90*65536+ 15, 3,          ; êíîïêà shr
  155.     mcall  ,                   ,110*65536+ 15, 4,          ; êíîïêà sar
  156.  
  157.     mcall  4, 15*65536+30,   0x80000000, binstr,
  158.     mcall  , 15*65536+44,   , decstr,
  159.     mcall  , 15*65536+58,   ,sdecstr,
  160.     mcall  , 15*65536+72,   , hexstr,
  161.     mcall  , 15*65536+150,  , numstr,
  162.  
  163.     mcall  ,       25*65536+93,0x10000000,shlstr,3
  164.     mcall  , (300-43)*65536+93,         , shrstr,
  165.     mcall  ,       25*65536+113,        , salstr,
  166.     mcall  , (300-43)*65536+113,        , sarstr,
  167.     mov    ecx, [num]
  168.  
  169.     mcall  47, 8*65536+256,,240*65536+72,0    ; 16-íàÿ
  170.     mcall    , 10*65536,   ,228*65536+44,     ; 10-íàÿ
  171.     mcall    , 8*65536+512,,240*65536+30,     ; 2-íàÿ
  172.     ror    ecx, 8
  173.     mcall    ,            ,,(240-56)*65536+30,
  174.     ror    ecx, 8
  175.     mcall    ,            ,,(240-56*2)*65536+30,
  176.     ror    ecx, 8
  177.     mcall    ,            ,,(240-56*3)*65536+30,
  178.     ror    ecx, 8
  179.     mov    [minus], '+'
  180.     jnc    @f
  181.     mov    [minus], '-'
  182.     neg    ecx
  183. @@:
  184.     mcall   ,  10*65536,,228*65536+58,        ; 10-íàÿ ñî çíàêîì
  185.     mcall  4, 222*65536+58, 0, minus, 1
  186.     mcall 38, 15*65536+300-15, 137*65536+137, 0x006688DD
  187.     call   Draw_String
  188.     mcall 12, 2                    ; ôóíêöèÿ 12: ñîîáùèòü ÎÑ îá îòðèñîâêå îêíà
  189.  
  190. ret
  191.  
  192. ;-------------------------------------------------
  193.     Draw_String:
  194. ;-------------------------------------------------
  195.  
  196.      mcall   4, 60*65536+150, 0x40A40473, \
  197.              string1,string1_end-string1,0x00AABBCC
  198.      ret
  199.  
  200. ;-------------------------------------------------
  201.     GetBase:
  202. ;-------------------------------------------------
  203.     mov   ebx, 10
  204.     cmp   edi, esi
  205.     jb    .done
  206.  
  207.     mov   al, [edi]
  208.     cmp   al, 'H'
  209.     jbe   @f
  210.     and   al, 11011111b
  211. @@:
  212.     cmp   al, 'H'
  213.     jne   @f
  214.     mov   ebx, 16
  215.     dec   edi
  216.     jmp   .done
  217.  
  218. @@:
  219.     cmp   al, 'D'
  220.     jne   @f
  221.     mov   ebx, 10
  222.     dec   edi
  223.     jmp   .done
  224.  
  225. @@:
  226.     cmp   al, 'B'
  227.     jne   .done
  228.     mov   ebx, 2
  229.     dec   edi
  230.  
  231. .done:
  232. ret
  233.  
  234. ;-------------------------------------------------
  235. string1:
  236.   db  34 dup(' ')
  237. string1_end:
  238.   index dd string1
  239.   num   dd  0
  240.  
  241.  
  242.  title db 'hex2dec2bin 0.2',0
  243.  minus  db '-'
  244.  numstr db 'Number:',0
  245.  hexstr db 'hex:',0
  246.  binstr db 'bin:',0
  247.  decstr db 'dec:',0
  248. sdecstr db 'signed dec:',0
  249.  shlstr db 'shl'
  250.  salstr db 'sal'
  251.  shrstr db 'shr'
  252.  sarstr db 'sar'
  253.  
  254. I_END:                             ; ìåòêà êîíöà ïðîãðàììû
  255.