;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                              ;
;   SYSTEM X-TREE BROWSER                      ;
;                                              ;
;   Author: Pavlushin Evgeni waptap@mail.ru    ;
;                   site: www.deck4.narod.ru   ;
;                                              ;
;   Compile with FASM for MenuetOS             ;
;                                              ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Bug report +bug deleted  -bug not deleted
;show/fade del notwork+
;64Ver Run file from HD bug deleted.
;65Ver The bad scroll realization
;66Ver The good scroll realization, url line anti-flick
;67Ver Url line monolith procedure
;68Ver Mini icon on left of file name
;69Ver Getimg proc size minus 900 bytes
;70Ver Del data area ramsize minus 140000 bytes
;72Ver Quick sort, ramsize minus 200000 bytes
;73Ver Url flick and out bugs delete
;74Ver scroll bug deleted
;75Ver hd partition fast change button. Add bmp,txt,exec,asm and inc icons.
; sort type in headmenu bug del
;78Ver directory extension bug fix by Asko Vuori
;79Ver Asko Vuori volume label add and "put in command line" bug fix
;80Ver prompt edit fatal bug deleted, antiflick when move list up/down
;81Ver Save Dialog bug deleted
;82Ver Rewritten to function 70. Corrected work with scrollbar.
;83Ver CD-ROM support
;84Ver URL line editor corrected
;1560000 bytes memory!

;******************************************************************************
  use32
  org	   0x0
  db	 'MENUET01'   ; 8 byte id
  dd	 0x01		; header version
  dd	 START	      ; program start
  dd	 I_END	      ; program image size
  dd	 RAM_END      ; memory
  dd	 RAM_END      ; stack
  dd	 param_area ,0x0   ; param,icon
;  dd 0,0

;******************************************************************************
include '../../../macros.inc' ;
include 'ascl.inc'
include 'ascgl.inc'

START:		    ; start of execution
; //// Willow
;    mov eax,58
;    mov ebx,MRUfile
;    mcall
; //// Willow
    mcall 18,11,1,table_area
    cmp [edx+2],byte 0
    je	  no_hdpartition_on_hd0
    mov [hdimg1], aHD0
 no_hdpartition_on_hd0:
    cmp [edx+3],byte 0
    je	  no_hdpartition_on_hd1
    mov [hdimg2], aHD1
 no_hdpartition_on_hd1:
    cmp [edx+4],byte 0
    je	  no_hdpartition_on_hd2
    mov [hdimg3], aHD2
 no_hdpartition_on_hd2:
    cmp [edx+5],byte 0
    je	  no_hdpartition_on_hd3
    mov [hdimg4], aHD3
 no_hdpartition_on_hd3:
	test	byte [edx+1], 80h
	jz	@f
	mov	[hdimg1], aCD0
	mov	[hdimg1+4], 'CD-R'
	mov	[hdimg1+8], 'OM  '
@@:
	test	byte [edx+1], 20h
	jz	@f
	mov	[hdimg2], aCD1
	mov	[hdimg2+4], 'CD-R'
	mov	[hdimg2+8], 'OM  '
@@:
	test	byte [edx+1], 8
	jz	@f
	mov	[hdimg3], aCD2
	mov	[hdimg3+4], 'CD-R'
	mov	[hdimg3+8], 'OM  '
@@:
	test	byte [edx+1], 2
	jz	@f
	mov	[hdimg4], aCD3
	mov	[hdimg4+4], 'CD-R'
	mov	[hdimg4+8], 'OM  '
@@:

    mov eax,40
    mov ebx,0100111b
    mcall

    cmp byte [param_area],0 ;test parameters line
    jne no_brow     ;it's dialog
    mov [browser], 1   ;it's browser
    jmp no_dlg
no_brow:

    mov al,byte [param_area+5]
    mov [dlg_type],al

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

    mov eax,dword [procinfo+30]
    mov edi,MYPID+4-1
    mov ecx,4
    mov ebx,10
    cld

new_d:
    xor edx,edx
    div ebx
    add dl,'0'
    mov [edi],dl
    dec edi
    loop new_d

    movzx eax,byte [param_area]
    sub eax,48
    imul eax,10
    movzx ebx,byte [param_area+1]
    add eax,ebx
    sub eax,48
    imul eax,10
    movzx ebx,byte [param_area+2]
    add eax,ebx
    sub eax,48
    imul eax,10
    movzx ebx,byte [param_area+3]
    add eax,ebx
    sub eax,48

    mov ecx,eax ;pid to ecx
    mov eax,60
    mov ebx,2
    mov edx,MYPID
    mov esi,4
    mcall
no_dlg:

    giftoimg but_file,tempimg

;************************
;      Get images
;************************

    mov eax,0  ;x
    mov ebx,0	    ;y
    mov esi,286     ;xs
    mov edi,16		;ys
    mov ecx,tempimg ;src
    mov edx,butimg   ;dest
    call getimgproc
    mov eax,288
    mov esi,60
    mov edx,logoimg  ;dest
    call getimgproc
    mov eax,0  ;x
    mov ebx,16	       ;y
    mov esi,51	       ;xs
    mov edi,esi      ;ys
    mov edx,logoinfimg	     ;dest
    call getimgproc
    mov eax,51	    ;x
    mov esi,8	    ;xs
    mov edi,9	     ;ys
    mov edx,upsb   ;dest
    call getimgproc
    mov eax,51+8  ;x
    mov edx,dnsb   ;dest
    call getimgproc

    mov eax,51+16  ;x
    mov ebx,16	       ;y
    mov esi,12	       ;xs
    mov edi,9	     ;ys

    mov ecx,tempimg ;src
    mov edx,hdico   ;dest
    mov ebp,10
loogetimg:
    call getimgproc
    add edx,9*12*3+8
    add eax,12
    dec ebp
    jnz loogetimg

    call read_directory
;    call convertation
red:
    call draw_window	    ; at first, draw the window

still:
    mov eax,9
    mov ebx,procinfo
    mov ecx,-1
    mcall

    wtevent red,key,button

scrolltest:
    mov eax,37
    mov ebx,2
    mcall
    dec eax
    jne still

scrl:
    mov eax,37
    mov ebx,1
    mcall
	movzx	ebx, ax 	; y
	shr	eax, 16 	; x
    mov ebp,eax
    sub ebp,[listx] ;[procinfo.box.width]
    sub ebp,[listxsize]
    add ebp,[scrollsize]
    cmp ebp,dword [scrollsize] ;8
    jae menu_test ; still

	lea	ebp, [ebx-scrollbutsize]
	sub	ebp, [listy]	; up scroll
	jl	menu_test
	mov	ecx, [listysize]
	sub	ecx, 2*scrollbutsize
	mov	eax, [scroll_height]
	cmp	ebp, ecx
	jge	menu_test
	sub	ecx, eax
	shr	eax, 1
	sub	ebp, eax
	jge	@f
	xor	ebp, ebp
@@:
	cmp	ebp, ecx
	jl	@f
	mov	ebp, ecx
@@:
	xor	edx, edx
	mov	eax, [listysize]
	sub	eax, 2
	mov	ebx, 10
	div	ebx
	mov	ebx, eax
	cmp	ebx, [listsize]
	jae	notusescrl
	mov	eax, [listsize]
	sub	eax, ebx
	mul	ebp
	div	ecx
	cmp	eax, [filecursor]
	jz	still
	mov	[filecursor], eax
	jmp	usescrl
notusescrl:
	cmp	[filecursor], 0
	jz	still
    mov [filecursor],0 ;ebp
usescrl:

    mov [flick],1
    jmp anti_flick ;red

menu_test:
    cmp [pmenu_draw],1 ;if menu is show, update all
    jne still
    mov [pmenu_draw],0
    jmp red	     ;update all window

;this function not use in dialog when poup menu's is not used
;in dialog's

;===================
; Test keyboard
;===================
key:		  ; key
    mov  eax,2
    mcall
    cmp dword [focus],0
    jne con_edit
    cmp  ah,key_Up
    jne  no_upk
    mov  ebx,1
    jmp  up
no_upk:
    cmp  ah,key_Down
    jne  no_downk
    mov  ebx,1
    jmp  down
