48214 (608497), страница 5
Текст из файла (страница 5)
init_idt(14,ofs(exc_14),code_sel2,acc_trap);
init_idt(16,ofs(exc_16),code_sel2,acc_trap);
init_idt(17,ofs(exc_17),code_sel2,acc_trap);
init_idt(18,ofs(exc_18),code_sel2,acc_trap);
init_idt($20,ofs(PIC_1),code_sel2,acc_int);
init_idt($21,ofs(keyb),code_sel2,acc_int+$60);
for i:=2 to 7 do
init_idt($20+i,ofs(PIC_1),code_sel2,acc_int);
for i:=8 to 15 do
init_idt($20+i,ofs(PIC_2),code_sel2,acc_int);
init_idt($30,ofs(int_30h),code_sel2,acc_trap);
init_idtr_p;
init_idtr_r;
pic(1);
save_sreg;
real_sp:=SPtr;
if cpu_type=2 then
{--------Переход в защищенный режим для МП 80386 и выше-----}
asm { Установка бита PE=1 в регистре управления CR0: }
db 0fh,20h,0c0h { MOV EAX,CR0 }
db 66h,0dh { OR EAX,1 }
dd 1h
db 0fh,22h,0c0h { MOV CR0,EAX }
end;
asm
db 0eah { Межсегментный переход на метку @prot }
dw offset @prot { для очистки буфера команд МП }
dw code_sel { и загрузки регистра CS }
@prot:mov ds,data_sel { DS, }
mov ss,stack_sel { SS }
mov es,video_sel { и ES }
mov ah,1 { Установка маркера: }
mov bx,1001h { строка 1, столбец 10 }
int 30h
mov ah,4 { Вывод строки s на экран: }
mov dh,1eh { видеоатрибут, }
mov si,offset s { адрес строки }
int $30
mov ah,1 { Установка маркера }
mov bx,004h
int 30h
mov ah,4 { Вывод строки s1 на экран: }
mov dh,30h
mov si,offset s1
int $30
mov ah,1 { Установка маркера }
mov bx,006h
int 30h
sti
@wait:
cmp semaf,0
jz @wait
cmp cpu_type,2
jnz @mov
db 9ah { межсегментный вызов процедуры reset }
dw offset reset
dw code_sel2
{---Подготовка к возврату в реальный режим по команде MOV---}
@mov:mov ds,data_sel
mov ss,data_sel
mov es,data_sel
{---------------Восстановление атрибутов IDT----------------}
db 0fh,01h,1eh { LIDT idtr_r }
dw idtr_r
{-------Возврат в реальный режим по команде MOV-------------}
db 0fh,20h,0c0h { MOV EAX,CR0 }
db 66h,25h { AND EAX,FFFFFFFEh }
dd 0fffffffeh
db 0fh,22h,0c0h { MOV CR0,EAX }
mov bx,offset ofs_ret
db 0ffh { Косвенный межсегментный переход на метку ret_r }
db 2fh { для очистки буфера команд МП и загрузки CS }
{db 2eh} {вместо 2fh}
{dw ofs_ret}
{-----------------Работа в реальном режиме------------------}
ret_r: xor ax,ax
mov ds,ax
mov ds,ds:[4*$60] { DS, }
mov ss,real_ss { SS, }
mov es,real_es { ES }
mov sp,real_sp { и SP }
end;
if res=0 then test_wr; { Если запрет сохранился - }
{ вырабатывается прерывание 13, обработчик которого }
{ с помощью процедуры reset сбрасывает МП }
{----------Размаскирование контроллеров прерываний----------}
port[$21]:=0; { первого КП }
port[$a1]:=0; { и второго КП }
{-----Разрешение маскируемых и немаскируемых прерываний-----}
en_int;
{-------------Проверка возникновения исключений-------------}
if excep<>$ff then {if excep=11 then
writeln('Обработано исключение 11 (селектор ', err shr 3,')')
else} writeln('Исключение ',excep);
{----------Анализ возврата МП из защищенного режима---------}
if res=0 then s:='по команде MOV' else s:='через сброс МП';
writeln('Возврат из защищенного режима выполнен ',s);
writeln('prov=',prov,ss);
readkey;
end.