summaryrefslogtreecommitdiff
path: root/board/MAI/bios_emulator/scitech/src/pm/tests
diff options
context:
space:
mode:
authorwdenk <wdenk>2002-11-19 11:04:11 +0000
committerwdenk <wdenk>2002-11-19 11:04:11 +0000
commitc7de829c796978e519984df2f1c8cfcf921a39a4 (patch)
tree43e42aa9a09f5265783c1622a5cea080471ef50e /board/MAI/bios_emulator/scitech/src/pm/tests
parent2262cfeef91458b01a1bfe3812ccbbfdf8b82807 (diff)
* Patch by Thomas Frieden, 13 Nov 2002:
Add code for AmigaOne board (preliminary merge to U-Boot, still WIP) * Patch by Jon Diekema, 12 Nov 2002: - Adding URL for IEEE OUI lookup - Making the autoboot #defines dependent on CONFIG_AUTOBOOT_KEYED being defined. - In the CONFIG_EXTRA_ENV_SETTINGS #define, the root-on-initrd and root-on-nfs macros are designed to switch how the default boot method gets defined.
Diffstat (limited to 'board/MAI/bios_emulator/scitech/src/pm/tests')
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/altbrk.c90
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/altcrit.c85
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/biosptr.c92
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/block.c69
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/brk.c78
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/callreal.c107
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/checks.c100
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/cpu.c46
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/critical.c70
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/getch.c501
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/isvesa.c110
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/key.c92
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/key15.c96
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/memtest.c106
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/mouse.c109
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/restore.c82
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/rtc.c92
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/save.c70
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/showpci.c253
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/tick.c94
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/timerc.c87
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/timercpp.cpp107
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/uswc.c311
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/vftest.c78
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/tests/video.c200
25 files changed, 3125 insertions, 0 deletions
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/altbrk.c b/board/MAI/bios_emulator/scitech/src/pm/tests/altbrk.c
new file mode 100644
index 0000000000..5d899b7a67
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/altbrk.c
@@ -0,0 +1,90 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to install a C based
+* control C/break interrupt handler. Note that this
+* alternate version does not work with all extenders.
+*
+* Functions tested: PM_installAltBreakHandler()
+* PM_restoreBreakHandler()
+*
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+volatile int breakHit = false;
+volatile int ctrlCHit = false;
+
+#pragma off (check_stack) /* No stack checking under Watcom */
+
+void PMAPI breakHandler(uint bHit)
+{
+ if (bHit)
+ breakHit = true;
+ else
+ ctrlCHit = true;
+}
+
+int main(void)
+{
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ PM_installAltBreakHandler(breakHandler);
+ printf("Control C/Break interrupt handler installed\n");
+ while (1) {
+ if (ctrlCHit) {
+ printf("Code termimated with Ctrl-C.\n");
+ break;
+ }
+ if (breakHit) {
+ printf("Code termimated with Ctrl-Break.\n");
+ break;
+ }
+ if (PM_kbhit() && PM_getch() == 0x1B) {
+ printf("No break code detected!\n");
+ break;
+ }
+ printf("Hit Ctrl-C or Ctrl-Break to exit!\n");
+ }
+
+ PM_restoreBreakHandler();
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/altcrit.c b/board/MAI/bios_emulator/scitech/src/pm/tests/altcrit.c
new file mode 100644
index 0000000000..c5390f68a9
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/altcrit.c
@@ -0,0 +1,85 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to install a C based
+* critical error handler.
+*
+* Functions tested: PM_installCriticalHandler()
+* PM_criticalError()
+* PM_restoreCriticalHandler()
+*
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+volatile uint criticalError = false;
+volatile uint axValue;
+volatile uint diValue;
+
+#pragma off (check_stack) /* No stack checking under Watcom */
+
+uint PMAPI criticalHandler(uint axVal,uint diVal)
+{
+ criticalError = true;
+ axValue = axVal;
+ diValue = diVal;
+ return 3; /* Tell MS-DOS to fail the operation */
+}
+
+int main(void)
+{
+ FILE *f;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ PM_installAltCriticalHandler(criticalHandler);
+ printf("Critical Error handler installed - trying to read from A: drive...\n");
+ f = fopen("a:\bog.bog","rb");
+ if (f) fclose(f);
+ if (criticalError) {
+ printf("Critical error occured on INT 21h function %02X!\n",
+ axValue >> 8);
+ }
+ else
+ printf("Critical error was not caught!\n");
+ PM_restoreCriticalHandler();
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/biosptr.c b/board/MAI/bios_emulator/scitech/src/pm/tests/biosptr.c
new file mode 100644
index 0000000000..43668487af
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/biosptr.c
@@ -0,0 +1,92 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to manipulate the
+* BIOS data area from protected mode using the PM
+* library. Compile and link with the appropriate command
+* line for your DOS extender.
+*
+* Functions tested: PM_getBIOSSelector()
+* PM_getLong()
+* PM_getByte()
+* PM_getWord()
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+/* Macros to obtain values from the BIOS data area */
+
+#define TICKS() PM_getLong(bios+0x6C)
+#define KB_STAT PM_getByte(bios+0x17)
+#define KB_HEAD PM_getWord(bios+0x1A)
+#define KB_TAIL PM_getWord(bios+0x1C)
+
+/* Macros for working with the keyboard buffer */
+
+#define KB_HIT() (KB_HEAD != KB_TAIL)
+#define CTRL() (KB_STAT & 4)
+#define SHIFT() (KB_STAT & 2)
+#define ESC 0x1B
+
+/* Selector for BIOS data area */
+
+uchar *bios;
+
+int main(void)
+{
+ int c,done = 0;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ bios = PM_getBIOSPointer();
+ printf("Hit any key to test, Ctrl-Shift-Esc to quit\n");
+ while (!done) {
+ if (KB_HIT()) {
+ c = PM_getch();
+ if (c == 0) PM_getch();
+ printf("TIME=%-8lX ST=%02X CHAR=%02X ", TICKS(), KB_STAT, c);
+ printf("\n");
+ if ((c == ESC) && SHIFT() && CTRL())/* Ctrl-Shift-Esc */
+ break;
+ }
+ }
+
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/block.c b/board/MAI/bios_emulator/scitech/src/pm/tests/block.c
new file mode 100644
index 0000000000..e948872956
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/block.c
@@ -0,0 +1,69 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+*
+* Description: Test program for the PM_blockUntilTimeout function.
+*
+****************************************************************************/
+
+#include <stdio.h>
+#include "pmapi.h"
+
+#define DELAY_MSECS 1100
+#define LOOPS 5
+
+/*-------------------------- Implementation -------------------------------*/
+
+/* The following routine takes a long count in microseconds and outputs
+ * a string representing the count in seconds. It could be modified to
+ * return a pointer to a static string representing the count rather
+ * than printing it out.
+ */
+
+void ReportTime(ulong count)
+{
+ ulong secs;
+
+ secs = count / 1000000L;
+ count = count - secs * 1000000L;
+ printf("Time taken: %lu.%06lu seconds\n",secs,count);
+}
+
+int main(void)
+{
+ int i;
+
+ printf("Detecting processor information ...");
+ fflush(stdout);
+ printf("\n\n%s\n", CPU_getProcessorName());
+ ZTimerInit();
+ LZTimerOn();
+ for (i = 0; i < LOOPS; i++) {
+ PM_blockUntilTimeout(DELAY_MSECS);
+ ReportTime(LZTimerLap());
+ }
+ LZTimerOff();
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/brk.c b/board/MAI/bios_emulator/scitech/src/pm/tests/brk.c
new file mode 100644
index 0000000000..3561fee921
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/brk.c
@@ -0,0 +1,78 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to install a C based
+* control C/break interrupt handler.
+*
+* Functions tested: PM_installBreakHandler()
+* PM_ctrlCHit()
+* PM_ctrlBreakHit()
+* PM_restoreBreakHandler()
+*
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+int main(void)
+{
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ PM_installBreakHandler();
+ printf("Control C/Break interrupt handler installed\n");
+ while (1) {
+ if (PM_ctrlCHit(1)) {
+ printf("Code termimated with Ctrl-C.\n");
+ break;
+ }
+ if (PM_ctrlBreakHit(1)) {
+ printf("Code termimated with Ctrl-Break.\n");
+ break;
+ }
+ if (PM_kbhit() && PM_getch() == 0x1B) {
+ printf("No break code detected!\n");
+ break;
+ }
+ printf("Hit Ctrl-C or Ctrl-Break to exit!\n");
+ }
+
+ PM_restoreBreakHandler();
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/callreal.c b/board/MAI/bios_emulator/scitech/src/pm/tests/callreal.c
new file mode 100644
index 0000000000..3897ce9999
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/callreal.c
@@ -0,0 +1,107 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to call a real mode
+* procedure. We simply copy a terribly simple assembly
+* language routine into a real mode block that we allocate,
+* and then attempt to call the routine and verify that it
+* was successful.
+*
+* Functions tested: PM_allocRealSeg()
+* PM_freeRealSeg()
+* PM_callRealMode()
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "pmapi.h"
+
+/* Block of real mode code we will eventually call */
+
+static unsigned char realModeCode[] = {
+ 0x93, /* xchg ax,bx */
+ 0x87, 0xCA, /* xchg cx,dx */
+ 0xCB /* retf */
+ };
+
+int main(void)
+{
+ RMREGS regs;
+ RMSREGS sregs;
+ uchar *p;
+ unsigned r_seg,r_off;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ /* Allocate a the block of real mode memory */
+ if ((p = PM_allocRealSeg(sizeof(realModeCode), &r_seg, &r_off)) == NULL) {
+ printf("Unable to allocate real mode memory!\n");
+ exit(1);
+ }
+
+ /* Copy the real mode code */
+ memcpy(p,realModeCode,sizeof(realModeCode));
+
+ /* Now call the real mode code */
+ regs.x.ax = 1;
+ regs.x.bx = 2;
+ regs.x.cx = 3;
+ regs.x.dx = 4;
+ regs.x.si = 5;
+ regs.x.di = 6;
+ sregs.es = 7;
+ sregs.ds = 8;
+ PM_callRealMode(r_seg,r_off,&regs,&sregs);
+ if (regs.x.ax != 2 || regs.x.bx != 1 || regs.x.cx != 4 || regs.x.dx != 3
+ || regs.x.si != 5 || regs.x.di != 6 || sregs.es != 7
+ || sregs.ds != 8) {
+ printf("Real mode call failed!\n");
+ printf("\n");
+ printf("ax = %04X, bx = %04X, cx = %04X, dx = %04X\n",
+ regs.x.ax,regs.x.bx,regs.x.cx,regs.x.dx);
+ printf("si = %04X, di = %04X, es = %04X, ds = %04X\n",
+ regs.x.si,regs.x.di,sregs.es,sregs.ds);
+ }
+ else
+ printf("Real mode call succeeded!\n");
+
+ /* Free the memory we allocated */
+ PM_freeRealSeg(p);
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/checks.c b/board/MAI/bios_emulator/scitech/src/pm/tests/checks.c
new file mode 100644
index 0000000000..81737e17d7
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/checks.c
@@ -0,0 +1,100 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+*
+* Description: Main module for building checked builds of products with
+* assertions and trace code.
+*
+****************************************************************************/
+
+#include "scitech.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef __WINDOWS__
+#define WIN32_LEAN_AND_MEAN
+#define STRICT
+#include <windows.h>
+#endif
+
+#ifdef CHECKED
+
+/*---------------------------- Global variables ---------------------------*/
+
+#define LOGFILE "\\scitech.log"
+
+void (*_CHK_fail)(int fatal,const char *msg,const char *cond,const char *file,int line) = _CHK_defaultFail;
+
+/*---------------------------- Implementation -----------------------------*/
+
+/****************************************************************************
+DESCRIPTION:
+Handles fatal error and warning conditions for checked builds.
+
+HEADER:
+scitech.h
+
+REMARKS:
+This function is called whenever an inline check or warning fails in any
+of the SciTech runtime libraries. Warning conditions simply cause the
+condition to be logged to the log file and send to the system debugger
+under Window. Fatal error conditions do all of the above, and then
+terminate the program with a fatal error conditions.
+
+This handler may be overriden by the user code if necessary to replace it
+with a different handler (the MGL for instance overrides this and replaces
+it with a handler that does an MGL_exit() before terminating the application
+so that it will clean up correctly.
+****************************************************************************/
+void _CHK_defaultFail(
+ int fatal,
+ const char *msg,
+ const char *cond,
+ const char *file,
+ int line)
+{
+ char buf[256];
+ FILE *log = fopen(LOGFILE, "at+");
+
+ sprintf(buf,msg,cond,file,line);
+ if (log) {
+ fputs(buf,log);
+ fflush(log);
+ fclose(log);
+#ifdef __WINDOWS__
+ OutputDebugStr(buf);
+#endif
+ }
+ if (fatal) {
+#ifdef __WINDOWS__
+ MessageBox(NULL, buf,"Fatal Error!",MB_ICONEXCLAMATION);
+#else
+ fputs(buf,stderr);
+#endif
+ exit(-1);
+ }
+}
+
+#endif /* CHECKED */
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/cpu.c b/board/MAI/bios_emulator/scitech/src/pm/tests/cpu.c
new file mode 100644
index 0000000000..34abb2418d
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/cpu.c
@@ -0,0 +1,46 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+*
+* Description: Test program for the CPU detection code.
+*
+****************************************************************************/
+
+#include "ztimer.h"
+#include "pmapi.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+/*----------------------------- Implementation ----------------------------*/
+
+int main(void)
+{
+ printf("Detecting processor information ...");
+ fflush(stdout);
+ printf("\n\n%s\n", CPU_getProcessorName());
+ if (CPU_haveRDTSC())
+ printf("\nProcessor supports Read Time Stamp Counter performance timer.\n");
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/critical.c b/board/MAI/bios_emulator/scitech/src/pm/tests/critical.c
new file mode 100644
index 0000000000..21ec9946f7
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/critical.c
@@ -0,0 +1,70 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to install a C based
+* critical error handler.
+*
+* Functions tested: PM_installAltCriticalHandler()
+* PM_restoreCriticalHandler()
+*
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+int main(void)
+{
+ FILE *f;
+ int axcode,dicode;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ PM_installCriticalHandler();
+ printf("Critical Error handler installed - trying to read from A: drive...\n");
+ f = fopen("a:\bog.bog","rb");
+ if (f) fclose(f);
+ if (PM_criticalError(&axcode,&dicode,1)) {
+ printf("Critical error occured on INT 21h function %02X!\n",
+ axcode >> 8);
+ }
+ else printf("Critical error was not caught!\n");
+ PM_restoreCriticalHandler();
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/getch.c b/board/MAI/bios_emulator/scitech/src/pm/tests/getch.c
new file mode 100644
index 0000000000..c70f7ee3c3
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/getch.c
@@ -0,0 +1,501 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+*
+* Description: Test program to test out the cross platform event handling
+* library.
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "pmapi.h"
+#include "event.h"
+
+/* Translation table for key codes */
+
+typedef struct {
+ int code;
+ char *name;
+ } KeyEntry;
+
+KeyEntry ASCIICodes[] = {
+ {ASCII_ctrlA ,"ASCII_ctrlA"},
+ {ASCII_ctrlB ,"ASCII_ctrlB"},
+ {ASCII_ctrlC ,"ASCII_ctrlC"},
+ {ASCII_ctrlD ,"ASCII_ctrlD"},
+ {ASCII_ctrlE ,"ASCII_ctrlE"},
+ {ASCII_ctrlF ,"ASCII_ctrlF"},
+ {ASCII_ctrlG ,"ASCII_ctrlG"},
+ {ASCII_backspace ,"ASCII_backspace"},
+ {ASCII_ctrlH ,"ASCII_ctrlH"},
+ {ASCII_tab ,"ASCII_tab"},
+ {ASCII_ctrlI ,"ASCII_ctrlI"},
+ {ASCII_ctrlJ ,"ASCII_ctrlJ"},
+ {ASCII_ctrlK ,"ASCII_ctrlK"},
+ {ASCII_ctrlL ,"ASCII_ctrlL"},
+ {ASCII_enter ,"ASCII_enter"},
+ {ASCII_ctrlM ,"ASCII_ctrlM"},
+ {ASCII_ctrlN ,"ASCII_ctrlN"},
+ {ASCII_ctrlO ,"ASCII_ctrlO"},
+ {ASCII_ctrlP ,"ASCII_ctrlP"},
+ {ASCII_ctrlQ ,"ASCII_ctrlQ"},
+ {ASCII_ctrlR ,"ASCII_ctrlR"},
+ {ASCII_ctrlS ,"ASCII_ctrlS"},
+ {ASCII_ctrlT ,"ASCII_ctrlT"},
+ {ASCII_ctrlU ,"ASCII_ctrlU"},
+ {ASCII_ctrlV ,"ASCII_ctrlV"},
+ {ASCII_ctrlW ,"ASCII_ctrlW"},
+ {ASCII_ctrlX ,"ASCII_ctrlX"},
+ {ASCII_ctrlY ,"ASCII_ctrlY"},
+ {ASCII_ctrlZ ,"ASCII_ctrlZ"},
+ {ASCII_esc ,"ASCII_esc"},
+ {ASCII_space ,"ASCII_space"},
+ {ASCII_exclamation ,"ASCII_exclamation"},
+ {ASCII_quote ,"ASCII_quote"},
+ {ASCII_pound ,"ASCII_pound"},
+ {ASCII_dollar ,"ASCII_dollar"},
+ {ASCII_percent ,"ASCII_percent"},
+ {ASCII_ampersand ,"ASCII_ampersand"},
+ {ASCII_apostrophe ,"ASCII_apostrophe"},
+ {ASCII_leftBrace ,"ASCII_leftBrace"},
+ {ASCII_rightBrace ,"ASCII_rightBrace"},
+ {ASCII_times ,"ASCII_times"},
+ {ASCII_plus ,"ASCII_plus"},
+ {ASCII_comma ,"ASCII_comma"},
+ {ASCII_minus ,"ASCII_minus"},
+ {ASCII_period ,"ASCII_period"},
+ {ASCII_divide ,"ASCII_divide"},
+ {ASCII_0 ,"ASCII_0"},
+ {ASCII_1 ,"ASCII_1"},
+ {ASCII_2 ,"ASCII_2"},
+ {ASCII_3 ,"ASCII_3"},
+ {ASCII_4 ,"ASCII_4"},
+ {ASCII_5 ,"ASCII_5"},
+ {ASCII_6 ,"ASCII_6"},
+ {ASCII_7 ,"ASCII_7"},
+ {ASCII_8 ,"ASCII_8"},
+ {ASCII_9 ,"ASCII_9"},
+ {ASCII_colon ,"ASCII_colon"},
+ {ASCII_semicolon ,"ASCII_semicolon"},
+ {ASCII_lessThan ,"ASCII_lessThan"},
+ {ASCII_equals ,"ASCII_equals"},
+ {ASCII_greaterThan ,"ASCII_greaterThan"},
+ {ASCII_question ,"ASCII_question"},
+ {ASCII_at ,"ASCII_at"},
+ {ASCII_A ,"ASCII_A"},
+ {ASCII_B ,"ASCII_B"},
+ {ASCII_C ,"ASCII_C"},
+ {ASCII_D ,"ASCII_D"},
+ {ASCII_E ,"ASCII_E"},
+ {ASCII_F ,"ASCII_F"},
+ {ASCII_G ,"ASCII_G"},
+ {ASCII_H ,"ASCII_H"},
+ {ASCII_I ,"ASCII_I"},
+ {ASCII_J ,"ASCII_J"},
+ {ASCII_K ,"ASCII_K"},
+ {ASCII_L ,"ASCII_L"},
+ {ASCII_M ,"ASCII_M"},
+ {ASCII_N ,"ASCII_N"},
+ {ASCII_O ,"ASCII_O"},
+ {ASCII_P ,"ASCII_P"},
+ {ASCII_Q ,"ASCII_Q"},
+ {ASCII_R ,"ASCII_R"},
+ {ASCII_S ,"ASCII_S"},
+ {ASCII_T ,"ASCII_T"},
+ {ASCII_U ,"ASCII_U"},
+ {ASCII_V ,"ASCII_V"},
+ {ASCII_W ,"ASCII_W"},
+ {ASCII_X ,"ASCII_X"},
+ {ASCII_Y ,"ASCII_Y"},
+ {ASCII_Z ,"ASCII_Z"},
+ {ASCII_leftSquareBrace ,"ASCII_leftSquareBrace"},
+ {ASCII_backSlash ,"ASCII_backSlash"},
+ {ASCII_rightSquareBrace ,"ASCII_rightSquareBrace"},
+ {ASCII_caret ,"ASCII_caret"},
+ {ASCII_underscore ,"ASCII_underscore"},
+ {ASCII_leftApostrophe ,"ASCII_leftApostrophe"},
+ {ASCII_a ,"ASCII_a"},
+ {ASCII_b ,"ASCII_b"},
+ {ASCII_c ,"ASCII_c"},
+ {ASCII_d ,"ASCII_d"},
+ {ASCII_e ,"ASCII_e"},
+ {ASCII_f ,"ASCII_f"},
+ {ASCII_g ,"ASCII_g"},
+ {ASCII_h ,"ASCII_h"},
+ {ASCII_i ,"ASCII_i"},
+ {ASCII_j ,"ASCII_j"},
+ {ASCII_k ,"ASCII_k"},
+ {ASCII_l ,"ASCII_l"},
+ {ASCII_m ,"ASCII_m"},
+ {ASCII_n ,"ASCII_n"},
+ {ASCII_o ,"ASCII_o"},
+ {ASCII_p ,"ASCII_p"},
+ {ASCII_q ,"ASCII_q"},
+ {ASCII_r ,"ASCII_r"},
+ {ASCII_s ,"ASCII_s"},
+ {ASCII_t ,"ASCII_t"},
+ {ASCII_u ,"ASCII_u"},
+ {ASCII_v ,"ASCII_v"},
+ {ASCII_w ,"ASCII_w"},
+ {ASCII_x ,"ASCII_x"},
+ {ASCII_y ,"ASCII_y"},
+ {ASCII_z ,"ASCII_z"},
+ {ASCII_leftCurlyBrace ,"ASCII_leftCurlyBrace"},
+ {ASCII_verticalBar ,"ASCII_verticalBar"},
+ {ASCII_rightCurlyBrace ,"ASCII_rightCurlyBrace"},
+ {ASCII_tilde ,"ASCII_tilde"},
+ {0 ,"ASCII_unknown"},
+ };
+
+KeyEntry ScanCodes[] = {
+ {KB_padEnter ,"KB_padEnter"},
+ {KB_padMinus ,"KB_padMinus"},
+ {KB_padPlus ,"KB_padPlus"},
+ {KB_padTimes ,"KB_padTimes"},
+ {KB_padDivide ,"KB_padDivide"},
+ {KB_padLeft ,"KB_padLeft"},
+ {KB_padRight ,"KB_padRight"},
+ {KB_padUp ,"KB_padUp"},
+ {KB_padDown ,"KB_padDown"},
+ {KB_padInsert ,"KB_padInsert"},
+ {KB_padDelete ,"KB_padDelete"},
+ {KB_padHome ,"KB_padHome"},
+ {KB_padEnd ,"KB_padEnd"},
+ {KB_padPageUp ,"KB_padPageUp"},
+ {KB_padPageDown ,"KB_padPageDown"},
+ {KB_padCenter ,"KB_padCenter"},
+ {KB_F1 ,"KB_F1"},
+ {KB_F2 ,"KB_F2"},
+ {KB_F3 ,"KB_F3"},
+ {KB_F4 ,"KB_F4"},
+ {KB_F5 ,"KB_F5"},
+ {KB_F6 ,"KB_F6"},
+ {KB_F7 ,"KB_F7"},
+ {KB_F8 ,"KB_F8"},
+ {KB_F9 ,"KB_F9"},
+ {KB_F10 ,"KB_F10"},
+ {KB_F11 ,"KB_F11"},
+ {KB_F12 ,"KB_F12"},
+ {KB_left ,"KB_left"},
+ {KB_right ,"KB_right"},
+ {KB_up ,"KB_up"},
+ {KB_down ,"KB_down"},
+ {KB_insert ,"KB_insert"},
+ {KB_delete ,"KB_delete"},
+ {KB_home ,"KB_home"},
+ {KB_end ,"KB_end"},
+ {KB_pageUp ,"KB_pageUp"},
+ {KB_pageDown ,"KB_pageDown"},
+ {KB_capsLock ,"KB_capsLock"},
+ {KB_numLock ,"KB_numLock"},
+ {KB_scrollLock ,"KB_scrollLock"},
+ {KB_leftShift ,"KB_leftShift"},
+ {KB_rightShift ,"KB_rightShift"},
+ {KB_leftCtrl ,"KB_leftCtrl"},
+ {KB_rightCtrl ,"KB_rightCtrl"},
+ {KB_leftAlt ,"KB_leftAlt"},
+ {KB_rightAlt ,"KB_rightAlt"},
+ {KB_leftWindows ,"KB_leftWindows"},
+ {KB_rightWindows ,"KB_rightWindows"},
+ {KB_menu ,"KB_menu"},
+ {KB_sysReq ,"KB_sysReq"},
+ {KB_esc ,"KB_esc"},
+ {KB_1 ,"KB_1"},
+ {KB_2 ,"KB_2"},
+ {KB_3 ,"KB_3"},
+ {KB_4 ,"KB_4"},
+ {KB_5 ,"KB_5"},
+ {KB_6 ,"KB_6"},
+ {KB_7 ,"KB_7"},
+ {KB_8 ,"KB_8"},
+ {KB_9 ,"KB_9"},
+ {KB_0 ,"KB_0"},
+ {KB_minus ,"KB_minus"},
+ {KB_equals ,"KB_equals"},
+ {KB_backSlash ,"KB_backSlash"},
+ {KB_backspace ,"KB_backspace"},
+ {KB_tab ,"KB_tab"},
+ {KB_Q ,"KB_Q"},
+ {KB_W ,"KB_W"},
+ {KB_E ,"KB_E"},
+ {KB_R ,"KB_R"},
+ {KB_T ,"KB_T"},
+ {KB_Y ,"KB_Y"},
+ {KB_U ,"KB_U"},
+ {KB_I ,"KB_I"},
+ {KB_O ,"KB_O"},
+ {KB_P ,"KB_P"},
+ {KB_leftSquareBrace ,"KB_leftSquareBrace"},
+ {KB_rightSquareBrace ,"KB_rightSquareBrace"},
+ {KB_enter ,"KB_enter"},
+ {KB_A ,"KB_A"},
+ {KB_S ,"KB_S"},
+ {KB_D ,"KB_D"},
+ {KB_F ,"KB_F"},
+ {KB_G ,"KB_G"},
+ {KB_H ,"KB_H"},
+ {KB_J ,"KB_J"},
+ {KB_K ,"KB_K"},
+ {KB_L ,"KB_L"},
+ {KB_semicolon ,"KB_semicolon"},
+ {KB_apostrophe ,"KB_apostrophe"},
+ {KB_Z ,"KB_Z"},
+ {KB_X ,"KB_X"},
+ {KB_C ,"KB_C"},
+ {KB_V ,"KB_V"},
+ {KB_B ,"KB_B"},
+ {KB_N ,"KB_N"},
+ {KB_M ,"KB_M"},
+ {KB_comma ,"KB_comma"},
+ {KB_period ,"KB_period"},
+ {KB_divide ,"KB_divide"},
+ {KB_space ,"KB_space"},
+ {KB_tilde ,"KB_tilde"},
+ {0 ,"KB_unknown"},
+ };
+
+/****************************************************************************
+PARAMETERS:
+x - X coordinate of the mouse cursor position (screen coordinates)
+y - Y coordinate of the mouse cursor position (screen coordinates)
+
+REMARKS:
+This gets called periodically to move the mouse. It will get called when
+the mouse may not have actually moved, so check if it has before redrawing
+it.
+****************************************************************************/
+void EVTAPI moveMouse(
+ int x,
+ int y)
+{
+}
+
+/****************************************************************************
+PARAMETERS:
+code - Code to translate
+keys - Table of translation key values to look up
+
+REMARKS:
+Simple function to look up the printable name for the keyboard code.
+****************************************************************************/
+KeyEntry *FindKey(
+ int code,
+ KeyEntry *keys)
+{
+ KeyEntry *key;
+
+ for (key = keys; key->code != 0; key++) {
+ if (key->code == code)
+ break;
+ }
+ return key;
+}
+
+/****************************************************************************
+PARAMETERS:
+evt - Event to display modifiers for
+
+REMARKS:
+Function to display shift modifiers flags
+****************************************************************************/
+void DisplayModifiers(
+ event_t *evt)
+{
+ if (evt->modifiers & EVT_LEFTBUT)
+ printf(", LBUT");
+ if (evt->modifiers & EVT_RIGHTBUT)
+ printf(", RBUT");
+ if (evt->modifiers & EVT_MIDDLEBUT)
+ printf(", MBUT");
+ if (evt->modifiers & EVT_SHIFTKEY) {
+ if (evt->modifiers & EVT_LEFTSHIFT)
+ printf(", LSHIFT");
+ if (evt->modifiers & EVT_RIGHTSHIFT)
+ printf(", RSHIFT");
+ }
+ if (evt->modifiers & EVT_CTRLSTATE) {
+ if (evt->modifiers & EVT_LEFTCTRL)
+ printf(", LCTRL");
+ if (evt->modifiers & EVT_RIGHTCTRL)
+ printf(", RCTRL");
+ }
+ if (evt->modifiers & EVT_ALTSTATE) {
+ if (evt->modifiers & EVT_LEFTALT)
+ printf(", LALT");
+ if (evt->modifiers & EVT_RIGHTALT)
+ printf(", RALT");
+ }
+}
+
+/****************************************************************************
+PARAMETERS:
+msg - Message to display for type of event
+evt - Event to display
+
+REMARKS:
+Function to display the status of the keyboard event to the screen.
+****************************************************************************/
+void DisplayKey(
+ char *msg,
+ event_t *evt)
+{
+ KeyEntry *ascii,*scan;
+ char ch = EVT_asciiCode(evt->message);
+
+ ascii = FindKey(ch,ASCIICodes);
+ scan = FindKey(EVT_scanCode(evt->message),ScanCodes);
+ printf("%s: 0x%04X -> %s, %s, '%c'",
+ msg, (int)evt->message & 0xFFFF, scan->name, ascii->name, isprint(ch) ? ch : ' ');
+ DisplayModifiers(evt);
+ printf("\n");
+}
+
+/****************************************************************************
+PARAMETERS:
+msg - Message to display for type of event
+evt - Event to display
+
+REMARKS:
+Function to display the status of the mouse event to the screen.
+****************************************************************************/
+void DisplayMouse(
+ char *msg,
+ event_t *evt)
+{
+ printf("%s: ", msg);
+ if (evt->message & EVT_LEFTBMASK)
+ printf("LEFT ");
+ if (evt->message & EVT_RIGHTBMASK)
+ printf("RIGHT ");
+ if (evt->message & EVT_MIDDLEBMASK)
+ printf("MIDDLE ");
+ printf("abs(%d,%d), rel(%d,%d)", evt->where_x, evt->where_y, evt->relative_x, evt->relative_y);
+ DisplayModifiers(evt);
+ if (evt->message & EVT_DBLCLICK)
+ printf(", DBLCLICK");
+ printf("\n");
+}
+
+/****************************************************************************
+PARAMETERS:
+msg - Message to display for type of event
+evt - Event to display
+
+REMARKS:
+Function to display the status of the joystick event to the screen.
+****************************************************************************/
+void DisplayJoy(
+ char *msg,
+ event_t *evt)
+{
+ printf("%s: Joy1(%4d,%4d,%c%c), Joy2(%4d,%4d,%c%c)\n", msg,
+ evt->where_x,evt->where_y,
+ (evt->message & EVT_JOY1_BUTTONA) ? 'A' : 'a',
+ (evt->message & EVT_JOY1_BUTTONB) ? 'B' : 'b',
+ evt->relative_x,evt->relative_y,
+ (evt->message & EVT_JOY2_BUTTONA) ? 'A' : 'a',
+ (evt->message & EVT_JOY2_BUTTONB) ? 'B' : 'b');
+}
+
+/****************************************************************************
+REMARKS:
+Joystick calibration routine
+****************************************************************************/
+void CalibrateJoy(void)
+{
+ event_t evt;
+ if(EVT_joyIsPresent()){
+ printf("Joystick Calibration\nMove the joystick to the upper left corner and press any button.\n");
+ EVT_halt(&evt, EVT_JOYCLICK);
+ EVT_halt(&evt, EVT_JOYCLICK);
+ EVT_joySetUpperLeft();
+ printf("Move the joystick to the lower right corner and press any button.\n");
+ EVT_halt(&evt, EVT_JOYCLICK);
+ EVT_halt(&evt, EVT_JOYCLICK);
+ EVT_joySetLowerRight();
+ printf("Move the joystick to center position and press any button.\n");
+ EVT_halt(&evt, EVT_JOYCLICK);
+ EVT_halt(&evt, EVT_JOYCLICK);
+ EVT_joySetCenter();
+ printf("Joystick calibrated\n");
+ }
+}
+
+/****************************************************************************
+REMARKS:
+Main program entry point
+****************************************************************************/
+int main(void)
+{
+ event_t evt;
+ ibool done = false;
+ PM_HWND hwndConsole;
+
+ hwndConsole = PM_openConsole(0,0,0,0,0,true);
+ EVT_init(&moveMouse);
+ EVT_setMouseRange(1024,768);
+ CalibrateJoy();
+ do {
+ EVT_pollJoystick();
+ if (EVT_getNext(&evt,EVT_EVERYEVT)) {
+ switch (evt.what) {
+ case EVT_KEYDOWN:
+ DisplayKey("EVT_KEYDOWN ", &evt);
+ if (EVT_scanCode(evt.message) == KB_esc)
+ done = true;
+ break;
+ case EVT_KEYREPEAT:
+ DisplayKey("EVT_KEYREPEAT", &evt);
+ break;
+ case EVT_KEYUP:
+ DisplayKey("EVT_KEYUP ", &evt);
+ break;
+ case EVT_MOUSEDOWN:
+ DisplayMouse("EVT_MOUSEDOWN", &evt);
+ break;
+ case EVT_MOUSEAUTO:
+ DisplayMouse("EVT_MOUSEAUTO", &evt);
+ break;
+ case EVT_MOUSEUP:
+ DisplayMouse("EVT_MOUSEUP ", &evt);
+ break;
+ case EVT_MOUSEMOVE:
+ DisplayMouse("EVT_MOUSEMOVE", &evt);
+ break;
+ case EVT_JOYCLICK:
+ DisplayJoy("EVT_JOYCLICK ", &evt);
+ break;
+ case EVT_JOYMOVE:
+ DisplayJoy("EVT_JOYMOVE ", &evt);
+ break;
+ }
+ }
+ } while (!done);
+ EVT_exit();
+ PM_closeConsole(hwndConsole);
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/isvesa.c b/board/MAI/bios_emulator/scitech/src/pm/tests/isvesa.c
new file mode 100644
index 0000000000..9c02452bb3
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/isvesa.c
@@ -0,0 +1,110 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to allocate real mode
+* memory and to call real mode interrupt handlers such as
+* the VESA VBE BIOS from protected mode. Compile and link
+* with the appropriate command line for your DOS extender.
+*
+* Functions tested: PM_getVESABuf()
+* PM_mapRealPointer()
+* PM_int86x()
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "pmapi.h"
+
+/* SuperVGA information block */
+
+#pragma pack(1)
+
+typedef struct {
+ char VESASignature[4]; /* 'VESA' 4 byte signature */
+ short VESAVersion; /* VBE version number */
+ ulong OEMStringPtr; /* Far pointer to OEM string */
+ ulong Capabilities; /* Capabilities of video card */
+ ulong VideoModePtr; /* Far pointer to supported modes */
+ short TotalMemory; /* Number of 64kb memory blocks */
+ char reserved[236]; /* Pad to 256 byte block size */
+ } VgaInfoBlock;
+
+#pragma pack()
+
+int main(void)
+{
+ RMREGS regs;
+ RMSREGS sregs;
+ VgaInfoBlock vgaInfo;
+ ushort *mode;
+ uint vgLen;
+ uchar *vgPtr;
+ unsigned r_vgseg,r_vgoff;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ /* Allocate a 256 byte block of real memory for communicating with
+ * the VESA BIOS.
+ */
+ if ((vgPtr = PM_getVESABuf(&vgLen,&r_vgseg,&r_vgoff)) == NULL) {
+ printf("Unable to allocate VESA memory buffer!\n");
+ exit(1);
+ }
+
+ /* Call the VESA VBE to see if it is out there */
+ regs.x.ax = 0x4F00;
+ regs.x.di = r_vgoff;
+ sregs.es = r_vgseg;
+ memcpy(vgPtr,"VBE2",4);
+ PM_int86x(0x10, &regs, &regs, &sregs);
+ memcpy(&vgaInfo,vgPtr,sizeof(VgaInfoBlock));
+ if (regs.x.ax == 0x4F && strncmp(vgaInfo.VESASignature,"VESA",4) == 0) {
+ printf("VESA VBE version %d.%d BIOS detected\n\n",
+ vgaInfo.VESAVersion >> 8, vgaInfo.VESAVersion & 0xF);
+ printf("Available video modes:\n");
+ mode = PM_mapRealPointer(vgaInfo.VideoModePtr >> 16, vgaInfo.VideoModePtr & 0xFFFF);
+ while (*mode != 0xFFFF) {
+ printf(" %04hXh (%08X)\n", *mode, (int)mode);
+ mode++;
+ }
+ }
+ else
+ printf("VESA VBE not found\n");
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/key.c b/board/MAI/bios_emulator/scitech/src/pm/tests/key.c
new file mode 100644
index 0000000000..cf89f79fb7
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/key.c
@@ -0,0 +1,92 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to install a C based
+* keyboard interrupt handler.
+*
+* Functions tested: PM_setKeyHandler()
+* PM_chainPrevKey()
+* PM_restoreKeyHandler()
+*
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+volatile long count = 0;
+
+#pragma off (check_stack) /* No stack checking under Watcom */
+
+void PMAPI keyHandler(void)
+{
+ count++;
+ PM_chainPrevKey(); /* Chain to previous handler */
+}
+
+int main(void)
+{
+ int ch;
+ PM_lockHandle lh;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ /* Install our timer handler and lock handler pages in memory. It is
+ * difficult to get the size of a function in C, but we know our
+ * function is well less than 100 bytes (and an entire 4k page will
+ * need to be locked by the server anyway).
+ */
+ PM_lockCodePages((__codePtr)keyHandler,100,&lh);
+ PM_lockDataPages((void*)&count,sizeof(count),&lh);
+ PM_installBreakHandler(); /* We *DONT* want Ctrl-Breaks! */
+ PM_setKeyHandler(keyHandler);
+ printf("Keyboard interrupt handler installed - Type some characters and\n");
+ printf("hit ESC to exit\n");
+ while ((ch = PM_getch()) != 0x1B) {
+ printf("%c", ch);
+ fflush(stdout);
+ }
+
+ PM_restoreKeyHandler();
+ PM_restoreBreakHandler();
+ PM_unlockDataPages((void*)&count,sizeof(count),&lh);
+ PM_unlockCodePages((__codePtr)keyHandler,100,&lh);
+ printf("\n\nKeyboard handler was called %ld times\n", count);
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/key15.c b/board/MAI/bios_emulator/scitech/src/pm/tests/key15.c
new file mode 100644
index 0000000000..5c0d27a174
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/key15.c
@@ -0,0 +1,96 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to install a C based
+* keyboard Int 15h interrupt handler. This is an alternate
+* way to intercept scancodes from the keyboard by hooking
+* the Int 15h keyboard intercept callout.
+*
+* Functions tested: PM_setKey15Handler()
+* PM_restoreKey15Handler()
+*
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+volatile long count = 0;
+volatile short lastScanCode = 0;
+
+#pragma off (check_stack) /* No stack checking under Watcom */
+
+short PMAPI keyHandler(short scanCode)
+{
+ count++;
+ lastScanCode = scanCode;
+ return scanCode; /* Let BIOS process as normal */
+}
+
+int main(void)
+{
+ int ch;
+ PM_lockHandle lh;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ /* Install our timer handler and lock handler pages in memory. It is
+ * difficult to get the size of a function in C, but we know our
+ * function is well less than 100 bytes (and an entire 4k page will
+ * need to be locked by the server anyway).
+ */
+ PM_lockCodePages((__codePtr)keyHandler,100,&lh);
+ PM_lockDataPages((void*)&count,sizeof(count),&lh);
+ PM_installBreakHandler(); /* We *DONT* want Ctrl-Break's! */
+ PM_setKey15Handler(keyHandler);
+ printf("Keyboard interrupt handler installed - Type some characters and\n");
+ printf("hit ESC to exit\n");
+ while ((ch = PM_getch()) != 0x1B) {
+ printf("%c", ch);
+ fflush(stdout);
+ }
+
+ PM_restoreKey15Handler();
+ PM_restoreBreakHandler();
+ PM_unlockDataPages((void*)&count,sizeof(count),&lh);
+ PM_unlockCodePages((__codePtr)keyHandler,100,&lh);
+ printf("\n\nKeyboard handler was called %ld times\n", count);
+ printf("Last scan code %04X\n", lastScanCode);
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/memtest.c b/board/MAI/bios_emulator/scitech/src/pm/tests/memtest.c
new file mode 100644
index 0000000000..221bfb1a02
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/memtest.c
@@ -0,0 +1,106 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to determine just how much memory can be
+* allocated with the compiler in use. Compile and link
+* with the appropriate command line for your DOS extender.
+*
+* Functions tested: PM_malloc()
+* PM_availableMemory()
+*
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include "pmapi.h"
+
+#ifdef __16BIT__
+#define MAXALLOC 64
+#else
+#define MAXALLOC 2000
+#endif
+
+int main(void)
+{
+ int i;
+ ulong allocs;
+ ulong physical,total;
+ char *p,*pa[MAXALLOC];
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ printf("Memory available at start:\n");
+ PM_availableMemory(&physical,&total);
+ printf(" Physical memory: %ld Kb\n", physical / 1024);
+ printf(" Total (including virtual): %ld Kb\n", total / 1024);
+ printf("\n");
+ for (allocs = i = 0; i < MAXALLOC; i++) {
+ if ((pa[i] = PM_malloc(10*1024)) != 0) { /* in 10k blocks */
+ p = pa[allocs];
+ memset(p, 0, 10*1024); /* touch every byte */
+ *p = 'x'; /* do something, anything with */
+ p[1023] = 'y'; /* the allocated memory */
+ allocs++;
+ printf("Allocated %lu bytes\r", 10*(allocs << 10));
+ }
+ else break;
+ if (PM_kbhit() && (PM_getch() == 0x1B))
+ break;
+ }
+
+ printf("\n\nAllocated total of %lu bytes\n", 10 * (allocs << 10));
+
+ printf("\nMemory available at end:\n");
+ PM_availableMemory(&physical,&total);
+ printf(" Physical memory: %ld Kb\n", physical / 1024);
+ printf(" Total (including virtual): %ld Kb\n", total / 1024);
+
+ for (i = allocs-1; i >= 0; i--)
+ PM_free(pa[i]);
+
+ printf("\nMemory available after freeing all blocks (note that under protected mode\n");
+ printf("this will most likely not be correct after freeing blocks):\n\n");
+ PM_availableMemory(&physical,&total);
+ printf(" Physical memory: %ld Kb\n", physical / 1024);
+ printf(" Total (including virtual): %ld Kb\n", total / 1024);
+
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/mouse.c b/board/MAI/bios_emulator/scitech/src/pm/tests/mouse.c
new file mode 100644
index 0000000000..5b426517c8
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/mouse.c
@@ -0,0 +1,109 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to install an assembly
+* language mouse interrupt handler. We use assembly language
+* as it must be a far function and should swap to a local
+* 32 bit stack if it is going to call any C based code (which
+* we do in this example).
+*
+* Functions tested: PM_installMouseHandler()
+* PM_int86()
+*
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+volatile long count = 0;
+
+#pragma off (check_stack) /* No stack checking under Watcom */
+
+void PMAPI mouseHandler(
+ uint mask,
+ uint butstate,
+ int x,
+ int y,
+ int mickeyX,
+ int mickeyY)
+{
+ mask = mask; /* We dont use any of the parameters */
+ butstate = butstate;
+ x = x;
+ y = y;
+ mickeyX = mickeyX;
+ mickeyY = mickeyY;
+ count++;
+}
+
+int main(void)
+{
+ RMREGS regs;
+ PM_lockHandle lh;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ regs.x.ax = 33; /* Mouse function 33 - Software reset */
+ PM_int86(0x33,&regs,&regs);
+ if (regs.x.bx == 0) {
+ printf("No mouse installed.\n");
+ exit(1);
+ }
+
+ /* Install our mouse handler and lock handler pages in memory. It is
+ * difficult to get the size of a function in C, but we know our
+ * function is well less than 100 bytes (and an entire 4k page will
+ * need to be locked by the server anyway).
+ */
+ PM_lockCodePages((__codePtr)mouseHandler,100,&lh);
+ PM_lockDataPages((void*)&count,sizeof(count),&lh);
+ if (!PM_setMouseHandler(0xFFFF, mouseHandler)) {
+ printf("Unable to install mouse handler!\n");
+ exit(1);
+ }
+ printf("Mouse handler installed - Hit any key to exit\n");
+ PM_getch();
+
+ PM_restoreMouseHandler();
+ PM_unlockDataPages((void*)&count,sizeof(count),&lh);
+ PM_unlockCodePages((__codePtr)mouseHandler,100,&lh);
+ printf("Mouse handler was called %ld times\n", count);
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/restore.c b/board/MAI/bios_emulator/scitech/src/pm/tests/restore.c
new file mode 100644
index 0000000000..b808052c02
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/restore.c
@@ -0,0 +1,82 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Linux/QNX
+*
+* Description: Program to restore the console state state from a previously
+* saved state if the program crashed while the console
+* was in graphics mode.
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+void setVideoMode(int mode)
+{
+ RMREGS r;
+
+ r.x.ax = mode;
+ PM_int86(0x10, &r, &r);
+}
+
+int main(void)
+{
+ PM_HWND hwndConsole;
+ ulong stateSize;
+ void *stateBuf;
+ FILE *f;
+
+ /* Write the saved console state buffer to disk */
+ if ((f = fopen("/etc/pmsave.dat","rb")) == NULL) {
+ printf("Unable to open /etc/pmsave.dat for reading!\n");
+ return -1;
+ }
+ fread(&stateSize,1,sizeof(stateSize),f);
+ if (stateSize != PM_getConsoleStateSize()) {
+ printf("Size mismatch in /etc/pmsave.dat!\n");
+ return -1;
+ }
+ if ((stateBuf = PM_malloc(stateSize)) == NULL) {
+ printf("Unable to allocate console state buffer!\n");
+ return -1;
+ }
+ fread(stateBuf,1,stateSize,f);
+ fclose(f);
+
+ /* Open the console */
+ hwndConsole = PM_openConsole(0,0,0,0,0,true);
+
+ /* Forcibly set 80x25 text mode using the BIOS */
+ setVideoMode(0x3);
+
+ /* Restore the previous console state */
+ PM_restoreConsoleState(stateBuf,0);
+ PM_closeConsole(hwndConsole);
+ PM_free(stateBuf);
+ printf("Console state successfully restored from /etc/pmsave.dat\n");
+ return 0;
+}
+
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/rtc.c b/board/MAI/bios_emulator/scitech/src/pm/tests/rtc.c
new file mode 100644
index 0000000000..07c6eaafd4
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/rtc.c
@@ -0,0 +1,92 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to install a C based
+* Real Time Clock interrupt handler.
+*
+* Functions tested: PM_setRealTimeClockHandler()
+* PM_restoreRealTimeClockHandler()
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+volatile long count = 0;
+
+#pragma off (check_stack) /* No stack checking under Watcom */
+
+void PMAPI RTCHandler(void)
+{
+ count++;
+}
+
+int main(void)
+{
+ long oldCount;
+ PM_lockHandle lh;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ /* Install our timer handler and lock handler pages in memory. It is
+ * difficult to get the size of a function in C, but we know our
+ * function is well less than 100 bytes (and an entire 4k page will
+ * need to be locked by the server anyway).
+ */
+ PM_lockCodePages((__codePtr)RTCHandler,100,&lh);
+ PM_lockDataPages((void*)&count,sizeof(count),&lh);
+ PM_installBreakHandler(); /* We *DONT* want Ctrl-Breaks! */
+ PM_setRealTimeClockHandler(RTCHandler,128);
+ printf("RealTimeClock interrupt handler installed - Hit ESC to exit\n");
+ oldCount = count;
+ while (1) {
+ if (PM_kbhit() && (PM_getch() == 0x1B))
+ break;
+ if (count != oldCount) {
+ printf("Tick, Tock: %ld\n", count);
+ oldCount = count;
+ }
+ }
+
+ PM_restoreRealTimeClockHandler();
+ PM_restoreBreakHandler();
+ PM_unlockDataPages((void*)&count,sizeof(count),&lh);
+ PM_unlockCodePages((__codePtr)RTCHandler,100,&lh);
+ printf("RealTimeClock handler was called %ld times\n", count);
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/save.c b/board/MAI/bios_emulator/scitech/src/pm/tests/save.c
new file mode 100644
index 0000000000..be96968f62
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/save.c
@@ -0,0 +1,70 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Linux/QNX
+*
+* Description: Program to save the console state state so that it can
+* be later restored if the program crashed while the console
+* was in graphics mode.
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+int main(void)
+{
+ PM_HWND hwndConsole;
+ ulong stateSize;
+ void *stateBuf;
+ FILE *f;
+
+ /* Allocate a buffer to save console state and save the state */
+ hwndConsole = PM_openConsole(0,0,0,0,0,true);
+ stateSize = PM_getConsoleStateSize();
+ if ((stateBuf = PM_malloc(stateSize)) == NULL) {
+ PM_closeConsole(hwndConsole);
+ printf("Unable to allocate console state buffer!\n");
+ return -1;
+ }
+ PM_saveConsoleState(stateBuf,0);
+
+ /* Restore the console state on exit */
+ PM_restoreConsoleState(stateBuf,0);
+ PM_closeConsole(hwndConsole);
+
+ /* Write the saved console state buffer to disk */
+ if ((f = fopen("/etc/pmsave.dat","wb")) == NULL)
+ printf("Unable to open /etc/pmsave/dat for writing!\n");
+ else {
+ fwrite(&stateSize,1,sizeof(stateSize),f);
+ fwrite(stateBuf,1,stateSize,f);
+ fclose(f);
+ printf("Console state successfully saved to /etc/pmsave.dat\n");
+ }
+ PM_free(stateBuf);
+ return 0;
+}
+
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/showpci.c b/board/MAI/bios_emulator/scitech/src/pm/tests/showpci.c
new file mode 100644
index 0000000000..8222b86024
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/showpci.c
@@ -0,0 +1,253 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to test the PCI library functions.
+*
+****************************************************************************/
+
+#include "pmapi.h"
+#include "pcilib.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+/*------------------------- Global Variables ------------------------------*/
+
+static int NumPCI = -1;
+static PCIDeviceInfo *PCI;
+static int *BridgeIndex;
+static int *DeviceIndex;
+static int NumBridges;
+static PCIDeviceInfo *AGPBridge = NULL;
+static int NumDevices;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+REMARKS:
+Enumerates the PCI bus and dumps the PCI configuration information to the
+log file.
+****************************************************************************/
+static void EnumeratePCI(void)
+{
+ int i,index;
+ PCIDeviceInfo *info;
+
+ printf("Displaying enumeration of PCI bus (%d devices, %d display devices)\n",
+ NumPCI, NumDevices);
+ for (index = 0; index < NumDevices; index++)
+ printf(" Display device %d is PCI device %d\n",index,DeviceIndex[index]);
+ printf("\n");
+ printf("Bus Slot Fnc DeviceID SubSystem Rev Class IRQ Int Cmd\n");
+ for (i = 0; i < NumPCI; i++) {
+ printf("%2d %2d %2d %04X:%04X %04X:%04X %02X %02X:%02X %02X %02X %04X ",
+ PCI[i].slot.p.Bus,
+ PCI[i].slot.p.Device,
+ PCI[i].slot.p.Function,
+ PCI[i].VendorID,
+ PCI[i].DeviceID,
+ PCI[i].u.type0.SubSystemVendorID,
+ PCI[i].u.type0.SubSystemID,
+ PCI[i].RevID,
+ PCI[i].BaseClass,
+ PCI[i].SubClass,
+ PCI[i].u.type0.InterruptLine,
+ PCI[i].u.type0.InterruptPin,
+ PCI[i].Command);
+ for (index = 0; index < NumDevices; index++) {
+ if (DeviceIndex[index] == i)
+ break;
+ }
+ if (index < NumDevices)
+ printf("<- %d\n", index);
+ else
+ printf("\n");
+ }
+ printf("\n");
+ printf("DeviceID Stat Ifc Cch Lat Hdr BIST\n");
+ for (i = 0; i < NumPCI; i++) {
+ printf("%04X:%04X %04X %02X %02X %02X %02X %02X ",
+ PCI[i].VendorID,
+ PCI[i].DeviceID,
+ PCI[i].Status,
+ PCI[i].Interface,
+ PCI[i].CacheLineSize,
+ PCI[i].LatencyTimer,
+ PCI[i].HeaderType,
+ PCI[i].BIST);
+ for (index = 0; index < NumDevices; index++) {
+ if (DeviceIndex[index] == i)
+ break;
+ }
+ if (index < NumDevices)
+ printf("<- %d\n", index);
+ else
+ printf("\n");
+ }
+ printf("\n");
+ printf("DeviceID Base10h Base14h Base18h Base1Ch Base20h Base24h ROMBase\n");
+ for (i = 0; i < NumPCI; i++) {
+ printf("%04X:%04X %08lX %08lX %08lX %08lX %08lX %08lX %08lX ",
+ PCI[i].VendorID,
+ PCI[i].DeviceID,
+ PCI[i].u.type0.BaseAddress10,
+ PCI[i].u.type0.BaseAddress14,
+ PCI[i].u.type0.BaseAddress18,
+ PCI[i].u.type0.BaseAddress1C,
+ PCI[i].u.type0.BaseAddress20,
+ PCI[i].u.type0.BaseAddress24,
+ PCI[i].u.type0.ROMBaseAddress);
+ for (index = 0; index < NumDevices; index++) {
+ if (DeviceIndex[index] == i)
+ break;
+ }
+ if (index < NumDevices)
+ printf("<- %d\n", index);
+ else
+ printf("\n");
+ }
+ printf("\n");
+ printf("DeviceID BAR10Len BAR14Len BAR18Len BAR1CLen BAR20Len BAR24Len ROMLen\n");
+ for (i = 0; i < NumPCI; i++) {
+ printf("%04X:%04X %08lX %08lX %08lX %08lX %08lX %08lX %08lX ",
+ PCI[i].VendorID,
+ PCI[i].DeviceID,
+ PCI[i].u.type0.BaseAddress10Len,
+ PCI[i].u.type0.BaseAddress14Len,
+ PCI[i].u.type0.BaseAddress18Len,
+ PCI[i].u.type0.BaseAddress1CLen,
+ PCI[i].u.type0.BaseAddress20Len,
+ PCI[i].u.type0.BaseAddress24Len,
+ PCI[i].u.type0.ROMBaseAddressLen);
+ for (index = 0; index < NumDevices; index++) {
+ if (DeviceIndex[index] == i)
+ break;
+ }
+ if (index < NumDevices)
+ printf("<- %d\n", index);
+ else
+ printf("\n");
+ }
+ printf("\n");
+ printf("Displaying enumeration of %d bridge devices\n",NumBridges);
+ printf("\n");
+ printf("DeviceID P# S# B# IOB IOL MemBase MemLimit PreBase PreLimit Ctrl\n");
+ for (i = 0; i < NumBridges; i++) {
+ info = (PCIDeviceInfo*)&PCI[BridgeIndex[i]];
+ printf("%04X:%04X %02X %02X %02X %04X %04X %08X %08X %08X %08X %04X\n",
+ info->VendorID,
+ info->DeviceID,
+ info->u.type1.PrimaryBusNumber,
+ info->u.type1.SecondayBusNumber,
+ info->u.type1.SubordinateBusNumber,
+ ((u16)info->u.type1.IOBase << 8) & 0xF000,
+ info->u.type1.IOLimit ?
+ ((u16)info->u.type1.IOLimit << 8) | 0xFFF : 0,
+ ((u32)info->u.type1.MemoryBase << 16) & 0xFFF00000,
+ info->u.type1.MemoryLimit ?
+ ((u32)info->u.type1.MemoryLimit << 16) | 0xFFFFF : 0,
+ ((u32)info->u.type1.PrefetchableMemoryBase << 16) & 0xFFF00000,
+ info->u.type1.PrefetchableMemoryLimit ?
+ ((u32)info->u.type1.PrefetchableMemoryLimit << 16) | 0xFFFFF : 0,
+ info->u.type1.BridgeControl);
+ }
+ printf("\n");
+}
+
+/****************************************************************************
+RETURNS:
+Number of display devices found.
+
+REMARKS:
+This function enumerates the number of available display devices on the
+PCI bus, and returns the number found.
+****************************************************************************/
+static int PCI_enumerateDevices(void)
+{
+ int i,j;
+ PCIDeviceInfo *info;
+
+ // If this is the first time we have been called, enumerate all
+ // devices on the PCI bus.
+ if (NumPCI == -1) {
+ if ((NumPCI = PCI_getNumDevices()) == 0)
+ return -1;
+ PCI = malloc(NumPCI * sizeof(PCI[0]));
+ BridgeIndex = malloc(NumPCI * sizeof(BridgeIndex[0]));
+ DeviceIndex = malloc(NumPCI * sizeof(DeviceIndex[0]));
+ if (!PCI || !BridgeIndex || !DeviceIndex)
+ return -1;
+ for (i = 0; i < NumPCI; i++)
+ PCI[i].dwSize = sizeof(PCI[i]);
+ if (PCI_enumerate(PCI) == 0)
+ return -1;
+
+ // Build a list of all PCI bridge devices
+ for (i = 0,NumBridges = 0,BridgeIndex[0] = -1; i < NumPCI; i++) {
+ if (PCI[i].BaseClass == PCI_BRIDGE_CLASS)
+ BridgeIndex[NumBridges++] = i;
+ }
+
+ // Now build a list of all display class devices
+ for (i = 0,NumDevices = 1,DeviceIndex[0] = -1; i < NumPCI; i++) {
+ if (PCI_IS_DISPLAY_CLASS(&PCI[i])) {
+ if ((PCI[i].Command & 0x3) == 0x3)
+ DeviceIndex[0] = i;
+ else
+ DeviceIndex[NumDevices++] = i;
+ if (PCI[i].slot.p.Bus != 0) {
+ // This device is on a different bus than the primary
+ // PCI bus, so it is probably an AGP device. Find the
+ // AGP bus device that controls that bus so we can
+ // control it.
+ for (j = 0; j < NumBridges; j++) {
+ info = (PCIDeviceInfo*)&PCI[BridgeIndex[j]];
+ if (info->u.type1.SecondayBusNumber == PCI[i].slot.p.Bus) {
+ AGPBridge = info;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Enumerate all PCI and bridge devices to standard output
+ EnumeratePCI();
+ }
+ return NumDevices;
+}
+
+int main(void)
+{
+ // Enumerate all PCI devices
+ PM_init();
+ if (PCI_enumerateDevices() < 1) {
+ printf("No PCI display devices found!\n");
+ return -1;
+ }
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/tick.c b/board/MAI/bios_emulator/scitech/src/pm/tests/tick.c
new file mode 100644
index 0000000000..ee1014fb9f
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/tick.c
@@ -0,0 +1,94 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to install a C based
+* timer interrupt handler.
+*
+* Functions tested: PM_setTimerHandler()
+* PM_chainPrevTimer();
+* PM_restoreTimerHandler()
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+volatile long count = 0;
+
+#pragma off (check_stack) /* No stack checking under Watcom */
+
+void PMAPI timerHandler(void)
+{
+ PM_chainPrevTimer(); /* Chain to previous handler */
+ count++;
+}
+
+int main(void)
+{
+ long oldCount;
+ PM_lockHandle lh;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ /* Install our timer handler and lock handler pages in memory. It is
+ * difficult to get the size of a function in C, but we know our
+ * function is well less than 100 bytes (and an entire 4k page will
+ * need to be locked by the server anyway).
+ */
+ PM_lockCodePages((__codePtr)timerHandler,100,&lh);
+ PM_lockDataPages((void*)&count,sizeof(count),&lh);
+ PM_installBreakHandler(); /* We *DONT* want Ctrl-Breaks! */
+ PM_setTimerHandler(timerHandler);
+ printf("Timer interrupt handler installed - Hit ESC to exit\n");
+ oldCount = count;
+ while (1) {
+ if (PM_kbhit() && (PM_getch() == 0x1B))
+ break;
+ if (count != oldCount) {
+ printf("Tick, Tock: %ld\n", count);
+ oldCount = count;
+ }
+ }
+
+ PM_restoreTimerHandler();
+ PM_restoreBreakHandler();
+ PM_unlockDataPages((void*)&count,sizeof(count),&lh);
+ PM_unlockCodePages((__codePtr)timerHandler,100,&lh);
+ printf("Timer handler was called %ld times\n", count);
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/timerc.c b/board/MAI/bios_emulator/scitech/src/pm/tests/timerc.c
new file mode 100644
index 0000000000..55e95a85d6
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/timerc.c
@@ -0,0 +1,87 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+*
+* Description: Test program for the Zen Timer Library.
+*
+****************************************************************************/
+
+#include <stdio.h>
+#include "pmapi.h"
+#include "ztimer.h"
+
+#define DELAY_SECS 10
+
+/*-------------------------- Implementation -------------------------------*/
+
+/* The following routine takes a long count in microseconds and outputs
+ * a string representing the count in seconds. It could be modified to
+ * return a pointer to a static string representing the count rather
+ * than printing it out.
+ */
+
+void ReportTime(ulong count)
+{
+ ulong secs;
+
+ secs = count / 1000000L;
+ count = count - secs * 1000000L;
+ printf("Time taken: %lu.%06lu seconds\n",secs,count);
+}
+
+int i,j; /* NON register variables! */
+
+int main(void)
+{
+#ifdef LONG_TEST
+ ulong start,finish;
+#endif
+
+ printf("Processor type: %d %ld MHz\n", CPU_getProcessorType(), CPU_getProcessorSpeed(true));
+
+ ZTimerInit();
+
+ /* Test the long period Zen Timer (we don't check for overflow coz
+ * it would take tooooo long!)
+ */
+
+ LZTimerOn();
+ for (j = 0; j < 10; j++)
+ for (i = 0; i < 20000; i++)
+ i = i;
+ LZTimerOff();
+ ReportTime(LZTimerCount());
+
+ /* Test the ultra long period Zen Timer */
+#ifdef LONG_TEST
+ start = ULZReadTime();
+ delay(DELAY_SECS * 1000);
+ finish = ULZReadTime();
+ printf("Delay of %d secs took %d 1/10ths of a second\n",
+ DELAY_SECS,ULZElapsedTime(start,finish));
+#endif
+
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/timercpp.cpp b/board/MAI/bios_emulator/scitech/src/pm/tests/timercpp.cpp
new file mode 100644
index 0000000000..1258a4bb10
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/timercpp.cpp
@@ -0,0 +1,107 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: C++ 3.0
+* Environment: Any
+*
+* Description: Test program for the Zen Timer Library C++ interface.
+*
+****************************************************************************/
+
+#include <iostream.h>
+#include "pmapi.h"
+#include "ztimer.h"
+
+/*-------------------------- Implementation -------------------------------*/
+
+int i,j,k; /* NON register variables! */
+
+void dummy() {}
+
+int main(void)
+{
+ LZTimer ltimer;
+ ULZTimer ultimer;
+
+ ZTimerInit();
+
+ /* Test the long period Zen Timer (we don't check for overflow coz
+ * it would take tooooo long!)
+ */
+
+ cout << endl;
+ ultimer.restart();
+ ltimer.start();
+ for (j = 0; j < 10; j++)
+ for (i = 0; i < 20000; i++)
+ dummy();
+ ltimer.stop();
+ ultimer.stop();
+ cout << "LCount: " << ltimer.count() << endl;
+ cout << "Time: " << ltimer << " secs\n";
+ cout << "ULCount: " << ultimer.count() << endl;
+ cout << "ULTime: " << ultimer << " secs\n";
+
+ cout << endl << "Timing ... \n";
+ ultimer.restart();
+ ltimer.restart();
+ for (j = 0; j < 200; j++)
+ for (i = 0; i < 20000; i++)
+ dummy();
+ ltimer.stop();
+ ultimer.stop();
+ cout << "LCount: " << ltimer.count() << endl;
+ cout << "Time: " << ltimer << " secs\n";
+ cout << "ULCount: " << ultimer.count() << endl;
+ cout << "ULTime: " << ultimer << " secs\n";
+
+ /* Test the lap function of the long period Zen Timer */
+
+ cout << endl << "Timing ... \n";
+ ultimer.restart();
+ ltimer.restart();
+ for (j = 0; j < 20; j++) {
+ for (k = 0; k < 10; k++)
+ for (i = 0; i < 20000; i++)
+ dummy();
+ cout << "lap: " << ltimer.lap() << endl;
+ }
+ ltimer.stop();
+ ultimer.stop();
+ cout << "LCount: " << ltimer.count() << endl;
+ cout << "Time: " << ltimer << " secs\n";
+ cout << "ULCount: " << ultimer.count() << endl;
+ cout << "ULTime: " << ultimer << " secs\n";
+
+#ifdef LONG_TEST
+ /* Test the ultra long period Zen Timer */
+
+ ultimer.start();
+ delay(DELAY_SECS * 1000);
+ ultimer.stop();
+ cout << "Delay of " << DELAY_SECS << " secs took " << ultimer.count()
+ << " 1/10ths of a second\n";
+ cout << "Time: " << ultimer << " secs\n";
+#endif
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/uswc.c b/board/MAI/bios_emulator/scitech/src/pm/tests/uswc.c
new file mode 100644
index 0000000000..0892e25f3a
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/uswc.c
@@ -0,0 +1,311 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Simple test program to test the write combine functions.
+*
+* Note that this program should never be used in a production
+* environment, because write combining needs to be handled
+* with more intimate knowledge of the display hardware than
+* you can obtain by simply examining the PCI configuration
+* space.
+*
+****************************************************************************/
+
+#include "pmapi.h"
+#include "pcilib.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+/*------------------------- Global Variables ------------------------------*/
+
+static int NumPCI = -1;
+static PCIDeviceInfo *PCI;
+static int *BridgeIndex;
+static int *DeviceIndex;
+static int NumBridges;
+static PCIDeviceInfo *AGPBridge = NULL;
+static int NumDevices;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+RETURNS:
+Number of display devices found.
+
+REMARKS:
+This function enumerates the number of available display devices on the
+PCI bus, and returns the number found.
+****************************************************************************/
+static int PCI_enumerateDevices(void)
+{
+ int i,j;
+ PCIDeviceInfo *info;
+
+ // If this is the first time we have been called, enumerate all
+ // devices on the PCI bus.
+ if (NumPCI == -1) {
+ if ((NumPCI = PCI_getNumDevices()) == 0)
+ return -1;
+ PCI = malloc(NumPCI * sizeof(PCI[0]));
+ BridgeIndex = malloc(NumPCI * sizeof(BridgeIndex[0]));
+ DeviceIndex = malloc(NumPCI * sizeof(DeviceIndex[0]));
+ if (!PCI || !BridgeIndex || !DeviceIndex)
+ return -1;
+ for (i = 0; i < NumPCI; i++)
+ PCI[i].dwSize = sizeof(PCI[i]);
+ if (PCI_enumerate(PCI) == 0)
+ return -1;
+
+ // Build a list of all PCI bridge devices
+ for (i = 0,NumBridges = 0,BridgeIndex[0] = -1; i < NumPCI; i++) {
+ if (PCI[i].BaseClass == PCI_BRIDGE_CLASS)
+ BridgeIndex[NumBridges++] = i;
+ }
+
+ // Now build a list of all display class devices
+ for (i = 0,NumDevices = 1,DeviceIndex[0] = -1; i < NumPCI; i++) {
+ if (PCI_IS_DISPLAY_CLASS(&PCI[i])) {
+ if ((PCI[i].Command & 0x3) == 0x3)
+ DeviceIndex[0] = i;
+ else
+ DeviceIndex[NumDevices++] = i;
+ if (PCI[i].slot.p.Bus != 0) {
+ // This device is on a different bus than the primary
+ // PCI bus, so it is probably an AGP device. Find the
+ // AGP bus device that controls that bus so we can
+ // control it.
+ for (j = 0; j < NumBridges; j++) {
+ info = (PCIDeviceInfo*)&PCI[BridgeIndex[j]];
+ if (info->u.type1.SecondayBusNumber == PCI[i].slot.p.Bus) {
+ AGPBridge = info;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ return NumDevices;
+}
+
+/****************************************************************************
+REMARKS:
+Enumerates useful information about attached display devices.
+****************************************************************************/
+static void ShowDisplayDevices(void)
+{
+ int i,index;
+
+ printf("Displaying enumeration of %d PCI display devices\n", NumDevices);
+ printf("\n");
+ printf("DeviceID SubSystem Base10h (length ) Base14h (length )\n");
+ for (index = 0; index < NumDevices; index++) {
+ i = DeviceIndex[index];
+ printf("%04X:%04X %04X:%04X %08lX (%6ld KB) %08lX (%6ld KB)\n",
+ PCI[i].VendorID,
+ PCI[i].DeviceID,
+ PCI[i].u.type0.SubSystemVendorID,
+ PCI[i].u.type0.SubSystemID,
+ PCI[i].u.type0.BaseAddress10,
+ PCI[i].u.type0.BaseAddress10Len / 1024,
+ PCI[i].u.type0.BaseAddress14,
+ PCI[i].u.type0.BaseAddress14Len / 1024);
+ }
+ printf("\n");
+}
+
+/****************************************************************************
+REMARKS:
+Dumps the value for a write combine region to the display.
+****************************************************************************/
+static char *DecodeWCType(
+ uint type)
+{
+ static char *names[] = {
+ "UNCACHABLE",
+ "WRCOMB",
+ "UNKNOWN",
+ "UNKNOWN",
+ "WRTHROUGH",
+ "WRPROT",
+ "WRBACK",
+ };
+ if (type <= PM_MTRR_MAX)
+ return names[type];
+ return "UNKNOWN";
+}
+
+/****************************************************************************
+REMARKS:
+Dumps the value for a write combine region to the display.
+****************************************************************************/
+static void PMAPI EnumWriteCombine(
+ ulong base,
+ ulong length,
+ uint type)
+{
+ printf("%08lX %-10ld %s\n", base, length / 1024, DecodeWCType(type));
+}
+
+/****************************************************************************
+PARAMETERS:
+err - Error to log
+
+REMARKS:
+Function to log an error message if the MTRR write combining attempt failed.
+****************************************************************************/
+static void LogMTRRError(
+ int err)
+{
+ if (err == PM_MTRR_ERR_OK)
+ return;
+ switch (err) {
+ case PM_MTRR_NOT_SUPPORTED:
+ printf("Failed: MTRR is not supported by host CPU\n");
+ break;
+ case PM_MTRR_ERR_PARAMS:
+ printf("Failed: Invalid parameters passed to PM_enableWriteCombined!\n");
+ break;
+ case PM_MTRR_ERR_NOT_4KB_ALIGNED:
+ printf("Failed: Address is not 4Kb aligned!\n");
+ break;
+ case PM_MTRR_ERR_BELOW_1MB:
+ printf("Failed: Addresses below 1Mb cannot be write combined!\n");
+ break;
+ case PM_MTRR_ERR_NOT_ALIGNED:
+ printf("Failed: Address is not correctly aligned for processor!\n");
+ break;
+ case PM_MTRR_ERR_OVERLAP:
+ printf("Failed: Address overlaps an existing region!\n");
+ break;
+ case PM_MTRR_ERR_TYPE_MISMATCH:
+ printf("Failed: Adress is contained with existing region, but type is different!\n");
+ break;
+ case PM_MTRR_ERR_NONE_FREE:
+ printf("Failed: Out of MTRR registers!\n");
+ break;
+ case PM_MTRR_ERR_NOWRCOMB:
+ printf("Failed: This processor does not support write combining!\n");
+ break;
+ case PM_MTRR_ERR_NO_OS_SUPPORT:
+ printf("Failed: MTRR is not supported by host OS\n");
+ break;
+ default:
+ printf("Failed: UNKNOWN ERROR!\n");
+ break;
+ }
+ exit(-1);
+}
+
+/****************************************************************************
+REMARKS:
+Shows all write combine regions.
+****************************************************************************/
+static void ShowWriteCombine(void)
+{
+ printf("Base Length(KB) Type\n");
+ LogMTRRError(PM_enumWriteCombine(EnumWriteCombine));
+ printf("\n");
+}
+
+/****************************************************************************
+REMARKS:
+Dumps the value for a write combine region to the display.
+****************************************************************************/
+static void EnableWriteCombine(void)
+{
+ int i,index;
+
+ for (index = 0; index < NumDevices; index++) {
+ i = DeviceIndex[index];
+ if (PCI[i].u.type0.BaseAddress10 & 0x8) {
+ LogMTRRError(PM_enableWriteCombine(
+ PCI[i].u.type0.BaseAddress10 & 0xFFFFFFF0,
+ PCI[i].u.type0.BaseAddress10Len,
+ PM_MTRR_WRCOMB));
+ }
+ if (PCI[i].u.type0.BaseAddress14 & 0x8) {
+ LogMTRRError(PM_enableWriteCombine(
+ PCI[i].u.type0.BaseAddress14 & 0xFFFFFFF0,
+ PCI[i].u.type0.BaseAddress14Len,
+ PM_MTRR_WRCOMB));
+ }
+ }
+ printf("\n");
+ ShowDisplayDevices();
+ ShowWriteCombine();
+}
+
+/****************************************************************************
+REMARKS:
+Dumps the value for a write combine region to the display.
+****************************************************************************/
+static void DisableWriteCombine(void)
+{
+ int i,index;
+
+ for (index = 0; index < NumDevices; index++) {
+ i = DeviceIndex[index];
+ if (PCI[i].u.type0.BaseAddress10 & 0x8) {
+ LogMTRRError(PM_enableWriteCombine(
+ PCI[i].u.type0.BaseAddress10 & 0xFFFFFFF0,
+ PCI[i].u.type0.BaseAddress10Len,
+ PM_MTRR_UNCACHABLE));
+ }
+ if (PCI[i].u.type0.BaseAddress14 & 0x8) {
+ LogMTRRError(PM_enableWriteCombine(
+ PCI[i].u.type0.BaseAddress14 & 0xFFFFFFF0,
+ PCI[i].u.type0.BaseAddress14Len,
+ PM_MTRR_UNCACHABLE));
+ }
+ }
+ printf("\n");
+ ShowDisplayDevices();
+ ShowWriteCombine();
+}
+
+int main(int argc,char *argv[])
+{
+ PM_init();
+ if (PCI_enumerateDevices() < 1) {
+ printf("No PCI display devices found!\n");
+ return -1;
+ }
+ if (argc < 2) {
+ printf("usage: uswc [-show -on -off]\n\n");
+ ShowDisplayDevices();
+ return -1;
+ }
+ if (stricmp(argv[1],"-show") == 0)
+ ShowWriteCombine();
+ else if (stricmp(argv[1],"-on") == 0)
+ EnableWriteCombine();
+ else if (stricmp(argv[1],"-off") == 0)
+ DisableWriteCombine();
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/vftest.c b/board/MAI/bios_emulator/scitech/src/pm/tests/vftest.c
new file mode 100644
index 0000000000..633a76d2b7
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/vftest.c
@@ -0,0 +1,78 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Filename: $Workfile$
+* Version: $Revision: 1.1 $
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to test the VFlat virtual framebuffer functions.
+*
+* Functions tested: VF_available()
+* VF_init()
+* VF_exit()
+*
+* $Date: 2002/10/02 15:35:21 $ $Author: hfrieden $
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+uchar code[] = {
+ 0xC3, /* ret */
+ };
+
+int main(void)
+{
+ void *vfBuffer;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ if (!VF_available()) {
+ printf("Virtual Linear Framebuffer not available.\n");
+ exit(1);
+ }
+
+ vfBuffer = VF_init(0xA0000,64,sizeof(code),code);
+ if (!vfBuffer) {
+ printf("Failure to initialise Virtual Linear Framebuffer!\n");
+ exit(1);
+ }
+ VF_exit();
+ printf("Virtual Linear Framebuffer set up successfully!\n");
+ return 0;
+}
diff --git a/board/MAI/bios_emulator/scitech/src/pm/tests/video.c b/board/MAI/bios_emulator/scitech/src/pm/tests/video.c
new file mode 100644
index 0000000000..7f6f67f67e
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/tests/video.c
@@ -0,0 +1,200 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: Test program to check the ability to generate real mode
+* interrupts and to be able to obtain direct access to the
+* video memory from protected mode. Compile and link with
+* the appropriate command line for your DOS extender.
+*
+* Functions tested: PM_getBIOSSelector()
+* PM_mapPhysicalAddr()
+* PM_int86()
+*
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "pmapi.h"
+
+uchar *bios; /* Pointer to BIOS data area */
+uchar *videoPtr; /* Pointer to VGA framebuffer */
+void *stateBuf; /* Console state save buffer */
+
+/* Routine to return the current video mode number */
+
+int getVideoMode(void)
+{
+ return PM_getByte(bios+0x49);
+}
+
+/* Routine to set a specified video mode */
+
+void setVideoMode(int mode)
+{
+ RMREGS r;
+
+ r.x.ax = mode;
+ PM_int86(0x10, &r, &r);
+}
+
+/* Routine to clear a rectangular region on the display by calling the
+ * video BIOS.
+ */
+
+void clearScreen(int startx, int starty, int endx, int endy, unsigned char attr)
+{
+ RMREGS r;
+
+ r.x.ax = 0x0600;
+ r.h.bh = attr;
+ r.h.cl = startx;
+ r.h.ch = starty;
+ r.h.dl = endx;
+ r.h.dh = endy;
+ PM_int86(0x10, &r, &r);
+}
+
+/* Routine to fill a rectangular region on the display using direct
+ * video writes.
+ */
+
+#define SCREEN(x,y) (videoPtr + ((y) * 160) + ((x) << 1))
+
+void fill(int startx, int starty, int endx, int endy, unsigned char c,
+ unsigned char attr)
+{
+ unsigned char *v;
+ int x,y;
+
+ for (y = starty; y <= endy; y++) {
+ v = SCREEN(startx,y);
+ for (x = startx; x <= endx; x++) {
+ *v++ = c;
+ *v++ = attr;
+ }
+ }
+}
+
+/* Routine to display a single character using direct video writes */
+
+void writeChar(int x, int y, unsigned char c, unsigned char attr)
+{
+ unsigned char *v = SCREEN(x,y);
+ *v++ = c;
+ *v = attr;
+}
+
+/* Routine to draw a border around a rectangular area using direct video
+ * writes.
+ */
+
+static unsigned char border_chars[] = {
+ 186, 205, 201, 187, 200, 188 /* double box chars */
+ };
+
+void border(int startx, int starty, int endx, int endy, unsigned char attr)
+{
+ unsigned char *v;
+ unsigned char *b;
+ int i;
+
+ b = border_chars;
+
+ for (i = starty+1; i < endy; i++) {
+ writeChar(startx, i, *b, attr);
+ writeChar(endx, i, *b, attr);
+ }
+ b++;
+ for (i = startx+1, v = SCREEN(startx+1, starty); i < endx; i++) {
+ *v++ = *b;
+ *v++ = attr;
+ }
+ for (i = startx+1, v = SCREEN(startx+1, endy); i < endx; i++) {
+ *v++ = *b;
+ *v++ = attr;
+ }
+ b++;
+ writeChar(startx, starty, *b++, attr);
+ writeChar(endx, starty, *b++, attr);
+ writeChar(startx, endy, *b++, attr);
+ writeChar(endx, endy, *b++, attr);
+}
+
+int main(void)
+{
+ int orgMode;
+ PM_HWND hwndConsole;
+
+ printf("Program running in ");
+ switch (PM_getModeType()) {
+ case PM_realMode:
+ printf("real mode.\n\n");
+ break;
+ case PM_286:
+ printf("16 bit protected mode.\n\n");
+ break;
+ case PM_386:
+ printf("32 bit protected mode.\n\n");
+ break;
+ }
+
+ hwndConsole = PM_openConsole(0,0,0,0,0,true);
+ printf("Hit any key to start 80x25 text mode and perform some direct video output.\n");
+ PM_getch();
+
+ /* Allocate a buffer to save console state and save the state */
+ if ((stateBuf = PM_malloc(PM_getConsoleStateSize())) == NULL) {
+ printf("Unable to allocate console state buffer!\n");
+ exit(1);
+ }
+ PM_saveConsoleState(stateBuf,0);
+ bios = PM_getBIOSPointer();
+ orgMode = getVideoMode();
+ setVideoMode(0x3);
+ if ((videoPtr = PM_mapPhysicalAddr(0xB8000,0xFFFF,true)) == NULL) {
+ printf("Unable to obtain pointer to framebuffer!\n");
+ exit(1);
+ }
+
+ /* Draw some text on the screen */
+ fill(0, 0, 79, 24, 176, 0x1E);
+ border(0, 0, 79, 24, 0x1F);
+ PM_getch();
+ clearScreen(0, 0, 79, 24, 0x7);
+
+ /* Restore the console state on exit */
+ PM_restoreConsoleState(stateBuf,0);
+ PM_free(stateBuf);
+ PM_closeConsole(hwndConsole);
+
+ /* Display useful status information */
+ printf("\n");
+ printf("Original Video Mode = %02X\n", orgMode);
+ printf("BIOS Pointer = %08X\n", (int)bios);
+ printf("Video Memory = %08X\n", (int)videoPtr);
+ return 0;
+}
+