diff -ur ScummVM-cvs20030124/scummvm/scumm/smush/scumm_renderer.cpp ScummVM-cvs20030124+hack/scummvm/scumm/smush/scumm_renderer.cpp
--- ScummVM-cvs20030124/scummvm/scumm/smush/scumm_renderer.cpp	2002-12-25 18:47:58.000000000 +0100
+++ ScummVM-cvs20030124+hack/scummvm/scumm/smush/scumm_renderer.cpp	2003-01-25 10:37:45.000000000 +0100
@@ -199,7 +199,8 @@
 ScummRenderer::ScummRenderer(Scumm * scumm, uint32 speed) :
 	_scumm(scumm),
 	_smixer(0),
-	_insaneSpeed(speed) {
+	_insaneSpeed(speed),
+	_pending_updates(0) {
 }
 
 static ScummRenderer * s_renderer;
@@ -239,9 +240,12 @@
 }
 
 bool ScummRenderer::wait(int32 ms) {
-	while(_wait) {
+	// Because waitForTimer() also is the function that checks for user
+	// input we always want to call it at least once between frames, or
+	// the user may become unable to interrupt the movie.
+	do {
 		_scumm->waitForTimer(1);
-	}
+	} while(_pending_updates <= 0);
 	return true; 
 }
 
@@ -275,11 +279,16 @@
 void ScummRenderer::save(int32 frame) {
 	int width = MIN(getWidth(), _scumm->_realWidth); 
 	int height = MIN(getHeight(), _scumm->_realHeight);
-	
-	_scumm->_system->copy_rect((const byte *)data(), getWidth(), 0, 0, width, height);
-	_scumm->_system->update_screen();
+
+	// In theory, this will always be true. In reality, there may be
+	// several pending updates because the computer wasn't fast enough to
+	// process them all. In that case, skip the frame to catch up.
+	if (--_pending_updates <= 0) {
+		_scumm->_system->copy_rect((const byte *)data(), getWidth(), 0, 0, width, height);
+		_scumm->_system->update_screen();
+	} else
+		warning("ScummRenderer: Skipping frame %d to catch up", getFrame());
 	_scumm->processKbd();
-	_wait = true;
 }
 
 bool ScummRenderer::prematureClose() { 
@@ -289,7 +298,7 @@
 }
 
 bool ScummRenderer::update() {
-	_wait = false;
+	_pending_updates++;
 	return true;
 }
 
diff -ur ScummVM-cvs20030124/scummvm/scumm/smush/scumm_renderer.h ScummVM-cvs20030124+hack/scummvm/scumm/smush/scumm_renderer.h
--- ScummVM-cvs20030124/scummvm/scumm/smush/scumm_renderer.h	2002-09-18 10:06:15.000000000 +0200
+++ ScummVM-cvs20030124+hack/scummvm/scumm/smush/scumm_renderer.h	2003-01-25 03:08:25.000000000 +0100
@@ -45,7 +45,7 @@
 	Scumm * _scumm;
 	ScummMixer * _smixer;
 	uint32 _insaneSpeed;
-	volatile bool _wait;
+	volatile int _pending_updates;
 public:
 	ScummRenderer(Scumm * scumm, uint32 speed);
 	virtual ~ScummRenderer();
