Rev 2288 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2288 | clevermous | 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 | ; |
||
15 | ; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname |
||
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 | |||
3539 | clevermous | 27 | ;блок макросов по обработке секции [loader] |
28 | ;входные данные: |
||
29 | ;es:di - указатель на секцию начинающиюся с '[' встечающиюся после 0хa |
||
30 | ;cx - счетчик кол-во байт для проверке в кадре |
||
2288 | clevermous | 31 | ; |
32 | macro use_parse_loader |
||
33 | { |
||
34 | .parse_loader: |
||
35 | ;////////////////// |
||
36 | ;/ parse [loader] |
||
37 | ;////////////////// |
||
3539 | clevermous | 38 | mov bx, cx ;cохраним в регистры значения счетчика и указателя |
2288 | clevermous | 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 |
||
3539 | clevermous | 45 | jnz error.rest_value ;цепочка не совпала :( перейдем далее т.е. будем снова искать)) |
2288 | clevermous | 46 | |
3539 | clevermous | 47 | ;сохраним указательна loader, что бы потом больше его не искать |
2288 | clevermous | 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 |
||
3539 | clevermous | 66 | jcxz .loader_f_end ;.end_loader ; end даже если мы не нашли секцию предположим что секция [loader] стоит в конце |
2288 | clevermous | 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 |
||
3539 | clevermous | 77 | mov cx, bx ;set counter for parsing section [loader] cx= кол-ву символов в секции [loader] |
2288 | clevermous | 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 |
||
3539 | clevermous | 85 | ; jcxz .end_loader ;завершение парсинга значений timeout & default |
2288 | clevermous | 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 | |||
3539 | clevermous | 99 | jnz error.rest_value ;is not compare цепочка не совпала |
2288 | clevermous | 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 | |||
3539 | clevermous | 108 | mov si, found_equal_default ;мы нашли что флаг уже установлен, информируем |
2288 | clevermous | 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 |
||
3539 | clevermous | 124 | ;сейчас es:di указывают на название секции, имя секции по дефолту не должно быть loader т.е. иначе возможно зацикливание |
125 | ;установим указатель si на это значение и сначала проверим |
||
2288 | clevermous | 126 | |
3539 | clevermous | 127 | ;получение длинны секции |
128 | ; cx=bx содержит длинну остатка секции |
||
129 | ; di=ax указатель на текущию секцию |
||
2288 | clevermous | 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 |
||
3539 | clevermous | 138 | jz error.error_get_size_d_sect ;переход на обработку ошибки по нахождению длины дефолтной секции |
2288 | clevermous | 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 |
||
3539 | clevermous | 149 | sub bx, cx ; в bx длина секции которая определена по дефолту |
2288 | clevermous | 150 | mov save_cx_d, bx |
151 | mov di, dx |
||
152 | |||
153 | mov cx, bx ;set size default section |
||
3539 | clevermous | 154 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;проверка на =loader |
155 | ;save in reg point and счетчик |
||
2288 | clevermous | 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 |
||
3539 | clevermous | 163 | jnz .check_section ;цепочка не совпала :( перейдем далее )) значит не исключение |
2288 | clevermous | 164 | |
3539 | clevermous | 165 | jmp error.default_eq_loader ;error критическая ошибка т.е. в дефолте присутствует имя [loader] |
2288 | clevermous | 166 | |
3539 | clevermous | 167 | .check_section: ;поиск соответствующей секции нам нужно будет узнать адрес этой секции |
2288 | clevermous | 168 | mov cx, bx |
169 | mov di, ax |
||
170 | |||
171 | ;///////////////////////////// |
||
172 | ; mov ret_on_ch,.start_d ;set return |
||
3539 | clevermous | 173 | mov si, di ;установим указатель на нашу секцию, которая по дефолту |
2288 | clevermous | 174 | |
175 | push di ;save point di |
||
176 | |||
177 | push cx ;save cx |
||
3539 | clevermous | 178 | ;установим указатель es:di на начало ini файла |
2288 | clevermous | 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 |
||
3539 | clevermous | 193 | .first_ret_d: ;первый возврат |
2288 | clevermous | 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 |
||
3539 | clevermous | 198 | ;просматриваем ini файл с начала в поисках секции указаной как default |
199 | ;идет проверка на наличее значения timeout, для более быстрой работы, этот параметр должен быть уже обработан,т.е. в этом случае при его =0 будет сформирован указатель только на дефолтную секцию, иначе информация будет собрана по всем секциям и составлены указатели в блоке памяти |
||
2288 | clevermous | 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 | |||
3539 | clevermous | 218 | jnz .not_compare_d_s ;цепочка не совпала :( перейдем далее )) значит не исключение |
2288 | clevermous | 219 | cmp byte[es:di], ']' |
3539 | clevermous | 220 | jnz .not_compare_d_s ;нет в конце нашей секции завершающего символа :( |
2288 | clevermous | 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: |
||
3539 | clevermous | 246 | pop cx ;восстановим значение счетчика |
2288 | clevermous | 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 | |||
3539 | clevermous | 275 | mov si, found_equal_timeout ;мы нашли что флаг уже установлен, информируем |
2288 | clevermous | 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 |
||
3539 | clevermous | 291 | ;2 знакa может быть обработано т.е. значение от 0 до 99 секунд |
2288 | clevermous | 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 | } |