Subversion Repositories Kolibri OS

Rev

Rev 1065 | Rev 2288 | 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  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 aka  ''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
 
27
; тут описываются процедуры которые используются в secondary loader
28
color_sym_black	equ	0
29
color_sym_blue	equ	1
30
color_sym_green equ	2
31
color_sym_turquoise equ 3
32
color_sym_red	equ	4
33
 
34
color_sym_lightgray equ 7
35
 
36
color_sym_lightblue equ	9
37
color_sym_lettuce   equ 10
38
color_sym_pink	equ	12
39
color_sym_yellow equ	14
40
color_sym_white	equ	15
41
if DEBUG
42
decode:
43
;input eax - число, es:di куда писать, cx=10
44
        cmp     eax,ecx
45
        jb      @f
46
        xor     edx,edx
47
        div     ecx
48
        push    edx
49
        call    decode
50
        pop     eax
51
    @@: or      al,0x30
52
        mov     [ds:di],al
53
        inc     di
54
        ret
55
 
56
end if
57
 
58
 
59
putchar:
60
; in: al=character
61
        mov     ah, 0Eh
62
        mov     bh, 0
63
        int     10h
64
        ret
65
 
66
printplain:
67
; in: si->string
1231 Lrz 68
        pushad
1065 Lrz 69
        lodsb
70
@@:
71
        call    putchar
72
        lodsb
1231 Lrz 73
        test    al,al
1065 Lrz 74
        jnz     @b
75
        mov     al,13
76
        call    putchar
77
 
78
        mov     al,10
79
        call    putchar
1231 Lrz 80
        popad
1065 Lrz 81
        ret
82
getkey:
83
; get number in range [bl,bh] (bl,bh in ['0'..'9'])
84
; in: bx=range
85
; out: ax=digit (1..9, 10 for 0)
86
        mov     ah, 0
87
        int     16h
88
        cmp     al, bl
89
        jb      getkey
90
        cmp     al, bh
91
        ja      getkey
92
        push    ax
93
        call    putchar
94
        pop     ax
95
        and     ax, 0Fh
96
        jnz     @f
97
        mov     al, 10
98
@@:
99
        ret
100
 
101
;setcursor:
102
; in: dl=column, dh=row
103
;        mov     ah, 2
104
;        mov     bh, 0
105
;        int     10h
106
;        ret
107
 
108
;macro _setcursor row,column
109
;{
110
;        mov     dx, row*256 + column
111
;        call    setcursor
112
;}
113
 
114
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
115
;
116
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117
get_firs_sym:
118
.start:
119
	mov	al,byte [es:di]
120
	inc	di
121
	dec	cx
122
	jcxz	.exit
123
 
124
	cmp	al,0xa		;cmp al,0xa
125
	jz      ._entry
126
 
127
        cmp	al,';'
128
	jnz     .start
129
 
130
.first_com:
131
 
132
	mov	al,0xa
133
        repnz   scasb
134
        jcxz    .exit
135
._entry:
136
	mov	al,byte [es:di]
137
.first_sp:
138
	cmp	al,' '
139
	jnz     .not_space
140
 
141
;	mov	al,' '		;cut ' '
142
	repe    scasb
143
	dec	di
144
	inc	cx
145
	mov	al,byte [es:di]
146
.not_space:
147
        cmp	al,';'
148
	jz	.first_com
149
.exit:	ret
150
;;;;;;;;;;;;;;;;;;;;;;;;;;;
151
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
152
show_name_section:
153
	push	si
154
       	push	ini_data_
155
	pop	es
156
 
157
 
158
	mov	al,']'
159
	repnz   scasb
160
	test	cx,cx
161
	jz      error.incorect_section_def
162
.find_val_name_fb1:
163
	mov	al,'n'
164
.find_val_name_fb:
165
	repnz	scasb
166
	jcxz	.not_name_sec_fb
167
 
168
	mov	si,parse_name
169
 
170
	push	cx
171
	push	di
172
 
173
	mov	cx,parse_name_e -parse_name
174
	repe	cmpsb
175
	pop	di
176
	pop	cx
177
	jz	.yaaa_find_value
178
 
179
 
180
	jmp	.find_val_name_fb
181
 
182
.yaaa_find_value:
183
        sub	cx,parse_name_e -parse_name
184
	add	di,parse_name_e -parse_name
185
 
186
	mov	ax,0x3d20	   ; ah='='
187
	repe    scasb
188
	test	cx,cx
189
	jz	.not_name_sec_fb
190
 
191
        cmp	ah,byte [es:di-1]    ;find '='
192
	jnz	.find_val_name_fb1
193
 
194
	repe    scasb              ;cut ' '
195
	inc	cx
196
	dec	di
197
 
198
 
199
;все вырезали и все готово для вывода имени секции ))
200
	push	es
201
	pop	ds
202
 
