mac-rom/OS/StartMgr/UnivTestEnv/BitWalk.c
Elliot Nunn 4325cdcc78 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 09:52:23 +08:00

186 lines
5.5 KiB
C

/*
File: BitWalk.c
Contains: This file contains the routines which perform parameterized
bitwalk operations at a specified address. These routines
are available for use by subtests running in the CTE.
Written by: Mark Appleman
Copyright: © 1990, 1992 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<SM2> 5/2/92 kc Roll in Horror. Comments follow:
<H2> 3/6/92 AL Upgraded to CTE v2.1 (copied over from XXTest project).
<1> 12/14/90 SS first checked in
*/
//
// BitWalk.c
//
#include "GenericTypes.h"
#include "BitWalk.h"
#include "68KOpCodes.h"
//
// BitWalk8()
//
UBYTE BitWalk8(struct CTEGlobals *globs, BitWalk8_PB *params, BitWalk8_RB *results)
{
// Do once for true pattern phase, once for inverted pattern phase.
for(results->phase = 0; results->phase <= 1; results->phase++)
{
results->pattern = (results->phase == 0 ? params->initialPattern : ~params->initialPattern) ;
// Do for each shift of pattern.
for(results->shiftCount = 0; results->shiftCount < 8; results->shiftCount++)
{
// Calculate the pattern to write to the port.
// writeValue = (~dontWriteMask & doWriteBits) | (dontWriteMask & pattern)
results->writeValue = (~params->dontWriteMask & params->doWriteBits)
| (params->dontWriteMask & results->pattern) ;
// Write the pattern.
if(params->writeMethod)
params->writeMethod(globs, params->bytePtr, results->writeValue) ;
else
*params->bytePtr = results->writeValue ;
// Read back.
if(params->readMethod)
results->readValue = params->readMethod(globs, params->bytePtr) ;
else
results->readValue = *params->bytePtr ;
// Eor with writeValue, mask don't cares.
results->failedBits = params->dontCareMask &
(results->writeValue ^ results->readValue) ;
// If result is not zero the there's an error.
if(0 != results->failedBits)
goto ErrorExit ;
// Next pattern.
results->pattern = ROL_B(results->pattern, 1) ;
}
}
// Leave the byte being tested with a known value.
if(params->writeMethod)
params->writeMethod(globs, params->bytePtr, params->finalValue) ;
else
*params->bytePtr = params->finalValue ;
ErrorExit :
return(results->failedBits) ;
}
//
// BitWalk16()
//
UWORD BitWalk16(struct CTEGlobals *globs, BitWalk16_PB *params, BitWalk16_RB *results)
{
// Do once for true pattern phase, once for inverted pattern phase.
for(results->phase = 0; results->phase <= 1; results->phase++)
{
results->pattern = (results->phase == 0 ? params->initialPattern : ~params->initialPattern) ;
// Do for each shift of pattern.
for(results->shiftCount = 0; results->shiftCount < 16; results->shiftCount++)
{
// Calculate the pattern to write to the port.
// writeValue = (~dontWriteMask & doWriteBits) | (dontWriteMask & pattern)
results->writeValue = (~params->dontWriteMask & params->doWriteBits)
| (params->dontWriteMask & results->pattern) ;
// Write the pattern.
if(params->writeMethod)
params->writeMethod(globs, params->wordPtr, results->writeValue) ;
else
*params->wordPtr = results->writeValue ;
// Read back.
if(params->readMethod)
results->readValue = params->readMethod(globs, params->wordPtr) ;
else
results->readValue = *params->wordPtr ;
// Eor with writeValue, mask don't cares.
results->failedBits = params->dontCareMask &
(results->writeValue ^ results->readValue) ;
// If result is not zero the there's an error.
if(0 != results->failedBits)
goto ErrorExit ;
// Next pattern.
results->pattern = ROL_W(results->pattern, 1) ;
}
}
// Leave the word being tested with a known value.
if(params->writeMethod)
params->writeMethod(globs, params->wordPtr, params->finalValue) ;
else
*params->wordPtr = params->finalValue ;
ErrorExit :
return(results->failedBits) ;
}
//
// BitWalk32()
//
ULONG BitWalk32(struct CTEGlobals *globs, BitWalk32_PB *params, BitWalk32_RB *results)
{
// Do once for true pattern phase, once for inverted pattern phase.
for(results->phase = 0; results->phase <= 1; results->phase++)
{
results->pattern = (results->phase == 0 ? params->initialPattern : ~params->initialPattern) ;
// Do for each shift of pattern.
for(results->shiftCount = 0; results->shiftCount < 32; results->shiftCount++)
{
// Calculate the pattern to write to the port.
// writeValue = (~dontWriteMask & doWriteBits) | (dontWriteMask & pattern)
results->writeValue = (~params->dontWriteMask & params->doWriteBits)
| (params->dontWriteMask & results->pattern) ;
// Write the pattern.
if(params->writeMethod)
params->writeMethod(globs, params->longPtr, results->writeValue) ;
else
*params->longPtr = results->writeValue ;
// Read back.
if(params->readMethod)
results->readValue = params->readMethod(globs, params->longPtr) ;
else
results->readValue = *params->longPtr ;
// Eor with writeValue, mask don't cares.
results->failedBits = params->dontCareMask &
(results->writeValue ^ results->readValue) ;
// If result is not zero the there's an error.
if(0 != results->failedBits)
goto ErrorExit ;
// Next pattern.
results->pattern = ROL_L(results->pattern, 1) ;
}
}
// Leave the longword being tested with a known value.
if(params->writeMethod)
params->writeMethod(globs, params->longPtr, params->finalValue) ;
else
*params->longPtr = params->finalValue ;
ErrorExit :
return(results->failedBits) ;
}