mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-29 07:29:15 +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.
2236 lines
93 KiB
Plaintext
2236 lines
93 KiB
Plaintext
;__________________________________________________________________________________________________
|
|
;
|
|
; File: USTEnvirons.a
|
|
;
|
|
; Contains: This file contains routines which perform necessary housekeeping
|
|
; in order to run tests in the ROM. They also provide the interface
|
|
; between the serial test manager and the ROM based CTE kernel.
|
|
;
|
|
; Written by: Scott Smyers
|
|
;
|
|
; Copyright: © 1990, 1992-1993 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM5> 9/13/93 SAM Added a flag to USTInit to tell it not to call SizeMem (again!).
|
|
; <SM4> 11/3/92 rab Roll in Horror changes. Comments Follow:
|
|
; <H12> 7/27/92 AL Fixed the IHT setup for the Address Line Test, which changed
|
|
; when SizeMemory changed (see comments in USTCritTests.a).
|
|
; <H11> 7/15/92 AL Fixed the UTEReturnTestInfo and UTEReturnSubtestInfo functions
|
|
; to work correctly, modified some comments to be more accurate.
|
|
; <H10> 7/9/92 AL Did some fine tuning of a few routines for STM and the IHT hook.
|
|
; <H9> 07-07-92 jmp Fixed previous check-in comments.
|
|
; <H8> 07-07-92 jmp Had to conditionally remove the BigBSR to DataBusTest
|
|
; due to an assembler error when the -ram option is
|
|
; used. Anyone know/care why?
|
|
; <H7> 7/1/92 AL Fixed a couple of things in the IHT hook. Preserving the
|
|
; environment across IHT_Init and fixing a small stack
|
|
; messer-upper is about it. Added some more comments for fun and
|
|
; enjoyment.
|
|
; <H6> 6/17/92 AL Fixed the UTEExecuteDTM routine to correctly access a couple of
|
|
; variables relative to the stack.
|
|
; <H5> 6/7/92 AL Fixed a minor problem with a couple of <H4> comments that
|
|
; weren't separated from the code, which could possibly cause an
|
|
; assembly process anomoly.
|
|
; <H4> 6/7/92 AL Added some comments to help demistify some of the sources. Fixed
|
|
; the environment checking logic to find and execute the correct
|
|
; tests for the given situation (startup, restart, etc.). Fixed
|
|
; the critical test access mechanism for the IHT hook.
|
|
; <SM3> 9/25/92 RB Changed a BSR6 macro to jump.
|
|
; <SM2> 5/2/92 kc Roll in Horror. Comments follow:
|
|
; <H3> 3/6/92 AL After the conditionalized PROC mods made by jmp, it was
|
|
; discovered
|
|
; that the original USTStartTest.a had outgrown its allocated
|
|
; space
|
|
; in the ROM. So, I had to create a new file, USTSTartTest1.a, and
|
|
; moved this file and USTTestMgr.a into it. It takes a little less
|
|
; than 16k from OverPatch1.a, and currently uses about 6k.
|
|
; Other changes include the removal of all obsolete pre-CTE v2.1
|
|
; routines and references. Made the conversion to CTE v2.1. Added
|
|
; greater functionality to the Serial Test Manager and Board
|
|
; Tester Hook (IHT) to support the new CTE. Enhanced some of the
|
|
; comments to more accurately reflect what the code is actually
|
|
; doing.
|
|
; <H2> 01/27/92 jmp Conditionalized the PROC parts of this file for use in lining up
|
|
; the UST part of HORROR with that of TERROR/Zydeco.
|
|
; ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; Pre-Horror ROM comments begin here.
|
|
; ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; <7> 4/22/91 BG Rolling in Scott Smyers changes: restore the diagnostic ROM
|
|
; entry point before returning to the IHT ROMs, and other fixes to
|
|
; this hook. Also, added the raw cte install test and subtest
|
|
; calls to the CTE dispatch table for use by IHT code.
|
|
; <6> 4/13/91 BG Rolling in Scott Smyers changes: Added the board tester ROM hook
|
|
; code to this file from USTTestMgr.a. In the process, I changed
|
|
; the code so that it leverages off of the new CTE engine I added
|
|
; to the Serial test manager. That engine is in this file, so
|
|
; that's why I moved it.
|
|
; <5> 4/2/91 CCH Rolled in Scott Smyers' changes: Added support for new test list
|
|
; structure element names. Made the "install test" algorithm into
|
|
; a loop to install all ROM based tests.
|
|
; <4> 3/13/91 CCH Rolled in RBI changes from Scott Smyers.
|
|
; <3> 1/24/91 CCH Rolled in changes from Scott Smyers.
|
|
; <2> 1/14/91 CCH Rolled in Scott Smyers' changes.
|
|
; <1> 12/14/90 HJR Adding for the first time.
|
|
;
|
|
;__________________________________________________________________________________________________
|
|
|
|
TITLE 'USTEnvirons.a'
|
|
CASE OFF
|
|
|
|
EnvironProc PROC
|
|
|
|
IMPORT SizeMemory
|
|
IMPORT JGetHardwareInfo
|
|
IMPORT USTCPUList
|
|
IMPORT USTSubtests
|
|
IMPORT USTInit
|
|
IMPORT CopyPRAMToRAM
|
|
IMPORT CopyRAMToPRAM
|
|
IMPORT GetChar
|
|
IMPORT OutChar
|
|
|
|
IMPORT Mod3Test ; <H4><SM4>
|
|
IMPORT RevMod3Test ; <H4><SM4>
|
|
IMPORT RomTest ; <H4><SM4>
|
|
IMPORT StartUpROMTest ; <H4><SM4>
|
|
IMPORT ExtRAMTest ; <H4><SM4>
|
|
IMPORT AddrLineTest ; <H4><SM4>
|
|
IMPORT DataBusTest ; <H4><SM4>
|
|
IMPORT dynamic_bussize_test ; <H4><SM4>
|
|
|
|
IMPORT GI_InitInterface
|
|
IMPORT GI_GetVersion
|
|
IMPORT GI_ExecuteDTM
|
|
IMPORT GI_AllocPermMem
|
|
IMPORT GI_AllocTempMem
|
|
IMPORT GI_FreeTempMem
|
|
IMPORT ClkWpOff
|
|
IMPORT USTCPUList
|
|
IMPORT USTTests
|
|
IMPORT TJump ; <SM4>
|
|
|
|
EXPORT USTMainTest
|
|
EXPORT SetupForExecuteDTM
|
|
EXPORT UTECmd
|
|
EXPORT diagROMentry
|
|
|
|
; These equates are used by the UTEReturnTestInfo and UTEReturnSubtestInfo functions. They <SM4>
|
|
; are defined in the OPPOSITE order of the USTTest and USTSubtest structure definitions, <SM4>
|
|
; because they are used to place the USTTest entries on the stack as local variables <SM4>
|
|
; in preparation for the SendData call. Local variables are referenced with negative <SM4>
|
|
; offsets from the stack frame pointer (in this case, it's going to be A5): <SM4>
|
|
|
|
resultSizeLoc equ -4 ; this many bytes off of A5, for the SendData routine <H11><SM4>
|
|
paramSizeLoc equ -8 ; this many bytes off of A5, for the SendData routine <H11><SM4>
|
|
codeSizeLoc equ -12 ; this many bytes off of A5, for the SendData routine <H11><SM4>
|
|
namePtrLoc equ -16 ; this many bytes off of A5, for the SendData routine <H11><SM4>
|
|
testAddrLoc equ -20 ; this many bytes off of A5, for the SendData routine <H11><SM4>
|
|
testIDSizeLoc equ -24 ; this many bytes off of A5, for the SendData routine <H11><SM4>
|
|
|
|
|
|
USTMainTest
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine is the test in the ROM. This routine is CTE Type 2 style. When
|
|
; executed it sets up the registers as needed for the ROM based subtests, then calls
|
|
; the requested ROM subtest using the BSR6 convention. Note that although this is a
|
|
; CTE style test in as much as the stack has the expected parameters for a CTE test,
|
|
; none of the ROM-based noncritical tests (subtests in CTE lingo) use these values. In
|
|
; fact, all they need are the decoder and product info ptrs, and the bases valid flags.
|
|
; However, for the sake of conformity future enhancement to the ROM-based non critical
|
|
; subtests and stuff like that, this routine is setup to be like a real CTE test.
|
|
;
|
|
; Input: Information on the stack according to the following format:
|
|
;
|
|
|
|
USTTestCallStack RECORD 0,increment
|
|
|
|
@A6Link ds.l 1 ; saves space for the "linked" A6
|
|
@ReturnAddr ds.l 1 ; caller's return address
|
|
@CTEGlobs ds.l 1 ; pointer to the CTE globals
|
|
@testParams ds.l 1 ; pointer to the test parameter block
|
|
@testResults ds.l 1 ; pointer to the test result block
|
|
@subtestParams ds.l 1 ; pointer to subtest parameter block
|
|
@SubTestID ds.l 1 ; subtest ID
|
|
ENDR
|
|
|
|
;
|
|
; Output:
|
|
; Executes a test
|
|
;
|
|
;----------------------------------------------------------------------
|
|
@savedRegs reg a0-a5/d1-d7
|
|
|
|
WITH USTSubtest, USTGlobals, ProductInfo, USTTestCallStack
|
|
|
|
link a6,#0
|
|
movem.l @savedRegs,-(sp) ; save these during this operation
|
|
movea.l @CTEGlobs(a6),a3 ; get a pointer to the globals so I can get to
|
|
movea.l a3,a4 ; the HW info, and save this for later
|
|
|
|
|
|
; All of the ROM-based non-critical tests expect a0, a1, d0 and d2 to be pointing to
|
|
; some valid information on entry. Therefore, these registers must be setup before
|
|
; jumping into the subtest. The Terror ROM had the CTE globals modified to include
|
|
; access to this information, but there is a way to do it while maintaining compatibility
|
|
; with the stock CTE. That way is to use the userInfo pointer of the ExecutionOptions
|
|
; parameter to ExecuteDTM to hold a pointer to the USTGlobals structure (which contains
|
|
; the necessary hardware info). This test can look through the CTE globals to the
|
|
; ExecutionOptions field, then through this field to the USTGlobals:
|
|
|
|
|
|
; CASE ON ; if this is disabled, things build better...
|
|
WITH CTEInfo, CTESubtestInfo, CTEDTMExecutionOptions
|
|
movea.l subtestInfo(a3),a3 ; get a ptr to the subtest info...
|
|
movea.l functionEntry(a3),a3 ; and get the entry point
|
|
movea.l executionOptions(a4),a4 ; get the execution options ptr
|
|
; get the ptr to the userInfo (which
|
|
; points to the USTGlobals)
|
|
movea.l CTEDTMExecutionOptions.userInfo(a4),a4
|
|
|
|
ENDWITH
|
|
; CASE OFF
|
|
|
|
; Here's where the actual hardware info registers are filled in:
|
|
|
|
move.l BasesValidFlags(a4),d0 ; get the bases valid flags
|
|
movea.l DcdrInfPtr(a4),a0 ; and decoder info pointer for tests
|
|
movea.l PrdctInfPtr(a4),a1 ; and product info pointer
|
|
move.w ProductKind(a1),d2 ; get our box flag and decoder kind info
|
|
|
|
|
|
; Now prepare to execute the subtest and return the results:
|
|
|
|
moveq.l #0,d6 ; zero out the result register
|
|
movem.l a6,-(sp) ; save our registers
|
|
|
|
lea @1,a6 ; setup return address <SM3> rb
|
|
jmp (a3) ; and execute the subtest <SM3> rb
|
|
@1 ; <SM3> rb
|
|
|
|
movem.l (sp)+,a6 ; restore our registers
|
|
move.l d6,d0 ; return with error code (the result from a
|
|
; C function should be in D0, and since this
|
|
; is simulating a C function, put it there)
|
|
|
|
movem.l (sp)+,@savedRegs ; restore all registers
|
|
unlk a6
|
|
|
|
rts ; and return
|
|
|
|
ENDWITH
|
|
|
|
; End of USTMainTest
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This table (STM_Util) holds relative entry points to utility functions used by the
|
|
; Serial Test Manager (STM), to facilitate STM-specific operations, including the
|
|
; use of the CTE kernel. There is a separate table, GI_Table, which contains relative
|
|
; entry points for the GenericInterface routines used to manipulate the CTE environment.
|
|
;
|
|
;
|
|
STM_Util
|
|
|
|
dc.l UTEReset -STM_Util ; Init or re-init the CTE kernel (MUST BE FIRST!!!)
|
|
dc.l UTEExecuteDTM -STM_Util ; execute a DTM given the test & subtest IDs
|
|
dc.l UTEDownloadTest -STM_Util ; download a test
|
|
dc.l UTEDownloadSubtest -STM_Util ; download a subtest
|
|
dc.l UTEDownloadExecutionOptions -STM_Util ; download an execution options structure
|
|
dc.l UTEDownloadExecutionResults -STM_Util ; download an execution results structure
|
|
dc.l UTEDumpRAM -STM_Util ; dump a section of RAM to the host
|
|
dc.l UTEReadPRAM -STM_Util ; read an area of PRAM <T4>
|
|
dc.l UTEWritePRAM -STM_Util ; write an area of PRAM <T4>
|
|
dc.l UTEReturnTestInfo -STM_Util ; return the vital statistics of a given
|
|
; ROM-based test
|
|
dc.l UTEReturnSubtestInfo -STM_Util ; do the same for a subtest
|
|
|
|
STM_UtilSize equ (*-STM_Util)>>2 ; number of jump table entries
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This table (GI_Table) contains relative entry points for the GenericInterface
|
|
; routines used to manipulate the CTE environment. It is used by both the Serial Test
|
|
; Manager (STM) and In-House Tester hook (IHT - sometimes known as the board testers
|
|
; or diagnostic ROMs).
|
|
;
|
|
; These environments would use this table to access the GI_ExecuteDTM call directly
|
|
; only if they wanted to take care of their own DTMs (setting up the testInfo,
|
|
; subtestInfo, executionOptions structures, etc.) that are NOT in the system ROM,
|
|
; and just use the STM/IHT hooks to handle making the calls to the Generic Interface.
|
|
;
|
|
; When they want to execute DTMs that exist in the ROM, all they need to do is
|
|
; request the special DiagExecuteDTM (for the IHT hook) or UTEExecuteDTM (for STM)
|
|
; routines and supply the test and subtest IDs. Those two routines can take care of
|
|
; the rest of the work (setting up the structures, etc.).
|
|
;
|
|
GI_Table
|
|
|
|
CASE ON
|
|
; These are the ID values as
|
|
; documented in the STM manual
|
|
dc.l GI_InitInterface -GI_TABLE ;100
|
|
dc.l GI_GetVersion -GI_TABLE ;101
|
|
dc.l GI_AllocPermMem -GI_TABLE ;10B
|
|
dc.l GI_AllocTempMem -GI_TABLE ;10C
|
|
dc.l GI_FreeTempMem -GI_TABLE ;10D
|
|
dc.l GI_GetCommentary -GI_TABLE ; ?????
|
|
dc.l GI_GetDefaultExecutionOptions -GI_TABLE ; ?????
|
|
dc.l GI_ExecuteDTM -GI_TABLE ; ?????
|
|
|
|
CASE OFF
|
|
|
|
GI_TableSize equ *-GI_Table
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UTECmd
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This is the entry point for the interface to the serial test manager "!" commands.
|
|
; The "*" commands are handled in the USTTestMgr.a source file. This code receives
|
|
; the CTE command string, decodes it, then executes the selected command. The format
|
|
; of the command string is as follows:
|
|
;
|
|
; !<offset><# params><params><other>
|
|
;
|
|
; Where: <offset> - (long) Command number (offset into jump table below)
|
|
; <# params> - (word) Number of bytes to receive for calling params
|
|
; <params> - (longs) Parameters for command, must agree with <# params>
|
|
; <other> - (bytes) Other information, such as test/subtest code
|
|
;
|
|
; This routine assumes that the stack is pointing to somewhere useful. If an
|
|
; initialize command is received, the stack will be moved around.
|
|
;
|
|
; If the command received is not an initialize command, this code assumes that the
|
|
; UTEReset command has already been executed, and that the stack looks like this (the
|
|
; UST Globals pointer is the first item on the stack):
|
|
;
|
|
GICodeBase equ $10000 ;base number for GI routines
|
|
cmdBytes equ 6
|
|
;
|
|
StackFrame1 RECORD 0, Increment ;Starts at offset 0 into the stack
|
|
|
|
@return ds.l 1 ;Return address
|
|
@myGlobs ds.l 1 ;Our local global data
|
|
|
|
ENDR
|
|
;
|
|
;
|
|
; Note that the various STM_Util routines have different stack frame needs. Some calls
|
|
; don't need any information added to the stack beyond what is already here when this
|
|
; routine is entered. Others need a substantial amount of information set up on the
|
|
; stack. So, the burning question is: WHO sets up the stack for these calls? The
|
|
; burning answer is: THIS ROUTINE, BASED ON THE COMMAND LINE FROM STM.
|
|
;
|
|
; Here's how it works. In the command line prototype above, the #params field gives
|
|
; me the number of bytes that will be coming in for the particular request. It is the
|
|
; responsibility of the user (whether that be a person using MacTerminal to control
|
|
; STM or running a diagnostics tool that provides a friendly interface to STM or
|
|
; whatever) to provide this information when typing in the command. From here, I can
|
|
; pick that information from the serial port, push it on the stack, and make the
|
|
; necessary utility call. It's as simple as that.
|
|
;----------------------------------------------------------------------
|
|
|
|
WITH StackFrame1, USTGlobals
|
|
lea -cmdBytes(sp),sp ;make room for our command number
|
|
move.l sp,-(sp) ;and store a pointer to it on the stack
|
|
move.l #cmdBytes,-(sp) ;command # is 4 bytes (1 long)
|
|
bsr GetCmdData ;then get the command number
|
|
lea 8(sp),sp ;pop off our stack data
|
|
move.l (sp)+,d0 ;then get the command number
|
|
bne.s @notInit ;continue if this is not a reset
|
|
|
|
addq.l #2,sp ;else pop off the command stack frame size
|
|
movea.l @return(sp),a6 ;Get the return address (init returns directly to caller)
|
|
lea STM_Util,a0 ;get the pointer to the jump table
|
|
adda.l (a0),a0 ;offset to init routine (adjust address to absolute)
|
|
jmp (a0) ;and go init
|
|
|
|
@notInit
|
|
moveq.l #0,d1 ;clear d1 first
|
|
move.w (sp)+,d1 ;get the command stack frame size
|
|
movea.l @myGlobs(sp),a5 ;Get our globals pointer
|
|
movem.l a3/d3,-(sp) ;save our SCC registers for after the call
|
|
|
|
move.l d0,CmdNumber(a5) ;Save the command number
|
|
move.l d1,CallFrameSize(a5);and get the stack frame size
|
|
beq.s @CmdDecode ;continue if no additional data to fetch
|
|
|
|
suba.l d1,sp ;get ready to receive the stack information
|
|
move.l sp,-(sp) ;save a pointer to the area on the stack
|
|
move.l d1,-(sp) ;and save the number of bytes to get
|
|
bsr GetCmdData ;get the data
|
|
lea 8(sp),sp ;pop off our stack data
|
|
move.l CmdNumber(a5),d0 ;retrieve the command number
|
|
|
|
@CmdDecode
|
|
lea STM_Util,a0 ;Assume utility function
|
|
cmp.l #GICodeBase,d0 ;is this a GI call?
|
|
blt.s @Branch ;continue if not
|
|
|
|
lea GI_Table,a0 ;else, get the base address of the GI table
|
|
sub.l #GICodeBase,d0 ;and adjust the base of the cmd #
|
|
|
|
; Need to do some range checking here to see if we want to use the ROM or the
|
|
; RAM based jump table.
|
|
;
|
|
; NOTE: the previous comment was in the original sources, but I have no idea what
|
|
; it means.
|
|
|
|
@Branch
|
|
move.l CTEGlobals(a5),-(sp);all CTE rouines expect the globs pointer first
|
|
|
|
lsl.l #2,d0 ;adjust the offset
|
|
move.l (a0,d0.l),d0 ;get the jump table entry (a relative entry at this point)
|
|
jsr (a0,d0.l) ;and dispatch to proper point (adjusted to absolute)
|
|
addq.l #4,sp ;pop off the CTE globs
|
|
|
|
adda.l CallFrameSize(a5),sp;pop our data off the stack
|
|
movem.l (sp)+,a3/d3 ;restore the SCC information
|
|
ENDWITH
|
|
|
|
|
|
|
|
move.l d0,-(sp) ;put data to report on the stack
|
|
move.l sp,-(sp) ;put the address of the data on the stack
|
|
move.l #4,-(sp) ;and the number of bytes to send
|
|
bsr SendData ;send out the contents of d0
|
|
lea 8(sp),sp ;pop our stuff off the stack
|
|
moveq.l #0,d0 ;clear the return status
|
|
|
|
move.l (sp)+,d6 ;put the return status into the result register
|
|
beq.s @finish ;did we have an error?
|
|
move.b #'X',d0 ;Signal the world if so
|
|
|
|
@finish
|
|
rts ;and return
|
|
|
|
; End of UTECmd
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UTEReset
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; UTEReset creates a fresh set of UST globals and CTE globals. It should only
|
|
; be called once, after memory has been tested and validated. In the process, this
|
|
; routine calls USTInit, which will size memory and set up the stack. So, this is
|
|
; where it all begins. When we're done here, we go back to the entity that called
|
|
; the UTECmd routine in the first place; there is no further interaction with the
|
|
; STM stuff until the entity starts requesting operations.
|
|
;
|
|
; NOTE: The BSR6 to USTInit was changed to a BigBSR6 because this file was taken
|
|
; out of USTStartTest.a and put into USTStartTest1.a, and the branch became too
|
|
; far for a BSR6. HAL 2/12/92
|
|
;
|
|
WITH USTGlobals
|
|
move.l a6,usp ; save the return address
|
|
move #0,D2 ; Tell USTInit to call SizeMem <SM5>
|
|
BigBSR6 USTInit,a0 ; Initialize the universal environment <T7>
|
|
|
|
move.w #RunBits.STM,RunMode(a5) ; set the run mode for serial test manager
|
|
|
|
suba.l #SizeOfCTEGlobals,sp ; allocate our CTE global area on the stack
|
|
move.l sp,CTEGlobals(a5) ; save the global area pointer
|
|
|
|
move.l a5,-(sp) ; save our global pointer
|
|
move.l usp,a0 ; now put the return address on the stack
|
|
move.l a0,-(sp)
|
|
|
|
movea.l CTEGlobals(a5),a0 ; get the globs pointer
|
|
|
|
CASE ON
|
|
GIM_InitInterface (a0),#SIZEOFCTEGLOBALS ; init the CTE interface
|
|
CASE OFF
|
|
ENDWITH
|
|
|
|
rts ; this returns directly to the caller of UTECmd
|
|
|
|
; End of UTEReset
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
UTEDumpRAM
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine sends a section of RAM to the host. The start address and
|
|
; size of the transfer are specified in the calling sequence.
|
|
;
|
|
; The following record describes the stack on input to this routine:
|
|
StackFrame2 RECORD 0, Increment ;Starts at offset 0 into the stack
|
|
|
|
@return ds.l 1 ;Return address
|
|
@CTEGlobs ds.l 1 ;Pointer to CTE globals (not used here)
|
|
@startAddr ds.l 1 ;Start address of RAM to dump
|
|
@size ds.l 1 ;number of bytes to dump
|
|
|
|
ENDR
|
|
;
|
|
;----------------------------------------------------------------------
|
|
WITH StackFrame2
|
|
movea.l sp,a0
|
|
move.l @startAddr(a0),-(sp) ;put the start address on the stack
|
|
move.l @size(a0),-(sp) ;and the size
|
|
bsr SendData ;transmit the data
|
|
lea 8(sp),sp ;pop the data off the stack
|
|
ENDWITH
|
|
moveq.l #0,d0 ;clear the return status
|
|
rts
|
|
|
|
; End of UTEDumpRAM see <T4> below
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UTEReadPRAM
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine reads a section of PRAM and sends it to the host. The start address and
|
|
; size of the transfer are specified in the calling sequence.
|
|
;
|
|
; The following record describes the stack on input to this routine:
|
|
StackFrame3 RECORD 0, Increment ;Starts at offset 0 into the stack
|
|
|
|
@savedA6 ds.l 1 ;location for "linked" A6 register
|
|
@return ds.l 1 ;Return address
|
|
@CTEGlobs ds.l 1 ;Pointer to CTE globals (not used here)
|
|
@startAddr ds.w 1 ;Start address of PRAM to dump
|
|
@size ds.w 1 ;number of bytes to dump
|
|
|
|
ENDR
|
|
;
|
|
;----------------------------------------------------------------------
|
|
WITH StackFrame3, USTGlobals
|
|
link a6,#0 ;get our stack frame pointer
|
|
|
|
movea.l DcdrInfPtr(a5),a0 ;get the pointer to the decoder info
|
|
movea.l PrdctInfPtr(a5),a1 ;and the product info
|
|
movea.l DecoderInfo.VIA1Addr(a0),a2 ;then get the VIA1 pointer
|
|
|
|
suba.w @size(a6),sp ;make room for the data in RAM
|
|
movea.l sp,a4 ;get the address of this area
|
|
|
|
movem.l d3/a3-a4/a6,-(sp) ;save our local variables
|
|
|
|
move.w @startAddr(a6),a3 ;get the PRAM source address <H8><SM4>
|
|
move.w @size(a6),d3 ;get the size <H8><SM4>
|
|
_CopyPRAMToRAM a3, (a4), d3 ;go read PRAM <H8><SM4>
|
|
movem.l (sp)+,d3/a3-a4/a6 ;and restore our local variables
|
|
|
|
movem.l a6,-(sp) ;save our local data pointer
|
|
|
|
move.l a4,-(sp) ;now: send the data to the serial port
|
|
move.w @size(a6),d0 ;get the number of bytes to move
|
|
ext.l d0 ;make it a long
|
|
move.l d0,-(sp) ;put the size on the stack
|
|
bsr SendData ;transmit the data
|
|
lea 8(sp),sp ;pop the data off the stack
|
|
|
|
movem.l (sp)+,a6 ;restore our local pointer
|
|
|
|
unlk a6 ;restore the stack
|
|
ENDWITH
|
|
moveq.l #0,d0 ;clear the return status
|
|
rts
|
|
|
|
; End of UTEReadPRAM
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UTEWritePRAM
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine receives data from the host and writes it to PRAM. The start
|
|
; address and size of the transfer are specified in the calling sequence.
|
|
;
|
|
; The following record describes the stack on input to this routine:
|
|
StackFrame4 RECORD 0, Increment ;Starts at offset 0 into the stack
|
|
|
|
@savedA6 ds.l 1 ;saved a6 location (used in LINK instruction)
|
|
@return ds.l 1 ;Return address
|
|
@CTEGlobs ds.l 1 ;Pointer to CTE globals (not used here)
|
|
@startAddr ds.w 1 ;Start address (in PRAM) to receive data
|
|
@size ds.w 1 ;number of bytes to dump
|
|
|
|
ENDR
|
|
;
|
|
;----------------------------------------------------------------------
|
|
WITH StackFrame4, USTGlobals
|
|
link a6,#0 ;get our stack frame pointer
|
|
|
|
move.w @size(a6),d0 ;get the number of bytes to fetch
|
|
ext.l d0 ;make it a long
|
|
suba.l d0,sp ;make some room on the stack for the data
|
|
movea.l sp,a4 ;save the address of the pointer
|
|
|
|
movem.l a4/a6,-(sp) ;save our stack frame pointer
|
|
move.l a4,-(sp) ;put address of an area to hold the data
|
|
move.l d0,-(sp) ;put the number of bytes to fetch on the stack
|
|
bsr GetCmdData ;go get the data
|
|
lea 8(sp),sp ;restore the stack
|
|
movem.l (sp)+,a4/a6 ;and get our stack frame pointer again
|
|
|
|
movea.l DcdrInfPtr(a5),a0 ;get the pointer to the decoder info
|
|
movea.l PrdctInfPtr(a5),a1 ;and the product info
|
|
movea.l DecoderInfo.VIA1Addr(a0),a2 ;then get the VIA1 pointer
|
|
|
|
movem.l a4-a6,-(sp) ;save our local registers
|
|
BigBSR6 ClkWpOff,a4 ;turn off the write protect bit
|
|
movem.l (sp)+,a4-a6 ;and restore our regs
|
|
|
|
movem.l a6,-(sp) ;save our local data pointer
|
|
_CopyRAMToPRAM (a4), @startAddr(a6), @size(a6) ;write the data to PRAM
|
|
movem.l (sp)+,a6 ;restore our local pointer again
|
|
|
|
unlk a6 ;clean it up and go home
|
|
ENDWITH
|
|
moveq.l #0,d0 ;clear the return status
|
|
rts
|
|
|
|
; End of UTEWritePRAM <T4>^
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
UTEExecuteDTM
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine gives the host one-stop-shopping for executing ROM-based DTMs. All the
|
|
; user needs to know are the test and subtest IDs, and this routine does the rest.
|
|
; Accordingly, the stack needs to be formatted to hold the two IDs. The stack is
|
|
; setup by the UTECmd routine, based on the user's input stream that comes into the
|
|
; serial port.
|
|
;
|
|
; NOTE: Like many of the CTE-related routines that support the Serial Test Manager,
|
|
; some assumptions have to be made. One of those is that the user (host machine) has
|
|
; previously requested that memory tests be executed and determined that memory is
|
|
; OK. Once memory tests have been executed, the CTE world should be initialized by
|
|
; calling the STM and requesting the UTEReset routine. After that, any more memory
|
|
; testing will wipe out CTE so it will have to be initialized all over again.
|
|
;
|
|
; Another assumption is that a5 points to the USTGlobals structure, which it should
|
|
; if the user has already called the UTEReset routine.
|
|
;
|
|
; Inputs:
|
|
StackFrame5 RECORD 0, Increment ; Starts at offset 0 into the stack
|
|
|
|
@savedReg ds.l 1 ; place to hold the saved value for the link <H8><SM4>
|
|
@return ds.l 1 ; return address is first
|
|
@CTEGlobs ds.l 1 ; CTE globals pointer is next
|
|
@subTestID ds.l 1 ; ROM-based subtest ID
|
|
@testID ds.l 1 ; ROM-based test ID
|
|
|
|
ENDR
|
|
;
|
|
;----------------------------------------------------------------------
|
|
@savedRegs reg a0-a5/d1-d5
|
|
|
|
link a6,#0 ; <H8><SM4>
|
|
movem.l @savedRegs,-(sp) ; save these during this operation
|
|
|
|
WITH StackFrame5, USTGlobals
|
|
move.l @subTestID(a6),d4 ; prepare for the SetupForExecuteDTM call <H6><H8><SM4>
|
|
move.l @testID(a6),d5 ; <H6><H8><SM4>
|
|
move.l a6,-(sp) ; save this across the next call <H8><SM4>
|
|
|
|
bsr6 SetupForExecuteDTM ; do a RAM-less bsr to the routine that takes
|
|
; care of setting up for the execution of a DTM
|
|
|
|
move.l (sp)+,a6 ; restore my stack frame pointer <H8><SM4>
|
|
; Check for errors in setting up for the ExecuteDTM and don't try to execute the DTM
|
|
; if any were found:
|
|
|
|
cmp.l #-1,tInfoFunctionEntry(a5) ; -1 in this field means test not found
|
|
beq.s @LogError
|
|
cmp.l #-1,sInfoFunctionEntry(a5) ; -1 in this field means subtest not found
|
|
beq.s @LogError
|
|
|
|
movea.l @CTEGlobs(a6),a0 ; get the CTE globals pointer for GIM_ExecuteDTM <H8><SM4>
|
|
|
|
CASE ON ; everything's OK, so do the DTM thing
|
|
GIM_ExecuteDTM (a0), EXOPUSERINFO(a5), TINFOUSERINFO(a5), SINFOUSERINFO(a5), EXRESERR(a5)
|
|
CASE OFF
|
|
|
|
bra.s @End ; go clean up the stack and return the results
|
|
ENDWITH
|
|
|
|
|
|
@LogError
|
|
move.l #-1,d6 ; return -1 indicating that either the test
|
|
; or subtest doesn't apply to this machine (or
|
|
; was not found, or can't be run from STM for
|
|
; some reason)
|
|
|
|
@End
|
|
movem.l (sp)+,@savedRegs ; restore them registers
|
|
unlk a6 ; clean it up and go home <H8><SM4>
|
|
move.l d6,d0 ; return any error
|
|
rts
|
|
|
|
; End of UTEExecuteDTM
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UTEDownloadTest
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine is used to handle downloading tests from the host (usually another
|
|
; Mac running a communications program like MacTerminal, but it could be just any
|
|
; old black box). This glue routine receives the calling parameters for
|
|
; GI_InstallTest (just so it can get the size of the downloaded code and the
|
|
; test ID for later reference), allocates memory for the downloaded code,
|
|
; receives the downloaded code, then adds the test info (ID and entry point - as
|
|
; determined by this routine) to a RAM-based table that will be used to execute DTMs
|
|
; when requested by the host. DTM execution will be requested by asking for the
|
|
; test and subtest IDs.
|
|
;
|
|
; NOTE: Like many of the CTE-related routines that support the Serial Test Manager,
|
|
; some assumptions have to be made. One of those is that the user (host machine) has
|
|
; previously requested that memory tests be executed and determined that memory is
|
|
; OK. Once memory tests have been executed, the CTE world should be initialized.
|
|
; After that, any more memory testing will wipe out CTE so it will have to be started
|
|
; all over again.
|
|
;
|
|
; Inputs:
|
|
StackFrame6 RECORD 0, Increment ; starts at offset 0 into the stack
|
|
|
|
@return ds.l 1 ; return address
|
|
@globs ds.l 1 ; CTE Global pointer
|
|
@TestID ds.l 1 ; ID for downloaded test
|
|
@TestPtr ds.l 1 ; not included as input
|
|
@Size ds.l 1 ; size of test to download (in bytes)
|
|
@NamePtr ds.l 1 ; not used, should be zero
|
|
@TestUserInfo ds.l 1 ; the userInfo pointer
|
|
@pbSize ds.l 1 ; the test parameter block size
|
|
@rbSize ds.l 1 ; the test result block size
|
|
|
|
|
|
ENDR
|
|
;
|
|
;----------------------------------------------------------------------
|
|
WITH StackFrame6, USTGlobals
|
|
movea.l @globs(sp),a0 ; get the CTE globals pointer
|
|
move.l @size(sp),d0 ; get the size of the test
|
|
|
|
CASE ON
|
|
GIM_AllocPermMem (a0), d0 ; allocate the necessary memory from CTE
|
|
CASE OFF
|
|
|
|
tst.l d0 ; is everything OK? (d0 = 0 means no memory available)
|
|
bne.s @allocOK ; continue if OK
|
|
moveq.l #-1,d0 ; report problems with allocation
|
|
bra.s @error ; and error out
|
|
|
|
@allocOK
|
|
move.l @size(sp),d1 ; get the size of test
|
|
move.l d0,-(sp) ; put the memory pointer on the stack
|
|
move.l d1,-(sp) ; put the memory size on the stack
|
|
bsr GetCmdData ; and receive the test code
|
|
move.l (sp)+,d1 ; get the size back
|
|
movea.l (sp)+,a0 ; and the test code pointer
|
|
|
|
; Fill in the testInfo structure of the USTGlobals in anticipation of someday trying
|
|
; to execute this test as part of a DTM. Note that I'm bypassing the normal way
|
|
; of doing this (which is to call SetupForExecutDTM) because I am working with
|
|
; downloaded Tests and Subtests, not ROM-based ones (the SetupForExecuteDTM routine
|
|
; only works with the ROM-based DTMs):
|
|
|
|
move.l a0,tInfoFunctionEntry(a5) ; the entry point
|
|
move.l @testID(sp), tInfoID(a5) ; the test ID
|
|
move.l @TestUserInfo(sp),tInfoUserInfo(a5) ; the userInfo field
|
|
move.l @pbSize(a0),tInfoParamsSize(a5) ; the paramsSize field
|
|
move.l @rbSize(a0),tInfoResultsSize(a5) ; the resultsSize field
|
|
|
|
@error
|
|
move.l d0,d6 ; this is either the address of the downloaded
|
|
; test (as determined by GI_AllocPermMem) or
|
|
; -1, meaning that not enough memory was available
|
|
ENDWITH
|
|
rts
|
|
|
|
; End of UTEDownloadTest
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UTEDownloadSubtest
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine is used to handle downloading subtests from the host (usually another
|
|
; Mac running a communications program like MacTerminal, but it could be just any
|
|
; old black box). This glue routine receives the calling parameters for
|
|
; GI_InstallSubtest (just so it can get the size of the downloaded code and the
|
|
; subtest ID for later reference), allocates memory for the downloaded code,
|
|
; receives the downloaded code, then adds the subtest info (ID and entry point - as
|
|
; determined by this routine) to a RAM-based table that will be used to execute DTMs
|
|
; when requested by the host. DTM execution will be requested by asking for the
|
|
; test and subtest IDs.
|
|
;
|
|
; NOTE: Like many of the CTE-related routines that support the Serial Test Manager,
|
|
; some assumptions have to be made. One of those is that the user (host machine) has
|
|
; previously requested that memory tests be executed and determined that memory is
|
|
; OK. Once memory tests have been executed, the CTE world should be initialized.
|
|
; After that, any more memory testing will wipe out CTE so it will have to be started
|
|
; all over again.
|
|
;
|
|
; Inputs:
|
|
StackFrame7 RECORD 0, Increment ; starts at offset 0 into the stack
|
|
|
|
@return ds.l 1 ; return address
|
|
@globs ds.l 1 ; CTE Global pointer
|
|
@SubtestID ds.l 1 ; ID for downloaded subtest
|
|
@SubtestPtr ds.l 1 ; not included as input
|
|
@Size ds.l 1 ; size of subtest to download (in bytes)
|
|
@NamePtr ds.l 1 ; not used, should be zero
|
|
@SubtestUserInfo ds.l 1 ; the userInfo pointer field
|
|
@pbSize ds.l 1 ; parameter block size
|
|
@rbSize ds.l 1 ; result block size
|
|
|
|
ENDR
|
|
;
|
|
;----------------------------------------------------------------------
|
|
WITH StackFrame7, USTGlobals
|
|
movea.l @globs(sp),a0 ; get the CTE globals pointer
|
|
move.l @size(sp),d0 ; get the size of the subtest
|
|
|
|
CASE ON
|
|
GIM_AllocPermMem (a0), d0 ; allocate the necessary memory
|
|
CASE OFF
|
|
|
|
tst.l d0 ; is everything OK? (d0 = 0 means no memory available)
|
|
bne.s @allocOK ; Continue if OK
|
|
moveq.l #-1,d0 ; report problems with allocation
|
|
bra.s @error ; and error out
|
|
|
|
@allocOK
|
|
move.l @size(sp),d1 ; get the size of subtest
|
|
move.l d0,-(sp) ; put the memory pointer on the stack
|
|
move.l d1,-(sp) ; put the memory pointer on the stack
|
|
bsr GetCmdData ; and receive the subtest code
|
|
move.l (sp)+,d1 ; get the size back
|
|
movea.l (sp)+,a0 ; and the subtest code pointer
|
|
|
|
; Fill in the subtestInfo structure of the USTGlobals in anticipation of someday trying
|
|
; to execute this subtest as part of a DTM. Note that I'm bypassing the normal way
|
|
; of doing this (which is to call SetupForExecutDTM) because I am working with
|
|
; downloaded Tests and Subtests, not ROM-based ones (the SetupForExecuteDTM routine
|
|
; only works with the ROM-based DTMs):
|
|
|
|
;;;;; HAL HAL HAL AARON AARON WARNING WARNING
|
|
;;;;; NOTE Make sure to support the Standard Test Params thing if necessary.
|
|
|
|
|
|
move.l a0,sInfoFunctionEntry(a5) ; the entry point
|
|
move.l @SubtestID(sp), sInfoID(a5) ; the test ID
|
|
move.l @SubtestUserInfo(sp),sInfoUserInfo(a5) ; the userInfo field
|
|
move.l @pbSize(a0),sInfoParamsSize(a5) ; the paramsSize field
|
|
move.l @rbSize(a0),sInfoResultsSize(a5) ; the resultsSize field
|
|
|
|
ENDWITH
|
|
|
|
@error
|
|
|
|
;;;;; HAL HAL HAL AARON AARON WARNING WARNING
|
|
;;;;; NOTE Check to make sure what the returned address of the allocated perm mem is
|
|
; from GI_AllocPermMem (is it in d0 or a0)? Also, make sure that registers are
|
|
; used so that nothing is lost - the macros use a0, etc.
|
|
|
|
|
|
|
|
|
|
move.l d0,d6 ; this is either the address of the downloaded
|
|
; subtest (as determined by GI_AllocPermMem) or
|
|
; -1, meaning that not enough memory was available
|
|
rts
|
|
|
|
; End of UTEDownloadSubtest
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UTEDownloadExecutionOptions
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine is used to handle downloading an executionOptions structure for use by the
|
|
; ExecuteDTM routine. This is usually performed when the user is also downloading a
|
|
; test and subtest combo to be executed as a DTM. However, the user has the option of
|
|
; just asking the STM to make a GI_GetDefaultExecutionOptions call if there is nothing
|
|
; special needed. The downloaded structure is placed into the executionOptions section
|
|
; of the USTGlobals, which has been allocated from the stack (see the USTInit routine).
|
|
;
|
|
; Inputs: a5 must already be pointing to the USTGlobals
|
|
;
|
|
; Also, the stack needs to be setup as shown, with the size of the
|
|
; executionOptions structure to be downloaded. The reason for requiring the
|
|
; size parameter is that it helps insulate STM from CTE-specific knowledge,
|
|
; such as the size of data structures, etc. This is good because if anything
|
|
; changes about CTE, then the STM needs to know as little as possible. Since
|
|
; the user/host is working with CTE, it is not unreasonable to expect the user
|
|
; to have this information and supply it to the STM.
|
|
;
|
|
; While this is a noble cause (separation of STM and CTE), it has not been done
|
|
; consistently throughout the ROM yet. Please be patient. Remember that old
|
|
; phrase, "Reorg early and reorg often"...or was that "vote early and vote
|
|
; often"? Anyway, remember that old phrase.
|
|
;
|
|
StackFrame8 RECORD 0, Increment ; starts at offset 0 into the stack
|
|
|
|
@return ds.l 1 ; return address
|
|
@globs ds.l 1 ; CTE Global pointer (not used by this routine)
|
|
@Size ds.l 1 ; size of the executionOptions structure (in bytes)
|
|
|
|
ENDR
|
|
;
|
|
; Outputs: None. If the user gives a bogus address for the info or something else
|
|
; goes wrong, it's tough doo doo.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
WITH StackFrame8, USTGlobals
|
|
move.l @size(sp),d1 ; get the size of the structure
|
|
pea exOpUserInfo(a5) ; put the destination struct pointer on the stack <H8><SM4>
|
|
move.l d1,-(sp) ; put the size on the stack
|
|
bsr GetCmdData ; and receive the execution options structure
|
|
move.l (sp)+,d1 ; get the size back <H8><SM4>
|
|
move.l (sp)+,d0 ; and the pointer (to be reported to the user) <H8><SM4>
|
|
|
|
ENDWITH
|
|
rts
|
|
|
|
; End of UTEDownloadExecutionOptions
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
UTEDownloadExecutionResults
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine is used to handle downloading an executionResults structure for use by the
|
|
; ExecuteDTM routine. This is usually performed when the user is also downloading a
|
|
; test and subtest combo to be executed as a DTM. However, the user has the option of
|
|
; not specifying an execution results structure, in which case the stock exec. results
|
|
; structure that is allocated in the USTGlobals will be used (see the USTInit routine).
|
|
; The downloaded structure is placed into the executionResults section of the USTGlobals.
|
|
;
|
|
; Inputs: a5 must already be pointing to the USTGlobals
|
|
;
|
|
; Also, the stack needs to be setup as shown, with the size of the
|
|
; executionResults structure to be downloaded. The reason for requiring the
|
|
; size parameter is that it helps insulate STM from CTE-specific knowledge,
|
|
; such as the size of data structures, etc. This is good because if anything
|
|
; changes about CTE, then the STM needs to know as little as possible. Since
|
|
; the user/host is working with CTE, it is not unreasonable to expect the user
|
|
; to have this information and supply it to the STM.
|
|
;
|
|
StackFrame9 RECORD 0, Increment ; starts at offset 0 into the stack
|
|
|
|
@return ds.l 1 ; return address
|
|
@globs ds.l 1 ; CTE Global pointer (not used by this routine)
|
|
@Size ds.l 1 ; size of the executionOptions structure (in bytes)
|
|
|
|
ENDR
|
|
;
|
|
; Outputs: None. If the user gives a bogus address for the info or something else
|
|
; goes wrong, it's tough tomatoes.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
WITH StackFrame9, USTGlobals
|
|
move.l @size(sp),d1 ; get the size of the structure
|
|
pea exResErr(a5) ; put the destination struct pointer on the stack <H8><SM4>
|
|
move.l d1,-(sp) ; put the size on the stack
|
|
bsr GetCmdData ; and receive the execution results structure
|
|
move.l (sp)+,d1 ; get the size back <H8><SM4>
|
|
move.l (sp)+,d0 ; and the pointer (to be reported to the user) <H8><SM4>
|
|
|
|
ENDWITH
|
|
rts
|
|
|
|
; End of UTEDownloadExecutionResults
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UTEReturnTestInfo
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine returns all of the information available to this ROM about a ROM-based
|
|
; test. The caller passes a pointer to some memory, and it will be filled in with
|
|
; information in the following format:
|
|
;
|
|
; DS.L Test_ID ; ID for this test
|
|
; DS.L EntryPtr ; pointer to the entry point
|
|
; DS.L NamePtr ; pointer to the name of this test
|
|
; DS.L CodeSize ; size of the code (in bytes)
|
|
; DS.L ParamSize ; size of the parameter block
|
|
; DS.L ResultSize ; size of the results block
|
|
;
|
|
; Yes, filling in the test ID is probably redundant, but it saves the caller that much
|
|
; sweat...
|
|
;
|
|
; One possible use for this routine would be to get the address so that a breakpoint
|
|
; could be set on an emulator.
|
|
;
|
|
; Another use would be to get a pointer to the name, and download the name using that
|
|
; address (the name strings are in "pcString" format, i.e., they're pascal strings with
|
|
; terminating nulls).
|
|
;
|
|
; Inputs:
|
|
StackFrame10 RECORD 0, Increment ; starts at offset 0 into the stack
|
|
|
|
@savedReg ds.l 1 ; place to hold the saved value for the link <H8><SM4>
|
|
@return ds.l 1 ; return address is first
|
|
@CTEGlobs ds.l 1 ; CTE globals pointer is next
|
|
@testID ds.l 1 ; the ID of a ROM-based test
|
|
|
|
ENDR
|
|
;
|
|
; NOTE: We must leave a3 and d3 alone for the SendData call. <H11><SM4>
|
|
;----------------------------------------------------------------------
|
|
@savedRegs reg a0-a5/d1-d5
|
|
|
|
link a6,#0 ; create a stack frame pointer <H8><SM4>
|
|
movem.l @savedRegs,-(sp) ; save these during this operation
|
|
|
|
WITH StackFrame10, USTTest
|
|
|
|
move.l @testID(a6),d5 ; <H8><SM4>
|
|
|
|
; Search the USTTests list of all the ROM-based tests in this ROM (this routine
|
|
; will return the address of a Test even if it doesn't apply to this machine,
|
|
; just in case someone wants to try stepping through it for some reason). If it
|
|
; isn't found, then return -1:
|
|
|
|
movea.l @CTEGlobs,a0 ; save these for the UTEDumpRAM call
|
|
BigLea USTTests,a2 ; get the Test list address
|
|
move.l a2,d1 ; and save it for later
|
|
|
|
@searchLoop
|
|
cmp.l #-1,TTest_ID(a2) ; is this the end of the list?
|
|
beq.s @Error ; yup, so bail out
|
|
cmp.l TTest_ID(a2),d5 ; is this the test we want?
|
|
beq.s @foundTest ; yup, so start getting the info
|
|
adda.l #sizeofUSTTest,a2 ; nope, so keep looking
|
|
bra.s @searchLoop
|
|
|
|
@foundTest
|
|
|
|
; Since I know the test info is available at this point, I'll set up some space on
|
|
; the stack, fill it in, and setup for the UTEDumpRAM routine, which will send
|
|
; it across the serial port to the host:
|
|
|
|
link a5,#-sizeofUSTTest ; save this much space on the stack for myself
|
|
move.l sp,a1 ; the source address for the SendData call <H11><SM4>
|
|
|
|
move.l TTest_ID(a2),testIDSizeLoc(a5) ; fill in the testID <H11><SM4>
|
|
|
|
move.l TEntryPtr(a2),a4 ; get the relative entry point <H11><SM4>
|
|
add.l d1,a4 ; make it absolute <H11><SM4>
|
|
move.l a4,testAddrLoc(a5) ; and store it in its place <H11><SM4>
|
|
|
|
move.l TNamePtr(a2),a4 ; get the relative ptr to the name string <H11><SM4>
|
|
add.l d1,a4 ; make it absolute <H11><SM4>
|
|
move.l a4,namePtrLoc(a5) ; and store it in the stack <H11><SM4>
|
|
|
|
move.l TCodeSize(a2),codeSizeLoc(a5) ; fill in the code size <H11><SM4>
|
|
|
|
move.l TParamSize(a2),paramSizeLoc(a5) ; and the parameter block size <H11><SM4>
|
|
|
|
move.l TResultSize(a2),resultSizeLoc(a5) ; and finally, the result block size <H11><SM4>
|
|
|
|
; Now, prepare the stack for a call to SendData and do it:
|
|
|
|
movem.l a2/a6,-(sp) ; preserve this across the call <H8><H11><SM4>
|
|
move.l a1,-(sp) ; the start address of the data to transfer <H11><SM4>
|
|
move.l #sizeofUSTTest,-(sp) ; size of the transfer
|
|
bsr SendData ; transmit the data <H11><SM4>
|
|
lea 8(sp),sp ; pop the data off the stack <H11><SM4>
|
|
movem.l (sp)+,a2/a6 ; restore the USTTests pointer and stack frame ptr <H8><H11><SM4>
|
|
unlk a5 ; clean up the stack from the link
|
|
|
|
@End
|
|
moveq.l #0,d0 ; return zero (indicating success) or -1 <H11><SM4>
|
|
; (indicating that this test is not <H11><SM4>
|
|
; available on this machine)
|
|
|
|
@Error ; <H11><SM4>
|
|
movem.l (sp)+,@savedRegs ; restore them registers
|
|
unlk a6 ; clean it up and go home <H8><SM4>
|
|
|
|
ENDWITH
|
|
|
|
rts
|
|
|
|
; End of UTEReturnTestInfo
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UTEReturnSubtestInfo
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine returns all of the information available to this ROM about a ROM-based
|
|
; subtest. The caller passes a pointer to some memory, and it will be filled in with
|
|
; information in the following format:
|
|
;
|
|
; DS.L Subtest_ID ; ID for this subtest
|
|
; DS.L EntryPtr ; pointer to the entry point
|
|
; DS.L NamePtr ; pointer to the name of this subtest
|
|
; DS.L CodeSize ; size of the code
|
|
; DS.L ParamSize ; size of the parameter block
|
|
; DS.L ResultSize ; size of the results block
|
|
;
|
|
; Yes, filling in the subtest ID is probably redundant, but it saves the caller that much
|
|
; sweat...
|
|
;
|
|
; One possible use for this routine would be to get the address so that a breakpoint
|
|
; could be set on an emulator.
|
|
;
|
|
; Another use would be to get a pointer to the name, and download the name using that
|
|
; address (the name strings are in "pcString" format, i.e., they're pascal strings with
|
|
; terminating nulls).
|
|
;
|
|
; Inputs:
|
|
StackFrame11 RECORD 0, Increment ; starts at offset 0 into the stack
|
|
|
|
@savedReg ds.l 1 ; place to hold the saved value for the link <H8><SM4>
|
|
@return ds.l 1 ; return address is first
|
|
@CTEGlobs ds.l 1 ; CTE globals pointer is next
|
|
@subtestID ds.l 1 ; the ID of a ROM-based subtest
|
|
|
|
ENDR
|
|
;
|
|
; NOTE: We must leave a3 and d3 alone for the SendData call. <H11><SM4>
|
|
;----------------------------------------------------------------------
|
|
@savedRegs reg a0-a5/d1-d5
|
|
|
|
link a6,#0 ; create a stack frame pointer <H8><SM4>
|
|
movem.l @savedRegs,-(sp) ; save these during this operation
|
|
|
|
WITH StackFrame11, USTSubtest
|
|
|
|
move.l @subtestID(a6),d5 ; <H8><SM4>
|
|
|
|
; Search the USTTests list of all the ROM-based tests in this ROM (this routine
|
|
; will return the address of a Test even if it doesn't apply to this machine,
|
|
; just in case someone wants to try stepping through it for some reason). If it
|
|
; isn't found, then return -1:
|
|
|
|
movea.l @CTEGlobs(a6),a0 ; save these for the UTEDumpRAM call
|
|
BigLea USTSubtests,a2 ; get the Subtest list address
|
|
move.l a2,d1 ; and save it for later
|
|
|
|
@searchLoop
|
|
cmp.l #-1,STSubtest_ID(a2) ; is this the end of the list?
|
|
beq.s @Error ; yup, so bail out <H11><SM4>
|
|
cmp.l STSubtest_ID(a2),d5 ; is this the test we want?
|
|
beq.s @foundSubtest ; yup, so start getting the info
|
|
adda.l #sizeofUSTSubtest,a2 ; nope, so keep looking
|
|
bra.s @searchLoop
|
|
|
|
@foundSubtest
|
|
|
|
; Since I know the test info is available at this point, I'll set up some space on
|
|
; the stack, fill it in, and setup for the UTEDumpRAM routine, which will send
|
|
; it across the serial port to the host:
|
|
|
|
link a5,#-sizeofUSTSubtest ; save this much stack space for myself
|
|
move.l sp,a1 ; the source address for the SendData call <H11><SM4>
|
|
|
|
move.l STSubtest_ID(a2),testIDSizeLoc(a5) ; fill in the subtestID <H11><SM4>
|
|
|
|
move.l STEntryPtr(a2),a4 ; get the relative entry point <H11><SM4>
|
|
add.l d1,a4 ; make it absolute <H11><SM4>
|
|
move.l a4,testAddrLoc(a5) ; and store it in its place <H11><SM4>
|
|
|
|
move.l STNamePtr(a2),a4 ; get the relative ptr to the name string <H11><SM4>
|
|
add.l d1,a4 ; make it absolute <H11><SM4>
|
|
move.l a4,namePtrLoc(a5) ; and store it in the stack <H11><SM4>
|
|
|
|
move.l STCodeSize(a2),codeSizeLoc(a5) ; fill in the code size <H11><SM4>
|
|
|
|
move.l STParamSize(a2),paramSizeLoc(a5) ; and the parameter block size <H11><SM4>
|
|
|
|
move.l STResultSize(a2),resultSizeLoc(a5) ; and finally, the result block size <H11><SM4>
|
|
|
|
; Now, prepare the stack for a call to SendData and do it:
|
|
|
|
movem.l a2/a6,-(sp) ; preserve this across the call <H8><H11><SM4>
|
|
move.l a1,-(sp) ; the start address of the data to transfer <H11><SM4>
|
|
move.l #sizeofUSTSubtest,-(sp) ; size of the transfer
|
|
bsr SendData ; transmit the data <H11><SM4>
|
|
lea 8(sp),sp ; pop the data off the stack <H11><SM4>
|
|
movem.l (sp)+,a2/a6 ; restore the USTTests pointer and stack frame ptr <H8><H11><SM4>
|
|
unlk a5 ; clean up the stack from the link
|
|
|
|
@End
|
|
moveq.l #0,d0 ; return zero (indicating success) or -1 <H11><SM4>
|
|
; (indicating that this test is not <H11><SM4>
|
|
; available on this machine)
|
|
|
|
@Error ; <H11><SM4>
|
|
movem.l (sp)+,@savedRegs ; restore them registers
|
|
unlk a6 ; clean it up and go home <H8><SM4>
|
|
|
|
ENDWITH
|
|
|
|
rts
|
|
|
|
; End of UTEReturnSubtestInfo
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
GetCmdData
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine gets a certain number of characters from the serial port
|
|
; using the register based routine GetChar. Data is returned to a place in
|
|
; RAM pointed to by a0. The number of characters to get is in d0. If the ASKI bit
|
|
; in d7 is set, the data will be converted from ASCII to binary upon input.
|
|
;
|
|
; Inputs:
|
|
StackFrame12 RECORD 0, Increment ;Starts at offset 0 into the stack
|
|
|
|
@return ds.l 1 ;Return address
|
|
@byteCnt ds.l 1 ;byte count to receive
|
|
@outputPtr ds.l 1 ;place to put the received data
|
|
|
|
ENDR
|
|
;
|
|
; and the following registers:
|
|
;
|
|
; a3 - SCC read base addr
|
|
; d3 - SCC write offset from base
|
|
;
|
|
; Output:
|
|
; (a0) - holds the retrieved data
|
|
;
|
|
; Destroyed:
|
|
;
|
|
; Called by: bsr
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
WITH StackFrame12
|
|
|
|
move.l @byteCnt(sp),d1 ;get the byte count
|
|
btst.l #aski,d7 ;is this binary we're receiveing?
|
|
beq.s @binary ;branch if we're in binary mode
|
|
lsl.l #1,d1 ;else, adjust for ascii
|
|
@binary
|
|
movea.l @outputPtr(sp),a0 ;get the output buffer pointer
|
|
|
|
@nextChar
|
|
movem.l a0/a5/d1,-(sp) ;save our local copies
|
|
@wait
|
|
BSR6 GetChar ;see if there's a char waiting
|
|
tst.w d0 ;do we have one?
|
|
bmi.s @wait ;keep waiting if not
|
|
|
|
btst.l #echo,d7 ;are we supposed to be echoing?
|
|
beq.s @noEcho ;continue if not
|
|
move.l d0,d1 ;else, save d0
|
|
BSR6 OutChar ;and send out the char
|
|
move.l d1,d0 ;then restore the value
|
|
|
|
@noEcho
|
|
btst.l #aski,d7 ;binary or ascii?
|
|
beq.s @noConversion ;branch if already in binary
|
|
cmp.b #'a',d0 ;is this an upper case letter?
|
|
blt.s @notUpper ;branch if not
|
|
and.b #~('a'--'A'),d0 ;else, fold this to upper case
|
|
@notUpper
|
|
BSR6 CvtAscii ;and convert it to binary
|
|
movem.l (sp)+,a0/a5/d1 ;restore our regs
|
|
btst.l #0,d1 ;is this an even nibble or odd?
|
|
bne.s @odd ;branch if odd
|
|
lsl.b #4,d0 ;else, move it to the high nibble
|
|
move.b d0,(a0) ;and store it in RAM for latter
|
|
bra.s @Continue ;then continue
|
|
@odd
|
|
or.b d0,(a0)+ ;OK, or in the low nibble and increment
|
|
bra.s @Continue ;then continue
|
|
|
|
@noConversion
|
|
movem.l (sp)+,a0/a5/d1 ;restore our regs
|
|
move.b d0,(a0)+ ;store the next byte into the receiving area
|
|
@Continue
|
|
subq.l #1,d1 ;decrement the count
|
|
bgt.s @nextChar ;and continue if necessary
|
|
|
|
ENDWITH
|
|
rts
|
|
|
|
SendData
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This routine sends numeric data to the serial port using the register
|
|
; based routine OutChar. This routine takes a pointer to data and sends it,
|
|
; byte for byte to the serial port. If the ASCII mode option is selected, this
|
|
; routine first translates the data into ASCII before sending it.
|
|
;
|
|
; Inputs:
|
|
StackFrame13 RECORD 0, Increment ;Starts at offset 0 into the stack
|
|
|
|
@return ds.l 1 ;Return address
|
|
@byteCnt ds.l 1 ;byte count to send
|
|
@outputPtr ds.l 1 ;pointer to data to send
|
|
|
|
ENDR
|
|
;
|
|
; and the following registers:
|
|
;
|
|
; a3 - SCC read base addr
|
|
; d3 - SCC write offset from base
|
|
;
|
|
; Output:
|
|
;
|
|
; Destroyed:
|
|
; a0, d0, d1, d2
|
|
;
|
|
; Called by: bsr
|
|
;
|
|
;----------------------------------------------------------------------
|
|
WITH StackFrame13
|
|
|
|
bsr @crlf ;start out with a <CR><LF>
|
|
|
|
move.l @byteCnt(sp),d1 ;get the byte count
|
|
move.l d1,d4 ;save it for later
|
|
movea.l @outputPtr(sp),a0 ;and the output buffer pointer
|
|
|
|
@nextChar
|
|
move.b (a0)+,d0 ;get the next byte to send
|
|
btst.l #aski,d7 ;is this ascii mode?
|
|
beq.s @notASCII ;branch if not
|
|
move.b d0,d2 ;save it for later
|
|
lsr.b #4,d0 ;get the upper nibble
|
|
bsr @CvtBin ;convert to an ASCII char
|
|
BSR6 OutChar ;send it out
|
|
move.b d2,d0 ;get the next nibble
|
|
and.b #$0F,d0 ;mask out the nibble of interest
|
|
bsr @CvtBin ;convert it to ASCII
|
|
|
|
@notASCII
|
|
BSR6 OutChar ;send character out
|
|
cmp.l #4,d4 ;are we reading less than a long word?
|
|
ble.s @notBoundary ;continue if so
|
|
|
|
move.l a0,d0 ;let's look at this address
|
|
and.b #3,d0 ;are we at a long word boundary?
|
|
bne.s @notBoundary ;continue if not
|
|
bsr @crlf ;else, send a <CR><LF>
|
|
|
|
@notBoundary
|
|
subq.l #1,d1 ;subtract one from the count
|
|
bgt.s @nextChar ;and continue if more to go
|
|
|
|
ENDWITH
|
|
moveq.l #0,d0 ;clear return status
|
|
rts
|
|
|
|
@CvtBin
|
|
cmp.b #$0A,d0 ;is this going to be a letter or number?
|
|
blt.s @number ;branch if number
|
|
add.b #('A'-$A),d0 ;else, convert to a letter
|
|
bra.s @rtn ;and return
|
|
|
|
@number
|
|
add.b #'0',d0 ;convert to an ASCII number
|
|
@rtn
|
|
rts ;and return
|
|
|
|
@crlf
|
|
move.b #cr,d0 ;send a crlf
|
|
BSR6 OutChar
|
|
move.b #lf,d0
|
|
BSR6 OutChar
|
|
rts
|
|
|
|
; End of SendData
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
; From here to the next <T6> below was added from USTTestMgr.a.
|
|
;The original code has been modified so that it leverages off of the CTE tables I
|
|
;added to the serial test manager, all the support code for which is located in this
|
|
;file, hence the move. Scott Smyers
|
|
;-----------------------------------------------------------------------------
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; This entry point is called as a subroutine from the diagnostic ROMs. It is safe to <H4><SM4>
|
|
; assume that there are at least 256 bytes of valid memory (established by the board <H4><H7><SM4>
|
|
; tester before coming here), so using stack-based activities is OK. <H4><SM4>
|
|
;
|
|
; For all commands but the initialization request and the critical memory tests, the <H4><SM4>
|
|
; value in a5 must be preserved between calls. <H4><SM4>
|
|
;
|
|
; For the Horror ROM, there are basically six things that can be done by this <H4><SM4>
|
|
; routine: <H4><SM4>
|
|
; - init the interface
|
|
; - execute any of the CTE Generic Interface calls
|
|
; - execute a DTM
|
|
; (this ability is provided as a convenience to the board tester
|
|
; because it will not have access to the required information
|
|
; to make the GI_ExecuteDTM call for ROM-based DTMS - this is
|
|
; by design)
|
|
; - read PRAM
|
|
; - write PRAM
|
|
; - execute a critical test (these are NOT DTMs, but stand alone tests)
|
|
;
|
|
; IMPORTANT NOTE: In order to maintain the connection with the board testers across
|
|
; the memory tests (which wipe out everything), the board testers will save their
|
|
; critical information in PRAM before requesting a critical test. After executing
|
|
; a critical test, I need to restore their information from PRAM. They will save
|
|
; their info in the following format:
|
|
;
|
|
; D0 - D5, D7
|
|
; A0 - A2, A4 - A7
|
|
;
|
|
; These registers will have been stored in PRAM in the following locations:
|
|
;
|
|
; $10 - $48
|
|
;
|
|
; Therefore, I need to restore them appropriately. However, since reading from PRAM
|
|
; uses a lot of registers, I will use the first chunk of RAM and read the bytes
|
|
; from PRAM ($10 - $48) into RAM. Then, I will stuff the values in RAM into the
|
|
; appropriate registers, and jump back to the board tester.
|
|
;
|
|
; --- New comments added from this <H7> to the one below: ---
|
|
;
|
|
; There is a special case where I need to store a couple of values into PRAM myself.
|
|
; When the IHT is requesting initialization (D7 = 0), I will end up wiping out the
|
|
; stack and registers. The IHT will need to store its data as it would if it were
|
|
; requesting a critical test (in the format above), but I will pull the return
|
|
; address off the stack when I get control and stuff it into PRAM where A6 is stored
|
|
; by the IHT. In addition, after doing the USTInit routine and before restoring
|
|
; the registers, I will store the new value of A5 (my USTGlobals pointer) into
|
|
; PRAM where the IHT would store A5. Finally, I need to store the new A7 (after USTInit)
|
|
; in PRAM where it would be. That way, when I go to the routine that restores
|
|
; the registers, A5, A6 and A7 will be set appropriately.
|
|
;
|
|
; --- New comments added from this <H7> to the one above. ---
|
|
;
|
|
; For all commands except the initialization request, the stack must be set up by
|
|
; the caller (board tester). This is done by invoking one of the board tester-specific
|
|
; macros in the file IHTROMHook.i. These macros take care of preparing the stack
|
|
; and setting D7 to the correct selector value.
|
|
;
|
|
;
|
|
; Input:
|
|
; d7.l $00000000 - initialize the interface and CTE (must be first call)
|
|
;
|
|
; $0000yyyy - execute a utility call where yyyy is the following:
|
|
; 0001 - DiagExecuteDTM - the test & subtest IDs are on the stack
|
|
; 0002 - Read PRAM
|
|
; 0003 - Write PRAM
|
|
;
|
|
; $0001yyyy - execute any Generic Interface call where yyyy is the following:
|
|
; 0000 - GI_InitInterface
|
|
; 0001 - GI_GetVersion
|
|
; 0002 - GI_AllocPermMem
|
|
; 0003 - GI_AllocTempMem
|
|
; 0004 - GI_FreeTempMem
|
|
; 0005 - GI_GetCommentary
|
|
; 0006 - GI_GetDefaultExecutionOptions
|
|
; 0007 - GI_ExecuteDTM
|
|
;
|
|
; $0002yyyy - execute a critical test where yyyy is the following:
|
|
; 0000 - SizeMemory
|
|
; 0001 - DataBusTest
|
|
; 0002 - Mod3Test
|
|
; 0003 - Address Line
|
|
; 0004 - ROM Byte Lane Checksum
|
|
; 0005 - RevMod3Test
|
|
; 0006 - ExtRAMTest
|
|
;
|
|
; Output:
|
|
; d6.l The DTM error code returned from the requested operation or from the
|
|
; ExecuteDTM routine (depending on what was done).
|
|
;
|
|
; a3.l The address of this entry point for the IHT to use to get back here.
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
diagROMentry
|
|
|
|
IHTCritCodeBase equ $20000 ; base number for IHT critical routines <H7><SM4>
|
|
A5PRAMLocation equ $3c ; where A5 will be stored in PRAM <H7><SM4>
|
|
A6PRAMLocation equ $40 ; where A6 will be stored in PRAM <H7><SM4>
|
|
A7PRAMLocation equ $44 ; where A7 will be stored in PRAM
|
|
NumPRAMBytes equ $38 ; this is how many bytes the IHT will save <H7><SM4>
|
|
; in PRAM, and how many I should restore <H7><SM4>
|
|
RAMDestination equ $10 ; PRAM will be read into this location of RAM <H7><SM4>
|
|
PRAMSource equ $10 ; the IHT will store data in PRAM here <H7><SM4>
|
|
|
|
|
|
; Check first to see if this is an initialization request (d7 = 0):
|
|
|
|
tst.l d7 ; see what's requested
|
|
bne.w @notInit ; branch if this is not an init request <H7><SM4>
|
|
|
|
WITH USTGlobals
|
|
|
|
; Save the return address in PRAM where the IHT would have saved A6 for a critical test: <H7><SM4>
|
|
|
|
moveq.l #0,d2 ; <H7><SM4>
|
|
BigBSR6 JGetHardwareInfo,a0 ; get hardware info about this machine <H7><SM4>
|
|
movea.l DecoderInfo.VIA1Addr(a0),a2 ; then get the VIA1 pointer <H7><SM4>
|
|
|
|
move.l sp,a6 ; retrieve the return address to the board tester <H7><SM4>
|
|
move.w #A6PRAMLocation,a3 ; get the destination PRAM address <H7><SM4>
|
|
move.w #4,a5 ; number of bytes to write (decimal) <H7><SM4>
|
|
|
|
_CopyRAMToPRAM (a6), a3, a5 ; write the return address to PRAM <H7><SM4>
|
|
|
|
nop ; this is used to separate the macro above <H7><SM4>
|
|
; from the one below, for the assembler <H7><SM4>
|
|
|
|
; Do the real initialization stuff: <H7><SM4>
|
|
|
|
moveq #0,D2 ; Tell USTInit to call SizeMem <SM5>
|
|
BigBSR6 USTInit,a0 ; Initialize the universal environment <H7><SM4>
|
|
|
|
move.w #RunBits.STM,RunMode(a5) ; set the run mode for serial test manager <H7><SM4>
|
|
suba.l #SizeOfCTEGlobals,sp ; allocate our CTE global area on the stack <H7><SM4>
|
|
move.l sp,CTEGlobals(a5) ; save the global area pointer <H7><SM4>
|
|
movea.l CTEGlobals(a5),a0 ; get the globs pointer <H7><SM4>
|
|
|
|
CASE ON
|
|
GIM_InitInterface (a0),#SIZEOFCTEGLOBALS ;init the CTE interface <T7>
|
|
CASE OFF
|
|
|
|
|
|
; Now save the resulting A5 and A7 values into PRAM before jumping to the @CritExit routine <H7><SM4>
|
|
; I know this is ugly, but I have to do two separate write requests because A5 and A7 are <H7><SM4>
|
|
; not contiguous in PRAM. <H7><SM4>
|
|
|
|
move.l a5,-(sp) ; put A5 into RAM for CopyRAMToPRAM <H7><SM4>
|
|
moveq.l #0,d2 ; <H7><SM4>
|
|
BigBSR6 JGetHardwareInfo,a0 ; get hardware info about this machine <H7><SM4>
|
|
movea.l DecoderInfo.VIA1Addr(a0),a2 ; then get the VIA1 pointer <H7><SM4>
|
|
move.l sp,a6 ; get the RAM source address <H7><SM4>
|
|
move.w #A5PRAMLocation,a3 ; get the PRAM destination address <H7><SM4>
|
|
move.w #4,a5 ; the number of bytes to write <H7><SM4>
|
|
_CopyRAMToPRAM (a6), a3, a5 ; write the USTGlobals address to PRAM <H7><SM4>
|
|
lea 4(sp),sp ; clean up the stack <H7><SM4>
|
|
|
|
move.l sp,-(sp) ; put A7 into RAM for CopyRAMToPRAM <H7><SM4>
|
|
moveq.l #0,d2 ; <H7><SM4>
|
|
BigBSR6 JGetHardwareInfo,a0 ; get hardware info about this machine <H7><SM4>
|
|
movea.l DecoderInfo.VIA1Addr(a0),a2 ; then get the VIA1 pointer <H7><SM4>
|
|
move.l sp,a6 ; get the RAM source address <H7><SM4>
|
|
move.w #A7PRAMLocation,a3 ; get the PRAM destination address <H7><SM4>
|
|
move.w #4,a5 ; the number of bytes to write <H7><SM4>
|
|
_CopyRAMToPRAM (a6), a3, a5 ; write the new sp address to PRAM <H7><SM4>
|
|
lea 4(sp),sp ; clean up the stack <H7><SM4>
|
|
|
|
ENDWITH
|
|
|
|
bra.l @CritExit ; return to the board tester <H7><SM4>
|
|
|
|
; From here to the <H4> below was modified to support access to the critical tests in
|
|
; ROM by the IHT.
|
|
;_______________________________________________________________
|
|
@notInit
|
|
|
|
; It's not an init request, so check to see if it's a critical test request:
|
|
|
|
movea.l sp,a4 ; preserve the return address to board testers
|
|
; (none of the critical tests modify a4)
|
|
move.l d7,d4 ; get a copy of the operation request
|
|
and.l #$000F0000,d4 ; mask out the "code type" value
|
|
cmp.l #IHTCritCodeBase,d4 ; see if it's a $xxx2xxxx function (critical test)
|
|
bne.l @OtherRequest ; nope, so it's probably a GI_xxx or Utility request
|
|
|
|
; OK, do the critical test as required. Since I'm responsible for doing the setup
|
|
; before testing memory (sizing, determining which bank(s) to test, etc.), I need
|
|
; to retain some amount of control in between test cycles. Since I want to use the
|
|
; TJump table, I'll have to do a little work in some circumstances (specifically,
|
|
; for the RAM tests - MOD3, RevMOD3, ExtRAMTest). So, the first thing I need to do
|
|
; is jump to the appropriate setup routine, based on the operation requested (Mod3,
|
|
; SizeMemory, etc.). Note that some of the tests (ROM checksum, Address Line Test)
|
|
; don't require any setup:
|
|
|
|
move.l d7,d4 ; get a copy of the operation request
|
|
and.l #$000000FF,d4 ; isolate the test number, prepare for setup entry
|
|
lea @DiagCritSetup,a5 ; get the critical test setup table
|
|
lsl.w #2,d4 ; adjust the offset
|
|
move.l (a5,d4.w),d4 ; get the jump table entry
|
|
jmp (a5,d4.w) ; and dispatch to proper point
|
|
|
|
nop ; these are here in case the proper point happens
|
|
nop ; to be the entry point below (@theSizeMemTest)
|
|
nop
|
|
nop
|
|
|
|
|
|
;_______________________________________________________________
|
|
;
|
|
;---- Do the SizeMem test:
|
|
;
|
|
@theSizeMemTest
|
|
BigBSR6 SizeMemory,a0 ; do the test
|
|
bra.l @critExit ; now restore the IHT (error result is in d6)
|
|
; and return to it
|
|
|
|
;_______________________________________________________________
|
|
;
|
|
;---- Do the ExtRAMTest, Mod3Test or the RevMod3Test - NOTE: it is best to test memory one
|
|
; bank at a time with these tests, so that's how I'll be doing it. Since I need to
|
|
; retain control to test each memory bank, I will set the return address back to me
|
|
; until all banks have been tested. After the test, or if any errors occur during a
|
|
; test, I will return to the diagnostic ROM with the results.
|
|
;
|
|
@theRAMTests
|
|
|
|
moveq.l #0,d0 ; this is the index into the memory chunk table
|
|
|
|
; For each bank of memory, do a SizeMem to get the range of addresses for the tests,
|
|
; then test that bank. Keep looping until all banks have been tested:
|
|
|
|
lsl.w #8,d7 ; save the test number in the high byte of the
|
|
; low word of d7
|
|
move.b d0,d7 ; preserve d0 across SizeMemory - d7 is the only
|
|
; register that remains unmolested by SizeMemory
|
|
@testAChunkOMemory ; branch back to here on subsequent loops, with the test
|
|
; number and d0 still preserved from making the call
|
|
; to the requested test <6><Apollo>
|
|
BigBSR6 SizeMemory,a0 ; on return, (sp) points to memory table
|
|
tst.l d6 ; check for an error
|
|
bne.l @critExit ; error, exit to board testers
|
|
movea.l (sp),a2 ; otherwise, get pointer to memory table
|
|
|
|
; Now, test the next bank of memory with the selected test:
|
|
|
|
move.l #0,d0 ; restore d0 after the SizeMemory call <6><Apollo>
|
|
move.b d7,d0 ; restore my running memory table index <6><Apollo>
|
|
lsr.w #8,d7 ; get access to the test number <6><Apollo>
|
|
movea.l (a2,d0.w),a0 ; get address of the next chunk in the memory table
|
|
cmpa.l #$FFFFFFFF,a0 ; check it for the termination value
|
|
beq.l @critExit ; end of the Mod3Tests if end of memory table
|
|
|
|
movea.l (a2,d0.w),a1 ; otherwise, prepare to get terminating address for test
|
|
add.w #4,d0 ; get the length of the next chunk in the table
|
|
adda.l (a2,d0.w),a1 ; add chunk length to the address, to get end of chunk
|
|
lea TJump,a5 ; point to test jump table
|
|
adda.l (a5,d7.w * 4),a5 ; point to test
|
|
lsl.w #8,d7 ; save the test number in the high byte of the <6><Apollo>
|
|
; low word of d7
|
|
move.b d0,d7 ; preserve d0 across the RAM tests - d7.lw is the only <6><Apollo>
|
|
; data register that remains untouched by the
|
|
; mod3 tests IF AND ONLY IF d7.hw = 0, because of
|
|
; code that was added for parity but not documented.
|
|
|
|
lea @1, a6 ; setup return address <SM4>
|
|
jmp (a5) ; execute requested test <6><Apollo><SM4>
|
|
@1 ; <SM4>
|
|
|
|
tst.l d6 ; see if there is an error returned <6><Apollo>
|
|
bne.l @critExit ; quit the test if so <6><Apollo>
|
|
addq.b #4,d7 ; increment the mem table index to point to the <6><Apollo>
|
|
; next chunk o' memory <6><Apollo>
|
|
bra.s @testAChunkOMemory ; and go test it
|
|
|
|
|
|
;_______________________________________________________________
|
|
;
|
|
;---- Do the Data Bus Test:
|
|
;
|
|
@theDataBusTest
|
|
|
|
; Start by doing a SizeMem to get the range of addresses for the Data Bus Test:
|
|
|
|
BigBSR6 SizeMemory,a0 ; on return, (sp) points to memory table
|
|
tst.l d6 ; check for an error
|
|
bne @critExit ; error, exit to board testers
|
|
movea.l (sp),a0 ; otherwise, get pointer to memory table
|
|
; for the Data Bus Test
|
|
|
|
; Now do the DataBus test:
|
|
If Not forRomulator Then
|
|
BigBSR6 DataBusTest,a1 ; do the test and return here (d6 will be set)
|
|
Endif
|
|
bra.l @critExit ; done with this critical test, so restore the
|
|
; state of the IHT and go back to it
|
|
|
|
|
|
;_______________________________________________________________
|
|
;
|
|
;---- Do the Address Line or ROM Checksum Tests. These don't require any setup, but
|
|
; I am using the TJump table to gain access, based on the selector in d7:
|
|
;
|
|
@theOtherTests
|
|
|
|
; Start by doing a SizeMem to get the range of addresses for the Address Line Test <H12><SM4>
|
|
; in case that happens to be the one we're going to execute: <H12><SM4>
|
|
|
|
BigBSR6 SizeMemory,a0 ; on return, (sp) points to memory table <H12><SM4>
|
|
tst.l d6 ; check for an error <H12><SM4>
|
|
bne @critExit ; error, exit to board testers <H12><SM4>
|
|
movea.l (sp),a0 ; otherwise, get pointer to memory table <H12><SM4>
|
|
; for the Data Bus Test <H12><SM4>
|
|
|
|
lea @critExit,a6 ; the return address after the test is done
|
|
lea TJump,a5 ; point to test jump table
|
|
and.l #$000000FF,d7 ; isolate the test number
|
|
adda.l (a5,d7.w * 4),a5 ; point to test
|
|
jmp (a5) ; execute requested test - return address to
|
|
; @critExit is in a6
|
|
|
|
|
|
;_______________________________________________________________
|
|
;
|
|
;---- At this point, a critical test has been completed (it may have failed). The
|
|
; result register (d6) will be set by the time control is passed here, so all
|
|
; I need to do is restore the IHT registers from PRAM. The way I do this is to
|
|
; read the PRAM data into the first few bytes of memory (I know that these bytes
|
|
; are OK because the IHT tests them before even coming here for the first time;
|
|
; if I'm here now, then I can assume that those bytes of memory are OK). After
|
|
; reading the bytes into RAM, I just copy them into the various registers and
|
|
; jump back to the board tester. The reason for doing this is that reading and
|
|
; writing PRAM uses up registers, so I need to read everything then write the
|
|
; final "real" values into the registers before going back. Note that registers
|
|
; d6 (test result) and a3 (IHT hook address - diagROMEntry) are not preserved
|
|
; in PRAM; they are set by the hook before going back to the IHT:
|
|
;
|
|
@critExit
|
|
|
|
; Read the PRAM data into RAM starting at RAM address $10 (and PRAM address $10):
|
|
|
|
moveq.l #0,d2 ; <H7><SM4>
|
|
BigBSR6 JGetHardwareInfo,a0 ; get hardware info about this machine
|
|
movea.l DecoderInfo.VIA1Addr(a0),a2 ; then get the VIA1 pointer
|
|
movea.l #RAMDestination,a3 ; get the destination RAM address <H7><SM4>
|
|
move.w #PRAMSource,a4 ; beginning address of PRAM to use <H7><SM4>
|
|
move.w #NumPRAMBytes,a5 ; number of bytes to read <H7><SM4>
|
|
|
|
_CopyPRAMToRAM a4, (a3), a5 ; go read PRAM
|
|
|
|
; Now it's time to load the registers with the required data. The only register I
|
|
; have left to work with is a3 (all of the others are going to hold the restored
|
|
; data), so I need to be clever in how I do this:
|
|
|
|
movea.l #RAMDestination,a3 ; the RAM destination is the source now <H7><SM4>
|
|
movem.l (a3),d0-d5/d7/a0-a2/a4-a7 ; copy the data into the registers in
|
|
; one fell swoop
|
|
|
|
; Finally, restore a3 (the return address to this IHT hook, diagROMEntry), and jump
|
|
; back to the IHT. Remember that d6 is already set, and a6 will be loaded with the
|
|
; IHT entry point because the IHT saved a6 in PRAM before coming here:
|
|
|
|
lea diagROMentry,a3 ; in case the IHT wants to come back later <H7><SM4>
|
|
jmp (a6) ; return to the diagnostic ROM
|
|
;_______________________________________________________________
|
|
|
|
|
|
;_______________________________________________________________
|
|
@OtherRequest
|
|
|
|
; It's not an init request and it's not a critical test request, so check to see
|
|
; if it's a GI_xxx or IHT Utility request:
|
|
|
|
move.l d7,d0 ; get selected function code in d0
|
|
lea @DiagROMUtil,a0 ; assume utility function
|
|
and.l #$000F0000,d7 ; mask out the "code type" value
|
|
cmp.l #GICodeBase,d7 ; is this a GI call? (d7 = $xxx1xxxx)
|
|
bne.s @Branch ; continue if not (it's a utility call)
|
|
|
|
; At this point we're going to ASSUME it's a GI_xxx call:
|
|
|
|
lea GI_Table,a0 ; else, get the base address of the GI table
|
|
sub.l #GICodeBase,d0 ; and adjust the base of the cmd #
|
|
|
|
@Branch
|
|
WITH USTGlobals
|
|
|
|
move.l (sp)+,CmdNumber(a5) ; save our return address in a secret location
|
|
move.l CTEGlobals(a5),-(sp); common to all
|
|
|
|
lsl.l #2,d0 ; adjust the offset
|
|
move.l (a0,d0.l),d0 ; get the jump table entry
|
|
jsr (a0,d0.l) ; and dispatch to proper point
|
|
addq.l #4,sp ; pop off the CTE globs
|
|
move.l d0,d6 ; put the result into the usual result register
|
|
movea.l CmdNumber(a5),a0 ; get the return address
|
|
lea diagROMentry,a3 ; get the diag ROM entry point again <T7>
|
|
jmp (a0) ; and return to caller
|
|
|
|
ENDWITH
|
|
|
|
; End of diagROMentry
|
|
;
|
|
; From here to the <H4> above was modified to support access to the critical tests in
|
|
; ROM by the IHT.
|
|
;-----------------------------------------------------------------------------
|
|
;-----------------------------------------------------------------------------
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This table (DiagCritSetup) holds relative entry points to critical test setup
|
|
; routines. The reason for these is that for some of them I need to setup prior
|
|
; to running them (i.e., size memory and do the Mod3 test for each bank of memory,
|
|
; etc.). Also, I need to retain control after the test is done so I can restore the
|
|
; state of the board tester and get back to it. So, for the various kinds of critical
|
|
; tests available, these are the routines that take care of the setup and dispatch.
|
|
;
|
|
@DiagCritSetup ; <H4><SM4>
|
|
dc.l @theSizeMemTest -@DiagCritSetup ; 0 - SizeMemory <H4><SM4>
|
|
dc.l @theDataBusTest -@DiagCritSetup ; 1 - DataBusTest <H4><SM4>
|
|
dc.l @theRAMTests -@DiagCritSetup ; 2 - Mod3Test <H4><SM4>
|
|
dc.l @theOtherTests -@DiagCritSetup ; 3 - Address Line <H4><SM4>
|
|
dc.l @theOtherTests -@DiagCritSetup ; 4 - ROM Byte Lane Checksum <H4><SM4>
|
|
dc.l @theRAMTests -@DiagCritSetup ; 5 - RevMod3Test <H4><SM4>
|
|
dc.l @theRAMTests -@DiagCritSetup ; 6 - ExtRAMTest <H4><SM4>
|
|
|
|
@DiagCritSetupSize equ (*-@DiagCritSetup)>>2 ; number of entries <H4><SM4>
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; This table (DiagROMUtil) holds relative entry points to utility functions used by the
|
|
; In House Tester hook (IHT - also known as the board testers or diagnostic ROM), to
|
|
; facilitate IHT-specific operations, which include all of the operations described
|
|
; in the diagROMEntry description except the execution of the Generic Interface
|
|
; routines. Those routines are accessed from the GI_Table. Note that the IHT environment
|
|
; shares one routine with the STM environment, which is DiagExecuteDTM. This routine
|
|
; takes a test and subtest ID as input, and executes the ROM-based DTM.
|
|
;
|
|
@DiagROMUtil
|
|
dc.l @DiagROMUtil -@DiagROMUtil ; null entry <T7>
|
|
dc.l DiagExecuteDTM -@DiagROMUtil ; execute a DTM
|
|
dc.l DiagReadPRAM -@DiagROMUtil ; read PRAM
|
|
dc.l DiagWritePRAM -@DiagROMUtil ; write PRAM
|
|
|
|
@DiagUtilSize equ (*-@DiagROMUtil)>>2 ;number of jump table entries
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
DiagExecuteDTM
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
;
|
|
; This routine executes a DTM, based on the Test ID and the Subtest ID provided on the
|
|
; stack by the caller. Note that a5 must already be initialized to point to the
|
|
; USTGlobals before this entry point can be called.
|
|
;
|
|
; The input is the following call stack:
|
|
|
|
StackFrame14 RECORD 0, Increment ; start at offset 0 into the stack
|
|
|
|
@savedReg ds.l 1 ; place to hold the saved value for the link
|
|
@return ds.l 1 ; return address is first
|
|
@CTEGlobs ds.l 1 ; CTE globals pointer is next
|
|
|
|
; The following information must be placed on the stack by the code in the Diagnostic
|
|
; ROM (board testers):
|
|
|
|
@subTestID ds.l 1 ; ROM-based subtest ID
|
|
@testID ds.l 1 ; ROM-based test ID
|
|
|
|
ENDR
|
|
;
|
|
;----------------------------------------------------------------------------
|
|
|
|
WITH StackFrame14, USTGlobals
|
|
link a6,#0 ; save the stack frame pointer
|
|
|
|
; Since I can use a BSR6 to RAM-lessly jump to a common subroutine that will find
|
|
; and execute a DTM combination, the only thing I need to do here is pick the
|
|
; test and subtest IDs off of the stack and stuff them into a couple of unused
|
|
; registers for the subroutine to use. When it's done, it can RTS6 back to this
|
|
; point:
|
|
|
|
move.l @subTestID(a6),d4
|
|
move.l @testID(a6),d5
|
|
move.l a6,-(sp) ; save my a6 because the BSR6 uses it
|
|
bsr6 SetupForExecuteDTM ; do a RAM-less bsr to the routine that takes
|
|
; care of setting up for the execution of a DTM
|
|
move.l (sp),a6 ; restore A6 for parameter access later (leave stack as is) <H7><SM4>
|
|
|
|
; Check for errors in setting up for the ExecuteDTM and don't try to execute the DTM
|
|
; if any were found:
|
|
|
|
cmp.l #-1,tInfoFunctionEntry(a5) ; -1 in this field means test not found
|
|
beq.s @LogError
|
|
cmp.l #-1,sInfoFunctionEntry(a5) ; -1 in this field means subtest not found
|
|
beq.s @LogError
|
|
|
|
move.l @CTEGlobs(a6),a3 ; we need this for GIM_ExecuteDTM
|
|
|
|
CASE ON
|
|
GIM_ExecuteDTM (a3), EXOPUSERINFO(a5), TINFOUSERINFO(a5), SINFOUSERINFO(a5), EXRESERR(a5)
|
|
CASE OFF
|
|
|
|
bra.s @End
|
|
ENDWITH
|
|
|
|
@LogError
|
|
move.l #-1,d6 ; return -1 indicating that either the test
|
|
; or subtest doesn't apply to this machine
|
|
|
|
@End
|
|
movea.l (sp)+,a6 ; restore the stack frame pointer <H7><SM4>
|
|
move.l d6,d0 ; The normal way of returning the results of a non-critical
|
|
; test (ROM-based subtest in CTE lingo) is through d6.
|
|
; However, the diagROMEntry routine expects all of the other
|
|
; utility routines (write PRAM, etc.) to return the error
|
|
; in d0, which it then moves to d6 before returning to the
|
|
; board tester. So, we put d6 into d0 here, and the
|
|
; diagROMEntry routine will unwittingly move it back to d6.
|
|
unlk a6 ; clean up the stack
|
|
rts ; return to caller
|
|
|
|
; End of DiagExecuteDTM
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
DiagReadPRAM
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
;
|
|
; This routine reads parameter RAM into an area of RAM. Note that a5 must already
|
|
; be initialized before this entry point can be called (this will be the case as long
|
|
; as the initialization request has already been done).
|
|
;
|
|
; The input is the following call stack:
|
|
|
|
StackFrame15 RECORD 0, Increment ; start at offset 0 into the stack
|
|
|
|
@savedReg ds.l 1 ; place to hold the saved value for the link
|
|
@return ds.l 1 ; return address is first
|
|
@CTEGlobs ds.l 1 ; CTE globals pointer is next (not used here)
|
|
|
|
; The following information must be placed on the stack by the code in the Diagnostic
|
|
; ROM:
|
|
|
|
@numBytes ds.w 1 ; number of bytes to read from PRAM
|
|
@destRAMAddr ds.l 1 ; destination RAM address
|
|
@startPRAMAddr ds.w 1 ; starting PRAM address to read from
|
|
|
|
ENDR
|
|
;
|
|
;----------------------------------------------------------------------------
|
|
|
|
WITH StackFrame15, USTGlobals
|
|
link a6,#0 ; save the stack frame pointer
|
|
|
|
movea.l DcdrInfPtr(a5),a0 ; get the pointer to the decoder info
|
|
movea.l PrdctInfPtr(a5),a1 ; and the product info
|
|
movea.l DecoderInfo.VIA1Addr(a0),a2 ; then get the VIA1 pointer
|
|
movea.l @destRAMAddr(a6),a3 ; get the destination RAM address
|
|
|
|
movem.l a6,-(sp) ; save our local stack frame pointer
|
|
_CopyPRAMToRAM @startPRAMAddr(a6), (a3), @numBytes(a6) ; go read PRAM
|
|
movem.l (sp)+,a6 ; restore our local pointer
|
|
|
|
unlk a6 ; clean up
|
|
ENDWITH
|
|
rts ; and return to caller
|
|
|
|
; End of DiagReadPRAM
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
DiagWritePRAM
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
;
|
|
; This routine writes parameter RAM from an area of RAM. Note that a5 must already
|
|
; be initialized before this entry point can be called.
|
|
;
|
|
; The input is the following call stack:
|
|
|
|
StackFrame16 RECORD 0, Increment ; start at offset 0 into the stack
|
|
|
|
@savedReg ds.l 1 ; place to hold the saved value for the link
|
|
@return ds.l 1 ; return address is first
|
|
@CTEGlobs ds.l 1 ; CTE globals pointer is next (not used here)
|
|
|
|
; The following information must be placed on the stack by the code in the Diagnostic
|
|
; ROM:
|
|
|
|
@numBytes ds.w 1 ; number of bytes to write to PRAM
|
|
@startPRAMAddr ds.w 1 ; starting PRAM address to write to
|
|
@sourceRAMAddr ds.l 1 ; source RAM address
|
|
|
|
ENDR
|
|
;
|
|
; NOTE: The BSR6 to ClkWpOff was changed to a BigBSR6 because this file was taken
|
|
; out of USTStartTest.a and put into USTStartTest1.a, and the branch became too
|
|
; far for a BSR6. HAL 2/12/92
|
|
;----------------------------------------------------------------------------
|
|
|
|
WITH StackFrame16, USTGlobals
|
|
link a6,#0 ; save the stack frame pointer
|
|
|
|
movea.l DcdrInfPtr(a5),a0 ; get the pointer to the decoder info
|
|
movea.l PrdctInfPtr(a5),a1 ; and the product info
|
|
movea.l DecoderInfo.VIA1Addr(a0),a2 ; then get the VIA1 pointer
|
|
|
|
movem.l a5/a6,-(sp) ; save some regs
|
|
BigBSR6 ClkWpOff,a5 ; turn off the write protect bit
|
|
movem.l (sp)+,a5/a6 ; restore regs
|
|
|
|
movea.l @sourceRAMAddr(a6),a3 ; get the source RAM address
|
|
|
|
movem.l a6,-(sp) ; save our local stack frame pointer
|
|
_CopyRAMToPRAM (a3), @startPRAMAddr(a6), @numBytes(a6) ; go write PRAM
|
|
movem.l (sp)+,a6 ; restore our local pointer
|
|
|
|
unlk a6 ; clean up
|
|
ENDWITH
|
|
rts
|
|
|
|
; End of DiagWritePRAM
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
|
|
|
|
SetupForExecuteDTM
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
; Well, here it is. This is that fabled routine that actually does the hard
|
|
; work of setting up the parameters expected by GI_ExecuteDTM (TestInfo, SubtestInfo,
|
|
; ExecutionOptions and ExecutionResults structures). This routine is used by all
|
|
; of the ROM-based diagnostics environments in order to allow the user (whether
|
|
; that user is the ROM Burnin chamber or the Board Tester or whatever) to set up for
|
|
; the GI_ExecuteDTM routine without knowing anything about the various test/subtest
|
|
; tables utilized by the ROM.
|
|
;
|
|
; Currently, this routine fills in the minimum information necessary in the
|
|
; following structures: executionOptions, testInfo and subtestInfo. There is no need
|
|
; to fill in the executionResults structure.
|
|
;
|
|
; Additionally, it fills in the info for a StdTestParams structure (which consists
|
|
; of the modifier and machineType fields), which is pointed to by the testParams
|
|
; field of the executionOptions structure. So, after filling in the standard test
|
|
; params structure, its address is placed in the testParams field of the executionOptions
|
|
; structure that is also created here. The data for the standard test params fields
|
|
; is included in the tests list in the file USTSubtests.a. As CTE-style tests are
|
|
; added to this file, it is the responsibility of the person adding them to make
|
|
; sure that all values are kept up to date. One way of doing this might be to export
|
|
; references to these values from the appropriate CTE test interface files, and include
|
|
; them in the USTSubtests.a file. That way, as things are changed in the CTE interfaces,
|
|
; they are automatically updated in the assembly file. Just a thought.
|
|
;
|
|
;
|
|
; Input: d4.l subtest ID
|
|
; d5.l test ID
|
|
; a5.l points to the UST Globals (and the ROM-CTE globals which
|
|
; exist immediately after the UST globals)
|
|
; a6.l return address (called by BSR6)
|
|
;
|
|
;
|
|
; Output: The ExecuteDTM parameters (on the stack, at the top of the USTGlobals)
|
|
; will be filled out, ready for the macro call GIM_ExecuteDTM to push
|
|
; the appropriate addresses on the stack and make the call. The macro
|
|
; can be called repeatedly in a loop if necessary, and the error code
|
|
; returned can be checked. The input parameters don't have to be filled
|
|
; in again until a new DTM is needed.
|
|
;
|
|
;
|
|
; Register
|
|
; Usage: a0,a1,a3,d1,d3 - no guarantees on being the same when leaving.
|
|
; Specifically, the following happens:
|
|
;
|
|
; a0,a1 - used mercilessly, then tossed aside like some old shoes
|
|
;
|
|
; d1,d2,d3 - they suffer the same fate as a0 and a1
|
|
;----------------------------------------------------------------------------
|
|
|
|
WITH USTTest, USTSubtest, USTGlobals, CPUTestList
|
|
|
|
|
|
; Do the necessary setup for calling GIM_ExecuteDTM. This is new for CTE v2.1 and later,
|
|
; and differs from Terror in that the structures for testInfo and subtestInfo,
|
|
; executionOptions and executionResults, must be initialized (they are parameters to
|
|
; the ExecuteDTM call). The old way was just to get the test and subtest IDs from the
|
|
; RBIInfo structure and call ExecuteTest.
|
|
|
|
; Fill in the testInfo structure required as an input to ExecuteDTM. Using the testID
|
|
; that was passed to me in d5, I can look through the cpu specific test list and verify
|
|
; that this test is valid for this machine in this environment (STM, IHT, etc.). Also,
|
|
; I can search the USTTests list and determine the param size, result size and entry
|
|
; point for the TEST:
|
|
|
|
BigLea USTTests,a0 ; get the test list address (NOT cpu DTM list)
|
|
move.l a0,d1 ; save it in another register
|
|
move.l d5,d3 ; save the test ID for the search loop
|
|
|
|
; Begin by walking thru the Test list and determine that this test exists in this ROM: <H4><SM4>
|
|
|
|
@TestSearchLoop
|
|
cmp.l TTest_ID(a0),d3 ; is this our test?
|
|
beq.s @FoundTest ; branch if so
|
|
adda.w #sizeofUSTTest,a0 ; else, go to the next entry
|
|
cmp.l #-1,TTest_ID(a0) ; are we at the end?
|
|
bne.s @TestSearchLoop ; continue if not
|
|
bra.s @LogTestError ; we didn't find the requested test so bail
|
|
|
|
; OK, it exists. Now, determine if it's OK to run it in this "environment", i.e., startup, <H4><SM4>
|
|
; restart, STM, etc. This information can be derived from the CPU-specific test list: <H4><SM4>
|
|
|
|
@FoundTest
|
|
movea.l GlobCPUTestList(a5),a1 ; get the CPU specific test list
|
|
|
|
@FlagSearchLoop ; <H4><H5><SM4>
|
|
cmp.w TLSubTest_ID(a1),d4 ; check the current entry against the requested subtest ID <H4><SM4>
|
|
beq.s @CheckFlags ; OK, we've found the correct entry, so verify the run flags <H4><H5><SM4>
|
|
cmp.w #-1,TLSubTest_ID(a1) ; have we exhausted the list? <H4><SM4>
|
|
beq.s @LogTestError ; yes, so just indicate "does not apply" <H4><SM4>
|
|
adda.l #sizeofCPUTestList,a1 ; index to next DTM entry in CPU-specific list <H4><SM4>
|
|
bra.s @FlagSearchLoop ; go back and keep checking <H4><H5><SM4>
|
|
|
|
@CheckFlags ; <H4><H5><SM4>
|
|
move.w TLrunflags(a1),d2 ; get the runmode flag
|
|
and.w RunMode(a5),d2 ; is this test OK for this environment?
|
|
bne.s @FillInTest ; continue if so
|
|
|
|
; If we're here, then either the test wasn't found or it doesn't apply to our current <H4><SM4>
|
|
; environment. Either way, move -1 into the result register and skip town: <H4><SM4>
|
|
|
|
@LogTestError
|
|
move.l #-1,tInfoFunctionEntry(a5) ; fill in the entry point field of the testInfo
|
|
; struct with -1, indicating that this
|
|
bra.l @End ; test does not apply to this environment
|
|
; (either because it wasn't found or the
|
|
; run mode flags say so)
|
|
|
|
; At this point we've determined that the test does exist AND that it's OK to run it <H4><SM4>
|
|
; right now. So, fill in the info structure for it. Also, since it's OK to run this test <H4><SM4>
|
|
; at this time, it's also OK to run the subtest, so no need to check on that (just fill <H4><SM4>
|
|
; in the subtest info): <H4><SM4>
|
|
|
|
@FillInTest
|
|
movea.l TEntryPtr(a0),a1 ; get the entry point
|
|
adda.l d1,a1 ; make the entry point absolute
|
|
move.l a1,tInfoFunctionEntry(a5) ; fill in the entry point field of the testInfo struct
|
|
move.l d5, tInfoID(a5) ; do the same for the test ID
|
|
move.l #0,tInfoUserInfo(a5) ; the rest of the default values for the testInfo
|
|
move.l TParamSize(a0),tInfoParamsSize(a5) ; structure may or may not be
|
|
move.l TResultSize(a0),tInfoResultsSize(a5) ; NIL, depending on the Test
|
|
|
|
; Fill in the subtestInfo structure required as an input to ExecuteDTM. Using the subTestID
|
|
; that was passed to me in d4, I can search the USTSubTests list and find the entry
|
|
; point for the SUBTEST. In addition, I can find the param size and result size
|
|
; values from the USTSubtests table:
|
|
|
|
BigLea USTSubtests,a0 ; get the subtest list
|
|
move.l a0,d1 ; save it in another register
|
|
move.l d4,d3 ; save the subtest ID for the search loop
|
|
|
|
@SubtestSearchLoop
|
|
cmp.l STSubtest_ID(a0),d3 ; is this our subtest?
|
|
beq.s @FoundSubtest ; branch if so
|
|
adda.w #sizeofUSTSubtest,a0 ; else, go to the next entry
|
|
|
|
|
|
|
|
cmp.l #-1,STSubtest_ID(a0) ; are we at the end?
|
|
bne.s @SubtestSearchLoop ; continue if not
|
|
move.l #-1,sInfoFunctionEntry(a5) ; fill in the entry point field of the subtestInfo
|
|
; struct with -1, indicating that there
|
|
bra.s @End ; is something wrong - we didn't find the
|
|
; requested subtest
|
|
@FoundSubtest
|
|
movea.l STEntryPtr(a0),a1 ; get the entry point
|
|
adda.l d1,a1 ; make the entry point absolute
|
|
move.l a1,sInfoFunctionEntry(a5) ; fill in the entry point field of the subtestInfo struct
|
|
move.l d4, sInfoID(a5) ; do the same for the subtest ID
|
|
move.l #0,sInfoUserInfo(a5) ; the rest of the default values for the subtestInfo
|
|
move.l STParamSize(a0),sInfoParamsSize(a5) ; structure may or may not be
|
|
move.l STResultSize(a0),sInfoResultsSize(a5) ; NIL, depending on the Subtest
|
|
|
|
|
|
; If we've made it this far, then all the test/subtest info was found and verified for the
|
|
; current environment. So, create the standard test params and execution options. Also,
|
|
; set the userInfo field of the executionOptions to point to the USTGlobals and the
|
|
; testParams field to point to the standard test params structure. The reason for setting
|
|
; the userInfo field to point to the USTGlobals is that the ROM-based non-critical
|
|
; tests (the non-CTE ones) all expect the following input register values:
|
|
;
|
|
; a0 - ptr to table of hardware base addresses (DecoderInfo ptr)
|
|
; a1 - ProductInfo ptr
|
|
; d0 - bit mask indicating which base addresses are valid (bases valid flags)
|
|
; d2 - boxflag/decoder type
|
|
;
|
|
; The ROM-based CTE-style Test (which is coupled with the non-CTE ROM-based non-
|
|
; critical subtests to form DTMs) takes care of setting up the a0, a1, d0 and d2
|
|
; registers before jumping into one of those subtests. The other ROM-based CTE style
|
|
; DTMs may or may not use the userInfo pointer, based upon their personal preferences.
|
|
;
|
|
;
|
|
; Here's the StdTestParams:
|
|
|
|
; move.l
|
|
|
|
|
|
|
|
; Here's the executionOptions:
|
|
|
|
move.l a5,exOpUserInfo(a5) ; this puts the USTGlobals pointer into the userInfo
|
|
move.l #4,exOpProcessorType(a5)
|
|
move.l #0,exOpExecutionMode(a5)
|
|
move.l #0,exOpTestParams(a5)
|
|
move.l #0,exOpTestResultsOverride(a5)
|
|
move.l #0,exOpSubtestParamsOverride(a5)
|
|
move.l #0,exOpSubtestResultsOverride(a5)
|
|
move.l #0,exOpIdleMethod(a5)
|
|
move.l #0,exOpIdleMethodArg(a5)
|
|
|
|
@End
|
|
|
|
ENDWITH
|
|
|
|
RTS6 ; go back to the caller
|
|
|
|
; End of SetupForExecuteDTM
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
|
|
;<T6>
|
|
ENDPROC
|