diff -ur --exclude=CVS ScummVM/sword1/sound.cpp ScummVM+hack/sword1/sound.cpp
--- ScummVM/sword1/sound.cpp	2004-07-27 18:29:08.444375000 +0200
+++ ScummVM+hack/sword1/sound.cpp	2004-08-30 14:05:40.943750000 +0200
@@ -31,7 +31,7 @@
 #define SOUND_SPEECH_ID 1
 #define SPEECH_FLAGS (SoundMixer::FLAG_16BITS | SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_LITTLE_ENDIAN)
 
-Sound::Sound(const char *searchPath, SoundMixer *mixer, ResMan *pResMan) {
+Sound::Sound(const char *searchPath, SoundMixer *mixer, ResMan *pResMan, bool isDemo) {
 	strcpy(_filePath, searchPath);
 	_mixer = mixer;
 	_resMan = pResMan;
@@ -39,6 +39,7 @@
 	_endOfQueue = 0;
 	_currentCowFile = 0;
 	_speechVolL = _speechVolR = _sfxVolL = _sfxVolR = 192;
+	_isDemo = isDemo;
 }
 
 int Sound::addToQueue(int32 fxNo) {
@@ -185,13 +186,13 @@
 	while ((READ_BE_UINT32(fBuf + headerPos) != 'data') && (headerPos < 100))
 		headerPos++;
 	if (headerPos < 100) {
-		uint32 resSize = READ_LE_UINT32(fBuf + headerPos + 4) >> 1;
+		int32 resSize;
 		// Demo uses slightly different headers
-		if (resSize > cSize) {
+		if (_isDemo) {
 			resSize = READ_LE_UINT32(fBuf + headerPos + 6) >> 1;
 			headerPos += 2;
-		}
-
+		} else
+			resSize = READ_LE_UINT32(fBuf + headerPos + 4) >> 1;
 		int16 *srcData = (int16*)(fBuf + headerPos + 8);
 		int16 *dstData = (int16*)malloc(resSize * 2);
 		uint32 srcPos = 0;
diff -ur --exclude=CVS ScummVM/sword1/sound.h ScummVM+hack/sword1/sound.h
--- ScummVM/sword1/sound.h	2004-01-11 16:49:27.541250000 +0100
+++ ScummVM+hack/sword1/sound.h	2004-08-30 14:07:21.318750000 +0200
@@ -60,7 +60,7 @@
 
 class Sound {
 public:
-	Sound(const char *searchPath, SoundMixer *mixer, ResMan *pResMan);
+	Sound(const char *searchPath, SoundMixer *mixer, ResMan *pResMan, bool isDemo);
 	~Sound(void);
 	void setSpeechVol(uint8 volL, uint8 volR) { _speechVolL = volL; _speechVolR = volR; };
 	void setSfxVol(uint8 volL, uint8 volR) { _sfxVolL = volL; _sfxVolR = volR; };
@@ -100,6 +100,7 @@
 	uint8		 _endOfQueue;
 	SoundMixer *_mixer;
 	ResMan *_resMan;
+	bool _isDemo;
 	char _filePath[100];
 	static const char _musicList[270];
 	static const uint16 _roomsFixedFx[TOTAL_ROOMS][TOTAL_FX_PER_ROOM];
diff -ur --exclude=CVS ScummVM/sword1/sword1.cpp ScummVM+hack/sword1/sword1.cpp
--- ScummVM/sword1/sword1.cpp	2004-08-12 17:13:15.291250000 +0200
+++ ScummVM+hack/sword1/sword1.cpp	2004-08-30 14:24:39.115625000 +0200
@@ -47,29 +47,43 @@
 using namespace Sword1;
 
 /* Broken Sword 1 */
-static const GameSettings sword1_setting =
-	{"sword1", "Broken Sword I", GF_DEFAULT_TO_1X_SCALER};
+static const GameSettings sword1_settings[] = {
+	{"sword1", "Broken Sword I", GF_DEFAULT_TO_1X_SCALER},
+	{"sword1demo", "Broken Sword I (Demo)", GF_DEFAULT_TO_1X_SCALER | Sword1::GF_DEMO },
+	{ NULL, NULL, 0 }
+};
 
 GameList Engine_SWORD1_gameList() {
+	const GameSettings *g = sword1_settings;
 	GameList games;
-	games.push_back(sword1_setting);
+	while (g->name) {	
+		games.push_back(*g);
+		g++;
+	}
 	return games;
 }
 
 DetectedGameList Engine_SWORD1_detectGames(const FSList &fslist) {
 	DetectedGameList detectedGames;
+	const GameSettings *g = sword1_settings;
 
-	// Iterate over all files in the given directory
-	for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
-		const char *gameName = file->displayName().c_str();
-
-		if ((0 == scumm_stricmp("swordres.rif", gameName)) ||
-			(0 == scumm_stricmp("cd1.id", gameName)) ||
-			(0 == scumm_stricmp("cd2.id", gameName))) {
-			// Match found, add to list of candidates, then abort inner loop.
-			detectedGames.push_back(sword1_setting);
-			break;
+	// TODO: It would be nice if we had code here which distinguishes
+	// between the 'sword1' and 'sword1demo' targets.
+
+	while (g->name) {
+		// Iterate over all files in the given directory
+		for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
+			const char *gameName = file->displayName().c_str();
+
+			if ((0 == scumm_stricmp("swordres.rif", gameName)) ||
+				(0 == scumm_stricmp("cd1.id", gameName)) ||
+				(0 == scumm_stricmp("cd2.id", gameName))) {
+				// Match found, add to list of candidates, then abort inner loop.
+				detectedGames.push_back(*g);
+				break;
+			}
 		}
+		g++;
 	}
 
 	return detectedGames;
@@ -92,6 +106,8 @@
 SwordEngine::SwordEngine(GameDetector *detector, OSystem *syst)
 	: Engine(syst) {
 
+	_features = detector->_game.features;
+
 	if (!_mixer->isReady())
 		warning("Sound initialization failed");
 }
@@ -122,7 +138,7 @@
 	_mouse = new Mouse(_system, _resMan, _objectMan);
 	_screen = new Screen(_system, _resMan, _objectMan);
 	_music = new Music(_system, _mixer);
-	_sound = new Sound("", _mixer, _resMan);
+	_sound = new Sound("", _mixer, _resMan, (_features & GF_DEMO) != 0);
 	_menu = new Menu(_screen, _mouse);
 	_logic = new Logic(_objectMan, _resMan, _screen, _mouse, _sound, _music, _menu, _system, _mixer);
 	_mouse->useLogicAndMenu(_logic, _menu);
diff -ur --exclude=CVS ScummVM/sword1/sword1.h ScummVM+hack/sword1/sword1.h
--- ScummVM/sword1/sword1.h	2004-01-11 16:49:27.681875000 +0100
+++ ScummVM+hack/sword1/sword1.h	2004-08-30 14:09:20.959375000 +0200
@@ -29,6 +29,10 @@
 
 namespace Sword1 {
 
+enum {
+	GF_DEMO = 1 << 0
+};
+
 class Screen;
 class Sound;
 class Logic;
@@ -61,6 +65,8 @@
 	virtual ~SwordEngine();
 	static SystemVars _systemVars;
 	void reinitialize(void);
+
+	uint32 _features;
 protected:
 	void go();
 private:
