Subversion Repositories Kolibri OS

Rev

Rev 3539 | 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 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
 
3539 clevermous 27
;тут распологается модуль с помощью которого будут парситься все остальные секции
2288 clevermous 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
 
41
macro use_any_sec
42
{
3539 clevermous 43
;узнаем работу предыдущего шага т.е. чему = timeout, если он 0, то визуальная часть не будет отображена на дисплее с выбором загрузочных секций.
44
;иначе мы ее должны отобразить и ждать заявленое время для выбора и конигурирования пукнктов секции от пользователя.
2288 clevermous 45
 
46
if DEBUG
47
        pusha
3539 clevermous 48
        mov     ax, word [value_timeout];идет проверка на наличее значения timeout, для более быстрой работы, этот параметр должен быть уже обработан,т.е. в этом случае при его =0 будет сформирован указатель только на дефолтную секцию, иначе информация будет собрана по всем секциям и составлены указатели в блоке памяти
2288 clevermous 49
;        mov     ax,cx
50
        mov     cx, 0x0a
51
        mov     di, show_db1
52
        mov     dword[ds:di], '    '
53
        mov     word [ds:di+4], '  '
54
        call    decode
55
;Show size
56
        mov     si, show_db1
57
        call    printplain
58
;
59
        popa
60
end if
61
 
62
        test    ax, ax
63
        jz      .parse_run_only
64
 
3539 clevermous 65
;отобразим полный список всех найденых секций.
2288 clevermous 66
if DEBUG
67
        pusha
68
        mov     si, show_all_sect
69
        call    printplain
70
        popa
71
end if
72
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3539 clevermous 73
        mov     al, 0xf6        ; Сброс клавиатуры, разрешить сканирование
2288 clevermous 74
        out     0x60, al
75
        xor     cx, cx
76
.wait_loop:       ; variant 2
77
; reading state of port of 8042 controller
78
        in      al, 64h
79
        and     al, 00000010b  ; ready flag
80
; wait until 8042 controller is ready
81
        loopnz  .wait_loop
82
 
83
 
84
; set keyboard typematic rate & delay
85
        mov     al, 0xf3
86
        out     0x60, al
87
        xor     cx, cx
88
@@:
89
        in      al, 64h
90
        test    al, 2
91
        loopnz  @b
92
        mov     al, 0
93
        out     0x60, al
94
        xor     cx, cx
95
@@:
96
        in      al, 64h
97
        test    al, 2
98
        loopnz  @b
99
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
100
; get start time
101
        call    gettime
102
        mov     dword [start_timer], eax
103
        mov     word [timer_], newtimer
104
        mov     word [timer_+2], cs
3539 clevermous 105
;установить свое прерывание на таймер т.е. код будет перрываться ~18 раз в сек и переходить на обработчик
2288 clevermous 106
        cli
107
        push    0
108
        pop     es
109
        push    dword [es:8*4]
110
        pop     dword [old_timer]
111
        push    dword [timer_]
112
        pop     dword [es:8*4]
113
        sti
114
 
3539 clevermous 115
;процедура формирования буфера для скролинга секций
2288 clevermous 116
;if DEBUG
117
;        pusha
118
;       mov     ax,point_default
119
;        mov     ax,cx
120
;        mov     cx,0x0a
121
;        mov     di,show_db1
122
;        mov     dword[ds:di],'    '
123
;       mov     word [ds:di+4],'  '
124
;        call    decode
125
;Show size
126
;        mov     si,show_db1
127
;        call    printplain
128
;
129
;       xor     ax,ax
130
;       int     0x16
131
;        popa
132
;end if
3539 clevermous 133
;;;;;;;;;;;;;размер предыдущей сеции установим =0
2288 clevermous 134
        mov     save_descript_size, 18
3539 clevermous 135
;отобразить black screen
2288 clevermous 136
show_bl_sc      ;es=0xb800
137
.show_all_scr:
138
get_frame_buffer  ;es=0x2000
3539 clevermous 139
;отображение секций
2288 clevermous 140
        call    show_bl_sc_sect   ;es=0xb800
3539 clevermous 141
;отобразить активный курсор
2288 clevermous 142
.show_active_cursor:
143
show_act_cursor
3539 clevermous 144
show_descript   ;макрос по отображению описания секции
2288 clevermous 145
 
3539 clevermous 146
;отобразить Press any key ....
2288 clevermous 147
        mov     eax, dword [old_timer]
148
        cmp     eax, dword [timer_]
149
        jz      .interrupt_16
150
 
151
show_timer_message
152
        mov     word [start_stack], sp
153
.interrupt_16:
3539 clevermous 154
        xor     ax, ax  ;получим информацию о том что нажато
2288 clevermous 155
        int     0x16
156
;check on change
157
        mov     ebx, dword [old_timer]
158
        cmp     ebx, dword [timer_]
159
        jz      @f
160
;restore timer interrupt
161
        cli
162
        push    0
163
        pop     es
3539 clevermous 164
;        mov     eax,dword [old_timer]  ; восстановим прежднее прерывание
2288 clevermous 165
        mov     [es:8*4], ebx
166
        mov     dword [timer_], ebx
167
        sti
168
 
169
        push    ax
170
clear_timer_msg
171
        pop     ax
172
@@:
173
        call    clean_active_cursor   ;clean old cursor   ;es=0xb800
174
 
3539 clevermous 175
        cmp     ah, 0x48 ;реакция системы на события
2288 clevermous 176
        jz      .up
177
        cmp     ah, 0x50
178
        jz      .down
179
        cmp     ah, 0x49
180
        jz      .pgup
181
        cmp     ah, 0x51
182
        jz      .pgdown
183
        cmp     ah, 0x47
184
        jz      .home
185
        cmp     ah, 0x4f
186
        jz      .end
187
 
188
        cmp     al, 0xD
189
        jnz     .show_active_cursor
190
 
3539 clevermous 191
        jmp     .end_show_all           ;парсинг секции которая указана в point_default
2288 clevermous 192
.up:
3539 clevermous 193
        mov     si, point_to_point_def  ;значение указателя
2288 clevermous 194
        add     si, 2
195
        lea     ax, point_to_hframe
196
 
197
        cmp     si, ax
198
        ja      @f
199
 
200
        mov     point_to_point_def, si
201
        mov     ax, [si]
202
        mov     point_default, ax
203
        jmp     .show_active_cursor
204
@@:
205
        call    find_before_sect
206
        jmp     .show_all_scr
207
 
208
 
209
 
210
.down:
3539 clevermous 211
        mov     si, point_to_point_def  ;значение указателя
212
        mov     ax, point_to_eframe     ;указатель на последний элемент
2288 clevermous 213
        sub     si, 2
214
        cmp     si, ax
215
        jb      @f
216
 
217
        mov     point_to_point_def, si
218
        mov     ax, [si]
219
        mov     point_default, ax
220
        jmp     .show_active_cursor
221
 
222
@@:
223
        call    find_next_sect
224
        jmp     .show_all_scr
225
 
226
.pgup:
227
        mov     cx, size_show_section
228
@@:
229
        push    cx
230
        call    find_before_sect
231
        pop     cx
232
        loop    @b
233
        jmp     .show_all_scr
234
 
235
 
236
.pgdown:
237
        mov     cx, size_show_section
238
@@:
239
        push    cx
240
        call    find_next_sect
241
        pop     cx
242
        loop    @b
243
        jmp     .show_all_scr
244
 
245
.home:
246
        xor     di, di
247
        call    find_next_sect.h
248
        jmp     .show_all_scr
249
 
250
.end:
251
        mov     di, save_cx
252
        call    find_before_sect.e
253
        jmp     .show_all_scr
254
 
255
 
256
 
257
 
3539 clevermous 258
; тут мы будем парсить только дефолтную секцию и выполнять ее ничего не предлагая пользователю из диалогов.
2288 clevermous 259
.parse_run_only:
260
if DEBUG
261
        pusha
262
        mov     si, no_show_only_w
263
        call    printplain
264
        popa
265
end if
266
 
267
 
268
.end_show_all:
269
}
270
 
