Posted By: shimi (the NEUROLOGiC member) on 'CZprogram'
Title:     Re: Preruseni
Date:      Wed Feb 25 16:08:03 1998

> > >   Potreboval bych napojit svuj program v C na preruseni, ale neznam
>   Opravim jenom par chybicek a doplnim dalsi malinke detailky.

Ja opravim chybicky, ktere zbyly

>   DOS nema 256 preruseni, ale PC ma 256 vektoru hardwareovych preruseni
> DOS z toho vyuziva jen nekolik vektoru preruseni, nejznamejsi je asi vektor 
> 21h) navic vektory 00-20h jsou vyhrazeny Intelem pro jeho interni pouziti, 
> ze se nevejde do vysledneho registru), ovsem to konstrukteri IBM PC 
> nedodrzuji, takze nektere vektory mezi 00-20h jsou navic obsazeny vnejsimi 
> periferiemi (viz casovac, klavesnice, EGA, atd.). 

Vec nestoji tak, ze by to nedodrzovaly, ale processory 8088(6) na kterych bylo 
staveno 1 PC mely rezervovanych jen mekolik malo vektoru (preteceni pri 
deleni, krokovani, NMI). processor 186 pridal este preteceni mezi pri 
instrukci bound. Nikdo v te dobe nemohl tusit, ze i286 prinese asi 7 dalsich 
vektoru souvisejici se spravou systemu a i386 dalsi asi 3

>   Vektory preruseni jsou ulozeny od zacatku pameti (tedy 0000:0000) pouze v
> s procesory 086, 088, 186 a 286, ostatni procesory maji tuto tabulku vektoru
> ulozenou v sestibytovem registru IDT (2 byty segment, 4 byty offset), ktera 
> je po resetu procesoru nastavena na 0000:00000000. (pozn. tento registr
> zustava v real modu prakticky nezmenen a jeho vyznam se uplatni az v 

Tohle uz umoznovala plne 286, 

> > bud pomoci fci DOSu 25h a 35h nebo primym zapisem do pameti na prislusne
> > Fce DOSu jsou slouceny pod prerusenim 21h. Doporucuji sehnat SYSMANa nebo
> > jiny (temer jakykoliv) systemovy help. Kdyz instalujes obsluhu sveho

SYSMAN to je nastroj !!

> kvuli rychlosti ap.) staci na konci vlastni rutiny provest nasledujici 
> magickou sekvenci instrukci: (psano v assembleru pro Intel 0x86 IDEAL mode)
>          ...
>          mov ax, 020h
>          out 020h, ax
>          ;nasleduje iret

tady je chybka, neni dobry posilat na 8mi bit port 16ti byt hodnotu, neni 
100% zaruceno, ze by na to dany hardware musel reagovat (i kdyz to vsude 
slape), nehlede k tomu, ze je to codove dlouhy (jak v realu, tak v protected)
pouzij :
       mov al,20h
       out 20h,al
       iret
A neni to zadna magicka sekvence ani reset radice, je to zprava o ukonceni 
preruseni (pri vyvolani preruseni radic preruseni (8259A) rekurentni volani 
zablokuje v cetne pozadavku s nizzsi prioritou, dokud nedostane tuto zpravu). 
Pokud to neudelas zablokujes vyvolani preruseni s nizsi prioritou, pokud to 
udelas na vstupu IRQ 0 (za normalnich podminek vektor 8) zablokujes celej 
prerusovaci system, a PC tim padem nemuze reagovat na takove drobnost jako 
vstupy z klavesnice, mysi, sitovky ...)

>  neboli na port 20h posli hodnotu 20h, coz provede reset radice preruseni.

> > (pokud vektory zapisujes primo) je to, ze intel pouziva pro zapis do
> pameti 
> > little endian - tzn. vyssi byte(word) je na vyssi adrewse. 

no ja nevim, ale proc necist vektory najednou po 32dvou bitech ?
takhle

xor ax,ax
mov gs,ax
mov eax,gs:[4*vektor]

a zapis takhle

mov ax,cs
shl eax,16
xor ax,ax
mov gs,ax
mov ax, offset novy_vektor
mov gs:[4*vektor],eax

uff, to jsem si zavzpominal na starsi casy :)




>     Petr Pan.
> Do you believe in Peter Pan, do you believe in Frankestein...
      
+--   |   | | |  /| |  I was systemak,
+--+  |   | | | / | |               I'm systemak
   |  +---+ | |    | |                          and I will be systemak
 --+  |   | | |    | |  E-mail: tsimek@students.zcu.cz
                        http://dione.zcu.cz/~tsimek

Search the boards