;********************************
;*                              *
;*     DESKTOP ICON MANAGER     *
;*                              *
;*  Compile with flat assembler *
;*                              *
;********************************
;  22.02.05 was modified for work with new multi-thread ICON.
;  8.03.07 ïåðåõîä íà 70 ôóíêöèþ by SPraid
;******************************************************************************
RAW_SIZE equ 350000
ICON_SIZE equ 32*32*3
GIF_SIZE equ 45000
REC_SIZE equ 80
ICONS_DAT equ '/sys/ICONS.DAT'
ICON_APP equ '/sys/ICON'
ICON_STRIP equ '/sys/ICONSTRP.GIF'

  use32
  org    0x0
  db     'MENUET01'     ; 8 byte id
  dd     0x01           ; header version
  dd     START          ; start of code
  dd     I_END          ; size of image
  dd     icon_data+0x30000        ; memory for app
  dd     icon_data+0x30000        ; esp
  dd     I_Param , 0x0  ; I_Param , I_Icon
include  '..\..\..\macros.inc'
include  'lang.inc'
COLOR_ORDER equ MENUETOS
include  'gif_lite.inc'
;include  'debug.inc'
purge newline
;******************************************************************************
START:                       ; start of execution
    mcall 70,finfo
    cmp   ebx,GIF_SIZE
    ja    close
    mov   esi,gif_file
    mov   edi,strip_file
    mov   eax,icon_data
    call  ReadGIF
    mov  eax,dword[edi+4]
    shr  eax,5
    mov  [icon_count],eax
    call load_ic
  boot_str:
    cmp   [I_Param],dword 'BOOT'
    je   load_icon_list2
      call  load_icon_list
 red:
    call draw_window         ; at first, draw the window
    mov  esi,[current_icon]
    jmp  band
still:

    mov  eax,10              ; wait here for event
    mcall

    dec  eax                   ; redraw request ?
    jz   red
    dec  eax                   ; key in buffer ?
    jz   key

  button:                    ; button
    mov  al,17              ; get id
    mcall

    shr  eax,8

    cmp  eax,1               ; button id=1 ?
    je   close
  noclose:
      mov  esi,[current_icon]
      add  esi,12
    mov  ebx,[cur_band];eax
    cmp  eax,31
    jne  .no_back
    add  ebx,8
    mov  eax,[icon_count]
    cmp  eax,ebx
    jae  .drwic2
    xor  ebx,ebx
    jmp  .drwic2
  .no_back:
    cmp  eax,30
    jne  .no_side
    test ebx,ebx
    jnz  .dec
    mov  ebx,[icon_count]
         and  ebx,0xfffffff8
    add  ebx,8
  .dec:
    sub  ebx,8
  .drwic2:
    mov  [cur_band],ebx
  .drwic1:
    call draw_icon
    jmp  still
    .no_side:
       cmp  eax,32
       jne  .no_ico
       push ebx
       mcall 37,1
       pop  ebx
          shr  eax,16
       sub  eax,33-19
          mov  edi,34
          xor  edx,edx
          div  edi
    lea  ecx,[ebx+eax]
    cmp  ecx,[icon_count]
    jae  still
          mov  [sel_icon1],eax
          mov  ecx,eax
    add  eax,ebx
    call itoa
          jmp  .drwic1
  .no_ico:
    cmp  eax,11
    jb   no_str
    cmp  eax,13
    jg   no_str
    call read_string
    jmp  still
  no_str:


    cmp  eax,21              ; apply changes
    jne  no_apply

    ; (1) save list

    mov  ebx,finfo							; Change by spraid
    mov  dword[ebx],2
    mov  edx,REC_SIZE
    imul edx,dword [icons]
    mov  [ebx+12],edx
    mov  esi,iconlst
    call lst_path
    mov eax,70
    mcall

    ; (2) terminate all icons
    mov  eax,9
    mov  ebx,I_END
    or      ecx,-1
    mcall
    mov  edi,[ebx+30]
     newread2:
    mov  esi,1
   newread:
    inc  esi
    mov  eax,9
    mov  ebx,I_END
    mov  ecx,esi
    mcall
    cmp  edi,[ebx+30]
    je   newread
    cmp  esi,eax
    jg   all_terminated

    mov  eax,[I_END+10]
    and  eax,not 20202020h
    cmp  eax,'@ICO'
    jz   @f
    cmp  eax,'ICON'
    jne  newread
   @@:
    mov  eax,51
    cmp  eax,[I_END+42]
    jne  newread
    cmp  eax,[I_END+46]
    jne  newread

    mov  eax,18
    mov  ebx,2
    mov  ecx,esi
    mcall

    jmp  newread2

