![]() |
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 |
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.
|
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 |
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