Subversion Repositories Kolibri OS

Rev

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