home *** CD-ROM | disk | FTP | other *** search
- { JR> Well, Can you post the sorce code on how to play to the Sound blaster
- JR> Byte by Byte? I could probley find out after that!
- JR> James
-
- Sure thing... this Program will load a File into memory then play it a Byte
- at a time... It should be pretty self-explanatory.
- }
-
- Program rawdemo;
-
- Uses Crt;
-
- {$I-}
-
- Const
- fname = 'NELLAF.VOC'; { Can be any raw data File }
- resetport = $226;
- readport = $22A;
- Writeport = $22C;
- statusport = $22E;
- dac_Write = $10;
- adc_read = $20;
- midi_read = $30;
- midi_Write = $38;
- speakeron = $D1;
- speakeroff = $D3;
-
- Function reset_dsp : Boolean;
- Var
- count, bdum : Byte;
- begin
- reset_dsp := False;
- port[resetport] := 1;
- For count := 1 to 6 do
- bdum := port[statusport];
- port[resetport] := 0;
- For count := 1 to 6 do
- bdum := port[statusport];
- Repeat Until port[statusport] > $80;
- if port[readport] = $AA then
- reset_dsp := True;
- end;
-
- Procedure spk_on;
- begin
- Repeat Until port[Writeport] < $80;
- port[Writeport] := $D1;
- end;
-
- Procedure spk_off;
- begin
- Repeat Until port[Writeport] < $80;
- port[Writeport] := $D3;
- end;
-
- Procedure generic(reg,cmd:Integer; data:Byte);
- begin
- Repeat Until port[Writeport] < $80;
- port[reg] := cmd;
- Repeat Until port[Writeport] < $80;
- port[reg] := data;
- end;
-
- Procedure Write_dsp(data:Byte); Assembler;
- Asm
- mov dx,$22C
- mov cx,6 { Change either value of CX For }
- @1:
- in al,dx
- loop @1
-
- mov al,10h
- out dx,al
- mov cx,36 { faster or slower playing. }
- @2:
- in al,dx
- loop @2
-
- mov al,data
- out dx,al
- end;
-
- Function read_dsp : Byte;
- begin
- Repeat Until port[Writeport] < $80;
- port[Writeport] := $20;
- Repeat Until port[statusport] > $80;
- read_dsp := port[readport];
- end;
-
- Procedure Write_midi(data:Byte);
- begin
- Repeat Until port[Writeport] < $80;
- port[Writeport] := $38;
- Repeat Until port[Writeport] < $80;
- port[Writeport] := data;
- end;
-
- Function read_midi : Byte;
- begin
- Repeat Until port[Writeport] < $80;
- port[Writeport] := $30;
- Repeat Until port[statusport] > $80;
- read_midi := port[readport];
- end;
-
- Function loadFile(Var buffer:Pointer; Filename:String) : Word;
- Var
- fromf : File;
- size : LongInt;
- errcode : Integer;
- begin
- assign(fromf,Filename);
- reset(fromf,1);
- errcode := ioresult;
- if errcode = 0 then
- begin
- size := Filesize(fromf);
- Writeln(size);
- getmem(buffer,size);
- blockread(fromf,buffer^,size);
- end
- else size := 0;
- loadFile := size;
- close(fromf);
- end;
-
- Procedure unload(buffer:Pointer; size:Word);
- begin
- freemem(buffer,size);
- end;
-
- Var
- ch : Char;
- buf : Pointer;
- index, fsize : Word;
-
- begin
- ClrScr;
- Writeln;
- Writeln;
- if not reset_dsp then
- begin
- Writeln('Unable to initialize SoundBlaster.');
- halt(1);
- end;
- fsize := loadFile(buf,fname);
- if (fsize <= 0) then
- begin
- Writeln(fname, ' not found.');
- halt(2);
- end;
- { For index := 1 to fsize do
- dec(mem[seg(buf^):ofs(buf^)+index-1],80);} { For MOD samples }
- spk_on;
- Writeln('Playing...');
- For index := 1 to fsize do
- Write_dsp(mem[seg(buf^):ofs(buf^)+index-1]);
- spk_off;
- unload(buf,fsize);
- Writeln('Done.');
- ch := ReadKey;
- end.
-