mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
2.8 KiB
154 lines
2.8 KiB
#include "insignia.h"
|
|
#include "host_def.h"
|
|
/*
|
|
* VPC-XT Revision 1.0
|
|
*
|
|
* Title : illegal_bop.c
|
|
*
|
|
* Description : A bop instuction has been executed for which
|
|
* no VPC function exists.
|
|
*
|
|
* Author : Henry Nash
|
|
*
|
|
* Notes : None
|
|
*
|
|
*/
|
|
|
|
#ifdef SCCSID
|
|
static char SccsID[]="@(#)ill_bop.c 1.11 12/07/94 Copyright Insignia Solutions Ltd.";
|
|
#endif
|
|
|
|
#ifdef SEGMENTATION
|
|
/*
|
|
* The following #include specifies the code segment into which this
|
|
* module will by placed by the MPW C compiler on the Mac II running
|
|
* MultiFinder.
|
|
*/
|
|
#include "SOFTPC_BIOS.seg"
|
|
#endif
|
|
|
|
|
|
/*
|
|
* O/S include files.
|
|
*/
|
|
#include <ctype.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include TypesH
|
|
#include StringH
|
|
|
|
/*
|
|
* SoftPC include files
|
|
*/
|
|
#include "xt.h"
|
|
#include "sas.h"
|
|
#include CpuH
|
|
#include "debug.h"
|
|
|
|
#ifndef PROD
|
|
|
|
#define MAX_IGNORE_BOPS 8
|
|
LOCAL IU8 ignoreBops[MAX_IGNORE_BOPS];
|
|
LOCAL IU8 maxIgnore = 0;
|
|
LOCAL IBOOL ignoreAll = FALSE;
|
|
LOCAL IBOOL doForceYoda = FALSE;
|
|
|
|
#endif /* PROD */
|
|
|
|
#if defined(NTVDM) && defined(MONITOR)
|
|
#define GetInstructionPointer() getEIP()
|
|
#endif
|
|
|
|
void illegal_bop()
|
|
{
|
|
#ifndef PROD
|
|
static IBOOL first = TRUE;
|
|
IU8 bop_number;
|
|
double_word ea;
|
|
IU8 i;
|
|
char *ignEnv;
|
|
char *pIgn;
|
|
|
|
if (first)
|
|
{
|
|
#ifdef YODA
|
|
/* Check whether YODA is defined or not. */
|
|
|
|
if (ignEnv = (char *)host_getenv("YODA"))
|
|
doForceYoda = TRUE;
|
|
#endif /* YODA */
|
|
|
|
/* Sort out which illegal bops to ignore. These are set
|
|
** in the environment variable IGNORE_ILLEGAL_BOPS
|
|
** which is set to either "all" to ignore all illegal
|
|
** bops, or to a colon-separated list of hex numbers
|
|
** to ignore specific bops.
|
|
*/
|
|
|
|
if (ignEnv = (char*)host_getenv("IGNORE_ILLEGAL_BOPS"))
|
|
{
|
|
if (strcasecmp(ignEnv, "all") == 0)
|
|
{
|
|
ignoreAll = TRUE;
|
|
}
|
|
else
|
|
{
|
|
for (pIgn = ignEnv; *pIgn &&
|
|
(maxIgnore < (MAX_IGNORE_BOPS - 1)); )
|
|
{
|
|
int ignValue;
|
|
|
|
/* Find the first hex digit. */
|
|
|
|
for ( ; *pIgn && !isxdigit(*pIgn);
|
|
pIgn++)
|
|
;
|
|
|
|
/* Read in the bop number. */
|
|
|
|
if (isxdigit(*pIgn) &&
|
|
(sscanf(pIgn, "%x",
|
|
&ignValue) == 1))
|
|
{
|
|
ignoreBops[maxIgnore++] =
|
|
ignValue;
|
|
}
|
|
|
|
/* Skip the bop number. */
|
|
|
|
for ( ; isxdigit(*pIgn); pIgn++)
|
|
;
|
|
}
|
|
}
|
|
}
|
|
|
|
first = FALSE; /* no need to repeat this palaver */
|
|
}
|
|
|
|
ea = effective_addr(getCS(), GetInstructionPointer() - 1);
|
|
bop_number = sas_hw_at(ea);
|
|
|
|
/* Why is the bop there at all if it's illegal? Alway trace
|
|
* such BOPs rather than silently ignoring them.
|
|
*/
|
|
|
|
always_trace3(
|
|
"Illegal BOP %02x precedes CS:EIP %04x:%04x",
|
|
bop_number, getCS(), GetInstructionPointer());
|
|
|
|
if (ignoreAll)
|
|
return;
|
|
|
|
for (i = 0; i < maxIgnore; i++)
|
|
{
|
|
if (ignoreBops[i] == bop_number)
|
|
return;
|
|
}
|
|
|
|
/* This BOP isn't ignored - drop into Yoda if possible */
|
|
#ifdef YODA
|
|
if (doForceYoda)
|
|
force_yoda();
|
|
#endif /* YODA */
|
|
#endif /* PROD */
|
|
}
|