e-mail    Debatní kniha    Mapa stránek    Hlavní  
 perličky 
 

Budiž ticho

Ivo Raab

Jistě znáte tu situaci, že rodina již šla večer spát, a vy ještě něco kutíte u svého pécéčka miláčka a přitom se do jinak hrobového ticha najednou ostře zařízne v lepším případě pronikavý pískot reproduktoru, v horším přímo kvílení či ječení.

Ve své sérii článků Playnite si sampling se Michal Weis pokoušel dostat z pécéčka ty nejlibější zvuky, já se dnes pokusím o pravý opak. Kupodivu prostředky pro obojí si jsou docela podobné. V principu jde o tohle:

Využijeme opět interrupt 8, který provede požadovanou činnost, tj. zablokuje výstup na reproduktor. Jelikož ale běžná rychlost INT 8 je pro tyto účely nízká a tón o délce trvání řádově milisekundy a více je ještě dobře slyšet, musíme si pomoci tím, že přeprogramováním časovače zvýšíme periodu INT 8 podle potřeby. Slušné výsledky jsou již od asi stonásobného urychlení, při tisícinásobném zrychlení se i nejukvílenější programy změní v tiše pobekávájící beránky. Principiálně se totiž zvuku zcela zabránit nedá, ale na druhou stranu je dobré, že ještě poznáme, když se nám program snaží něco vytroubit.

Protože program musí být pro systém i pro ostatní programy transparentní, nemůžeme si dovolit původní INT 8 vyřadit, nebo mu změnit rychlost. Proto musíme počítat rychlá přerušení a po odpovídajícím počtu zpomalit hodinový kmitočet a vyvolat původní INT 8. V přiloženém výpisu si můžeme podle potřeby zadat konstantu SpeedUp, která uvádí, kolikrát častěji bude volán nový INT 8. Pro hlubší rozbor odkazuji na Bajt 10--12/92 a články Playnite si sampling.

Pro dosovské aplikace si můžeme i na 286-ce dovolit 1000-násobné zrychlení. Ve Windows se program stává značnou brzdou, a tak ho lze použít i jako zpomalovač her apod. Únosnou mezí je asi 100- až 200-násobné zrychlení bez příliš znatelného zpomalení Windows.

S ohledem na spíše prezentaci myšlenky a omezení rozsahu není program doplněn o komfort ve stylu kontroly vícenásobné instalace (pozor, ta vede k narušení původní funkce INT 8), o možnost zadat zrychlení jako parametr z příkazové řádky při instalaci nebo později při změně, či odinstalovat program. Ale pro tyto úpravy již Bajt poskytl dostatek inspirace.

Nakonec snad jen -- ticho léčí!
; program pro potlaceni zvukoveho vystupu ; preklad a spojeni: ; tasm ticho ; tlink ticho /t CODE segment assume CS:CODE,DS:CODE org 100h SpeedUp equ 200 Div8 equ 65536/SpeedUp Begin: jmp short Inst Speed8: cli push AX mov AL, 34h out 43h, AL pop AX nop nop nop nop out 40h, AL mov AL, AH nop nop nop nop out 40h, AL sti ret NewInt8: push AX in AL, 61h and AL, not 3 out 61h, AL inc word ptr CS:[offset Cnt] cmp word ptr CS:[offset Cnt], SpeedUp jne BezOI8 mov AX,0 mov word ptr CS:[offset Cnt], AX call Speed8 pushf call dword ptr CS:OldInt8 mov AX, Div8 call Speed8 BezOI8: mov AL, 20h out 20h, AL pop AX iret Cnt: dw (?) OldInt8: dw (?),(?) Inst: mov AX,0 mov word ptr CS:[offset Cnt], AX mov AX, 3508h int 21h mov word ptr DS:[offset OldInt8], BX mov word ptr DS:[(offset OldInt8)+2], ES mov AX, 2508h mov DX, offset NewInt8 int 21h mov AX, Div8 call Speed8 mov AH, 9 mov DX, offset Message push CS pop DS int 21h mov DX, offset inst int 27h Message: db '(C) 1993 ing. Ivo Raab',0Dh,0Ah,' db 'Program instalovan.',0Dh,0Ah,'$'' CODE ends end begin


Pascal - hlavní
Překladače
Vlastní články
Převzaté články
Věci na stáhnutí
Odkazy k tématu
BP7 buglist
Chyba Run-time 200

BASIC