Unit Sounddrive (snddrive.pas): ------------------------------- (***************************************************************************) (* Hubersoft Sound Adapter Driver Version 1.0 *) (* ------------------------------------------------------------------ *) (* copyright (c) 1998 by Hubersoft Corp. All rights reserved. *) (***************************************************************************) unit snddrive; interface type Tbuffer=array[0..63999] of byte; procedure sndinit; procedure snddone; var sndpointer:word; soundbuffer1, soundbuffer2: ^Tbuffer; block: byte; b: boolean; implementation uses dos; const soundfreq=22050*2; var oldint8:Pointer; timwert,vocpos: word; procedure iProc; interrupt; assembler; asm cmp block, 1 jne @1 les di, soundbuffer1 jmp @3 @1:les di, soundbuffer2 @3:add di, sndpointer inc sndpointer mov al,es:[di] mov dx, 0378h out dx, al cmp sndpointer, 64000d jb @2 mov al, 1 sub al, block mov block, al mov sndpointer, 0 @2:mov al, 20h out 20h, al end; procedure sndinit; begin New(soundbuffer1); New(soundbuffer2); fillchar(soundbuffer2^, 64000, 0); Block:=0; GetIntVec($8,OldInt8); SetIntVec($8,@iproc); timwert := 1193180 DIV soundfreq; Port[$43]:=$36; Port[$40]:=Lo(timwert); Port[$40]:=Hi(timwert); end; procedure snddone; begin if oldint8<>nil then SetIntVec($8,OldInt8); Port[$43]:=$36; Port[$40]:=0; Port[$40]:=0; Dispose(soundbuffer1); Dispose(soundbuffer2); Port[$378]:=0; End; begin end. Testprogramm (sound6.pas): ---------------------------- (***************************************************************************) (* Hubersoft Sound Adapter Test Program Version 1.0 *) (* ------------------------------------------------------------------ *) (* copyright (c) 1998 by Hubersoft Corp. All rights reserved. *) (***************************************************************************) uses crt,dos, snddrive; const binfilename='song2.wav'; var f: file; lastblock: byte; counter, result: word; blockcount: longint; a,b,c,d,l: longint; (****************************************************************************) function getbiostime: longint; var h, m, s: byte; lh, lm, ls: longint; begin asm mov ah, 02h int 1Ah mov h, ch mov m, cl mov s, dh end; lh:=(h div 16)*10+(h mod 16); lm:=(m div 16)*10+(m mod 16); ls:=(s div 16)*10+(s mod 16); getbiostime:=ls+lm*60+lh*3600; end; (****************************************************************************) begin clrscr; write('********************************************************************************'); write('* The Hubersoft sound adapter test program *'); write('* ---------------------------------------------------------------------- *'); write('* copyright (c) 1998 by Hubersoft Corp. All rights reserved. *'); write('********************************************************************************'); writeln; { gotoxy(1,18); a:=getbiostime; for l:=1 to 2000000000 do; b:=getbiostime; c:=b-a; writeln('ohne Sound: ',c,' sec'); } sndinit; { a:=getbiostime; for l:=1 to 2000000000 do; b:=getbiostime; d:=b-a; writeln('mit Sound: ',d,' sec'); writeln('Prozessorauslastung mit Sound: ',(d-c)/c*100:0:1,'%'); } blockcount:=0; assign(f, binfilename); reset(f,1); seek(f, 0); result:=64000; while (result=64000) and not keypressed do begin counter:=64000; if block=1 then blockread(f, soundbuffer2^, counter, result) else blockread(f, soundbuffer1^, counter, result); lastblock:=block; inc(blockcount); gotoxy(10,12); writeln('Disk status: ready. '); repeat gotoxy(10,9); write('Played blocks: ', blockcount, ' (',((blockcount-1)*64000+sndpointer)/1000:0:1,'k)'); gotoxy(10,10); write('Status: Playing buffer ', block); gotoxy(10,11); writeln('Played ', sndpointer, ' Bytes of block ',blockcount, ' (=',sndpointer div 640,'%) '); delay(20); until lastblock<>block; gotoxy(10,12); writeln('Disk status: loading data...'); end; snddone; close(f); end.