mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2025-01-01 11:29:27 +00:00
4325cdcc78
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.
186 lines
5.5 KiB
C
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) ;
|
|
}
|