[Scummvm-git-logs] scummvm master -> 15602e77c7ac729667fff4d440e15e7f490e9edd

sev- noreply at scummvm.org
Wed Apr 24 22:42:40 UTC 2024


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
15602e77c7 CHAMBERS: Refactor code for HGA compatibility


Commit: 15602e77c7ac729667fff4d440e15e7f490e9edd
    https://github.com/scummvm/scummvm/commit/15602e77c7ac729667fff4d440e15e7f490e9edd
Author: yigithanyigit (yigit at Yigithans-MacBook-Pro.local)
Date: 2024-04-25T00:42:36+02:00

Commit Message:
CHAMBERS: Refactor code for HGA compatibility

Refactor the existing CGA rendering code to make it compatible with HGA rendering. The main changes include the introduction of engine variables and a move away from macros.

Changed paths:
    engines/chamber/anim.cpp
    engines/chamber/bkbuff.cpp
    engines/chamber/cga.cpp
    engines/chamber/cga.h
    engines/chamber/chamber.cpp
    engines/chamber/chamber.h
    engines/chamber/cursor.cpp
    engines/chamber/dialog.cpp
    engines/chamber/input.cpp
    engines/chamber/invent.cpp
    engines/chamber/kult.cpp
    engines/chamber/portrait.cpp
    engines/chamber/print.cpp
    engines/chamber/room.cpp
    engines/chamber/script.cpp


