Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   low-level timer-programmierung (https://www.delphipraxis.net/81135-low-level-timer-programmierung.html)

sancho1980 21. Nov 2006 09:50


low-level timer-programmierung
 
hi

ich versuche grad, den timer in meinem rechner zu programmieren (nur mal schauen wie sowas geht)

das sieht folgendermaßen aus:

in al, 61h
and al, 11111110b ; timer 2 gate aus
out 61h, al
mov al, 0b6h ; mode = 3 (periodisches rechteck), binärcount, read/write zuerst zu "tiefem" dann zu "hohem" byte
out 43h, al

startvalue: ;anfangswert = 1000h
mov al, 00h
out 42h, al
mov al, 10h
out 42h, al

in al, 61h
or al, 00000011b ; timer 2 gate an, gate pc-speaker
out 61h, al

polling:
in al, 61h
and al, 00100000b
jz zero
mov al, '1'
mov ah, 0eh
int 10h
jmp jump
zero:
mov al, '0'
mov ah, 0eh
int 10h
jump:
jmp polling

wer sich damit auskennt, erkennt sicher was das ganze soll: timer 2 soll ein rechteck mit 291 hz erzeugen, damit soll dann der pc-speaker gegatet werden und das ganze soll obendrein gepollt werden und auf dem bildschirm ausgegeben werden..wenn ich das ganze assembliere und in ms-dos prompt ausführe, dann bekomme ich einfach nur ganze viel mal die ausgabe: 10101010101010101010...
-auf dem pc-speaker ist nichts zu hören
-wenn ich den anfangswert (angegeben bei label startvalue) ändere, dann ändert sich die ausgabe des programms nicht..erwartet hätte ich, damit beispielsweise das rechteck "langsamer" zu machen, also dass dann beispielsweise die ausgabe wäre: 1100110011001100..
mir ist ja durch die "1010"-folge klar, dass ich hier tatsächlich den timer lese, aber irgendwie sehe ich nicht, wie ich auf das "was" und "wie" einen einfluss habe

auch wollte ich mal fragen, ob man so in etwa eine wait-funktion implementiert..wenn ja, wie geht das? ich hab versucht die bios-wait-funktion nachzubauen aber es ist mir nicht gelungen...vielen dank für hilfe :-D

martin

OldGrumpy 21. Nov 2006 10:47

Re: low-level timer-programmierung
 
Direkte Hardwarezugriffe unter Windows NT und aufwärts funktionieren nur selten so wie man das aus DOS-Zeiten erwartet. Boote Deinen Rechner mal z.B. mit FreeDOS und führe Dein Programm dort aus. Die NTVDM (Dein "DOS-Prompt") unterstützt eine ganze Reihe Portzugriffe indem beim Portzugriff eine hochrangige Exception generiert wird und eine Emulation den Rest erledigt. Damit landen Deine Portzugriffe aber natuerlich nicht direkt auf der Hardware sondern nur in der NTVDM (NT Virtual Dos Machine) - daher kein Ton aus dem Speaker und seltsame Polling-Werte. Ich vermute dass das Auslesen immer Dummywerte liefert (egal was man setzt, immer abwechselnd 0 und 1) weil manche DOS-Programme sonst einfach nur gar nichts machen würden weil sie auf den Timer warten. Und eine echte Emulation wäre nur aufwändig ohne echten Nutzen zu haben - ergo wird bei jedem Auslesen ein Bit geflippt und fertig.

sancho1980 21. Nov 2006 12:56

Re: low-level timer-programmierung
 
cool danke
daran hat das gelegen
bleibt nur noch meine andere frage: wie schreibt man eine timer-funktion?
danke,
martin

OldGrumpy 21. Nov 2006 19:15

Re: low-level timer-programmierung
 
So allgemein lässt sich die Frage nicht wirklich hilfreich beantworten. Es kommt vor allem auf die Plattform an, und was Du genau machen willst. Das BIOS programmiert z.B. einen der Timer auf ca. 18,2 Takte pro Sekunde (Stichwort TickCount), der Timer löst dann jedes Mal wenn er auf Null ist einen Interrupt aus der vom Bios so behandelt wird, dass TickCount um eins erhöht und der Timer anschliessend neu gestartet wird (und als letztes wird dann aufgeräumt und die Interruptroutine verlassen damit der Rest des Rechners auch mal weiterarbeiten kann *g*) - Die Taktquelle ist hierbei in der Hardware des PCs verankert, so dass kein weiterer Aufwand entsteht. Du kannst natuerlich einen der unbenutzten Timer ebenfalls dazu bringen, Interrupts für Dich zu generieren, auf die Du dann mittels einer eigenen Interruptroutine entsprechend reagieren kannst. Nur - so bequem wie die Timer in Delphi zum Beispiel ist das ganze beileibe nicht. Beispiele dürfte es in so ziemlich jedem Tutorial für fortgeschrittene Programmierung unter DOS geben, Interruptroutinen waren unter DOS noch viel relevanter für den Programmierer als unter modernen Betriebssystemen wo ganz andere Mechanismen zur Verfügung stehen. In der Schule hatten wir z.B. mal ne Uhr "gebaut", die unten rechts auf dem Bildschirm eingeblendet wurde - mittels Einklinken in den Timer-Interrupt. Das ist jetzt aber auch schon ne halbe Ewigkeit her, selig seien die Tulip XTs an denen wir mit TP 4.0 arbeiteten :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz