home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / emulaton / at2600 / !v2600 / c / arc_sound < prev    next >
Text File  |  1998-04-10  |  3KB  |  129 lines

  1. /****************************************************************************
  2.  
  3.    This file is part of x2600, the Atari 2600 Emulator
  4.    ===================================================
  5.  
  6.    Copyright 1996 Alex Hornby. For contributions see the file CREDITS.
  7.  
  8.    This software is distributed under the terms of the GNU General Public
  9.    License. This is free software with ABSOLUTELY NO WARRANTY.
  10.  
  11.    See the file COPYING for details.
  12.  
  13.    $Id: dos_sound.c,v 1.1 1997/02/23 20:39:29 ahornby Exp $
  14. ****************************************************************************/
  15.  
  16. #include "config.h"
  17. #include "swis.h"
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21.  
  22. #include "types.h"
  23. #include "options.h"
  24. #include "vmachine.h"
  25. #include "tiasound.h"
  26.  
  27. #define S_BUFMAX 314*4
  28.  
  29. #define SAMPLE_RATE 20833
  30.  
  31. #define AUDIO_CLOCK 31400
  32.  
  33. static int sound_change;
  34. static int sndbufsize = S_BUFMAX;
  35. static BYTE *buffer, *bufpt;
  36.  
  37. int sound_available;
  38. int sound_channel;
  39. int sound_area;
  40.  
  41. /* Turn on the sound */
  42. void sound_init (void){
  43.   int temp;
  44.   char chandat[255];
  45.   _swi(0x44393,_IN(0)|_OUT(0), 0xC26, &sound_channel);
  46.   if(sound_channel != 0){
  47.     Tia_sound_init(AUDIO_CLOCK, SAMPLE_RATE);
  48.     _swi(OS_DynamicArea, _INR(0,8)|_OUT(1)|_OUT(3), 0, -1, S_BUFMAX, -1,
  49.          0x30, S_BUFMAX, 0, 0, "v2600 sound buffer", &sound_area, &buffer);
  50.     bufpt = buffer;
  51.     _swi(0x44386,_IN(0)|_IN(1)|_IN(2), sound_channel, bufpt, bufpt+S_BUFMAX);
  52.     _swi(0x4438E,_IN(0)|_IN(1)|_OUT(0), 1000000/SAMPLE_RATE, 0, &temp);
  53.     _swi(0x44380,_IN(0)|_IN(1), sound_channel, 1);
  54.     _swi(0x44381,_IN(0)|_IN(1), sound_channel, 1);
  55.     _swi(0x44382,_IN(0)|_IN(1), sound_channel, temp);
  56.     /* read what channel was before */
  57.     sprintf(chandat, "channelvoice %d DataVox-Voice", sound_channel);
  58.     system(chandat);
  59.   }
  60. }
  61.  
  62.  
  63. void sound_update(void){
  64.   if(sound_channel != 0){
  65.     if(sound_change){
  66.       Tia_process(bufpt, sndbufsize);
  67.       _swi(Sound_Control, _INR(0,3), sound_channel, 0xFFF1, 0x4000, 0xFF);
  68.       sound_change=0;
  69.     }
  70.   }
  71. }
  72.  
  73. /* Turn off the sound */
  74. void
  75. sound_close (void){
  76.   if(sound_channel != 0){
  77.     _swi(0x44390, _IN(0), sound_channel); /* Unset datavox channel */
  78.     _swi(0x44394, _IN(0)|_IN(1), sound_channel, 0xC26); /* deregister it */
  79.     _swi(OS_DynamicArea, _IN(0)|_IN(1), 1, sound_area); /* dealloc memory*/
  80.     /* set channel to what it was before loaded.*/
  81.   }
  82. }
  83.  
  84. void
  85. sound_freq(int channel, BYTE freq)
  86. {
  87.   static BYTE last[2];
  88.   if(last[channel]!=freq)
  89.     {
  90.       Update_tia_sound(0x17 + channel, freq);
  91.       sound_change=1;
  92.       last[channel]=freq;
  93.     }
  94. }
  95.  
  96. void
  97. sound_volume(int channel, BYTE vol)
  98. {
  99.   static BYTE last[2];
  100.   if(last[channel]!=vol)
  101.     {
  102.       Update_tia_sound(0x19 + channel, vol);
  103.       sound_change=1;
  104.       last[channel]=vol;
  105.     }
  106. }
  107.  
  108. void
  109. sound_waveform(int channel, BYTE value)
  110. {
  111.   static BYTE last[2];
  112.   if(last[channel]!=value)
  113.     {
  114.       Update_tia_sound(0x15 + channel, value);
  115.       sound_change=1;
  116.       last[channel]=value;
  117.     }
  118. }
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.