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

    procedure not_int;

    procedure en_int;

    procedure set_unr(base,limit:longint;kseg,g:byte);

    procedure save_sreg;

    procedure  reset;

    procedure test_wr;

    procedure init_tss_286 (var tss:t_tss_286; cs,ds,es,  ofs_task,ofs_task_stack:word);

    procedure init_tss_386 (var tss:t_tss_386; cs,ds,es,   ofs_task,ofs_task_stack:word);

    procedure get_cpu_type(inf:byte;var cpu:byte);

    procedure exc_00;

    procedure exc_01;

    procedure exc_02;

    procedure exc_03;

    procedure exc_04;

    procedure exc_05;

    procedure exc_06;

    procedure exc_07;

    procedure exc_08;

    procedure exc_10;

    procedure exc_11;

    procedure exc_12;

    procedure exc_13;

    procedure exc_14;

    procedure exc_16;

    procedure exc_17;

    procedure exc_18;

    procedure keyb;

    procedure int_30h;

    procedure int_31h;

  implementation

    function lin_adr;                                                        { Перетвоpення логiчної адреси }

      begin                                                                                                   { в лiнiйну адресу }

             lin_adr:=longint(seg) shl 4+off

      end;{lin_adr}

    function hex;                                                { Пеpетвоpення даних в 16-рiчну форму }

      var    s:string;

      begin

         s:='h';

         repeat

            s:=hex_tabl[p and $f]+s;

            p:=p shr 4

         until p=0;

       hex:=s

      end; {hex}

    procedure init_gdt;                                   { Формування дескриптора таблицi GDT }

      begin

        with gdt[i] do begin

          lim_l  :=limit;

          base_l :=base;

          base_h :=base shr 16;

          acc    :=acces;

          lim_h  :=limit shr 16 or byte_6h;

          base_hh:=base shr 24;

        end

      end; {init_gdt}

    procedure init_gdtr;                             { Формування даних i завантаження GDTR }

      begin

        gdtr.lim:=sizeof(gdt)-1;

        gdtr.base:=lin_adr(seg(gdt),ofs(gdt));

        asm

            db 0fh,01h,16h                                                                                     { LGDT gdtr: }

            dw gdtr                                        завантаження атрибутiв GDT в GDTR з gdtr }

        end

      end; {init_gdtr}

    procedure init_idt;                                     { Формування дескриптора таблицi IDT }

      begin

        with idt[i] do begin

          off_l:=p_off;

          sel:=p_sel;

          par:=0;

          acc:=acces;

          off_h:=0

        end

      end; {init_idt}

    procedure init_idtr_p;                                      { Формування даних i завантаження }

      begin                                                         { IDTR для роботи в захищеному режимi }

        idtr.lim:=sizeof(idt)-1;

        idtr.base:=lin_adr(seg(idt),ofs(idt));

        asm

            db 0fh,01h,1eh                                                                                       { LIDT idtr: }

            dw idtr                                             завантаження атрибутiв IDT в IDTR з idtr }

        end;

      end;

    procedure init_idtr_r;                                        { Формування даних регістра IDTR }

      begin                                                                     { для роботи в реальному режимi: }

        idtr_r.lim:=$3ff;                                                               { розмiр таблицi векторiв, }

        idtr_r.base:=0;                                                           { базова адреса таблицi векторiв }

      end;

    procedure save_ret_real;

      begin

        memw[$40:$67]:=ofs;                                           { В комiрках 40h:67h и 40h:69h - }

        memw[$40:$69]:=seg;                                        { повна адреса точки повернення }

                                                    { в реальний режим пiсля апаратного скидання МП }

        port[$70]:=$0f;                                         { 0Fh - адреса комiрки КМОП пам'ятi, }