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