271
 
272
 
273
 
274
 
275
 
276
 
277
 
278
 
279
 
280
 
281
 
282
 
283
 
284
 
285
;show black screen SL
286
macro show_bl_sc
287
{
288
;;;;;;;;;;;;;;;
3539 clevermous 289
;очистим экран и выведем меню
2288 clevermous 290
; draw frames
291
        xor     ax, ax
292
if DEBUG
293
        mov     ax, 0x0720
294
end if
295
        push    0xb800
296
        pop     es
297
        xor     di, di
298
; draw top
299
        mov     cx, 25 * 80
300
        rep stosw
301
;;;;;;;;;;;;;;;;;;;;;;; show 'Secondary Loader v0.xxx'
302
        mov     di, 164
303
        mov     si, version
304
        mov     cx, version_end-version
305
        mov     ah, color_sym_yellow
306
@@:
307
        lodsb
308
        stosw
309
        loop    @b
310
;;;;;;;;;;;;;;;;;;;;;;; show firm ))
311
        mov     di, (2*160-(2*(soft_mes_end-soft_mes+4)))       ;286
312
        mov     ah, color_sym_pink;color_sym_red
313
        mov     al, 'K'
314
        stosw
315
        mov     al, ' '
316
        stosw
317
        mov     ah, color_sym_lightgray;color_sym_lightblue;color_sym_pink
