Kesketys no. 8 (System Timer) k„ytt” Kesketyksien k„yt”ss„ on selv„sti ilmennyt ep„selvyyksi„ siit„ mit„ niill„ saa tehd„, mit„ niill„ pit„„ tehd„ ja mit„ voi tehd„. T„ss„ on nyt lyhyt selostus Timerin k„yt”st„. Kaikkien keskeytyksien osoitteet sijaitsevat muistissa 0000:0000 ja 0000:0400h v„lisell„ alueella alkaen nollasta. Jokaiselle osoitteelle on varattu nelj„ byte„ tilaa. Joten Timeri keskeytykselle on varattu osoite 0000:0020h. Ohjelmien pit„„ yleens„ talletta vanha Timer keskeytys jotta se voidan asettaa toimimaan my”s oman ohjelman j„lkeen. Sille on viisainta varata muistipaikka code segmentist„ (CS) jotta kesketysrutiinikin voi sit„ helposti k„ytt„„, esimerkiksi n„in oldint dword ? setint08 proc cli mov ax,0 mov es,ax ; Asetetaan ES„„n 0 mov ax,word ptr es:[0020h] ; Talletetaan vanha keskeytys mov bx,word ptr es:[0022h] mov word ptr cs:[oldint],ax ; ja siirret„„n se muistiin mov word ptr cs:[oldint+2],ax ; code segmentiin . . jonka j„lkeen on siirrett„v„ uuden rutiinin osoite vanhan paikalle . . mov word ptr es:[0020h],offset omaint mov word ptr es:[0022h],seg omaint . . sti Huomaa komennot 'cli' ja 'sti. Cli:t„ on k„ytett„v„ jotta mit„„n keskeytyksi„ ei voi kutsua sill„ hetkell„ kun keskeytysten osoitteita muutetaan. Kun vanha kesketys otetaan takaisin k„ytt””n voi tehd„ esimerkiksi t„ll„ tavoin freeint08 proc cli mov ax,0 mov es,ax mov ax,cs:[oldint] mov bx,cs:[oldint+2] mov es:[0020h],ax mov es:[0022h],bx . . sti Jos halutaan k„ytt„„ nopeutettua kesketysrutiinin kutsunta nopeutta on 8253-piirin 0-kanavan asetuksia muutettava. Kanava-0 pit„„ huolen siit„ ett„ timer kesketyksi„ kutsutaan ajallaan. Sopivan nopeuden asettamiseen k„ytet„„n komentoa 34h portiin 43h. Sen j„lkeen laitetaan portiin 40h uusi nopeuden ilmaiseva tavu joka lasketaan seuraavasti 1193180 / A = X jossa A on haluttu kutsunta taajuus hertseiss„ ja X on portiin 40h l„hetett„v„ tavu. Joten jos halutaan esimerkiksi 100hz kutsunta taajuus on X = 11932 joten mov al,34h out 43h,al ; aseta oikea komentotila mov ax,11932 out 40h,al ; Xn enemm„n merkitsev„ tavu mov al,ah out 40h,al ; Xn v„hemm„n merkitsev„ tavu Ohjelma p„tk„ on paras sijoittaa samaan rutiiniin kuin miss„ kesketys- rutiinikin aktivoidaan ja sen on my”s paras olla CLIn ja STIn v„liss„. Kun vanha kesketysrutiini otetaan takaisin k„ytt””n on kutsuntataajuus muutettava samaksi kuin se oli ennen. Silloin oli k„yt”ss„ taajuus 18.2hz mik„ saadaan k„ytt””n n„in mov al,34h out 43h,al ; aseta oikea komentotila mov ax,0 ; Numero 0 on t„ss„ tapauksessa sama ; kuin 10000h out 40h,al ; Xn enemm„n merkitsev„ tavu mov al,ah out 40h,al ; Xn v„hemm„n merkitsev„ tavu Keskeytysrutiinia teht„ess„ on aina muistettava seuraavat asiat: - Mink„„n rekisterin sis„lt” EI SAA MUUTTUA - Rutiinin lopuksi on joko kutsuttava vanhaa keskeytysrutiinia tai ilmoitettava 'Interrupt Controller':lle ett„ kesketys on p„„ttynyt - DOS-kutsuja ei saa k„ytt„„ muuten kuin tietyiss„ erikoistapauksissa - Varsinkin korkeita kutsuntataajuuksia k„ytett„ess„ on rutiinin oltava mahdollisimman nopea muuten koneen vauhti hidastuu likaa tai sitten se voi menn„ lukkoon. Kannattaa my”s muistaa ett„ kaikilla ohjelmilla ei ole rajattomasti tilaa stack segmentiss„ joten tarpeettomat push/pop komennot on poistettava. Jos et kutsu vanhaa keskytysrutiinia voi rutiinisi n„ytt„ t„lt„: omaint proc push ax ; Kaikki rekisterit s„ilytet„„n push XX . . . mov al,20h ; L„het„ Interrupt Controllerille signaali out 20h,al ; interruptisi p„„ttymisest„ pop XX ; Kaikkien rekisterien sis„lt” palautetaan pop ax iret ; Keskytys rutiinista palaaminen omaint endp Jos kutsut vanhaa keskeytysrutiinia korvaa iret-komento seuraavalla jmp far ptr cs:[oldint] Jotta kutsuisit vanhaa keskeytysrutiinia oikealla taajuudella sinun on asetettava jonkinlainen laskin joka laskee miten usein vanhaa rutiinia on kutsuttava. Esimerkiksi jos k„yt„t 100hz kutsuntataajuutta sinun on kutsuttava vanhaa keskeytysrutiinia noin joka viides kerta. Tom B„ckstr”m 1992