no_downk:
    cmp  ah,key_PgUp
    jne  no_pgup
    mov  ebx,10
    jmp  up
no_pgup:
    cmp  ah,key_PgDown
    jne  no_pgdown
    mov  ebx,10
    jmp  down
no_pgdown:
    cmp  ah,key_Enter
    je	 kfad
    cmp  ah,key_Bspace
    je	     back
    cmp  ah,key_F2
    je	     viewset
    cmp  ah,key_F3
    je	     textopen
    cmp  ah,key_F5
    je	     copy_to_clip
    cmp  ah,key_F6
    je	     paste_from_clip
    cmp  ah,key_F11
    je	     edit_prompt
    cmp  ah,key_F12
    je	     update
    jmp  still

; test input string
con_edit:
    cmp  ah,key_Enter
    jne  no_con_ent
    not  [focus]
    jmp  savetest
;    jmp  update
no_con_ent:
    cmp  ah,key_Left
    jne  no_con_left
	cmp	[cursor], 0
	jz	still
    dec  [cursor]
    mov  [flick],2
    jmp  anti_flick ;red
no_con_left:
    cmp  ah,key_Right
    jne  no_con_right
	mov	eax, [cursor]
	cmp	byte [path+eax], 0
	jz	still
    inc  [cursor]
    mov  [flick],2
    jmp  anti_flick ;red
no_con_right:
    cmp  ah,key_Bspace
    jne  no_con_bspace

	mov	ebp, [cursor]
	test	ebp, ebp
	jz	still
lobsp:
    mov  bl,byte [path+ebp]
    mov  byte [path+ebp-1],bl
    inc  ebp
    cmp  ebp,1024
    jne  lobsp
    dec  [cursor]
    mov  [flick],2
    jmp  anti_flick ;red
no_con_bspace:

    mov  ecx,[cursor]
    mov  ebp,1022
	cmp	byte [path+ebp], 0
	jnz	still
losx:
	cmp	ebp, ecx
	jbe	@f
    mov  bl,byte [path+ebp]
    mov  byte [path+ebp+1],bl
    dec  ebp
    jmp  losx
@@:

    mov  byte [path+ebp],ah
    inc  dword [cursor]

    mov  [flick],2
    jmp  anti_flick


;----------------------------
;Test on mouse button
;-----------------------------

  button:	  ; button
    mov eax,17
    mcall

    cmp ah,2	       ;Edit prompt line?
    je	    edit_prompt

    cmp ah,4
    jne no_filelist

mousetest:
    mov eax,37
    mov ebx,1
    mcall
    mov ebx,eax
    shr eax,16		 ;x
    and ebx,0xffff   ;y

    sub ebx,[listy] ;80
    mov [mousey],ebx

    mov ecx,[listx]
    cmp eax,ecx
    jl	    still
    add ecx,[listxsize]
    cmp eax,ecx
    jg	    still

filexadd:

; Enter in directory
file_add:
    mov edx,0  ;for div correct work div
    mov eax,dword [mousey]
    mov ebx,10
    div ebx

    add eax,[filecursor]
    jmp no_kfad
kfad:
    mov eax,[filecursor]
no_kfad:
    mov ebx,27
    mul ebx
    lea ebp,[convinfo+eax]
    mov esi,[ebp]
    cmp esi,-1
    jz	still

    mov edi,paramtest ;clear param string
    mov ecx,1024/4
    xor eax,eax
    rep stosd

	mov	edi, path
	mov	ecx, 1024
	repnz	scasb
	dec	edi
	cmp	[ebp+15], dword 'FOL '
	jnz	openf
; open directory - append its name to path
	cmp	ecx, 2
	jb	still
	push	edi
	mov	al, '/'
	stosb
	dec	ecx
@@:
	lodsb
	stosb
	test	al, al
	jz	@f
	dec	ecx
	jnz	@b
; name is too long - do not do anything
	pop	edi
	xor	eax, eax
	mov	ecx, path+1024
	sub	ecx, edi
	rep	stosb
	jmp	still
@@:
	sub	edi, path+1
	mov	[cursor], edi
	pop	edi
; name appended, now read new directory
    mov [filecursor],0

    call read_directory
;;    call convertation
    call draw_window
    jmp still

;Savetest
savetest:
    cmp byte [dlg_type],'S'
    jne still
; always force open file - this is better
; because there exists files without extension and folders with extension
	jmp	openf
;    mov ecx,100
;savetestloop:
;    cmp [path+ecx],byte 0
;    je     next_byte
;    cmp [path+ecx],byte 32
;    je     next_byte
;    cmp [path+ecx],byte '.'
;    je     openf  ;it's file
;;    cmp [path+ecx],byte '/'
;;    je  no_save  ;it's dir
;next_byte:
;    dec ecx
;    jnz savetestloop
;    jmp still

;Open/Run file

openf:
	push	esi edi
	mov	esi, path
	mov	edi, paramtest
	mov	ecx, 1024/4
	rep	movsd
	pop	edi esi
	add	edi, paramtest-path

    cmp dword [focus],0 ;if prompt line with focus no add file name from frame
    jne file_set

	cmp	edi, paramtest+1022
	jae	still
	mov	al, '/'
	stosb
@@:
	lodsb
	stosb
	test	al, al
	jz	file_set
	cmp	edi, paramtest+1024
	jb	@b
	jmp	still

file_set:

    cmp [browser],0
    jne is_brow

    movzx eax,byte [param_area]
    sub eax,48
    imul eax,10
    movzx ebx,byte [param_area+1]
    add eax,ebx
    sub eax,48
    imul eax,10
    movzx ebx,byte [param_area+2]
    add eax,ebx
    sub eax,48
    imul eax,10
    movzx ebx,byte [param_area+3]
    add eax,ebx
    sub eax,48

    mov ecx,eax ;pid to ecx
    mov eax,60
    mov ebx,2
    mov edx,paramtest
    mov esi,1024
    mcall

    jmp exit

is_brow:

;    cmp [convinfo+edi+26],dword 'Fvol'
;    je  edit

; find extension
	mov	eax, paramtest+1023
@@:
	dec	eax
	cmp	byte [eax+1], 0
	jz	@b
@@:
	cmp	byte [eax], '/'
	jz	.noext
	cmp	byte [eax], '.'
	jz	.ext
	dec	eax
	cmp	eax, paramtest
	jae	@b
.noext:
; file has no extension
;        xor     ebx, ebx
	jmp	execute
.ext:
	inc	eax
; eax points to extension
	cmp	byte [eax], 0
	jz	.noext
	mov	ecx, dword [eax]
	and	ecx, not 0x20202020

	mov	ebx, kiv
	cmp	ecx, 'JPG'
	jz	run
	cmp	ecx, 'JPEG'	; note that it will select also *.JPEG*
	jz	run
	cmp	ecx, 'GIF'
	jz	run
	cmp	ecx, 'BMP'
	jz	run
	cmp	ecx, 'PNG'
	jz	run
	cmp	ecx, 'ICO'
	jz	run
	cmp	ecx, 'CUR'
	jz	run

	
	mov	ebx, ac97
	cmp	ecx, 'WAV'
	jz	run
	cmp	ecx, 'MP3'
	jz	run
	cmp	ecx, 'XM'
	jz	run
	
	mov	ebx, midamp
	cmp	ecx, 'MID'
	jz	run
	mov	ebx, htmlv
	cmp	ecx, 'HTM'
	jz	run
	cmp	ecx, 'HTML'
	jz	run
	mov	ebx, rtfread
	cmp	ecx, 'RTF'
	jz	run
	mov	ebx, editor
	cmp	ecx, 'ASM'
	jz	run
	cmp	ecx, 'TXT'
	jz	run
	cmp	ecx, 'INC'
	jz	run
	cmp	ecx, 'INI'
	jz	run
	cmp	ecx, 'LOG'
	jz	run
	cmp	ecx, 'CONF'
	jz	run
	mov	ebx, life2
	cmp	ecx, 'LIF'
	jz	run
	mov	ebx, view3ds
	cmp	ecx, '3DS' and not 0x20202020
	jz	run
	jmp	still

execute:
	mov	ebx, fileinfo_start
	and	dword [ebx+8], 0		; no parameters
	mov	dword [ebx+21], paramtest	; program name