318
        mov     si, soft_mes
319
        mov     cx, soft_mes_end- soft_mes
320
@@:
321
        lodsb
322
        stosw
323
        loop    @b
324
;;;;;;;;;;;;;;;;;;;;;;; show '__________________________'
325
        mov     di, 480
326
        mov     ah, color_sym_yellow
3544 clevermous 327
        mov     al, 0xC4 ; '─'
2288 clevermous 328
        mov     cx, 61
329
        rep stosw
330
;;;;;;;;;;;;;;;;;;;;;;; show 'Select section'
331
        mov     di, 804
332
        mov     si, select_section
333
        mov     cx, select_section_end - select_section
334
        mov     ah, color_sym_lightgray
335
@@:
336
        lodsb
337
        stosw
338
        loop    @b
339
;;;;;;;;;;;;;;;;;;;;;;; show 'Section description'
340
        mov     di, 880
341
        mov     si, section_description
342
        mov     cx, section_description_end - section_description
343
;       mov     ah,color_sym_lightgray
344
@@:
345
        lodsb
346
        stosw
347
        loop    @b
348
 
349
}
350
 
351
macro show_timer_message
352
{
353
;;;;;;;;;;;;;;;;;;;;; show Press any key
354
;;;;;;;;;;;;;;;;;;;;; show ramk
355
 
356
        xor     ax, ax
357
        mov     di, 3360
358
        mov     cx, 80*4
359
        rep stosw
360
 
361
        mov     di, 3362
362
        mov     ah, color_sym_pink
363
        mov     al, 0xDA
364
        stosw
365
        mov     al, 0xc4
366
        mov     cx, 76
367
        rep stosw
368
        mov     al, 0xBF
369
        stosw
370
        add     di, 4
371
        mov     al, 0xb3
372
        stosw
373
        add     di, 152
374
        stosw
375
        add     di, 4
376
        stosw
377
        add     di, 152
378
        stosw
379
        add     di, 4
380
        mov     al, 0xc0
381
        stosw
382
        mov     al, 0xc4
383
        mov     cx, 76
384
        rep stosw
385
        mov     al, 0xd9
386
        stosw
387
;;;;;;;;;;;;;;;;;;;;;;;;ramk is complete show
388
;show first message
389
        mov     si, start_msg
390
        mov     cx, start_msg_e-start_msg
391
        mov     di, 3526
392
@@:
393
        lodsb
394
        stosw
395
        loop    @b
396
;;;;;;;;;;;;;;;;;;;; show press Enter to....
397
        add     di, 44
398
        mov     si, time_msg
399
        mov     cx, time_msg_e-time_msg
400
@@:
401
        lodsb
402
        stosw
403
        loop    @b
404
}
405
 
406
 
407
 
408
 
409
 
410
 
411
 
412
 
