Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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