203
.def_sect_name:
204
        push	0xb800
205
	pop	es
206
;clear array for message
207
	xor	ax,ax
208
if DEBUG
209
	mov	ax,0x0720
210
end if
211
 
212
	mov	cx,39
213
	mov	si,di
214
        mov 	di,dx
215
        sub	di,2
216
        rep	stosw
217
;//////////////////////
218
 
219
 
220
        mov	di,dx
221
	mov	ah,color_sym_white;color_sym_lightblue
222
	mov 	cx,36
223
	lodsb
224
	sub 	di,2
225
	cmp	al,'"'
226
	jz	@f
227
	cmp	al,"'"
228
       	jnz	.end_sh_name_sec
229
@@:	lodsb
230
@@:
231
	stosw
232
	lodsb
233
	cmp	al,'"'
234
	jz	.end_sh_name_sec
235
	cmp	al,"'"
236
      	jz	.end_sh_name_sec
237
	loop	@b
238
 
239
	mov	al,'}'
240
	mov	ah,color_sym_yellow
241
	stosw
242
.end_sh_name_sec:
243
	push	cs
244
	pop	ds
245
 
246
	pop	si
247
	ret
248
 
249
.not_name_sec_fb:    ;нет имени в названии секции - значит так и скажем об этом
250
	push	cs
251
	pop	ds
252
        mov	di,default_section_name
253
        jmp	.def_sect_name
254
 
255
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
256
;процедура поиска вверх следующей секции
257
;в point_default содержиться указатель на дефаулт секцию, и в пределах врейма мы бегаем по заранее пропарсеными значениям указателей
258
;для того что бы отобразить и пропарсить следующий фрейм, нам нужно получить за пердыдущий или следующий указатель
259
find_before_sect:
260
	mov	di,point_default
261
.e:
262
	push	ini_data_
263
	pop	es
264
	mov	cx,di	;предположим будем просматривать к началу, текущая позиция di = сколько символов от начала документа имеется
265
	mov	bx,cx	;копия
266
 
267
;настроили указатель на дефаулт секцию
268
;будем искать вверх
269
.find_start_section:
270
        std	;установка флага направления - будем просматирвать к началу нашего ини файла
271
;будем искать начало секции т.е. '[' этот символ
272
	mov	al,0xa
273
        repnz	scasb	;просканируем на наличее символа начала секции
274
	jcxz	.go_    ;мы просмотрели до начала файла, но так и ничего не нашли ;(( по тихому выйдем )
275
 
276
       	mov	find_sec_di,di	;сохраним данные
277
	mov	cx,di  ;
278
 
279
	sub	bx,cx
280
	mov	cx,bx	;в сx значение - кол-во символов
281
	cld
282
	call	get_firs_sym
283
.ret_go:
284
	jcxz	._not_section	; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее
285
 
286
        cmp	di,point_loader ; секцию loader мы не заносим иначе крах
287
	jz	._not_section
288
;все удачно мы нашли вхождение секции предыдущей
289
	cmp	al,'['
290
	jnz	._not_section
291
	mov	point_default,di
292
.exit_scan_sect:
293
	ret
294
;;;;;;;; восстановим значения и продолжим поиски начала секции которая нас устроит ))
295
._not_section:
296
	mov	di,find_sec_di
297
	mov	cx,di
298
	mov	bx,cx
299
	jmp	.find_start_section
300
.go_:
301
	cld
302
	mov	cx,bx	;в сx значение - кол-во символов
303
 
304
	mov	al,byte [es:di]
305
	push	word .f_go
306
	cmp	al,' '
307
	jz	@f
308
	jmp	get_firs_sym.not_space
309
@@:
310
        jmp	get_firs_sym.first_sp
311
 
312
.f_go:
313
	jcxz	.exit_scan_sect	; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее
314
 
315
        cmp	di,point_loader ; секцию loader мы не заносим иначе крах
316
	jz	.exit_scan_sect
317
;все удачно мы нашли вхождение секции предыдущей
318
	cmp	al,'['
319
	jnz	.exit_scan_sect
320
	mov	point_default,di
321
	ret
322
 
323
 
324
 
325
 
326
 
327
 
328
 
329
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
330
;
331
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
332
find_next_sect:
333
	mov	di,point_default
334
	push	ini_data_
335
	pop	es
336
	mov	cx,save_cx;di	;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется
337
	sub	cx,di	;сейчас в cx остаток т.е.  сколько можно крутить до конца и не вылазить на начало
338
	jmp	.let_s_go
339
.h:
340
	push	ini_data_
341
	pop	es
342
	mov	cx,save_cx;di	;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется
343
;	sub	cx,di	;сейчас в cx остаток т.е.  сколько можно крутить до конца и не вылазить на начало
344
 
345
	mov	al,byte [es:di]
346
	push	word .let_s_go_ret