413
macro get_frame_buffer
414
{
415
        mov     cx, save_cx     ;it's placed size of ini file
416
        les     di, dword [file_data]
417
 
418
        mov     si, di  ;point frame
419
        mov     bx, cx
420
        mov     dx, size_show_section
3539 clevermous 421
;       mov     point_to_hframe,di      ; внесем значение, так подстраховка не более
2288 clevermous 422
 
423
        mov     al, byte [es:di]
424
        push    word .first_ret_bl_sc
425
        cmp     al, ' '
426
        jz      .first_bl_sc
427
        jmp     get_firs_sym.not_space
428
.first_bl_sc:
429
        jmp     get_firs_sym.first_sp
430
 
431
.start_hbl:
432
        call    get_firs_sym    ;get first symbol on new line
433
        test    cx, cx
434
        jz      error.correct_exit_bl   ;critical error not found default point it's not possible because it's param chacking before
435
        cmp     al, '['
436
        jnz     .start_hbl
437
 
438
        mov     si, di   ;point frame
439
        mov     bx, cx
440
        mov     dx, size_show_section
441
        jmp     .analisist_al
442
 
443
 
444
.start_bl:
445
        call    get_firs_sym    ;get first symbol on new line
3539 clevermous 446
.first_ret_bl_sc:                     ;первый возврат
2288 clevermous 447
        test    cx, cx
448
        jz      error.correct_exit_bl   ;critical error not found default point it's not possible because it's param chacking before
449
.analisist_al:
450
        cmp     al, '['
451
        jnz     .start_bl
3539 clevermous 452
;просматриваем ini файл с начала в поисках секции указаной как default
453
;поиск фрейма в котором содержиться значение default
2288 clevermous 454
.found_sect_bl:
455
        cmp     di, point_loader
456
        jz      .start_bl
457
        cmp     di, point_default
458
        jz      .save_point_def
459
 
460
        dec     dx
461
        jnz     .start_bl
462
 
463
        jmp     .start_hbl
464
 
465
 
466
.save_point_def:
3539 clevermous 467
;итак далее мы должны заполнить frame буфер адресов секций, что бы потом по нему быстро перемещаться не вычисляя снова адреса
468
        mov     di, si  ;указатель на начало
2288 clevermous 469
        mov     cx, bx
470
        lea     si, point_to_hframe
3539 clevermous 471
        mov     dx, size_show_section+1  ;т.к. у нас структура содержит размер между первым и вторым указателем, то нам нужно на 1 адрес больше обсчитать секций.
472
;переходим на обработку значения указателя
2288 clevermous 473
        mov     al, byte [es:di]
474
        push    word .first_ret_mfb
475
        cmp     al, ' '
476
        jz      .first_bl_mbf
477
        jmp     get_firs_sym.not_space
478
.first_bl_mbf:
479
        jmp     get_firs_sym.first_sp
480
 
481
.start_mfb:
482
        call    get_firs_sym    ;get first symbol on new line
3539 clevermous 483
.first_ret_mfb:                     ;первый возврат
2288 clevermous 484
        jcxz    .val_buff_comp  ;.end_loader     ;found or not found parametrs in section  exit in section
485
        cmp     al, '['
486
        jnz     .start_mfb
487
 
488
.found_sect_mfb:
489
        cmp     di, point_loader    ;if we have section loader
490
        jz      .start_mfb
491
 
492
        mov     [si], di
493
 
494
        sub     si, 2
495
        dec     dx
496
        jnz     .start_mfb
497
;bufer is full
498
        jmp     @f
499
.val_buff_comp:
500
        push    save_cx
501
        pop     word [si]
502
        sub     si, 2
503
@@:
504
 
505
        add     si, 4
506
        mov     point_to_eframe, si
507
 
508
}
509
 
510
macro show_act_cursor
511
{
3539 clevermous 512
;отображение курсора по умолчанию
2288 clevermous 513
        lea     si, point_to_hframe
514
        mov     di, 962-160
515
        mov     ax, point_default
516
        mov     cx, size_show_section
517
.home_show_cur:
518
        mov     bx, [si]
519
        add     di, 160
520
        cmp     bx, ax
521
        jz      .show_cursor_activ
522
        sub     si, 2
523
        loop    .home_show_cur
524
 
525
.show_cursor_activ:
526
;        push   0xb800
527
;       pop     es
528
        mov     point_to_point_def, si
529
        mov     ax, (color_sym_red*0x100+0x10)
530
        stosw
531
        add     di, 68
532
        inc     ax
533
        stosw
534
}
535
 
536
macro clear_timer_msg
537
{
538
        push    0xb800
539
        pop     es
540
        xor     ax, ax
541
if DEBUG
542
        mov     ax, 0x0720
543
end if
544
;;;;;;;;;;;;;;;;;;;;; show Press any key
545
        mov     di, 3360
546
        mov     cx, 80*4
547
        rep stosw
548
 
549
;show sect
550
        push    ini_data_
551
        pop     es
552
        call    show_bl_sc_sect ;es=0xb800
553
 
554
}
555
 
