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
martin
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.