diff --git a/waterbox/picodrive/bizhawk.c b/waterbox/picodrive/bizhawk.c
index 5d5b848e60..41c8d18389 100644
--- a/waterbox/picodrive/bizhawk.c
+++ b/waterbox/picodrive/bizhawk.c
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <stdint.h>
 #include <stdarg.h>
+#include <string.h>
 
 #include "../emulibc/emulibc.h"
 #include "../emulibc/waterboxcore.h"
@@ -60,10 +61,23 @@ int pm_close(pm_file *fp)
 	return ret;
 }
 
+typedef struct
+{
+	FrameInfo b;
+} MyFrameInfo;
+
 static int video_start_line;
 static int video_line_count;
 static int video_width;
-static uint16_t* video_buffer;
+static uint16_t *video_buffer;
+static int16_t *sound_buffer;
+static MyFrameInfo *current_frame;
+
+static void SoundCallback(int len)
+{
+	current_frame->b.Samples = len / (2 * sizeof(int16_t));
+	memcpy(current_frame->b.SoundBuffer, sound_buffer, len);
+}
 
 void emu_video_mode_change(int start_line, int line_count, int is_32cols)
 {
@@ -83,34 +97,38 @@ void mp3_update(int *buffer, int length, int stereo) {}
 
 ECL_EXPORT int Init(void)
 {
-	video_buffer = alloc_invisible(512 * 512 * sizeof(uint16_t));
+	PicoOpt = POPT_EN_FM | POPT_EN_PSG | POPT_EN_Z80 | POPT_EN_STEREO | POPT_ACC_SPRITES | POPT_DIS_32C_BORDER | POPT_EN_MCD_PCM | POPT_EN_MCD_CDDA | POPT_EN_MCD_GFX | POPT_EN_32X | POPT_EN_PWM;
 
 	PicoInit();
+	if (PicoLoadMedia("romfile.md", NULL, NULL, NULL, PM_MD_CART) != PM_MD_CART)
+		return 0;
+	PicoLoopPrepare();
+
+	video_buffer = alloc_invisible(512 * 512 * sizeof(uint16_t));
+	sound_buffer = alloc_invisible(2048 * sizeof(int16_t));
+	PsndRate = 44100;
+	PsndOut = sound_buffer;
+	PicoWriteSound = SoundCallback;
+
 	PicoSetInputDevice(0, PICO_INPUT_PAD_6BTN);
 	PicoSetInputDevice(1, PICO_INPUT_PAD_6BTN);
 	PicoDrawSetOutBuf(video_buffer, 512 * sizeof(uint16_t));
+	PsndRerate(0);
 
-	if (PicoLoadMedia("romfile.md", NULL, NULL, NULL, PM_MD_CART) != PM_MD_CART)
-		return 0;
 	PicoDrawSetOutFormat(PDF_RGB555, 0); // TODO: what is "use_32x_line_mode"?
 	PicoPower();
 
 	return 1;
 }
 
-typedef struct
-{
-	FrameInfo b;
-} MyFrameInfo;
-
-static void Blit(const uint16_t *src, FrameInfo *f)
+static void Blit(void)
 {
+	const uint16_t *src = video_buffer;
+	FrameInfo *f = &current_frame->b;
 	f->Width = video_width;
 	f->Height = video_line_count;
 	uint8_t *dst = (uint8_t *)f->VideoBuffer;
 	src += 512 * video_start_line;
-	if (video_width == 256)
-		src += 32;
 
 	for (int j = 0; j < video_line_count; j++)
 	{
@@ -128,10 +146,10 @@ static void Blit(const uint16_t *src, FrameInfo *f)
 
 ECL_EXPORT void FrameAdvance(MyFrameInfo *f)
 {
-	PicoLoopPrepare();
+	current_frame = f;
 	PicoFrame();
-	Blit(video_buffer, &f->b);
-	f->b.Samples = 735; // TODO
+	Blit();
+	current_frame = NULL;
 }
 
 static uint8_t dumbo[16];
diff --git a/waterbox/picodrive/pico/pico.h b/waterbox/picodrive/pico/pico.h
index efa8e1d9cb..9a4e2b8f70 100644
--- a/waterbox/picodrive/pico/pico.h
+++ b/waterbox/picodrive/pico/pico.h
@@ -49,7 +49,6 @@ extern void *p32x_bios_g, *p32x_bios_m, *p32x_bios_s;
 #define POPT_EN_MCD_CDDA    (1<<11)
 #define POPT_EN_MCD_GFX     (1<<12) // 00 x000
 // unused                   (1<<13)
-#define POPT_EN_SOFTSCALE   (1<<14)
 #define POPT_EN_MCD_RAMCART (1<<15)
 #define POPT_DIS_VDP_FIFO   (1<<16) // 0x 0000
 #define POPT_EN_DRC         (1<<17)