Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ;    UNIFORM WINDOW COLOURS & SKIN
  3. ;
  4. ;    Compile with FASM for Menuet
  5. ;
  6. ;    < russian edition by Ivan Poddubny >
  7. ;    < skin selection by Mike Semenyako >
  8. ;
  9.  
  10. ;******************************************************************************
  11.    use32
  12.    org     0
  13.    db      'MENUET01'  ; identifier
  14.    dd      1           ; header version
  15.    dd      START       ; start address
  16.    dd      I_END       ; file size
  17.    dd      28000h      ; memory
  18.    dd      28000h      ; stack pointer (0x10000+ - work area for os)
  19.    dd      0,0         ; parameters, reserved
  20.  
  21.    include 'lang.inc'
  22.    include 'macros.inc'
  23. ;******************************************************************************
  24.  
  25.  
  26. struct SKIN_HEADER
  27.   .ident   dd ?
  28.   .version dd ?
  29.   .params  dd ?
  30.   .buttons dd ?
  31.   .bitmaps dd ?
  32. ends
  33.  
  34. struct SKIN_PARAMS
  35.   .skin_height    dd ?
  36.   .margin.right   dw ?
  37.   .margin.left    dw ?
  38.   .margin.bottom  dw ?
  39.   .margin.top     dw ?
  40.   .colors.inner   dd ?
  41.   .colors.outer   dd ?
  42.   .colors.frame   dd ?
  43.   .colors_1.inner dd ?
  44.   .colors_1.outer dd ?
  45.   .colors_1.frame dd ?
  46.   .dtp.size       dd ?
  47.   .dtp.data       db 40 dup (?)
  48. ends
  49.  
  50. struct SKIN_BUTTONS
  51.   .type     dd ?
  52.   .pos:
  53.     .left   dw ?
  54.     .top    dw ?
  55.   .size:
  56.     .width  dw ?
  57.     .height dw ?
  58. ends
  59.  
  60. struct SKIN_BITMAPS
  61.   .kind  dw ?
  62.   .type  dw ?
  63.   .data  dd ?
  64. ends
  65.  
  66.  
  67. START:                          ; start of execution
  68.  
  69.     mov  eax,48                 ; get current colors
  70.     mov  ebx,3
  71.     mov  ecx,color_table
  72.     mov  edx,4*10
  73.     int  0x40
  74.  
  75.     cld
  76.     mov  esi,default_skn
  77.     mov  edi,fname
  78.     mov  ecx,default_skn.size
  79.     rep  movsb
  80.     mov  [skin_info.fname],0
  81.     mov  [skin_info.workarea],0x10000
  82.     call load_skin_file
  83.  
  84. ;    mov  esi, default_dtp
  85. ;    mov  edi, fname
  86. ;    mov  ecx, default_dtp.size
  87. ;    rep  movsb
  88.  
  89. red:
  90.     call draw_window            ; at first, draw the window
  91.  
  92. still:
  93.  
  94.     mov  eax,23                 ; wait here for event
  95.     mov  ebx,5
  96.     int  0x40
  97.  
  98.     dec  eax                    ; redraw request ?
  99.     jz   red
  100.     dec  eax                    ; key in buffer ?
  101.     jz   key
  102.     dec  eax                    ; button in buffer ?
  103.     jz   button
  104.  
  105.     call draw_cursor
  106.  
  107.     jmp  still
  108.  
  109.  
  110.   key:                          ; key
  111.     mov  al,2                   ; just read it and ignore
  112.     int  0x40
  113.     jmp  still
  114.  
  115.   button:                       ; button
  116.     mov  al,17                  ; get id
  117.     int  0x40
  118.  
  119.     cmp  ah,11                  ; read string
  120.     jne  no_string
  121.     call read_string
  122.     jmp  still
  123.   no_string:
  124.  
  125.     cmp  ah,12                  ; load file
  126.     jne  no_load
  127.     call load_file
  128.     call draw_window
  129.     jmp  still
  130.   no_load:
  131.  
  132.     cmp  ah,13                  ; save file
  133.     jne  no_save
  134.     call save_file
  135.     jmp  still
  136.   no_save:
  137.  
  138.     cmp  ah,14                  ; set 3d buttons
  139.     jne  no_3d
  140.     mov  eax,48
  141.     mov  ebx,1
  142.     mov  ecx,1
  143.     int  0x40
  144.     mov  eax,48
  145.     mov  ebx,0
  146.     mov  ecx,0
  147.     int  0x40
  148.     jmp  still
  149.    no_3d:
  150.  
  151.     cmp  ah,15                  ; set flat buttons
  152.     jne  no_flat
  153.     mcall 48, 1, 0
  154.     mcall 48, 0, 0
  155.     jmp  still
  156.   no_flat:
  157.  
  158.     cmp  ah,16                  ; apply
  159.     jne  no_apply
  160.   apply_direct:
  161.     mov  eax,48
  162.     mov  ebx,2
  163.     mov  ecx,color_table
  164.     mov  edx,10*4
  165.     int  0x40
  166.     mov  eax,48
  167.     mov  ebx,0
  168.     mov  ecx,0
  169.     int  0x40
  170.   no_apply:
  171.  
  172.     cmp  ah,17                  ; load skin file
  173.     jne  no_load_skin
  174.     call load_skin_file
  175.     call draw_window
  176.     jmp  still
  177.   no_load_skin:
  178.  
  179.     cmp   ah,18                 ; apply skin
  180.     jne   no_apply_skin
  181.     cmp   [skin_info.fname],0
  182.     je    no_apply_skin
  183.     mcall 48,8,skin_info
  184.     call  draw_window
  185.     jmp   still
  186.   no_apply_skin:
  187.  
  188.     cmp  ah,31
  189.     jb   no_new_colour
  190.     cmp  ah,41
  191.     jg   no_new_colour
  192.     shr  eax,8
  193.     sub  eax,31
  194.     shl  eax,2
  195.     mov  ebx,[color]
  196.     mov  [eax+color_table],ebx
  197.     cmp  dword[0x18000+SKIN_HEADER.ident],'SKIN'
  198.     jne  @f
  199.     mov  edi,[0x18000+SKIN_HEADER.params]
  200.     mov  dword[edi+0x18000+SKIN_PARAMS.dtp.data+eax],ebx
  201.     call draw_skin
  202. @@: call draw_colours
  203.     jmp  still
  204.   no_new_colour:
  205.  
  206.     cmp  ah,1                   ; terminate
  207.     jnz  noid1
  208.     or   eax,-1
  209.     int  0x40
  210.   noid1:
  211.  
  212.     jmp  still
  213.  
  214.  
  215. draw_cursor:
  216.  
  217.     pusha
  218.     mov  eax,37
  219.     mov  ebx,2
  220.     int  0x40
  221.  
  222.     cmp  eax,0
  223.     jne  dc1
  224.     popa
  225.     ret
  226.  
  227.  dc1:
  228.  
  229.     mov  eax,37
  230.     mov  ebx,1
  231.     int  0x40
  232.  
  233.     mov  ebx,eax
  234.     shr  ebx,16
  235.     mov  ecx,eax
  236.     and  ecx,0xffff
  237.  
  238.     cmp  ecx,32
  239.     jbe  no_color
  240.     cmp  ebx,32
  241.     jbe  no_color
  242.  
  243.     cmp  ebx,266           ; CHANGE COLOR
  244.     jb   no_color
  245.     cmp  ebx,266+20*3
  246.     jg   no_color
  247.  
  248.     cmp  ecx,30+128
  249.     jge  no_color
  250.     cmp  ecx,30
  251.     jb   no_color
  252.  
  253.     sub  ebx,266
  254.     mov  eax,ebx
  255.     cdq
  256.     mov  ebx,20
  257.     div  ebx
  258.     mov  ebx,2
  259.     sub  ebx,eax
  260.  
  261.     add  ecx,-30
  262.     not  ecx
  263.     shl  ecx,1
  264.  
  265.     mov  byte [ebx+color],cl
  266.     call draw_color
  267.  
  268.     popa
  269.     ret
  270.  
  271.   no_color:
  272.  
  273.     popa
  274.     ret
  275.  
  276.  
  277. load_file:
  278.     pushad
  279.  
  280.     mov   [read_info.mode]       ,0
  281.     mov   [read_info.start_block],0
  282.     mov   [read_info.blocks]     ,1
  283.     mov   [read_info.address]    ,color_table
  284.     mov   [read_info.workarea]   ,0x10000
  285.     mcall 58, read_info
  286.  
  287. ;   call  draw_colours
  288.  
  289.     popad
  290. ret
  291.  
  292. load_skin_file:
  293.     pushad
  294.  
  295.     mov   [read_info.mode]       ,0
  296.     mov   [read_info.start_block],0
  297.     mov   [read_info.blocks]     ,64
  298.     mov   [read_info.address]    ,0x20000
  299.     mov   [read_info.workarea]   ,0x10000
  300.     mcall 58, read_info
  301.  
  302.     cmp   dword[0x20000+SKIN_HEADER.ident],'SKIN'
  303.     jne   @f
  304.  
  305.     mov   esi,fname
  306.     mov   edi,skin_info.fname
  307.     mov   ecx,257
  308.     rep   movsb
  309.  
  310.     mov   esi,0x20000
  311.     mov   edi,0x18000
  312.     mov   ecx,0x8000/4
  313.     rep   movsd
  314.  
  315.     mov   ebp,0x18000
  316.     mov   esi,[ebp+SKIN_HEADER.params]
  317.     add   esi,ebp
  318.     lea   esi,[esi+SKIN_PARAMS.dtp.data]
  319.     mov   edi,color_table
  320.     mov   ecx,10
  321.     rep   movsd
  322.   @@:
  323.  
  324.     popad
  325. ret
  326.  
  327.  
  328. save_file:
  329.     pushad
  330.  
  331.     mov   [write_info.mode]       ,1
  332.     mov   [write_info.bytes2write],10*4
  333.     mov   [write_info.address]    ,color_table
  334.     mov   [write_info.workarea]   ,0x10000
  335.     mcall 58, write_info
  336.  
  337.     popad
  338. ret
  339.  
  340.  
  341. read_string:
  342.  
  343.     pusha
  344.  
  345.     mov  edi,fname
  346.     mov  al,'_'
  347.     mov  ecx,87
  348.     cld
  349.     rep  stosb
  350.  
  351.     call print_text
  352.  
  353.     mov  edi,fname
  354.  
  355.   f11:
  356.     mov  eax,10
  357.     int  0x40
  358.     cmp  eax,2
  359.     jne  read_done
  360.     mov  eax,2
  361.     int  0x40
  362.     shr  eax,8
  363.     cmp  eax,13
  364.     je   read_done
  365.     cmp  eax,8
  366.     jne  nobsl
  367.     cmp  edi,fname
  368.     je   f11
  369.     dec  edi
  370.     mov  [edi],byte '_'
  371.     call print_text
  372.     jmp  f11
  373.    nobsl:
  374.     mov  [edi],al
  375.  
  376.     call print_text
  377.  
  378.     inc  edi
  379.     cmp  edi, fname+87
  380.     jne  f11
  381.  
  382.   read_done:
  383.  
  384.     mov  ecx, fname
  385.     add  ecx, 88
  386.     sub  ecx, edi
  387.     mov  eax, 0
  388.     cld
  389.     rep  stosb
  390.  
  391.     call print_text
  392.  
  393.     popa
  394.  
  395.     ret
  396.  
  397.  
  398. print_text:
  399.     pushad
  400.  
  401.     mpack ebx,15,6*87+4
  402.     mpack ecx,(30+18*10+2),11
  403.     mcall 13,,,[w_work]
  404.  
  405.     mpack ebx,17,(30+18*10+4)
  406.     mcall 4,,[w_work_text],fname,87
  407.  
  408.     popad
  409. ret
  410.  
  411.  
  412. draw_color:
  413.  
  414.     pusha
  415.  
  416.     mov  eax,13
  417.     mov  ebx,266*65536+60
  418.     mov  ecx,170*65536+30
  419.     mov  edx,[color]
  420.     int  0x40
  421.  
  422. ;   mov  eax,13
  423.     mov  ebx,266*65536+60
  424.     mov  ecx,200*65536+10
  425.     mov  edx,[w_work]
  426.     int  0x40
  427.  
  428.     mov  eax,47
  429.     mov  ebx,0+1*256+8*65536
  430.     mov  ecx,[color]
  431.     mov  edx,272*65536+201
  432.     mov  esi,[w_work_text]
  433.     int  0x40
  434.  
  435.     popa
  436.  
  437.     ret
  438.  
  439.  
  440. draw_colours:
  441.  
  442.     pusha
  443.  
  444.     mov  esi,color_table
  445.  
  446.     mov  ebx,225*65536+32
  447.     mov  ecx,32*65536+12
  448.   newcol:
  449.     mov  eax,13
  450.     mov  edx,[esi]
  451.     int  0x40
  452.     add  ecx,18*65536
  453.     add  esi,4
  454.     cmp  esi,color_table+4*9
  455.     jbe  newcol
  456.  
  457.     popa
  458.  
  459.     ret
  460.  
  461.  
  462. draw_framerect: ; ebx,ecx
  463.         push    ebx ecx
  464.         add     bx,[esp+6]
  465.         mov     cx,[esp+2]
  466.         dec     ebx
  467.         mcall   38
  468.         add     cx,[esp]
  469.         rol     ecx,16
  470.         add     cx,[esp]
  471.         sub     ecx,0x00010001
  472.         mcall
  473.         mov     ebx,[esp+4]
  474.         mov     ecx,[esp]
  475.         mov     bx,[esp+6]
  476.         add     cx,[esp+2]
  477.         dec     ecx
  478.         mcall
  479.         add     bx,[esp+4]
  480.         rol     ebx,16
  481.         add     bx,[esp+4]
  482.         sub     ebx,0x00010001
  483.         mcall
  484.         add     esp,8
  485.         ret
  486.  
  487. find_bitmap:
  488.         mov     edi,[ebp+SKIN_HEADER.bitmaps]
  489.         add     edi,ebp
  490.         xor     ebx,ebx
  491.   .lp1: cmp     dword[edi],0
  492.         je      .lp2
  493.         cmp     dword[edi+0],eax
  494.         jne     @f
  495.         mov     ebx,[edi+SKIN_BITMAPS.data]
  496.         add     ebx,ebp
  497.         mov     ecx,[ebx-2]
  498.         mov     cx,[ebx+4]
  499.         add     ebx,8
  500.   .lp2: ret
  501.     @@: add     edi,8
  502.         jmp     .lp1
  503.  
  504. dec_edx:
  505.         sub     dl,4
  506.         jnc     @f
  507.         xor     dl,dl
  508.     @@: sub     dh,4
  509.         jnc     @f
  510.         xor     dh,dh
  511.     @@: rol     edx,16
  512.         sub     dl,4
  513.         jnc     @f
  514.         xor     dl,dl
  515.     @@: rol     edx,16
  516.         ret
  517.  
  518. area:
  519.   .x      = 345
  520.   .y      = 20
  521.   .width  = 206
  522.   .height = 191
  523.  
  524. wnd1:
  525.   .x      = area.x+49
  526.   .y      = area.y+5
  527.   .width  = 150
  528.   .height = 90
  529. wnd2:
  530.   .x      = area.x+35
  531.   .y      = area.y+35
  532.   .width  = 150
  533.   .height = 90
  534. wnd3:
  535.   .x      = area.x+21
  536.   .y      = area.y+65
  537.   .width  = 150
  538.   .height = 90
  539. wnd4:
  540.   .x      = area.x+7
  541.   .y      = area.y+95
  542.   .width  = 150
  543.   .height = 90
  544.  
  545. virtual at edi+SKIN_PARAMS.dtp.data
  546.   dtp system_colors
  547. end virtual
  548.  
  549. draw_skin:
  550.         mcall   13,<area.x,area.width>,<area.y+2,area.height-2>,0x00FFFFFF
  551.  
  552.         mov     ebp,0x18000
  553.         mov     edi,[ebp+SKIN_HEADER.params]
  554.         add     edi,ebp
  555.         mpack   ebx,wnd1.x,wnd1.width
  556.         mpack   ecx,wnd1.y,wnd1.height
  557.         mov     edx,[dtp.frame]
  558.         call    draw_framerect
  559.         mcall   13,<wnd1.x+1,wnd1.width-2>,<wnd1.y+1,wnd1.height-2>,dword[dtp.work]
  560.  
  561.         mov     eax,38
  562.         mpack   ebx,wnd1.x+1,wnd1.x+wnd1.width-2
  563.         mpack   ecx,wnd1.y+1,wnd1.y+1
  564.         mov     edx,[dtp.grab]
  565.         mov     esi,20
  566.     @@: mcall
  567.         call    dec_edx
  568.         add     ecx,0x00010001
  569.         dec     esi
  570.         jnz     @b
  571.  
  572.         mov     edi,[ebp+SKIN_HEADER.params]
  573.         add     edi,ebp
  574.         mcall   4,<wnd1.x+6,wnd1.y+7>,dword[dtp.grab_text],caption_text,caption_text.size
  575.  
  576.         mcall   8,<wnd1.x+wnd1.width-18,12>,<wnd1.y+4,12>,0,[dtp.grab_button]
  577.         mcall   4,<wnd1.x+wnd1.width-18+4,wnd1.y+4+2>,dword[dtp.grab_button_text],close_text,close_text.size
  578.  
  579. ;----------------------------------------------------------------------
  580.  
  581.         mov     edi,[ebp+SKIN_HEADER.params]
  582.         add     edi,ebp
  583.         mpack   ebx,wnd2.x,wnd2.width
  584.         mpack   ecx,wnd2.y,wnd2.height
  585.         mov     edx,[dtp.frame]
  586.         shr     edx,1
  587.         and     edx,0x007F7F7F
  588.         call    draw_framerect
  589.         mpack   ebx,wnd2.x+4,wnd2.width-8
  590.         mpack   ecx,wnd2.y+4,wnd2.height-8
  591.         call    draw_framerect
  592.         mcall   13,<wnd2.x+1,wnd2.width-2>,<wnd2.y+1,3>,[dtp.frame]
  593.         add     ecx,(wnd2.height-5)*65536
  594.         mcall
  595.         mcall   ,<wnd2.x+1,3>,<wnd2.y+1,wnd2.height-2>
  596.         add     ebx,(wnd2.width-5)*65536
  597.         mcall
  598.         mcall   ,<wnd2.x+5,wnd2.width-10>,<wnd2.y+5,wnd2.height-10>,dword[dtp.work]
  599.  
  600.         mov     eax,38
  601.         mpack   ebx,wnd2.x+4,wnd2.x+wnd2.width-5
  602.         mpack   ecx,wnd2.y+4,wnd2.y+4
  603.         mov     edx,[dtp.grab]
  604.         mov     esi,16
  605.     @@: mcall
  606.         call    dec_edx
  607.         add     ecx,0x00010001
  608.         dec     esi
  609.         jnz     @b
  610.  
  611.         mov     edi,[ebp+SKIN_HEADER.params]
  612.         add     edi,ebp
  613.         mcall   4,<wnd2.x+8,wnd2.y+7>,dword[dtp.grab_text],caption_text,caption_text.size
  614.  
  615.         mcall   8,<wnd2.x+wnd2.width-20,12>,<wnd2.y+4,12>,0,[dtp.grab_button]
  616.         mcall   4,<wnd2.x+wnd2.width-20+4,wnd2.y+4+2>,dword[dtp.grab_button_text],close_text,close_text.size
  617.  
  618. ;----------------------------------------------------------------------
  619.  
  620.         mov     edi,[ebp+SKIN_HEADER.params]
  621.         add     edi,ebp
  622.         mpack   ebx,wnd3.x,wnd3.width
  623.         mpack   ecx,wnd3.y,wnd3.height
  624.         mov     edx,[edi+SKIN_PARAMS.colors_1.outer]
  625.         call    draw_framerect
  626.         mpack   ebx,wnd3.x+4,wnd3.width-8
  627.         mpack   ecx,wnd3.y+4,wnd3.height-8
  628.         mov     edx,[edi+SKIN_PARAMS.colors_1.inner]
  629.         call    draw_framerect
  630.         mcall   13,<wnd3.x+1,wnd3.width-2>,<wnd3.y+1,3>,[edi+SKIN_PARAMS.colors_1.frame]
  631.         add     ecx,(wnd3.height-5)*65536
  632.         mcall
  633.         mcall   ,<wnd3.x+1,3>,<wnd3.y+1,wnd3.height-2>
  634.         add     ebx,(wnd3.width-5)*65536
  635.         mcall
  636.         mcall   ,<wnd3.x+5,wnd3.width-10>,<wnd3.y+5,wnd3.height-10>,dword[dtp.work]
  637.  
  638.         mov     eax,0x00000001 ; left, inactive
  639.         call    find_bitmap
  640.         mcall   7,,,<wnd3.x,wnd3.y>
  641.  
  642.         pushd   [ebx-8]
  643.         mov     eax,0x00000003 ; base, inactive
  644.         call    find_bitmap
  645.         pop     edx
  646.         mov     esi,wnd3.x+wnd3.width-1
  647.         sub     esi,edx
  648.         shl     edx,16
  649.         add     edx,wnd3.x*65536+wnd3.y
  650.         mcall   7
  651.     @@: rol     edx,16
  652.         add     dx,[ebx-8]
  653.         cmp     dx,si
  654.         ja      @f
  655.         rol     edx,16
  656.         mcall   7
  657.         jmp     @b
  658.     @@:
  659.  
  660.         mov     eax,0x00000002 ; oper, inactive
  661.         call    find_bitmap
  662.         mov     edx,ecx
  663.         shr     edx,16
  664.         neg     edx
  665.         shl     edx,16
  666.         add     edx,(wnd3.x+wnd3.width)*65536+wnd3.y
  667.         mcall   7
  668.  
  669.         mov     ebp,0x18000
  670.         mov     edi,[ebp+SKIN_HEADER.params]
  671.         add     edi,ebp
  672.         mov     eax,dword[edi+SKIN_PARAMS.margin.left-2]
  673.         mov     ax,word[edi+SKIN_PARAMS.skin_height]
  674.         sub     ax,[edi+SKIN_PARAMS.margin.bottom]
  675.         shr     ax,1
  676.         add     ax,[edi+SKIN_PARAMS.margin.top]
  677.         add     ax,-4
  678.         push    eax
  679.         lea     ebx,[eax+wnd3.x*65536+wnd3.y]
  680.         mcall   4,,dword[dtp.grab_text],caption_text,caption_text.size
  681.  
  682. ;---------------------------------------------------------
  683.  
  684.         mov     edi,[ebp+SKIN_HEADER.params]
  685.         add     edi,ebp
  686.         mpack   ebx,wnd4.x,wnd4.width
  687.         mpack   ecx,wnd4.y,wnd4.height
  688.         mov     edx,[edi+SKIN_PARAMS.colors.outer]
  689.         call    draw_framerect
  690.         mpack   ebx,wnd4.x+4,wnd4.width-8
  691.         mpack   ecx,wnd4.y+4,wnd4.height-8
  692.         mov     edx,[edi+SKIN_PARAMS.colors.inner]
  693.         call    draw_framerect
  694.         mcall   13,<wnd4.x+1,wnd4.width-2>,<wnd4.y+1,3>,[edi+SKIN_PARAMS.colors.frame]
  695.         add     ecx,(wnd4.height-5)*65536
  696.         mcall
  697.         mcall   ,<wnd4.x+1,3>,<wnd4.y+1,wnd4.height-2>
  698.         add     ebx,(wnd4.width-5)*65536
  699.         mcall
  700.         mcall   ,<wnd4.x+5,wnd4.width-10>,<wnd4.y+5,wnd4.height-10>,dword[dtp.work]
  701.  
  702.         mov     eax,0x00010001 ; left, inactive
  703.         call    find_bitmap
  704.         mcall   7,,,<wnd4.x,wnd4.y>
  705.  
  706.         pushd   [ebx-8]
  707.         mov     eax,0x00010003 ; base, inactive
  708.         call    find_bitmap
  709.         pop     edx
  710.         mov     esi,wnd4.x+wnd4.width-1
  711.         sub     esi,edx
  712.         shl     edx,16
  713.         add     edx,wnd4.x*65536+wnd4.y
  714.         mcall   7
  715.     @@: rol     edx,16
  716.         add     dx,[ebx-8]
  717.         cmp     dx,si
  718.         ja      @f
  719.         rol     edx,16
  720.         mcall   7
  721.         jmp     @b
  722.     @@:
  723.  
  724.         mov     eax,0x00010002 ; oper, inactive
  725.         call    find_bitmap
  726.         mov     edx,ecx
  727.         shr     edx,16
  728.         neg     edx
  729.         shl     edx,16
  730.         add     edx,(wnd4.x+wnd4.width)*65536+wnd4.y
  731.         mcall   7
  732.  
  733.         mov     ebp,0x18000
  734.         mov     edi,[ebp+SKIN_HEADER.params]
  735.         add     edi,ebp
  736.         pop     eax
  737.         lea     ebx,[eax+wnd4.x*65536+wnd4.y]
  738.         mcall   4,,dword[dtp.grab_text],caption_text,caption_text.size
  739.  
  740. ;----------------------------------------------------------------------
  741.  
  742.         mov     edi,[ebp+SKIN_HEADER.buttons]
  743.         add     edi,ebp
  744.   .lp1: cmp     dword[edi],0
  745.         je      .lp2
  746.         mov     ebx,dword[edi+SKIN_BUTTONS.left-2]
  747.         mov     bx,[edi+SKIN_BUTTONS.width]
  748.         mov     ecx,dword[edi+SKIN_BUTTONS.top-2]
  749.         mov     cx,[edi+SKIN_BUTTONS.height]
  750.         add     ebx,(wnd4.x+wnd4.width)*65536
  751.         add     ecx,wnd4.y*65536
  752.         dec     ebx
  753.         dec     ecx
  754.         mcall   8,,,0x40000000
  755.         add     edi,12
  756.         jmp     .lp1
  757.   .lp2:
  758.  
  759.         mov     edi,[ebp+SKIN_HEADER.params]
  760.         add     edi,ebp
  761.         mpack   ebx,wnd4.x+10,wnd4.y+10
  762.         add     bx,word[edi+SKIN_PARAMS.skin_height]
  763.         mcall   4,,[dtp.work_text],window_text,window_text.size
  764.  
  765.         mov     ecx,[edi+SKIN_PARAMS.skin_height]
  766.         shl     ecx,16
  767.         add     ecx,(wnd4.y+8)*65536+10
  768.         mcall   13,<wnd4.x+window_text.size*6+20,wnd4.x+wnd4.width-10-\
  769.                    (wnd4.x+window_text.size*6+20)>,,[dtp.work_graph]
  770.  
  771.         add     ecx,25*65536+8
  772.         mcall   8,<wnd4.x+wnd4.width/2-button_text.size*3-6,\
  773.                   button_text.size*6+11>,,0,[dtp.work_button]
  774.  
  775.         shr     ecx,16
  776.         mov     bx,cx
  777.         add     ebx,0x00060006
  778.         mcall   4,,[dtp.work_button_text],button_text,button_text.size
  779.  
  780.         ret
  781.  
  782. ;   *********************************************
  783. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  784. ;   *********************************************
  785.  
  786.  
  787. draw_window:
  788.  
  789.     mov  eax,12                    ; function 12:tell os about windowdraw
  790.     mov  ebx,1                     ; 1, start of draw
  791.     int  0x40
  792.  
  793.     mov  eax,48
  794.     mov  ebx,3
  795.     mov  ecx,app_colours
  796.     mov  edx,10*4
  797.     int  0x40
  798.  
  799.     mov  eax,14
  800.     int  0x40
  801.  
  802.                                       ; DRAW WINDOW
  803.     mov  eax,0                     ; function 0 : define and draw window
  804.     mov  ebx,110*65536+555         ; [x start] *65536 + [x size]
  805.     mov  ecx,50*65536+255          ; [y start] *65536 + [y size]
  806.     mov  edx,[w_work]              ; color of work area RRGGBB,8->color
  807.     or   edx,0x13000000
  808.     mov  edi,header                ; WINDOW LABEL
  809.     int  0x40
  810.  
  811. if lang eq ru
  812.   load_w  = (5*2+6*9)
  813.   save_w  = (5*2+6*9)
  814.   flat_w  = (5*2+6*7)
  815.   apply_w = (5*2+6*9)
  816. else
  817.   load_w  = (5*2+6*6)
  818.   save_w  = (5*2+6*6)
  819.   flat_w  = (5*2+6*4)
  820.   apply_w = (5*2+6*7)
  821. end if
  822.  
  823.     mov  eax,8                    ; FILENAME BUTTON
  824.     mov  ebx,5*65536+545
  825.     mov  ecx,212*65536+10
  826.     mov  edx,0x4000000B
  827.     mov  esi,[w_grab_button]       ; button color RRGGBB
  828.     int  0x40
  829.  
  830. ;   mov  eax,8                    ; LOAD BUTTON
  831.     mov  ebx,15*65536+load_w
  832.     mov  ecx,(30+18*11)*65536+14
  833.     mov  edx,12
  834.     mov  esi,[w_work_button]
  835.     int  0x40
  836.  
  837. ;   mov  eax,8                    ; SAVE BUTTON
  838.     add  ebx,(load_w+2)*65536-load_w+save_w
  839.     inc  edx
  840.     int  0x40
  841.  
  842. ;   mov  eax,8                    ; 3D
  843. ;   mov  ebx,15*65536+35
  844. ;   mov  ecx,(30+18*12)*65536+14
  845.     mov  ebx,(340-t1.size*6-13)*65536+(5*2+6*4)
  846.     inc  edx
  847.     int  0x40
  848.  
  849. ;   mov  eax,8                    ; FLAT
  850.     add  ebx,(5*2+6*4+2)*65536-(5*2+6*4)+flat_w
  851.     inc  edx
  852.     int  0x40
  853.  
  854. ;   mov  eax,8                    ; APPLY BUTTON
  855.     add  ebx,(flat_w+6+2)*65536-flat_w+apply_w
  856.     inc  edx
  857.     int  0x40
  858.  
  859. ;   mov  eax,8                    ; LOAD SKIN BUTTON
  860.     mov  ebx,(336+(555-335)/2-t2.size*6/2)*65536+load_w
  861.     inc  edx
  862.     int  0x40
  863.  
  864. ;   mov  eax,8                    ; APPLY SKIN BUTTON
  865.     add  ebx,(load_w+6+2)*65536-load_w+apply_w
  866.     inc  edx
  867.     int  0x40
  868.  
  869.     mov  eax, 4
  870.     mov  ebx, (339-t1.size*6-12)*65536+(30+18*11+4)
  871.     mov  ecx, [w_work_button_text]
  872.     mov  edx, t1
  873.     mov  esi, t1.size
  874.     int  0x40
  875.  
  876.     mov  ebx,(336+(555-335)/2-t2.size*6/2)*65536+(30+18*11+4)
  877.     mov  edx,t2
  878.     mov  esi,t2.size
  879.     int  0x40
  880.  
  881. ;   mov  eax, 4
  882. ;    mov  ebx, 277*65536+(30+18*12+4)
  883. ;    mov  edx, t2
  884. ;    mov  esi, t2.size
  885. ;    int  0x40
  886.  
  887.     mov  eax,38                    ; R G B COLOR GLIDES
  888.     mov  ebx,266*65536+285
  889.     mov  ecx,30*65536+30
  890.     mov  edx,0xff0000
  891.   .newl:
  892.     int  0x40
  893.     pusha
  894.     add  ebx,20*65536+20
  895.     shr  edx,8
  896.     int  0x40
  897.     add  ebx,20*65536+20
  898.     shr  edx,8
  899.     int  0x40
  900.     popa
  901.     sub  edx,0x020000
  902.     add  ecx,0x00010001
  903.     cmp  ecx,158*65536+158
  904.     jnz  .newl
  905.  
  906.     call draw_color
  907.  
  908.     mov  edx,31                    ; BUTTON ROW
  909.     mov  ebx,15*65536+200
  910.     mov  ecx,30*65536+14
  911.     mov  esi,[w_work_button]
  912.   newb:
  913.     mov  eax,8
  914.     int  0x40
  915.     add  ecx,18*65536
  916.     inc  edx
  917.     cmp  edx,40
  918.     jbe  newb
  919.  
  920.     mov  ebx,15*65536+34           ; ROW OF TEXTS
  921.     mov  ecx,[w_work_button_text]
  922.     mov  edx,text
  923.     mov  esi,32
  924.   newline:
  925.     mov  eax,4
  926.     int  0x40
  927.     add  ebx,18
  928.     add  edx,32
  929.     cmp  [edx],byte 'x'
  930.     jne  newline
  931.  
  932.     call draw_colours
  933.  
  934.     mcall 13,<5,546>,<212,11>,[w_work]
  935.     mcall 13,<337,7>,<2,250>,[w_frame]
  936.     shr   edx,1
  937.     and   edx,0x007F7F7F
  938.     mcall 38,<336,336>,<20,250>
  939.     add   ebx,0x00080008
  940.     mcall
  941.     sub   ebx,0x00040004
  942.     mcall ,,<0,255>
  943.     mcall ,<5,550>,<211,211>
  944.     add   ecx,0x000C000C
  945.     mcall
  946.  
  947.     call print_text
  948.  
  949.     cmp  dword[0x18000+SKIN_HEADER.ident],'SKIN'
  950.     jne  @f
  951.     call draw_skin
  952.   @@:
  953.  
  954.     mov  eax,12                    ; function 12:tell os about windowdraw
  955.     mov  ebx,2                     ; 2, end of draw
  956.     int  0x40
  957.  
  958.     ret
  959.  
  960.  
  961. ; DATA AREA
  962.  
  963. lsz text,\
  964.     ru,  ' €ŒŠ€ ŽŠ€                     ',\
  965.     ru,  ' Ž‹Ž‘€ ‡€ƒŽ‹Ž‚Š€               ',\
  966.     ru,  ' ŠŽŠ€ € Ž‹Ž‘… ‡€ƒŽ‹Ž‚Š€     ',\
  967.     ru,  ' ’…Š‘’ € ŠŽŠ… € ‡€ƒŽ‹Ž‚Š…   ',\
  968.     ru,  ' ’…Š‘’ ‡€ƒŽ‹Ž‚ŽŠ€               ',\
  969.     ru,  ' €Ž—€Ÿ Ž‹€‘’œ                ',\
  970.     ru,  ' ŠŽŠ€ ‚ €Ž—…‰ Ž‹€‘’ˆ       ',\
  971.     ru,  ' ’…Š‘’ € ŠŽŠ…                ',\
  972.     ru,  ' ’…Š‘’ ‚ €Ž—…‰ Ž‹€‘’ˆ        ',\
  973.     ru,  ' ƒ€”ˆŠ€ ‚ €Ž—…‰ Ž‹€‘’ˆ      ',\
  974.     ru,  '                                ',\
  975.     ru,  ' ‡€ƒ“‡ˆ’œ  ‘Ž•€ˆ’œ           ',\
  976.     ru,  'x',\
  977.     en,  ' WINDOW FRAME                   ',\
  978.     en,  ' WINDOW GRAB BAR                ',\
  979.     en,  ' WINDOW GRAB BUTTON             ',\
  980.     en,  ' WINDOW GRAB BUTTON TEXT        ',\
  981.     en,  ' WINDOW GRAB TITLE              ',\
  982.     en,  ' WINDOW WORK AREA               ',\
  983.     en,  ' WINDOW WORK AREA BUTTON        ',\
  984.     en,  ' WINDOW WORK AREA BUTTON TEXT   ',\
  985.     en,  ' WINDOW WORK AREA TEXT          ',\
  986.     en,  ' WINDOW WORK AREA GRAPH         ',\
  987.     en,  '                                ',\
  988.     en,  '  LOAD    SAVE                  ',\
  989.     en,  'x'
  990.  
  991.  
  992. lsz t1,\
  993.     ru, '  3D   ‹Ž‘Šˆ…   ˆŒ…ˆ’œ ',\
  994.     en, '  3D   FLAT    APPLY  '
  995.  
  996. lsz t2,\
  997.     ru,  ' ‡€ƒ“‡ˆ’œ   ˆŒ…ˆ’œ ',\
  998.     en,  '  LOAD     APPLY  ',\
  999.  
  1000. lsz caption_text,\
  1001.     ru, '‡ £®«®¢®ª',\
  1002.     en, 'Caption'
  1003.  
  1004. sz  close_text,'x'
  1005.  
  1006. lsz window_text,\
  1007.     ru, '’¥ªáâ ¢ ®ª­¥',\
  1008.     en, 'Window text'
  1009.  
  1010. lsz button_text,\
  1011.     ru, '’¥ªáâ ­  ª­®¯ª¥',\
  1012.     en, 'Button text'
  1013.  
  1014. sz  default_skn, '/RD/1/DEFAULT.SKN',0
  1015.  
  1016. if lang eq ru
  1017.   header db '€‘’Ž‰Š€ ŽŠŽ',0
  1018. else
  1019.   header db 'WINDOWS SETTINGS - DEFINE COLOR AND CLICK ON TARGET',0
  1020. end if
  1021.  
  1022.  
  1023. color dd  0
  1024.  
  1025. I_END:
  1026.  
  1027. read_info:
  1028.   .mode         dd ?            ; read
  1029.   .start_block  dd ?            ; first block
  1030.   .blocks       dd ?            ; 512 bytes
  1031.   .address      dd ?
  1032.   .workarea     dd ?
  1033. fname rb 256+1            ; filename (+1 - for zero at the end)
  1034.  
  1035. virtual at read_info
  1036.  write_info:
  1037.   .mode         dd ?
  1038.   rd 1
  1039.   .bytes2write  dd ?
  1040.   .address      dd ?
  1041.   .workarea     dd ?
  1042. end virtual
  1043.  
  1044. skin_info:
  1045.   .mode         dd ?
  1046.   .start_block  dd ?
  1047.   .blocks       dd ?
  1048.   .address      dd ?
  1049.   .workarea     dd ?
  1050.   .fname rb 256+1
  1051.  
  1052. app_colours:
  1053.  
  1054. w_frame              dd ?
  1055. w_grab               dd ?
  1056. w_grab_button        dd ?
  1057. w_grab_button_text   dd ?
  1058. w_grab_text          dd ?
  1059. w_work               dd ?
  1060. w_work_button        dd ?
  1061. w_work_button_text   dd ?
  1062. w_work_text          dd ?
  1063. w_work_graph         dd ?
  1064.  
  1065. color_table:
  1066.   times 10 dd ?
  1067.