Rev 1635 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1065 | Lrz | 1 | ; Copyright (c) 2009, |
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 |
||
12 | ; names of its contributors may be used to endorse or promote products |
||
13 | ; derived from this software without specific prior written permission. |
||
14 | ; |
||
1151 | Lrz | 15 | ; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname |
1065 | Lrz | 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 |
||
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 | ;////////////////// |
||
2434 | Serge | 38 | mov bx, cx ;cохраним в регистры значения счетчика и указателя |
39 | mov ax, di |
||
1065 | Lrz | 40 | |
2434 | Serge | 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 |
||
1065 | Lrz | 45 | jnz error.rest_value ;цепочка не совпала :( перейдем далее т.е. будем снова искать)) |
46 | |||
2434 | Serge | 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 |
||
1065 | Lrz | 52 | |
53 | if DEBUG |
||
54 | pusha |
||
2434 | Serge | 55 | mov si, lm_l_found |
1065 | Lrz | 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 |
||
2434 | Serge | 63 | mov dx, di |
1065 | Lrz | 64 | @@: |
2434 | Serge | 65 | call get_firs_sym |
66 | jcxz .loader_f_end ;.end_loader ; end даже если мы не нашли секцию предположим что секция [loader] стоит в конце |
||
67 | cmp al, '[' |
||
68 | jnz @b |
||
1065 | Lrz | 69 | |
70 | .loader_f_end: |
||
2434 | Serge | 71 | sub bx, cx ;bx = n byte presend in section [loader] |
72 | mov di, dx ;restore di |
||
1065 | Lrz | 73 | ;////////////////parse parametrs in section [loader] |
74 | ;//timeout=5 |
||
75 | ;//default=main |
||
2434 | Serge | 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 |
||
1065 | Lrz | 79 | ;;;;;;; parse timeout & default |
80 | .get_next_str: |
||
2434 | Serge | 81 | call get_firs_sym ;get first symbol on new line |
1065 | Lrz | 82 | |
2434 | Serge | 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 |
||
1065 | Lrz | 90 | ;//////[loader].default |
91 | ;input di point to data cx=size [loader] |
||
2434 | Serge | 92 | mov bx, cx |
93 | mov ax, di |
||
1065 | Lrz | 94 | |
2434 | Serge | 95 | mov si, parse_l_default |
96 | mov cx, parse_l_default_e - parse_l_default |
||
97 | repe cmpsb |
||
1065 | Lrz | 98 | |
2434 | Serge | 99 | jnz error.rest_value ;is not compare цепочка не совпала |
1065 | Lrz | 100 | |
2434 | Serge | 101 | sub bx, parse_l_default_e - parse_l_default;correct cx |
102 | add bx, cx |
||
103 | mov cx, bx |
||
1065 | Lrz | 104 | |
2434 | Serge | 105 | test status_flag, flag_found_default |
106 | jz .correct_is_not_set |
||
1065 | Lrz | 107 | |
2434 | Serge | 108 | mov si, found_equal_default ;мы нашли что флаг уже установлен, информируем |
109 | call printplain |
||
110 | jmp .get_next_str |
||
1065 | Lrz | 111 | |
112 | .correct_is_not_set: |
||
2434 | Serge | 113 | mov ax, 0x3d20 ;cut al=' ' ah='=' |
114 | repe scasb |
||
115 | test cx, cx |
||
116 | jz .end_loader |
||
1065 | Lrz | 117 | |
2434 | Serge | 118 | cmp ah, byte [es:di-1] ;find '=' |
119 | jnz .get_next_str |
||
120 | |||
121 | repe scasb ;cut ' ' |
||
122 | inc cx |
||
123 | dec di |
||
1065 | Lrz | 124 | ;сейчас es:di указывают на название секции, имя секции по дефолту не должно быть loader т.е. иначе возможно зацикливание |
125 | ;установим указатель si на это значение и сначала проверим |
||
126 | |||
127 | ;получение длинны секции |
||
128 | ; cx=bx содержит длинну остатка секции |
||
129 | ; di=ax указатель на текущию секцию |
||
2434 | Serge | 130 | mov bx, cx |
131 | mov dx, di |
||
1065 | Lrz | 132 | |
2434 | Serge | 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 |
||
1065 | Lrz | 145 | .found_size_d_sect: |
146 | ; |
||
2434 | Serge | 147 | inc cx ;correct cx |
148 | mov ax, bx |
||
149 | sub bx, cx ; в bx длина секции которая определена по дефолту |
||
150 | mov save_cx_d, bx |
||
151 | mov di, dx |
||
1065 | Lrz | 152 | |
2434 | Serge | 153 | mov cx, bx ;set size default section |
1065 | Lrz | 154 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;проверка на =loader |
155 | ;save in reg point and счетчик |
||
156 | ;check on loader |
||
2434 | Serge | 157 | mov bx, ax |
158 | mov ax, dx |
||
1065 | Lrz | 159 | |
2434 | Serge | 160 | mov si, parse_loader |
161 | inc si ;set only loader and 6 char in counter |
||
162 | repe cmpsb |
||
1065 | Lrz | 163 | jnz .check_section ;цепочка не совпала :( перейдем далее )) значит не исключение |
164 | |||
2434 | Serge | 165 | jmp error.default_eq_loader ;error критическая ошибка т.е. в дефолте присутствует имя [loader] |
1065 | Lrz | 166 | |
2434 | Serge | 167 | .check_section: ;поиск соответствующей секции нам нужно будет узнать адрес этой секции |
168 | mov cx, bx |
||
169 | mov di, ax |
||
1065 | Lrz | 170 | |
171 | ;///////////////////////////// |
||
2434 | Serge | 172 | ; mov ret_on_ch,.start_d ;set return |
173 | mov si, di ;установим указатель на нашу секцию, которая по дефолту |
||
1065 | Lrz | 174 | |
2434 | Serge | 175 | push di ;save point di |
1065 | Lrz | 176 | |
2434 | Serge | 177 | push cx ;save cx |
1065 | Lrz | 178 | ;установим указатель es:di на начало ini файла |
2434 | Serge | 179 | mov cx, save_cx ;it's placed size of ini file |
180 | les di, dword [file_data] |
||
1065 | Lrz | 181 | |
182 | |||
2434 | Serge | 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 |
||
1065 | Lrz | 188 | .first_sp_1_d: |
2434 | Serge | 189 | jmp get_firs_sym.first_sp |
1065 | Lrz | 190 | |
191 | .start_d: |
||
2434 | Serge | 192 | call get_firs_sym ;get first symbol on new line |
1065 | Lrz | 193 | .first_ret_d: ;первый возврат |
2434 | Serge | 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 |
||
1065 | Lrz | 198 | ;просматриваем ini файл с начала в поисках секции указаной как default |
2434 | Serge | 199 | ;идет проверка на наличее значения timeout, для более быстрой работы, этот параметр должен быть уже обработан,т.е. в этом случае при его =0 будет сформирован указатель только на дефолтную секцию, иначе информация будет собрана по всем секциям и составлены указатели в блоке памяти |
1065 | Lrz | 200 | .found_sect_d: |
201 | |||
202 | ;check on name section |
||
2434 | Serge | 203 | mov bx, cx |
204 | mov ax, di |
||
205 | push si ;save point |
||
206 | |||
1065 | Lrz | 207 | ; mov si,parse_loader |
2434 | Serge | 208 | mov cx, save_cx_d;load size section |
209 | push es |
||
210 | pop ds |
||
1065 | Lrz | 211 | |
2434 | Serge | 212 | inc di |
213 | repe cmpsb |
||
214 | push cs |
||
215 | pop ds |
||
216 | pop si |
||
1065 | Lrz | 217 | |
218 | jnz .not_compare_d_s ;цепочка не совпала :( перейдем далее )) значит не исключение |
||
2434 | Serge | 219 | cmp byte[es:di], ']' |
220 | jnz .not_compare_d_s ;нет в конце нашей секции завершающего символа :( |
||
1065 | Lrz | 221 | |
222 | |||
223 | |||
224 | ;set flag -we have found default -not enter again in this prosedure |
||
2434 | Serge | 225 | or status_flag, flag_found_default |
226 | pop cx |
||
227 | pop di |
||
228 | mov point_default, ax ;point to [ |
||
1065 | Lrz | 229 | |
230 | if DEBUG |
||
231 | pusha |
||
2434 | Serge | 232 | mov si, lm_lf_default_f |
1065 | Lrz | 233 | call printplain |
234 | popa |
||
235 | end if |
||
2434 | Serge | 236 | |
237 | jmp .get_next_str |
||
1065 | Lrz | 238 | |
239 | .not_compare_d_s: |
||
240 | |||
2434 | Serge | 241 | mov cx, bx |
242 | mov di, ax |
||
243 | jmp .start_d |
||
1065 | Lrz | 244 | |
245 | .correct_exit: |
||
2434 | Serge | 246 | pop cx ;восстановим значение счетчика |
247 | pop di |
||
1065 | Lrz | 248 | |
249 | |||
250 | if DEBUG |
||
251 | pusha |
||
2434 | Serge | 252 | mov si, lm_lf_default |
1065 | Lrz | 253 | call printplain |
254 | popa |
||
255 | end if |
||
2434 | Serge | 256 | jmp .get_next_str |
1065 | Lrz | 257 | |
258 | ;//////////[loader].timeout |
||
259 | .loader_timeout: |
||
2434 | Serge | 260 | mov bx, cx |
261 | mov ax, di |
||
1065 | Lrz | 262 | |
2434 | Serge | 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 |
||
1065 | Lrz | 267 | |
2434 | Serge | 268 | sub bx, parse_l_timeout_e - parse_l_timeout;correct cx |
269 | add bx, cx |
||
270 | mov cx, bx |
||
1065 | Lrz | 271 | |
2434 | Serge | 272 | test status_flag, flag_found_timeout |
273 | jz .correct_is_not_set_t |
||
1065 | Lrz | 274 | |
2434 | Serge | 275 | mov si, found_equal_timeout ;мы нашли что флаг уже установлен, информируем |
276 | call printplain |
||
277 | jmp .get_next_str |
||
1065 | Lrz | 278 | |
279 | .correct_is_not_set_t: |
||
2434 | Serge | 280 | mov ax, 0x3d20 ;cut al=' ' ah='=' |
281 | repe scasb |
||
282 | jcxz .timeout_sec_end_d ;not found param timeout |
||
1065 | Lrz | 283 | |
2434 | Serge | 284 | cmp ah, byte [es:di-1] ;find '=' |
285 | jnz .get_next_str |
||
286 | |||
287 | repe scasb ;cut ' ' |
||
288 | inc cx |
||
289 | dec di |
||
1065 | Lrz | 290 | ;get timeout value |
291 | ;2 знакa может быть обработано т.е. значение от 0 до 99 секунд |
||
2434 | Serge | 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 |
||
1065 | Lrz | 304 | .end_get_val_t: |
2434 | Serge | 305 | inc di |
306 | loop @b |
||
307 | mov word [value_timeout], bx |
||
308 | ; pop cx |
||
1065 | Lrz | 309 | |
310 | if DEBUG |
||
311 | pusha |
||
2434 | Serge | 312 | mov si, lm_lf_timeout |
1065 | Lrz | 313 | call printplain |
314 | popa |
||
315 | end if |
||
316 | |||
2434 | Serge | 317 | jmp @f |
1065 | Lrz | 318 | .timeout_sec_end_d: |
2434 | Serge | 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 |
||
1065 | Lrz | 325 | |
326 | ;///////here end block loader |
||
327 | .end_loader: |
||
328 | if DEBUG |
||
329 | pusha |
||
2434 | Serge | 330 | mov si, lm_l_end |
1065 | Lrz | 331 | call printplain |
332 | popa |
||
333 | end if |
||
334 | |||
2434 | Serge | 335 | } |