Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. ;
  3. ;   @notify, pop-up windows
  4. ;   by Sourcerer, 20.01.2011
  5. ;  
  6. ;---------------------------------------------------------------------
  7.  
  8.   use32              ; включить 32-битный режим ассемблера
  9.   org    0x0         ; адресация с нуля
  10.  
  11.   db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
  12.   dd     0x01        ; версия заголовка (всегда 1)
  13.   dd     START       ; адрес первой команды
  14.   dd     I_END       ; размер программы
  15.   dd     0x1000      ; количество памяти
  16.   dd     0x1000      ; адрес вершины стэка
  17.   dd     I_PARAM         ; адрес буфера для параметров
  18.   dd     0x0         ; зарезервировано
  19.  
  20.  
  21. include 'macros.inc' ;
  22.  
  23. ;---------------------------------------------------------------------
  24. ;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
  25. ;---------------------------------------------------------------------
  26.  
  27. START:
  28.  
  29. red:                    ; перерисовать окно
  30.  
  31.     call draw_window    ; вызываем процедуру отрисовки окна
  32.  
  33. ;---------------------------------------------------------------------
  34. ;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
  35. ;---------------------------------------------------------------------
  36.  
  37.  
  38.  
  39.  still:                      ; main cycle
  40.     mov     eax, 23
  41.     mov ebx, 500
  42.     mcall
  43.  
  44.     cmp eax, 0
  45.     je exit
  46.     cmp eax, 1
  47.     je red
  48.     cmp eax, 2
  49.     je key
  50.     cmp eax, 3
  51.     je button
  52.    
  53.    
  54.  
  55.  
  56.  
  57.   button:                         ; button event handler
  58.     mov     al, 17               ;   get button identifier
  59.     mcall
  60.  
  61.     cmp     ah, 1
  62.     jne     still        ;   return if button id != 1
  63.  
  64.     or      eax, -1               ;   exit application
  65.     mcall
  66.  
  67.   key:                              ; key event handler
  68.     mov     al, 2                 ;   get key code
  69.     mcall
  70.  
  71.     jmp     still
  72.  
  73.   exit:
  74.     mcall -1
  75.  
  76. ;---------------------------------------------------------------------
  77. ;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
  78. ;---------------------------------------------------------------------
  79.  
  80. draw_window:
  81.  
  82. mcall 12, 1                    ; функция 12: сообщить ОС об отрисовке окна
  83.                                    
  84. mov eax,14 ;получим ширину экрана
  85. mov ebx, 4
  86. mcall
  87. shr eax, 16
  88. and eax,0x0000FFFF
  89. sub eax,300 ;отнимем от нее 300
  90. shl eax, 16 ;и превратим в координаты окна по оси X
  91. add eax,300
  92. mov ebx, eax
  93.  
  94. mov eax, 0 ;и выведем это окно
  95. mov ecx, 30 ;высотой 25 пикс
  96. mov edx, 0x41000000 ;черного цвета и без заголовка
  97. mov esi, 0x01000000
  98. mcall
  99.  
  100. ;вывод сеточки  
  101. mov eax, 1 ;функция вывода точки
  102. mov edx, 0 ;черного цвета
  103. mov ecx, 30 ;высота окна - 30 пкс
  104. mov esi, 0 ;счетчик сдвига сетки
  105.  
  106. drawx: ;рисование линии
  107. sub ecx, 1 ;уменьшаем счетчик линий
  108. cmp ecx, 0 ;закончились линии?
  109. je fin ;значит, хватит рисовать
  110. mov ebx, 300 ;иначе - у нас ширина сетки 300 пкс
  111. cmp esi,1 ;имелся ли сдвиг сетки в прошлой линии?
  112. je sw;если да, то перейдем к sw
  113. mov esi,1 ;иначе - сдвиг был выключен, включим сдвиг
  114. jmp drawy ;перейдем к рисованию
  115.  
  116. sw:
  117. mov esi,0 ;выключаем сдвиг сетки
  118.  
  119. drawy: ;рисование
  120. sub ebx, 2 ;ставить точки будем через одну
  121. cmp ebx, 0 ;дорисовали ли мы линию?
  122. je drawx ;если да, то переходим к новой
  123. sub ebx, esi ;применяем сдвиг
  124. mcall ;рисуем
  125. add ebx, esi ;возвращаем счетчик на место
  126. jmp drawy ;рисуем новую точку
  127.  
  128. fin: ;дорисовали
  129.  
  130. mcall 4, <3, 12>, 0x80000000, I_PARAM, 0 ;тень за текстом
  131. mcall 4, <5, 12>, 0x80000000, I_PARAM, 0 ;
  132. mcall 4, <4, 11>, 0x80000000, I_PARAM, 0 ;
  133. mcall 4, <4, 13>, 0x80000000, I_PARAM, 0 ;
  134.  mcall 4, <4, 12>, 0x80EFEFEF, I_PARAM, 0 ;текст
  135.  
  136.  
  137.     mcall 12, 2                    ; конец рисования
  138.                                
  139.  
  140.     ret                            ; выходим из процедуры
  141.  
  142.  
  143. ;---------------------------------------------------------------------
  144. ;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
  145. ;---------------------------------------------------------------------
  146.  
  147. I_PARAM    rb 256
  148.  
  149. I_END:                             ; метка конца программы
  150.