.do:
	mov	eax, 70
	mcall
	jmp	still

run:
	mov	[fileinfo_name], ebx		; program name
	mov	ebx, fileinfo_start
	mov	dword [ebx+8], paramtest	; parameters
	jmp	execute.do

no_filelist:

    cmp ah,5	;OPEN/SAVE button
    je	    kfad

    cmp ah,6	;Scroll up
    jne no_scrlup
    mov ebx,1
    jmp up
no_scrlup:

    cmp ah,7	;Scroll down
    jne no_scrldown
    mov ebx,1
    jmp down
no_scrldown:

    cmp ah,8
    jne no_update
update:
    call read_directory
;    call convertation
;    mov [filecursor],0
    call draw_window
no_update:

    cmp ah,9
    jne no_textopen
textopen:
	mov	eax, 27
	mul	[filecursor]
	cmp	dword [eax+convinfo+15], 'FOL '
	jz	still
	push	eax
	mov	esi, path
	mov	edi, paramtest
@@:
	lodsb
	test	al, al
	jz	@f
	stosb
	jmp	@b
@@:
	mov	al, '/'
	stosb
	pop	eax
	mov	esi, [eax+convinfo]
	cmp	esi, -1
	jz	still
@@:
	lodsb
	stosb
	test	al, al
	jz	@f
	cmp	edi, paramtest+1024
	jb	@b
	jmp	still
@@:
	mov	ebx, editor
	jmp	run

no_textopen:

    cmp  ah,11
    jne  no_view
viewset:
	inc	[viewmode]
	cmp	[viewmode], 4
	jb	@f
	mov	[viewmode], 0
@@:
    call read_directory
;    call convertation
    mov [filecursor],0
    call draw_window
    jmp still
no_view:

    cmp  ah,12	      ;move back
    jne  no_back
back:
	mov	edi, path+1024
	mov	ecx, edi
@@:
	dec	edi
	cmp	byte [edi], '/'
	jz	@f
	cmp	edi, path
	ja	@b
	jmp	still
@@:
	sub	ecx, edi
	lea	eax, [edi-path]
	mov	[cursor], eax
	xor	eax, eax
	rep	stosb
    mov [filecursor],0
    call read_directory
;    call convertation
    call draw_window
    jmp still

no_back:
    cmp  ah,13	      ;string up?
    jne  no_up
    mov  ebx,1	      ;step
up:
    mov  [downstop],0
    sub  [filecursor],ebx
    cmp  [filecursor],0
    jnl  cr_ok
    mov  [filecursor],0
cr_ok:
    jmp  draw_wd
no_up:
    cmp  ah,14		 ;string down?
    jne  no_dn
    mov  ebx,1		 ;step
down:
    cmp  [downstop],1
    je	     no_dn
    add  [filecursor],ebx
    jmp  draw_wd
no_dn:

    cmp  ah,15
    jne  no_copyclip	;copy to clipboard
copy_to_clip:
	mov	eax, 27
	mul	[filecursor]
	cmp	dword [convinfo+eax+15], 'FOL '
	jz	still
	push	eax
	mov	esi, path
	mov	edi, paramtest
@@:
	lodsb
	test	al, al
	jz	@f
	stosb
	jmp	@b
@@:
	pop	eax
	mov	esi, [convinfo+eax]
	cmp	esi, -1
	jz	still
	mov	al, '/'
	stosb
@@:
	lodsb
	stosb
	test	al, al
	jz	@f
	cmp	edi, paramtest+1024
	jb	@b
	jmp	still
@@:
	sub	edi, paramtest+1
	mov	ebx, clipfile_info
	mov	byte [ebx], 2
	mov	[ebx+12], edi
	mov	eax, 70
	mcall
	jmp	still
no_copyclip:

    cmp ah,16
    jne no_clippaste
paste_from_clip:
	mov	ebx, clipfile_info
	mov	byte [ebx], 0
	mov	dword [ebx+12], 1023
	mov	eax, 70
	mcall
	cmp	ebx, 0
	jle	still
	mov	byte [paramtest+ebx], 0
; OS allows only 256 symbols in command line
	cmp	ebx, 250
	jae	still
; we use Pascal-style strings for /RD/1/COPYR
; source file
	mov	edi, copyr_param
	mov	al, bl
	stosb
	mov	ecx, ebx
	mov	esi, paramtest
	rep	movsb
; destination path
	inc	edi
	mov	ebp, edi
	mov	esi, path
@@:
	cmp	edi, copyr_param+255
	jae	still
	lodsb
	test	al, al
	jz	@f
	stosb
	jmp	@b
; destination file name
@@:
	dec	ebx
	jz	still
	cmp	byte [paramtest+ebx], '/'
	jnz	@b
	lea	esi, [paramtest+ebx]
@@:
	lodsb
	test	al, al
	jz	@f
	stosb
	cmp	edi, copyr_param+255
	jae	still
	jmp	@b
@@:
	mov	byte [edi], 0
	sub	edi, ebp
	mov	eax, edi
	mov	[ebp-1], al
; display
    cmp [browser], 1
    jne no_outpath
    mov  eax,4		   ; function 4 : write text to window
    mov  ebx,10*65536+67     ; [x start] *65536 + [y start]
    mov  ecx,0x00000000 ;[sc.grab_text] ; color of text RRGGBB
	mov	edx, copyr_param+1
	movzx	esi, byte [edx-1]
    mcall
    mov  ebx,250*65536+67	; [x start] *65536 + [y start]
    mov  ecx,0x00000000 ;[sc.grab_text] ; color of text RRGGBB
	mov	edx, ebp
	mov	esi, edi
    mcall
no_outpath:

; run COPYR
	mov	eax, 70
	mov	ebx, copyr_run
	mcall
    delay 50   ;wait recoed file
    jmp update ;still
no_clippaste:

    cmp ah,19		;Delete from floppy
    jne no_delt
delete_file:
; OS now do not support file delete
	jmp	still
no_delt:

    cmp ah,20		;I - Help
    je	    help_scr

    cmp ah,22
    jne no_headfile
    mov [drawhf],1
    call draw_window
    mov [drawhf],0
    mov [pmenu_draw],1
    jmp still
no_headfile:

    cmp ah,23
    jne no_headview
    mov [drawhv],1
    call draw_window
    mov [drawhv],0
    mov [pmenu_draw],1
    jmp still
no_headview:

    cmp ah,24
    jne no_headinfo
    mov [drawhi],1
    call draw_window
    mov [drawhi],0
    mov [pmenu_draw],1
    jmp still
no_headinfo:

;FILE MENU
    cmp ah,30
    je kfad

    cmp ah,31
    je	    copy_to_clip      ;Copy

    cmp ah,32
    je	    paste_from_clip ;Paste

    cmp ah,33
    je	    delete_file     ;Delte

    cmp ah,34
    je	    textopen	;Edit in Tinypad

    cmp ah,37
    je	    exit

;VIEW MENU
    cmp ah,40		;Sort by name
    jne no_sn
	mov	[viewmode], 0
    jmp update
no_sn:

    cmp ah,41		;Sort by extension
    jne no_se
	mov	[viewmode], 1
    jmp update
no_se:

    cmp ah,42		;Sort by size
    jne no_ss
	mov	[viewmode], 2
    jmp update
no_ss:

    cmp ah,43		;Sort by date
    jne no_sd
	mov	[viewmode], 3
    jmp update
no_sd:

;HELP MENU
    cmp ah,50		;Help?
    je	    help_scr

    cmp ah,51		;Info?
    je	    info_scr

    cmp ah,1	       ; test on exit button
    je	    exit

    jmp still

exit:
; //// Willow
;    mov eax,58
;    mov ebx,MRUfile
;    mov dword[ebx+8],255
;    inc dword[ebx]
;    mcall
; //// Willow
    mov eax,-1
    mcall

draw_wd:
;    call draw_window
;    jmp still
    mov [flick],1
    jmp anti_flick

edit_prompt:
    not  [focus]
    jmp  red

help_scr:
    mov esi,14
    mov ebp,help_text
    jmp screen

info_scr:
    mov esi,6
    mov ebp,info_text
    jmp screen

