Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ; EYES FOR MENUET
  3. ;
  4. ; Written by Nikita Lesnikov (nlo_one@mail.ru)
  5. ;
  6. ; Position of "eyes" is fixed. To close "eyes" just click on them.
  7. ;
  8. ; NOTE: quite big timeout is used to disable blinking when redrawing.
  9. ; If "eyes" blink on your system, enlarge the TIMEOUT. If not, you can
  10. ; decrease it due to more realistic movement.
  11. ;
  12.  
  13. TIMEOUT equ 5
  14.  
  15. ; EXECUTABLE HEADER
  16.  
  17. use32
  18.  
  19.   org 0x0
  20.   db "MENUET01"
  21.   dd 0x01
  22.   dd ENTRANCE
  23.   dd EYES_END
  24.   dd 0x3000
  25.   dd 0x3000
  26.   dd 0x0
  27.   dd 0x0
  28.  
  29. include 'macros.inc'
  30. ENTRANCE: ; start of code
  31.  
  32. ; ==== main ====
  33.  
  34. call prepare_eyes
  35.  
  36. call shape_window
  37.  
  38. still:
  39.  
  40. call draw_eyes                   ; draw those funny "eyes"
  41.  
  42. mov eax,23                       ; wait for event with timeout
  43. mov ebx,TIMEOUT
  44. int 0x40
  45.  
  46. cmp eax,1                        ; redraw ?
  47. jnz  no_draw
  48. call redraw_overlap
  49. no_draw:
  50.  
  51. cmp eax,2                        ; key ?
  52. jz  key
  53.  
  54. cmp eax,3                        ; button ?
  55. jz  button
  56.  
  57. jmp still                        ; loop
  58.  
  59. ; EVENTS
  60.  
  61. key:
  62. mov eax,2        ; just read and ignore
  63. int 0x40
  64. jmp still
  65.  
  66. button:          ; analyze button
  67. mov eax,-1       ; this is button 1 - we have only one button :-)
  68. int 0x40
  69. jmp still
  70.  
  71. ; -====- declarations -====-
  72.  
  73. imagedata equ EYES_END
  74. skindata  equ EYES_END+925
  75. winref    equ EYES_END+6325
  76.  
  77. ; -====- shape -====-
  78.  
  79. shape_window:
  80.  
  81. mov eax,50                   ; set up shape reference area
  82. mov ebx,0
  83. mov ecx,winref
  84. int 0x40
  85.  
  86. ret
  87.  
  88. ; -====- redrawing -====-
  89.  
  90. draw_eyes:                   ; check mousepos to disable blinking
  91.  
  92. mov eax,37
  93. xor ebx,ebx
  94. int 0x40
  95. cmp dword [mouse],eax
  96. jne redraw_ok
  97. ret
  98. redraw_ok:
  99. mov [mouse],eax
  100.  
  101. redraw_overlap:              ; label for redraw event (without checkmouse)
  102.  
  103. mov eax,12
  104. mov ebx,1
  105. int 0x40
  106.  
  107. xor eax,eax                  ; define window
  108. mov ebx,[win_ebx]
  109. mov ecx,[win_ecx]
  110. xor edx,edx
  111. xor esi,esi
  112. xor edi,edi
  113. int 0x40
  114.  
  115. mov eax,8                    ; define closebutton
  116. mov ebx,60
  117. mov ecx,45
  118. mov edx,1
  119. int 0x40
  120.  
  121. mov eax,7
  122. mov ebx,skindata
  123. mov ecx,60*65536+30
  124. mov edx,15
  125. int 0x40
  126.  
  127. mov eax,15
  128. mov ebx,30
  129. call draw_eye_point
  130. add eax,30
  131. call draw_eye_point
  132.  
  133. mov eax,12
  134. mov ebx,2
  135. int 0x40
  136.  
  137. ret
  138.  
  139. draw_eye_point:          ; draw eye point (EAX=X, EBX=Y)
  140. pusha
  141.  
  142. mov ecx, [mouse]    ; ecx = mousex, edx = mousey
  143. mov edx,ecx
  144. shr ecx,16
  145. and edx,0xFFFF
  146.  
  147. ; ===> calculate position
  148.  
  149. push eax
  150. push ebx
  151. mov byte [sign1],0
  152. mov esi, [win_ebx]
  153. shr esi,16
  154. add eax,esi
  155. sub ecx,eax                 ; ECX=ECX-EAX (signed) , ECX=|ECX|
  156. jnc abs_ok_1
  157. neg ecx
  158. mov byte [sign1],1
  159. abs_ok_1:
  160. mov [temp1],ecx
  161. mov byte [sign2],0
  162. mov esi,[win_ecx]
  163. shr esi,16
  164. add ebx,esi
  165. sub edx,ebx                 ; EDX=EDX-EBX (signed) , EDX=|EDX|
  166. jnc abs_ok_2
  167. neg edx
  168. mov byte [sign2],1
  169. abs_ok_2:
  170. mov [temp2],edx
  171. pop ebx
  172. pop eax
  173.  
  174. push eax                    ; ECX*=ECX
  175. push edx
  176. xor eax,eax
  177. xor edx,edx
  178. mov ax,cx
  179. mul cx
  180. shl edx,16
  181. or  eax,edx
  182. mov ecx,eax
  183. pop edx
  184. pop eax
  185.  
  186. push eax                    ; EDX*=EDX
  187. push ecx
  188. mov  ecx,edx
  189. xor  eax,eax
  190. xor  edx,edx
  191. mov  ax,cx
  192. mul  cx
  193. shl  edx,16
  194. or   eax,edx
  195. mov  edx,eax
  196. pop  ecx
  197. pop  eax
  198.  
  199. push ebx
  200. push ecx
  201. push edx
  202. push eax
  203. mov  ebx,ecx                 ; EBX=ECX+EDX
  204. add  ebx,edx
  205. xor  edi,edi                 ; ESI=SQRT(EBX)
  206. mov  ecx,edi
  207. mov  edx,edi
  208. inc  edi
  209. mov  eax,edi
  210. inc  edi
  211. sqrt_loop:
  212. add  ecx,eax
  213. add  eax,edi
  214. inc  edx
  215. cmp  ecx,ebx
  216. jbe  sqrt_loop
  217. dec  edx
  218. mov  esi,edx
  219. mov  ax,si                   ; ESI=ESI/7
  220. mov  dl,7
  221. div  dl
  222. and  ax,0xFF
  223. mov  si,ax                   ; ESI ? 0 : ESI=1
  224. jnz  nozeroflag1
  225. mov  si,1
  226. nozeroflag1:
  227.  
  228. pop eax
  229. pop edx
  230. pop ecx
  231. pop ebx
  232.  
  233. push eax                     ; ECX=[temp1]/ESI
  234. push edx
  235. mov  eax,[temp1]
  236. mov  dx,si
  237. div  dl
  238. mov  cl,al
  239. and  ecx,0xFF
  240. pop  edx
  241. pop  eax
  242.  
  243. cmp  byte [sign1],1
  244. je   subtract_1
  245. add  eax,ecx                  ; EAX=EAX+ECX
  246. jmp  calc_ok_1
  247. subtract_1:
  248. sub  eax,ecx                  ; EAX=EAX-ECX
  249. calc_ok_1:
  250.  
  251. push eax                      ; EDX=[temp2]/ESI
  252. push ecx
  253. mov  eax,[temp2]
  254. mov  dx,si
  255. div  dl
  256. mov  dl,al
  257. and  dx,0xFF
  258. pop  ecx
  259. pop  eax
  260.  
  261. cmp  byte [sign2],1
  262. je   subtract_2
  263. add  ebx,edx                  ; EBX=EBX+EDX
  264. jmp  calc_ok_2
  265. subtract_2:
  266. sub  ebx,edx                  ; EBX=EBX-EDX
  267. calc_ok_2:
  268.  
  269. ; <===
  270.  
  271. mov ecx,ebx         ; draw point
  272. mov ebx,eax
  273. mov eax,13
  274. dec ecx
  275. dec ecx
  276. dec ebx
  277. dec ebx
  278. shl ecx,16
  279. add ecx,4
  280. shl ebx,16
  281. add ebx,4
  282. mov eax,13
  283. xor edx,edx
  284. int 0x40
  285.  
  286. popa
  287. ret
  288.  
  289. ; -====- working on images and window -====-
  290.  
  291. prepare_eyes:
  292.  
  293. ;mov eax,6            ; load EYES.RAW
  294. ;mov ebx,graphix
  295. ;mov ecx,0x00000000
  296. ;mov edx,0xFFFFFFFF
  297. ;mov esi,imagedata
  298. ;int 0x40
  299. ;cmp eax,0xFFFFFFFF
  300. ;jnz filefound
  301.  
  302. ;mov eax,-1           ; file not exists...
  303. ;int 0x40
  304.  
  305. ;filefound:
  306. mov esi,imagedata+25 ; transform grayscale to putimage format
  307. mov edi,skindata
  308. mov ecx,30
  309. transform_loop:
  310. push ecx
  311. mov  ecx,30
  312. lp1:
  313. lodsb
  314. stosb
  315. stosb
  316. stosb
  317. loop lp1
  318. sub esi,30
  319. mov  ecx,30
  320. lp2:
  321. lodsb
  322. stosb
  323. stosb
  324. stosb
  325. loop lp2
  326. pop  ecx
  327. loop transform_loop
  328.  
  329. mov eax,14           ; calculating screen position
  330. int 0x40
  331. shr eax,1
  332. mov ax,59
  333. sub eax,30*65536
  334. mov [win_ebx],eax
  335. mov [win_ecx],dword 10*65536+44
  336.  
  337. mov esi,imagedata+25 ; calculate shape reference area
  338. mov edi,winref
  339. mov ecx,900          ; disable drag bar
  340. mov al,0
  341. rep stosb
  342.  
  343. mov ecx,30           ; calculate circles for eyes
  344. shape_loop:
  345. push ecx
  346.  
  347. call copy_line       ; duplicate (we have two eyes :)
  348. sub  esi,30
  349. call copy_line
  350.  
  351. pop  ecx
  352. loop shape_loop
  353.  
  354. ret
  355.  
  356. copy_line:       ; copy single line to shape reference area
  357. mov ecx,30
  358. cpl_loop:
  359. lodsb
  360. cmp al,0xFF
  361. jnz  set_one
  362. mov al,0
  363. jmp cpl_ok
  364. set_one:
  365. mov al,1
  366. cpl_ok:
  367. stosb
  368. loop cpl_loop
  369. ret
  370.  
  371. ; DATA
  372.  
  373. ; environment
  374.  
  375. win_ebx  dd     0x0
  376. win_ecx  dd     0x0
  377. mouse    dd     0xFFFFFFFF
  378. ;graphix  db     "EYES.RAW    "
  379.  
  380. ; temporary storage for math routines
  381.  
  382. temp1    dd     0
  383. temp2    dd     0
  384. sign1    db     0
  385. sign2    db     0
  386.  
  387. EYES_END: ; end of code
  388. file "EYES.RAW"
  389.