[asm] Timer interrupt *

Pagina: 1
Acties:

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Ok, ik ben dus voor het eerst in mijn leven een beetje met asm aan het klooien. Ik ben erachter gekomen dat asm erg snel is ;) en alles wat ik tot nu toe doe in m'n loopje gaat eigenlijk wat te snel, dus wil ik een delaytje in m'n loop body stoppen. Om dit een beetje portable te maken wil ik graag gebruik maken van de timer interrupt (08h), die standaard 18.2 keer per seconde wordt gegenereerd. Nu heb ik daar een paar vragen over:

1. Kan ik zomaar ongestraft een eigen interrupt handler aan die interrupt hangen, of wordt ie door het systeem al ergens anders voor gebruikt. Als ie al bezet is, kan ik em dan "aftappen" op een of andere manier?

2. Hoe kan ik mijn eigen interrupt handler eraan hangen? Let op, ik wil GEEN gebruik maken van de dos interrupts, dus ik zal waarschijnlijk handmatig een of andere waarde naar een of ander geheugen adres moeten schrijven.

3. De timer interrupt hangt aan IRQ 0, kan ik daar gebruik van maken?

Google heeft het eigenlijk alleen over interrupts voor andere processor architecturen of maakt gebruik van de dos interrupts.

oeps [asm] vergeten idd |:(

He who knows only his own side of the case knows little of that.


Verwijderd

Als je netjes de vector red en naderhand weer terugzet kun je wel je eigen handler gebruiken. In linux is vector 0x20, in dos 0x8.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:20
Het hooken van interrupts kan in principe alleen in 8086 real mode (meestal dus onder DOS). Eventueel zou het in emulatiemodus ook nog kunnen, maar dat kan ik niet bevestigen.

Het hooken van een interrupt kan in principe ongestraft, mits je er voor zorgt dat de oude handler alsnog aangeroepen wordt. Je kopieert dus eerst de aanwezige waarde in de interrupt vector (het adres van de huidge interrupt handler) naar een globale variabele en overschrijft de betreffende waarde in de interupt vector met het adres van je eigen handler. Aan het einde daarvan, doe je een jump naar de oude handler, mits het adres daarvan ongelijk aan 0 was.

Waar de interrupt vector zit en hoe groot de entries zijn weet ik niet meer (het is 5 of 6 jaar geleden dat ik voor 't laatst een TSR schreef), maar dat zal wel ergens 'laag' in het geheugen zijn (misschien zelfs vanaf 0:0?). Dat is wel op te zoeken, lijkt me. Succes!

offtopic:
[quote]
RickN is klaar met LOTR!!!
[/quote]

En wat vond je d'r van? :)

Verwijderd

Op maandag 18 maart 2002 20:37 schreef Soultaker het volgende:
Het hooken van interrupts kan in principe alleen in 8086 real mode (meestal dus onder DOS). Eventueel zou het in emulatiemodus ook nog kunnen, maar dat kan ik niet bevestigen.
Nou bij deze: het kan in DPMI (Dos Protected Mode Interface)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:20
Op maandag 18 maart 2002 20:44 schreef fladder het volgende:
Nou bij deze: het kan in DPMI (Dos Protected Mode Interface)
Ach ja, nu herinner ik het me weer. Dat was juist bijzonder handig voor TSR's die nog geen werkende unload routine hadden =)

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Op maandag 18 maart 2002 20:37 schreef Soultaker het volgende:
offtopic:
[..]

En wat vond je d'r van? :)
In één woord GE-WEL-DIG!!!

Er zijn geen superlatieven die toereikend zijn om te beschrijven wat ik van LOTR vond. Serieus.

Ik heb nog nooit een boek gelezen dat zo goed in staat was om emoties over te brengen. Toen ik het boek uit had heb ik een tijdje echt een triestig gevoel gehad, alsof er ECHT een mooi tijdperk ten einde was gekomen en er een nieuwe onzekere toekomst voor me lag... heel akelig. Normaal ben ik een ZEER nuchter persoon, maar dit boek "really got to me"...

He who knows only his own side of the case knows little of that.


  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Op maandag 18 maart 2002 20:37 schreef Soultaker het volgende:
Het hooken van een interrupt kan in principe ongestraft, mits je er voor zorgt dat de oude handler alsnog aangeroepen wordt.
Ok. Ik heb ook gelezen dat je de frequentie van die timer aan kunt passen, als ik dit doe, moet ik daar dan nog voor compenseren bij het doorgeven van de interrupt aan de originele handler?

Dus, als ik die timer twee keer zo snel zet, moet de originele timer dan maar 1 keer per 2 interupts aanroepen. Ik wil b.v. niet dat m'n klokken dan ineens 2 keer zo snel lopen ofzo...

He who knows only his own side of the case knows little of that.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:20
Op maandag 18 maart 2002 21:16 schreef RickN het volgende:
Ok. Ik heb ook gelezen dat je de frequentie van die timer aan kunt passen, als ik dit doe, moet ik daar dan nog voor compenseren bij het doorgeven van de interrupt aan de originele handler?
Ik heb daar zelf nooit mee gespeeld (wist niet eens dat 't kon om eerlijk te zijn) maar logischerwijs moet je daar wel voor compenseren. Het lijkt me dat als je een gehele versnelling kiest (2x zo snel bijvoorbeeld) je dit gemakkelijk kan afhandelen door in de helft van de gevallen de oude handler aan te roepen en in de andere helft van de gevallen zelf de interrupt te beëindigen (met 'iret' en niet 'ret' zoals je gewend bent!). Ik heb hier geen ervaringen mee, maar ik kan nu niet verzinnen waarom 't niet zo werken.

Oh ja, denk eraan dat de inhoud van AL je registers behouden blijft in je interrupt handler anders kan (en meestal zal) 't mis gaan!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:20
Toevoeging: in real modus zijn er 256 entries in de vector tabel van elk 4 bytes groot (en ze zijn dan relatief aan 't eerste segment, segment 0, denk ik) en de vectortabel begint (zoals verondersteld) op 0:0.

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

De PIT (programmable interval timer) kun je interdaad op lekker veel manier aanpassen, maar misschien kan het makkelijker voor je: waarom zou je zo moeilijk doen en maak je niet gewoon gebruik van de vertical retrace van je monitor?
code:
1
2
3
4
5
6
7
8
9
  mov dx,3d4h
@t1:
  in  al,dx
  test al,8
  jnz  @t1
@t2:
  in  al,dx
  test al,8
  jz   @t2

PIT info kan je vinden op oa:

zie voor info

Yo dawg, I heard you like posts so I posted below your post so you can post again.

Pagina: 1