Subversion Repositories Kolibri OS

Rev

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  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  ''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  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
 
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
}