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.
397 lines
17 KiB
Plaintext
397 lines
17 KiB
Plaintext
;
|
|
; File: USTPostProc.a
|
|
;
|
|
; Contains: This file includes the error handling routines and the ram testing routine called
|
|
; by StartInit.
|
|
;
|
|
;
|
|
; Copyright: © 1983-1990, 1992 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM3> 11/18/92 fau Modified the Error1-4Handlers to check whether they are running
|
|
; on a YMCADecoder-based machine (A Cyclone). If so, then we will
|
|
; call the correct "death chimes" for Cyclone, using the DSP and
|
|
; not the non-existent ASC.
|
|
; <SM2> 5/1/92 kc Roll in Horror. Comments Follow:
|
|
; <H3> 3/6/92 AL Made a couple of branches and BSR6 branches to long branches
|
|
; because they reference routines in the file USTTestMgr.a, which
|
|
; was moved into USTStartTest1.a after the PROC parts were
|
|
; conditionalized (the UST files outgrew their space, so a couple
|
|
; of them had to be moved elsewhere).
|
|
; <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.
|
|
; ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; <T3> 12/14/90 HJR Changed how non critical tests are reported in PRAM.
|
|
; <T2> 9/17/90 CCH Modified a cache flush routine to b e 68040-friendly.
|
|
; ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; Pre-Terror ROM comments begin here.
|
|
; ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; <6> 5/18/90 CV Rolling in changes from mainproj. Original comments below.
|
|
; {7} 5/7/90 SS Removed IMPORT of TMVectors because it wasn't used in here
|
|
; anyway.
|
|
; {6} 4/26/90 SS At Error1Handler, set up the stack first thing because if we got
|
|
; there from a failure of SizeMemory, a7 will not be set to
|
|
; anything meaningful.
|
|
; <5> 4/2/90 CV Rolling in changes from mainproj. Original comments below.
|
|
; {5} 3/27/90 SS In the non-critical test error handler I no longer clear the
|
|
; error register (d6) upon exit. I need that result later if I'm
|
|
; in test, so I can't clear it.
|
|
; <4> 3/2/90 CV Replacing file with file from mainproj.
|
|
; {4} 2/27/90 SS Changed the error handler so that if you're in test mode (with
|
|
; burn-in jumper installed) it checks for diagnostic ROMs and
|
|
; returns to them if present. If there are no diagnostic ROMs,
|
|
; operation is the same as before.
|
|
; {3} 2/16/90 SS Added flags to statements which were changed to support Ericson.
|
|
; {2} 2/12/90 MA Writes to PRAM used to use D5 as index into PRAM. Now uses D4.
|
|
; D5 would be destroyed by quasi-power manager or EGRET.
|
|
; <1.7> 11/22/89 rle needed for ZoneV: fix parameters for StartTimer within
|
|
; <1.6> 11/13/89 rle fixed bug in error1handler to enable instruction burst mode
|
|
; <1.5> 11/12/89 CCH Fixed comment in version 1.4 (: instead of a ;)
|
|
; <1.4> 11/11/89 rle needed for ZoneV: corrected bugs inadvertantly introduced when
|
|
; <1.3> 8/22/89 GMR Made Error1Handler jmp directly to test manager, instead of
|
|
; falling
|
|
; <1.2> 6/13/89 GGD Modified to work with latest version of Beep.a, leave cache on,
|
|
; pass
|
|
; <1.1> 6/11/89 GMR Removed INCLUDES, now in header file which includes all others.
|
|
; <1.0> 6/11/89 GMR Added new universal StartTest files for first time to EASE.
|
|
; <1.9> 5/26/89 rle cleaned up file (removed obsolete code); doRAMTest no longer
|
|
; exists
|
|
; <1.8> 5/16/89 rle turn off cache when calling error beeps; don't need RAMTest
|
|
; anymore!
|
|
; <1.7> 4/28/89 rle save/restore register d7 upon calls to error beep within
|
|
; error2handler
|
|
; <1.6> 4/11/89 rle clear results register upon exit from NCErrorHandler
|
|
; <1.5> 3/28/89 rle updated RAMTest for use on all MMU-based machines, in keeping
|
|
; with the new, consistent memory test model
|
|
; <1.4> 2/14/89 RLE test results register when control returned from mod3test for
|
|
; MMU machines
|
|
; <1.3> 2/10/89 RLE update equates to support minimal f-19 build
|
|
; <1.2> 2/6/89 RLE replaced NuMac conditionals with more generic identifiers
|
|
; <1.1> 2/2/89 RLE STPostProc.a is now an independent file, responsible for
|
|
; importting and exportting the procedures it needs and others
|
|
; need; fixed a lot of conditional statements to make them more
|
|
; generic and less CPU-specific; changed NCErrorHandler to log d6
|
|
; and d7 to parameter ram, implementation depending upon the CPU
|
|
; in question; fixed NCErrorHandler to turn off clock chip write
|
|
; protect; changed doRAMTest to handle MMU systems--StartInit
|
|
; still passes in physical addresses and we just turn the MMU off
|
|
; temporarily
|
|
; <1.0> 1/11/89 RLE derived from version 1.4 of StartTest.a modified version history
|
|
; markers for all old versions to start with "[" instead of
|
|
; "<"--this allows changes in STPostProc to be tracked separately
|
|
; changed NCErrorHandler to indicate an error by setting LSB in
|
|
; byte 0 of test parameter ram ($70 on Harpo); d6 and d7 are
|
|
; logged by NCErrorHandler to the bottom eight bytes of test
|
|
; parameter ram ($78 on Harpo) in the event of an error
|
|
;
|
|
; To Do:
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
PostProc PROC ; <v1.1>
|
|
|
|
WITH DecoderInfo
|
|
|
|
INCLUDE 'UniversalEqu.a' ; <7> rb
|
|
|
|
EXPORT goTM
|
|
EXPORT Error1Handler
|
|
EXPORT Error2Handler
|
|
EXPORT Error3Handler
|
|
EXPORT Error4Handler
|
|
EXPORT NCErrorHandler
|
|
|
|
IMPORT ErrorBeep1
|
|
IMPORT ErrorBeep2
|
|
IMPORT ErrorBeep3
|
|
IMPORT CritErr
|
|
IMPORT RdXByte
|
|
IMPORT WrXByte
|
|
IMPORT TMEntry1
|
|
IMPORT StartTimer
|
|
IMPORT CycloneBeep ; <SM3> fau
|
|
|
|
IMPORT QuasiPwrMgr
|
|
IMPORT Mod3Test
|
|
IMPORT JGetHardwareInfo ; [C43>
|
|
|
|
IMPORT ClkWpOff ; <v1.1>
|
|
|
|
|
|
;-----------**If here, then in board burn in or Service**-------------------
|
|
|
|
; We in board burn in (or board tester) because of loopback on VIA SV0-SV1, and/or failure.
|
|
; If no failure, set d6 to reflect good power on tests.
|
|
|
|
goTM tst.w d7 ;was any error during tests? [C660>
|
|
bne.s @710 ;yes, d6 has minor code [C660>
|
|
|
|
move.l #$87654321,d6 ;no, set good result code
|
|
|
|
@710
|
|
; bra Error1Handler ;vector through error handler <v1.9>
|
|
|
|
;---------------------------------------------------------------------------
|
|
; Entry to Error1Handler indicates a fatal error on StartTest1 tests. We
|
|
; must assume the screen wasn't cleared or anything. We don't even know
|
|
; where the video card is, so for now lets not do any error display. Leave
|
|
; the screen garbaged.....
|
|
;
|
|
; Entry to Error2Handler indicates a fatal error on StartTest2 tests. The
|
|
; screen should be cleared and the low memory screen globals should be ok.
|
|
; This means we can display some error data on the screen, then continue
|
|
; on to the Test Manager and wait for possible further instructions via
|
|
; the serial port. CritError routine will verify that the video is inited
|
|
; with the "VideoMagic" global.
|
|
;
|
|
; On entry, d6 = minor fail code or failed bit mask for RAM failures.
|
|
; d7.lw = major fail code as per equates and exceptions above.
|
|
; d7.hw = current flag bits, perhaps of minor interest.
|
|
;
|
|
; Registers d7 and d6 are displayed on the screen as follows:
|
|
;
|
|
;
|
|
; Sad "Mac"
|
|
; Icon
|
|
;
|
|
; XXXXXXXX X = D7 contents
|
|
; YYYYYYYY Y = D6 contents
|
|
;
|
|
; We must also check the flag bits in d7 to make sure we aren't in board
|
|
; burn in or service.
|
|
;
|
|
; ErrorBeep1 is called for any error that comes through Error1Handler. That
|
|
; includes the early failures, low RAM, ROM, or an NMI hit while testing.
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
WITH ProductInfo, DecoderInfo, DecoderKinds ; <SM??> fau
|
|
Error1Handler ;first check if we are running on a board tester (burn-in flag set and diag ROM response)
|
|
move.l #aStack,a7 ;set stack pointer value <6>
|
|
moveq #0,d2 ; <4>
|
|
BSR6 JGetHardwareInfo ;Get info on this machine (This sets up A1 - among other things -- to point to product info)
|
|
|
|
btst #test,d7 ;burn-in flag set? <4>
|
|
bne.s @OnTester ;yes,we're on a tester so perform the diagRom check<4>
|
|
|
|
; If not in test, we want to make a squawk here, so set up regs for Error Beep. <4>
|
|
|
|
cmp.b #YMCADecoder,DecoderKind(a1) ; Do we have a YMCA (can't test for DSP 'cause we have no memory and it's in the ; <SM3> fau
|
|
bne.s @DoASC ; no, assume it's an ASC <SM3> fau
|
|
movea.l #1,a1 ; Tell CycloneBeep to play sound #1 <SM3> fau
|
|
BigBSR6 CycloneBeep,a0 ; And go play it... <SM3> fau
|
|
bra.l TMEntry1 ; then go to Test Manager <4>
|
|
@DoASC
|
|
movea.l ASCAddr(a0),a3 ;setup ASC address for BootBeep6 <4>
|
|
movea.l VIA1Addr(a0),a5 ;setup VIA1 address for Beep <1.2><4>
|
|
BigBSR6 ErrorBeep1,a0 ;the first of several squawks... <4>
|
|
bra.l TMEntry1 ;then go to Test Manager <4>
|
|
|
|
@OnTester ; <4>
|
|
btst.l #DiagROMExists,d0 ;do we support a diagnostic rom? <9><4>
|
|
beq.s @noDiagRom ;no, continue <4>
|
|
lea @noDiagRom,a6 ;yes, load up return address <4>
|
|
bset #beok,d7 ;then tell the handler its ok <4>
|
|
move.l DiagROMAddr(a0),a1 ;get start of diagnostic ROM <4>
|
|
movem.l (a1)+,d0/a0 ;getting the vector....bus error to @noDiagRom <4>
|
|
cmpi.l #TROMCode,d0 ;didn't bus error, see if codes match <4>
|
|
bne.s @noDiagRom ;don't match,we're not on a tester continue <4>
|
|
lea @noDiagRom,a1 ;in case we're returning via A1... <4>
|
|
jmp (a0) ;jump into diagnostic rom <4>
|
|
@noDiagRom ; <4>
|
|
bclr #beok,d7 ;clear the BusError is OK flag <4>
|
|
|
|
;removed conditionals for HcMac (laguna) since laguna is not meant to run this code [v1.2>
|
|
;i.e. the error1handler for laguna and 68000 based macs is in reality error2handler [v1.2>
|
|
|
|
|
|
; Now if we got here and we are testing (VIA looped) then lets queue
|
|
; up the boot message for the host.
|
|
|
|
bset #MsgQ,d7 ;queue up the message
|
|
bset #timer,d7 ;use timer for message timing
|
|
|
|
; The VIA 1 timer must be started up with extended count in d4.hw
|
|
|
|
move.w #sec,d4 ;set extended timer count
|
|
BigBSR6 StartTimer,a0 ;start timer <v1.4>
|
|
|
|
; Flush and enable the appropriate I-Cache
|
|
|
|
movec CACR,d0 ; retrieve current CACR <T2>|
|
|
bset #15,d0 ; set 040 "enable I-Cache" bit to see if we're on an 040 V
|
|
movec d0,CACR ; set the bit to see if it sticks
|
|
movec CACR,d0 ;
|
|
btst #15,d0 ; are we on an 040?
|
|
beq.s @notAn040 ; IF we're on an 040 THEN
|
|
MACHINE MC68040 ; perform 040 cache flush, I-cache is already enabled
|
|
cinva ic ; invalidate (flush) the instruction cache
|
|
bra.s @go ; continue
|
|
MACHINE MC68030 ;
|
|
@notAn040 ; ELSE
|
|
movec CACR,d0 ; examine cache control register
|
|
bset #3,d0 ; flush instruction cache
|
|
movec d0,CACR ; execute flush
|
|
movec CACR,d0 ; read new cache control register
|
|
ori.b #$11,d0 ; enable i-cache and burst mode
|
|
movec d0,CACR ; do it
|
|
@go ; ENDIF <T2>
|
|
|
|
bra.l TMEntry1 ;then go to Test Manager
|
|
|
|
|
|
;-----------------
|
|
; Handle an error that occurred after the video was initialized, unless
|
|
; we happen to be in service, then just continue to Test Manager.
|
|
|
|
Error2Handler
|
|
|
|
moveq #0,d2
|
|
BSR6 JGetHardwareInfo ;Get info on this machine (This sets up A1 - among other things -- to point to product info)
|
|
movea.l ASCAddr(a0),a3 ;setup ASC address for BootBeep6
|
|
movea.l VIA1Addr(a0),a2 ;setup VIA1 address for quasi call <1.2>
|
|
|
|
btst #test,d7 ;in service? [C202>
|
|
bne.s @10 ;yes, go to Test Manager [C202>
|
|
|
|
cmp.b #YMCADecoder,DecoderKind(a1) ; Do we have a YMCA (can't test for DSP 'cause we have no memory and it's in the <SM3> fau
|
|
bne.s @DoASC ; no, assume it's an ASC <SM3> fau
|
|
movea.l #2,a1 ; Tell CycloneBeep to play sound #1 <SM3> fau
|
|
BigBSR6 CycloneBeep,a0 ; And go play it... <SM3> fau
|
|
BigJmp CritErr,a0 ;display the error data if possible,
|
|
|
|
@DoASC
|
|
movea.l a2,a5 ;get VIA1 base in a5 now
|
|
BigBSR6 ErrorBeep1,a0 ;the first of several squawks...
|
|
|
|
BigJmp CritErr,a0 ;display the error data if possible,
|
|
;CritErr will return to Test Manager
|
|
|
|
@10
|
|
@20 bra.l TMEntry1 ;go to Test Manager
|
|
|
|
;-----------------
|
|
; An error occurred during RAMTest call, beep appropriately and display error
|
|
|
|
Error3Handler
|
|
|
|
moveq #0,d2
|
|
BSR6 JGetHardwareInfo ;Get info on this machine (This sets up A1 - among other things -- to point to product info)
|
|
movea.l ASCAddr(a0),a3 ;setup ASC address for BootBeep6
|
|
movea.l VIA1Addr(a0),a5 ;setup VIA1 address for Beep <1.2>
|
|
|
|
cmp.b #YMCADecoder,DecoderKind(a1) ; Do we have a YMCA (can't test for DSP 'cause we have no memory and it's in the <SM3> fau
|
|
bne.s @DoASC ; no, assume it's an ASC <SM3> fau
|
|
movea.l #3,a1 ; Tell CycloneBeep to play sound #1 <SM3> fau
|
|
BigBSR6 CycloneBeep,a0 ; And go play it... <SM3> fau
|
|
BigJmp CritErr,a0 ; display the error data if possible,
|
|
|
|
@DoASC
|
|
BigBSR6 ErrorBeep2,a0 ;the second of several squawks...
|
|
BigJmp CritErr,a0 ;display the error data if possible,
|
|
;CritErr will return to Test Manager
|
|
|
|
Error4Handler
|
|
moveq #0,d2
|
|
BSR6 JGetHardwareInfo ;Get info on this machine (This sets up A1 - among other things -- to point to product info)
|
|
movea.l ASCAddr(a0),a3 ;setup ASC address for BootBeep6
|
|
movea.l VIA1Addr(a0),a5 ;setup VIA1 address for Beep <1.2>
|
|
|
|
cmp.b #YMCADecoder,DecoderKind(a1) ; Do we have a YMCA (can't test for DSP 'cause we have no memory and it's in the <SM3> fau
|
|
bne.s @DoASC ; no, assume it's an ASC <SM3> fau
|
|
movea.l #4,a1 ; Tell CycloneBeep to play sound #1 <SM3> fau
|
|
BigBSR6 CycloneBeep,a0 ; And go play it... <SM3> fau
|
|
BigJmp CritErr,a0 ; display the error data if possible,
|
|
|
|
@DoASC
|
|
BigBSR6 ErrorBeep3,a0 ;the third of several squawks...
|
|
BigJmp CritErr,a0 ;display the error data if possible,
|
|
;CritErr will return to Test Manager
|
|
|
|
ENDWITH
|
|
|
|
;--------------------------------------- [v1.5>
|
|
; Entry to NCErrorHandler indicates that a non-critical error has occurred [v1.5>
|
|
; sometime while running a "nonessential" subsystem like the SCC or Sound [v1.5>
|
|
; results are logged to the last 8 bytes of parameter ram as follows: <v1.0>
|
|
; byte 120 (240) - d6.uub <v1.1>
|
|
; 121 (241) - d6.mub <v1.1>
|
|
; 122 (242) - d6.mlb <v1.1>
|
|
; 123 (243) - d6.llb <v1.1>
|
|
; 124 (---) - d7.uub <v1.1>
|
|
; 125 (---) - d7.mub <v1.1>
|
|
; 126 (250) - d7.mlb <v1.1>
|
|
; 127 (251) - d7.llb <v1.1>
|
|
; <v1.1>
|
|
; In addition, the flag byte (112 for PowerMgr systems, 249 for 030 systems) <v1.1>
|
|
; has its lsbit set to indicate that parameter ram contains non-critical error <v1.1>
|
|
; information. <v1.1>
|
|
;
|
|
|
|
NCErrorHandler ; <v1.5>
|
|
cmpi.l #-1,d6 ;is this a fail/no-log? <v1.5>
|
|
beq.w @finish ;yes, return immediately
|
|
move.l DecoderInfo.VIA1Addr(a0),a2 ;else, get VIA1 base address
|
|
|
|
@log
|
|
; <v1.1>
|
|
|
|
BSR6 ClkWpOff ;turn off write protect to clock chip <v1.1>
|
|
|
|
move.w #NCFailFlag,d1 ;read flag byte <v1.1>
|
|
BSR6 RdXbyte ;read parameter ram <v1.1>
|
|
bset.l #0,d1 ;set lsb of flag to indicate non-crit data <v1.1>
|
|
bne.s @not1st ;if this is not the first error, continue
|
|
|
|
move.b d1,d2 ;move new flag into data byte <v1.1>
|
|
move.w #NCFailFlag,d1 ;get address byte to send <v1.1>
|
|
BSR6 WrXByte ;write parameter ram <v1.1>
|
|
|
|
move.l #(NCFailHist<<16 | NCHistBytes-1),d4 ;prepare to zero history
|
|
|
|
@zero swap d4 ;get the PRAM address
|
|
move.w d4,d1 ;put it in the proper register
|
|
addq.w #1,d4 ;go to next location
|
|
moveq.l #0,d2 ;value to write (zero)
|
|
BSR6 WrXByte ;go write it
|
|
swap d4 ;see if we're done
|
|
dbra.w d4,@zero ;continue until done
|
|
|
|
@not1st
|
|
move.l #((NCFailHist+NCHistBytes)<<16 | NCHistBytes-2),d4 ;prepare to roll history
|
|
|
|
@roll swap d4 ;get source address
|
|
subq.w #2,d4 ;adjust it
|
|
move.w d4,d1 ;read from this address
|
|
BSR6 RdXByte ;perform the read
|
|
move.b d1,d2 ;take the result
|
|
addq.w #1,d4 ;and write it to the next location
|
|
move.w d4,d1 ;modified address goes here
|
|
BSR6 WrXByte ;perform the write
|
|
swap d4 ;retrieve the count
|
|
dbra.w d4,@roll ;and keep going until we're done
|
|
|
|
move.w #NCFailHist,d1 ;now store the new failed test #
|
|
move.b d7,d2 ;here's the test number
|
|
BSR6 WrXByte ;write it
|
|
|
|
move.l #(NCLastFailure<<16 | NCLstFailBytes-1),d4 ;prepare to store the error code
|
|
|
|
@result
|
|
swap d4 ;get the destination address
|
|
move.w d4,d1 ;prepare it for the PRAM write
|
|
addq.l #1,d4 ;increment it
|
|
rol.l #8,d6 ;get the next byte of d6
|
|
move.b d6,d2 ;prepare to write it
|
|
BSR6 WrXByte ;perform the write
|
|
swap d4 ;now retrieve the byte count
|
|
dbra.w d4,@result ;and keep going until done
|
|
|
|
|
|
@finish
|
|
rts ;return to caller <v1.1>
|
|
|
|
EndProc
|