diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c
index 20d198031863bf833a26c4b8d597c31997306c6b..6ba2457c3b303bd912b3758b3ea9cee49dea7272 100644
--- a/src/conio/bitmap_con.c
+++ b/src/conio/bitmap_con.c
@@ -1164,3 +1164,14 @@ static int update_rect(int sx, int sy, int width, int height, int force)
 
 	return(0);
 }
+
+int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour)
+{
+	pthread_mutex_lock(&screenlock);
+	screen[PIXEL_OFFSET(x, y)]=colour;
+	pthread_mutex_unlock(&screenlock);
+	pthread_mutex_lock(&vstatlock);
+	send_rectangle(&vstat, x, y, 1, 1, 1);
+	pthread_mutex_unlock(&vstatlock);
+	return 1;
+}
diff --git a/src/conio/bitmap_con.h b/src/conio/bitmap_con.h
index 49844acdbd0ecba7ddf3027b3bfbe5c2ecb0b5d6..7e450d569e27ef9519d5c9d79da03804627df0ed 100644
--- a/src/conio/bitmap_con.h
+++ b/src/conio/bitmap_con.h
@@ -32,5 +32,6 @@ void bitmap_setvideoflags(int flags);
 void bitmap_setscaling(int new_value);
 int bitmap_getscaling(void);
 int bitmap_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp);
+int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour);
 
 #endif
diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c
index d86f6cceb8772d667ff2d36641d98445c149c2e4..a288d3e05e889c8d255fb7e01b46d0ba066f8046 100644
--- a/src/conio/ciolib.c
+++ b/src/conio/ciolib.c
@@ -124,6 +124,7 @@ CIOLIBEXPORT int CIOLIBCALL ciolib_setpalette(uint32_t entry, uint16_t r, uint16
 CIOLIBEXPORT int CIOLIBCALL ciolib_cputch(uint32_t fg_palette, uint32_t bg_palette, int a);
 CIOLIBEXPORT int CIOLIBCALL ciolib_ccputs(uint32_t fg_palette, uint32_t bg_palette, const char *str);
 CIOLIBEXPORT int CIOLIBCALL ciolib_attr2palette(uint8_t attr, uint32_t *fg, uint32_t *bg);
+CIOLIBEXPORT int CIOLIBCALL ciolib_setpixel(uint32_t x, uint32_t y, uint32_t colour);
 
 #if defined(WITH_SDL) || defined(WITH_SDL_AUDIO)
 int sdl_video_initialized = 0;
@@ -172,6 +173,7 @@ int try_sdl_init(int mode)
 		cio_api.getscaling=sdl_getscaling;
 		cio_api.setpalette=sdl_setpalette;
 		cio_api.attr2palette=bitmap_attr2palette;
+		cio_api.setpixel=bitmap_setpixel;
 		return(1);
 	}
 	return(0);
@@ -221,6 +223,7 @@ int try_x_init(int mode)
 		cio_api.getscaling=bitmap_getscaling;
 		cio_api.setpalette=x_setpalette;
 		cio_api.attr2palette=bitmap_attr2palette;
+		cio_api.setpixel=bitmap_setpixel;
 		return(1);
 	}
 	return(0);
@@ -1741,3 +1744,12 @@ CIOLIBEXPORT int CIOLIBCALL ciolib_attr2palette(uint8_t attr, uint32_t *fg, uint
 	 */
 	return -1;
 }
+
+CIOLIBEXPORT int CIOLIBCALL ciolib_setpixel(uint32_t x, uint32_t y, uint32_t colour)
+{
+	CIOLIB_INIT();
+
+	if (cio_api.setpixel)
+		return cio_api.setpixel(x, y, colour);
+	return 0;
+}
diff --git a/src/conio/ciolib.h b/src/conio/ciolib.h
index 76b20f1199094fead6bd4aaf77b7c738879411ec..ebb2ec9caf1497b7ecebbfb42dfc34aa5368e134 100644
--- a/src/conio/ciolib.h
+++ b/src/conio/ciolib.h
@@ -318,6 +318,7 @@ typedef struct {
 	int		*ESCDELAY;
 	int		(*setpalette)	(uint32_t entry, uint16_t r, uint16_t g, uint16_t b);
 	int		(*attr2palette)	(uint8_t attr, uint32_t *fg, uint32_t *bg);
+	int		(*setpixel)	(uint32_t x, uint32_t y, uint32_t colour);
 } cioapi_t;
 
 CIOLIBEXPORTVAR cioapi_t cio_api;
@@ -392,6 +393,7 @@ CIOLIBEXPORT void CIOLIBCALL ciolib_setscaling(int flags);
 CIOLIBEXPORT int CIOLIBCALL ciolib_getscaling(void);
 CIOLIBEXPORT int CIOLIBCALL ciolib_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b);
 CIOLIBEXPORT int CIOLIBCALL ciolib_attr2palette(uint8_t attr, uint32_t *fg, uint32_t *bg);
+CIOLIBEXPORT int CIOLIBCALL ciolib_setpixel(uint32_t x, uint32_t y, uint32_t colour);
 
 /* DoorWay specific stuff that's only applicable to ANSI mode. */
 CIOLIBEXPORT void CIOLIBCALL ansi_ciolib_setdoorway(int enable);
@@ -459,6 +461,7 @@ CIOLIBEXPORT void CIOLIBCALL ansi_ciolib_setdoorway(int enable);
 	#define getscaling()			ciolib_getscaling()
 	#define setpalette(e,r,g,b)		ciolib_setpalette(e,r,g,b)
 	#define attr2palette(a,b,c)		ciolib_attr2palette(a,b,c)
+	#define setpixel(a,b,c)			ciolib_setpixel(a,b,c)
 #endif
 
 #ifdef WITH_SDL