screen:
    cmp [browser], 1 ;it's browser?
    jne dialogscr

    mov eax,[procinfo.box.height]
    sub eax,90
    drawfbox 40,76,300,eax,0x00000000
    mov eax,[procinfo.box.height]
    sub eax,92
    drawfbox 41,77,298,eax,0x00ffffff
    mov edi,esi ;14
    mov ebx,(41+26)*65536+(77+20)
    mov ecx,cl_Black
    mov edx,ebp ;help_text
    jmp outlab

dialogscr:
    mov eax,[procinfo.box.height]
    sub eax,84
    drawfbox 16,54,270,eax,0x00000000
    mov eax,[procinfo.box.height]
    sub eax,86
    drawfbox 17,55,268,eax,0x00ffffff
    mov edi,esi ;14
    mov ebx,(17+10)*65536+(55+1)
    mov ecx,cl_Black
    mov edx,ebp ;help_text

outlab:     ;out labels
    mov eax,4
    mov esi,40
helploo:
    mcall
    add ebx,11
    add edx,40
    dec edi
    jnz helploo

    setimg 48,84,logoinfimg

    jmp still

getimgproc:
    pushad
    mov dword [edx],esi ;xs
    mov dword [edx+4],edi ;ys

    mov ebp,eax
    mov eax,dword [ecx] ;getx size
    push edx
    push ecx
    lea ecx,[eax+2*eax]

    mul ebx
    add eax,ebp ;x
    mov edx,ecx
    lea eax,[eax+2*eax]  ;eax=offset on imsrc

    mov ebp,esi ;xs
    mov ebx,edi ;ys

    pop edi
    lea esi,[eax+8+edi]

    pop edi
    add edi,8

    cld
cyc:
	push	esi
	lea	ecx, [ebp+ebp*2]
	rep	movsb
	pop	esi
    add esi,edx
    dec ebx
    jne cyc

    popad
    ret

iglobal
;HELP TEXT
help_text:
       ;0123456789012345678901234567890123456789
    db '        ~~~~~ SYSTEM X-TREE ~~~~~       '
    db '                   HELP                 '
    db '                                        '
    db '                                        '
    db 'F2 - CHANGE SORTMODE (name,ext,size,dat)'
    db 'F3 - VIEW file in tinypad               '

    db 'F5 - COPY FILE to clipboard             '
    db 'F6 - PASTE FILE from clipboard          '
    db 'F11- EDIT PROMPT string                 '
    db 'F12- UPDATE directory sources           '
    db '                                        '

    db 'Enter - input to directory              '
    db 'Backspace - back to previos directory   '
    db 'PageDn/PageUp, Up/Down - move cursor    '

info_text:
    db '        ~~~~~ SYSTEM X-TREE ~~~~~       '
    db '               INFO 84 Ver              '
    db '                                        '
    db '        Create by Pavlushin Evgeni      '
    db 'with ASCL library special for Kolibri OS'
    db ' www.deck4.narod.ru      waptap@mail.ru '
endg

;   *********************************************
;   *******  WINDOW DEFINITIONS AND DRAW ********
;   ********    FILE BROWSER / DIALOG   *********

;draw_browser_window:

draw_window:

;    mov eax,9
;    mov ebx,procinfo
;    mov ecx,-1
;    mcall
;    mov  eax,[procinfo.box.width]
;    cmp  eax,66
;    jg  temp12345
;    ret
; temp12345:

    mcall 48, 3, sc, sizeof.system_colors

    mov  eax,[sc.work_button]
    mov  [b_color],eax

    mcall 12, 1

;Window

    xor  eax,eax       ; function 0 : define and draw window

    cmp  [browser], 1 ;it's browser
    jne  nob1
    mov  ebx,140*65536+400     ; [x start] *65536 + [x size]
    mov  ecx,160*65536+280     ; [y start] *65536 + [y size]
    jmp  isb1
nob1:
    mov  ebx,140*65536+320     ; [x start] *65536 + [x size]
    mov  ecx,260*65536+240     ; [y start] *65536 + [y size]
isb1:
;    mov  edx,[sc.work]             ; color of work area RRGGBB
    or	     edx,0x13ffffff
    mcall
	
    mcall 12, 2      ; end of window redraw

;Get proc info
    mov eax,9
    mov ebx,procinfo
    mov ecx,-1
    mcall

    mov  eax,[procinfo.box.width]
    cmp  eax,66
    jg	 @f
.ret:
    ret
 @@:
    cmp  [procinfo.box.height], 0x70
    jl	.ret

    cmp  [browser], 1 ;it's browser
    jne  nob9
    mov  [listx],120
;    mov  eax,[procinfo.box.width]
    sub  eax,127;[listx]+7
    cmp  eax,10
    jl	 .ret
    mov  [listxsize],eax
    mov  [listy],73
    mov  eax,[procinfo.box.height]
    sub  eax,73+7;[listy]+7
    mov  [listysize],eax
    jmp isb9
nob9:
    mov  [listx],10
;    mov  eax,[procinfo.box.width]
    sub  eax,17 ;[listx]+7
    mov  [listxsize],eax
    mov  [listy],54
    mov  eax,[procinfo.box.height]
    sub  eax,54+34;[listy]+34
    mov  [listysize],eax
isb9:


;Draw only browser components
    cmp  [browser], 1 ;it's browser
    jne  nob2

    mov  eax,[sc.grab_text]	 ; color of text RRGGBB
    or	     eax,0x10000000
	mcall 71,1,title_browser

;Draw buttons headers
    mov  eax,8
    mov  ebx,8*65536+(6*8-1) ;start pos x
    mov  ecx,23*65536+10      ;start pos y
    mov  edx,22;+1000000000000000000000000000000b  ;spoke butt
    mov  edi,3		  ;draw 13 button's
    mov  esi,0x00339933
    mcall
    dec edi
nexthbut:
    add  ebx,(6*8)*65536
    inc  edx
    mcall
    dec  edi
    jnz  nexthbut

;File STRING
    glabel 8,25,'  FILE    VIEW    INFO  ',  cl_White ;Black

;BlackLine
    mov eax,[procinfo.box.width]
    sub eax,10
    drawfbox 5,35, eax, 1, cl_Black

;BlackLine2
    mov eax,[procinfo.box.width]
    sub eax,10
    drawfbox 5,68, eax, 1, cl_Black

;BlackLine2 vertical
;    mov eax,[procinfo.box.height]
;    sub eax,69+4
;    drawfbox 115, 69, 1, eax, cl_Black

;Set logo img
    setimg 34,88,logoinfimg
    glabel 20,165,'SYSTEM X-TREE',cl_Black
    add  ebx,10
    glabel ,,'FOR KolibriOS',

    add  ebx,9*65536+20
    glabel ,,'welcome to',cl_Green
    add  ebx,-15*65536+10
    glabel ,,'www.kolibrios.org',cl_Green


;Draw head->file buttons
    cmp [drawhf],1
    jne  no_drawhf
    mov  ebx,8*65536+6*12 ;start pos x
    mov  ecx,35*65536+10      ;start pos y
    mov  edx,30  ;spoke butt
    mov  edi,8		  ;draw 4 button's
    mov  esi,cl_Grey
    call menubutton
no_drawhf:

;Draw head->view buttons
    cmp [drawhv],1
    jne  no_drawhv
    mov  ebx,(8+6*8)*65536+6*12 ;start pos x
    mov  ecx,35*65536+10      ;start pos y
    mov  edx,40  ;spoke butt
    mov  edi,4		  ;draw 4 button's
    mov  esi,cl_Grey
    call menubutton
no_drawhv:

;Draw head->info buttons
    cmp [drawhi],1
    jne  no_drawhi
    mov  ebx,(8+12*8)*65536+6*12 ;start pos x
    mov  ecx,35*65536+10      ;start pos y
    mov  edx,50  ;spoke butt
    mov  edi,2		  ;draw 2 button's
    mov  esi,cl_Grey
    call menubutton
no_drawhi:

nob2:

;Draw buttons instruments
    mov  eax,8
    cmp  [browser], 1 ;it's browser
    jne  nob3
    mov  ebx,10*65536+16+5 ;start pos x
    mov  ecx,37*65536+15      ;start pos y
    jmp isb3