finfo_start:
        dd      7
        dd      0
.params dd      0
        dd      0
        dd      0
        db      0
        dd      finfo.path



finfo:
        dd 0
        dd 0
        dd 0
        dd GIF_SIZE
        dd gif_file
  .path:
        db ICON_STRIP,0
        rb 31-($-.path)


   all_terminated:

   apply_changes:

        mov     ebx, finfo_start
        mov     dword [ebx+8], boot_str+6
        mov     esi, iconname
        call    lst_path
        mov     eax, 70
        mcall
    jmp   still

  no_apply:

    cmp  eax,22                 ; user pressed the 'add icon' button
    jne  no_add_icon

    mov  eax,4
    mov  ebx,24*65536+250+8*14
    mov  ecx,0xc0ff0000
    mov  edx,add_text
    mov  edi,0xffffff
    mcall

    mov  eax,10
    mcall
    cmp  eax,3
    jne  still
    mov  eax,17
    mcall
    shr  eax,8
    cmp  eax,40
    jb   no_f
    mov  edi,eax
    sub  eax,40

    xor  edx,edx  ; bcd -> 10
    mov  ebx,16
    div  ebx
    imul eax,10
    add  eax,edx

    mov  ebx,eax
    add  ebx,icons_reserved
    cmp  [ebx],byte 'x'
    je   no_f
    mov  [ebx],byte 'x'

    mov  [cur_btn],edi
    xor  edx,edx
    mov  ebx,10
    div  ebx
    add  eax,65
    add  edx,65
    mov  [icon_default+0],dl
    mov  [icon_default+1],al

    inc  dword [icons]
    mov  edi,[icons]
    dec  edi
    imul edi,REC_SIZE
    add  edi,icon_data

    mov  [current_icon],edi

    mov  esi,icon_default
    mov  ecx,REC_SIZE
    cld
    rep  movsb
    mov  esi,[current_icon]
    jmp  band
  no_f:

    call draw_btns;draw_window

    jmp  still

  no_add_icon:


    cmp  eax,23                     ; user pressed the remove icon button
    jne  no_remove_icon

    mov  eax,4
    mov  ebx,24*65536+250+8*14
    mov  ecx,0xc0ff0000
    mov  edx,rem_text
    mov  edi,0xffffff
    mcall

    mov  eax,10
    mcall
    cmp  eax,3
    jne  no_f;ound
    mov  eax,17
    mcall
    shr  eax,8
    cmp  eax,40
    jb   red;no_f;ound
    sub  eax,40

    xor  edx,edx
    mov  ebx,16
    div  ebx
    imul eax,10
    add  eax,edx

    mov  ebx,eax
    add  ebx,icons_reserved
    cmp  [ebx],byte 'x'
    jne  red
    mov  [ebx],byte ' '

    xor  edx,edx
    mov  ebx,10
    div  ebx
    shl  eax,8
    mov  al,dl

    add  eax,65*256+65

    mov  esi,icon_data
    mov  edi,REC_SIZE
    imul edi,[icons]
    add  edi,icon_data
  news:
    cmp  word [esi],ax
    je   foundi
    add  esi,REC_SIZE
    cmp  esi,edi
    jb   news
    jmp  red

  foundi:

    mov  ecx,edi
    sub  ecx,esi

    mov  edi,esi
    add  esi,REC_SIZE

    cld
    rep  movsb

    dec  [icons]

    mov  eax,icon_data
    mov  [current_icon],eax
    movzx ebx,word[eax]
    sub  bx,'AA'
    shl  bl,4
    shr  ebx,4
    add  ebx,40
    mov  [cur_btn],ebx

    jmp  red

  no_remove_icon:

    cmp  eax,40                 ; user pressed button for icon position
    jb   no_on_screen_button
    mov  edi,eax
    sub  eax,40
    mov  edx,eax
    shl  eax,4
    and  edx,0xf
    mov  dh,ah
    add  edx,65*256+65

    mov  esi,icon_data
    mov  ecx,[icons]
    cld
   findl1:
    cmp  dx,[esi]
    je   foundl1
    add  esi,REC_SIZE
    loop findl1
    jmp  still

   foundl1:

    mov  [current_icon],esi
    mov  [cur_btn],edi
   band:
    add  esi,12
    call atoi
    and  eax,0xfffff8
    mov  [cur_band],eax
    call draw_btns

    jmp  still

  no_on_screen_button:


    jmp  still
 

