Subversion Repositories Kolibri OS

Rev

Rev 485 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;   SCREENSAVER APPLICATION by lisovin@26.ru
  2. ;
  3. ;   Compile with FASM for Menuet
  4. ;
  5.    use32
  6.    org    0x0
  7.  
  8.    db     'MENUET01'     ; 8 byte id
  9.    dd     0x01           ; header version
  10.    dd     START          ; start of code
  11.    dd     I_END          ; size of image
  12.    dd     0x40000        ; memory for app (256 Kb)
  13.    dd     0x40000        ; esp
  14.    dd     0x0 , 0x0      ; I_Param , I_Icon
  15.  
  16. include   'lang.inc'
  17. include   '..\..\..\macros.inc'
  18.  
  19. ;include   'debug.inc'
  20.  
  21. START:
  22.      mov  eax,14
  23.      mcall
  24.      and  eax,0xFFFF0000
  25.      mov  [top_right_corner],eax
  26.  
  27.      mov  eax,40        ; установить маску событий
  28.      mov  ebx,110010b   ; реагируем на клавиатуру, мышь, отрисовку фона
  29.      mcall
  30.  
  31.      mov  eax,14        ; получим размеры экрана
  32.      mcall
  33.      mov  [y_max],ax
  34.      shr  eax,16
  35.      mov  [x_max],ax
  36.  
  37.   event:              ; обработчик событий (всех)
  38.     mov  eax,26
  39.     mov  ebx,9
  40.     mcall         ; получить время системы
  41. ;    mov  eax,3
  42. ;    mcall
  43.     mov  [evtime],eax ; запомнить его
  44.     mov  eax,37
  45.     mov  ebx,2
  46.     mcall
  47.     cmp  eax,3        ; продолжим, если нажата средняя кнопка мыши
  48.     jne  still
  49.     mov  eax,37       ; проверим координаты
  50.     mov  ebx,0
  51.     mcall
  52.     cmp  [top_right_corner],eax
  53.     je   create_setup ; создаём окно настройки, если мышь в верхнем правом
  54.                       ; углу экрана
  55.  
  56.  
  57.  
  58. still:                  ; основной цикл программы
  59.  
  60.     mov  eax,23         ; ждём события в течение 1 секунды
  61.     mov  ebx,100
  62.     mcall
  63.  
  64.     bt   dword [params],0  ; ssaver works?
  65.     jc   event
  66.     bt   dword [params],1  ; setup works?
  67.     jc   event
  68.  
  69.     cmp  eax,2          ; key in buffer ?
  70.     je   event
  71.     cmp  eax,5
  72.     je   event
  73.     cmp  eax,6
  74.     je   event
  75.  
  76.     mov  eax,26
  77.     mov  ebx,9
  78.     mcall
  79.     sub  eax,[evtime]
  80.     xor  edx,edx
  81.     mov  ebx,60*100     ; поделим на 60*100, получим время в минутах
  82.     div  ebx
  83.     cmp  al,[time]
  84.     jb   still
  85.  
  86. ; current_time-evtime/100/60 = время в минутах с прошлого события
  87.  
  88.     call create_ss
  89.     jmp  still
  90.  
  91.  
  92.  
  93.   create_setup:
  94.     bt dword [params],1
  95.     jc   still
  96.     mov  eax,51
  97.     mov  ebx,1
  98.     mov  ecx,sthread
  99.     mov  edx,0x3F000
  100.     mcall
  101.     bts dword [params],1
  102.     jmp  still
  103.  
  104.   create_ss:
  105.     mov  eax,51
  106.     mov  ebx,1
  107.     mov  ecx,thread
  108.     mov  edx,0x3E000
  109.     mcall
  110.     bts dword [params],0
  111.     ret
  112.  
  113.  thread:
  114.     mov  eax,5
  115.     mov  ebx,eax
  116.     mcall
  117.     mov  eax,40
  118.     mov  ebx,100010b
  119.     mcall
  120.     cmp  dword [type],0
  121.     je   drawsswin
  122.     cmp  dword [type],24
  123.     je   asminit
  124.     mov  dword [delay],1
  125.     mov  [lx1],10         ; for "draw line"
  126.     mov  [lx2],40
  127.     mov  [ly1],50
  128.     mov  [ly2],100
  129.     mov  [addx1],1
  130.     mov  [addx2],1
  131.     mov  [addy1],1
  132.     mov  [addy2],1
  133.     jmp  drawsswin
  134.  asminit:                 ; for "assembler"
  135.     mov  dword [delay],25
  136.     mov  eax,58
  137.     mov  ebx,fileinfo
  138.     mcall
  139.  asminit1:
  140.     mov  eax,data_from_file
  141.     mov  [stringstart],eax
  142.     mov  dword [stringlen],1
  143.  newpage:
  144.     mov  word [stringpos],10
  145.  
  146.  drawsswin:
  147.     xor  eax,eax
  148.     mov  ebx,eax
  149.     mov  ecx,eax
  150.     mov  bx,[x_max]
  151.     mov  cx,[y_max]
  152.     inc  ebx
  153.     inc  ecx
  154.     mov  edx,0x01000000
  155.     mcall
  156.     mov  eax,13
  157.     xor  edx,edx
  158.     mcall
  159.  tstill:
  160.     mov  eax,23
  161.     mov  ebx,[delay]
  162.     mcall
  163.     cmp  eax,2
  164.     je   thr_end
  165.     cmp  eax,6
  166.     je   thr_end
  167.     cmp  dword [type],0
  168.     je   tstill
  169.     cmp  dword [type],24
  170.     je   drawssasm
  171.     call draw_line
  172.     jmp  tstill
  173.  thr_end:
  174.     btr  dword [params],0
  175.     mov  eax,26
  176.     mov  ebx,9
  177.     mcall
  178.     mov  [evtime],eax
  179.     or   eax,-1
  180.     mcall
  181.  
  182.  drawssasm:
  183.     mov  edi,[stringstart]
  184.     add  edi,[stringlen]
  185.     dec  edi
  186.     mov  eax,edi
  187.     sub  eax,data_from_file
  188.     cmp  eax,10450
  189.     ja   asminit1
  190.     cmp word [edi],0x0a0d
  191.     jne  noaddstring
  192.     add  word [stringpos],10
  193.     add  edi,2
  194.     mov  [stringstart],edi
  195.     mov dword [stringlen],1
  196.     mov  ax,[stringpos]
  197.     cmp  ax,[y_max]
  198.     jb   tstill
  199.     jmp  newpage
  200.  noaddstring:
  201.     mov  eax,4
  202.     mov  ebx,10*65536
  203.     mov  bx,[stringpos]
  204.     mov  ecx,0x104ba010
  205.     mov  edx,[stringstart]
  206.     mov  esi,[stringlen]
  207.     mcall
  208.     inc dword [stringlen]
  209.     cmp byte [edi],byte ' '
  210.     je   drawssasm
  211.     jmp  tstill
  212.  
  213. draw_line:
  214.  
  215.     xor  esi,esi
  216.     xor  edi,edi
  217.     mov  si,[x_max]
  218.     mov  di,[y_max]
  219.  
  220.     mov  eax,[addx1]
  221.     add  [lx1],eax
  222.     mov  eax,[addy1]
  223.     add  [ly1],eax
  224.  
  225.     mov  eax,[addx2]
  226.     add  [lx2],eax
  227.     mov  eax,[addy2]
  228.     add  [ly2],eax
  229.  
  230.     cmp  [lx1],1
  231.     jge  dl1
  232.     mov  [addx1],1
  233.   dl1:
  234.     cmp  [lx2],1
  235.     jge  dl2
  236.     mov  [addx2],1
  237.   dl2:
  238.     cmp  [lx1],esi
  239.     jbe  dl3
  240.     mov  [addx1],0xffffffff
  241.   dl3:
  242.     cmp  [lx2],esi
  243.     jbe  dl4
  244.     mov  [addx2],0xffffffff
  245.   dl4:
  246.  
  247.     cmp  [ly1],1
  248.     jge  dl5
  249.     mov  [addy1],1
  250.   dl5:
  251.     cmp  [ly2],2
  252.     jge  dl6
  253.     mov  [addy2],1
  254.   dl6:
  255.     cmp  [ly1],edi
  256.     jbe  dl7
  257.     mov  [addy1],-1
  258.   dl7:
  259.     cmp  [ly2],edi
  260.     jbe  dl8
  261.     mov  [addy2],-1
  262.   dl8:
  263.  
  264.     mov  eax,[lx2]
  265.     cmp  [lx1],eax
  266.     jz   dnol
  267.  
  268.     mov  bx,word [lx1]
  269.     shl  ebx,16
  270.     mov  bx,word [lx2]
  271.  
  272.     mov  cx,word [ly1]
  273.     shl  ecx,16
  274.     mov  cx,word [ly2]
  275.  
  276.     mov  eax,38
  277.     mov  edx,[lcolor]
  278.     and  edx,0xffffff
  279.     mcall
  280.  
  281.    dnol:
  282.  
  283.     add  [lcolor],0x010201
  284.  
  285.     ret
  286.  
  287.  
  288. sthread:                        ; start of execution
  289.  
  290.      call sdraw_window
  291.  
  292. sstill:
  293.  
  294.     mov  eax,10                 ; wait here for event
  295.     mcall
  296.  
  297.     cmp  eax,1                  ; redraw request ?
  298.     je   sthread
  299.     cmp  eax,2                  ; key in buffer ?
  300.     je   sstill
  301.     cmp  eax,3                  ; button in buffer ?
  302.     je   sbutton
  303.  
  304.     jmp  sstill
  305.  
  306.   sbutton:                       ; button
  307.     mov  eax,17                 ; get id
  308.     mcall
  309.  
  310.     cmp  ah,1                   ; button id=1 ?
  311.     jne  snoclose
  312.  
  313.     btr dword [params],1
  314.     mov  eax,-1                 ; close this program
  315.     mcall
  316.   snoclose:
  317.     cmp  ah,7
  318.     jne  nosetfl
  319.     btc dword [params],0
  320.     call drawflag
  321.     call drawtype
  322.     call drawtime
  323.     jmp  sstill
  324.   nosetfl:
  325.     bt dword [params],0
  326.     jc   sstill
  327.     cmp  ah,2
  328.     jne  notypedown
  329.     mov  eax,[type]
  330.     test  eax,eax
  331.     je   sstill
  332.     sub  eax,12
  333.     jmp  typeupdn
  334.   notypedown:
  335.     cmp  ah,3
  336.     jne  notypeup
  337.     mov  eax,[type]
  338.     cmp  eax,24
  339.     jae  sstill
  340.     add  eax,12
  341.     jmp  typeupdn
  342.   notypeup:
  343.     cmp  ah,4
  344.     jne  notimedown
  345.     mov  al,[time]
  346.     cmp  al,1
  347.     jbe  sstill
  348.     dec  al
  349. ;    das
  350.     jmp  timeupdn
  351.   notimedown:
  352.     cmp  ah,5
  353.     jne  notimeup
  354.     mov  al,[time]
  355.     cmp  al,59 ; 0x59
  356.     jae  sstill
  357.     inc  al
  358. ;    daa
  359.     jmp  timeupdn
  360.   notimeup:
  361.     cmp  ah,6
  362.     jne  noshow
  363.     mov  eax,5
  364.     mov  ebx,150
  365.     mcall
  366.     call create_ss
  367.     jmp  sstill
  368.   noshow:
  369.     jmp  sstill
  370.  
  371.   timeupdn:
  372.     mov  [time],al
  373.     call drawtime
  374.     jmp  sstill
  375.   typeupdn:
  376.     mov  [type],eax
  377.     call drawtype
  378.     jmp  sstill
  379.  
  380. ;   *********************************************
  381. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  382. ;   *********************************************
  383.  
  384.  
  385. sdraw_window:
  386.  
  387.  
  388.     mov  eax,12                    ; function 12:tell os about windowdraw
  389.     mov  ebx,1                     ; 1, start of draw
  390.     mcall
  391.  
  392.                                    ; DRAW WINDOW
  393.     xor  eax,eax                   ; function 0 : define and draw window
  394.     mov  ebx,100*65536+215         ; [x start] *65536 + [x size]
  395.     mov  ecx,100*65536+70          ; [y start] *65536 + [y size]
  396.     mov  edx,0x13400088            ; color of work area RRGGBB,8->color gl
  397.     mov  edi,title
  398.     mcall
  399.  
  400.     mov  eax,8
  401.     mov  ebx,47*65536+10
  402.     mov  ecx,31*65536+10
  403.     mov  edx,2
  404.     mov  esi,0x702050
  405.     mcall
  406.     push ebx
  407.     add  ebx,13*65536
  408.     mov  edi,ebx
  409.     inc  edx
  410.     mcall
  411.     pop  ebx
  412.     add  ecx,15*65536
  413.     inc  edx
  414.     mcall
  415.     mov  ebx,edi
  416.     inc  edx
  417.     mcall
  418.     mov  ebx,160*65536+40
  419.     mov  ecx,28*65536+14
  420.     inc  edx
  421.     mcall
  422.  
  423.     mov  eax,4                     ; function 4 : write text to window
  424.     mov  ebx,15*65536+33             ; [x start] *65536 + [y start]
  425.     mov  ecx,0xffffff
  426.     mov  edx,setuptext
  427.     mov  esi,9
  428.     mcall
  429.     add  ebx,15
  430.     add  edx,esi
  431.     mov  esi,30
  432.     mcall
  433.     mov  ebx,169*65536+32
  434.     mov  edx,buttext
  435.     mov  esi,4
  436.     mcall
  437.  
  438.     call drawtype
  439.     call drawtime
  440.     call drawflag
  441.  
  442.     mov  eax,12                    ; function 12:tell os about windowdraw
  443.     mov  ebx,2                     ; 2, end of draw
  444.     mcall
  445.  
  446.     ret
  447.  
  448. drawtype:
  449.     mov  eax,13
  450.     mov  ebx,80*65536+75
  451.     mov  ecx,30*65536+12
  452.     mov  edx,0xffffff
  453.     bt   dword [params],0
  454.     jnc  noblue
  455.     mov  edx,0x4e00e7
  456.  noblue:
  457.     mcall
  458.     mov  eax,4
  459.     mov  ebx,82*65536+32
  460.     xor  ecx,ecx
  461.     mov  edx,typetext
  462.     add  edx,[type]
  463.     mov  esi,12
  464.     mcall
  465.     ret
  466.  
  467. drawtime:
  468.     mov  eax,13
  469.     mov  ebx,80*65536+15
  470.     mov  ecx,45*65536+12
  471.     mov  edx,0xffffff
  472.     bt   dword [params],0
  473.     jnc  noblue1
  474.     mov  edx,0x4e00e7
  475.  noblue1:
  476.     mcall
  477.     mov  eax,47
  478.     mov  edx,82*65536+47
  479.     xor  esi,esi
  480.     movzx ecx,byte [time]
  481.     mov  ebx,0x00020000
  482.     mcall
  483.     ret
  484.  
  485. drawflag:
  486.     mov  eax,8
  487.     mov  ebx,150*65536+10
  488.     mov  ecx,45*65536+10
  489.     mov  edx,7
  490.     mov  esi,0xe0e0e0
  491.     mcall
  492.     mov  eax,4
  493.     mov  ebx,153*65536+47
  494.     xor  ecx,ecx
  495.     mov  esi,1
  496.     mov  edx,flag
  497.     bt   dword [params],0
  498.     jc   setf
  499.     inc  edx
  500.   setf:
  501.     mcall
  502.     ret
  503.  
  504. ; DATA AREA
  505. buttext    db 'SHOW'
  506. flag       db 'V '
  507. title      db 'SCREENSAVER SETUP',0
  508. setuptext  db 'TYPE: < >TIME: < >     MINUTES    NEVER'
  509. typetext   db 'BLACK SCREENCOLOR LINES ASSEMBLER   '
  510. type       dd 12
  511. time       db 15     ; время до запуска заставки в минутах
  512. delay      dd 100
  513.  
  514. lx1   dd  10
  515. lx2   dd  40
  516.  
  517. ly1   dd  50
  518. ly2   dd  100
  519.  
  520. addx1 dd  1
  521. addx2 dd  1
  522.  
  523. addy1 dd  1
  524. addy2 dd  1
  525.  
  526. stringlen   dd 1
  527. stringstart dd 0
  528. stringpos   dw 10
  529.  
  530. params  dd 0     ;if bit 0 set-ssaver works if bit 1 set-setup works
  531.  
  532. fileinfo:
  533.   dd 0,0,21,data_from_file,work_area
  534.   db '/RD/1/SS.ASM',0
  535.  
  536. I_END:
  537.  
  538.  
  539. ; UNINITIALIZED DATA:
  540.  
  541. lcolor           dd ?
  542. evtime           dd ?     ; время предыдущего события
  543. x_max            dw ?     ; размеры экрана
  544. y_max            dw ?
  545.  
  546. top_right_corner dd ?
  547. work_area:
  548. rb 0x10000
  549. data_from_file: