Subversion Repositories Kolibri OS

Rev

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