current_icon dd icon_data


print_strings:

    pusha

    mov  eax,13              ; clear text area
    mov  ebx,100*65536+180
    mov  ecx,(278+12)*65536+40
    mov  edx,0xffffff
    mcall

          xor  edi,edi
    mov  eax,4               ; icon text
    mov  ebx,100*65536+278+14
    mov  ecx,3
  .ll:
    push ecx
    mov  ecx,0x000000
    mov  edx,[current_icon]
    add  edx,[positions+edi*4]
    movzx esi,byte[str_lens+edi]
    inc  edi
    mcall
    add  ebx,14
    pop  ecx
    loop .ll

    popa
    ret

iconlst db ICONS_DAT,0

load_icon_list:

    mov   edi,icons_reserved   ; clear reserved area
    mov   eax,32
    mov   ecx,10*9
    cld
    rep   stosb

    mov   ecx,[icons]          ; set used icons to reserved area
    mov   esi,icon_data
  ldl1:
    movzx ebx,byte [esi+1]
    sub   ebx,65
    imul  ebx,10
    movzx eax,byte [esi]
    add   ebx,eax
    sub   ebx,65
    add   ebx,icons_reserved
    mov   [ebx],byte 'x'
    add   esi,REC_SIZE
    loop  ldl1
    ret

lst_path:
    mov   ecx,30
    mov   edi,finfo.path
    rep   movsb
    ret

load_ic:
    mov   ebx,finfo
    mov   dword[ebx+12],48*REC_SIZE
    mov   dword[ebx+16],icon_data
    mov   esi,iconlst
    call  lst_path
    mcall 70
    lea   eax,[ebx+10]
    xor   edx,edx
    mov   ebx,REC_SIZE
    div   ebx
    mov   [icons],eax
        ret


positions dd 3,16,47
str_lens db 8,30,30

read_string:
    pusha
    sub  eax,11
    movzx ecx,byte[str_lens+eax]
    mov  [cur_str],ecx
    mov  eax,[positions+eax*4]

    mov  edi,[current_icon]
    add  edi,eax
    mov  [addr],edi

          add  edi,ecx

  .l1:
    dec  edi
    cmp  byte[edi],' '
    jne  .found
    mov  byte[edi],'_'
    loop .l1
    dec  edi
  .found:
    inc  edi
    push  edi
    call print_strings

    pop  edi
  f11:
    mov  eax,10
    mcall
    cmp  eax,2
    jz   fbu
    jmp  rs_done
  fbu:
    mov  eax,2
    mcall
    shr  eax,8
    cmp  eax,13
    je   rs_done
    cmp  eax,8
    jnz  nobsl
    cmp  edi,[addr]
    jz   f11
    dec  edi
    mov  [edi],byte '_'
    call print_strings
    jmp  f11
  nobsl:
    cmp  eax,31
    jbe  f11
    mov  [edi],al
    call print_strings

    inc  edi
    mov  esi,[addr]
    add  esi,[cur_str]
    cmp  esi,edi
    jnz  f11

   rs_done:

    mov  ecx,[addr]
    add  ecx,[cur_str]
    sub  ecx,edi
    mov  eax,32
    cld
    rep  stosb
    call print_strings
    popa
    ret

 key:                       ; key
    mov  al,2               ; just read it and ignore
    mcall
    jmp  still

;   *********************************************
;   *******  WINDOW DEFINITIONS AND DRAW ********
;   *********************************************


draw_window:

    mov  eax,12                    ; function 12:tell os about windowdraw
    mov  ebx,1                     ; 1, start of draw
    mcall

                                   ; DRAW WINDOW
    xor  eax,eax
    mov  ebx,210*65536+300
    mov  ecx,30*65536+390-14
    mov  edx,0x14ffffff
    mov  edi,title       ; WINDOW LABEL
    mcall

    mov  eax,13                    ; WINDOW AREA
    mov  ebx,20*65536+260
    mov  ecx,35*65536+200
    mov  edx,0x3366cc
    mcall

    mov  eax,38                    ; VERTICAL LINE ON WINDOW AREA
    mov  ebx,150*65536+150
    mov  ecx,35*65536+235
    mov  edx,0xffffff
    mcall

    mov  eax,38                    ; HOROZONTAL LINE ON WINDOW AREA
    mov  ebx,20*65536+280
    mov  ecx,135*65536+135
    mov  edx,0xffffff
    mcall

    mov  eax,8                     ; TEXT ENTER BUTTONS
    mov  ebx,20*65536+72
    mov  ecx,(275+1+14)*65536+13-2
    mov  edx,11
    mov  esi,[bcolor]
    mcall
    inc  edx
    add  ecx,14*65536
    mcall
    inc  edx
    add  ecx,14*65536
    mcall

;    mov  eax,8                     ; APPLY AND SAVE CHANGES BUTTON
    mov  ebx,20*65536+259
    mov  ecx,(329+2)*65536+15-4
    mov  edx,21
    mov  esi,[bcolor]
    mcall

;    mov  eax,8                     ; ADD ICON BUTTON
    mov  ebx,20*65536+129-2
    add  ecx,14*65536
    inc  edx
    mcall

;    mov  eax,8                     ; REMOVE ICON BUTTON
    add  ebx,(130+2)*65536
    inc  edx
    mcall

    mcall ,<20-14,8>,<260-23,32>,30+1 shl 30    ; IMAGE BUTTON
    inc  edx
    add  ebx,(36*7+26) shl 16
    mcall
    add  edx,1+1 shl 29
    mov  ebx,(33-19) shl 16+(34*8)
    mcall
    mcall 4,<23-15,273-24>,0,arrows,1
    add  ebx,(36*7+27)shl 16
    add  edx,2
    mcall
    dec  edx
    mcall ,<120,250>
    lea  edx,[ebx+8 shl 16]
    mov  ecx,[icon_count]
    mcall 47,0x30000,,,0

;;
    mov  eax,4
    mov  ebx,24*65536+250+14+14+14
    mov  ecx,0xffffff
    mov  edx,text
    mov  esi,47
  newline:
    mov  ecx,[edx]
    add  edx,4
    mcall
    add  ebx,14
    add  edx,47
    cmp  [edx],byte 'x'
    jne  newline
draw_btns:
;;
    mov  eax,0                     ; DRAW BUTTONS ON WINDOW AREA
    mov  ebx,20*65536+25
    mov  ecx,35*65536+19
    mov  edi,icon_table
    mov  edx,40
   newbline:

    cmp  [edi],byte 'x'
    jne  no_button

    mov  esi,0x5577cc
    cmp  [edi+90],byte 'x'
    jne  nores
    mov  esi,0xcc5555
    cmp  edx,[cur_btn]
    jne  nores
    mov  esi,0xe7e05a
  nores:

    push eax
    mov  eax,8
    mcall
    pop  eax

  no_button:

    add  ebx,26*65536

    inc  edi
    inc  edx

    inc  al
    cmp  al,9
    jbe  newbline
    mov  al,0

    add  edx,6

    ror  ebx,16
    mov  bx,20
    ror  ebx,16
    add  ecx,20*65536

    inc  ah
    cmp  ah,8;9
    jbe  newbline
    call print_strings
    call draw_icon
    mov  eax,12                    ; function 12:tell os about windowdraw
    mov  ebx,2                     ; 2, end of draw
    mcall

    ret

