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