556
macro show_descript
3539 clevermous 557
;Этот макрос показывает краткое описание, если оно есть у секции в пункте
2288 clevermous 558
;Section description
559
{
560
local .start_p_sh_d
561
local .exit
562
local .rest_value_loop_sh_d
563
local .end_sh_desc_sec
564
local .loop_message
565
local .show_mess_prev_eq
566
        mov     di, point_default
567
        push    ini_data_
568
        mov     si, point_to_point_def
569
        pop     es
570
        sub     si, 2
3539 clevermous 571
        mov     cx, [si]        ;загрузим указатель наследующию секцию
572
        sub     cx, di          ;вот теперь имеем истиный размер
573
;di - указатель на дефолтную секцию т.е. выбранную cx - размер области. для просмотра
2288 clevermous 574
 
575
.start_p_sh_d:
576
        call    get_firs_sym    ;get first symbol on new line
577
        test    cx, cx
3539 clevermous 578
        jz      .exit   ;нету? ну ладно - следующее значение тогда )
2288 clevermous 579
        cmp     al, 'd'
580
        jnz     .start_p_sh_d
581
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
582
 
583
        mov     bx, cx
584
        mov     ax, di
585
 
586
        mov     si, parse_descript
587
        mov     cx, parse_descript_e - parse_descript
588
        repe cmpsb
589
        jnz     .rest_value_loop_sh_d      ;is not compare
590
 
591
        sub     bx, parse_descript_e - parse_descript;correct cx
592
        add     bx, cx
593
        mov     cx, bx
3539 clevermous 594
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; разбор аля ' = '
2288 clevermous 595
        mov     ax, 0x3d20         ;cut al=' ' ah='='
596
        repe scasb
597
        jcxz    .rest_value_loop_sh_d          ;not found param timeout
598
 
599
        cmp     ah, byte [es:di-1]   ;find '='
600
        jnz     .rest_value_loop_sh_d
601
 
602
        repe scasb                 ;cut ' '
603
        inc     cx
604
        dec     di
3539 clevermous 605
;;;;;;;;;;;;;;;;;;;;di указывает на строчку, которую нам нужно выводить.
606
;строчка будет выводиться блоками по 37 символов.
607
;настроим куда будем выводить т.е. начало
608
;es:di - указывают на строчку из которой мы берем символ, ds:si куда будем выводить
2288 clevermous 609
        push    di
610
        pop     si
611
 
612
        push    es
613
        pop     ds
614
 
615
        push    0xb800
616
        pop     es
617
 
618
        mov     di, 1040
619
        mov     bx, 18
620
        mov     find_sec_di, di
621
        mov     save_cx_d, bx
622
;;;;;;;;;;;;;;;;;;;;;;;;;;
623
;clean string
624
 
625
        push    di
626
        xor     ax, ax
627
 
628
@@:
629
        mov     cx, 38
630
        push    di
631
        rep stosw
632
        pop     di
633
 
634
        cmp     save_descript_size, bx
635
        jz      @f
636
 
637
 
638
        add     di, 160
639
        dec     bx
640
        jnz     @b
641
 
642
@@:
643
        pop     di
644
;enter in mess
645
.show_mess_prev_eq:
646
        lodsb
647
        mov     ah, color_sym_lettuce;color_sym_turquoise
648
;       sub     di,2
649
        cmp     al, '"'
650
        jz      .loop_message
651
        cmp     al, "'"
652
        jnz     .end_sh_desc_sec
653
 
654
.loop_message:
655
        mov     cx, 38
656
@@:
657
        lodsb
658
        cmp     al, '"'
659
        jz      .end_sh_desc_sec
660
        cmp     al, "'"
661
        jz      .end_sh_desc_sec
662
        stosw
663
        loop    @b
664
 
665
        add     find_sec_di, 160
666
        mov     di, find_sec_di
667
        dec     save_cx_d
668
        cmp     save_cx_d, 0
669
        jnz     .loop_message
670
 
671
.end_sh_desc_sec:
672
        push    save_cx_d
673
        pop     save_descript_size
674
 
675
        push    cs
676
        pop     ds
677
        jmp     .exit
678
 
679
 
680
.rest_value_loop_sh_d:
681
        mov     di, ax
682
        mov     cx, bx
683
        jmp     .start_p_sh_d
684
 
685
.exit:
686
}