summaryrefslogtreecommitdiffstats
path: root/private/mvdm/softpc.new/host/src/nt_ega.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/mvdm/softpc.new/host/src/nt_ega.c2144
1 files changed, 2144 insertions, 0 deletions
diff --git a/private/mvdm/softpc.new/host/src/nt_ega.c b/private/mvdm/softpc.new/host/src/nt_ega.c
new file mode 100644
index 000000000..db83e95f2
--- /dev/null
+++ b/private/mvdm/softpc.new/host/src/nt_ega.c
@@ -0,0 +1,2144 @@
+
+/*
+ * SoftPC Revision 3.0
+ *
+ * Title : Win32 EGA Graphics Module
+ *
+ * Description :
+ *
+ * This modules contain the Win32 specific functions required
+ * to support the EGA emulation.
+ *
+ * Author : Dave Bartlett (based on X_ega.c)
+ *
+ * Notes :
+ *
+ */
+
+#include <windows.h>
+#include <string.h>
+#include <memory.h>
+
+#include "insignia.h"
+#include "host_def.h"
+
+#include "xt.h"
+#include "gvi.h"
+#include "gmi.h"
+#include "sas.h"
+#include "gfx_upd.h"
+#include <stdio.h>
+#include "trace.h"
+#include "debug.h"
+#include "egagraph.h"
+#include "egacpu.h"
+#include "egaports.h"
+#include "host_rrr.h"
+
+#include "conapi.h"
+#include "nt_graph.h"
+#include "nt_ega.h"
+#include "nt_egalt.h"
+
+#ifdef MONITOR
+#include <ntddvdeo.h>
+#include "nt_fulsc.h"
+#endif /* MONITOR */
+
+/* Statics */
+
+static unsigned int ega_lo_graph_0_0[256];
+static unsigned int ega_lo_graph_0_1[256];
+static unsigned int ega_lo_graph_0_2[256];
+static unsigned int ega_lo_graph_0_3[256];
+static unsigned int ega_lo_graph_1_0[256];
+static unsigned int ega_lo_graph_1_1[256];
+static unsigned int ega_lo_graph_1_2[256];
+static unsigned int ega_lo_graph_1_3[256];
+static unsigned int ega_lo_graph_2_0[256];
+static unsigned int ega_lo_graph_2_1[256];
+static unsigned int ega_lo_graph_2_2[256];
+static unsigned int ega_lo_graph_2_3[256];
+static unsigned int ega_lo_graph_3_0[256];
+static unsigned int ega_lo_graph_3_1[256];
+static unsigned int ega_lo_graph_3_2[256];
+static unsigned int ega_lo_graph_3_3[256];
+
+#ifdef BIGWIN
+static unsigned int ega_lo_graph_0_0_big[256];
+static unsigned int ega_lo_graph_0_1_big[256];
+static unsigned int ega_lo_graph_0_2_big[256];
+static unsigned int ega_lo_graph_0_3_big[256];
+static unsigned int ega_lo_graph_1_0_big[256];
+static unsigned int ega_lo_graph_1_1_big[256];
+static unsigned int ega_lo_graph_1_2_big[256];
+static unsigned int ega_lo_graph_1_3_big[256];
+static unsigned int ega_lo_graph_2_0_big[256];
+static unsigned int ega_lo_graph_2_1_big[256];
+static unsigned int ega_lo_graph_2_2_big[256];
+static unsigned int ega_lo_graph_2_3_big[256];
+static unsigned int ega_lo_graph_3_0_big[256];
+static unsigned int ega_lo_graph_3_1_big[256];
+static unsigned int ega_lo_graph_3_2_big[256];
+static unsigned int ega_lo_graph_3_3_big[256];
+static unsigned int ega_lo_graph_4_0_big[256];
+static unsigned int ega_lo_graph_4_1_big[256];
+static unsigned int ega_lo_graph_4_2_big[256];
+static unsigned int ega_lo_graph_4_3_big[256];
+static unsigned int ega_lo_graph_5_0_big[256];
+static unsigned int ega_lo_graph_5_1_big[256];
+static unsigned int ega_lo_graph_5_2_big[256];
+static unsigned int ega_lo_graph_5_3_big[256];
+
+static unsigned int ega_lo_graph_0_0_huge[256];
+static unsigned int ega_lo_graph_0_1_huge[256];
+static unsigned int ega_lo_graph_0_2_huge[256];
+static unsigned int ega_lo_graph_0_3_huge[256];
+static unsigned int ega_lo_graph_1_0_huge[256];
+static unsigned int ega_lo_graph_1_1_huge[256];
+static unsigned int ega_lo_graph_1_2_huge[256];
+static unsigned int ega_lo_graph_1_3_huge[256];
+static unsigned int ega_lo_graph_2_0_huge[256];
+static unsigned int ega_lo_graph_2_1_huge[256];
+static unsigned int ega_lo_graph_2_2_huge[256];
+static unsigned int ega_lo_graph_2_3_huge[256];
+static unsigned int ega_lo_graph_3_0_huge[256];
+static unsigned int ega_lo_graph_3_1_huge[256];
+static unsigned int ega_lo_graph_3_2_huge[256];
+static unsigned int ega_lo_graph_3_3_huge[256];
+static unsigned int ega_lo_graph_4_0_huge[256];
+static unsigned int ega_lo_graph_4_1_huge[256];
+static unsigned int ega_lo_graph_4_2_huge[256];
+static unsigned int ega_lo_graph_4_3_huge[256];
+static unsigned int ega_lo_graph_5_0_huge[256];
+static unsigned int ega_lo_graph_5_1_huge[256];
+static unsigned int ega_lo_graph_5_2_huge[256];
+static unsigned int ega_lo_graph_5_3_huge[256];
+static unsigned int ega_lo_graph_6_0_huge[256];
+static unsigned int ega_lo_graph_6_1_huge[256];
+static unsigned int ega_lo_graph_6_2_huge[256];
+static unsigned int ega_lo_graph_6_3_huge[256];
+static unsigned int ega_lo_graph_7_0_huge[256];
+static unsigned int ega_lo_graph_7_1_huge[256];
+static unsigned int ega_lo_graph_7_2_huge[256];
+static unsigned int ega_lo_graph_7_3_huge[256];
+#endif
+
+static unsigned int ega_med_and_hi_graph_luts[2048];
+
+#ifdef BIGWIN
+static unsigned int ega_med_and_hi_graph_luts_big[3072];
+
+static unsigned int ega_med_and_hi_graph_luts_huge[5120];
+#endif
+
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::::::::::::::: Initialise EGA mono low graphics :::::::::::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_init_ega_mono_lo_graph()
+{
+sub_note_trace0(EGA_HOST_VERBOSE,"nt_init_ega_mono_lo_graph - NOT SUPPORTED");
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::::::::: Initialise EGA colour low res graphics :::::::::::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_init_ega_lo_graph()
+{
+ static boolean ega_colour_lo_graph_deja_vu = FALSE;
+ unsigned int i,
+ byte0,
+ byte1,
+ byte2,
+ byte3,
+ byte4,
+ byte5,
+ byte6,
+ byte7,
+ or_of_bytes01,
+ or_of_bytes23,
+ or_of_bytes45,
+ or_of_bytes67;
+#ifdef BIGWIN
+ unsigned int or_of_bytes89,
+ or_of_bytesab,
+ or_of_bytescd,
+ or_of_bytesef;
+#endif /* BIGWIN */
+
+ sub_note_trace0(EGA_HOST_VERBOSE,"nt_init_ega_lo_graph");
+
+ /* Set up bits-per-pixel for current mode. */
+ sc.BitsPerPixel = EGA_BITS_PER_PIXEL;
+
+ /* Initialise look-up table for first call. */
+ if( !ega_colour_lo_graph_deja_vu )
+ {
+ for( i = 0; i < 256; i++ )
+ {
+ byte0 = i & 0x1;
+ byte1 = ( i & 0x2 ) >> 1;
+ byte2 = ( i & 0x4 ) >> 2;
+ byte3 = ( i & 0x8 ) >> 3;
+ byte4 = ( i & 0x10 ) >> 4;
+ byte5 = ( i & 0x20 ) >> 5;
+ byte6 = ( i & 0x40 ) >> 6;
+ byte7 = ( i & 0x80 ) >> 7;
+
+#ifdef BIGEND
+ or_of_bytes01 = ( byte1 << 24 ) | ( byte1 << 16 ) |
+ ( byte0 << 8 ) | byte0;
+ or_of_bytes23 = ( byte3 << 24 ) | ( byte3 << 16 ) |
+ ( byte2 << 8 ) | byte2;
+ or_of_bytes45 = ( byte5 << 24 ) | ( byte5 << 16 ) |
+ ( byte4 << 8 ) | byte4;
+ or_of_bytes67 = ( byte7 << 24 ) | ( byte7 << 16 ) |
+ ( byte6 << 8 ) | byte6;
+#endif /* BIGEND */
+
+#ifdef LITTLEND
+ or_of_bytes01 = ( byte0 << 24 ) | ( byte0 << 16 ) |
+ ( byte1 << 8 ) | byte1;
+ or_of_bytes23 = ( byte2 << 24 ) | ( byte2 << 16 ) |
+ ( byte3 << 8 ) | byte3;
+ or_of_bytes45 = ( byte4 << 24 ) | ( byte4 << 16 ) |
+ ( byte5<< 8 ) | byte5;
+ or_of_bytes67 = ( byte6 << 24 ) | ( byte6 << 16 ) |
+ ( byte7 << 8 ) | byte7;
+#endif /* LITTLEND */
+
+ ega_lo_graph_0_0[i] = or_of_bytes01;
+ ega_lo_graph_0_1[i] = or_of_bytes01 << 1;
+ ega_lo_graph_0_2[i] = or_of_bytes01 << 2;
+ ega_lo_graph_0_3[i] = or_of_bytes01 << 3;
+
+ ega_lo_graph_1_0[i] = or_of_bytes23;
+ ega_lo_graph_1_1[i] = or_of_bytes23 << 1;
+ ega_lo_graph_1_2[i] = or_of_bytes23 << 2;
+ ega_lo_graph_1_3[i] = or_of_bytes23 << 3;
+
+ ega_lo_graph_2_0[i] = or_of_bytes45;
+ ega_lo_graph_2_1[i] = or_of_bytes45 << 1;
+ ega_lo_graph_2_2[i] = or_of_bytes45 << 2;
+ ega_lo_graph_2_3[i] = or_of_bytes45 << 3;
+
+ ega_lo_graph_3_0[i] = or_of_bytes67;
+ ega_lo_graph_3_1[i] = or_of_bytes67 << 1;
+ ega_lo_graph_3_2[i] = or_of_bytes67 << 2;
+ ega_lo_graph_3_3[i] = or_of_bytes67 << 3;
+
+#ifdef BIGWIN
+#ifdef BIGEND
+
+ or_of_bytes01 = ( byte1 << 24 ) | ( byte0 << 16 ) |
+ ( byte0 << 8 ) | byte0;
+ or_of_bytes23 = ( byte2 << 24 ) | ( byte2 << 16 ) |
+ ( byte1 << 8 ) | byte1;
+ or_of_bytes45 = ( byte3 << 24 ) | ( byte3 << 16 ) |
+ ( byte3 << 8 ) | byte2;
+ or_of_bytes67 = ( byte5 << 24 ) | ( byte4 << 16 ) |
+ ( byte4 << 8 ) | byte4;
+ or_of_bytes89 = ( byte6 << 24 ) | ( byte6 << 16 ) |
+ ( byte5 << 8 ) | byte5;
+ or_of_bytesab = ( byte7 << 24 ) | ( byte7 << 16 ) |
+ ( byte7 << 8 ) | byte6;
+
+#endif /* BIGEND */
+
+#ifdef LITTLEND
+
+ or_of_bytes01 = ( byte0 << 24 ) | ( byte0 << 16 ) |
+ ( byte0 << 8 ) | byte1;
+ or_of_bytes23 = ( byte1 << 24 ) | ( byte1 << 16 ) |
+ ( byte2 << 8 ) | byte2;
+ or_of_bytes45 = ( byte2 << 24 ) | ( byte3 << 16 ) |
+ ( byte3 << 8 ) | byte3;
+ or_of_bytes67 = ( byte4 << 24 ) | ( byte4 << 16 ) |
+ ( byte4 << 8 ) | byte5;
+ or_of_bytes89 = ( byte5 << 24 ) | ( byte5 << 16 ) |
+ ( byte6 << 8 ) | byte6;
+ or_of_bytesab = ( byte6 << 24 ) | ( byte7 << 16 ) |
+ ( byte7 << 8 ) | byte7;
+
+#endif /* LITTLEND */
+
+ ega_lo_graph_0_0_big[i] = or_of_bytes01;
+ ega_lo_graph_0_1_big[i] = or_of_bytes01 << 1;
+ ega_lo_graph_0_2_big[i] = or_of_bytes01 << 2;
+ ega_lo_graph_0_3_big[i] = or_of_bytes01 << 3;
+
+ ega_lo_graph_1_0_big[i] = or_of_bytes23;
+ ega_lo_graph_1_1_big[i] = or_of_bytes23 << 1;
+ ega_lo_graph_1_2_big[i] = or_of_bytes23 << 2;
+ ega_lo_graph_1_3_big[i] = or_of_bytes23 << 3;
+
+ ega_lo_graph_2_0_big[i] = or_of_bytes45;
+ ega_lo_graph_2_1_big[i] = or_of_bytes45 << 1;
+ ega_lo_graph_2_2_big[i] = or_of_bytes45 << 2;
+ ega_lo_graph_2_3_big[i] = or_of_bytes45 << 3;
+
+ ega_lo_graph_3_0_big[i] = or_of_bytes67;
+ ega_lo_graph_3_1_big[i] = or_of_bytes67 << 1;
+ ega_lo_graph_3_2_big[i] = or_of_bytes67 << 2;
+ ega_lo_graph_3_3_big[i] = or_of_bytes67 << 3;
+
+ ega_lo_graph_4_0_big[i] = or_of_bytes89;
+ ega_lo_graph_4_1_big[i] = or_of_bytes89 << 1;
+ ega_lo_graph_4_2_big[i] = or_of_bytes89 << 2;
+ ega_lo_graph_4_3_big[i] = or_of_bytes89 << 3;
+
+ ega_lo_graph_5_0_big[i] = or_of_bytesab;
+ ega_lo_graph_5_1_big[i] = or_of_bytesab << 1;
+ ega_lo_graph_5_2_big[i] = or_of_bytesab << 2;
+ ega_lo_graph_5_3_big[i] = or_of_bytesab << 3;
+
+ or_of_bytes01 = ( byte0 << 24 ) | ( byte0 << 16 ) |
+ ( byte0 << 8 ) | byte0;
+ or_of_bytes23 = ( byte1 << 24 ) | ( byte1 << 16 ) |
+ ( byte1 << 8 ) | byte1;
+ or_of_bytes45 = ( byte2 << 24 ) | ( byte2 << 16 ) |
+ ( byte2 << 8 ) | byte2;
+ or_of_bytes67 = ( byte3 << 24 ) | ( byte3 << 16 ) |
+ ( byte3 << 8 ) | byte3;
+ or_of_bytes89 = ( byte4 << 24 ) | ( byte4 << 16 ) |
+ ( byte4 << 8 ) | byte4;
+ or_of_bytesab = ( byte5 << 24 ) | ( byte5 << 16 ) |
+ ( byte5 << 8 ) | byte5;
+ or_of_bytescd = ( byte6 << 24 ) | ( byte6 << 16 ) |
+ ( byte6 << 8 ) | byte6;
+ or_of_bytesef = ( byte7 << 24 ) | ( byte7 << 16 ) |
+ ( byte7 << 8 ) | byte7;
+
+ ega_lo_graph_0_0_huge[i] = or_of_bytes01;
+ ega_lo_graph_0_1_huge[i] = or_of_bytes01 << 1;
+ ega_lo_graph_0_2_huge[i] = or_of_bytes01 << 2;
+ ega_lo_graph_0_3_huge[i] = or_of_bytes01 << 3;
+
+ ega_lo_graph_1_0_huge[i] = or_of_bytes23;
+ ega_lo_graph_1_1_huge[i] = or_of_bytes23 << 1;
+ ega_lo_graph_1_2_huge[i] = or_of_bytes23 << 2;
+ ega_lo_graph_1_3_huge[i] = or_of_bytes23 << 3;
+
+ ega_lo_graph_2_0_huge[i] = or_of_bytes45;
+ ega_lo_graph_2_1_huge[i] = or_of_bytes45 << 1;
+ ega_lo_graph_2_2_huge[i] = or_of_bytes45 << 2;
+ ega_lo_graph_2_3_huge[i] = or_of_bytes45 << 3;
+
+ ega_lo_graph_3_0_huge[i] = or_of_bytes67;
+ ega_lo_graph_3_1_huge[i] = or_of_bytes67 << 1;
+ ega_lo_graph_3_2_huge[i] = or_of_bytes67 << 2;
+ ega_lo_graph_3_3_huge[i] = or_of_bytes67 << 3;
+
+ ega_lo_graph_4_0_huge[i] = or_of_bytes89;
+ ega_lo_graph_4_1_huge[i] = or_of_bytes89 << 1;
+ ega_lo_graph_4_2_huge[i] = or_of_bytes89 << 2;
+ ega_lo_graph_4_3_huge[i] = or_of_bytes89 << 3;
+
+ ega_lo_graph_5_0_huge[i] = or_of_bytesab;
+ ega_lo_graph_5_1_huge[i] = or_of_bytesab << 1;
+ ega_lo_graph_5_2_huge[i] = or_of_bytesab << 2;
+ ega_lo_graph_5_3_huge[i] = or_of_bytesab << 3;
+
+ ega_lo_graph_6_0_huge[i] = or_of_bytescd;
+ ega_lo_graph_6_1_huge[i] = or_of_bytescd << 1;
+ ega_lo_graph_6_2_huge[i] = or_of_bytescd << 2;
+ ega_lo_graph_6_3_huge[i] = or_of_bytescd << 3;
+
+ ega_lo_graph_7_0_huge[i] = or_of_bytesef;
+ ega_lo_graph_7_1_huge[i] = or_of_bytesef << 1;
+ ega_lo_graph_7_2_huge[i] = or_of_bytesef << 2;
+ ega_lo_graph_7_3_huge[i] = or_of_bytesef << 3;
+
+#endif /* BIGWIN */
+ }
+
+ ega_colour_lo_graph_deja_vu = TRUE;
+ }
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::::::::::: Initialise EGA med/hi res graphics :::::::::::::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_init_ega_med_and_hi_graph_luts()
+{
+ static boolean init_ega_med_and_hi_graph_luts_deja_vu = FALSE;
+ unsigned int i,
+ byte0,
+ byte1,
+ byte2,
+ byte3,
+ byte4,
+ byte5,
+ byte6,
+ byte7,
+ or_of_bytes1,
+ or_of_bytes2,
+ *lut0_ptr = &ega_med_and_hi_graph_luts[0],
+ *lut1_ptr = lut0_ptr + LUT_OFFSET,
+ *lut2_ptr = lut1_ptr + LUT_OFFSET,
+ *lut3_ptr = lut2_ptr + LUT_OFFSET;
+#ifdef BIGWIN
+ unsigned int or_of_bytes3,
+ or_of_bytes4,
+ *lut0_big_ptr = &ega_med_and_hi_graph_luts_big[0],
+ *lut1_big_ptr = lut0_big_ptr + BIG_LUT_OFFSET,
+ *lut2_big_ptr = lut1_big_ptr + BIG_LUT_OFFSET,
+ *lut3_big_ptr = lut2_big_ptr + BIG_LUT_OFFSET,
+ *lut0_huge_ptr = &ega_med_and_hi_graph_luts_huge[0],
+ *lut1_huge_ptr = lut0_huge_ptr + HUGE_LUT_OFFSET,
+ *lut2_huge_ptr = lut1_huge_ptr + HUGE_LUT_OFFSET,
+ *lut3_huge_ptr = lut2_huge_ptr + HUGE_LUT_OFFSET,
+ *lut4_huge_ptr = lut3_huge_ptr + HUGE_LUT_OFFSET;
+#endif /* BIGWIN */
+
+ sub_note_trace0(EGA_HOST_VERBOSE, "nt_init_ega_med_and_hi_graph_luts");
+
+ if (init_ega_med_and_hi_graph_luts_deja_vu)
+ return;
+
+ init_ega_med_and_hi_graph_luts_deja_vu = TRUE;
+
+ for(i = 0; i < 256; i++)
+ {
+ byte0 = i & 0x1;
+ byte1 = (i & 0x2) >> 1;
+ byte2 = (i & 0x4) >> 2;
+ byte3 = (i & 0x8) >> 3;
+ byte4 = (i & 0x10) >> 4;
+ byte5 = (i & 0x20) >> 5;
+ byte6 = (i & 0x40) >> 6;
+ byte7 = (i & 0x80) >> 7;
+
+#ifdef BIGEND
+
+ or_of_bytes1 = (byte3 << 24) | (byte2 << 16) | (byte1 << 8) | byte0;
+ or_of_bytes2 = (byte7 << 24) | (byte6 << 16) | (byte5 << 8) | byte4;
+
+#endif /* BIGEND */
+
+#ifdef LITTLEND
+
+ or_of_bytes1 = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
+ or_of_bytes2 = (byte4 << 24) | (byte5 << 16) | (byte6 << 8) | byte7;
+
+#endif /* LITTLEND */
+
+
+ lut0_ptr[2*i] = or_of_bytes2;
+ lut0_ptr[2*i+1] = or_of_bytes1;
+ lut1_ptr[2*i] = or_of_bytes2 << 1;
+ lut1_ptr[2*i+1] = or_of_bytes1 << 1;
+ lut2_ptr[2*i] = or_of_bytes2 << 2;
+ lut2_ptr[2*i+1] = or_of_bytes1 << 2;
+ lut3_ptr[2*i] = or_of_bytes2 << 3;
+ lut3_ptr[2*i+1] = or_of_bytes1 << 3;
+
+#ifdef BIGWIN
+#ifdef BIGEND
+
+ or_of_bytes1 = (byte2 << 24) | (byte1 << 16) | (byte0 << 8) | byte0;
+ or_of_bytes2 = (byte4 << 24) | (byte4 << 16) | (byte3 << 8) | byte2;
+ or_of_bytes3 = (byte7 << 24) | (byte6 << 16) | (byte6 << 8) | byte5;
+
+#endif /*BIGEND */
+
+#ifdef LITTLEND
+
+ or_of_bytes1 = (byte0 << 24) | (byte0 << 16) | (byte1 << 8) | byte2;
+ or_of_bytes2 = (byte2 << 24) | (byte3 << 16) | (byte4 << 8) | byte4;
+ or_of_bytes3 = (byte5 << 24) | (byte6 << 16) | (byte6 << 8) | byte7;
+
+#endif /* LITTLEND */
+
+ lut0_big_ptr[3*i] = or_of_bytes3;
+ lut0_big_ptr[3*i+1] = or_of_bytes2;
+ lut0_big_ptr[3*i+2] = or_of_bytes1;
+ lut1_big_ptr[3*i] = or_of_bytes3 << 1;
+ lut1_big_ptr[3*i+1] = or_of_bytes2 << 1;
+ lut1_big_ptr[3*i+2] = or_of_bytes1 << 1;
+ lut2_big_ptr[3*i] = or_of_bytes3 << 2;
+ lut2_big_ptr[3*i+1] = or_of_bytes2 << 2;
+ lut2_big_ptr[3*i+2] = or_of_bytes1 << 2;
+ lut3_big_ptr[3*i] = or_of_bytes3 << 3;
+ lut3_big_ptr[3*i+1] = or_of_bytes2 << 3;
+ lut3_big_ptr[3*i+2] = or_of_bytes1 << 3;
+
+#ifdef BIGEND
+
+ or_of_bytes1 = (byte1 << 24) | (byte1 << 16) | (byte0 << 8) | byte0;
+ or_of_bytes2 = (byte3 << 24) | (byte3 << 16) | (byte2 << 8) | byte2;
+ or_of_bytes3 = (byte5 << 24) | (byte5 << 16) | (byte4 << 8) | byte4;
+ or_of_bytes4 = (byte7 << 24) | (byte7 << 16) | (byte6 << 8) | byte6;
+
+#endif /* BIGEND */
+
+#ifdef LITTLEND
+
+ or_of_bytes1 = (byte0 << 24) | (byte0 << 16) | (byte1 << 8) | byte1;
+ or_of_bytes2 = (byte2 << 24) | (byte2 << 16) | (byte3 << 8) | byte3;
+ or_of_bytes3 = (byte4 << 24) | (byte4 << 16) | (byte5 << 8) | byte5;
+ or_of_bytes4 = (byte6 << 24) | (byte6 << 16) | (byte7 << 8) | byte7;
+
+#endif /* LITTLEND */
+
+ lut0_huge_ptr[4*i] = or_of_bytes4;
+ lut0_huge_ptr[4*i+1] = or_of_bytes3;
+ lut0_huge_ptr[4*i+2] = or_of_bytes2;
+ lut0_huge_ptr[4*i+3] = or_of_bytes1;
+ lut1_huge_ptr[4*i] = or_of_bytes4 << 1;
+ lut1_huge_ptr[4*i+1] = or_of_bytes3 << 1;
+ lut1_huge_ptr[4*i+2] = or_of_bytes2 << 1;
+ lut1_huge_ptr[4*i+3] = or_of_bytes1 << 1;
+ lut2_huge_ptr[4*i] = or_of_bytes4 << 2;
+ lut2_huge_ptr[4*i+1] = or_of_bytes3 << 2;
+ lut2_huge_ptr[4*i+2] = or_of_bytes2 << 2;
+ lut2_huge_ptr[4*i+3] = or_of_bytes1 << 2;
+ lut3_huge_ptr[4*i] = or_of_bytes4 << 3;
+ lut3_huge_ptr[4*i+1] = or_of_bytes3 << 3;
+ lut3_huge_ptr[4*i+2] = or_of_bytes2 << 3;
+ lut3_huge_ptr[4*i+3] = or_of_bytes1 << 3;
+ lut4_huge_ptr[4*i] = or_of_bytes4 << 4;
+ lut4_huge_ptr[4*i+1] = or_of_bytes3 << 4;
+ lut4_huge_ptr[4*i+2] = or_of_bytes2 << 4;
+ lut4_huge_ptr[4*i+3] = or_of_bytes1 << 4;
+#endif /* BIGWIN */
+ }
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::::::::::::: Initialise EGA med res graphics ::::::::::::::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_init_ega_med_graph()
+{
+ sub_note_trace0(EGA_HOST_VERBOSE, "nt_init_ega_med_graph");
+
+ /* Set up the number of bits per pixel for this mode. */
+ sc.BitsPerPixel = EGA_BITS_PER_PIXEL;
+
+ /* Initialise the medium- and high-resolution look-up tables. */
+ nt_init_ega_med_and_hi_graph_luts();
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::::::::::::::: Initialise hi res graphics :::::::::::::::::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_init_ega_hi_graph()
+{
+
+ sub_note_trace0(EGA_HOST_VERBOSE, "nt_init_ega_hi_graph");
+
+ /* Set up the number of bits per pixel for this mode. */
+ sc.BitsPerPixel = EGA_BITS_PER_PIXEL;
+
+ /* Initialise the medium- and high-resolution look-up tables. */
+ nt_init_ega_med_and_hi_graph_luts();
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::::::::: Paint EGA screen with user defined font ::::::::::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void ega_nt_text_with_user_font(int offset,int cur_xpos,int cur_ypos,int len)
+{
+ int a = offset = cur_xpos = cur_ypos = len;
+
+sub_note_trace0(EGA_HOST_VERBOSE,"ega_nt_text_with_user_font - NOT SUPPORTED");
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::::::::: Paint EGA screen with user defined font ::::::::::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void ega_nt_big_text_with_user_font(int offset, int cur_xpos,
+ int cur_ypos, int len)
+{
+ int a = offset = cur_xpos = cur_ypos = len;
+
+ sub_note_trace0(EGA_HOST_VERBOSE,
+ "ega_nt_big_text_with_user_font - NOT SUPPORTED");
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*:::::::::::::::::::: Paint screen with EGA text ::::::::::::::::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint win32 screen (MODE 13: PC 320x200. SoftPC 640x400) ::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_lo_graph_std(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+ unsigned int *p0,
+ *ref_p0,
+ *dest_ptr,
+ *save_dest_ptr,
+ data0,
+ data1,
+ data2,
+ data3;
+ int local_width,
+ local_height,
+ longs_per_scanline;
+ SMALL_RECT rect;
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_lo_graph_std off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height);
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+ /*
+ ** Tim September 92, sanity check parameters, if they're too big
+ ** it can cause a crash.
+ */
+ if( height>200 || width>40 ){
+ assert2( NO, "VDM: nt_ega_lo_graph_std() w=%d h=%d", width, height );
+ return;
+ }
+
+
+ /* Get source and destination data pointers. */
+ longs_per_scanline = LONGS_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ ref_p0 = (unsigned int *) get_regen_ptr(0, offset << 2);
+ save_dest_ptr = (unsigned int *) sc.ConsoleBufInfo.lpBitMap +
+ (screen_y << 1) * longs_per_scanline +
+ (screen_x >> 1);
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ /*
+ * Build up DIB: 4 consecutive bytes in video memory correspond to 8
+ * pixels, the first byte containing plane 0 bits, the second byte plane 1
+ * and so on. This mode is low resolution so each pixel in video memory
+ * becomes a block of 4 pixels on the PC screen.
+ * The DIB contains the bottom line of pixels first, then second bottom
+ * so on.
+ */
+ local_height = height;
+ do
+ {
+ p0 = ref_p0;
+ local_width = width;
+ dest_ptr = save_dest_ptr;
+
+ do
+ {
+ data0 = *p0++;
+ data3 = HIBYTE(HIWORD(data0));
+ data2 = LOBYTE(HIWORD(data0));
+ data1 = HIBYTE(LOWORD(data0));
+ data0 = LOBYTE(LOWORD(data0));
+
+ *(dest_ptr + longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_3_0[data0] | ega_lo_graph_3_1[data1]
+ | ega_lo_graph_3_2[data2] | ega_lo_graph_3_3[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_2_0[data0] | ega_lo_graph_2_1[data1]
+ | ega_lo_graph_2_2[data2] | ega_lo_graph_2_3[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_1_0[data0] | ega_lo_graph_1_1[data1]
+ | ega_lo_graph_1_2[data2] | ega_lo_graph_1_3[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_0_0[data0] | ega_lo_graph_0_1[data1]
+ | ega_lo_graph_0_2[data2] | ega_lo_graph_0_3[data3];
+ dest_ptr++;
+
+ }
+ while(--local_width);
+
+ save_dest_ptr += 2 * longs_per_scanline;
+ ref_p0 += get_offset_per_line();
+ }
+ while(--local_height);
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Display the new image. */
+ rect.Left = screen_x << 1;
+ rect.Top = screen_y << 1;
+ rect.Right = rect.Left + (width << 4) - 1;
+ rect.Bottom = rect.Top + (height << 1) - 1;
+
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ //DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint win32 screen (MODE 13: PC 320x200. SoftPC 960x600) ::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_lo_graph_big(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+#ifdef BIGWIN
+ unsigned int *p0,
+ *ref_p0,
+ *dest_ptr,
+ *save_dest_ptr,
+ data0,
+ data1,
+ data2,
+ data3;
+ int local_width,
+ local_height,
+ longs_per_scanline;
+ SMALL_RECT rect;
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_lo_graph_big off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height );
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+ /*
+ ** Tim September 92, sanity check parameters, if they're too big
+ ** it can cause a crash.
+ */
+ if( height>200 || width>40 ){
+ assert2( NO, "VDM: nt_ega_lo_graph_big() w=%d h=%d", width, height );
+ return;
+ }
+
+
+ /* Get source and destination data pointers. */
+ longs_per_scanline = LONGS_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ ref_p0 = (unsigned int *) get_regen_ptr(0, offset << 2);
+ save_dest_ptr = (unsigned int *) sc.ConsoleBufInfo.lpBitMap +
+ SCALE(screen_y << 1) * longs_per_scanline +
+ SCALE(screen_x >> 1);
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Build up DIB. */
+ local_height = height;
+ do
+ {
+ p0 = ref_p0;
+ local_width = width;
+ dest_ptr = save_dest_ptr;
+
+ do
+ {
+ data0 = *p0++;
+ data3 = HIBYTE(HIWORD(data0));
+ data2 = LOBYTE(HIWORD(data0));
+ data1 = HIBYTE(LOWORD(data0));
+ data0 = LOBYTE(LOWORD(data0));
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2*longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_5_0_big[data0]
+ | ega_lo_graph_5_1_big[data1]
+ | ega_lo_graph_5_2_big[data2]
+ | ega_lo_graph_5_3_big[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2*longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_4_0_big[data0]
+ | ega_lo_graph_4_1_big[data1]
+ | ega_lo_graph_4_2_big[data2]
+ | ega_lo_graph_4_3_big[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2*longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_3_0_big[data0]
+ | ega_lo_graph_3_1_big[data1]
+ | ega_lo_graph_3_2_big[data2]
+ | ega_lo_graph_3_3_big[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2*longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_2_0_big[data0]
+ | ega_lo_graph_2_1_big[data1]
+ | ega_lo_graph_2_2_big[data2]
+ | ega_lo_graph_2_3_big[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2*longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_1_0_big[data0]
+ | ega_lo_graph_1_1_big[data1]
+ | ega_lo_graph_1_2_big[data2]
+ | ega_lo_graph_1_3_big[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2*longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_0_0_big[data0]
+ | ega_lo_graph_0_1_big[data1]
+ | ega_lo_graph_0_2_big[data2]
+ | ega_lo_graph_0_3_big[data3];
+ dest_ptr++;
+
+ }
+ while( --local_width );
+
+ save_dest_ptr += 3 * longs_per_scanline;
+ ref_p0 += get_offset_per_line();
+ }
+ while(--local_height);
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Display the new image. */
+ rect.Left = SCALE(screen_x << 1);
+ rect.Top = SCALE(screen_y << 1);
+ rect.Right = rect.Left + SCALE(width << 4) - 1;
+ rect.Bottom = rect.Top + SCALE(height << 1) - 1;
+
+ /* Display the DIB. */
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ //DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+#endif /* BIGWIN */
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint win32 screen (MODE 13: PC 320x200. SoftPC 1280x800) ::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_lo_graph_huge(int offset, int screen_x, int screen_y,
+ int width, int height )
+{
+#ifdef BIGWIN
+ unsigned int *p0,
+ *ref_p0,
+ *dest_ptr,
+ *save_dest_ptr,
+ data0,
+ data1,
+ data2,
+ data3;
+ int local_width,
+ local_height,
+ longs_per_scanline;
+ SMALL_RECT rect;
+
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_lo_graph_huge off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height);
+
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+ /*
+ ** Tim September 92, sanity check parameters, if they're too big
+ ** it can cause a crash.
+ */
+ if( height>200 || width>40 ){
+ assert2( NO, "VDM: nt_ega_lo_graph_huge() w=%d h=%d", width, height );
+ return;
+ }
+
+
+ /* Get source and destination data pointers. */
+ longs_per_scanline = LONGS_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ ref_p0 = (unsigned int *) get_regen_ptr(0, offset << 2);
+ save_dest_ptr = (unsigned int *) sc.ConsoleBufInfo.lpBitMap +
+ SCALE(screen_y << 1) * longs_per_scanline +
+ SCALE(screen_x >> 1);
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Build up DIB. */
+ local_height = height;
+ do
+ {
+ p0 = ref_p0;
+ local_width = width;
+ dest_ptr = save_dest_ptr;
+
+ do
+ {
+ data0 = *p0++;
+ data3 = HIBYTE(HIWORD(data0));
+ data2 = LOBYTE(HIWORD(data0));
+ data1 = HIBYTE(LOWORD(data0));
+ data0 = LOBYTE(LOWORD(data0));
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2 * longs_per_scanline)
+ = *(dest_ptr + 3 * longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_7_0_huge[data0]
+ | ega_lo_graph_7_1_huge[data1]
+ | ega_lo_graph_7_2_huge[data2]
+ | ega_lo_graph_7_3_huge[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2 * longs_per_scanline)
+ = *(dest_ptr + 3 * longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_6_0_huge[data0]
+ | ega_lo_graph_6_1_huge[data1]
+ | ega_lo_graph_6_2_huge[data2]
+ | ega_lo_graph_6_3_huge[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2 * longs_per_scanline)
+ = *(dest_ptr + 3 * longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_5_0_huge[data0]
+ | ega_lo_graph_5_1_huge[data1]
+ | ega_lo_graph_5_2_huge[data2]
+ | ega_lo_graph_5_3_huge[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2 * longs_per_scanline)
+ = *(dest_ptr + 3 * longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_4_0_huge[data0]
+ | ega_lo_graph_4_1_huge[data1]
+ | ega_lo_graph_4_2_huge[data2]
+ | ega_lo_graph_4_3_huge[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2 * longs_per_scanline)
+ = *(dest_ptr + 3 * longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_3_0_huge[data0]
+ | ega_lo_graph_3_1_huge[data1]
+ | ega_lo_graph_3_2_huge[data2]
+ | ega_lo_graph_3_3_huge[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2 * longs_per_scanline)
+ = *(dest_ptr + 3 * longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_2_0_huge[data0]
+ | ega_lo_graph_2_1_huge[data1]
+ | ega_lo_graph_2_2_huge[data2]
+ | ega_lo_graph_2_3_huge[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2 * longs_per_scanline)
+ = *(dest_ptr + 3 * longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_1_0_huge[data0]
+ | ega_lo_graph_1_1_huge[data1]
+ | ega_lo_graph_1_2_huge[data2]
+ | ega_lo_graph_1_3_huge[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *(dest_ptr + 2 * longs_per_scanline)
+ = *(dest_ptr + 3 * longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_0_0_huge[data0]
+ | ega_lo_graph_0_1_huge[data1]
+ | ega_lo_graph_0_2_huge[data2]
+ | ega_lo_graph_0_3_huge[data3];
+ dest_ptr++;
+
+ }
+ while( --local_width );
+
+ save_dest_ptr += 4 * longs_per_scanline;
+ ref_p0 += get_offset_per_line();
+ } while(--local_height);
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Display the new image. */
+ rect.Left = SCALE(screen_x << 1);
+ rect.Top = SCALE(screen_y << 1);
+ rect.Right = rect.Left + SCALE(width << 4) - 1;
+ rect.Bottom = rect.Top + SCALE(height << 1) - 1;
+
+ /* Display the DIB. */
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ //DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+#endif /* BIGWIN */
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint Win32 screen (MODE 14: PC 640x200. SoftPC 640x400) :::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_med_graph_std(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+ register unsigned int *p0;
+ register char *dest_ptr;
+ register int local_height;
+ int bytes_per_scanline;
+ SMALL_RECT rect;
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_med_graph_std off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height );
+
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+ /*
+ ** Tim September 92, sanity check parameters, if they're too big
+ ** it can cause a crash.
+ */
+ if( height>200 || width>80 ){
+ assert2( NO, "VDM: nt_ega_med_graph_std() w=%d h=%d", width, height );
+ return;
+ }
+
+
+ /*
+ * Build up device-independent bitmap: one PC pixel is represented by two
+ * host pixels, one above the other.
+ */
+ bytes_per_scanline = BYTES_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ p0 = (unsigned int *) get_regen_ptr(0, offset << 2);
+ local_height = height;
+ dest_ptr = (char *) sc.ConsoleBufInfo.lpBitMap +
+ (screen_y << 1) * bytes_per_scanline +
+ screen_x;
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Build up the bitmap. */
+ do
+ {
+ ega_colour_hi_munge((unsigned char *) p0,
+ width,
+ (unsigned int *) dest_ptr,
+ ega_med_and_hi_graph_luts,
+ TWO_SCANLINES,
+ bytes_per_scanline);
+ p0 += get_offset_per_line();
+ dest_ptr += TWO_SCANLINES * bytes_per_scanline;
+ }
+ while( --local_height );
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Display the new image. */
+ rect.Left = screen_x;
+ rect.Top = screen_y << 1;
+ rect.Right = rect.Left + (width << 3) - 1;
+ rect.Bottom = rect.Top + (height << 1) - 1;
+
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ //DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint Win32 screen MODE 14: PC 640x200. SoftPC 960x600 :::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_med_graph_big(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+#ifdef BIGWIN
+ register unsigned int *p0;
+ register char *dest_ptr;
+ register int local_height;
+ int bytes_per_scanline;
+ SMALL_RECT rect;
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_med_graph_big off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height );
+
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+ /*
+ ** Tim September 92, sanity check parameters, if they're too big
+ ** it can cause a crash.
+ */
+ if( height>200 || width>80 ){
+ assert2( NO, "VDM: nt_ega_med_graph_big() w=%d h=%d", width, height );
+ return;
+ }
+
+
+ bytes_per_scanline = BYTES_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ p0 = (unsigned int *) get_regen_ptr(0, offset << 2);
+ local_height = height;
+ dest_ptr = (char *) sc.ConsoleBufInfo.lpBitMap +
+ SCALE(screen_y << 1) * bytes_per_scanline +
+ SCALE(screen_x);
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ do
+ {
+ ega_colour_hi_munge_big( (unsigned char *) p0,
+ width,
+ (unsigned int *) dest_ptr,
+ ega_med_and_hi_graph_luts_big,
+ THREE_SCANLINES,
+ bytes_per_scanline);
+ p0 += get_offset_per_line();
+ dest_ptr += THREE_SCANLINES * bytes_per_scanline;
+ }
+ while( --local_height );
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Display the new image. */
+ rect.Left = SCALE(screen_x);
+ rect.Top = SCALE(screen_y << 1);
+ rect.Right = rect.Left + SCALE(width << 3) - 1;
+ rect.Bottom = rect.Top + SCALE(height << 1) - 1;
+
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ //DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+#endif /* BIGWIN */
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint Win32 screen MODE 14: PC 640x200. SoftPC 1280x800 :::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_med_graph_huge(int offset, int screen_x, int screen_y,
+ int width, int height )
+{
+#ifdef BIGWIN
+ register unsigned int *p0;
+ register char *dest_ptr;
+ register int local_height;
+ int bytes_per_scanline;
+ SMALL_RECT rect;
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_med_graph_huge off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height );
+
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+ /*
+ ** Tim September 92, sanity check parameters, if they're too big
+ ** it can cause a crash.
+ */
+ if( height>200 || width>80 ){
+ assert2( NO, "VDM: nt_ega_med_graph_huge() w=%d h=%d", width, height );
+ return;
+ }
+
+
+ bytes_per_scanline = BYTES_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ p0 = (unsigned int *) get_regen_ptr(0, offset << 2);
+ local_height = height;
+ dest_ptr = (char *) sc.ConsoleBufInfo.lpBitMap +
+ SCALE(screen_y << 1) * bytes_per_scanline +
+ SCALE(screen_x);
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ do
+ {
+ ega_colour_hi_munge_huge( (unsigned char *) p0,
+ width,
+ (unsigned int *) dest_ptr,
+ ega_med_and_hi_graph_luts_huge,
+ FOUR_SCANLINES,
+ bytes_per_scanline);
+ p0 += get_offset_per_line();
+ dest_ptr += FOUR_SCANLINES * bytes_per_scanline;
+ }
+ while( --local_height );
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Display the new image. */
+ rect.Left = SCALE(screen_x);
+ rect.Top = SCALE(screen_y << 1);
+ rect.Right = rect.Left + SCALE(width << 3) - 1;
+ rect.Bottom = rect.Top + SCALE(height << 1) - 1;
+
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ //DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+#endif /* BIGWIN */
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint Win32 screen (MODE 16: PC 640x350. SoftPC 960x375) :::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_hi_graph_std(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+ register unsigned int *p0;
+ register char *dest_ptr;
+ register int local_height;
+ int bytes_per_scanline;
+ SMALL_RECT rect;
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_hi_graph_std off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height);
+
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+ /*
+ ** Tim September 92, sanity check parameters, if they're too big
+ ** it can cause a crash.
+ */
+ if( height>480 || width>80 ){
+ assert2( NO, "VDM: nt_ega_hi_graph_std() w=%d h=%d", width, height );
+ return;
+ }
+
+ /* Build up the device independent bitmap. */
+ p0 = ( unsigned int *) get_regen_ptr( 0, offset << 2 );
+ local_height = height;
+ bytes_per_scanline = BYTES_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ dest_ptr = (char *) sc.ConsoleBufInfo.lpBitMap +
+ screen_y * bytes_per_scanline +
+ screen_x;
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ do
+ {
+ ega_colour_hi_munge((unsigned char *) p0,
+ width,
+ (unsigned int *) dest_ptr,
+ ega_med_and_hi_graph_luts,
+ ONE_SCANLINE,
+ 0);
+ p0 += get_offset_per_line();
+ dest_ptr += bytes_per_scanline;
+ }
+ while( --local_height );
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Display the new image. */
+ rect.Left = screen_x;
+ rect.Top = screen_y;
+ rect.Right = rect.Left + (width << 3) - 1;
+ rect.Bottom = rect.Top + height - 1;
+
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ //DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+}
+
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint Win32 screen (MODE 16: PC 640x350. SoftPC 960x525) :::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_hi_graph_big(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+#ifdef BIGWIN
+ register unsigned int *p0;
+ register char *dest_ptr;
+ register int local_height;
+ register int local_screen_y;
+ register int scale_width_in_bits;
+ int bytes_per_scanline;
+ BOOL two_lines;
+ SMALL_RECT rect;
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_hi_graph_big off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height );
+
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+ /*
+ ** Tim September 92, sanity check parameters, if they're too big
+ ** it can cause a crash.
+ */
+ if( height>480 || width>80 ){
+ assert2( NO, "VDM: nt_ega_hi_graph_big() w=%d h=%d", width, height );
+ return;
+ }
+
+
+ /* Get pointer to video memory. */
+ p0 = (unsigned int *) get_regen_ptr(0, offset << 2);
+
+ /*
+ * Get pointer into bitmap, which alternates 2 lines and 1 line so that,
+ * memory line 0 -> bitmap 0,
+ * 1 -> 2,
+ * 2 -> 3,
+ * 3 -> 5,
+ * 4 -> 6 etc.
+ * hence the local_screen_y assignment.
+ */
+ local_screen_y = SCALE(screen_y + 1) - 1;
+ bytes_per_scanline = BYTES_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ dest_ptr = (char *) sc.ConsoleBufInfo.lpBitMap +
+ local_screen_y * bytes_per_scanline +
+ SCALE(screen_x);
+
+ /*
+ * 2 lines are output to the SoftPC screen if this is an odd line, 1 line
+ * if it is even.
+ */
+ two_lines = screen_y & 1 ? FALSE : TRUE;
+
+ /*
+ * One bit in video memory planes corresponds to one pixel. Each pixel
+ * is represented by one byte in the bitmap. Two pixels are scaled to
+ * three in the bitmap. `scale_width_in_bits' is the number of bytes that
+ * will be output to a bitmap line.
+ */
+ scale_width_in_bits = SCALE(width << 3);
+
+ /* Storage for actual number of lines in bitmap. */
+ local_height = 0;
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ do
+ {
+ ega_colour_hi_munge_big((unsigned char *) p0,
+ width,
+ (unsigned int *) dest_ptr,
+ ega_med_and_hi_graph_luts_big,
+ ONE_SCANLINE,
+ 0);
+
+ /* one line done, alternate ones have to be doubled */
+ if(two_lines)
+ {
+ memcpy(dest_ptr + bytes_per_scanline,
+ dest_ptr,
+ scale_width_in_bits);
+ dest_ptr += 2 * bytes_per_scanline;
+ local_height += 2;
+ }
+ else
+ {
+ dest_ptr += bytes_per_scanline;
+ local_height++;
+ }
+ two_lines = !two_lines;
+
+ p0 += get_offset_per_line();
+ }
+ while(--height);
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Display the new image. */
+ rect.Left = SCALE(screen_x);
+ rect.Top = local_screen_y;
+ rect.Right = rect.Left + scale_width_in_bits - 1;
+ rect.Bottom = rect.Top + local_height - 1;
+
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ //DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+#endif /* BIGWIN */
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint Win32 screen (MODE 16: PC 640x350. SoftPC 1280x700) :::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_hi_graph_huge(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+#ifdef BIGWIN
+ register unsigned int *p0;
+ register char *dest_ptr;
+ register int local_height;
+ int bytes_per_scanline;
+ SMALL_RECT rect;
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_hi_graph_huge off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height);
+
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+ /*
+ ** Tim September 92, sanity check parameters, if they're too big
+ ** it can cause a crash.
+ */
+ if( height>480 || width>80 ){
+ assert2( NO, "VDM: nt_ega_hi_graph_huge() w=%d h=%d", width, height );
+ return;
+ }
+
+
+ p0 = (unsigned int *) get_regen_ptr(0, offset << 2);
+ local_height = height;
+ bytes_per_scanline = BYTES_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ dest_ptr = (char *) sc.ConsoleBufInfo.lpBitMap +
+ SCALE(screen_y) * bytes_per_scanline +
+ SCALE(screen_x);
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ do
+ {
+ ega_colour_hi_munge_huge((unsigned char *) p0,
+ width,
+ (unsigned int *) dest_ptr,
+ ega_med_and_hi_graph_luts_huge,
+ ONE_SCANLINE,
+ 0);
+
+ p0 += get_offset_per_line();
+ memcpy(dest_ptr + bytes_per_scanline, dest_ptr, SCALE(width << 3));
+ dest_ptr += 2 * bytes_per_scanline;
+ }
+ while( --local_height );
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ /* Display the new image. */
+ rect.Left = SCALE(screen_x);
+ rect.Top = SCALE(screen_y);
+ rect.Right = rect.Left + SCALE(width << 3) - 1;
+ rect.Bottom = rect.Top + SCALE(height) - 1;
+
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ //DisplayErrorTerm(EHS_FUNC_FAILED,GetLastError(),__FILE__,__LINE__);
+#endif /* BIGWIN */
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint Win32 screen (MODE : EGA mono low res graphics) ::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_mono_lo_graph_std(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_mono_lo_graph_std off=%d x=%d y=%d width=%d height=%d - NOT SUPPORTED\n",
+ offset, screen_x, screen_y, width, height);
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*:::: Paint function for EGA mono low res graphics on big screen ::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_mono_lo_graph_big(int offset, int screen_x, int screen_y,
+ int width, int height )
+{
+sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_mono_lo_graph_big off=%d x=%d y=%d width=%d height=%d - NOT SUPPORTED\n",
+ offset, screen_x, screen_y, width, height);
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*:::: Paint function for EGA mono low res graphics on huge screen :::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_mono_lo_graph_huge(int offset, int screen_x, int screen_y,
+ int width, int height )
+{
+sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_mono_lo_graph_huge off=%d x=%d y=%d width=%d h=%d - NOT SUPPORTED\n",
+ offset, screen_x, screen_y, width, height );
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::::::: Paint function for EGA mono med res graphics :::::::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_mono_med_graph_std(int offset, int screen_x, int screen_y,
+ int width, int height)
+
+{
+sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_mono_med_graph_std off=%d x=%d y=%d width=%d height=%d - NOT SUPPORTED\n",
+ offset, screen_x, screen_y, width, height);
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*:::: Paint function for EGA mono med res graphics on big screen ::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_mono_med_graph_big(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_mono_med_graph_big off=%d x=%d y=%d width=%d height=%d - NOT SUPPORTED\n",
+ offset, screen_x, screen_y, width, height);
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*:::: Paint function for EGA mono med res graphics on huge screen :::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_mono_med_graph_huge(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_mono_med_graph_huge off=%d x=%d y=%d width=%d h=%d - NOT SUPPORTED\n",
+ offset, screen_x, screen_y, width, height);
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*:::::::::::: Paint function for EGA mono hi res graphics :::::::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_mono_hi_graph_std_byte(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_mono_hi_graph_std_byte off=%d x=%d y=%d width=%d height=%d - NOT SUPPORTED\n",
+ offset, screen_x, screen_y, width, height);
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*:::::::::::: Paint function for EGA mono hi res graphics (long):::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_mono_hi_graph_std_long(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_mono_hi_graph_std_long off=%d x=%d y=%d width=%d height=%d - NOT SUPPORTED\n",
+ offset, screen_x, screen_y, width, height);
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*:::::::::::: Paint function for EGA mono hi res graphics :::::::::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_mono_hi_graph_std(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_mono_hi_graph_std off=%d x=%d y=%d width=%d height=%d - NOT SUPPORTED\n",
+ offset, screen_x, screen_y, width, height);
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*:::::: Paint function for EGA mono hi res graphics on big screen::::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_mono_hi_graph_big(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_mono_hi_graph_big off=%d x=%d y=%d width=%d height=%d - NOT SUPPORTED\n",
+ offset, screen_x, screen_y, width, height);
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*:::::: Paint function for EGA mono hi res graphics on huge screen:::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_mono_hi_graph_huge(int offset, int screen_x, int screen_y,
+ int width, int height )
+{
+sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_mono_hi_graph_huge off=%d x=%d y=%d width=%d h=%d - NOT SUPPORTED\n",
+ offset, screen_x, screen_y, width, height);
+}
+
+#ifdef MONITOR
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint frozen screen (MODE 13: PC 320x200. SoftPC 640x400) :::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_lo_frozen_std(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+ UTINY *plane1_ptr,
+ *plane2_ptr,
+ *plane3_ptr,
+ *plane4_ptr;
+ ULONG *dest_ptr,
+ *save_dest_ptr,
+ mem_loc,
+ data0,
+ data1,
+ data2,
+ data3,
+ local_width,
+ local_height,
+ longs_per_scanline,
+ bpl = get_bytes_per_line(),
+ mem_x = screen_x >> 3,
+ max_width = sc.PC_W_Width >> 4,
+ max_height = sc.PC_W_Height >> 1;
+ SMALL_RECT rect;
+ BOOL fMutexTaken = FALSE;
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_lo_frozen_std off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height);
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+
+ /* If the image is completely outside the display area do nothing. */
+ if ((mem_x >= max_width) || ((ULONG) screen_y >= max_height))
+ {
+ sub_note_trace2(EGA_HOST_VERBOSE,
+ "VDM: nt_ega_lo_frozen_std() x=%d y=%d",
+ screen_x, screen_y);
+ return;
+ }
+
+ /*
+ * If image partially overlaps display area clip it so we don't start
+ * overwriting invalid pieces of memory.
+ */
+ if (mem_x + width > max_width)
+ width = max_width - mem_x;
+ if ((ULONG) (screen_y + height) > max_height)
+ height = max_height - screen_y;
+
+ /* memory involved here liable to be suddenly removed due to fs switch */
+ try
+ {
+ /* Get source and destination data pointers. */
+ plane1_ptr = GET_OFFSET(Plane1Offset);
+ plane2_ptr = GET_OFFSET(Plane2Offset);
+ plane3_ptr = GET_OFFSET(Plane3Offset);
+ plane4_ptr = GET_OFFSET(Plane4Offset);
+ longs_per_scanline = LONGS_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ save_dest_ptr = (unsigned int *) sc.ConsoleBufInfo.lpBitMap +
+ (screen_y << 1) * longs_per_scanline +
+ (screen_x >> 1);
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ fMutexTaken = TRUE;
+
+ /*
+ * Build up DIB: 4 consecutive bytes in video memory correspond to 8
+ * pixels the first byte containing plane 0, the second byte plane 1
+ * and so on. This mode is low resolution so each pixel in video memory
+ * becomes a block of 4 pixels on the PC screen.
+ * The DIB contains the bottom line of pixels first, then second bottom
+ * so on.
+ */
+ local_height = height;
+ do
+ {
+ local_width = width;
+ dest_ptr = save_dest_ptr;
+ mem_loc = offset;
+ do
+ {
+ data0 = *(plane1_ptr + mem_loc);
+ data1 = *(plane2_ptr + mem_loc);
+ data2 = *(plane3_ptr + mem_loc);
+ data3 = *(plane4_ptr + mem_loc);
+
+ *(dest_ptr + longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_3_0[data0] | ega_lo_graph_3_1[data1]
+ | ega_lo_graph_3_2[data2] | ega_lo_graph_3_3[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_2_0[data0] | ega_lo_graph_2_1[data1]
+ | ega_lo_graph_2_2[data2] | ega_lo_graph_2_3[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_1_0[data0] | ega_lo_graph_1_1[data1]
+ | ega_lo_graph_1_2[data2] | ega_lo_graph_1_3[data3];
+ dest_ptr++;
+
+ *(dest_ptr + longs_per_scanline)
+ = *dest_ptr
+ = ega_lo_graph_0_0[data0] | ega_lo_graph_0_1[data1]
+ | ega_lo_graph_0_2[data2] | ega_lo_graph_0_3[data3];
+ dest_ptr++;
+ mem_loc++;
+ }
+ while(--local_width);
+ save_dest_ptr += 2 * longs_per_scanline;
+ offset += bpl;
+ }
+ while(--local_height);
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ fMutexTaken = FALSE;
+
+ /* Display the new image. */
+ rect.Left = screen_x << 1;
+ rect.Top = screen_y << 1;
+ rect.Right = rect.Left + (width << 4) - 1;
+ rect.Bottom = rect.Top + (height << 1) - 1;
+
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ } except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ assert0(NO, "Handled fault in nt_ega_lo_frozen_std. fs switch?");
+ if (fMutexTaken)
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+ return;
+ }
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint frozen screen (MODE 14: PC 640x200. SoftPC 640x400) :::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_med_frozen_std(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+ ULONG local_height,
+ local_width,
+ longs_per_scanline,
+ *dest_ptr,
+ *ref_dest_ptr,
+ *lut0_ptr = ega_med_and_hi_graph_luts,
+ *lut1_ptr = lut0_ptr + LUT_OFFSET,
+ *lut2_ptr = lut1_ptr + LUT_OFFSET,
+ *lut3_ptr = lut2_ptr + LUT_OFFSET,
+ *l_ptr,
+ hi_res,
+ lo_res,
+ mem_loc,
+ bpl = get_bytes_per_line(),
+ plane_mask = get_plane_mask(),
+ mem_x = screen_x >> 3,
+ max_width = sc.PC_W_Width >> 3,
+ max_height = sc.PC_W_Height >> 1;
+ UTINY *plane1_ptr,
+ *plane2_ptr,
+ *plane3_ptr,
+ *plane4_ptr;
+ SMALL_RECT rect;
+ BOOL fMutexTaken = FALSE;
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_med_frozen_std off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height );
+
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+
+ /* If the image is completely outside the display area do nothing. */
+ if ((mem_x >= max_width) || ((ULONG) screen_y >= max_height))
+ {
+ sub_note_trace2(EGA_HOST_VERBOSE,
+ "VDM: nt_ega_med_frozen_std() x=%d y=%d",
+ screen_x, screen_y);
+ return;
+ }
+
+ /*
+ * If image partially overlaps display area clip it so we don't start
+ * overwriting invalid pieces of memory.
+ */
+ if (mem_x + width > max_width)
+ width = max_width - mem_x;
+ if ((ULONG) (screen_y + height) > max_height)
+ height = max_height - screen_y;
+
+ /* memory involved here liable to be suddenly removed due to fs switch */
+ try
+ {
+ /*
+ * Build up device-independent bitmap: one PC pixel is represented by
+ * two host pixels, one above the other.
+ */
+ plane1_ptr = GET_OFFSET(Plane1Offset);
+ plane2_ptr = GET_OFFSET(Plane2Offset);
+ plane3_ptr = GET_OFFSET(Plane3Offset);
+ plane4_ptr = GET_OFFSET(Plane4Offset);
+ longs_per_scanline = LONGS_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ ref_dest_ptr = (ULONG *) sc.ConsoleBufInfo.lpBitMap +
+ (screen_y << 1) * longs_per_scanline +
+ (screen_x >> 2);
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ fMutexTaken = TRUE;
+
+ /* Build up the bitmap. */
+ local_height = height;
+ do
+ {
+ dest_ptr = ref_dest_ptr;
+ mem_loc = offset;
+ local_width = width;
+ do
+ {
+ hi_res = 0;
+ lo_res = 0;
+
+ /* Get 8 bytes of output data from 1 byte of plane 0 data. */
+ if (plane_mask & 1)
+ {
+ l_ptr = &lut0_ptr[*(plane1_ptr + mem_loc) << 1];
+ hi_res = *l_ptr++;
+ lo_res = *l_ptr;
+ }
+
+ /* Or in the output data from plane 1 */
+ if (plane_mask & 2)
+ {
+ l_ptr = &lut1_ptr[*(plane2_ptr + mem_loc) << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+
+ /* Or in the output data from plane 2 */
+ if (plane_mask & 4)
+ {
+ l_ptr = &lut2_ptr[*(plane3_ptr + mem_loc) << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+
+ /* Or in the output data from plane 3 */
+ if (plane_mask & 8)
+ {
+ l_ptr = &lut3_ptr[*(plane4_ptr + mem_loc) << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+
+ /* Now store it in the bitmap. */
+ *(dest_ptr + longs_per_scanline) = *dest_ptr = hi_res;
+ dest_ptr++;
+ *(dest_ptr + longs_per_scanline) = *dest_ptr = lo_res;
+ *dest_ptr++;
+ mem_loc++;
+ }
+ while (--local_width);
+ ref_dest_ptr += 2 * longs_per_scanline;
+ offset += bpl;
+ }
+ while(--local_height);
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ fMutexTaken = FALSE;
+
+ /* Display the new image. */
+ rect.Left = screen_x;
+ rect.Top = screen_y << 1;
+ rect.Right = rect.Left + (width << 3) - 1;
+ rect.Bottom = rect.Top + (height << 1) - 1;
+
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ } except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ assert0(NO, "Handled fault in nt_ega_med_frozen_std. fs switch?");
+ if (fMutexTaken)
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+ return;
+ }
+}
+
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/*::::::: Paint frozen screen (MODE 16: PC 640x350. SoftPC 640x350) ::::::::*/
+/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+
+void nt_ega_hi_frozen_std(int offset, int screen_x, int screen_y,
+ int width, int height)
+{
+ ULONG local_height,
+ local_width,
+ longs_per_scanline,
+ *dest_ptr,
+ *ref_dest_ptr,
+ *lut0_ptr = ega_med_and_hi_graph_luts,
+ *lut1_ptr = lut0_ptr + LUT_OFFSET,
+ *lut2_ptr = lut1_ptr + LUT_OFFSET,
+ *lut3_ptr = lut2_ptr + LUT_OFFSET,
+ *l_ptr,
+ hi_res,
+ lo_res,
+ mem_loc,
+ bpl = get_bytes_per_line(),
+ plane_mask = get_plane_mask(),
+ mem_x = screen_x >> 3,
+ max_width = sc.PC_W_Width >> 3,
+ max_height = sc.PC_W_Height;
+ UTINY *plane1_ptr,
+ *plane2_ptr,
+ *plane3_ptr,
+ *plane4_ptr;
+ SMALL_RECT rect;
+ BOOL fMutexTaken = FALSE;
+
+ sub_note_trace5(EGA_HOST_VERBOSE,
+ "nt_ega_hi_frozen_std off=%d x=%d y=%d width=%d height=%d\n",
+ offset, screen_x, screen_y, width, height);
+
+ /*
+ ** Tim September 92, bounce call if handle to screen buffer is null.
+ ** This can happen when VDM session is about to suspend, buffer has
+ ** been closed, but still get a paint request.
+ */
+ if( sc.ScreenBufHandle == (HANDLE)NULL ){
+ assert0( NO, "VDM: rejected paint request due to NULL handle" );
+ return;
+ }
+
+ /* If the image is completely outside the display area do nothing. */
+ if ((mem_x >= max_width) || ((ULONG) screen_y >= max_height))
+ {
+ sub_note_trace2(EGA_HOST_VERBOSE,
+ "VDM: nt_ega_hi_frozen_std() x=%d y=%d",
+ screen_x, screen_y);
+ return;
+ }
+
+ /*
+ * If image partially overlaps display area clip it so we don't start
+ * overwriting invalid pieces of memory.
+ */
+ if (mem_x + width > max_width)
+ width = max_width - mem_x;
+ if ((ULONG) (screen_y + height) > max_height)
+ height = max_height - screen_y;
+
+ /* memory involved here liable to be suddenly removed due to fs switch */
+ try
+ {
+
+ /* Build up the device independent bitmap. */
+ local_height = height;
+ plane1_ptr = GET_OFFSET(Plane1Offset);
+ plane2_ptr = GET_OFFSET(Plane2Offset);
+ plane3_ptr = GET_OFFSET(Plane3Offset);
+ plane4_ptr = GET_OFFSET(Plane4Offset);
+ longs_per_scanline = LONGS_PER_SCANLINE(sc.ConsoleBufInfo.lpBitMapInfo);
+ ref_dest_ptr = (ULONG *) sc.ConsoleBufInfo.lpBitMap +
+ screen_y * longs_per_scanline +
+ (screen_x >> 2);
+
+ /* Grab the mutex. */
+ GrabMutex(sc.ConsoleBufInfo.hMutex);
+
+ fMutexTaken = TRUE;
+
+ do
+ {
+ dest_ptr = ref_dest_ptr;
+ local_width = width;
+ mem_loc = offset;
+ do
+ {
+
+ /* Get 8 bytes of output data from 1 byte of plane 0 data. */
+ if (plane_mask & 1)
+ {
+ l_ptr = &lut0_ptr[*(plane1_ptr + mem_loc) << 1];
+ hi_res = *l_ptr++;
+ lo_res = *l_ptr;
+ }
+
+ /* Or in the output data from plane 1 */
+ if (plane_mask & 2)
+ {
+ l_ptr = &lut1_ptr[*(plane2_ptr + mem_loc) << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+
+ /* Or in the output data from plane 2 */
+ if (plane_mask & 4)
+ {
+ l_ptr = &lut2_ptr[*(plane3_ptr + mem_loc) << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+
+ /* Or in the output data from plane 3 */
+ if (plane_mask & 8)
+ {
+ l_ptr = &lut3_ptr[*(plane4_ptr + mem_loc) << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+
+ /* Now store it in the bitmap. */
+ *dest_ptr++ = hi_res;
+ *dest_ptr++ = lo_res;
+ mem_loc++;
+ }
+ while (--local_width);
+ ref_dest_ptr += longs_per_scanline;
+ offset += bpl;
+ }
+ while( --local_height );
+
+ /* Release the mutex. */
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+
+ fMutexTaken = FALSE;
+
+ /* Display the new image. */
+ rect.Left = screen_x;
+ rect.Top = screen_y;
+ rect.Right = rect.Left + (width << 3) - 1;
+ rect.Bottom = rect.Top + height - 1;
+
+ if( sc.ScreenBufHandle )
+ if (!InvalidateConsoleDIBits(sc.ScreenBufHandle, &rect))
+ assert1( NO, "VDM: InvalidateConsoleDIBits() error:%#x",
+ GetLastError() );
+ } except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ assert0(NO, "Handled fault in nt_ega_hi_frozen_std. fs switch?");
+ if (fMutexTaken)
+ RelMutex(sc.ConsoleBufInfo.hMutex);
+ return;
+ }
+}
+#endif /* MONITOR */