Subversion Repositories Kolibri OS

Rev

Rev 3645 | Blame | Compare with Previous | 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     [stringpos],16
  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     [stringpos],16
  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,[stringlen]
  250.         shl     ebx,19
  251.         mov     bx,[stringpos]
  252.         mov     edx,[stringstart]
  253.         add     edx,[stringlen]
  254.         dec     edx
  255.         mcall   4,,0x104ba010,,1
  256.         inc     dword [stringlen]
  257.         cmp     [edi],byte ' '
  258.         je      drawssasm
  259.         jmp     tstill
  260. ;------------------------------------------------------------------------------
  261. align 4
  262. draw_line:
  263.         movzx   esi,[x_max]
  264.         movzx   edi,[y_max]
  265.  
  266.         mov     eax,[addx1]
  267.         add     [lx1],eax
  268.         mov     eax,[addy1]
  269.         add     [ly1],eax
  270.  
  271.         mov     eax,[addx2]
  272.         add     [lx2],eax
  273.         mov     eax,[addy2]
  274.         add     [ly2],eax
  275.  
  276.         cmp     [lx1],1
  277.         jge     dl1
  278.         mov     [addx1],1
  279. ;--------------------------------------
  280. align 4
  281. dl1:
  282.         cmp     [lx2],1
  283.         jge     dl2
  284.  
  285.         mov     [addx2],1
  286. ;--------------------------------------
  287. align 4
  288. dl2:
  289.         cmp     [lx1],esi
  290.         jbe     dl3
  291.  
  292.         mov     [addx1],0xffffffff
  293. ;--------------------------------------
  294. align 4
  295. dl3:
  296.         cmp     [lx2],esi
  297.         jbe     dl4
  298.  
  299.         mov     [addx2],0xffffffff
  300. ;--------------------------------------
  301. align 4
  302. dl4:
  303.         cmp     [ly1],1
  304.         jge     dl5
  305.         mov     [addy1],1
  306. ;--------------------------------------
  307. align 4
  308. dl5:
  309.         cmp     [ly2],2
  310.         jge     dl6
  311.  
  312.         mov     [addy2],1
  313. ;--------------------------------------
  314. align 4
  315. dl6:
  316.         cmp     [ly1],edi
  317.         jbe     dl7
  318.  
  319.         mov     [addy1],-1
  320. ;--------------------------------------
  321. align 4
  322. dl7:
  323.         cmp     [ly2],edi
  324.         jbe     dl8
  325.  
  326.         mov     [addy2],-1
  327. ;--------------------------------------
  328. align 4
  329. dl8:
  330.         mov     eax,[lx2]
  331.         cmp     [lx1],eax
  332.         jz      dnol
  333.  
  334.         mov     bx,word [lx1]
  335.         shl     ebx,16
  336.         mov     bx,word [lx2]
  337.  
  338.         mov     cx,word [ly1]
  339.         shl     ecx,16
  340.         mov     cx,word [ly2]
  341.  
  342.         mov     edx,[lcolor]
  343.         and     edx,0xffffff
  344.         mcall   38
  345. ;--------------------------------------
  346. align 4
  347. dnol:
  348.         add     [lcolor],0x010201
  349.         ret
  350. ;------------------------------------------------------------------------------
  351. align 4
  352. sthread:                ; start of execution
  353.      call sdraw_window
  354. ;--------------------------------------
  355. align 4
  356. sstill:
  357.         mcall   10      ; wait here for event
  358.         dec     eax     ; redraw request ?
  359.         je      sthread
  360.  
  361.         dec     eax     ; key in buffer ?
  362.         jne     sbutton
  363.  
  364.         mcall   2
  365.         jmp     snoclose        ;sstill
  366. ;------------------------------------------------------------------------------
  367. align 4
  368. sbutton:                ; button
  369.         mcall   17      ; get id
  370.  
  371.         cmp     ah,1    ; button id=1 ?
  372.         jne     snoclose
  373.  
  374.         and     [params],not 2
  375.         mov     eax,-1  ; close this program
  376.         mcall
  377. ;--------------------------------------
  378. align 4
  379. snoclose:
  380.         cmp     ah,7
  381.         jne     nosetfl
  382.  
  383.         xor     [params],1
  384.         call    drawflag
  385.         call    drawtype
  386.         call    drawtime
  387.         jmp     sstill
  388. ;--------------------------------------
  389. align 4
  390. nosetfl:
  391.         test    [params],1
  392.         jnz     sstill
  393.  
  394.         cmp     ah,2
  395.         jne     notypedown
  396.  
  397.         mov     eax,[type]
  398.         test    eax,eax
  399.         je      sstill
  400.  
  401.         sub     eax,12
  402.         jmp     typeupdn
  403. ;--------------------------------------
  404. align 4
  405. notypedown:
  406.         cmp     ah,3
  407.         jne     notypeup
  408.  
  409.         mov     eax,[type]
  410.         cmp     eax,24
  411.         jae     sstill
  412.  
  413.         add     eax,12
  414.         jmp     typeupdn
  415. ;--------------------------------------
  416. align 4
  417. notypeup:
  418.         cmp     ah,4
  419.         jne     notimedown
  420.  
  421.         mov     al,[time]
  422.         cmp     al,1
  423.         jbe     sstill
  424.  
  425.         dec     eax
  426. ;       das
  427.         jmp     timeupdn
  428. ;--------------------------------------
  429. align 4
  430. notimedown:
  431.         cmp     ah,5
  432.         jne     notimeup
  433.  
  434.         mov     al,[time]
  435.         cmp     al,59   ; 0x59
  436.         jae     sstill
  437.  
  438.         inc     eax
  439. ;       daa
  440.         jmp     timeupdn
  441. ;--------------------------------------
  442. align 4
  443. notimeup:
  444.         cmp     ah,6
  445.         jne     noshow
  446.  
  447.         mcall   5,10
  448.         call    create_ss
  449. ;--------------------------------------
  450. align 4
  451. noshow:
  452.         jmp     sstill
  453. ;--------------------------------------
  454. align 4
  455. timeupdn:
  456.         mov     [time],al
  457.         call    drawtime
  458.         jmp     sstill
  459. ;--------------------------------------
  460. align 4
  461. typeupdn:
  462.         mov     [type],eax
  463.         call    drawtype
  464.         jmp     sstill
  465. ;------------------------------------------------------------------------------
  466. ;   *********************************************
  467. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  468. ;   *********************************************
  469. align 4
  470. sdraw_window:
  471.         mcall   12,1
  472.  
  473.         xor     eax,eax         ; function 0 : define and draw window
  474.         xor     esi,esi
  475.         mcall   ,<100,215>,<100,70>,0x13400088,,title
  476.  
  477.         mcall   8,<47,10>,<31,10>,2,0x702050
  478.  
  479.         push    ebx
  480.         add     ebx,13*65536
  481.         mov     edi,ebx
  482.         inc     edx
  483.         mcall
  484.         pop     ebx
  485.  
  486.         add     ecx,15*65536
  487.         inc     edx
  488.         mcall
  489.  
  490.         mov     ebx,edi
  491.         inc     edx
  492.         mcall
  493.  
  494.         inc     edx
  495.         mcall   ,<160,40>,<28,14>
  496.  
  497.         mcall   4,<15,33>,0x80ffffff,setuptext  ; write text to window
  498.  
  499.         add     ebx,15
  500.         add     edx,10
  501.         mcall
  502.  
  503.         mcall   ,<169,32>,,buttext
  504.  
  505.         call    drawtype
  506.         call    drawtime
  507.         call    drawflag
  508.  
  509.         mcall   12,2
  510.         ret
  511. ;------------------------------------------------------------------------------
  512. align 4
  513. drawtype:
  514.         mov     edx,0xffffff
  515.         test    [params], 1
  516.         jz      noblue
  517.  
  518.         mov     edx,0x4e00e7
  519. ;--------------------------------------
  520. align 4
  521. noblue:
  522.         mcall   13,<80,75>,<30,12>
  523.         xor     ecx,ecx
  524.         mov     edx,typetext
  525.         add     edx,[type]
  526.         mcall   4,<82,32>,,,12
  527.         ret
  528. ;------------------------------------------------------------------------------
  529. align 4
  530. drawtime:
  531.         mov     edx,0xffffff
  532.         test    [params], 1
  533.         jz      noblue1
  534.  
  535.         mov     edx,0x4e00e7
  536. ;--------------------------------------
  537. align 4
  538. noblue1:
  539.         mcall   13,<80,15>,<45,12>
  540.         xor     esi,esi
  541.         movzx   ecx,byte [time]
  542.         mcall   47,0x00020000,,<82,47>
  543.         ret
  544. ;------------------------------------------------------------------------------
  545. align 4
  546. drawflag:
  547.         mcall   8,,,0x80000007  ; before we need delete button
  548. ; otherwise, a few hours later the application will spend all buttons of system
  549.         mcall   ,<150,10>,<45,10>,7,0xe0e0e0    ; then create button
  550.  
  551.         mov     edx,flag
  552.         bt      dword [params],0
  553.         jc      setf
  554.  
  555.         inc     edx
  556. ;--------------------------------------
  557. align 4
  558. setf:
  559.         xor     ecx,ecx
  560.         mcall   4,<153,47>,,,1
  561.         ret
  562. ;------------------------------------------------------------------------------
  563. align 4         ; DATA AREA
  564. type    dd 12
  565. delay   dd 100
  566. lx1     dd 10
  567. lx2     dd 40
  568. ly1     dd 50
  569. ly2     dd 100
  570. addx1   dd 1
  571. addx2   dd 1
  572. addy1   dd 1
  573. addy2   dd 1
  574. stringlen       dd 1
  575. stringstart     dd 0
  576.  
  577. stringpos       dw 16
  578. time            db 15   ; время до запуска заставки в минутах
  579. params          db 0    ;if bit 0 set-ssaver works if bit 1 set-setup works
  580.  
  581. fileinfo:
  582.         dd 0
  583.         dd 0
  584.         dd 0
  585. .size:  dd 0
  586. .point: dd 0
  587.         db '/sys/macros.inc',0
  588.  
  589. buttext         db 'SHOW',0
  590. flag            db 'V '
  591. title           db 'SCREENSAVER SETUP',0
  592. setuptext       db 'TYPE: < >',0
  593.                 db 'TIME: < >     MINUTES    NEVER',0
  594. typetext        db 'BLACK SCREENCOLOR LINES ASSEMBLER   '
  595. ;-------------------------------
  596. IM_END:         ; UNINITIALIZED DATA
  597. top_right_corner        rd 1
  598. align 4
  599. lcolor  dd ?
  600. x_max   dw ?    ; размеры экрана
  601. y_max   dw ?
  602. I_Param:
  603. fileinfo_buffer:
  604.         rb 40
  605. ;-------------------------------
  606.         rb 512
  607. sthread_stack_top:
  608.         rb 512
  609. thread_stack_top:
  610.         rb 512
  611. stack_top:
  612. I_END:
  613.