nob3:
    mov  ebx,16*65536+16+5 ;start pos x
    mov  ecx,29*65536+15      ;start pos y
isb3:
    mov  edx,8;+1000000000000000000000000000000b  ;spoke butt
    mov  edi,13        ;draw 13 button's
    mov  esi,cl_Grey
    mcall
    dec edi
nextbut:
    add  ebx,(16+6)*65536
    inc  edx
    mcall
    dec  edi
    jnz  nextbut


    cmp  [browser], 1 ;it's browser
    jne  nob4
;But img browser
    setimg 10,37,butimg
;left logo
    add eax,[procinfo.box.width]
    sub eax,80
    mov [temp],eax
    setimg [temp],37,logoimg
    jmp isb4
nob4:
;But img dialog
    setimg 16,29,butimg
isb4:

    cmp  [browser], 1 ;it's browser
    jne  nob5

    mov [urlx],48
    mov [urly],55
    mov eax,[procinfo.box.width]
    sub eax,48+10
    mov [urlxsize],eax
    mov [urlysize],12

    glabel 20,57,"URL:",cl_Black

;Out view mode info
	movzx	edx, [viewmode]
	shl	edx, 4
    mov eax,4
    mov ebx,180*65536+25
    mov ecx,cl_Black
    add edx,modetext
    mov esi,16
    mcall

;List size
    outcount [listsize],294,25,cl_Black,4*65536
    jmp isb5

iglobal

but_dlg:  db 'OPEN'
          db 'SAVE'
endg

nob5:

    mov [urlx],10
    mov eax,[procinfo.box.height]
    sub eax,24
    mov [urly],eax
    mov eax,[procinfo.box.width]
    sub eax,80
    mov [urlxsize],eax
    mov [urlysize],12

    cmp byte [dlg_type],'O'    ;if byte O - is Open dialog
    jne no_openh
    mcall 71,1,open_dlg	      ;draw in head OPEN FILE
    jmp no_saveh
no_openh:
    cmp byte [dlg_type],'S'    ;if byte S - is Save dialog
    jne no_saveh
    mcall 71,1,save_dlg	      ;draw in head SAVE FILE
    
no_saveh:


;Draw OPEN\SAVE button
    mov ebx,0*65536+50
    mov ecx,0*65536+12
    mov eax,[procinfo.box.width]
    sub eax,63
    shl eax,16
    add ebx,eax
    mov eax,[procinfo.box.height]
    sub eax,25
    shl eax,16
    add ecx,eax
    mov  eax,8
    mov  edx,5 ;button ID
    mov  esi,0x006699aa  ;gradient!!!
    mcall

; label OPEN or SAVE
    mov ebx,[procinfo.box.width]
    sub ebx,48
    mov eax,[procinfo.box.height]
    sub eax,22
    shl ebx,16
    add ebx,eax

    cmp byte [dlg_type],'O'    ;if byte O - is Open dialog
    jne no_openb
    mov edx,but_dlg	   ;draw in head OPEN FILE
    jmp out_labx
no_openb:
    cmp byte [dlg_type],'S'    ;if byte S - is Save dialog
    jne no_saveb
    mov edx,but_dlg+4	       ;draw in head SAVE FILE
out_labx:
    mov ecx,cl_White
    mov esi,4
    mov eax,4
    mcall
no_saveb:

isb5:

anti_flick:

    cmp [flick],2
    je draw_url
    cmp [flick],0
    jne no_flick_url

;***************************
;    DRAW URL LINE
;***************************
draw_url:

;Draw URL focus button
    mov ebx,[urlx]
    shl ebx,16
    add ebx,[urlxsize]
    mov ecx,[urly]
    shl ecx,16
    add ecx,[urlysize]
    dec ebx
    dec ecx
    mov  eax,8
    mov  edx,2 ;button ID
    mov  esi,0x00aaaaaa  ;gradient!!!
    mcall

;Draw URL String
    mov eax,13
    mov edx,cl_Black
    mcall
    add ebx,1*65536-2+1
    add ecx,1*65536-2+1
    mov edx,cl_White
    mcall

;Draw URL Cursor
    mov eax,6
    mul [cursor]
    mov ebx,[urlx]
    add ebx,eax
    shl ebx,16
    add ebx,2*65536+1
    mov ecx,[urly]
    shl ecx,16
    add ecx,[urlysize]
    add ecx,2*65536-4
    mov eax,13
    mov edx,cl_Black
    mcall

; OUT TEXT
    mov eax,[urlxsize]	    ;calculating text leight
    sub eax,8
    mov ebx,6
    div ebx
    mov esi,eax

    mov  ebx,[urlx]
    shl  ebx,16
    add  ebx,[urly]
    add  ebx,3*65536+2
    mov  eax,4		   ; function 4 : write text to window
    mov  ecx,0x00000000 ;[sc.grab_text] ; color of text RRGGBB
    mov  edx,path	 ; pointer to text beginning
    mcall

    cmp  [flick],2
    jne  no_flick_url
    mov  [flick],0
    jmp  still
no_flick_url:


;***************************
;    DRAW FILE LIST
;***************************

;Draw Scroll Line
    mov eax,13

    mov ebx,[listx]
    add ebx,[listxsize]
    sub ebx,[scrollsize]
    shl ebx,16
    add ebx,dword [scrollsize]
    mov ecx,[listy]
    add ecx,scrollbutsize
    shl ecx,16
    add ecx,[listysize]
    sub ecx,scrollbutsize*2
    mov edx,[scrollcolor] ;0x00006600
    mcall

;Draw Scroll Box
    mov  edx,0
    mov  eax,[listysize]
    sub  eax,2
    mov  ebx,dword 10
    div  ebx

    mov ebx,eax
    cmp ebx,[listsize]	    ;filelistsize in ebx
    jae    notusescroll
;usescroll
; calculate scroll size
	mov	eax, [listysize]
	sub	eax, 2*scrollbutsize
	push	eax
	mul	ebx
	div	[listsize]
	cmp	eax, 5
	jae	@f
	mov	al, 5
@@:
	mov	[scroll_height], eax
; calculate scroll pos
	sub	[esp], eax
	mov	eax, [listsize]
	sub	eax, ebx
	mov	ecx, eax
	cmp	eax, [filecursor]
	jb	@f
	mov	eax, [filecursor]
@@:
	mul	dword [esp]
	div	ecx
	mov	[scroll_pos], eax
	pop	ecx
; draw
	lea	ecx, [eax+scrollbutsize]
	add	ecx, [listy]
	shl	ecx, 16
	mov	cx, word [scroll_height]
	mov	eax, 13
	mov	ebx, [listx]
	add	ebx, [listxsize]
	sub	ebx, [scrollsize]
	shl	ebx, 16
	mov	bx, word [scrollsize]
	mov	edx, [scrollboxcol]
	mcall
notusescroll:


;Draw list button for get file name
    mov  ebx,[listx]
    shl  ebx,16
    add  ebx,[listxsize]
    sub  ebx,15      ;right free zone
    sub  ebx,[scrollsize]
    mov  ecx,[listy]
    shl  ecx,16
    add  ecx,[listysize]

    mov  eax,8
    mov  edx,4+0x60000000
    mcall

    add  ebx,15
    mov  eax,13
	sub  ebx,[scrollsize]   ;leency
    mov  edx,[listcolor] ;ffffff
    mcall

;Draw up/down buttons
    mov  ebx,[listx]
    add  ebx,[listxsize]
    sub  ebx,[scrollsize]
    shl  ebx,16
    add  ebx,[scrollsize]
    mov  ecx,[listy]
    shl  ecx,16
    add  ecx,scrollbutsize-1
    mov  eax,8
    mov  edx,6+1000000000000000000000000000000b  ;spoke butt
    mcall

    inc  ecx
    mov  eax,13
    mov  edx,[scrollbutcol]
    mcall

; Draw image on up button
    pushad
    shr  ebx,16
    mov  edx,ebx
    shl  edx,16
    shr  ecx,16
    add  edx,ecx
    mov  ecx,8*65536+9
    mov  ebx,upsb+8
    mov  eax,7
    mcall
    popad


    dec  ecx	 ;correction
    mov  edx,7+1000000000000000000000000000000b  ;spoke butt
    mov  eax,[listysize]
    sub  eax,scrollbutsize
    shl  eax,16
    add  ecx,eax

    mov  eax,8
    mcall

    inc  ecx
    mov  eax,13
    mov  edx,[scrollbutcol] ;ffffff
    mcall

