Subversion Repositories Kolibri OS

Rev

Rev 1747 | Blame | Last modification | View Log | Download | RSS feed

  1. ;------------------------------------------------------------------------------
  2. ;   @SS - screensaver
  3. ;------------------------------------------------------------------------------
  4. ; last update:  30/03/2012
  5. ; changed by:   Marat Zakiyanov aka Mario79, aka Mario
  6. ; changes:      The program uses only 4 Kb memory is now.
  7. ;               Code refactoring. Using transparent cursor.
  8. ;               Fix bug - using lots of buttons from f.8.
  9. ;---------------------------------------------------------------------
  10. ;   SCREENSAVER APPLICATION by lisovin@26.ru
  11. ;
  12. ;   Compile with FASM for Menuet
  13. ;
  14. ;------------------------------------------------------------------------------
  15.         use32
  16.         org 0x0
  17.  
  18.         db 'MENUET01'   ; 8 byte id
  19.         dd 0x01         ; header version
  20.         dd START        ; start of code
  21.         dd IM_END       ; size of image
  22.         dd I_END        ; memory for app
  23.         dd stack_top    ; esp
  24.         dd 0x0          ; I_Param
  25.         dd 0x0          ; path
  26. ;------------------------------------------------------------------------------
  27. include 'lang.inc'
  28. include '..\..\..\macros.inc'
  29. ;include   'debug.inc'
  30. ;------------------------------------------------------------------------------
  31. align 4
  32. START:
  33.         mcall   68,11
  34.         mcall   40,110010b
  35. ;------------------------------------------------------------------------------
  36. align 4
  37. bgr_changed:
  38.  
  39.         mcall   14
  40.         mov     [y_max],ax
  41.         shr     eax,16
  42.         mov     [x_max],ax
  43.         shl     eax,16
  44.         mov     [top_right_corner],eax
  45. ;------------------------------------------------------------------------------
  46. align 4
  47. still:
  48.         movzx   ebx,[time]
  49.         imul    ebx,60*100
  50.         mcall   23              ; ¦¤ñ¬ ᮡëâ¨ï ¢ â¥ç¥­¨¥ [time] ¬¨­ãâ
  51.         test    eax,eax
  52.         jz      create_ss_thread
  53.  
  54.         cmp     al,2            ; key in buffer?
  55.         jz      key
  56.  
  57.         cmp     al,5            ; background redraw?
  58.         jz      bgr_changed
  59. ; mouse event
  60.         mcall   37,2            ; ¯à®¢¥à¨¬ ª­®¯ª¨
  61.         and     al,3
  62.         cmp     al,3            ; ­ ¦ âë ®¡¥ ª­®¯ª¨ ¬ëè¨?
  63.         jnz     still
  64.  
  65.         mcall   37,0            ; ¯à®¢¥à¨¬ ª®®à¤¨­ âë
  66.         cmp     [top_right_corner],eax
  67.         jnz     still
  68. ;------------------------------------------------------------------------------
  69. align 4
  70. create_setup:
  71.         test    [params],2
  72.         jnz     still           ; ®ª­® ­ áâ஥ª 㦥 ᮧ¤ ­®
  73.         mcall   51,1,sthread,sthread_stack_top
  74.         or      [params],2
  75.         jmp     still
  76. ;------------------------------------------------------------------------------
  77. align 4
  78. key:
  79.         mcall                   ; eax = 2
  80.         jmp     still
  81. ;------------------------------------------------------------------------------
  82. align 4
  83. create_ss_thread:
  84.         test    [params],3
  85.         jnz     still
  86.         call    create_ss
  87.         jmp     still
  88. ;------------------------------------------------------------------------------
  89. align 4
  90. create_ss:
  91.         mcall   51,1,thread,thread_stack_top
  92.         or      [params],1
  93.         ret
  94. ;------------------------------------------------------------------------------
  95. align 4
  96. thread:
  97.         mcall   40,100010b
  98. ;set_new_cursor_skin - transparent cursor
  99.         mcall   68,12,32*32*4   ; get memory for own cursor area
  100.  
  101.         push    eax
  102.         mov     ecx,eax
  103.         mcall   37,4,,2         ; load own cursor
  104.  
  105.         mov     ecx,eax
  106.         mcall   37,5            ; set own cursor
  107.  
  108.         pop     ecx
  109.         mcall   68,13   ; free own cursor area
  110.  
  111.         cmp     [type],dword 0
  112.         je      drawsswin
  113.  
  114.         cmp     [type],dword 24
  115.         je      asminit
  116.  
  117.         mov     dword [delay],1
  118.         mov     [lx1],10         ; for "draw line"
  119.         mov     [lx2],40
  120.         mov     [ly1],50
  121.         mov     [ly2],100
  122.         mov     [addx1],1
  123.         mov     [addx2],1
  124.         mov     [addy1],1
  125.         mov     [addy2],1
  126.         jmp     drawsswin
  127. ;--------------------------------------
  128. align 4
  129. asminit:        ; for "assembler" - assembler sources demo
  130. ; get size of file
  131.         mov     [fileinfo],dword 5
  132.         mov     [fileinfo.point],dword fileinfo_buffer
  133.         mcall   70,fileinfo
  134.         test    eax,eax
  135.         jnz     .no_file
  136. ; get memory for file
  137.         mov     ecx,[fileinfo_buffer+32]
  138.         mov     [fileinfo.size],ecx
  139.         mcall   68,12
  140.         mov     [fileinfo.point],eax
  141. ; load file
  142.         mov     [fileinfo],dword 0
  143.         mcall   70,fileinfo
  144.         test    eax,eax
  145.         jz      @f
  146.         mcall   68,13,[fileinfo.point]
  147. ;--------------------------------------
  148. align 4
  149. .no_file:
  150.         mov     [type],dword 0
  151.         jmp     drawsswin
  152. ;--------------------------------------
  153. align 4
  154. @@:
  155.         mov     dword [delay],1 ;25 - old value
  156. ;--------------------------------------
  157. align 4
  158. asminit1:
  159.         mov     eax,[fileinfo.point]
  160.         mov     [stringstart],eax
  161.         mov     dword [stringlen],1
  162. ;--------------------------------------
  163. align 4
  164. newpage:
  165.         mov     word [stringpos],10
  166. ;--------------------------------------
  167. align 4
  168. drawsswin:
  169.         xor     eax,eax
  170.         movzx   ebx,[x_max]
  171.         movzx   ecx,[y_max]
  172.         inc     ebx
  173.         inc     ecx
  174.         mcall   ,,,0x01000000
  175.  
  176.         xor     edx,edx
  177.         mcall   13
  178. ;--------------------------------------
  179. align 4        
  180. tstill:
  181.         mcall   23,[delay]
  182.         test    eax,eax
  183.         jnz     thr_end
  184.  
  185.         cmp     [type],dword 0
  186.         je      tstill
  187.  
  188.         cmp     [type],dword 24
  189.         je      drawssasm
  190.  
  191.         call    draw_line
  192.         jmp     tstill
  193. ;--------------------------------------
  194. align 4        
  195. thr_end:
  196.         cmp     [type],dword 24
  197.         jne     @f
  198.         mcall   68,13,[fileinfo.point]
  199. ;--------------------------------------
  200. align 4        
  201. @@:
  202.         and     [params], not 1
  203.         or      eax,-1
  204.         mcall
  205. ;------------------------------------------------------------------------------
  206. align 4
  207. drawssasm:
  208.         mov     edi,[stringstart]
  209.         add     edi,[stringlen]
  210.         dec     edi
  211.  
  212.         mov     eax,edi
  213.         sub     eax,[fileinfo.point]
  214.  
  215.         cmp     eax,[fileinfo.size]
  216.         ja      asminit1
  217.  
  218.         cmp     word [edi],0x0a0d
  219.         je      addstring
  220.  
  221.         cmp     byte [edi],0x0a
  222.         jne     noaddstring
  223.  
  224.         dec     edi
  225. ;--------------------------------------
  226. align 4
  227. addstring:
  228.         add     word [stringpos],10
  229.         add     edi,2
  230.         mov     [stringstart],edi
  231.         mov     dword [stringlen],1
  232.         mov     ax,[stringpos]
  233.         cmp     ax,[y_max]
  234.         jb      tstill
  235.         jmp     newpage
  236. ;--------------------------------------
  237. align 4
  238. noaddstring:
  239.         mov     ebx,10*65536
  240.         mov     bx,[stringpos]
  241.         mcall   4,,0x104ba010,[stringstart],[stringlen]
  242.         inc     dword [stringlen]
  243.         cmp     [edi],byte ' '
  244.         je      drawssasm
  245.         jmp     tstill
  246. ;------------------------------------------------------------------------------
  247. align 4
  248. draw_line:
  249.         movzx   esi,[x_max]
  250.         movzx   edi,[y_max]
  251.  
  252.         mov     eax,[addx1]
  253.         add     [lx1],eax
  254.         mov     eax,[addy1]
  255.         add     [ly1],eax
  256.  
  257.         mov     eax,[addx2]
  258.         add     [lx2],eax
  259.         mov     eax,[addy2]
  260.         add     [ly2],eax
  261.        
  262.         cmp     [lx1],1
  263.         jge     dl1
  264.         mov     [addx1],1
  265. ;--------------------------------------
  266. align 4
  267. dl1:
  268.         cmp     [lx2],1
  269.         jge     dl2
  270.  
  271.         mov     [addx2],1
  272. ;--------------------------------------
  273. align 4
  274. dl2:
  275.         cmp     [lx1],esi
  276.         jbe     dl3
  277.  
  278.         mov     [addx1],0xffffffff
  279. ;--------------------------------------
  280. align 4
  281. dl3:
  282.         cmp     [lx2],esi
  283.         jbe     dl4
  284.  
  285.         mov     [addx2],0xffffffff
  286. ;--------------------------------------
  287. align 4
  288. dl4:
  289.         cmp     [ly1],1
  290.         jge     dl5
  291.         mov     [addy1],1
  292. ;--------------------------------------
  293. align 4
  294. dl5:
  295.         cmp     [ly2],2
  296.         jge     dl6
  297.  
  298.         mov     [addy2],1
  299. ;--------------------------------------
  300. align 4
  301. dl6:
  302.         cmp     [ly1],edi
  303.         jbe     dl7
  304.  
  305.         mov     [addy1],-1
  306. ;--------------------------------------
  307. align 4
  308. dl7:
  309.         cmp     [ly2],edi
  310.         jbe     dl8
  311.  
  312.         mov     [addy2],-1
  313. ;--------------------------------------
  314. align 4
  315. dl8:
  316.         mov     eax,[lx2]
  317.         cmp     [lx1],eax
  318.         jz      dnol
  319.        
  320.         mov     bx,word [lx1]
  321.         shl     ebx,16
  322.         mov     bx,word [lx2]
  323.  
  324.         mov     cx,word [ly1]
  325.         shl     ecx,16
  326.         mov     cx,word [ly2]
  327.        
  328.         mov     edx,[lcolor]
  329.         and     edx,0xffffff
  330.         mcall   38
  331. ;--------------------------------------
  332. align 4
  333. dnol:
  334.         add     [lcolor],0x010201
  335.         ret
  336. ;------------------------------------------------------------------------------
  337. align 4
  338. sthread:                ; start of execution
  339.      call sdraw_window
  340. ;--------------------------------------
  341. align 4
  342. sstill:
  343.         mcall   10      ; wait here for event
  344.         dec     eax     ; redraw request ?
  345.         je      sthread
  346.  
  347.         dec     eax     ; key in buffer ?
  348.         jne     sbutton
  349.  
  350.         mcall   2
  351.         jmp     snoclose        ;sstill
  352. ;------------------------------------------------------------------------------
  353. align 4
  354. sbutton:                ; button
  355.         mcall   17      ; get id
  356.  
  357.         cmp     ah,1    ; button id=1 ?
  358.         jne     snoclose
  359.  
  360.         and     [params],not 2
  361.         mov     eax,-1  ; close this program
  362.         mcall
  363. ;--------------------------------------
  364. align 4
  365. snoclose:
  366.         cmp     ah,7
  367.         jne     nosetfl
  368.  
  369.         xor     [params],1
  370.         call    drawflag
  371.         call    drawtype
  372.         call    drawtime
  373.         jmp     sstill
  374. ;--------------------------------------
  375. align 4
  376. nosetfl:
  377.         test    [params],1
  378.         jnz     sstill
  379.  
  380.         cmp     ah,2
  381.         jne     notypedown
  382.  
  383.         mov     eax,[type]
  384.         test    eax,eax
  385.         je      sstill
  386.  
  387.         sub     eax,12
  388.         jmp     typeupdn
  389. ;--------------------------------------
  390. align 4
  391. notypedown:
  392.         cmp     ah,3
  393.         jne     notypeup
  394.  
  395.         mov     eax,[type]
  396.         cmp     eax,24
  397.         jae     sstill
  398.  
  399.         add     eax,12
  400.         jmp     typeupdn
  401. ;--------------------------------------
  402. align 4
  403. notypeup:
  404.         cmp     ah,4
  405.         jne     notimedown
  406.  
  407.         mov     al,[time]
  408.         cmp     al,1
  409.         jbe     sstill
  410.  
  411.         dec     eax
  412. ;       das
  413.         jmp     timeupdn
  414. ;--------------------------------------
  415. align 4
  416. notimedown:
  417.         cmp     ah,5
  418.         jne     notimeup
  419.  
  420.         mov     al,[time]
  421.         cmp     al,59   ; 0x59
  422.         jae     sstill
  423.  
  424.         inc     eax
  425. ;       daa
  426.         jmp     timeupdn
  427. ;--------------------------------------
  428. align 4
  429. notimeup:
  430.         cmp     ah,6
  431.         jne     noshow
  432.  
  433.         mcall   5,10
  434.         call    create_ss
  435. ;--------------------------------------
  436. align 4
  437. noshow:
  438.         jmp     sstill
  439. ;--------------------------------------
  440. align 4
  441. timeupdn:
  442.         mov     [time],al
  443.         call    drawtime
  444.         jmp     sstill
  445. ;--------------------------------------
  446. align 4
  447. typeupdn:
  448.         mov     [type],eax
  449.         call    drawtype
  450.         jmp     sstill
  451. ;------------------------------------------------------------------------------
  452. ;   *********************************************
  453. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  454. ;   *********************************************
  455. align 4
  456. sdraw_window:
  457.         mcall   12,1
  458.  
  459.         xor     eax,eax         ; function 0 : define and draw window
  460.         xor     esi,esi
  461.         mcall   ,<100,215>,<100,70>,0x13400088,,title
  462.  
  463.         mcall   8,<47,10>,<31,10>,2,0x702050
  464.    
  465.         push    ebx
  466.         add     ebx,13*65536
  467.         mov     edi,ebx
  468.         inc     edx
  469.         mcall
  470.         pop     ebx
  471.    
  472.         add     ecx,15*65536
  473.         inc     edx
  474.         mcall
  475.  
  476.         mov     ebx,edi
  477.         inc     edx
  478.         mcall
  479.  
  480.         inc     edx
  481.         mcall   ,<160,40>,<28,14>
  482.  
  483.         mcall   4,<15,33>,0x80ffffff,setuptext  ; write text to window
  484.  
  485.         add     ebx,15
  486.         add     edx,10
  487.         mcall
  488.  
  489.         mcall   ,<169,32>,,buttext
  490.  
  491.         call    drawtype
  492.         call    drawtime
  493.         call    drawflag
  494.  
  495.         mcall   12,2
  496.         ret
  497. ;------------------------------------------------------------------------------
  498. align 4
  499. drawtype:
  500.         mov     edx,0xffffff
  501.         test    [params], 1
  502.         jz      noblue
  503.  
  504.         mov     edx,0x4e00e7
  505. ;--------------------------------------
  506. align 4
  507. noblue:
  508.         mcall   13,<80,75>,<30,12>
  509.         xor     ecx,ecx
  510.         mov     edx,typetext
  511.         add     edx,[type]
  512.         mcall   4,<82,32>,,,12
  513.         ret
  514. ;------------------------------------------------------------------------------
  515. align 4
  516. drawtime:
  517.         mov     edx,0xffffff
  518.         test    [params], 1
  519.         jz      noblue1
  520.  
  521.         mov     edx,0x4e00e7
  522. ;--------------------------------------
  523. align 4
  524. noblue1:
  525.         mcall   13,<80,15>,<45,12>
  526.         xor     esi,esi
  527.         movzx   ecx,byte [time]
  528.         mcall   47,0x00020000,,<82,47>
  529.         ret
  530. ;------------------------------------------------------------------------------
  531. align 4
  532. drawflag:
  533.         mcall   8,,,0x80000007  ; before we need delete button
  534. ; otherwise, a few hours later the application will spend all buttons of system
  535.         mcall   ,<150,10>,<45,10>,7,0xe0e0e0    ; then create button
  536.        
  537.         mov     edx,flag
  538.         bt      dword [params],0
  539.         jc      setf
  540.  
  541.         inc     edx
  542. ;--------------------------------------
  543. align 4
  544. setf:
  545.         xor     ecx,ecx
  546.         mcall   4,<153,47>,,,1
  547.         ret
  548. ;------------------------------------------------------------------------------
  549. align 4
  550. ; DATA AREA
  551. buttext         db 'SHOW',0
  552. flag            db 'V '
  553. title           db 'SCREENSAVER SETUP',0
  554. setuptext       db 'TYPE: < >',0
  555.                 db 'TIME: < >     MINUTES    NEVER',0
  556. typetext        db 'BLACK SCREENCOLOR LINES ASSEMBLER   '
  557. type    dd 12
  558. time    db 15   ; ¢à¥¬ï ¤® § ¯ã᪠ § áâ ¢ª¨ ¢ ¬¨­ãâ å
  559. delay   dd 100
  560.  
  561. lx1     dd 10
  562. lx2     dd 40
  563.  
  564. ly1     dd 50
  565. ly2     dd 100
  566.  
  567. addx1   dd 1
  568. addx2   dd 1
  569.  
  570. addy1   dd 1
  571. addy2   dd 1
  572.  
  573. stringlen       dd 1
  574. stringstart     dd 0
  575. stringpos       dw 10
  576.  
  577. params  db 0    ;if bit 0 set-ssaver works if bit 1 set-setup works
  578.  
  579. fileinfo:
  580.         dd 0
  581.         dd 0
  582.         dd 0
  583. .size:  dd 0
  584. .point: dd 0
  585.         db '/sys/macros.inc',0
  586. ;------------------------------------------------------------------------------
  587. align 4
  588. IM_END:
  589. ; UNINITIALIZED DATA:
  590.  
  591. lcolor  dd ?
  592. x_max   dw ?    ; à §¬¥àë íªà ­ 
  593. y_max   dw ?
  594.  
  595. top_right_corner        rd 1
  596. ;------------------------------------------------------------------------------
  597. align 4
  598. fileinfo_buffer:
  599.         rb 40
  600. ;------------------------------------------------------------------------------
  601. align 4
  602.         rb 512
  603. sthread_stack_top:
  604. ;------------------------------------------------------------------------------
  605. align 4
  606.         rb 512
  607. thread_stack_top:
  608. ;------------------------------------------------------------------------------
  609. align 4
  610.         rb 512
  611. stack_top:
  612. I_END:
  613. ;------------------------------------------------------------------------------
  614.