Subversion Repositories Kolibri OS

Rev

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

  1. ; Copyright (c) 2009, <Lrz>
  2. ; All rights reserved.
  3. ;
  4. ; Redistribution and use in source and binary forms, with or without
  5. ; modification, are permitted provided that the following conditions are met:
  6. ;       * Redistributions of source code must retain the above copyright
  7. ;       notice, this list of conditions and the following disclaimer.
  8. ;       * Redistributions in binary form must reproduce the above copyright
  9. ;       notice, this list of conditions and the following disclaimer in the
  10. ;       documentation and/or other materials provided with the distribution.
  11. ;       * Neither the name of the <organization> nor the
  12. ;       names of its contributors may be used to endorse or promote products
  13. ;       derived from this software without specific prior written permission.
  14. ;
  15. ; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname <Lrz> ''AS IS'' AND ANY
  16. ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  17. ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  18. ; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
  19. ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  20. ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  21. ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  22. ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  23. ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  24. ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. ;*****************************************************************************
  26.  
  27. ;блок макросов по обработке секции [loader]
  28. ;входные данные:
  29. ;es:di - указатель на секцию начинающиюся с '[' встечающиюся после 0хa
  30. ;cx - счетчик кол-во байт для проверке в кадре
  31. ;
  32. macro use_parse_loader
  33. {
  34. .parse_loader:
  35. ;//////////////////
  36. ;/ parse  [loader]
  37. ;//////////////////
  38.         mov     bx, cx  ;cохраним в регистры значения счетчика и указателя
  39.         mov     ax, di
  40.  
  41. ;       mov     word [bp-4],.start  ;is alredy set, see up
  42.         mov     si, parse_loader
  43.         mov     cx, parse_loader_e - parse_loader
  44.         repe cmpsb
  45.         jnz     error.rest_value        ;цепочка не совпала :( перейдем далее  т.е. будем снова искать))
  46.  
  47.         ;сохраним указательна loader, что бы потом больше его не искать
  48.         mov     point_loader, ax
  49.         sub     bx, parse_loader_e - parse_loader;correct cx
  50.         add     bx, cx
  51.         mov     cx, bx
  52.  
  53. if DEBUG        
  54.         pusha
  55.         mov     si, lm_l_found
  56.         call    printplain
  57.         popa
  58. end if  
  59. ;/////////////////end check [loader]. [loader] is found
  60. ;parsing section [loader]
  61. ;first found end section,let's found '[' -it's start next section
  62. ;in previosly steep bx =cx we are not need save cx, save only di - point
  63.         mov     dx, di
  64. @@:
  65.         call    get_firs_sym
  66.         jcxz    .loader_f_end ;.end_loader         ; end даже если мы не нашли секцию предположим что секция [loader] стоит в конце
  67.         cmp     al, '['
  68.         jnz     @b
  69.  
  70. .loader_f_end:
  71.         sub     bx, cx  ;bx = n byte presend in section [loader]
  72.         mov     di, dx  ;restore di
  73. ;////////////////parse parametrs in section [loader]
  74. ;//timeout=5
  75. ;//default=main
  76. ;        mov    di,dx   ;set pointer on section [loader]   i think it's not need
  77.         mov     cx, bx  ;set counter for parsing section [loader] cx= кол-ву символов в секции [loader]
  78.         mov     ret_on_ch, .get_next_str; return point
  79. ;;;;;;; parse timeout & default
  80. .get_next_str:
  81.         call    get_firs_sym    ;get first symbol on new line
  82.  
  83.         test    cx, cx
  84.         jz      .end_loader
  85. ;        jcxz   .end_loader     ;завершение парсинга значений timeout & default
  86.         cmp     al, 't'
  87.         jz      .loader_timeout
  88.         cmp     al, 'd'
  89.         jnz     .get_next_str
  90. ;//////[loader].default
  91. ;input di point to data cx=size [loader]
  92.         mov     bx, cx
  93.         mov     ax, di
  94.  
  95.         mov     si, parse_l_default
  96.         mov     cx, parse_l_default_e - parse_l_default
  97.         repe cmpsb
  98.  
  99.         jnz     error.rest_value      ;is not compare цепочка не совпала
  100.  
  101.         sub     bx, parse_l_default_e - parse_l_default;correct cx
  102.         add     bx, cx
  103.         mov     cx, bx
  104.  
  105.         test    status_flag, flag_found_default
  106.         jz      .correct_is_not_set
  107.  
  108.         mov     si, found_equal_default                         ;мы нашли что флаг уже установлен, информируем
  109.         call    printplain
  110.         jmp     .get_next_str
  111.  
  112. .correct_is_not_set:
  113.         mov     ax, 0x3d20         ;cut al=' ' ah='='
  114.         repe scasb
  115.         test    cx, cx
  116.         jz      .end_loader
  117.        
  118.         cmp     ah, byte [es:di-1]   ;find '='
  119.         jnz     .get_next_str
  120.        
  121.         repe scasb                 ;cut ' '
  122.         inc     cx
  123.         dec     di
  124. ;сейчас es:di указывают на название секции, имя секции по дефолту не должно быть loader т.е. иначе возможно зацикливание
  125. ;установим указатель si на это значение и сначала проверим
  126.  
  127. ;получение длинны секции
  128. ; cx=bx содержит длинну остатка секции
  129. ; di=ax указатель на текущию секцию
  130.         mov     bx, cx
  131.         mov     dx, di
  132.  
  133. @@:
  134.         mov     al, byte [es:di]
  135.         inc     di
  136.         dec     cx
  137.         test    cx, cx
  138.         jz      error.error_get_size_d_sect  ;переход на обработку ошибки по нахождению длины дефолтной секции
  139.         cmp     al, ' '
  140.         jz      @b
  141.         cmp     al, 0xd
  142.         jz      .found_size_d_sect
  143.         cmp     al, 0xa
  144.         jnz     @b
  145. .found_size_d_sect:
  146. ;
  147.         inc     cx      ;correct cx
  148.         mov     ax, bx
  149.         sub     bx, cx  ; в bx длина секции которая определена по дефолту
  150.         mov     save_cx_d, bx
  151.         mov     di, dx
  152.  
  153.         mov     cx, bx  ;set size default section
  154. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;проверка на =loader
  155. ;save in reg point and счетчик
  156. ;check on loader
  157.         mov     bx, ax
  158.         mov     ax, dx
  159.  
  160.         mov     si, parse_loader
  161.         inc     si      ;set only loader and 6 char in counter
  162.         repe cmpsb
  163.         jnz     .check_section        ;цепочка не совпала :( перейдем далее )) значит не исключение
  164.  
  165.         jmp     error.default_eq_loader    ;error критическая ошибка т.е. в дефолте присутствует имя [loader]
  166.  
  167. .check_section:         ;поиск соответствующей секции нам нужно будет узнать адрес этой секции
  168.         mov     cx, bx
  169.         mov     di, ax
  170.  
  171. ;/////////////////////////////
  172. ;       mov     ret_on_ch,.start_d     ;set return
  173.         mov     si, di  ;установим указатель на нашу секцию, которая по дефолту
  174.  
  175.         push    di      ;save point di
  176.  
  177.         push    cx      ;save cx
  178. ;установим указатель es:di на начало ini файла
  179.         mov     cx, save_cx     ;it's placed size of ini file
  180.         les     di, dword [file_data]
  181.  
  182.  
  183.         mov     al, byte [es:di]
  184.         push    word .first_ret_d
  185.         cmp     al, ' '
  186.         jz      .first_sp_1_d
  187.         jmp     get_firs_sym.not_space
  188. .first_sp_1_d:
  189.         jmp     get_firs_sym.first_sp
  190.  
  191. .start_d:
  192.         call    get_firs_sym    ;get first symbol on new line
  193. .first_ret_d:                     ;первый возврат
  194.         jcxz    .correct_exit   ;.end_loader     ;found or not found parametrs in section  exit in section
  195.         cmp     al, '['
  196.         jz      .found_sect_d
  197.         jmp     .start_d
  198. ;просматриваем ini файл с начала в поисках секции указаной как default
  199. ;идет проверка на наличее значения timeout, для более быстрой работы, этот параметр должен быть уже обработан,т.е. в этом случае при его =0 будет сформирован указатель только на дефолтную секцию, иначе информация будет собрана по всем секциям и составлены указатели в блоке памяти        
  200. .found_sect_d:
  201.  
  202. ;check on name section
  203.         mov     bx, cx
  204.         mov     ax, di
  205.         push    si      ;save point
  206.        
  207. ;        mov     si,parse_loader
  208.         mov     cx, save_cx_d;load size section
  209.         push    es
  210.         pop     ds
  211.  
  212.         inc     di
  213.         repe cmpsb
  214.         push    cs
  215.         pop     ds
  216.         pop     si
  217.  
  218.         jnz     .not_compare_d_s        ;цепочка не совпала :( перейдем далее )) значит не исключение
  219.         cmp     byte[es:di], ']'
  220.         jnz     .not_compare_d_s        ;нет в конце нашей секции завершающего символа :(
  221.  
  222.  
  223.  
  224. ;set flag -we have found default -not enter again in this prosedure
  225.         or      status_flag, flag_found_default
  226.         pop     cx
  227.         pop     di
  228.         mov     point_default, ax       ;point to [
  229.  
  230. if DEBUG        
  231.         pusha
  232.         mov     si, lm_lf_default_f
  233.         call    printplain
  234.         popa
  235. end if  
  236.        
  237.         jmp     .get_next_str
  238.  
  239. .not_compare_d_s:
  240.  
  241.         mov     cx, bx
  242.         mov     di, ax
  243.         jmp     .start_d
  244.  
  245. .correct_exit:
  246.         pop     cx ;восстановим значение счетчика
  247.         pop     di
  248.  
  249.  
  250. if DEBUG        
  251.         pusha
  252.         mov     si, lm_lf_default
  253.         call    printplain
  254.         popa
  255. end if  
  256.         jmp     .get_next_str
  257.  
  258. ;//////////[loader].timeout
  259. .loader_timeout:
  260.         mov     bx, cx
  261.         mov     ax, di
  262.  
  263.         mov     si, parse_l_timeout
  264.         mov     cx, parse_l_timeout_e - parse_l_timeout
  265.         repe cmpsb
  266.         jnz     error.rest_value           ;is not compare
  267.  
  268.         sub     bx, parse_l_timeout_e - parse_l_timeout;correct cx
  269.         add     bx, cx
  270.         mov     cx, bx
  271.  
  272.         test    status_flag, flag_found_timeout
  273.         jz      .correct_is_not_set_t
  274.  
  275.         mov     si, found_equal_timeout                         ;мы нашли что флаг уже установлен, информируем
  276.         call    printplain
  277.         jmp     .get_next_str
  278.  
  279. .correct_is_not_set_t:
  280.         mov     ax, 0x3d20         ;cut al=' ' ah='='
  281.         repe scasb
  282.         jcxz    .timeout_sec_end_d          ;not found param timeout
  283.        
  284.         cmp     ah, byte [es:di-1]   ;find '='
  285.         jnz     .get_next_str
  286.        
  287.         repe scasb                 ;cut ' '
  288.         inc     cx
  289.         dec     di
  290. ;get timeout value
  291. ;2 знакa может быть обработано т.е. значение от 0 до 99 секунд
  292.         push    cx
  293.         xor     bx, bx
  294.         mov     cx, 2
  295. @@:
  296.         mov     al, byte [es:di]
  297.         cmp     al, '0'
  298.         jb      .end_get_val_t
  299.         cmp     al, '9'
  300.         ja      .end_get_val_t
  301.         imul    bx, 10
  302.         xor     al, 0x30
  303.         add     bl, al
  304. .end_get_val_t:
  305.         inc     di
  306.         loop    @b
  307.         mov     word [value_timeout], bx
  308. ;       pop     cx
  309.  
  310. if DEBUG        
  311.         pusha
  312.         mov     si, lm_lf_timeout
  313.         call    printplain
  314.         popa
  315. end if  
  316.  
  317.         jmp     @f
  318. .timeout_sec_end_d:
  319.         mov     word [value_timeout], default_timeout_value
  320.         mov     si, set_default_timeout_val
  321.         call    printplain
  322. @@:
  323.         pop     cx
  324.         jmp     .get_next_str
  325.  
  326. ;///////here end block loader
  327. .end_loader:
  328. if DEBUG        
  329.         pusha
  330.         mov     si, lm_l_end
  331.         call    printplain
  332.         popa
  333. end if  
  334.  
  335. }
  336.