; Draw image on down button
    pushad
    shr  ebx,16
    mov  edx,ebx
    shl  edx,16
    shr  ecx,16
    add  edx,ecx
    mov  ecx,8*65536+9
    mov  ebx,dnsb+8
    mov  eax,7
    mcall
    popad


; Draw text in file list

;    mov  eax,[listxsize]
;    sub  eax,40*6  ;leight of string
;    shr  eax,1
;    add  eax,[listx]
	mov	eax, [listx]
	add	eax, 12+4 ; for icons
    shl  eax,16
    add  eax,[listy]
    add  eax,2

    mov  [filelistxy],eax ;dword 19*65536+58

    mov  edx,0
    mov  eax,[listysize]
    sub  eax,2
    mov  ebx,dword 10
    div  ebx
    mov  [filelistsize],eax  ;dword 40

; OUT FILE DATA
    mov  eax,[filecursor]     ;calc cursor position
    mov  ebx,27
    mul  ebx

;OUT TEXT
    mov  ebp,4096 ; 16             ;out strings process
    sub  ebp,[filecursor]
    mov  edx,convinfo ;fileinfo+11
    add  edx,eax
    mov  ebx,dword [filelistxy]
loo:
	cmp	dword [edx], -1
	jz	noout
    mov  ecx,0x00888888        ;for another file's color white
    cmp  [edx+15],dword 'FOL ' ;folder yellow
    jne  nb
    mov  ecx,0x00006666
    jmp cset1
nb:
	mov	eax, [edx]
	xor	edi, edi
; find extension and set color
@@:
	inc	eax
	cmp	byte [eax-1], 0
	jz	@f
	cmp	byte [eax-1], '.'
	jnz	@b
	mov	edi, eax
	jmp	@b
@@:
	test	edi, edi
	jz	@f
	mov	edi, [edi]
	and	edi, not 0x20202020	; toupper
@@:
;Color set
; text's blue
	mov	ecx, 0x00446666
	cmp	edi, 'TXT'
	jz	cset
	cmp	edi, 'INC'
	jz	cset
	cmp	edi, 'ASM'
	jz	cset
	cmp	edi, 'RTF'
	jz	cset
; picture's pure
	mov	ecx, 0x00226688
	cmp	edi, 'BMP'
	jz	cset
	cmp	edi, 'JPG'
	jz	cset
	cmp	edi, 'JPEG'
	jz	cset
	cmp	edi, 'GIF'
	jz	cset
	cmp	edi, 'PNG'
	jz	cset
	cmp	edi, 'WAV'
	jz	cset
	cmp	edi, 'MID'
	jz	cset
; execute's green
	mov	ecx, 0x00008866
	test	edi, edi
	jz	cset
; for another file's color white
	mov	ecx, 0x00888888
cset:

cset1:
    push edx
    mov  edx,[edx]
	push	ebx edx
	mov	eax, [listxsize]
	sub	eax, [scrollsize]
	sub	eax, 12+4
	xor	edx, edx
	mov	ebx, 6
	div	ebx
	pop	edx ebx
	sub	eax, 25
	xor	esi, esi
@@:
	cmp	byte [edx+esi], 0
	jz	@f
	inc	esi
	cmp	esi, eax
	jbe	@b
	dec	esi
@@:
	push	eax
    mov  eax,4
    mcall
	cmp	byte [edx+esi], 0
	jz	@f
	pushad
	mov	edx, more_char
	mov	eax, esi
	imul	eax, 6*65536
	add	ebx, eax
	mov	esi, 1
	mov	eax, 4
	mcall
	popad
@@:
	pop	eax
    pop  edx
    push ebx edx
	inc	eax
	imul	eax, 6*65536
	add	ebx, eax
    add  edx,4
    mov  esi,23
    mov  eax,4
    mcall
    pop  edx ebx

    pushad
    cmp  [edx+15],dword 'Fvol' ;volume label
    jne  no_volico
    push hdico+8
    jmp out_ico
no_volico:
    cmp  [edx+15],dword 'FOL '
    jne  no_folico
    cmp  [edx+4],dword 'HARD'
    jne  no_hdico
    push hdico+8
    jmp out_ico
no_hdico:
    cmp  [edx+4],dword 'RAMD'
    jne  no_rdico
    push rdico+8
    jmp out_ico
no_rdico:
    cmp  [edx+4],dword 'FLOP'
    jne  no_fdico
    push rdico+8
    jmp out_ico
no_fdico:
    cmp  [edx+4],dword 'CD-R'
    jne  no_cdico
    push cdico+8
    jmp out_ico
no_cdico:
    push folico+8
    jmp out_ico
no_folico:
    cmp  edi,dword 'BMP'
    je	     is_imgico
    cmp  edi,dword 'JPG'
    je	     is_imgico
    cmp  edi,dword 'JPEG'
    je	     is_imgico
    cmp  edi,dword 'GIF'
    je	     is_imgico
    cmp  edi,dword 'PNG'
    je	     is_imgico
    cmp  edi,dword 'ICO'
    je	     is_imgico
	
    cmp  edi,dword 'WAV'
    je	     is_imgico
    cmp  edi,dword 'MID'
    je	     is_imgico
    cmp  edi,dword 'MP3'
    je	     is_imgico
    cmp  edi,dword 'XM'
    je	     is_imgico
    jmp  no_imgico
is_imgico:
    push imgico+8
    jmp out_ico
no_imgico:
    cmp  edi,dword 'ASM'
    je	     is_asmincico
    cmp  edi,dword 'INC'
    je	     is_asmincico
    cmp  edi,dword 'INI'
    je	     is_asmincico
    cmp  edi,dword 'CONF'
    je	     is_asmincico
    jmp  no_asmincico
is_asmincico:
    push asmincico+8
    jmp out_ico
no_asmincico:
    cmp  edi,dword 'RTF'
    je	 @f
    cmp  edi,dword 'TXT'
    jne  no_txtico
    cmp  edi,dword 'LOG'
    jne  no_txtico
 @@:
    push txtico+8
    jmp out_ico
no_txtico:
    test edi,edi
    jne  no_execico
    push execico+8
    jmp out_ico
no_execico:
    cmp  [edx+15],dword 'DAT '
    jne  no_datico
    push datico+8
    jmp out_ico
no_datico:
    cmp  [edx+15],dword 'DEL '
    jne  no_out_ico
    push delico+8
    jmp out_ico
out_ico:

    mov  edx,ebx
    sub  edx,14*65536+1
    mov  ecx,12*65536+9
;    mov  ebx,upsb+8
    pop  ebx
    mov  eax,7
    mcall
no_out_ico:
    popad


    add  ebx,10
noout:
    add  edx,27

    dec  [filelistsize]
    jz	     extloo

    dec  ebp
    jnz  loo
dext:
    mov [downstop],1

extloo:

    cmp  [browser], 1 ;it's browser
    jne  nob8

;Draw text for head->file buttons
    cmp [drawhf],1
    jne  no_drawhftext
    drawfbox 8,35,(6*12)+1,11*8,0x00000000
    drawfbox 9,36,(6*12)-1,(11*8)-2,0x00ffffff

    mov edi,8
    mov ebx,9*65536+37
    mov ecx,cl_Black
    mov edx,file_text_label
    call drawmenu

iglobal
file_text_label:
    db	     '    Open    '
    db	     '    Copy    '
    db	     '    Paste   '
    db	     '   Delete   '
    db	     '   Tinypad  '
    db	     '    Edit    '
    db	     '            '
    db	     '    Exit    '
endg

no_drawhftext:

;Draw text for head->view buttons
    cmp [drawhv],1
    jne  no_drawhvtext
    drawfbox (8+6*8),35,(6*12)+1,(11*4),0x00000000
    drawfbox (9+6*8),36,(6*12)-1,(11*4)-2,0x00ffffff

    mov edi,4
    mov ebx,(9+6*8)*65536+37
    mov ecx,cl_Black
    mov edx,view_text_label
    call drawmenu

