diff --git a/src/xpdev/xpbeep.c b/src/xpdev/xpbeep.c
index e26e91afec32c90db86303ec50cefcce5d01ffbc..698fc9f33b7b79526ac441d24c8b7ab5ef15f052 100644
--- a/src/xpdev/xpbeep.c
+++ b/src/xpdev/xpbeep.c
@@ -28,13 +28,24 @@
 
 static BOOL sound_device_open_failed=FALSE;
 
-void makesine(double freq, unsigned char *wave, int samples)
+enum {
+	 WAVE_SHAPE_SINE
+	,WAVE_SHAPE_SAWTOOTH
+	,WAVE_SHAPE_SQUARE
+};
+
+#define SHAPE	WAVE_SHAPE_SAWTOOTH
+#define WAVE_PI	3.14159265358979323846
+#define WAVE_TPI 6.28318530717958647692
+
+void makewave(double freq, unsigned char *wave, int samples)
 {
 	int	i;
 	int j;
 	int k;
 	int midpoint;
 	double inc;
+	double pos;
 	BOOL endhigh;
 	BOOL starthigh;
 
@@ -42,11 +53,25 @@ void makesine(double freq, unsigned char *wave, int samples)
 	inc=8.0*atan(1.0);
 	inc *= ((double)freq / (double)S_RATE);
 
+	k=127;
 	for(i=0;i<samples;i++) {
-		wave[i]=(sin (inc * (double)i))*127+128;
+		pos=(inc*(double)i);
+		pos -= (int)(pos/WAVE_TPI)*WAVE_TPI;
+		switch(SHAPE) {
+			case WAVE_SHAPE_SINE:
+				wave[i]=(sin (pos))*127+128;
+				break;
+			case WAVE_SHAPE_SAWTOOTH:
+				wave[i]=(WAVE_TPI-pos)*40.5;
+				break;
+			case WAVE_SHAPE_SQUARE:
+				wave[i]=(pos<WAVE_PI)?255:0;
+				break;
+		}
+printf("POS: %.4f  VAL: %u\n",pos,wave[i]);
 	}
 	
-	/* Now we have a "perfect" sine wave... 
+	/* Now we have a "perfect" wave... 
 	 * we must clean it up now to avoid click/pop
 	 */
 	if(wave[samples-1]>128)
@@ -64,6 +89,7 @@ void makesine(double freq, unsigned char *wave, int samples)
 			wave[i]=128;
 		}
 	}
+#if 0
 	/* Fade out */
 	for(k=8;k>0;k--) {
 		for(;i>midpoint;i--) {
@@ -87,6 +113,7 @@ void makesine(double freq, unsigned char *wave, int samples)
 			wave[i]=j+128;
 		}
 	}
+#endif
 
 	if(wave[0]>128)
 		starthigh=TRUE;
@@ -103,6 +130,7 @@ void makesine(double freq, unsigned char *wave, int samples)
 			wave[i]=128;
 		}
 	}
+#if 0
 	/* Fade in */
 	for(k=8;k>0;k--) {
 		for(;i<midpoint;i++) {
@@ -126,6 +154,7 @@ void makesine(double freq, unsigned char *wave, int samples)
 			wave[i]=j+128;
 		}
 	}
+#endif
 }
 
 #ifdef _WIN32
@@ -155,7 +184,7 @@ void xpbeep(double freq, DWORD duration)
 	memset(&wh, 0, sizeof(wh));
 	wh.lpData=wave;
 	wh.dwBufferLength=S_RATE*duration/1000;
-	makesine(freq,wave,wh.dwBufferLength);
+	makewave(freq,wave,wh.dwBufferLength);
 	if(waveOutPrepareHeader(waveOut, &wh, sizeof(wh))!=MMSYSERR_NOERROR)
 		goto abrt;
 	if(waveOutWrite(waveOut, &wh, sizeof(wh))!=MMSYSERR_NOERROR)
@@ -226,7 +255,7 @@ void DLLCALL xpbeep(double freq, DWORD duration)
 	unsigned char	wave[S_RATE*15/2+1];
 
 	samples=S_RATE*duration/1000;
-	makesine(freq,wave,samples);
+	makewave(freq,wave,samples);
 	if(!sound_device_open_failed) {
 		if((dsp=open("/dev/dsp",O_WRONLY,0))<0) {
 			sound_device_open_failed=TRUE;
diff --git a/src/xpdev/xpbeep.h b/src/xpdev/xpbeep.h
index 305a125f26cd424be3f733cc4dde5c0171e949c4..10c2724dbe82fd7972b9fecdc3291a3a8f244e93 100644
--- a/src/xpdev/xpbeep.h
+++ b/src/xpdev/xpbeep.h
@@ -4,7 +4,7 @@
 #include "gen_defs.h"
 
 #if defined(_WIN32)
-	#if 0
+	#if 1
 	#define BEEP(freq,dur)	xpbeep((double)(freq),(DWORD)(dur))
 	#else
 	#define BEEP(freq,dur)	Beep((DWORD)(freq),(DWORD)(dur))