Subversion Repositories Kolibri OS

Rev

Rev 1151 | 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  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
;
1151 Lrz 15
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname  ''AS IS'' AND ANY
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  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
@@:	mov	al,byte [es:di]
134
	inc	di
135
	dec 	cx
136
	test	cx,cx
137
	jz	error.error_get_size_d_sect  ;переход на обработку ошибки по нахождению длины дефолтной секции
138
	cmp	al,' '
139
	jz      @b
140
	cmp	al,0xd
141
	jz	.found_size_d_sect
142
	cmp	al,0xa
143
	jnz	@b
144
.found_size_d_sect:
145
;
146
	inc	cx	;correct cx
147
	mov	ax,bx
148
	sub	bx,cx	; в bx длина секции которая определена по дефолту
149
	mov	save_cx_d,bx
150
	mov	di,dx
151
 
152
	mov	cx,bx	;set size default section
153
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;проверка на =loader
154
;save in reg point and счетчик
155
;check on loader
156
        mov     bx,ax
157
        mov     ax,dx
158
 
159
        mov     si,parse_loader
160
	inc	si	;set only loader and 6 char in counter
161
        repe    cmpsb
162
        jnz     .check_section        ;цепочка не совпала :( перейдем далее )) значит не исключение
163
 
164
	jmp	error.default_eq_loader    ;error критическая ошибка т.е. в дефолте присутствует имя [loader]
165
 
166
.check_section:		;поиск соответствующей секции нам нужно будет узнать адрес этой секции
167
        mov	cx,bx
168
	mov	di,ax
169
 
170
;/////////////////////////////
171
;	mov	ret_on_ch,.start_d     ;set return
172
	mov	si,di   ;установим указатель на нашу секцию, которая по дефолту
173
 
174
	push	di      ;save point di
175
 
176
	push 	cx	;save cx
177
;установим указатель es:di на начало ini файла
178
	mov	cx,save_cx	;it's placed size of ini file
179
        les     di,dword [file_data]
180
 
181
 
182
	mov	al,byte [es:di]
183
	push	word .first_ret_d
184
	cmp	al,' '
185
	jz	.first_sp_1_d
186
	jmp	get_firs_sym.not_space
187
.first_sp_1_d:
188
        jmp	get_firs_sym.first_sp
189
 
190
.start_d:
191
	call	get_firs_sym	;get first symbol on new line
192
.first_ret_d:                     ;первый возврат
193
        jcxz	.correct_exit	;.end_loader     ;found or not found parametrs in section  exit in section
194
        cmp	al,'['
195
        jz	.found_sect_d
196
	jmp	.start_d
197
;просматриваем ini файл с начала в поисках секции указаной как default
198
;идет проверка на наличее значения timeout, для более быстрой работы, этот параметр должен быть уже обработан,т.е. в этом случае при его =0 будет сформирован указатель только на дефолтную секцию, иначе информация будет собрана по всем секциям и составлены указатели в блоке памяти
199
.found_sect_d:
200
 
201
;check on name section
202
        mov     bx,cx
203
        mov     ax,di
204
	push	si	;save point
205
 
206
;        mov     si,parse_loader
207
        mov     cx,save_cx_d ;load size section
208
	push	es
209
	pop	ds
210
 
211
	inc	di
212
        repe    cmpsb
213
        push	cs
214
	pop	ds
215
	pop	si
216
 
217
        jnz     .not_compare_d_s        ;цепочка не совпала :( перейдем далее )) значит не исключение
218
	cmp	byte[es:di],']'
219
	jnz	.not_compare_d_s	;нет в конце нашей секции завершающего символа :(
220
 
221
 
222
 
223
;set flag -we have found default -not enter again in this prosedure
224
	or	status_flag,flag_found_default
225
	pop	cx
226
	pop	di
227
	mov	point_default,ax	;point to [
228
 
229
if DEBUG
230
        pusha
231
        mov     si,lm_lf_default_f
232
        call    printplain
233
        popa
234
end if
235
 
236
	jmp	.get_next_str
237
 
238
.not_compare_d_s:
239
 
240
        mov     cx,bx
241
        mov     di,ax
242
	jmp	.start_d
243
 
244
.correct_exit:
245
        pop	cx ;восстановим значение счетчика
246
        pop	di
247
 
248
 
249
if DEBUG
250
        pusha
251
        mov     si,lm_lf_default
252
        call    printplain
253
        popa
254
end if
255
	jmp	.get_next_str
256
 
257
;//////////[loader].timeout
258
.loader_timeout:
259
        mov     bx,cx
260
        mov     ax,di
261
 
262
        mov     si,parse_l_timeout
263
        mov     cx,parse_l_timeout_e - parse_l_timeout
264
        repe    cmpsb
265
	jnz	error.rest_value	   ;is not compare
266
 
267
        sub     bx,parse_l_timeout_e - parse_l_timeout ;correct cx
268
        add     bx,cx
269
        mov     cx,bx
270
 
271
	test	status_flag,flag_found_timeout
272
	jz	.correct_is_not_set_t
273
 
274
	mov	si,found_equal_timeout                          ;мы нашли что флаг уже установлен, информируем
275
	call	printplain
276
	jmp	.get_next_str
277
 
278
.correct_is_not_set_t:
279
	mov	ax,0x3d20	   ;cut al=' ' ah='='
280
	repe    scasb
281
	jcxz	.timeout_sec_end_d          ;not found param timeout
282
 
283
        cmp	ah,byte [es:di-1]    ;find '='
284
	jnz	.get_next_str
285
 
286
	repe    scasb              ;cut ' '
287
	inc	cx
288
	dec	di
289
;get timeout value
290
;2 знакa может быть обработано т.е. значение от 0 до 99 секунд
291
	push	cx
292
	xor	bx,bx
293
        mov	cx,2
294
@@:	mov	al,byte [es:di]
295
        cmp	al,'0'
296
	jb	.end_get_val_t
297
	cmp	al,'9'
298
	ja	.end_get_val_t
299
	imul	bx,10
300
	xor 	al,0x30
301
        add	bl,al
302
.end_get_val_t:
303
	inc	di
304
        loop	@b
305
	mov	word [value_timeout],bx
306
;	pop 	cx
307
 
308
if DEBUG
309
        pusha
310
        mov     si,lm_lf_timeout
311
        call    printplain
312
        popa
313
end if
314
 
315
	jmp	@f
316
.timeout_sec_end_d:
317
	mov	word [value_timeout],default_timeout_value
318
	mov	si,set_default_timeout_val
319
	call	printplain
320
@@:	pop	cx
321
	jmp	.get_next_str
322
 
323
;///////here end block loader
324
.end_loader:
325
if DEBUG
326
        pusha
327
        mov     si,lm_l_end
328
        call    printplain
329
        popa
330
end if
331
 
332
}