iglobal
view_text_label:
    db	     '  Name sort '
    db	     '  Ext. sort '
    db	     '  Size sort '
    db	     '  Date sort '
endg

no_drawhvtext:

;Draw text for head->info buttons
    cmp [drawhi],1
    jne  no_drawhitext
    drawfbox (8+12*8),35,(6*12)+1,(11*2),0x00000000
    drawfbox (9+12*8),36,(6*12)-1,(11*2)-2,0x00ffffff

    mov edi,2
    mov eax,4
    mov ebx,(9+12*8)*65536+37
    mov ecx,cl_Black
    mov edx,info_text_label
    call drawmenu

iglobal
info_text_label:
    db	     '   Help     '
    db	     '   About    '
endg

no_drawhitext:

nob8:
    cmp  [flick],1
    jne  no_flick
    mov  [flick],0
    jmp  still
no_flick:

    ret

;FILE LIST PARAMETRS

iglobal
listx	    dd 15
listy	    dd 72
listxsize dd 350
listysize dd 41

filelistxy    dd 0
filelistsize  dd 0
scrollsize    dd 8
listcolor     dd 0xffffff ;0xeeeeee
scrollcolor   dd 0x778877
scrollboxcol  dd 0x335533
scrollbutcol  dd 0x224422
scrollbutsize = 9

;URL LINE PARAMETRS

urlx	 dd 10
urly	 dd 20
urlxsize dd 350
urlysize dd 12
endg

drawmenu:
    mov eax,4
    mov esi,12
menuloo:
    mcall
    add ebx,11
    add edx,12
    dec edi
    jnz menuloo
    ret

menubutton:
    mov  eax,8
nextmenubut:
    mcall
    add  ecx,11*65536
    inc  edx
    dec  edi
    jnz  nextmenubut
    ret

;*****************************
; READ FILE STRUCTURE PROC
;*****************************

read_directory:

;STEP 1 CLEAR CONVINFO
    mov  edi,convinfo
    mov  al,255
    mov  ecx,4096*27
    cld
    push edi
    rep  stosb
    pop  edi

;STEP 2 TEST ON HD OR PARTITION
    cmp [path],byte '/'
    je nstep
; copy info on RD and FD
	mov	esi, hdimg
	mov	ecx, 2*27
	rep	movsb
; hard disks
	mov	eax, 4
.1:
	mov	ecx, 27
	cmp	dword [esi], 0
	jz	.2
	rep	movsb
	jmp	.3
.2:
	add	esi, ecx
.3:
	dec	eax
	jnz	.1
	mov	[listsize], 0
	ret
nstep:
    cmp [path+3],byte '/'
    je nstep2
    cmp [path+4],byte '/'
    je nstep2
    mov ecx,1
    cmp [path+1],word 'RD'
    jz	loxpt
    cmp [path+1],word 'CD'
    jz	loxpt
    mov ecx,2
    cmp [path+1],word 'FD'
    jz	loxpt
    cmp [path+1],dword 'HD0'
    jne nostep_HD0
    movzx ecx,byte [table_area+2]
    jmp loxpt
nostep_HD0:
    cmp [path+1],dword 'HD1'
    jne nostep_HD1
    movzx ecx,byte [table_area+3]
    jmp loxpt
nostep_HD1:
    cmp [path+1],dword 'HD2'
    jne nostep_HD2
    movzx ecx,byte [table_area+4]
    jmp loxpt
nostep_HD2:
    cmp [path+1],dword 'HD3'
    jne nostep_HD3
    movzx ecx,byte [table_area+5]
    jmp loxpt
nostep_HD3:

    mov ecx,2

loxpt:
	cmp	ecx, 20
	jbe	@f
	mov	ecx, 20
@@:
	mov	eax, a1
	mov	esi, ptimg
@@:
	stosd
	add	eax, 3
	push	ecx esi
	mov	ecx, 23
	rep	movsb
	pop	esi ecx
	loop	@b
    mov [listsize],0
    ret
nstep2:

;STEP 3 was deleted

;STEP 4 READ DATA FROM HD

loorhd:
    mov  eax,70
    mov  ebx,fileinfoblock
    mcall

    cmp eax,6
    je	    end_of_dir

;  It's erorr's test is poor code

    cmp eax,1
    jne no_inv_part
    glabel 10,10,'Invalid partition or hd base',cl_Red+font_Big
    jmp end_of_dir
no_inv_part:
    cmp eax,3
    jne no_unk_fs
    glabel 10,10,'Unknown file system',cl_Red+font_Big
    jmp end_of_dir
no_unk_fs:

end_of_dir:
; -1 -> 0
	cmp	ebx, -1
	sbb	ebx, -1
    mov  [dirlen],ebx

    ; command successful

	mov	esi, outinfo+32
	and	[listsize], 0
	test	ebx, ebx
	jz	nofiles

  newlineb:
	push	ebx

	mov	edi, fileinfo
	push	edi
	mov	al, ' '
	mov	ecx, 27
	rep	stosb
	pop	edi
	push	esi
	add	esi, 40
	mov	[edi], esi
	pop	esi

	mov	eax, 'DAT '	; data or ... ?
	mov	cl, [esi]
	test	cl, 0x10
	jz	@f
	mov	eax, 'FOL '
	mov	[edi+15], eax
	jmp	nosize
@@:
	test	cl, 8
	jz	novol
	mov	eax, 'Fvol'
	mov	[edi+15], eax
	jmp	nosize
novol:
	mov	[edi+15], eax

; size
	mov	eax, [esi+32]
	push	esi
	lea	esi, [edi+26]
	mov	ebx, 10
	mov	ecx, 8
newnum:
	xor	edx, edx
	div	ebx
	add	dl, '0'
	mov	[esi], dl
	test	eax, eax
	jz	zernum
	dec	esi
	loop	newnum
zernum:
	pop	esi
nosize:

; date
	mov	dword [edi+6], '.  .'
; year
	movzx	eax, word [esi+28+2]
	mov	ecx, 4
newdel1:
	xor	edx, edx
	mov	ebx, 10
	div	ebx
	add	edx, '0'
	mov	[edi+ecx+9], dl
	loop	newdel1
; month
	movzx	eax, byte [esi+28+1]
	xor	edx, edx
	div	ebx
	add	al, '0'
	add	dl, '0'
	mov	[edi+7], al
	mov	[edi+8], dl
; day
	movzx	eax, byte [esi+28]
	xor	edx, edx
	div	ebx
	add	al, '0'
	add	dl, '0'
	mov	[edi+4], al
	mov	[edi+5], dl

;STEP 5 Test on WRITE OR NOTWRITE
	cmp	word [esi+40], '.'
	jz	nextfl
	cmp	word [esi+40], '..'
	jnz	@f
	cmp	byte [esi+42], 0
	jz	nextfl
@@:

; STEP 6 SORT ALGORYTHM

	push	esi
	xor	esi, esi

; At first Fold after Dat

ftestname:
	cmp	dword [convinfo+esi], -1
	jz	writefile
    cmp byte [fileinfo+15],'F'
    je	    F
    cmp byte [fileinfo+15],'D'
    jne add_element
D:  cmp byte [convinfo+esi+15],'D'
    je	    add_element
    cmp byte [convinfo+esi+15],'F'
    je	    skipfile
    jmp add_element
F:  cmp byte [convinfo+esi+15],'D'
    je writenow
;    cmp byte [convinfo+esi+15],'F'
;    je  add_element
;    jmp add_element

add_element:
; compare items
	movzx	eax, [viewmode]
	call	[compare+eax*4]
	jb	writenow
skipfile:
    add esi,27
    jmp ftestname

writenow:
    mov ecx,4096*27-1
    sub ecx,esi
ldloop:
    mov al,[convinfo+ecx+esi]
    mov [convinfo+ecx+esi+27],al
    dec ecx
    jns ldloop

writefile:
    mov ecx,26
wfloop:
    mov al,[fileinfo+ecx]
    mov [convinfo+ecx+esi],al
    dec ecx
    jns wfloop
	inc	[listsize]
	pop	esi

nextfl:
	add	esi, 304
	pop	ebx
	dec	ebx
	jnz	newlineb

