Subversion Repositories Kolibri OS

Rev

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