draw_icon:
    mcall 13,<33-20,34*8+2>,<260-24,37+15-2>,0xffffff
    mov  esi,[current_icon]
    add  esi,12
    call atoi
    push eax
    cmp  eax,[cur_band]
    jb   .nou
    sub  eax,[cur_band]
    cmp  eax,7
    ja   .nou
    imul eax,34 shl 16
    lea  ebx,[eax+(33-19) shl 16]
    mov  bx,34
    mcall 13,,<236+35,3>,0xff0000
    mov  eax,[esp]
  .nou:
    mov  eax,[cur_band]
    and  eax,0xfffffff8
    push eax
    imul eax,ICON_SIZE
    lea  ebx,[strip_file+8+eax]
    mov  ecx,8
    mov  edx,(33-18) shl 16+238
  .nxt:
    push ecx
    mcall 7,,<32,32>
    pop  ecx
    add  ebx,ICON_SIZE
    add  edx,34 shl 16
    loop .nxt

    mcall 4,<45,280-2>,0,rep_text,rep_text_len-rep_text
    lea  edx,[ebx+(8*5)shl 16]
    pop  ecx
    mcall 47,0x30000,,,0xff
    add  ecx,7
    add  edx,(3*8+4)shl 16
    mcall
    mov  ecx,[icon_count]
    add  edx,(5*8+4)shl 16
    mcall
    pop  ecx
    add  edx,(10*8+4)shl 16
    mcall ,,,,0xff0000
    ret

; DATA AREA


bcolor dd 0x335599

icon_table:

    times 4  db  'xxxx  xxxx'
    times 2  db  '          '
    times 1  db  '          '
    times 2  db  'xxxx  xxxx'
;    times 1  db  '          '

icons_reserved:
    times 9  db  '          '

if lang eq ru
  text:
      db 255,255,255,0,   '   ’…Š‘’                                       '
      db 255,255,255,0,   ' Žƒ€ŒŒ€                                     '
      db 255,255,255,0,   ' €€Œ…’›                                     '
      db 255,255,255,0,   '                 ˆŒ…ˆ’œ                     '
      db 255,255,255,0,   '      „Ž€‚ˆ’œ              “„€‹ˆ’œ            '
      db 0,0,0,0,         '€†Œˆ’… € Ž‡ˆ–ˆž ˆŠŽŠˆ „‹Ÿ …„€Š’ˆŽ‚€ˆŸ   '
      db                  'x' ; <- END MARKER, DONT DELETE

add_text               db '€†Œˆ’… € Ž‡ˆ–ˆž …ˆ‘Ž‹œ‡“…ŒŽ‰ ˆŠŽŠˆ     ',0
rem_text               db '€†Œˆ’… € Ž‡ˆ–ˆž ˆ‘Ž‹œ‡“…ŒŽ‰ ˆŠŽŠˆ       ',0
title                 db 'Œ¥­¥¤¦¥à ¨ª®­®ª',0

else if lang eq ge
  text:
      db 255,255,255,0,   '   TITLE                                       '
      db 255,255,255,0,   '  APP NAME                                     '
      db 255,255,255,0,   ' PARAMETER                                     '
      db 255,255,255,0,   '                ANWENDEN                       '
      db 255,255,255,0,   '     HINZUFUEGEN              ENTFERNEN        '
      db 0,0,0,0,         'AUF BUTTON KLICKEN, UM ICON ZU EDITIEREN       '
      db                  'x' ; <- END MARKER, DONT DELETE

add_text               db 'AUF UNBENUTZTE ICONPOSITION KLICKEN          ',0
rem_text               db 'ICON ANKLICKEN; DAS GELOESCHT WERDEN SOLL    ',0
title                 db 'Icon Manager',0

else
  text:
      db 255,255,255,0,   '   TITLE                                       '
      db 255,255,255,0,   '  APP NAME                                     '
      db 255,255,255,0,   ' PARAMETERS                                    '
      db 255,255,255,0,   '                APPLY CHANGES                  '
      db 255,255,255,0,   '      ADD ICON              REMOVE ICON        '
      db 0,0,0,0,         'CLICK BUTTON ON ICON POSITION FOR EDIT         '
      db                  'x' ; <- END MARKER, DONT DELETE
add_text               db 'CLICK ON A NOT USED POSITION                 ',0
rem_text               db 'CLICK ICON POSITION; YOU WANT TO DELETE      ',0
title                 db 'Icon Manager',0

end if