nofiles:
	ret

toupper:
	cmp	al, 'a'
	jb	.ret
	cmp	al, 'z'
	ja	@f
.sub20:
	sub	al, 0x20
.ret:
	ret
@@:
	cmp	al, 0xA0
	jb	.ret
	cmp	al, 0xB0
	jb	.sub20
	cmp	al, 0xE0
	jb	.ret
	cmp	al, 0xF0
	jae	@f
	sub	al, 0xE0-0x90
	ret
@@:
	cmp	al, 0xF1
	jnz	.ret
	dec	eax
	ret

compare_date:
	pushad
	mov	al, [fileinfo+10]
	cmp	al, [convinfo+esi+10]
	jnz	.ret
	mov	al, [fileinfo+11]
	cmp	al, [convinfo+esi+11]
	jnz	.ret
	mov	al, [fileinfo+12]
	cmp	al, [convinfo+esi+12]
	jnz	.ret
	mov	al, [fileinfo+13]
	cmp	al, [convinfo+esi+13]
	jnz	.ret
	mov	al, [fileinfo+7]
	cmp	al, [convinfo+esi+7]
	jnz	.ret
	mov	al, [fileinfo+8]
	cmp	al, [convinfo+esi+8]
	jnz	.ret
	mov	al, [fileinfo+4]
	cmp	al, [convinfo+esi+4]
	jnz	.ret
	mov	al, [fileinfo+5]
	cmp	al, [convinfo+esi+5]
	jz	compare_name.1
.ret:
	popad
	ret
compare_name:
	pushad
.1:
	mov	edi, dword [convinfo+esi]
	mov	esi, dword [fileinfo]
	call	strcmpi
	popad
	ret
compare_ext:
	pushad
	mov	esi, dword [convinfo+esi]
	mov	edi, dword [fileinfo]
	call	find_ext
	xchg	esi, edi
	call	find_ext
	call	strcmpi
	popad
	jz	compare_name
	ret
compare_size:
	pushad
	lea	edi, [convinfo+esi+19]
	lea	esi, [fileinfo+19]
	mov	ecx, 8
	repz	cmpsb
	popad
	jz	compare_name
	ret

strcmpi:
	lodsb
	call	toupper
	push	eax
	mov	al, [edi]
	inc	edi
	call	toupper
	cmp	[esp], al
	pop	eax
	jnz	@f
	test	al, al
	jnz	strcmpi
@@:
	ret

find_ext:
	lodsb
	test	al, al
	jz	.noext
	cmp	al, '.'
	jnz	find_ext
	ret
.noext:
	dec	esi
	ret

;******************************************************************************
title_browser db 'SYSTEM X-TREE FILE BROWSER',0
open_dlg  db 'OPEN FILE',0
save_dlg  db 'SAVE FILE',0

; DATA AREA
pmenu_draw dd 0  ;if poup menu is draw,update all window
flick	     dd 0  ;anti flick on ?
drawhf	       dd 0  ;draw file menu?
drawhv	       dd 0  ;draw view menu?
drawhi	       dd 0  ;draw info menu?
cursor	       dd 0  ;cursor in prompt line
focus	     dd 0  ;prompt edit or window?
downstop   dd 0
filecursor dd 0
mousex	       dd 0
mousey	       dd 0
blocksread dd 0
listsize   dd 0  ;num of files in directory
temp	   dd 0
readblock  dd 1
dlg_type   db 0 ;S-save O-open
browser    db 0  ;0-dialog, 1-browser
viewmode   db 0  ;folder sort

compare dd	compare_name
	dd	compare_ext
	dd	compare_size
	dd	compare_date

aRD	db	'RD',0
aFD	db	'FD',0
aHD0	db	'HD0',0
aHD1	db	'HD1',0
aHD2	db	'HD2',0
aHD3	db	'HD3',0
aCD0	db	'CD0',0
aCD1	db	'CD1',0
aCD2	db	'CD2',0
aCD3	db	'CD3',0
a1	db	'1',0,0
a2	db	'2',0,0
a3	db	'3',0,0
a4	db	'4',0,0
a5	db	'5',0,0
a6	db	'6',0,0
a7	db	'7',0,0
a8	db	'8',0,0
a9	db	'9',0,0
a10	db	'10',0
a11	db	'11',0
a12	db	'12',0
a13	db	'13',0
a14	db	'14',0
a15	db	'15',0
a16	db	'16',0
a17	db	'17',0
a18	db	'18',0
a19	db	'19',0
a20	db	'20',0

hdimg:
	dd	aRD
	db	'RAMDISK    FOL         '
	dd	aFD
	db	'FLOPPYDISK FOL         '
hdimg1	dd	0
	db	'HARDDISK   FOL         '
hdimg2	dd	0
	db	'HARDDISK   FOL         '
hdimg3	dd	0
	db	'HARDDISK   FOL         '
hdimg4	dd	0
	db	'HARDDISK   FOL         '
ptimg	db	'PARTITION  FOL         '

modetext:
      ;0123456789012345
   db 'SORT BY NAME   0'
   db 'SORT BY EXT.   1'
   db 'SORT BY SIZE   2' ;type sort
   db 'SORT BY DATE   3'
   db 'DEL SORT NAME  4'
   db 'DEL SORT EXT.  5'
   db 'DEL SORT SIZE  6' ;type sort
   db 'DEL SORT DATE  7'

dirlen	      dd     0x1
b_color   dd   0x6677cc

; //// Willow
;MRUfile:
;   dd 0x0
;   dd 0x0
;   dd 0x1
;   dd path
;   dd tempzone
;   db '/RD/1/MRU.LST',0
; //// Willow

;Name of programs
editor	  db '/sys/tinypad',0
kiv       db '/sys/media/kiv',0
ac97	  db '/sys/media/ac97snd',0
midamp	  db '/sys/media/midamp',0
htmlv	  db '/sys/network/htmlv',0
rtfread   db '/sys/rtfread',0
view3ds   db '/sys/3d/view3ds',0
life2	  db '/sys/demos/life2',0

more_char db 10h

IncludeIGlobals

fileinfo_start:
	dd	7
	dd	0
fileinfo_params:
	dd	0
	dd	0
	dd	0
	db	0
fileinfo_name:
	dd	0

clipfile_info:
	dd	?
	dd	0
	dd	0
	dd	?
	dd	paramtest
	db	'/SYS/CLIPFILE.TXT',0
copyr_run:
	dd	7
	dd	0
	dd	copyr_param
	dd	0
	dd	0
	db	'/SYS/COPYR',0

fileinfoblock:
   dd 0x1    ; read folder
   dd 0x0    ; first block
   dd 0x0    ; flags (ANSI names)
   dd 4095   ; number of blocks to read
   dd outinfo	  ; ret offset
path:
times 1024 db 0     ;path

table_area:
rb 10

;rb 256
but_file:
file 'systr12.GIF'

I_END:

scroll_height dd ?
scroll_pos dd ?

butimg:
rb 400*16*3+8	  ;buttons (left pice of picture)
logoimg:
rb 70*16*3+8	;logo (right pice of picture)
logoinfimg:
rb 60*60*3+8	;logoinfo (right pice of picture)
upsb:
rb 8*9*3+8    ;up scroll button
dnsb:
rb 8*9*3+8    ;down scroll button

;ICONS RESERVE AREA
hdico:
rb 12*9*3+8
rdico:
rb 12*9*3+8
folico:
rb 12*9*3+8
datico:
rb 12*9*3+8
delico:
rb 12*9*3+8
imgico:
rb 12*9*3+8
txtico:
rb 12*9*3+8
asmincico:
rb 12*9*3+8
execico:
rb 12*9*3+8
cdico:
rb 12*9*3+8

tempimg:    ;reserve ram for images
rb 400*100*3+8	     ;for picture
rb 8000

MYPID:
rd 8

param_area:
rb 256
paramtest:
rb 1024
filedir:
rb 1024

IncludeUGlobals

procinfo process_information
sc system_colors

fileinfo:
rb 200 ;4096*62+1024

copyr_param	rb	256

outinfo:
rb 32+4096*304

convinfo:
rb 4096*27
; stack
	align 4
	rb	1024
RAM_END: