Subversion Repositories Kolibri OS

Rev

Rev 2132 | 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.     mcall 23, 500
  41.  
  42.     cmp eax, 0
  43.     je exit
  44.     cmp eax, 1
  45.     je red
  46.     cmp eax, 2
  47.     je key
  48.     cmp eax, 3
  49.     je button
  50.    
  51.    
  52.  
  53.  
  54.  
  55.   button:                         ; button event handler
  56.     mov     al, 17               ;   get button identifier
  57.     mcall
  58.  
  59.     cmp     ah, 1
  60.     jne     still        ;   return if button id != 1
  61.  
  62.     call exit
  63.  
  64.   key:                              ; key event handler
  65.     mov     al, 2                 ;   get key code
  66.     mcall
  67.  
  68.     jmp     still
  69.  
  70.   exit:
  71.     mcall -1
  72.  
  73. ;---------------------------------------------------------------------
  74. ;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
  75. ;---------------------------------------------------------------------
  76.  
  77. draw_window:
  78.  
  79. mcall 12, 1                    ; функция 12: сообщить ОС об отрисовке окна
  80.                                    
  81. mcall 14, 4 ;получим ширину экрана
  82. shr eax, 16
  83. and eax,0x0000FFFF
  84. sub eax,300 ;отнимем от нее 300
  85. shl eax, 16 ;и превратим в координаты окна по оси X
  86. add eax,300
  87. mov ebx, eax
  88.  
  89. mov eax, 0 ;и выведем это окно
  90. mov ecx, 30 ;высотой 25 пикс
  91. mov edx, 0x41000000 ;черного цвета и без заголовка
  92. mov esi, 0x01000000
  93. mcall
  94.  
  95. ;вывод сеточки  
  96. mov eax, 1 ;функция вывода точки
  97. mov edx, 0 ;черного цвета
  98. mov ecx, 30 ;высота окна - 30 пкс
  99. mov esi, 0 ;счетчик сдвига сетки
  100.  
  101. drawx: ;рисование линии
  102. sub ecx, 1 ;уменьшаем счетчик линий
  103. cmp ecx, 0 ;закончились линии?
  104. je fin ;значит, хватит рисовать
  105. mov ebx, 300 ;иначе - у нас ширина сетки 300 пкс
  106. cmp esi,1 ;имелся ли сдвиг сетки в прошлой линии?
  107. je sw;если да, то перейдем к sw
  108. mov esi,1 ;иначе - сдвиг был выключен, включим сдвиг
  109. jmp drawy ;перейдем к рисованию
  110.  
  111. sw:
  112. mov esi,0 ;выключаем сдвиг сетки
  113.  
  114. drawy: ;рисование
  115. sub ebx, 2 ;ставить точки будем через одну
  116. cmp ebx, 0 ;дорисовали ли мы линию?
  117. je drawx ;если да, то переходим к новой
  118. sub ebx, esi ;применяем сдвиг
  119. mcall ;рисуем
  120. add ebx, esi ;возвращаем счетчик на место
  121. jmp drawy ;рисуем новую точку
  122.  
  123. fin: ;дорисовали
  124.  
  125. mcall 4, <3, 12>, 0x80000000, I_PARAM, 0 ;тень за текстом
  126. mcall  , <5, 12>
  127. mcall  , <4, 11>
  128. mcall  , <4, 13>
  129. mcall  , <4, 12>, 0x80EFEFEF ;текст
  130.  
  131.  
  132.     mcall 12, 2                    ; конец рисования
  133.                                
  134.  
  135.     ret                            ; выходим из процедуры
  136.  
  137.  
  138. ;---------------------------------------------------------------------
  139. ;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
  140. ;---------------------------------------------------------------------
  141.  
  142. I_PARAM    rb 256
  143.  
  144. I_END:                             ; метка конца программы
  145.