diff --git a/engines/chamber/anim.cpp b/engines/chamber/anim.cpp
index 54d050e25c6..5c249123656 100644
--- a/engines/chamber/anim.cpp
+++ b/engines/chamber/anim.cpp
@@ -132,7 +132,7 @@ void copyScreenBlockWithDotEffect(byte *source, byte x, byte y, byte width, byte
 void animDrawSprite(byte x, byte y, byte sprw, byte sprh, byte *pixels, uint16 pitch) {
 	uint16 delay;
 	byte ex, ey, updx, updy, updw, updh;
-	uint16 ofs = cga_CalcXY_p(x, y);
+	uint16 ofs = CalcXY_p(x, y);
 	cga_BackupImage(backbuffer, ofs, sprw, sprh, sprit_load_buffer);
 	cga_BlitSprite(pixels, pitch, sprw, sprh, backbuffer, ofs);
 	ex = x + sprw;
@@ -152,7 +152,7 @@ void animDrawSprite(byte x, byte y, byte sprw, byte sprh, byte *pixels, uint16 p
 	}
 	updw = ex - updx;
 	updh = ey - updy;
-	ofs = cga_CalcXY_p(updx, updy);
+	ofs = CalcXY_p(updx, updy);
 	/*TODO looks like here was some code before*/
 	for (delay = 0; delay < anim_draw_delay; delay++) {
 		g_system->delayMillis(1000 / 16 / 25);
@@ -175,7 +175,7 @@ void animDrawSprite(byte x, byte y, byte sprw, byte sprh, byte *pixels, uint16 p
 }
 
 void animUndrawSprite(void) {
-	cga_CopyScreenBlock(backbuffer, last_anim_width, last_anim_height, CGA_SCREENBUFFER, cga_CalcXY_p(last_anim_x, last_anim_y));
+	cga_CopyScreenBlock(backbuffer, last_anim_width, last_anim_height, CGA_SCREENBUFFER, CalcXY_p(last_anim_x, last_anim_y));
 	last_anim_height = 0;
 }
 
diff --git a/engines/chamber/bkbuff.cpp b/engines/chamber/bkbuff.cpp
index db6b7057b97..2b44edbf0c3 100644
--- a/engines/chamber/bkbuff.cpp
+++ b/engines/chamber/bkbuff.cpp
@@ -24,7 +24,7 @@
 namespace Chamber {
 
 
-byte backbuffer[0x4000];
+byte backbuffer[0xB800]; ///< CGA: 0x4000, HGS: 0xB800
 
 } // End of namespace Chamber
 
diff --git a/engines/chamber/cga.cpp b/engines/chamber/cga.cpp
index 464662e0d5d..3d08b00320c 100644
--- a/engines/chamber/cga.cpp
+++ b/engines/chamber/cga.cpp
@@ -28,36 +28,9 @@
 #include "chamber/resdata.h"
 #include "chamber/cga.h"
 
-namespace Chamber {
+#include "common/debug.h"
 
-#if 0
-#define HGA_WIDTH 720
-#define HGA_HEIGHT 348
-#define HGA_BASE_SEG 0xB000
-#define HGA_PAGE2_SEG 0xB800
-#define HGA_NEXT_LINES_OFS 0x2000
-#define HGA_BITS_PER_PIXEL 1
-#define HGA_PIXELS_PER_BYTE (8 / HGA_BITS_PER_PIXEL)
-#define HGA_BYTES_PER_LINE (HGA_WIDTH / HGA_PIXELS_PER_BYTE)
-#define HGA_CALCXY_RAW(x, y) ( ((y) % 4) * HGA_NEXT_LINES_OFS + ((y) / 4) * HGA_BYTES_PER_LINE + (x) / HGA_PIXELS_PER_BYTE )
-#define HGA_CENTERED_BASE_OFS HGA_CALCXY_RAW(32, 76)
-#ifdef __386__
-#define HGA_SCREENBUFFER ((byte*)(HGA_BASE_SEG * 16))
-#define HGA_BACKBUFFER ((byte*)(HGA_PAGE2_SEG * 16))
-#else
-#define HGA_SCREENBUFFER ((byte*)MK_FP(HGA_BASE_SEG, 0))
-#define HGA_BACKBUFFER ((byte*)MK_FP(HGA_PAGE2_SEG, 0))
-#endif
-#define HGA_FONT_HEIGHT 6
-#define frontbuffer HGA_SCREENBUFFER
-#define backbuffer HGA_BACKBUFFER
-/* Calc screen offset from normal pixel coordinates
-Out:
-  screen offset
-*/
-uint16 HGA_CalcXY(uint16 x, uint16 y) {
-	return HGA_CalcXY_p(x / 4, y);
-}
+namespace Chamber {
 
 /* Calc screen offset from packed pixel coordinates
 Out:
@@ -79,11 +52,19 @@ uint16 HGA_CalcXY_p(uint16 x, uint16 y) {
 #endif
 	 return ofs;
 }
-#endif
 
-extern byte backbuffer[0x4000];
-byte CGA_SCREENBUFFER[0x4000];
-byte scrbuffer[320*200];
+
+/* Calc screen offset from normal pixel coordinates
+Out:
+  screen offset
+*/
+uint16 HGA_CalcXY(uint16 x, uint16 y) {
+	return HGA_CalcXY_p(x / 4, y);
+}
+
+extern byte backbuffer[0xB800]; ///< CGA: 0x4000, HGS: 0xB800
+byte CGA_SCREENBUFFER[0xB800];
+byte scrbuffer[720*348];		///< Screen buffer for blitting, it is intentionally left larger instead of dynamic memory allocation
 
 extern byte *scratch_mem2;
 
@@ -166,44 +147,51 @@ void cga_ColorSelect(byte csel) {
 
 void cga_blitToScreen(int16 dx, int16 dy, int16 w, int16 h) {
 	dx = dy = 0;
-	w = 320; h = 200;
-	// Align x by 4
-	int16 align = dx & 0x3;
+	w = g_vm->_screenW; h = g_vm->_screenH;
+
+	int16 align = dx & (0x8 / g_vm->_screenBits - 1);
 
 	dx -= align;
 	w += align;
 
-	if (dy + h >= 200)
-		h = 200 - dy;
+	if (dy + h >= g_vm->_screenH)
+		h = g_vm->_screenH - dy;
 
-	if (dx + w >= 320)
-		w = 320 - dx;
+	if (dx + w >= g_vm->_screenW)
+		w = g_vm->_screenW - dx;
 
-	w = (w + 3) / 4;
+	w = (w + (0x8 / g_vm->_screenBits - 1)) / (0x8 / g_vm->_screenBits);
 
 	for (int16 y = 0; y < h; y++) {
-		byte *src = CGA_SCREENBUFFER + cga_CalcXY(dx, dy + y);
-		byte *dst = scrbuffer + (y + dy) * 320 + dx;
+		byte *src = CGA_SCREENBUFFER + CalcXY(dx, dy + y);
+		byte *dst = scrbuffer + (y + dy) * g_vm->_screenW + dx;
 
 		for (int16 x = 0; x < w; x++) {
 			byte colors = *src++;
-
-			for (int16 c = 0; c < 4; c++) {
-				byte color = (colors & 0xC0) >> 6;
-				colors <<= 2;
-
-				*dst++ = color;
+			if (g_vm->_videoMode == Common::RenderMode::kRenderCGA) {
+				for (int16 c = 0; c < 4; c++) {
+					byte color = (colors & 0xC0) >> 6;
+					colors <<= 2;
+					*dst++ = color;
+				}
+			} else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG) {
+				for (int16 c = 0; c < 8; c++) {
+					byte color = (colors & 0x80) >> 7;
+					colors <<= 1;
+					*dst++ = color;
+				}
 			}
 		}
 	}
 
-	g_system->copyRectToScreen(scrbuffer + dy * 320 + dx, 320, dx, dy, w * 4, h);
+	g_system->copyRectToScreen(scrbuffer + dy * g_vm->_screenW + dx, g_vm->_screenW, dx, dy, w * (0x8 / g_vm->_screenBits), h);
 	g_system->updateScreen();
 }
 
 void cga_blitToScreen(int16 ofs, int16 w, int16 h) {
-	int16 dy = ofs / 80;
-	int16 dx = (ofs % 80) * 4;
+	uint16 byte_per_line = w / (0x8 / g_vm->_screenBits);
+	int16 dy = ofs / byte_per_line;
+	int16 dx = (ofs % byte_per_line) * (0x8 / g_vm->_screenBits);
 
 	cga_blitToScreen(dx, dy, w, h);
 }
@@ -211,7 +199,7 @@ void cga_blitToScreen(int16 ofs, int16 w, int16 h) {
 void cga_BackBufferToRealFull(void) {
 	memcpy(CGA_SCREENBUFFER, backbuffer, sizeof(backbuffer));
 
-	cga_blitToScreen(0, 0, 320, 200);
+	cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
 }
 
 void cga_RealBufferToBackFull(void) {
@@ -225,13 +213,13 @@ void cga_CopyScreenBlock(byte *source, uint16 w, uint16 h, byte *target, uint16
 	uint16 oofs = ofs;
 	while (h--) {
 		memcpy(target + ofs, source + ofs, w);
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 
 	if (target == CGA_SCREENBUFFER)
-		cga_blitToScreen(oofs, w * 4, oh);
+		cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
 }
 
 /*
@@ -249,7 +237,7 @@ void cga_SwapRealBackBuffer(void) {
 		*d++ = t;
 	}
 
-	cga_blitToScreen(0, 0, 320, 200);
+	cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
 }
 
 
@@ -266,13 +254,13 @@ void cga_SwapScreenRect(byte *pixels, uint16 w, uint16 h, byte *screen, uint16 o
 			*old++ = screen[ofs + i];
 			screen[ofs + i] = *pixels++;
 		}
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 
 	if (screen == CGA_SCREENBUFFER)
-		cga_blitToScreen(oofs, w * 4, oh);
+		cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
 }
 
 /*
@@ -281,7 +269,25 @@ Out:
   screen offset
 */
 uint16 cga_CalcXY(uint16 x, uint16 y) {
-	return cga_CalcXY_p(x / 4, y);
+	return CalcXY_p(x / 4, y);
+}
+
+uint16 CalcXY(uint16 x, uint16 y) {
+	if (g_vm->_videoMode == Common::RenderMode::kRenderCGA)
+		return cga_CalcXY(x, y);
+	else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG)
+		return HGA_CalcXY(x, y);
+	else
+		return 0;
+}
+
+uint16 CalcXY_p(uint16 x, uint16 y) {
+	if (g_vm->_videoMode == Common::RenderMode::kRenderCGA)
+		return cga_CalcXY_p(x, y);
+	else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG)
+		return HGA_CalcXY_p(x, y);
+	else
+		return 0;
 }
 
 /*
@@ -292,8 +298,8 @@ Out:
 uint16 cga_CalcXY_p(uint16 x, uint16 y) {
 	uint16 ofs = 0;
 	if (y & 1)
-		ofs += CGA_ODD_LINES_OFS;
-	ofs += CGA_BYTES_PER_LINE * (y / 2);
+		ofs += g_vm->_line_offset;
+	ofs += g_vm->_screenBPL * (y / 2);
 	ofs += x;
 	return ofs;
 }
@@ -311,9 +317,9 @@ byte *cga_BackupImage(byte *screen, uint16 ofs, uint16 w, uint16 h, byte *buffer
 	while (h--) {
 		memcpy(buffer, screen + ofs, w);
 		buffer += w;
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 	return buffer;
 }
@@ -332,13 +338,13 @@ void cga_Blit(byte *pixels, uint16 pw, uint16 w, uint16 h, byte *screen, uint16
 	for (int16 y = 0; y < h; y++) {
 		memcpy(screen + ofs, src, w);
 		src += pw;
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 
 	if (screen == CGA_SCREENBUFFER)
-		cga_blitToScreen(oofs, w * 4, h);
+		cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), h);
 }
 
 /*
@@ -354,13 +360,13 @@ void cga_Fill(byte pixel, uint16 w, uint16 h, byte *screen, uint16 ofs) {
 	uint16 oofs = ofs;
 	for (int16 y = 0; y < h; y++) {
 		memset(screen + ofs, pixel, w);
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 
 	if (screen == CGA_SCREENBUFFER)
-		cga_blitToScreen(oofs, w * 4, h);
+		cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), h);
 }
 
 void cga_FillAndWait(byte pixel, uint16 w, uint16 h, byte *screen, uint16 ofs) {
@@ -416,21 +422,26 @@ NB! Line must not wrap around the edge
 */
 void cga_DrawVLine(uint16 x, uint16 y, uint16 l, byte color, byte *target) {
 	uint16 ofs;
+	uint16 mask = 0;
 	/*pixels are starting from top bits of byte*/
-	uint16 mask = static_cast<uint16>((~(3 << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL))) & 0xffff);
-	byte pixel = color << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL);
+	if (g_vm->_videoMode == Common::RenderMode::kRenderCGA){
+		mask = static_cast<uint16>((~(3 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+	} else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG) {
+		mask = static_cast<uint16>((~(1 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+	}
+	byte pixel = color << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB);
 
-	mask >>= (x % CGA_PIXELS_PER_BYTE) * CGA_BITS_PER_PIXEL;
-	pixel >>= (x % CGA_PIXELS_PER_BYTE) * CGA_BITS_PER_PIXEL;
+	mask >>= (x % g_vm->_screenPPB) * g_vm->_screenPPB;
+	pixel >>= (x % g_vm->_screenPPB) * g_vm->_screenPPB;
 
-	ofs = cga_CalcXY_p(x / CGA_PIXELS_PER_BYTE, y);
+	ofs = CalcXY_p(x / g_vm->_screenPPB, y);
 
 	uint16 ol = l;
 	while (l--) {
 		target[ofs] = (target[ofs] & mask) | pixel;
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 
 	if (target == CGA_SCREENBUFFER)
@@ -443,23 +454,34 @@ NB! Line must not wrap around the edge
 */
 void cga_DrawHLine(uint16 x, uint16 y, uint16 l, byte color, byte *target) {
 	uint16 ofs;
+	uint16 mask = 0;
 	/*pixels are starting from top bits of byte*/
-	uint16 mask = static_cast<uint16>((~(3 << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL))) & 0xffff);
-	byte pixel = color << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL);
+	if (g_vm->_videoMode == Common::RenderMode::kRenderCGA){
+		mask = static_cast<uint16>((~(3 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+	} else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG) {
+		mask = static_cast<uint16>((~(1 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+	}
+
+	byte pixel = color << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB);
 
-	mask >>= (x % CGA_PIXELS_PER_BYTE) * CGA_BITS_PER_PIXEL;
-	pixel >>= (x % CGA_PIXELS_PER_BYTE) * CGA_BITS_PER_PIXEL;
+	mask >>= (x % g_vm->_screenPPB) * g_vm->_screenPPB;
+	pixel >>= (x % g_vm->_screenPPB) * g_vm->_screenPPB;
+
+	ofs = CalcXY_p(x / g_vm->_screenPPB, y);
 
-	ofs = cga_CalcXY_p(x / CGA_PIXELS_PER_BYTE, y);
 	uint16 ol = l;
 	while (l--) {
 		target[ofs] = (target[ofs] & mask) | pixel;
-		mask >>= CGA_BITS_PER_PIXEL;
-		pixel >>= CGA_BITS_PER_PIXEL;
+		mask >>= g_vm->_screenPPB;
+		pixel >>= g_vm->_screenPPB;
 		if (mask == 0xFF) {
 			ofs++;
-			mask = static_cast<uint16>((~(3 << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL))) & 0xffff);
-			pixel = color << ((CGA_PIXELS_PER_BYTE - 1) * CGA_BITS_PER_PIXEL);
+			if (g_vm->_videoMode == Common::RenderMode::kRenderCGA){
+				mask = static_cast<uint16>((~(3 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+			} else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG) {
+				mask = static_cast<uint16>((~(1 << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB))) & 0xffff);
+			}
+			pixel = color << ((g_vm->_screenPPB - 1) * g_vm->_screenPPB);
 		}
 	}
 	if (target == CGA_SCREENBUFFER)
@@ -476,9 +498,9 @@ uint16 cga_DrawHLineWithEnds(uint16 bmask, uint16 bpix, byte color, uint16 l, by
 	memset(target + ofs + 1, color, l);
 	target[ofs + 1 + l] = (target[ofs + 1 + l] & (bmask & 255)) | (bpix & 255);
 	uint16 oofs = ofs;
-	ofs ^= CGA_ODD_LINES_OFS;
-	if ((ofs & CGA_ODD_LINES_OFS) == 0)
-		ofs += CGA_BYTES_PER_LINE;
+	ofs ^= g_vm->_line_offset;
+	if ((ofs & g_vm->_line_offset) == 0)
+		ofs += g_vm->_screenBPL;
 
 	if (target == CGA_SCREENBUFFER)
 		cga_blitToScreen(oofs, l * 4 + 2, 1);
@@ -491,19 +513,19 @@ Print a character at current cursor pos, then advance
 */
 void cga_PrintChar(byte c, byte *target) {
 	uint16 i;
-	byte *font = carpc_data + c * CGA_FONT_HEIGHT;
-	uint16 ofs = cga_CalcXY_p(char_draw_coords_x++, char_draw_coords_y);
-	for (i = 0; i < CGA_FONT_HEIGHT; i++) {
+	byte *font = carpc_data + c * g_vm->_fontHeight;
+	uint16 ofs = cga_CalcXY_p(char_draw_coords_x++, char_draw_coords_y); // TODO: hga_calcxy_p doesnt work with this??
+	for (i = 0; i < g_vm->_fontHeight; i++) {
 		c = *font++;
 		c = char_xlat_table[c];
 		target[ofs] = c;
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 
 	if (target == CGA_SCREENBUFFER)
-		cga_blitToScreen((char_draw_coords_x - 1) * 4, char_draw_coords_y, 4, CGA_FONT_HEIGHT);
+		cga_blitToScreen((char_draw_coords_x - 1) * g_vm->_fontWidth, char_draw_coords_y,  g_vm->_fontWidth, g_vm->_fontHeight);
 }
 
 
@@ -521,13 +543,13 @@ void cga_BlitScratchBackSprite(uint16 sprofs, uint16 w, uint16 h, byte *screen,
 		for (x = 0; x < w; x++)
 			screen[ofs + x] = (backbuffer[ofs + x] & pixels[x * 2]) | pixels[x * 2 + 1];
 		pixels += w * 2;
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 
 	if (screen == CGA_SCREENBUFFER)
-		cga_blitToScreen(oofs, w * 4, oh);
+		cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
 }
 
 void cga_BlitFromBackBuffer(byte w, byte h, byte *screen, uint16 ofs) {
@@ -546,13 +568,13 @@ void cga_BlitSprite(byte *pixels, int16 pw, uint16 w, uint16 h, byte *screen, ui
 		for (x = 0; x < w; x++)
 			screen[ofs + x] = (screen[ofs + x] & pixels[x * 2]) | pixels[x * 2 + 1];
 		pixels += pw;
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 
 	if (screen == CGA_SCREENBUFFER)
-		cga_blitToScreen(oofs, w * 4, oh);
+		cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
 }
 
 /*
@@ -567,13 +589,13 @@ void cga_BlitSpriteFlip(byte *pixels, int16 pw, uint16 w, uint16 h, byte *screen
 		for (x = 0; x < w; x++)
 			screen[ofs - x] = (screen[ofs - x] & cga_pixel_flip[pixels[x * 2]]) | cga_pixel_flip[pixels[x * 2 + 1]];
 		pixels += pw;
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 
 	if (screen == CGA_SCREENBUFFER)
-		cga_blitToScreen(oofs, w * 4, oh);
+		cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
 }
 
 /*
@@ -594,13 +616,13 @@ void cga_BlitSpriteBak(byte *pixels, int16 pw, uint16 w, uint16 h, byte *screen,
 			screen[ofs + x] = (screen[ofs + x] & pixels[x * 2 + 1]) | (pixels[x * 2] & mask);
 		}
 		pixels += pw * 2;
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 
 	if (screen == CGA_SCREENBUFFER)
-		cga_blitToScreen(oofs, w * 4, oh);
+		cga_blitToScreen(oofs, w * (0x8 / g_vm->_screenBits), oh);
 }
 
 
@@ -734,7 +756,7 @@ void drawSpriteN(byte index, uint16 x, uint16 y, byte *target) {
 	uint16 ofs;
 	byte *sprite;
 	sprite = loadSprit(index);
-	ofs = cga_CalcXY_p(x, y);
+	ofs = CalcXY_p(x, y);
 	drawSprite(sprite, target, ofs);
 }
 
@@ -742,7 +764,7 @@ void drawSpriteNFlip(byte index, uint16 x, uint16 y, byte *target) {
 	uint16 ofs;
 	byte *sprite;
 	sprite = loadSprit(index);
-	ofs = cga_CalcXY_p(x, y);
+	ofs = CalcXY_p(x, y);
 	drawSpriteFlip(sprite, target, ofs);
 }
 
@@ -750,7 +772,7 @@ void backupAndShowSprite(byte index, byte x, byte y) {
 	byte w, h;
 	uint16 ofs;
 	byte *sprite = loadSprit(index);
-	ofs = cga_CalcXY_p(x, y);
+	ofs = CalcXY_p(x, y);
 	w = sprite[0];
 	h = sprite[1];
 	cga_BackupImageReal(ofs, w, h);
@@ -824,9 +846,9 @@ void cga_HideScreenBlockLiftToDown(uint16 n, byte *screen, byte *source, uint16
 		sofs = ofs;
 		tofs = ofs;
 
-		tofs ^= CGA_ODD_LINES_OFS;
-		if ((tofs & CGA_ODD_LINES_OFS) == 0)
-			tofs += CGA_BYTES_PER_LINE;
+		tofs ^= g_vm->_line_offset;
+		if ((tofs & g_vm->_line_offset) == 0)
+			tofs += g_vm->_screenBPL;
 
 		/*shift whole block 1 line*/
 		for (i = 0; i < h; i++) {
@@ -837,23 +859,23 @@ void cga_HideScreenBlockLiftToDown(uint16 n, byte *screen, byte *source, uint16
 			tofs = sofs;
 
 			/*go 1 line up*/
-			sofs ^= CGA_ODD_LINES_OFS;
-			if ((sofs & CGA_ODD_LINES_OFS) != 0)
-				sofs -= CGA_BYTES_PER_LINE;
+			sofs ^= g_vm->_line_offset;
+			if ((sofs & g_vm->_line_offset) != 0)
+				sofs -= g_vm->_screenBPL;
 		}
 
 		/*fill just freed line with new pixels*/
 		memcpy(target + tofs, source + tofs, w);
 
 		if (screen == CGA_SCREENBUFFER) {
-			cga_blitToScreen(0, 0, 320, 200);
+			cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenW);
 		}
 
 		waitVBlank();
 
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
 }
 
@@ -869,9 +891,9 @@ void cga_HideScreenBlockLiftToUp(uint16 n, byte *screen, byte *source, uint16 w,
 		sofs = ofs;
 		tofs = ofs;
 
-		tofs ^= CGA_ODD_LINES_OFS;
-		if ((tofs & CGA_ODD_LINES_OFS) != 0)
-			tofs -= CGA_BYTES_PER_LINE;
+		tofs ^= g_vm->_line_offset;
+		if ((tofs & g_vm->_line_offset) != 0)
+			tofs -= g_vm->_screenBPL;
 
 		/*shift whole block 1 line*/
 		for (i = 0; i < h; i++) {
@@ -882,23 +904,23 @@ void cga_HideScreenBlockLiftToUp(uint16 n, byte *screen, byte *source, uint16 w,
 			tofs = sofs;
 
 			/*go 1 line down*/
-			sofs ^= CGA_ODD_LINES_OFS;
-			if ((sofs & CGA_ODD_LINES_OFS) == 0)
-				sofs += CGA_BYTES_PER_LINE;
+			sofs ^= g_vm->_line_offset;
+			if ((sofs & g_vm->_line_offset) == 0)
+				sofs += g_vm->_screenBPL;
 		}
 
 		/*fill just freed line with new pixels*/
 		memcpy(target + tofs, source + tofs, w);
 
 		if (screen == CGA_SCREENBUFFER) {
-			cga_blitToScreen(0, 0, 320, 200);
+			cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
 		}
 
 		waitVBlank();
 
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) != 0)
-			ofs -= CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) != 0)
+			ofs -= g_vm->_screenBPL;
 	}
 }
 
@@ -924,13 +946,13 @@ void cga_HideScreenBlockLiftToLeft(uint16 n, byte *screen, byte *source, uint16
 			memcpy(target + tofs + w, source + tofs + w, 1);
 
 			/*go 1 line down*/
-			sofs ^= CGA_ODD_LINES_OFS;
-			if ((sofs & CGA_ODD_LINES_OFS) == 0)
-				sofs += CGA_BYTES_PER_LINE;
+			sofs ^= g_vm->_line_offset;
+			if ((sofs & g_vm->_line_offset) == 0)
+				sofs += g_vm->_screenBPL;
 		}
 
 		if (screen == CGA_SCREENBUFFER) {
-			cga_blitToScreen(0, 0, 320, 200);
+			cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
 		}
 
 		waitVBlank();
@@ -961,13 +983,13 @@ void cga_HideScreenBlockLiftToRight(uint16 n, byte *screen, byte *source, uint16
 			memcpy(target + tofs - w, source + tofs - w, 1);
 
 			/*go 1 line down*/
-			sofs ^= CGA_ODD_LINES_OFS;
-			if ((sofs & CGA_ODD_LINES_OFS) == 0)
-				sofs += CGA_BYTES_PER_LINE;
+			sofs ^= g_vm->_line_offset;
+			if ((sofs & g_vm->_line_offset) == 0)
+				sofs += g_vm->_screenBPL;
 		}
 
 		if (screen == CGA_SCREENBUFFER) {
-			cga_blitToScreen(0, 0, 320, 200);
+			cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
 		}
 
 		waitVBlank();
@@ -1017,19 +1039,19 @@ static void screenToPieces(byte width, byte height, byte *screen, uint16 offs, s
 			if (pieces->delay == 0) /*ensure piece is alive*/
 				pieces->delay = 1;
 			pieces->pix0 = screen[bofs];
-			pieces->pix2 = screen[bofs + CGA_BYTES_PER_LINE];
+			pieces->pix2 = screen[bofs + g_vm->_screenBPL];
 
-			bofs ^= CGA_ODD_LINES_OFS;
-			if ((bofs & CGA_ODD_LINES_OFS) == 0)
-				bofs += CGA_BYTES_PER_LINE;
+			bofs ^= g_vm->_line_offset;
+			if ((bofs & g_vm->_line_offset) == 0)
+				bofs += g_vm->_screenBPL;
 			pieces->pix1 = screen[bofs];
-			pieces->pix3 = screen[bofs + CGA_BYTES_PER_LINE];
+			pieces->pix3 = screen[bofs + g_vm->_screenBPL];
 			pieces++;
 
 			if (delays >= piecedelays + ARRAYSIZE(piecedelays))
 				delays = piecedelays;
 		}
-		offs += CGA_BYTES_PER_LINE * 2; /*4 lines down*/
+		offs += g_vm->_screenBPL * 2; /*4 lines down*/
 	}
 	pieces->offs = 0;   /*end of list*/
 }
@@ -1045,17 +1067,17 @@ static void fallPieces(scrpiece_t *pieces, byte *source, byte *target) {
 				uint16 bofs = offs;
 				if (target[bofs] == piece->pix0)
 					target[bofs] = source[bofs];
-				if (target[bofs + CGA_BYTES_PER_LINE] == piece->pix2)
-					target[bofs + CGA_BYTES_PER_LINE] = source[bofs + CGA_BYTES_PER_LINE];
+				if (target[bofs + g_vm->_screenBPL] == piece->pix2)
+					target[bofs + g_vm->_screenBPL] = source[bofs + g_vm->_screenBPL];
 
-				bofs ^= CGA_ODD_LINES_OFS;
-				if ((bofs & CGA_ODD_LINES_OFS) == 0)
-					bofs += CGA_BYTES_PER_LINE;
+				bofs ^= g_vm->_line_offset;
+				if ((bofs & g_vm->_line_offset) == 0)
+					bofs += g_vm->_screenBPL;
 
 				if (target[bofs] == piece->pix1)
 					target[bofs] = source[bofs];
-				if (target[bofs + CGA_BYTES_PER_LINE] == piece->pix3)
-					target[bofs + CGA_BYTES_PER_LINE] = source[bofs + CGA_BYTES_PER_LINE];
+				if (target[bofs + g_vm->_screenBPL] == piece->pix3)
+					target[bofs + g_vm->_screenBPL] = source[bofs + g_vm->_screenBPL];
 
 				/*dead?*/
 				if (piece->delay == 0)
@@ -1064,32 +1086,32 @@ static void fallPieces(scrpiece_t *pieces, byte *source, byte *target) {
 				/*fall n lines*/
 				switch ((piece->delay & 3) + 1) {
 				case 1:
-					offs ^= CGA_ODD_LINES_OFS;
-					if ((offs & CGA_ODD_LINES_OFS) == 0)
-						offs += CGA_BYTES_PER_LINE;
+					offs ^= g_vm->_line_offset;
+					if ((offs & g_vm->_line_offset) == 0)
+						offs += g_vm->_screenBPL;
 					break;
 				case 2:
-					offs += CGA_BYTES_PER_LINE;
+					offs += g_vm->_screenBPL;
 					break;
 				case 3:
-					offs += CGA_BYTES_PER_LINE;
-					offs ^= CGA_ODD_LINES_OFS;
-					if ((offs & CGA_ODD_LINES_OFS) == 0)
-						offs += CGA_BYTES_PER_LINE;
+					offs += g_vm->_screenBPL;
+					offs ^= g_vm->_line_offset;
+					if ((offs & g_vm->_line_offset) == 0)
+						offs += g_vm->_screenBPL;
 					break;
 				case 4:
-					offs += CGA_BYTES_PER_LINE;
-					offs += CGA_BYTES_PER_LINE;
+					offs += g_vm->_screenBPL;
+					offs += g_vm->_screenBPL;
 					break;
 				}
 
 				/*extra 2 lines*/
-				offs += CGA_BYTES_PER_LINE;
+				offs += g_vm->_screenBPL;
 
 				piece->offs = offs;
 
 				/*past line 190?*/
-				if ((offs | CGA_ODD_LINES_OFS) >= ((190 / 2 * CGA_BYTES_PER_LINE) | CGA_ODD_LINES_OFS)) {
+				if ((offs | g_vm->_line_offset) >= ((190 / 2 * g_vm->_screenBPL) | g_vm->_line_offset)) {
 					piece->delay = 0;
 					continue;
 				}
@@ -1097,20 +1119,20 @@ static void fallPieces(scrpiece_t *pieces, byte *source, byte *target) {
 				bofs = offs;
 
 				target[bofs] = piece->pix0;
-				target[bofs + CGA_BYTES_PER_LINE] = piece->pix2;
+				target[bofs + g_vm->_screenBPL] = piece->pix2;
 
-				bofs ^= CGA_ODD_LINES_OFS;
-				if ((bofs & CGA_ODD_LINES_OFS) == 0)
-					bofs += CGA_BYTES_PER_LINE;
+				bofs ^= g_vm->_line_offset;
+				if ((bofs & g_vm->_line_offset) == 0)
+					bofs += g_vm->_screenBPL;
 
 				target[bofs] = piece->pix1;
-				target[bofs + CGA_BYTES_PER_LINE] = piece->pix3;
+				target[bofs + g_vm->_screenBPL] = piece->pix3;
 			}
 			again = 1;
 		}
 
 		if (target == CGA_SCREENBUFFER) {
-			cga_blitToScreen(0, 0, 320, 200);
+			cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
 		}
 
 		waitVBlank();
@@ -1149,8 +1171,18 @@ void cga_TraceLine(uint16 sx, uint16 ex, uint16 sy, uint16 ey, byte *source, byt
 	}
 	dy = h * 2;
 
-	ofs = cga_CalcXY_p(sx / 4, sy);
+	if (g_vm->_videoMode == Common::RenderMode::kRenderCGA) {
+		ofs = CalcXY_p(sx / 4, sy);
+		mask = 0xC0 >> ((sx % 4) * 2);
+	} else {
+		ofs = CalcXY_p(sx / 8, sy);
+		mask = 0x80 >> (sx % 8); // TODO: check this
+	}
+
+	/*
+	ofs = CalcXY_p(sx / 4, sy);
 	mask = 0xC0 >> ((sx % 4) * 2);
+	*/
 
 	val = dy + dx;
 
@@ -1161,13 +1193,13 @@ void cga_TraceLine(uint16 sx, uint16 ex, uint16 sy, uint16 ey, byte *source, byt
 	while (count--) {
 		if (val > 0) {
 			if (b1 == 0) {
-				ofs ^= CGA_ODD_LINES_OFS;
-				if ((ofs & CGA_ODD_LINES_OFS) == 0)
-					ofs += CGA_BYTES_PER_LINE;
+				ofs ^= g_vm->_line_offset;
+				if ((ofs & g_vm->_line_offset) == 0)
+					ofs += g_vm->_screenBPL;
 			} else {
-				ofs ^= CGA_ODD_LINES_OFS;
-				if ((ofs & CGA_ODD_LINES_OFS) != 0)
-					ofs -= CGA_BYTES_PER_LINE;
+				ofs ^= g_vm->_line_offset;
+				if ((ofs & g_vm->_line_offset) != 0)
+					ofs -= g_vm->_screenBPL;
 			}
 			val += dx;
 		} else {
@@ -1192,7 +1224,7 @@ void cga_TraceLine(uint16 sx, uint16 ex, uint16 sy, uint16 ey, byte *source, byt
 	}
 
 	if (target == CGA_SCREENBUFFER)
-		cga_blitToScreen(0, 0, 320, 200);
+		cga_blitToScreen(0, 0, g_vm->_screenW, g_vm->_screenH);
 }
 
 /*TODO: get rid of this structure and pass everything relevant as arguments?*/
@@ -1289,9 +1321,9 @@ static void cga_Zoom(zoom_t *params, byte tw, byte th, byte *source, byte *targe
 		/*ofs -= params->fw;*/
 		ofs = oofs;
 
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 
 		params->yval_l += params->ystep_l + ((params->yval_h + params->ystep_h) >> 8);
 		params->yval_h += params->ystep_h;
@@ -1358,9 +1390,9 @@ static void cga_ZoomOpt(zoom_t *params, byte tw, byte th, byte *source, byte *ta
 
 		ofs -= params->fw;
 
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 
 		yval += ystep;
 
@@ -1421,9 +1453,9 @@ void cga_AnimZoomOpt(zoom_t *zoom, uint16 w, uint16 h, byte steps, byte *target,
 		prev = yval;
 		yval += ystep;
 		if (((prev ^ yval) & 0xFF00) || ((yval & 0x100) == 0)) {
-			ofs ^= CGA_ODD_LINES_OFS;
-			if ((ofs & CGA_ODD_LINES_OFS) != 0)
-				ofs -= CGA_BYTES_PER_LINE;
+			ofs ^= g_vm->_line_offset;
+			if ((ofs & g_vm->_line_offset) != 0)
+				ofs -= g_vm->_screenBPL;
 		}
 
 		prev = xval;
@@ -1461,11 +1493,11 @@ void cga_AnimZoomIn(byte *pixels, byte w, byte h, byte *target, uint16 ofs) {
 	y = (h / 2) - 1;
 	ofs += x / 4;
 	if (y & 1) {
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 	}
-	ofs += (y / 2) * CGA_BYTES_PER_LINE;
+	ofs += (y / 2) * g_vm->_screenBPL;
 
 	maxside = w * 4;
 	if (maxside < h)
@@ -1533,9 +1565,9 @@ void cga_ZoomInplace(zoom_t *params, byte tw, byte th, byte *source, byte *targe
 		/*ofs -= params->fw;*/
 		ofs = oofs;
 
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 
 		params->yval_l += params->ystep_l + ((params->yval_h + params->ystep_h) >> 8);
 		params->yval_h += params->ystep_h;
@@ -1557,7 +1589,7 @@ void cga_ZoomInplaceXY(byte *pixels, byte w, byte h, byte nw, byte nh, uint16 x,
 	zoom.eh = h - 1;
 	zoom.xbase = x % 4;
 
-	cga_ZoomInplace(&zoom, nw, nh, target, target, cga_CalcXY(x, y));
+	cga_ZoomInplace(&zoom, nw, nh, target, target, CalcXY_p(x, y));
 }
 
-} // End of namespace Chamber
+} // End of namespace Chamber
\ No newline at end of file
diff --git a/engines/chamber/cga.h b/engines/chamber/cga.h
index 2abea7dde57..2a7da226e45 100644
--- a/engines/chamber/cga.h
+++ b/engines/chamber/cga.h
@@ -24,6 +24,33 @@
 
 namespace Chamber {
 
+// HGA Constants
+#define HGA_WIDTH 720
+#define HGA_HEIGHT 348
+#define HGA_BASE_SEG 0xB000
+#define HGA_PAGE2_SEG 0xB800
+#define HGA_NEXT_LINES_OFS 0x2000
+#define HGA_BITS_PER_PIXEL 1
+#define HGA_PIXELS_PER_BYTE (8 / HGA_BITS_PER_PIXEL)
+#define HGA_BYTES_PER_LINE (HGA_WIDTH / HGA_PIXELS_PER_BYTE)
+#define HGA_CALCXY_RAW(x, y) ( ((y) % 4) * HGA_NEXT_LINES_OFS + ((y) / 4) * HGA_BYTES_PER_LINE + (x) / HGA_PIXELS_PER_BYTE )
+#define HGA_CENTERED_BASE_OFS HGA_CALCXY_RAW(-76, 8)
+#ifdef __386__
+#define HGA_SCREENBUFFER ((byte*)(HGA_BASE_SEG * 16))
+#define HGA_BACKBUFFER ((byte*)(HGA_PAGE2_SEG * 16))
+#else
+#if 0
+#define HGA_SCREENBUFFER ((byte*)MK_FP(HGA_BASE_SEG, 0))
+#define HGA_BACKBUFFER ((byte*)MK_FP(HGA_PAGE2_SEG, 0))
+
+
+#define HGA_FONT_HEIGHT 6
+#define frontbuffer HGA_SCREENBUFFER
+#define backbuffer HGA_BACKBUFFER
+#endif
+#endif
+
+// CGA Constants
 #define CGA_WIDTH 320
 #define CGA_HEIGHT 200
 #define CGA_BASE_SEG 0xB800
@@ -32,7 +59,7 @@ namespace Chamber {
 #define CGA_PIXELS_PER_BYTE (8 / CGA_BITS_PER_PIXEL)
 #define CGA_BYTES_PER_LINE (CGA_WIDTH / CGA_PIXELS_PER_BYTE)
 
-extern byte CGA_SCREENBUFFER[0x4000];
+extern byte CGA_SCREENBUFFER[0xB800];
 
 #define CGA_FONT_HEIGHT 6
 
@@ -40,7 +67,7 @@ extern byte CGA_SCREENBUFFER[0x4000];
 #define CGA_PREV_LINE(offs) ((CGA_ODD_LINES_OFS ^ (offs)) - (((offs) & CGA_ODD_LINES_OFS) ? CGA_BYTES_PER_LINE : 0))
 
 #define frontbuffer CGA_SCREENBUFFER
-extern byte backbuffer[0x4000];
+extern byte backbuffer[0xB800]; ///< CGA: 0x4000, HGS: 0xB800
 
 extern byte sprit_load_buffer[1290];
 
@@ -67,6 +94,11 @@ void cga_SwapRealBackBuffer(void);
 
 void cga_SwapScreenRect(byte *pixels, uint16 w, uint16 h, byte *screen, uint16 ofs);
 
+uint16 CalcXY(uint16 x, uint16 y);
+uint16 CalcXY_p(uint16 x, uint16 y);
+
+uint16 HGA_CalcXY(uint16 x, uint16 y);
+uint16 HGA_CalcXY_p(uint16 x, uint16 y);
 uint16 cga_CalcXY(uint16 x, uint16 y);
 uint16 cga_CalcXY_p(uint16 x, uint16 y);
 
diff --git a/engines/chamber/chamber.cpp b/engines/chamber/chamber.cpp
index 7de8b19412a..4cb07272ccb 100644
--- a/engines/chamber/chamber.cpp
+++ b/engines/chamber/chamber.cpp
@@ -52,6 +52,11 @@ ChamberEngine::ChamberEngine(OSystem *syst, const ADGameDescription *desc)
 	_prioritycommand_1 = false;
 	_prioritycommand_2 = false;
 	_pxiData = NULL;
+	_videoMode = Common::kRenderCGA;
+	_screenH = _screenW = _screenBits = _screenBPL = _screenPPB = 0;
+	_line_offset = _line_offset2 = _fontHeight = _fontWidth = 0;
+
+
 
 	_speakerHandle = NULL;
 	_speakerStream = NULL;
diff --git a/engines/chamber/chamber.h b/engines/chamber/chamber.h
index 3a8e7830c4b..0c63e5e684d 100644
--- a/engines/chamber/chamber.h
+++ b/engines/chamber/chamber.h
@@ -25,6 +25,7 @@
 
 #include "common/random.h"
 #include "common/serializer.h"
+#include "common/rendermode.h"
 #include "engines/engine.h"
 #include "gui/debugger.h"
 
@@ -69,8 +70,21 @@ public:
 	bool _prioritycommand_1;
 	bool _prioritycommand_2;
 
+	Common::RenderMode _videoMode;
+
 	byte *_pxiData;
 
+	uint16 _screenW; ///< Screen Width
+	uint16 _screenH; ///< Screen Height
+	uint8 _screenBits; ///< Bits per pixel
+	uint16 _line_offset; ///< Memory offset of blanks
+	uint16 _line_offset2; ///< Memory offset of blanks
+	uint8 _screenPPB; ///< Pixels per byte
+	uint16 _screenBPL; ///< Bytes per line
+	uint8 _fontHeight; ///< Font height
+	uint8 _fontWidth; ///< Font height
+
+
 	Audio::PCSpeaker *_speakerStream;
 	Audio::SoundHandle *_speakerHandle;
 
diff --git a/engines/chamber/cursor.cpp b/engines/chamber/cursor.cpp
index e773e257405..5ee65824b28 100644
--- a/engines/chamber/cursor.cpp
+++ b/engines/chamber/cursor.cpp
@@ -66,7 +66,7 @@ Select cursor shape and its hotspot
 void selectCursor(uint16 num) {
 	cursor_x_shift = cursor_shifts[num][0];
 	cursor_y_shift = cursor_shifts[num][1];
-	cursor_shape = souri_data + num * CURSOR_WIDTH * CURSOR_HEIGHT * 2 / CGA_PIXELS_PER_BYTE;
+	cursor_shape = souri_data + num * CURSOR_WIDTH * CURSOR_HEIGHT * 2 / g_vm->_screenPPB;
 
 	byte *src = cursor_shape;
 	byte *dst = cursorImage;
diff --git a/engines/chamber/dialog.cpp b/engines/chamber/dialog.cpp
index b3ddf5cc1f2..97677e6c89c 100644
--- a/engines/chamber/dialog.cpp
+++ b/engines/chamber/dialog.cpp
@@ -104,7 +104,7 @@ void desciTextBox(uint16 x, uint16 y, uint16 width, byte *msg) {
 	draw_y = y;
 	char_draw_max_width = width;
 	cga_DrawTextBox(msg, frontbuffer);
-	addDirtyRect(DirtyRectText, draw_x, draw_y, char_draw_max_width + 2, char_draw_coords_y - draw_y + 8, cga_CalcXY_p(draw_x, draw_y));
+	addDirtyRect(DirtyRectText, draw_x, draw_y, char_draw_max_width + 2, char_draw_coords_y - draw_y + 8, CalcXY_p(draw_x, draw_y));
 }
 
 /*Draw dialog bubble with text and spike*/
@@ -123,7 +123,7 @@ void drawPersonBubble(byte x, byte y, byte flags, byte *msg) {
 	}
 
 	/*upper border*/
-	ofs = cga_CalcXY_p(x, y);
+	ofs = CalcXY_p(x, y);
 	ofs = cga_DrawHLineWithEnds(0xF00F,      0,    0, char_draw_max_width, CGA_SCREENBUFFER, ofs);
 	ofs = cga_DrawHLineWithEnds(0xC003, 0x0FF0, 0xFF, char_draw_max_width, CGA_SCREENBUFFER, ofs);
 	ofs = cga_DrawHLineWithEnds(0, 0x3FFC, 0xFF, char_draw_max_width, CGA_SCREENBUFFER, ofs);
@@ -140,7 +140,7 @@ void drawPersonBubble(byte x, byte y, byte flags, byte *msg) {
 		char_draw_coords_x = x;
 	}
 
-	ofs = cga_CalcXY_p(x, char_draw_coords_y);
+	ofs = CalcXY_p(x, char_draw_coords_y);
 	ofs = cga_DrawHLineWithEnds(0xC003, 0x0FF0, 0xFF, char_draw_max_width, CGA_SCREENBUFFER, ofs);
 	ofs = cga_DrawHLineWithEnds(0xF00F,      0,    0, char_draw_max_width, CGA_SCREENBUFFER, ofs);
 
@@ -150,32 +150,32 @@ void drawPersonBubble(byte x, byte y, byte flags, byte *msg) {
 	/*draw spike*/
 	switch (flags & SPIKE_MASK) {
 	case SPIKE_UPLEFT:  /*upper-left spike*/
-		ofs = cga_CalcXY_p(x + 1, y - 7);
+		ofs = CalcXY_p(x + 1, y - 7);
 		drawSpriteN(18, x + 1, y - 7, CGA_SCREENBUFFER);
 		break;
 	case SPIKE_UPRIGHT: /*upper-right spike*/
-		ofs = cga_CalcXY_p(x + char_draw_max_width, y - 7) - 1;
+		ofs = CalcXY_p(x + char_draw_max_width, y - 7) - 1;
 		drawSpriteNFlip(18, x + char_draw_max_width, y - 7, CGA_SCREENBUFFER);
 		break;
 	case SPIKE_DNRIGHT: /*lower-right spike*/
-		ofs = cga_CalcXY_p(x + char_draw_max_width, char_draw_coords_y + 1) - 1;
+		ofs = CalcXY_p(x + char_draw_max_width, char_draw_coords_y + 1) - 1;
 		drawSpriteNFlip(21, x + char_draw_max_width, char_draw_coords_y + 1, CGA_SCREENBUFFER);
 		break;
 	case SPIKE_DNLEFT:  /*lower-left spike*/
-		ofs = cga_CalcXY_p(x + 1, char_draw_coords_y + 1);
+		ofs = CalcXY_p(x + 1, char_draw_coords_y + 1);
 		drawSpriteN(21, x + 1, char_draw_coords_y + 1, CGA_SCREENBUFFER);
 		break;
 	case SPIKE_BUBRIGHT:    /*lower-right bubbles*/
-		ofs = cga_CalcXY_p(x + char_draw_max_width, char_draw_coords_y + 4);
+		ofs = CalcXY_p(x + char_draw_max_width, char_draw_coords_y + 4);
 		drawSpriteN(20, x + char_draw_max_width, char_draw_coords_y + 4, CGA_SCREENBUFFER);
 		break;
 	case SPIKE_BUBLEFT: /*lower-left bubbles*/
-		ofs = cga_CalcXY_p(x + 1, char_draw_coords_y + 4);
+		ofs = CalcXY_p(x + 1, char_draw_coords_y + 4);
 		drawSpriteN(19, x + 1, char_draw_coords_y + 4, CGA_SCREENBUFFER);
 		break;
 	}
 
-	addDirtyRect(DirtyRectBubble, ofs >> 8, ofs & 255, w, h, cga_CalcXY_p(x, y));
+	addDirtyRect(DirtyRectBubble, ofs >> 8, ofs & 255, w, h, CalcXY_p(x, y));
 }
 
 void showPromptAnim(void) {
diff --git a/engines/chamber/input.cpp b/engines/chamber/input.cpp
index a303b3dbe3b..1ca566924f2 100644
--- a/engines/chamber/input.cpp
+++ b/engines/chamber/input.cpp
@@ -175,7 +175,7 @@ int16 askQuitGame(void) {
 			}
 		}
 	}
-	cga_CopyScreenBlock(backbuffer, char_draw_max_width + 2, char_draw_coords_y - draw_y + 8, frontbuffer, cga_CalcXY_p(draw_x, draw_y));
+	cga_CopyScreenBlock(backbuffer, char_draw_max_width + 2, char_draw_coords_y - draw_y + 8, frontbuffer, CalcXY_p(draw_x, draw_y));
 
 	return quit;
 }
diff --git a/engines/chamber/invent.cpp b/engines/chamber/invent.cpp
index 3cfe14d0949..9f5adf31e45 100644
--- a/engines/chamber/invent.cpp
+++ b/engines/chamber/invent.cpp
@@ -79,7 +79,7 @@ void drawInventoryBox(uint16 filtermask, uint16 filtervalue) {
 			continue;
 		if (count == 0) {
 			/*once first valid item found, draw the box*/
-			cga_FillAndWait(inv_bgcolor, 64 / 4, 64, CGA_SCREENBUFFER, cga_CalcXY_p(232 / 4, 56));
+			cga_FillAndWait(inv_bgcolor, 64 / 4, 64, CGA_SCREENBUFFER, CalcXY_p(232 / 4, 56));
 			playSound(20);
 		}
 		inventory_spots[count].name = inventory_items[i].name;
@@ -111,7 +111,7 @@ void checkInventoryItemHover(byte count) {
 
 void openInventory(uint16 filtermask, uint16 filtervalue) {
 	the_command = 0;
-	cga_BackupImageReal(cga_CalcXY_p(232 / 4, 56), 64 / 4, 64);
+	cga_BackupImageReal(CalcXY_p(232 / 4, 56), 64 / 4, 64);
 	drawInventoryBox(filtermask, filtervalue);
 	if (inv_count != 0) {
 		selectCursor(CURSOR_FINGER);
diff --git a/engines/chamber/kult.cpp b/engines/chamber/kult.cpp
index ae755874b11..9b048e5ce76 100644
--- a/engines/chamber/kult.cpp
+++ b/engines/chamber/kult.cpp
@@ -202,7 +202,30 @@ Common::Error ChamberEngine::init() {
 	byte c;
 
 	// Initialize graphics using following:
-	initGraphics(320, 200);
+	if (_videoMode == Common::RenderMode::kRenderCGA) {
+		// 320x200x2
+		_screenW = 320;
+		_screenH = 200;
+		_screenBits = 2;
+		_screenPPB = 8 / _screenBits;
+		_screenBPL = _screenW / _screenPPB;
+		_line_offset = 0x2000;
+		_fontHeight = 6;
+		_fontWidth = 4;
+		initGraphics(_screenW, _screenH);
+	} else if (_videoMode == Common::RenderMode::kRenderHercG) {
+		// 720x348x1
+		_screenW = 720;
+		_screenH = 348;
+		_screenBits = 1;
+		_screenPPB = 8 / _screenBits;
+		_screenBPL = _screenW / _screenPPB;
+		_line_offset = 0x2000;
+		_line_offset2 = 0x2000;
+		_fontHeight = 6;
+		_fontWidth = 4;
+		initGraphics(_screenW, _screenH);
+	}
 	initSound();
 
 	/*TODO: DetectCPU*/
@@ -228,11 +251,20 @@ Common::Error ChamberEngine::init() {
 			exitGame();
 	}
 
-	/* Select intense cyan-mageta palette */
-	cga_ColorSelect(0x30);
+	if (_videoMode == Common::RenderMode::kRenderCGA) {
+		/* Select intense cyan-mageta palette */
+		cga_ColorSelect(0x30);
+		cga_BackBufferToRealFull();
+	} else if (_videoMode == Common::RenderMode::kRenderHercG) {
+		/* Select intense cyan-mageta palette */
+		cga_ColorSelect(0x30);
+		cga_BackBufferToRealFull();
+	}
+
+	/* Wait for a keypress */
+	clearKeyboard();
+	readKeyboardChar();
 
-	/* Show the title screen */
-	cga_BackBufferToRealFull();
 
 	if (g_vm->getLanguage() == Common::EN_USA) {
 		if (ifgm_loaded) {
diff --git a/engines/chamber/portrait.cpp b/engines/chamber/portrait.cpp
index e9df8322a66..a01676b02fd 100644
--- a/engines/chamber/portrait.cpp
+++ b/engines/chamber/portrait.cpp
@@ -234,11 +234,11 @@ void drawBoxAroundSpot(void) {
 
 	/*decode ofs back to x:y*/
 	/*TODO: this is CGA-only!*/
-	y = (ofs & CGA_ODD_LINES_OFS) ? 1 : 0;
-	ofs &= ~CGA_ODD_LINES_OFS;
-	x = (ofs % CGA_BYTES_PER_LINE) * CGA_PIXELS_PER_BYTE;
-	y += (ofs / CGA_BYTES_PER_LINE) * 2;
-	w *= CGA_PIXELS_PER_BYTE;   /*TODO: this will overflow on large sprite*/
+	y = (ofs & g_vm->_line_offset) ? 1 : 0;
+	ofs &= ~g_vm->_line_offset;
+	x = (ofs % g_vm->_screenBPL) * g_vm->_screenPPB;
+	y += (ofs / g_vm->_screenBPL) * 2;
+	w *= g_vm->_screenPPB;   /*TODO: this will overflow on large sprite*/
 
 	cga_DrawVLine(x, y, h - 1, 0, CGA_SCREENBUFFER);
 	cga_DrawHLine(x, y, w - 1, 0, CGA_SCREENBUFFER);
@@ -275,7 +275,7 @@ int16 drawPortrait(byte **desc, byte *x, byte *y, byte *width, byte *height) {
 	cur_image_size_h = *image++;
 	cur_image_size_w = *image++;
 	cur_image_pixels = image;
-	cur_image_offs = cga_CalcXY_p(cur_image_coords_x, cur_image_coords_y);
+	cur_image_offs = CalcXY_p(cur_image_coords_x, cur_image_coords_y);
 	addDirtyRect(DirtyRectSprite, cur_image_coords_x, cur_image_coords_y, cur_image_size_w, cur_image_size_h, cur_image_offs);
 
 	/*TODO: remove and use only globals?*/
diff --git a/engines/chamber/print.cpp b/engines/chamber/print.cpp
index ad3c3e5a4b6..da93f04ecde 100644
--- a/engines/chamber/print.cpp
+++ b/engines/chamber/print.cpp
@@ -257,7 +257,7 @@ void drawMessage(byte *msg, byte *target) {
 	draw_x = x;
 	draw_y = y;
 
-	cga_BackupImageReal(cga_CalcXY_p(x, y), char_draw_max_width + 2, char_draw_max_height); /*backup orig. screen data*/
+	cga_BackupImageReal(CalcXY_p(x, y), char_draw_max_width + 2, char_draw_max_height); /*backup orig. screen data*/
 	cga_DrawTextBox(msg, target);                   /*draw box with text*/
 	promptWait();                                   /*wait keypress*/
 	cga_RestoreBackupImage(target);                 /*restore screen data*/
diff --git a/engines/chamber/room.cpp b/engines/chamber/room.cpp
index 06fb5a7b38e..2d1e965b12e 100644
--- a/engines/chamber/room.cpp
+++ b/engines/chamber/room.cpp
@@ -188,7 +188,7 @@ int16 isInRect(byte x, byte y, rect_t *rect) {
 Check if cursor is in rect
 */
 int16 isCursorInRect(rect_t *rect) {
-	return isInRect(cursor_x / CGA_PIXELS_PER_BYTE, cursor_y, rect);
+	return isInRect(cursor_x / g_vm->_screenPPB, cursor_y, rect);
 }
 
 /*
@@ -245,14 +245,16 @@ void selectSpotCursor(void) {
 				curs = CURSOR_CROSSHAIR;
 		}
 	}
-	cursor_shape = souri_data + curs * CURSOR_WIDTH * CURSOR_HEIGHT * 2 / CGA_PIXELS_PER_BYTE;
+	cursor_shape = souri_data + curs * CURSOR_WIDTH * CURSOR_HEIGHT * 2 / g_vm->_screenPPB;
 }
 
 #define kBgW 8
 #define kBgH 30
 
+static const int16 *background_draw_steps;
+
 /*blocks draw order (clockwise inward spiral)*/
-static const int16 background_draw_steps[] = {
+static const int16 background_draw_steps_cga[] = {
 	kBgW, kBgW, kBgW, kBgW, kBgW, kBgW, kBgW,
 	kBgH / 2 * CGA_BYTES_PER_LINE, kBgH / 2 * CGA_BYTES_PER_LINE, kBgH / 2 * CGA_BYTES_PER_LINE, kBgH / 2 * CGA_BYTES_PER_LINE, kBgH / 2 * CGA_BYTES_PER_LINE,
 	-kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW,
@@ -266,6 +268,21 @@ static const int16 background_draw_steps[] = {
 	-kBgW, -kBgW, -kBgW, -kBgW, 0
 };
 
+/*blocks draw order (clockwise inward spiral)*/
+static const int16 background_draw_steps_hga[] = {
+	kBgW, kBgW, kBgW, kBgW, kBgW, kBgW, kBgW,
+	kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE,
+	-kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW,
+	-kBgH / 2 * HGA_BYTES_PER_LINE, -kBgH / 2 * HGA_BYTES_PER_LINE, -kBgH / 2 * HGA_BYTES_PER_LINE, -kBgH / 2 * HGA_BYTES_PER_LINE,
+	kBgW, kBgW, kBgW, kBgW, kBgW, kBgW, kBgW,
+	kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE, kBgH / 2 * HGA_BYTES_PER_LINE,
+	-kBgW, -kBgW, -kBgW, -kBgW, -kBgW, -kBgW,
+	-kBgH / 2 * HGA_BYTES_PER_LINE, -kBgH / 2 * HGA_BYTES_PER_LINE,
+	kBgW, kBgW, kBgW, kBgW, kBgW,
+	kBgH / 2 * HGA_BYTES_PER_LINE,
+	-kBgW, -kBgW, -kBgW, -kBgW, 0
+};
+
 /*
 Draw main backgound pattern, in spiral-like order
 */
@@ -278,6 +295,11 @@ void drawBackground(byte *target, byte vblank) {
 		cga_Blit(pixels + (i & 1 ? 0 : kBgW * kBgH), kBgW, kBgW, kBgH, target, offs);
 		if (vblank)
 			waitVBlank();
+		if (g_vm->_videoMode == Common::RenderMode::kRenderCGA) {
+			background_draw_steps = background_draw_steps_cga;
+		} else {
+			background_draw_steps = background_draw_steps_hga;
+		}
 		offs += background_draw_steps[i];
 	}
 
@@ -453,14 +475,14 @@ void initRoomDoorInfo(byte index) {
 		info->layer[i].width = w;
 		info->layer[i].height = h;
 		info->layer[i].pixels = sprite + 2;
-		info->layer[i].offs = cga_CalcXY_p(x, y);
+		info->layer[i].offs = CalcXY_p(x, y);
 
 		aptr += 3;
 	}
 
 	info->width = bounds.ex - bounds.sx;
 	info->height = bounds.ey - bounds.sy;
-	info->offs = cga_CalcXY_p(bounds.sx, bounds.sy);
+	info->offs = CalcXY_p(bounds.sx, bounds.sy);
 }
 
 /*
@@ -781,9 +803,9 @@ void drawRoomStaticObject(byte *aptr, byte *rx, byte *ry, byte *rw, byte *rh) {
 	/*TODO: check if this results in any glitches in Who Will Be Saved*/
 
 	if (aptr[1] & 0x80)
-		cga_BlitSpriteFlip(sprite, pitch, w, h, backbuffer, cga_CalcXY_p(x, y));
+		cga_BlitSpriteFlip(sprite, pitch, w, h, backbuffer, CalcXY_p(x, y));
 	else
-		cga_BlitSprite(sprite, pitch, w, h, backbuffer, cga_CalcXY_p(x, y));
+		cga_BlitSprite(sprite, pitch, w, h, backbuffer, CalcXY_p(x, y));
 }
 
 /*
@@ -884,8 +906,8 @@ void drawRoomItemsIndicator(void) {
 			break;
 		}
 	}
-	drawSpriteN(spridx, 296 / CGA_PIXELS_PER_BYTE, 14, CGA_SCREENBUFFER);
-	drawSpriteN(spridx, 296 / CGA_PIXELS_PER_BYTE, 14, backbuffer);
+	drawSpriteN(spridx, 296 / g_vm->_screenPPB, 14, CGA_SCREENBUFFER);
+	drawSpriteN(spridx, 296 / g_vm->_screenPPB, 14, backbuffer);
 
 	/*recalculate the number of zapstiks we have*/
 	script_byte_vars.zapstiks_owned = 0;
@@ -972,7 +994,7 @@ Copy object hint from backbuffer to screen
 void showObjectHint(byte *target) {
 	if (script_byte_vars.zone_index == 135)
 		return;
-	cga_CopyScreenBlock(backbuffer, room_hint_bar_width + 2, 9, target, cga_CalcXY_p(room_hint_bar_coords_x - 1, room_hint_bar_coords_y - 2));
+	cga_CopyScreenBlock(backbuffer, room_hint_bar_width + 2, 9, target, CalcXY_p(room_hint_bar_coords_x - 1, room_hint_bar_coords_y - 2));
 }
 
 /*
@@ -990,7 +1012,7 @@ void drawCommandHint(void) {
 Copy command hint from backbuffer to screen
 */
 void showCommandHint(byte *target) {
-	cga_CopyScreenBlock(backbuffer, cmd_hint_bar_width + 2, 9, target, cga_CalcXY_p(cmd_hint_bar_coords_x - 1, cmd_hint_bar_coords_y - 2));
+	cga_CopyScreenBlock(backbuffer, cmd_hint_bar_width + 2, 9, target, CalcXY_p(cmd_hint_bar_coords_x - 1, cmd_hint_bar_coords_y - 2));
 }
 
 void loadLutinSprite(uint16 lutidx) {
@@ -1040,7 +1062,7 @@ void drawCharacterSprite(byte spridx, byte x, byte y, byte *target) {
 
 	loadLutinSprite(spridx);
 
-	drawSprite(scratch_mem2, target, cga_CalcXY_p(x, y));
+	drawSprite(scratch_mem2, target, CalcXY_p(x, y));
 }
 
 /*
@@ -1063,7 +1085,7 @@ char drawZoneAniSprite(rect_t *rect, uint16 index, byte *target) {
 
 			zsprite_w = scratch_mem2[0];
 			zsprite_h = scratch_mem2[1];
-			zsprite_draw_ofs = cga_CalcXY_p(rect->sx, rect->sy);
+			zsprite_draw_ofs = CalcXY_p(rect->sx, rect->sy);
 
 			drawSprite(scratch_mem2, target, zsprite_draw_ofs);
 
@@ -1281,7 +1303,7 @@ uint16 getPuzzlSprite(byte index, byte x, byte y, uint16 *w, uint16 *h, uint16 *
 	byte *spr = loadPuzzlToScratch(index);
 	*w = spr[0];
 	*h = spr[1];
-	*ofs = cga_CalcXY_p(x, y);
+	*ofs = CalcXY_p(x, y);
 	return 0;   /*sprite offset in scratch buf*/
 }
 
@@ -1390,7 +1412,7 @@ Open The Wall's right gate
 TODO: move this to CGA?
 */
 void theWallOpenRightDoor(byte x, byte y, byte width, byte height, byte limit) {
-	uint16 offs = cga_CalcXY_p(x + width - 2, y);
+	uint16 offs = CalcXY_p(x + width - 2, y);
 
 	while (--width) {
 		cga_HideScreenBlockLiftToRight(1, CGA_SCREENBUFFER, backbuffer, width, height, CGA_SCREENBUFFER, offs);
@@ -1406,8 +1428,8 @@ void theWallOpenRightDoor(byte x, byte y, byte width, byte height, byte limit) {
 	while (height--) {
 		memcpy(frontbuffer + offs, backbuffer + offs, 1);
 
-		offs ^= CGA_ODD_LINES_OFS;
-		if ((offs & CGA_ODD_LINES_OFS) == 0)
+		offs ^= g_vm->_line_offset;
+		if ((offs & g_vm->_line_offset) == 0)
 			offs += CGA_BYTES_PER_LINE;
 	}
 
@@ -1419,7 +1441,7 @@ Open The Wall's left gate
 TODO: move this to CGA?
 */
 void theWallOpenLeftDoor(byte x, byte y, byte width, byte height, byte limit) {
-	uint16 offs = cga_CalcXY_p(x + 1, y);
+	uint16 offs = CalcXY_p(x + 1, y);
 
 	while (--width) {
 		cga_HideScreenBlockLiftToLeft(1, CGA_SCREENBUFFER, backbuffer, width, height, CGA_SCREENBUFFER, offs);
@@ -1435,8 +1457,8 @@ void theWallOpenLeftDoor(byte x, byte y, byte width, byte height, byte limit) {
 	while (height--) {
 		memcpy(frontbuffer + offs, backbuffer + offs, 1);
 
-		offs ^= CGA_ODD_LINES_OFS;
-		if ((offs & CGA_ODD_LINES_OFS) == 0)
+		offs ^= g_vm->_line_offset;
+		if ((offs & g_vm->_line_offset) == 0)
 			offs += CGA_BYTES_PER_LINE;
 	}
 	cga_blitToScreen(ooffs, 1, oh);
@@ -1487,11 +1509,11 @@ void theWallPhase1_DoorClose1(void) {
 	spr = loadMursmSprite(0);
 	spr += cur_frame_width - 1;
 	cur_image_coords_x = 64 / 4;
-	cga_AnimLiftToRight(10, spr, cur_frame_width, 1, cur_image_size_h, frontbuffer, cga_CalcXY_p(cur_image_coords_x, cur_image_coords_y));
+	cga_AnimLiftToRight(10, spr, cur_frame_width, 1, cur_image_size_h, frontbuffer, CalcXY_p(cur_image_coords_x, cur_image_coords_y));
 
 	spr = loadMursmSprite(1);
 	cur_image_coords_x = 220 / 4;
-	cga_AnimLiftToLeft(10, spr, cur_frame_width, 1, cur_image_size_h, frontbuffer, cga_CalcXY_p(cur_image_coords_x, cur_image_coords_y));
+	cga_AnimLiftToLeft(10, spr, cur_frame_width, 1, cur_image_size_h, frontbuffer, CalcXY_p(cur_image_coords_x, cur_image_coords_y));
 
 	IFGM_StopSample();
 
@@ -1511,11 +1533,11 @@ void theWallPhase2_DoorClose2(void) {
 	spr = loadMursmSprite(0);
 	spr += cur_frame_width - 1;
 	cur_image_coords_x = 64 / 4;
-	cga_AnimLiftToRight(10, spr - 10, cur_frame_width, 1 + 10, cur_image_size_h, frontbuffer, cga_CalcXY_p(cur_image_coords_x, cur_image_coords_y));
+	cga_AnimLiftToRight(10, spr - 10, cur_frame_width, 1 + 10, cur_image_size_h, frontbuffer, CalcXY_p(cur_image_coords_x, cur_image_coords_y));
 
 	spr = loadMursmSprite(1);
 	cur_image_coords_x = 220 / 4;
-	cga_AnimLiftToLeft(10, spr, cur_frame_width, 1 + 10, cur_image_size_h, frontbuffer, cga_CalcXY_p(cur_image_coords_x, cur_image_coords_y) - 10);
+	cga_AnimLiftToLeft(10, spr, cur_frame_width, 1 + 10, cur_image_size_h, frontbuffer, CalcXY_p(cur_image_coords_x, cur_image_coords_y) - 10);
 
 	IFGM_PlaySample(30);
 
@@ -1529,18 +1551,18 @@ void drawTheWallDoors(void) {
 	switch (script_byte_vars.zone_index) {
 	case 9:
 	case 102:
-		cga_Blit(loadMursmSprite(0) + 10, 20, 10, 59, CGA_SCREENBUFFER, cga_CalcXY_p(64 / CGA_PIXELS_PER_BYTE, 32));
+		cga_Blit(loadMursmSprite(0) + 10, 20, 10, 59, CGA_SCREENBUFFER, CalcXY_p(64 / g_vm->_screenPPB, 32));
 		if (g_vm->getLanguage() == Common::EN_USA) {
 			/*This fixes odd black patch on the right gate door*/
-			cga_Blit(loadMursmSprite(1)     , 20, 10, 59, CGA_SCREENBUFFER, cga_CalcXY_p(184 / CGA_PIXELS_PER_BYTE, 32));
+			cga_Blit(loadMursmSprite(1)     , 20, 10, 59, CGA_SCREENBUFFER, CalcXY_p(184 / g_vm->_screenPPB, 32));
 		} else {
-			cga_Blit(loadMursmSprite(1)     , 20, 10, 59, CGA_SCREENBUFFER, cga_CalcXY_p(180 / CGA_PIXELS_PER_BYTE, 32));
+			cga_Blit(loadMursmSprite(1)     , 20, 10, 59, CGA_SCREENBUFFER, CalcXY_p(180 / g_vm->_screenPPB, 32));
 		}
 		break;
 	case 95:
 	case 103:
-		cga_Blit(loadMursmSprite(0), 20, 20, 59, CGA_SCREENBUFFER, cga_CalcXY_p(64 / CGA_PIXELS_PER_BYTE, 32));
-		cga_Blit(loadMursmSprite(1), 20, 20, 59, CGA_SCREENBUFFER, cga_CalcXY_p(144 / CGA_PIXELS_PER_BYTE, 32));
+		cga_Blit(loadMursmSprite(0), 20, 20, 59, CGA_SCREENBUFFER, CalcXY_p(64 / g_vm->_screenPPB, 32));
+		cga_Blit(loadMursmSprite(1), 20, 20, 59, CGA_SCREENBUFFER, CalcXY_p(144 / g_vm->_screenPPB, 32));
 		break;
 	}
 }
@@ -1587,7 +1609,7 @@ Return current and next free buffer ptr
 */
 byte *backupSpotImage(spot_t *spot, byte **spotback, byte *buffer) {
 	*spotback = buffer;
-	buffer = cga_BackupImage(backbuffer, cga_CalcXY_p(spot->sx, spot->sy), spot->ex - spot->sx, spot->ey - spot->sy, buffer);
+	buffer = cga_BackupImage(backbuffer, CalcXY_p(spot->sx, spot->sy), spot->ex - spot->sx, spot->ey - spot->sy, buffer);
 	return buffer;
 }
 
diff --git a/engines/chamber/script.cpp b/engines/chamber/script.cpp
index 97e4280eaa9..3fa8de5a1e0 100644
--- a/engines/chamber/script.cpp
+++ b/engines/chamber/script.cpp
@@ -677,7 +677,7 @@ uint16 SCR_5_DrawPortraitLiftRight(void) {
 		return 0;
 
 	/*TODO: use local args instead of globals*/
-	cga_AnimLiftToRight(width, cur_image_pixels + width - 1, width, 1, height, CGA_SCREENBUFFER, cga_CalcXY_p(x, y));
+	cga_AnimLiftToRight(width, cur_image_pixels + width - 1, width, 1, height, CGA_SCREENBUFFER, CalcXY_p(x, y));
 	return 0;
 }
 
@@ -693,7 +693,7 @@ uint16 SCR_6_DrawPortraitLiftLeft(void) {
 		return 0;
 
 	/*TODO: use local args instead of globals*/
-	cga_AnimLiftToLeft(width, cur_image_pixels, width, 1, height, CGA_SCREENBUFFER, cga_CalcXY_p(x + width - 1, y));
+	cga_AnimLiftToLeft(width, cur_image_pixels, width, 1, height, CGA_SCREENBUFFER, CalcXY_p(x + width - 1, y));
 	return 0;
 }
 
@@ -797,7 +797,7 @@ uint16 SCR_B_DrawPortraitTwistEffect(void) {
 	if (!drawPortrait(&script_ptr, &x, &y, &width, &height))
 		return 0;
 
-	offs = cga_CalcXY_p(x, y);
+	offs = CalcXY_p(x, y);
 
 	cga_SwapScreenRect(cur_image_pixels, width, height, backbuffer, offs);
 	twistDraw(x, y, width, height, backbuffer, frontbuffer);
@@ -848,7 +848,7 @@ uint16 SCR_C_DrawPortraitArcEffect(void) {
 	if (!drawPortrait(&script_ptr, &x, &y, &width, &height))
 		return 0;
 
-	offs = cga_CalcXY_p(x, y);
+	offs = CalcXY_p(x, y);
 
 	cga_SwapScreenRect(cur_image_pixels, width, height, backbuffer, offs);
 	arcDraw(x, y, width, height, backbuffer, frontbuffer);
@@ -875,7 +875,7 @@ uint16 SCR_D_DrawPortraitDotEffect(void) {
 	int16 count = 0;
 
 	for (offs = 0; offs != cur_image_end;) {
-		target[cga_CalcXY_p(x + offs % cur_image_size_w, y + offs / cur_image_size_w)] = cur_image_pixels[offs];
+		target[CalcXY_p(x + offs % cur_image_size_w, y + offs / cur_image_size_w)] = cur_image_pixels[offs]; // TODO check this
 
 		if (count % 5 == 0)
 			cga_blitToScreen(offs, 4, 1);
@@ -960,7 +960,7 @@ uint16 SCR_19_HidePortraitLiftLeft(void) {
 
 	/*TODO: This originally was done by reusing door sliding routine*/
 
-	/*offs = cga_CalcXY_p(x + 1, y);*/
+	/*offs = CalcXY_p(x + 1, y);*/
 	offs++;
 
 	while (--width) {
@@ -976,9 +976,9 @@ uint16 SCR_19_HidePortraitLiftLeft(void) {
 	while (height--) {
 		memcpy(frontbuffer + offs, backbuffer + offs, 1);
 
-		offs ^= CGA_ODD_LINES_OFS;
-		if ((offs & CGA_ODD_LINES_OFS) == 0)
-			offs += CGA_BYTES_PER_LINE;
+		offs ^= g_vm->_line_offset;
+		if ((offs & g_vm->_line_offset) == 0)
+			offs += g_vm->_screenBPL;
 	}
 	cga_blitToScreen(ooffs, 1, oh);
 
@@ -1006,7 +1006,7 @@ uint16 SCR_1A_HidePortraitLiftRight(void) {
 
 	/*TODO: This originally was done by reusing door sliding routine*/
 
-	offs = cga_CalcXY_p(x + width - 2, y);
+	offs = CalcXY_p(x + width - 2, y);
 
 	while (--width) {
 		cga_HideScreenBlockLiftToRight(1, CGA_SCREENBUFFER, backbuffer, width, height, CGA_SCREENBUFFER, offs);
@@ -1021,9 +1021,9 @@ uint16 SCR_1A_HidePortraitLiftRight(void) {
 	while (height--) {
 		memcpy(frontbuffer + offs, backbuffer + offs, 1);
 
-		offs ^= CGA_ODD_LINES_OFS;
-		if ((offs & CGA_ODD_LINES_OFS) == 0)
-			offs += CGA_BYTES_PER_LINE;
+		offs ^= g_vm->_line_offset;
+		if ((offs & g_vm->_line_offset) == 0)
+			offs += g_vm->_screenBPL;
 	}
 	cga_blitToScreen(ooffs, 1, oh);
 
@@ -1049,7 +1049,7 @@ uint16 SCR_1B_HidePortraitLiftUp(void) {
 		return 0;
 	}
 
-	offs = cga_CalcXY_p(x, y + 1);
+	offs = CalcXY_p(x, y + 1);
 
 	while (--height) {
 		cga_HideScreenBlockLiftToUp(1, CGA_SCREENBUFFER, backbuffer, width, height, CGA_SCREENBUFFER, offs);
@@ -1057,9 +1057,9 @@ uint16 SCR_1B_HidePortraitLiftUp(void) {
 
 	/*hide topmost line*/
 	/*TODO: move this to CGA?*/
-	offs ^= CGA_ODD_LINES_OFS;
-	if ((offs & CGA_ODD_LINES_OFS) != 0)
-		offs -= CGA_BYTES_PER_LINE;
+	offs ^= g_vm->_line_offset;
+	if ((offs & g_vm->_line_offset) != 0)
+		offs -= g_vm->_screenBPL;
 	memcpy(CGA_SCREENBUFFER + offs, backbuffer + offs, width);
 	cga_blitToScreen(offs, width, 1);
 	return 0;
@@ -1085,7 +1085,7 @@ uint16 SCR_1C_HidePortraitLiftDown(void) {
 		return 0;
 	}
 
-	offs = cga_CalcXY_p(x, y + height - 2);
+	offs = CalcXY_p(x, y + height - 2);
 
 	while (--height) {
 		cga_HideScreenBlockLiftToDown(1, CGA_SCREENBUFFER, backbuffer, width, height, CGA_SCREENBUFFER, offs);
@@ -1093,9 +1093,9 @@ uint16 SCR_1C_HidePortraitLiftDown(void) {
 
 	/*hide bottommost line*/
 	/*TODO: move this to CGA?*/
-	offs ^= CGA_ODD_LINES_OFS;
-	if ((offs & CGA_ODD_LINES_OFS) == 0)
-		offs += CGA_BYTES_PER_LINE;
+	offs ^= g_vm->_line_offset;
+	if ((offs & g_vm->_line_offset) == 0)
+		offs += g_vm->_screenBPL;
 	memcpy(CGA_SCREENBUFFER + offs, backbuffer + offs, width);
 	cga_blitToScreen(offs, width, 1);
 	return 0;
@@ -1551,7 +1551,7 @@ Display a static sprite in the room (to screen)
 uint16 SCR_11_DrawRoomObject(void) {
 	byte x, y, w, h;
 	SCR_DrawRoomObjectBack(&x, &y, &w, &h);
-	cga_CopyScreenBlock(backbuffer, w, h, frontbuffer, cga_CalcXY_p(x, y));
+	cga_CopyScreenBlock(backbuffer, w, h, frontbuffer, CalcXY_p(x, y));
 	return 0;
 }
 
@@ -1893,7 +1893,7 @@ uint16 SCR_30_Fight(void) {
 	player_image[1] = x;
 	player_image[2] = y;
 	if (drawPortrait(&image, &x, &y, &width, &height))
-		cga_AnimLiftToLeft(width, cur_image_pixels, width, 1, height, CGA_SCREENBUFFER, cga_CalcXY_p(x + width - 1, y));
+		cga_AnimLiftToLeft(width, cur_image_pixels, width, 1, height, CGA_SCREENBUFFER, CalcXY_p(x + width - 1, y));
 
 	blinkToWhite();
 
@@ -2309,9 +2309,9 @@ uint16 SCR_45_DeProfundisRoomEntry(void) {
 		waitVBlank();
 		cga_BlitFromBackBuffer(w, 1, CGA_SCREENBUFFER, ofs);
 
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 
 		cga_BlitScratchBackSprite(sprofs, w, h, CGA_SCREENBUFFER, ofs);
 	}
@@ -2370,9 +2370,9 @@ uint16 SCR_47_DeProfundisRiseMonster(void) {
 	for (; y; y--) {
 		waitVBlank();
 
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) != 0)
-			ofs -= CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) != 0)
+			ofs -= g_vm->_screenBPL;
 
 		h++;
 
@@ -2401,9 +2401,9 @@ uint16 SCR_48_DeProfundisLowerMonster(void) {
 		waitVBlank();
 		cga_BlitFromBackBuffer(w, 1, CGA_SCREENBUFFER, ofs);
 
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 
 		h--;
 		cga_BlitScratchBackSprite(sprofs, w, h, CGA_SCREENBUFFER, ofs);
@@ -2473,9 +2473,9 @@ uint16 SCR_65_DeProfundisMovePlatform(void) {
 		waitVBlank();
 		cga_BlitFromBackBuffer(w, h, CGA_SCREENBUFFER, ofs);
 
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) == 0)
-			ofs += CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) == 0)
+			ofs += g_vm->_screenBPL;
 
 		h--;
 
@@ -2699,11 +2699,11 @@ uint16 SCR_56_MorphRoom98(void) {
 
 	ofs = cga_CalcXY(0, 136);
 	for (h = 60; h; h--) {
-		memcpy(frontbuffer + ofs, backbuffer + ofs, CGA_BYTES_PER_LINE);
+		memcpy(frontbuffer + ofs, backbuffer + ofs, g_vm->_screenBPL);
 		waitVBlank();
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) != 0)
-			ofs -= CGA_BYTES_PER_LINE;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) != 0)
+			ofs -= g_vm->_screenBPL;
 	}
 
 	backupSpotImage(&zone_spots[3], &sprites_list[3], sprites_list[3]);
@@ -2720,43 +2720,43 @@ void ShowMirrored(uint16 h, uint16 ofs) {
 	uint16 x, ofs2 = ofs;
 
 	/*move 1 line up*/
-	ofs2 ^= CGA_ODD_LINES_OFS;
-	if ((ofs2 & CGA_ODD_LINES_OFS) != 0)
-		ofs2 -= CGA_BYTES_PER_LINE;
+	ofs2 ^= g_vm->_line_offset;
+	if ((ofs2 & g_vm->_line_offset) != 0)
+		ofs2 -= g_vm->_screenBPL;
 
 	while (h--) {
 
-		for (x = 0; x < CGA_BYTES_PER_LINE; x++) {
+		for (x = 0; x < g_vm->_screenBPL; x++) {
 			frontbuffer[ofs2 + x] = frontbuffer[ofs + x] = backbuffer[ofs + x];
 			backbuffer[ofs + x] = 0;
 		}
 
 		/*move 1 line down*/
-		ofs += CGA_BYTES_PER_LINE;
-		ofs ^= CGA_ODD_LINES_OFS;
-		if ((ofs & CGA_ODD_LINES_OFS) != 0)
-			ofs -= CGA_BYTES_PER_LINE;
+		ofs += g_vm->_screenBPL;
+		ofs ^= g_vm->_line_offset;
+		if ((ofs & g_vm->_line_offset) != 0)
+			ofs -= g_vm->_screenBPL;
 
 		/*move 1 line up*/
-		ofs2 ^= CGA_ODD_LINES_OFS;
-		if ((ofs2 & CGA_ODD_LINES_OFS) != 0)
-			ofs2 -= CGA_BYTES_PER_LINE;
+		ofs2 ^= g_vm->_line_offset;
+		if ((ofs2 & g_vm->_line_offset) != 0)
+			ofs2 -= g_vm->_screenBPL;
 	}
 }
 
 void LiftLines(int16 n, byte *source, uint16 sofs, byte *target, uint16 tofs) {
 	while (n--) {
-		memcpy(target + tofs, source + sofs, CGA_BYTES_PER_LINE);
+		memcpy(target + tofs, source + sofs, g_vm->_screenBPL);
 
-		sofs += CGA_BYTES_PER_LINE;
-		sofs ^= CGA_ODD_LINES_OFS;
-		if ((sofs & CGA_ODD_LINES_OFS) != 0)
-			sofs -= CGA_BYTES_PER_LINE;
+		sofs += g_vm->_screenBPL;
+		sofs ^= g_vm->_line_offset;
+		if ((sofs & g_vm->_line_offset) != 0)
+			sofs -= g_vm->_screenBPL;
 
-		tofs += CGA_BYTES_PER_LINE;
-		tofs ^= CGA_ODD_LINES_OFS;
-		if ((tofs & CGA_ODD_LINES_OFS) != 0)
-			tofs -= CGA_BYTES_PER_LINE;
+		tofs += g_vm->_screenBPL;
+		tofs ^= g_vm->_line_offset;
+		if ((tofs & g_vm->_line_offset) != 0)
+			tofs -= g_vm->_screenBPL;
 	}
 }
 
@@ -2816,23 +2816,23 @@ static void AnimSaucer(void) {
 			ofs2 = ofs = baseofs;
 
 			/*previous line*/
-			ofs ^= CGA_ODD_LINES_OFS;
-			if ((ofs & CGA_ODD_LINES_OFS) != 0)
-				ofs -= CGA_BYTES_PER_LINE;
+			ofs ^= g_vm->_line_offset;
+			if ((ofs & g_vm->_line_offset) != 0)
+				ofs -= g_vm->_screenBPL;
 
 			for (i = 0; i < 55; i++) {
-				memcpy(backbuffer + ofs, backbuffer + ofs2, CGA_BYTES_PER_LINE);
+				memcpy(backbuffer + ofs, backbuffer + ofs2, g_vm->_screenBPL);
 
 				/*next line*/
-				ofs2 += CGA_BYTES_PER_LINE;
-				ofs2 ^= CGA_ODD_LINES_OFS;
-				if ((ofs2 & CGA_ODD_LINES_OFS) != 0)
-					ofs2 -= CGA_BYTES_PER_LINE;
+				ofs2 += g_vm->_screenBPL;
+				ofs2 ^= g_vm->_line_offset;
+				if ((ofs2 & g_vm->_line_offset) != 0)
+					ofs2 -= g_vm->_screenBPL;
 
 				/*previous line line*/
-				ofs ^= CGA_ODD_LINES_OFS;
-				if ((ofs & CGA_ODD_LINES_OFS) != 0)
-					ofs -= CGA_BYTES_PER_LINE;
+				ofs ^= g_vm->_line_offset;
+				if ((ofs & g_vm->_line_offset) != 0)
+					ofs -= g_vm->_screenBPL;
 			}
 
 			ofs2 = cga_CalcXY(0, 200 - 1);
@@ -2840,20 +2840,20 @@ static void AnimSaucer(void) {
 			for (i = 0; i < 108; i++) {
 				LiftLines(i + 1, backbuffer, ofs, frontbuffer, ofs2);
 
-				ofs2 ^= CGA_ODD_LINES_OFS;
-				if ((ofs2 & CGA_ODD_LINES_OFS) != 0)
-					ofs2 -= CGA_BYTES_PER_LINE;
+				ofs2 ^= g_vm->_line_offset;
+				if ((ofs2 & g_vm->_line_offset) != 0)
+					ofs2 -= g_vm->_screenBPL;
 
 				waitVBlank();
 				waitVBlank();
 			}
 
 			/*wipe 56 lines*/
-			memset(backbuffer + ofs2, 0, 56 / 2 * CGA_BYTES_PER_LINE);
-			ofs2 ^= CGA_ODD_LINES_OFS;
-			if ((ofs2 & CGA_ODD_LINES_OFS) == 0)
-				ofs2 += CGA_BYTES_PER_LINE;
-			memset(backbuffer + ofs2, 0, 54 / 2 * CGA_BYTES_PER_LINE);
+			memset(backbuffer + ofs2, 0, 56 / 2 * g_vm->_screenBPL);
+			ofs2 ^= g_vm->_line_offset;
+			if ((ofs2 & g_vm->_line_offset) == 0)
+				ofs2 += g_vm->_screenBPL;
+			memset(backbuffer + ofs2, 0, 54 / 2 * g_vm->_screenBPL);
 
 			for (i = 0xFFFF; i--;) ; /*TODO: weak delay*/
 
@@ -3412,7 +3412,7 @@ void DrawStickyNet(void) {
 	w = room_bounds_rect.ex - x;
 	h = room_bounds_rect.ey - y;
 
-	ofs = cga_CalcXY_p(x, y);
+	ofs = CalcXY_p(x, y);
 
 	/*16x30 is the net sprite size*/
 
@@ -3420,7 +3420,7 @@ void DrawStickyNet(void) {
 		int16 i;
 		for (i = 0; i < w; i += 16 / 4)
 			drawSprite(sprite, frontbuffer, ofs + i);
-		ofs += CGA_BYTES_PER_LINE * 30 / 2;
+		ofs += g_vm->_screenBPL * 30 / 2;
 	}
 }
 
@@ -3527,7 +3527,7 @@ uint16 CMD_E_PsiZoneScan(void) {
 
 	IFGM_PlaySample(26);
 
-	offs = cga_CalcXY_p(room_bounds_rect.sx, room_bounds_rect.sy);
+	offs = CalcXY_p(room_bounds_rect.sx, room_bounds_rect.sy);
 	w = room_bounds_rect.ex - room_bounds_rect.sx;
 	h = room_bounds_rect.ey - room_bounds_rect.sy;
 
@@ -3548,9 +3548,9 @@ uint16 CMD_E_PsiZoneScan(void) {
 			}
 		}
 
-		offs ^= CGA_ODD_LINES_OFS;
-		if ((offs & CGA_ODD_LINES_OFS) == 0)
-			offs += CGA_BYTES_PER_LINE;
+		offs ^= g_vm->_line_offset;
+		if ((offs & g_vm->_line_offset) == 0)
+			offs += g_vm->_screenBPL;
 	}
 
 	restoreScreenOfSpecialRoom();




More information about the Scummvm-git-logs mailing list