Rev 2288 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2288 | Rev 3539 | ||
---|---|---|---|
Line 22... | Line 22... | ||
22 | ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
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 |
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. |
24 | ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
25 | ;***************************************************************************** |
25 | ;***************************************************************************** |
Line 26... | Line 26... | ||
26 | 26 | ||
27 | ; òóò îïèñûâàþòñÿ ïðîöåäóðû êîòîðûå èñïîëüçóþòñÿ â secondary loader |
27 | ; тут описываются процедуры которые используются в secondary loader |
28 | color_sym_black equ 0 |
28 | color_sym_black equ 0 |
29 | color_sym_blue equ 1 |
29 | color_sym_blue equ 1 |
30 | color_sym_green equ 2 |
30 | color_sym_green equ 2 |
31 | color_sym_turquoise equ 3 |
31 | color_sym_turquoise equ 3 |
Line 38... | Line 38... | ||
38 | color_sym_pink equ 12 |
38 | color_sym_pink equ 12 |
39 | color_sym_yellow equ 14 |
39 | color_sym_yellow equ 14 |
40 | color_sym_white equ 15 |
40 | color_sym_white equ 15 |
41 | if DEBUG |
41 | if DEBUG |
42 | decode: |
42 | decode: |
43 | ;input eax - ÷èñëî, es:di êóäà ïèñàòü, cx=10 |
43 | ;input eax - число, es:di куда писать, cx=10 |
44 | cmp eax, ecx |
44 | cmp eax, ecx |
45 | jb @f |
45 | jb @f |
46 | xor edx, edx |
46 | xor edx, edx |
47 | div ecx |
47 | div ecx |
48 | push edx |
48 | push edx |
Line 196... | Line 196... | ||
196 | repe scasb ;cut ' ' |
196 | repe scasb ;cut ' ' |
197 | inc cx |
197 | inc cx |
198 | dec di |
198 | dec di |
Line 199... | Line 199... | ||
199 | 199 | ||
200 | 200 | ||
201 | ;âñå âûðåçàëè è âñå ãîòîâî äëÿ âûâîäà èìåíè ñåêöèè )) |
201 | ;все вырезали и все готово для вывода имени секции )) |
Line 202... | Line 202... | ||
202 | push es |
202 | push es |
203 | pop ds |
203 | pop ds |
Line 247... | Line 247... | ||
247 | pop ds |
247 | pop ds |
Line 248... | Line 248... | ||
248 | 248 | ||
249 | pop si |
249 | pop si |
Line 250... | Line 250... | ||
250 | ret |
250 | ret |
251 | 251 | ||
252 | .not_name_sec_fb: ;íåò èìåíè â íàçâàíèè ñåêöèè - çíà÷èò òàê è ñêàæåì îá ýòîì |
252 | .not_name_sec_fb: ;нет имени в названии секции - значит так и скажем об этом |
253 | push cs |
253 | push cs |
254 | pop ds |
254 | pop ds |
Line 255... | Line 255... | ||
255 | mov di, default_section_name |
255 | mov di, default_section_name |
256 | jmp .def_sect_name |
256 | jmp .def_sect_name |
257 | 257 | ||
258 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
258 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
259 | ;ïðîöåäóðà ïîèñêà ââåðõ ñëåäóþùåé ñåêöèè |
259 | ;процедура поиска вверх следующей секции |
260 | ;â point_default ñîäåðæèòüñÿ óêàçàòåëü íà äåôàóëò ñåêöèþ, è â ïðåäåëàõ âðåéìà ìû áåãàåì ïî çàðàíåå ïðîïàðñåíûìè çíà÷åíèÿì óêàçàòåëåé |
260 | ;в point_default содержиться указатель на дефаулт секцию, и в пределах врейма мы бегаем по заранее пропарсеными значениям указателей |
261 | ;äëÿ òîãî ÷òî áû îòîáðàçèòü è ïðîïàðñèòü ñëåäóþùèé ôðåéì, íàì íóæíî ïîëó÷èòü çà ïåðäûäóùèé èëè ñëåäóþùèé óêàçàòåëü |
261 | ;для того что бы отобразить и пропарсить следующий фрейм, нам нужно получить за пердыдущий или следующий указатель |
262 | find_before_sect: |
262 | find_before_sect: |
263 | mov di, point_default |
263 | mov di, point_default |
264 | .e: |
264 | .e: |
265 | push ini_data_ |
265 | push ini_data_ |
Line 266... | Line 266... | ||
266 | pop es |
266 | pop es |
267 | mov cx, di ;ïðåäïîëîæèì áóäåì ïðîñìàòðèâàòü ê íà÷àëó, òåêóùàÿ ïîçèöèÿ di = ñêîëüêî ñèìâîëîâ îò íà÷àëà äîêóìåíòà èìååòñÿ |
267 | mov cx, di ;предположим будем просматривать к началу, текущая позиция di = сколько символов от начала документа имеется |
268 | mov bx, cx ;êîïèÿ |
268 | mov bx, cx ;копия |
269 | 269 | ||
270 | ;íàñòðîèëè óêàçàòåëü íà äåôàóëò ñåêöèþ |
270 | ;настроили указатель на дефаулт секцию |
271 | ;áóäåì èñêàòü ââåðõ |
271 | ;будем искать вверх |
272 | .find_start_section: |
272 | .find_start_section: |
273 | std ;óñòàíîâêà ôëàãà íàïðàâëåíèÿ - áóäåì ïðîñìàòèðâàòü ê íà÷àëó íàøåãî èíè ôàéëà |
273 | std ;установка флага направления - будем просматирвать к началу нашего ини файла |
Line 274... | Line 274... | ||
274 | ;áóäåì èñêàòü íà÷àëî ñåêöèè ò.å. '[' ýòîò ñèìâîë |
274 | ;будем искать начало секции т.е. '[' этот символ |
275 | mov al, 0xa |
275 | mov al, 0xa |
Line 276... | Line 276... | ||
276 | repnz scasb ;ïðîñêàíèðóåì íà íàëè÷åå ñèìâîëà íà÷àëà ñåêöèè |
276 | repnz scasb ;просканируем на наличее символа начала секции |
277 | jcxz .go_ ;ìû ïðîñìîòðåëè äî íà÷àëà ôàéëà, íî òàê è íè÷åãî íå íàøëè ;(( ïî òèõîìó âûéäåì ) |
277 | jcxz .go_ ;мы просмотрели до начала файла, но так и ничего не нашли ;(( по тихому выйдем ) |
278 | 278 | ||
279 | mov find_sec_di, di ;ñîõðàíèì äàííûå |
279 | mov find_sec_di, di ;сохраним данные |
280 | mov cx, di ; |
280 | mov cx, di ; |
281 | 281 | ||
Line 282... | Line 282... | ||
282 | sub bx, cx |
282 | sub bx, cx |
283 | mov cx, bx ;â ñx çíà÷åíèå - êîë-âî ñèìâîëîâ |
283 | mov cx, bx ;в сx значение - кол-во символов |
284 | cld |
284 | cld |
285 | call get_firs_sym |
285 | call get_firs_sym |
286 | .ret_go: |
286 | .ret_go: |
287 | jcxz ._not_section ; â äàííîì ñëó÷àå èìååì êîíñòðóêöèþ 0xa ... ; hello [ñåêöèÿ] îáëîìñ èùåì äàëåå |
287 | jcxz ._not_section ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее |
288 | 288 | ||
289 | cmp di, point_loader; ñåêöèþ loader ìû íå çàíîñèì èíà÷å êðàõ |
289 | cmp di, point_loader; секцию loader мы не заносим иначе крах |
290 | jz ._not_section |
290 | jz ._not_section |
291 | ;âñå óäà÷íî ìû íàøëè âõîæäåíèå ñåêöèè ïðåäûäóùåé |
291 | ;все удачно мы нашли вхождение секции предыдущей |
292 | cmp al, '[' |
292 | cmp al, '[' |
293 | jnz ._not_section |
293 | jnz ._not_section |
294 | mov point_default, di |
294 | mov point_default, di |
295 | .exit_scan_sect: |
295 | .exit_scan_sect: |
296 | ret |
296 | ret |
297 | ;;;;;;;; âîññòàíîâèì çíà÷åíèÿ è ïðîäîëæèì ïîèñêè íà÷àëà ñåêöèè êîòîðàÿ íàñ óñòðîèò )) |
297 | ;;;;;;;; восстановим значения и продолжим поиски начала секции которая нас устроит )) |
298 | ._not_section: |
298 | ._not_section: |
Line 299... | Line 299... | ||
299 | mov di, find_sec_di |
299 | mov di, find_sec_di |
300 | mov cx, di |
300 | mov cx, di |
301 | mov bx, cx |
301 | mov bx, cx |
302 | jmp .find_start_section |
302 | jmp .find_start_section |
303 | .go_: |
303 | .go_: |
304 | cld |
304 | cld |
305 | mov cx, bx ;â ñx çíà÷åíèå - êîë-âî ñèìâîëîâ |
305 | mov cx, bx ;в сx значение - кол-во символов |
Line 306... | Line 306... | ||
306 | 306 | ||
307 | mov al, byte [es:di] |
307 | mov al, byte [es:di] |
Line 308... | Line 308... | ||
308 | push word .f_go |
308 | push word .f_go |
309 | cmp al, ' ' |
309 | cmp al, ' ' |
310 | jz @f |
310 | jz @f |
311 | jmp get_firs_sym.not_space |
311 | jmp get_firs_sym.not_space |
312 | @@: |
312 | @@: |
313 | jmp get_firs_sym.first_sp |
313 | jmp get_firs_sym.first_sp |
314 | 314 | ||
Line 334... | Line 334... | ||
334 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
334 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
335 | find_next_sect: |
335 | find_next_sect: |
336 | mov di, point_default |
336 | mov di, point_default |
337 | push ini_data_ |
337 | push ini_data_ |
338 | pop es |
338 | pop es |
339 | mov cx, save_cx;di ;ïðåäïîëîæèì áóäåì ïðîñìàòðèâàòü ê êîíöó, òåêóùàÿ ïîçèöèÿ di = ñêîëüêî ñèìâîëîâ îò íà÷àëà äîêóìåíòà èìååòñÿ |
339 | mov cx, save_cx;di ;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется |
340 | sub cx, di ;ñåé÷àñ â cx îñòàòîê ò.å. ñêîëüêî ìîæíî êðóòèòü äî êîíöà è íå âûëàçèòü íà íà÷àëî |
340 | sub cx, di ;сейчас в cx остаток т.е. сколько можно крутить до конца и не вылазить на начало |
341 | jmp .let_s_go |
341 | jmp .let_s_go |
342 | .h: |
342 | .h: |
343 | push ini_data_ |
343 | push ini_data_ |
344 | pop es |
344 | pop es |
345 | mov cx, save_cx;di ;ïðåäïîëîæèì áóäåì ïðîñìàòðèâàòü ê êîíöó, òåêóùàÿ ïîçèöèÿ di = ñêîëüêî ñèìâîëîâ îò íà÷àëà äîêóìåíòà èìååòñÿ |
345 | mov cx, save_cx;di ;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется |
346 | ; sub cx,di ;ñåé÷àñ â cx îñòàòîê ò.å. ñêîëüêî ìîæíî êðóòèòü äî êîíöà è íå âûëàçèòü íà íà÷àëî |
346 | ; sub cx,di ;сейчас в cx остаток т.е. сколько можно крутить до конца и не вылазить на начало |
Line 347... | Line 347... | ||
347 | 347 | ||
348 | mov al, byte [es:di] |
348 | mov al, byte [es:di] |
349 | push word .let_s_go_ret |
349 | push word .let_s_go_ret |
350 | cmp al, ' ' |
350 | cmp al, ' ' |
Line 354... | Line 354... | ||
354 | jmp get_firs_sym.first_sp |
354 | jmp get_firs_sym.first_sp |
Line 355... | Line 355... | ||
355 | 355 | ||
356 | 356 | ||
357 | 357 | ||
358 | 358 | ||
359 | ;íàñòðîèëè óêàçàòåëü íà äåôàóëò ñåêöèþ |
359 | ;настроили указатель на дефаулт секцию |
360 | ;áóäåì èñêàòü âíèç |
360 | ;будем искать вниз |
361 | .let_s_go: |
361 | .let_s_go: |
362 | call get_firs_sym |
362 | call get_firs_sym |
363 | .let_s_go_ret: |
363 | .let_s_go_ret: |
364 | jcxz .exit_scan_sect ; â äàííîì ñëó÷àå èìååì êîíñòðóêöèþ 0xa ... ; hello [ñåêöèÿ] îáëîìñ èùåì äàëåå |
364 | jcxz .exit_scan_sect ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее |
365 | cmp al, '[' |
365 | cmp al, '[' |
366 | jnz .let_s_go |
366 | jnz .let_s_go |
367 | cmp di, point_loader |
367 | cmp di, point_loader |
368 | jz .let_s_go |
368 | jz .let_s_go |
Line 369... | Line 369... | ||
369 | ;âñå óäà÷íî ìû íàøëè âõîæäåíèå ñåêöèè ïðåäûäóùåé |
369 | ;все удачно мы нашли вхождение секции предыдущей |
370 | mov point_default, di |
370 | mov point_default, di |
371 | .exit_scan_sect: |
371 | .exit_scan_sect: |
372 | ret |
372 | ret |
373 | 373 | ||
374 | ;;;;;;;;;;;;;;;;;;;;;;;;;; |
374 | ;;;;;;;;;;;;;;;;;;;;;;;;;; |
375 | ;clean old cursor |
375 | ;clean old cursor |
376 | clean_active_cursor: |
376 | clean_active_cursor: |
377 | ;íå èçìåíÿåò çíà÷åíèå ax |
377 | ;не изменяет значение ax |
378 | ;îòîáðàæåíèå êóðñîðà ïî óìîë÷àíèþ |
378 | ;отображение курсора по умолчанию |
Line 403... | Line 403... | ||
403 | add di, 68 |
403 | add di, 68 |
404 | stosw |
404 | stosw |
405 | pop ax |
405 | pop ax |
406 | ret |
406 | ret |
407 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
407 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
408 | ;óñòàíîâêà òàéìåðà è îòîáðàæåíèå ñ÷åò÷èêà âðåìåíè |
408 | ;установка таймера и отображение счетчика времени |
409 | gettime: |
409 | gettime: |
410 | mov ah, 0 |
410 | mov ah, 0 |
411 | int 1Ah |
411 | int 1Ah |
412 | xchg ax, cx |
412 | xchg ax, cx |
413 | shl eax, 10h |
413 | shl eax, 10h |
Line 460... | Line 460... | ||
460 | mov eax, dword [old_timer] |
460 | mov eax, dword [old_timer] |
461 | mov [es:8*4], eax |
461 | mov [es:8*4], eax |
462 | mov dword [timer_], eax |
462 | mov dword [timer_], eax |
463 | mov sp, word [start_stack] |
463 | mov sp, word [start_stack] |
464 | mov bp, word [save_bp_from_timer] |
464 | mov bp, word [save_bp_from_timer] |
465 | ;;íå âîññòàíîâëåíûé ñòåê :( |
465 | ;;не восстановленый стек :( |
466 | sti |
466 | sti |
467 | jmp parse_start.parse_run_only |
467 | jmp parse_start.parse_run_only |
Line 468... | Line 468... | ||
468 | 468 | ||
469 | 469 | ||
470 | .decode: |
470 | .decode: |
471 | ;input ax - ÷èñëî, es:di êóäà ïèñàòü, bx=10 |
471 | ;input ax - число, es:di куда писать, bx=10 |
472 | cmp ax, bx |
472 | cmp ax, bx |
473 | jb @f |
473 | jb @f |
474 | xor dx, dx |
474 | xor dx, dx |
Line 483... | Line 483... | ||
483 | stosw |
483 | stosw |
484 | pop ax |
484 | pop ax |
485 | ret |
485 | ret |
Line 486... | Line 486... | ||
486 | 486 | ||
487 | show_bl_sc_sect: |
487 | show_bl_sc_sect: |
488 | ;1) îòîáðàæåíèå ñïèñêà ñåêöèé. Åñëè ñåêöèÿ íå èìåò èìÿ - îøèáêà - âûâîä Section unname |
488 | ;1) отображение списка секций. Если секция не имет имя - ошибка - вывод Section unname |
489 | ;ïðîâåðêà íà íàëè÷åå èìåíè. |
489 | ;проверка на наличее имени. |
490 | ;âõîäíûå äàííûå es:di -óêàçàòåëü íà ñåêöèþ - cx ðàçìåð ñåêöèè |
490 | ;входные данные es:di -указатель на секцию - cx размер секции |
491 | ; push bp |
491 | ; push bp |
492 | mov bx, point_to_eframe |
492 | mov bx, point_to_eframe |
493 | lea si, point_to_hframe |
493 | lea si, point_to_hframe |