Організація роботи мiкропроцесора в захищеному режимi, страница 15

{----------Повернення в реальний режим-через скидання мiкропроцесора------------}

{----------------------------------------для МП 80286--------------------------------------------------}

          mov al,$fe     { Команда контролера клавiатури, яка }

          out $64,al                                                       { визиває скидання мiкропроцесора }

@wait_res:                     { Очикування пiд час скидання МП }

          hlt

          jmp @wait_res

{-------------------Визначення ємності оперативної пам'ятi комп'ютера------------------}

  @mem:call know_mem_size

{---------Пiдготовка до повернення в реальний режим за командою MOV------------}

{--------------------------------------для МП 80386і вище-------------------------------------------}

{------------------------Вiдновлення параметрiв сегментiв DS, SS i ES----------------------}

  @mov:mov ax,data_sel

       mov ds,ax

       mov ss,ax

       mov es,ax

{---------------------Повернення в реальний режим за командою MOV--------------------}

       db $0f,$20,0c0h                            { MOV EAX,CR0 }

       db 66h,25h                           { AND EAX,FFFFFFFEh }

       dd 0fffffffeh

       db $0f,22h,0c0h                            { MOV CR0,EAX }

       jmp ret_r

{--------------------------------------Робота в реальному режимi----------------------------------}

 ret_r:

       xor ax,ax                                                                      { Вiдновлення регiстрiв пiсля }

       mov ds,ax             { повернення в реальний режим: }

       mov ds,ds:[4*$60]                                  { DS, }

 mov ss,real_ss                                     { SS, }

       mov es,real_es                                    { ES i }

      mov sp,real_sp                                      { SP }

    end;

{-------------------------Дозвiл маскуємих i немаскуємих переривань-----------------------}

    en_int;

    if cpu_type>2 then  writeln ('Розмiр оперативної пам'ятi : ',

                                 mem_size shr 10+1024,' кбайт');

    readkey

  end.

                                         4.11.4 Текст модуля PROT

unit prot;

  interface

     uses CRT;

    const

          hex_tabl:array[0..15] of char='0123456789ABCDEF';

{-----------------------------Селектори дескpиптоpiв сегментів---------------------------------}

        code_sel   =$08;             { сегмента коду програми }

        code_sel2  =$10;                                                                    { сегмента коду модуля }

        data_sel:word   =$18;          { сегмента даних }

        stack_sel:word  =$20;                                                                      { сегмента стека }

        video_sel:word  =$28;                                                          { сегмента вiдеопам'ятi }

        mem_sel:word   =$30;                                             { сегмента розширеної пам'ятi }

        task_sel   =$38;                        { задачі task }

        task_1_sel =$40;                      { задачі task_1 }

        task_2_sel =$48;                      { задачі task_2 }

        keyb_sel   =$50;                                                                                        { задачі keyb }

        main_sel:word=$58;                      { задачі main }

{---------------------------------Бiти байта доступу сегментiв-------------------------------------}

        present   =$80;                                                            { сегмент є в пам'ятi       (P=1) }

        nosys     =$10;       { сегмент несистемний       (S=1) }

        exe       =$08;                                                           { сегмент виконуємий        (E=1) }

        down      =$04;                                                  { сегмент розширяється вниз (D=1) }

        write     =$02;       { дозволений запис          (W=1) }

        read      =$02;      { дозволене читання         (R=1) }