home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / PINBSRC.ZIP / SOUNDKIT.PAS < prev    next >
Pascal/Delphi Source File  |  1996-02-02  |  2KB  |  120 lines

  1. {SOUNDKIT Ver. 1.0 (c) Ansgar Scherp, Joachim Gelhaus / vt '95 }
  2. Unit SOUNDKIT;
  3.  
  4. Interface
  5.  
  6. function ResetDSP(base : word) : boolean;
  7. procedure WriteDAC(level : byte);
  8. function ReadDAC : byte;
  9. function SpeakerOn: byte;
  10. function SpeakerOff: byte;
  11. procedure DMAStop;
  12. procedure DMAContinue;
  13. procedure Playback(sound : Pointer; size : word; frequency : word);
  14.  
  15. Implementation
  16.  
  17. Uses Crt;
  18.  
  19. var      DSP_RESET : word;
  20.      DSP_READ_DATA : word;
  21.     DSP_WRITE_DATA : word;
  22.   DSP_WRITE_STATUS : word;
  23.     DSP_DATA_AVAIL : word;
  24.  
  25. function ResetDSP(base : word) : boolean;
  26. begin
  27.  
  28.   base := base * $10;
  29.  
  30.   DSP_RESET := base + $206;
  31.   DSP_READ_DATA := base + $20A;
  32.   DSP_WRITE_DATA := base + $20C;
  33.   DSP_WRITE_STATUS := base + $20C;
  34.   DSP_DATA_AVAIL := base + $20E;
  35.  
  36.   Port[DSP_RESET] := 1;
  37.   Delay(10);
  38.   Port[DSP_RESET] := 0;
  39.   Delay(10);
  40.   if (Port[DSP_DATA_AVAIL] And $80 = $80) And
  41.      (Port[DSP_READ_DATA] = $AA) then
  42.     ResetDSP := true
  43.   else
  44.     ResetDSP := false;
  45. end;
  46.  
  47. procedure WriteDSP(value : byte);
  48. begin
  49.   while Port[DSP_WRITE_STATUS] And $80 <> 0 do;
  50.   Port[DSP_WRITE_DATA] := value;
  51. end;
  52.  
  53. function ReadDSP : byte;
  54. begin
  55.   while Port[DSP_DATA_AVAIL] and $80 = 0 do;
  56.   ReadDSP := Port[DSP_READ_DATA];
  57. end;
  58.  
  59. procedure WriteDAC(level : byte);
  60. begin
  61.   WriteDSP($10);
  62.   WriteDSP(level);
  63. end;
  64.  
  65. function ReadDAC : byte;
  66. begin
  67.   WriteDSP($20);
  68.   ReadDAC := ReadDSP;
  69. end;
  70.  
  71. function SpeakerOn: byte;
  72. begin
  73.   WriteDSP($D1);
  74. end;
  75.  
  76. function SpeakerOff: byte;
  77. begin
  78.   WriteDSP($D3);
  79. end;
  80.  
  81. procedure DMAContinue;
  82. begin
  83.   WriteDSP($D4);
  84. end;
  85.  
  86. procedure DMAStop;
  87. begin
  88.   WriteDSP($D0);
  89. end;
  90.  
  91. procedure Playback(sound : Pointer; size : word; frequency : word);
  92. var time_constant : word;
  93.      page, offset : word;
  94. begin
  95.  
  96.   size := size - 1;
  97.  
  98.   offset := Seg(sound^) Shl 4 + Ofs(sound^);
  99.   page := (Seg(sound^) + Ofs(sound^) shr 4) shr 12;
  100.   if size>65536-offset then size:=65536-offset;
  101.   Port[$0A] := 5;
  102.   Port[$0C] := 0;
  103.   Port[$0B] := $49;
  104.   Port[$02] := Lo(offset);
  105.   Port[$02] := Hi(offset);
  106.   Port[$83] := page;
  107.   Port[$03] := Lo(size);
  108.   Port[$03] := Hi(size);
  109.   Port[$0A] := 1;
  110.  
  111.   time_constant := 256 - 1000000 div frequency;
  112.   WriteDSP($40);
  113.   WriteDSP(time_constant);
  114.  
  115.   WriteDSP($14);
  116.   WriteDSP(Lo(size));
  117.   WriteDSP(Hi(size));
  118. end;
  119. end.
  120.