Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Hristic
Anmeldungsdatum: 30.01.2009 Beiträge: 2
|
Verfasst am: 30.01.2009, 23:40 Titel: Brauche Hilfe bei Software-Interrupts |
|
|
Kann mir jemand sagen, wie ich in QBasic einen Interrupt installiere, sodass er sich immer in bestimmten Zeitabständen ausführt?
Ich dachte da so an Zeitabstände von etwa 0,1 Millisekunden.
Ich hoffe jemand kann mir helfen. |
|
Nach oben |
|
 |
Ferdi

Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
|
Verfasst am: 30.01.2009, 23:57 Titel: |
|
|
0,1 Millisekunden??
Geht das in QB überhaupt? _________________ Dieser Post wurde cum grano salis gewürzt! Na dann: Guten Appetit! |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 31.01.2009, 00:03 Titel: |
|
|
Der DOS-Timer hat eine Genauigkeit von 55ms. KA wie das mit Interrupts geht, die ugl-lib konnte, glaube ich, sehr präzise timer bieten... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Hristic
Anmeldungsdatum: 30.01.2009 Beiträge: 2
|
Verfasst am: 31.01.2009, 00:18 Titel: RE |
|
|
Also ich glaube, dass das schon möglich ist.
Ich habe ein Programm in asm geschrieben, dass mal nur das tut, was der spätere Interrupt tun soll. Er war so schnell, dass ich die Cycles (nutze DosBox) auf 50 runterregeln konnte... - da muss es doch möglich sein, einen Interrupt zu programmieren, der sich entsprechend ausführt. Aber richtig ist auch, dass die Timer nicht genau genug sind. Da muss ich wohl auch noch mal tiefgründig nachdenken, wie man d a s realisieren k ö n n t e...
Wer eine Antwort hat - nur her damit! |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 31.01.2009, 13:39 Titel: Re: RE |
|
|
Hristic hat Folgendes geschrieben: |
Ich habe ein Programm in asm geschrieben, dass mal nur das tut, was der spätere Interrupt tun soll. (...)
Wer eine Antwort hat - nur her damit! |
ASM ist nicht QBasic!
Du kannst natürlich eine ASM-Datei mit einem Assembler kompilieren (bzw. assemblieren) und dann die OBJ-Datei mit dem Linker in Dein QB-Projekt einbinden. Leichter ginge es aber mit FreeBasic, das hat einen Inline-Assembler. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Ferdi

Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
|
Verfasst am: 31.01.2009, 14:38 Titel: |
|
|
Wozu? Ich dachte mit FreeBasic kann man auf sämtliche Windowsfunktionen zugreifen... Es gibt doch bestimmt einen API -Befehl, der dies ausführt. _________________ Dieser Post wurde cum grano salis gewürzt! Na dann: Guten Appetit! |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 31.01.2009, 15:56 Titel: |
|
|
Ferdi hat Folgendes geschrieben: | Wozu? Ich dachte mit FreeBasic kann man auf sämtliche Windowsfunktionen zugreifen... Es gibt doch bestimmt einen API -Befehl, der dies ausführt. |
Ferdi, DOS != Windows != Linux != Mac != Solaris.
Verstanden? |
|
Nach oben |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 01.02.2009, 00:46 Titel: |
|
|
Also einen Interrupt unter QB anlegen ist recht einfach.
Du hast in den ersten 1024 Bytes des RAM die Interrupttabelle.
256 Einträge zu je 4 Byte (2 Byte Segment, 2 Byte Offset)
Das erste was du benötigst ist natürlich das ASM-Programm welches du auf eine beliebige Art und Weise in dein QB-Programm lädst und es dann in einem String oder in einem Array ablegst.
Dann ermittelst du die Adressen des Arrays/String mit SADD, VARSEG, VARPTR etc..
Wenn du dann diese Adressen hast, kannst du sie in die Interrupttabelle per DEF SEG und POKE an die richtige Stelle schreiben.
Nach dem dies getan ist, und das QB-Programm läuft, kann man mit beliebigem anderen geladenen ASM diesen INT direkt aufrufen wie man es aus Assembler gewohnt ist.
Wenn das QB-Programm beendet wird, wird der Speicherteil in dem das ASM-Programm geladen war, als "frei" markiert. Das heißt das man ab diesem Zeitpunkt so einen INT nicht mehr aufrufen sollte.
Jetzt ist nur noch die Frage was genau du damit machen willst bei diesen Zeitabständen. Denn was ich mir vorstellen könnte wäre eine Schleife im ASM-Programm die den Timer des Mainboards ausliest und dann dementsprechend handelt. Der ist ein wenig genauer als 1/18.
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 01.02.2009, 16:32 Titel: |
|
|
Von mir höchtenst noch die Empfehlung: Für derartige Anwendungen ausschliesslich unter reinem MS-DOS 6.22 arbeiten, Windows-Kernel im RAM mit Multitasking und NTVDM ist für so etwas absolut tabu!
Da bekanntlich die Uhrbaustein-Geschichte beim IBM-PC-Standard für solche Anwendungen wahrlich keine Meisterleistung darstellt, wirst Du sehr wahrscheinlich nicht darum herumkommen, mit Warte-Zählschleifen wie im alten 8-Bit-Zeitalter zu arbeiten, wobei Du aber immerhin die Anzahl Loops, die es für eine bestimmte Zeiteinheit braucht, zu Beginn noch ausmessen kannst. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
|