347
	cmp	al,' '
348
	jz	@f
349
	jmp	get_firs_sym.not_space
350
@@:
351
        jmp	get_firs_sym.first_sp
352
 
353
 
354
 
355
 
356
;настроили указатель на дефаулт секцию
357
;будем искать вниз
358
.let_s_go:
359
	call	get_firs_sym
360
.let_s_go_ret:
361
	jcxz	.exit_scan_sect	; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее
362
	cmp	al,'['
363
	jnz	.let_s_go
364
	cmp	di,point_loader
365
	jz	.let_s_go
366
;все удачно мы нашли вхождение секции предыдущей
367
	mov	point_default,di
368
.exit_scan_sect:
369
	ret
370
 
371
;;;;;;;;;;;;;;;;;;;;;;;;;;
372
;clean old cursor
373
clean_active_cursor:
374
;не изменяет значение ax
375
;отображение курсора по умолчанию
376
	lea	si,point_to_hframe
377
	mov	di,962-160
378
	mov	dx,point_default
379
	mov	cx,18
380
.clean_show_cur:
381
        mov	bx,[si]
382
	add	di,160
383
	cmp	bx,dx
384
	jz	.clean_cursor_
385
       	sub	si,2
386
	loop    .clean_show_cur
387
 
388
;	jmp $
389
 
390
.clean_cursor_:
391
        push	0xb800
392
	pop	es
393
	push	ax
394
	mov	point_to_point_def,si
395
        xor	ax,ax
396
if DEBUG
397
	mov	ax,0x0720
398
end if
399
	stosw
400
	add	di,68
401
	stosw
402
	pop	ax
403
	ret
404
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
405
;установка таймера и отображение счетчика времени
406
gettime:
407
        mov     ah,0
408
        int     1Ah
409
        xchg    ax, cx
410
        shl     eax, 10h
411
        xchg    ax, dx
412
        ret
413
newtimer:
414
	push	ds
415
 
416
        push    cs
417
        pop     ds
418
 
419
        pushf
420
        call    far dword [old_timer]
421
 
422
        pushad
423
        call    gettime
424
 
425
        sub     eax, dword[start_timer]
426
	mov	bx, word [value_timeout]
427
	imul	bx,18
428
        sub     bx, ax
429
        jbe     .timergo
430
 
431
	push	es
432
 
433
        push	0xb800
434
	pop	es
435
	mov	ax,bx
436
 
437
        mov     bx, 18
438
        xor     dx, dx
439
        div     bx
440
 
441
        mov	bx,10
442
        mov	di,3734
443
	call	.decode
444
 
445
	xor	ax,ax
446
	stosw
447
 
448
; wait 5/4/3/2 seconds, 1 second
449
	pop	es
450
        popad
451
	pop	ds
452
 
453
        iret
454
.timergo:
455
        push    0
456
        pop     es
457
        mov     eax,dword [old_timer]
458
        mov     [es:8*4], eax
459
	mov	dword [timer_],eax
460
        mov	sp, word [start_stack]
461
	mov	bp,word [save_bp_from_timer]
462
;;не восстановленый стек :(
463
	sti
464
        jmp	parse_start.parse_run_only
465
 
466
 
467
.decode:
468
;input ax - число, es:di куда писать, bx=10
469
        cmp     ax,bx
470
        jb      @f
471
        xor     dx,dx
472
        div     bx
473
        push    dx
474
        call    .decode
475
        pop     ax
476
    @@: or      al,0x30
477
	push	ax
478
	mov	ah,9
479
        stosw
480
	pop	ax
481
        ret
482
 
483
show_bl_sc_sect:
484
;1) отображение списка секций. Если секция не имет имя - ошибка - вывод Section unname
485
;проверка на наличее имени.
486
;входные данные es:di -указатель на секцию - cx размер секции
487
;	push	bp
488
	mov	bx,point_to_eframe
489
	lea	si,point_to_hframe
490
	mov	dx,966
491
 
492
.home_show_fb:
493
	cmp	si,bx
494
	jb	._show_space_fb
495
	mov	di,[si]
496
	sub	si,2
497
	mov	cx,[si]
498
	sub	cx,di		;home first section it's end before section
499
        call	show_name_section
500
	add	dx,160
501
	jmp	.home_show_fb
502
._show_space_fb:
503
	sub	dx,4
504
        push	0xb800
505
	pop	es
506
@@:
507
        cmp	dx,0xE64
508
	ja	.exit_show_fb
509
	mov	di,dx
510
;clear array for message
511
	xor	ax,ax
512
if DEBUG
513
	mov	ax,0x0720
514
end if
515
	mov	cx,39
516
        rep	stosw
517
;//////////////////////
518
 
519
	add	dx,160
520
	jmp	@b
521
.exit_show_fb:
522
;        pop	bp
523
	ret
524