;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                              ;;
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License    ;;
;;                                                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;-------------------------------------------------------------------------
;Loading configuration from ini file
;    {SPraid.simba}
;-------------------------------------------------------------------------

$Revision$

iglobal
conf_path_sect:
                db 'path',0

conf_fname db '/sys/sys.conf',0
endg
; set soke kernel configuration
proc set_kernel_conf
        locals
          par db 30 dup(?)
        endl

        pushad
;[gui]
;mouse_speed

        lea     eax, [par]
        push    eax
        invoke  ini.get_str, conf_fname, ugui, ugui_mouse_speed, \
                eax,30, ugui_mouse_speed_def
        pop     eax
        stdcall strtoint, eax
        mov     [mouse_speed_factor], ax

;mouse_delay
        lea     eax, [par]
        push    eax
        invoke  ini.get_str, conf_fname, ugui, ugui_mouse_delay, \
                eax,30, ugui_mouse_delay_def
        pop     eax
        stdcall strtoint, eax
        mov     [mouse_delay], eax


;midibase
        lea     eax, [par]
        push    eax
        invoke  ini.get_str, conf_fname, udev, udev_midibase, eax, 30, udev_midibase_def
        pop     eax
        stdcall strtoint, eax

        cmp     eax, 0x100
        jb      @f
        cmp     eax, 0x10000
        jae     @f
        mov     [midi_base], ax
        mov     [mididp], eax
        inc     eax
        mov     [midisp], eax
@@:
        popad
        ret
endp
iglobal
ugui db 'gui',0
ugui_mouse_speed db 'mouse_speed',0
ugui_mouse_speed_def db '2',0
ugui_mouse_delay db 'mouse_delay',0
ugui_mouse_delay_def db '0x00A',0

udev db 'dev',0
udev_midibase db 'midibase',0
udev_midibase_def db '0x320',0
endg
;set up netvork configuration
proc set_network_conf
locals
  par db 30 dup(?)
endl
        pushad

  ;[net]
  ;active
        lea     eax, [par]
        invoke  ini.get_int, conf_fname, unet, unet_active, 0
        or      eax, eax
        jz      .do_not_set_net
        mov     eax, [stack_config]
        and     eax, 0xFFFFFF80
        add     eax, 3
        mov     [stack_config], eax
        call    ash_eth_enable

  ;addr
        lea     eax, [par]
        push    eax
        invoke  ini.get_str, conf_fname, unet, unet_addr, eax, 30, unet_def
        pop     eax
        stdcall do_inet_adr, eax
        mov     [stack_ip], eax

  ;mask
        lea     eax, [par]
        push    eax
        invoke  ini.get_str, conf_fname, unet, unet_mask, eax, 30, unet_def
        pop     eax
        stdcall do_inet_adr, eax
        mov     [subnet_mask], eax

  ;gate
        lea     eax, [par]
        push    eax
        invoke  ini.get_str, conf_fname, unet, unet_gate, eax, 30, unet_def
        pop     eax
        stdcall do_inet_adr, eax
        mov     [gateway_ip], eax
.do_not_set_net:
        popad
        ret


endp
iglobal
unet db 'net',0
unet_active db 'active',0
unet_addr db 'addr',0
unet_mask db 'mask',0
unet_gate db 'gate',0
unet_def db 0
endg
; convert string to DWord
proc strtoint stdcall,strs
        pushad

        mov     eax, [strs]
        inc     eax
        mov     bl, [eax]
        cmp     bl, 'x'
        je      .hex
        cmp     bl, 'X'
        je      .hex
        jmp     .dec
.hex:
        inc     eax
        stdcall strtoint_hex, eax
        jmp     .exit
.dec:
        dec     eax
        stdcall strtoint_dec, eax
.exit:
        mov     [esp+28], eax
        popad
        ret
endp

; convert string to DWord for decimal value
proc strtoint_dec stdcall,strs
        pushad
        xor     edx, edx
  ; ���� ����
        mov     esi, [strs]
@@:
        lodsb
        or      al, al
        jnz     @b
        mov     ebx, esi
        mov     esi, [strs]
        dec     ebx
        sub     ebx, esi
        mov     ecx, 1

@@:
        dec     ebx
        or      ebx, ebx
        jz      @f
        imul    ecx, ecx, 10; ���冷�
        jmp     @b
@@:

        xchg    ebx, ecx


        xor     ecx, ecx


@@:
        xor     eax, eax
        lodsb
        cmp     al, 0
        je      .eend

        sub     al, 30h
        imul    ebx
        add     ecx, eax
        push    ecx
        xchg    eax, ebx
        mov     ecx, 10
        div     ecx
        xchg    eax, ebx
        pop     ecx
        jmp     @b

.eend:
        mov     [esp+28], ecx
        popad
        ret
endp

;convert string to DWord for hex value
proc strtoint_hex stdcall,strs
        pushad
        xor     edx, edx

        mov     esi, [strs]
        mov     ebx, 1
        add     esi, 1

@@:
        lodsb
        or      al, al
        jz      @f
        shl     ebx, 4
        jmp     @b
@@:
        xor     ecx, ecx
        mov     esi, [strs]

@@:
        xor     eax, eax
        lodsb
        cmp     al, 0
        je      .eend

        cmp     al, 'a'
        jae     .bm
        cmp     al, 'A'
        jae     .bb
        jmp     .cc
.bm:    ; 57h
        sub     al, 57h
        jmp     .do

.bb:    ; 37h
        sub     al, 37h
        jmp     .do

.cc:    ; 30h
        sub     al, 30h

.do:
        imul    ebx
        add     ecx, eax
        shr     ebx, 4

        jmp     @b

.eend:
        mov     [esp+28], ecx
        popad
        ret
endp


; convert string to DWord for IP addres
proc do_inet_adr stdcall,strs
        pushad

        mov     esi, [strs]
        mov     ebx, 0
.next:
        push    esi
@@:
        lodsb
        or      al, al
        jz      @f
        cmp     al, '.'
        jz      @f
        jmp     @b
@@:
        mov     cl, al
        mov     [esi-1], byte 0
  ;pop eax
        call    strtoint_dec
        rol     eax, 24
        ror     ebx, 8
        add     ebx, eax
        or      cl, cl
        jz      @f
        jmp     .next
@@:
        mov     [esp+28], ebx
        popad
        ret
endp