arrows db '</>'
iconname:
      db ICON_APP,0

icon_default:
   db   'AA-SYSXTREE-000-/RD/1/SYSXTREE                '
   db   '-                              *'
   db   13,10

rep_text:
if lang eq ru
     db '‡€—Šˆ    -     ˆ‡    , ‚›€ #'
else
     db 'ICONS     -     OF    , SELECTED'
end if

rep_text_len:

;//////////////////////////
get_bg_info:
    mov  eax,39
    mov  ebx,4
    mcall
    mov  [bgrdrawtype],eax

    mov  eax,39     ; get background size
    mov  ebx,1
    mcall
    mov  [bgrxy],eax

    mov  ebx,eax
    shr  eax,16
    and  ebx,0xffff
    mov  [bgrx],eax
    mov  [bgry],ebx
    ret

calc_icon_pos:
    movzx eax,byte [ebp-20]    ; x position
    sub  eax,'A'        ;eax - number of letter
    cmp  eax,4
    jg     no_left
    shl  eax,6 ;imul eax,64
    add  eax,16
    movzx ebx,[warea.left]
    add  eax,ebx
    jmp  x_done

  no_left:
    sub  eax,9
    sal  eax,6 ;imul eax,64
    sub  eax,16+52-1
    movzx ebx,[warea.right]
    add  eax,ebx
  x_done:
    mov  [ebp-12],eax

    movzx eax,byte [ebp-20+1]  ; y position
    sub  eax,'A'        ; eax - number of letter
    cmp  eax,4
    jg     no_up
    shl  eax,6            ;imul eax,80
    add  eax,16
    movzx ebx,[warea.top]
    add  eax,ebx
    jmp  y_done
  no_up:
    sub  eax,9
    shl  eax,6            ;imul eax,80
    sub  eax,16-1
    movzx ebx,[warea.bottom]
    add  eax,ebx
  y_done:
    mov  [ebp-8],eax
    ret

;START2:
load_icon_list2:
    call  get_bg_info

        mcall   48,5
        mov     [warea.by_x],eax
        mov     [warea.by_y],ebx

        mov     eax,14
        mcall
        add     eax,0x00010001
        mov     [scrxy],eax

apply_changes2:

    mov  edi,[icons]
    mov  esi,icon_data
    mov  ebp,0x5000 ; threads stack starting point

  start_new:
    mov eax,[esi]
    mov [ebp-20],eax
    call calc_icon_pos

    mov  eax,51
    mov  ebx,1
    mov  ecx,thread
    mov  edx,ebp
    mov  dword[ebp-4],esi
    mcall
    add  ebp,0x100

    mov  eax,5
    mov  ebx,1
wait_thread_start:         ;wait until thread draw itself first time
    cmp  [create_thread_event],bl
    jz     wait_thread_end
    mcall
    jmp  wait_thread_start
wait_thread_end:
    dec  [create_thread_event]     ;reset event


    add  esi,REC_SIZE
    dec  edi
    jnz  start_new
  close:
    or     eax,-1
    mcall

thread:
;   pop  ebp ;ebp - address of our icon
    sub  esp,12
    mov  ebp,esp
    sub  esp,16
    call draw_window2
    mov  [create_thread_event],1
    mov  eax,40
    mov  ebx,010101b
    mcall

still2:

    mov  eax,10
    mcall

    cmp  eax,1
    je     red2
    cmp  eax,3
    je     button2

    call  get_bg_info
    mov   eax,5
    mov   ebx,1
    call  draw_icon2

    jmp  still2

  red2:
        mcall   14
        add     eax,0x00010001
        mov     [scrxy],eax
        mcall   48,5
        mov     [warea.by_x],eax
        mov     [warea.by_y],ebx
        add     ebp,+12
        call    calc_icon_pos
        add     ebp,-12
        mcall   9,I_END,-1
        mov     eax,[I_END+process_information.box.left]
        cmp     eax,[ebp+0]
        jne     @f
        mov     eax,[I_END+process_information.box.top]
        cmp     eax,[ebp+4]
        je      .lp1
    @@: call    get_bg_info
        mcall   67,[ebp+0],[ebp+4],51,51

  .lp1: call    draw_window2
        jmp     still2

  button2:
    mov  al,17
    mcall


    mov  esi,[ebp+8]
          mov  ebx,1
          mov  edi,finfo.path
          call fill_paths
          inc  ebx
       mov  edi,param_str
    mov  dword[finfo_start+8],edi
          call fill_paths
          cmp  byte[edi],0
    jne  .no0
    and  dword[finfo_start+8],0
  .no0:
    mov  ebx,finfo_start
    mov  eax,70
    mcall
    jmp  still2

fill_paths:
        push esi edi
;        dps  '>'
        movzx ecx,byte[str_lens+ebx]
        add  esi,[positions+ebx*4]
        push esi
        add  esi,ecx

    .l1:
        dec  esi
        cmp  byte[esi],' '
        jnz   .found
        loop .l1
  pop  esi
  jmp  .noms
    .found:
        lea  ecx,[esi+1]
        pop  esi
        sub  ecx,esi
        rep  movsb
 .noms:
        and  byte[edi],0
;        call debug_outstr
;        dps  <'<',13,10>
        pop  edi esi
        ret

atoi:
        push esi
        xor  eax,eax
        xor  ebx,ebx
  .nxt:
    lodsb
    cmp  al,'0'
    jb   .done
    cmp  al,'9'
    ja   .done
    sub  eax,'0'
    imul ebx,10
    add  ebx,eax
    jmp  .nxt
  .done:
      pop  esi
      mov  eax,ebx
        ret

itoa:
        add  esi,2
    mov ebx,10
    mov ecx,3
  .l0:
    xor edx,edx
    div ebx
    add dl,'0'
    mov [esi],dl
    dec esi
    loop .l0
        ret

draw_picture:
    mov  [image],0x3000
    mov  edi,[ebp+8]
    lea  esi,[edi+12]
    call atoi
          cmp  eax,[icon_count]
          ja  toponly.ex
          imul eax,(32*3*32)
          lea  edi,[eax+strip_file+8]
    xor  ebx,ebx
    xor  ecx,ecx
    mov  esi,edi;strip_file+8+(32*3*32)*2

    mov  [pixpos],0
  newb:
    push ebx
    push ecx

    cmp  ebx,10
    jb     yesbpix
    cmp  ebx,42
    jge  yesbpix
    cmp  ecx,31;2
    jg     yesbpix

    push esi
    mov  esi,edi
    add  esi,[pixpos]

no_correction_pixpos:
    add  [pixpos],3
    mov  eax,[esi]
    and  eax,0xffffff

    pop  esi

    cmp eax,0
    je    yesbpix
    cmp eax,0xfffcff ;f5f5f5
    je    yesbpix
    jmp nobpix

  yesbpix:

  stretch:
    cmp   [bgrdrawtype],dword 2
    jne   nostretch
    mov   eax,[ebp+4]
    add   eax,ecx
    imul  eax,[bgry]
    cdq
    movzx ebx,word [scrxy]
    div   ebx
    imul  eax,[bgrx]
    push  eax
    mov   eax,[ebp+0]
    add   eax,[esp+8]
    imul  eax,[bgrx]
    cdq
    movzx ebx,word [scrxy+2]
    div   ebx
    add   eax,[esp]
    add   esp,4

    jmp   notiled

  nostretch:

    cmp   [bgrdrawtype],dword 1
    jne   notiled
    mov   eax,[ebp+4]
    add   eax,ecx
    cdq
    movzx ebx,word [bgrxy]
    div   ebx
    mov   eax,edx
    imul  eax,[bgrx]
    push  eax
    mov   eax,[ebp+0]
    add   eax,[esp+8]
    movzx ebx,word [bgrxy+2]
    cdq
    div   ebx
    mov   eax,edx
    add   eax,[esp]
    add   esp,4

  notiled:

    lea  ecx,[eax+eax*2]
    mov  eax,39
    mov  ebx,2
    mcall

  nobpix:

    pop  ecx
    pop  ebx

    mov  edx,eax
    mov  eax,[image]
    mov  [eax],edx
    mov  [eax],dl
    inc  eax
    ror  edx,8
    mov  [eax],dl
    inc  eax
    ror  edx,8
    mov  [eax],dl
    inc  eax
    mov  [image],eax
    inc  ebx
    mov  eax,[yw]
    inc  eax
    cmp  ebx,eax
    jnz  newb
    xor  ebx,ebx

    inc  ecx

    mov  eax,[ya]
    add  [pixpos],eax

    cmp  [top],1
    jne  notop
    cmp  ecx,38
    je     toponly

  notop:

    cmp  ecx,52
    jnz  newb

  toponly:

    mov  eax,7
    mov  ebx,0x3000
    mov  ecx,52 shl 16 + 52
    xor  edx,edx
    mcall
  .ex:
    mov  [load_pic],0
    ret

draw_text:

    mov  esi,[ebp+8]
    add  esi,3
    push edi
    mov  edi,title
    mov  ecx,8
    cld
    rep  movsb
    pop  edi
    mov   eax,title
  news2:
    cmp   [eax],byte 33
    jb      founde
    inc   eax
    cmp   eax,title+8;11
    jb      news2
   founde:
    sub   eax,title
    mov   [tl],eax

    mov   eax,[tl]
    lea   eax,[eax+eax*2]  ; eax *= char_width/2
    shl   eax,16

    mov   ebx,27*65536+40
    sub   ebx,eax

    mov   eax,4
    xor   ecx,ecx         ; black shade of text
    mov   edx,title
    mov   esi,[tl]
    add   ebx,1 shl 16      ;*65536+1
    mcall
    inc   ebx
    mcall
    add   ebx,1 shl 16
    mcall
    inc   ebx
    mcall
    sub   ebx,1 shl 16
    mcall
    dec   ebx
    sub   ebx,1 shl 16
    mcall
    sub   ebx,1 shl 16
    dec   ebx
    mcall
    dec   ebx
    add   ebx,1 shl 16
    mcall
    inc   ebx
    mov   ecx,0xffffff

    mcall
    mov   [draw_pic],0
    ret

;   *********************************************
;   *******  WINDOW DEFINITIONS AND DRAW ********
;   *********************************************


draw_window2:

    mov  eax,12            ; function 12:tell os about windowdraw
    mov  ebx,1               ; 1, start of draw
    mcall

                   ; DRAW WINDOW
    xor  eax,eax             ; function 0 : define and draw window
    mov  ebx,[ebp+0-2]
    mov  ecx,[ebp+4-2]
    add  ebx,[yw]           ; [x start] *65536 + [x size]
    add  ecx,51            ; [y start] *65536 + [y size]
    mov  edx,0x01000000        ; color of work area RRGGBB,8->color gl
    mcall

    mov  eax,8      ; button
    mov  ebx,51
    mov  ecx,50
    mov  edx,0x40000001
    mcall

    mov  eax,5
    mov  ebx,1
draw_icon2:
    xchg [load_pic],bl
    test bl,bl
    je     draw_icon_end
    mcall
    jmp  draw_icon2
draw_icon_end:

    mov  eax,5
    mov  ebx,1
draw_icon_2:
    xchg [draw_pic],bl
    test bl,bl
    je     draw_icon_end_2
    mcall
    jmp  draw_icon_2
draw_icon_end_2:

    mov  eax,9
    mov  ebx,process_table
    mov  ecx,-1
    mcall

    call draw_picture
    call draw_text

    mov  eax,12
    mov  ebx,2
    mcall

    ret

tl        dd      8
yw        dd     51
ya        dd      0
cur_btn   dd 40

draw_pic    db      0
load_pic    db      0
create_thread_event db 0


image          dd  0x3000

I_Param:

 icon_data = I_END+0x1400
 process_table = I_END+0x2400

bgrx dd ?
bgry dd ?
param_str rb 31

;//////////////////////////

bgrxy        dd    ?
warea:
 .by_x:
  .right  dw ?
  .left   dw ?
 .by_y:
  .bottom dw ?
  .top    dw ?
scrxy        dd    ?
bgrdrawtype  dd    ?

pixpos dd    ?
top      dd ?
icons dd ?
addr  dd ?
cur_str    dd ?
cur_band   dd ?
sel_icon1  rd 1
icon_count rd 1
gif_file  rb  GIF_SIZE
strip_file rb RAW_SIZE

IncludeUGlobals

I_END: