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

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

454 lines
16 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; File: NetBootlmgr.a
;
; Written by: Pat Dyson
;
; Copyright: © 1989-1992 by Apple Computer, Inc. All rights reserved.
;
; Change History (most recent first):
;
; <SM2> 10/28/92 SWC Changed the INCLUDEs to a LOAD of StandardEqu.d. Changed
; ATalkEqu.a->AppleTalk.a and ShutdownEqu.a->Shutdown.a.
; <9> 10/14/91 JSM Remove unneeded include of ATalkEqu2.a, add comment about things
; we need to do.
; <7> 6/12/91 LN removed include 'HardwareEqu.a'
; <6> 6/12/91 LN removed INCLUDE 'rtmpdefs.a'
; <5> 5/21/91 gbm Nail a couple of warnings
; <4> 1/19/91 mbs Include ATalkPrivateEQU.a to get some non-public equates that
; were moved out of ATalkEQU.a
; <3> 2/20/90 PWD Removed Include dependency for XO build.
; <2> 12/19/89 PD Adding to bbs.
; <1.2> 12/12/89 PWD Added support for self-authenticating images
; <1.1> 11/1/89 PWD Fixed bug on Elsie with old AppleTalk.
; <1.8> 10/27/89 PWD Changed to be included in the ATBoot Driver, work with net
; Booting
; To Do:
;
; This file uses includes copied from the AppleTalk sources into :OS:NetBoot:ATIncludes.
; We need a better place to keep these files, preferably getting them from the AppleTalk
; source tree itself. (JSM 10/14/91)
; COPIED FROM APPLETALK SOURCES 10/27/1989
; lmgr.a
; This file creates the LAP Manager initialization resource 'lmgr', located in the
; AppleTalk file. It is loaded by INIT (18) and executed. It initializes the LAP manager,
; and loads .MPP and .ATP via DrvrInstall.
INCLUDE 'mppflags2.a'
PRINT OFF
LOAD 'StandardEqu.d'
INCLUDE 'ShutDown.a'
INCLUDE '802Equ.a'
INCLUDE 'AppleTalk.a' ; AppleTalk equates
INCLUDE 'ATalkPrivateEqu.a' ; non-public AppleTalk equates
INCLUDE 'ENETEqu.a' ; Ethernet driver equates
INCLUDE 'AARPEqu.a' ; AARP equates
INCLUDE 'vardefs2.a' ; Definitions of MPP local variables
INCLUDE 'LapVars2.a'
PRINT ON, NOGEN
INCLUDE 'LAPMgrEqu.a' ; LAP manager equates
DoOpenLap PROC EXPORT
;¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
; The following pieces are loaded at startup for AppleTalk:
; INIT18 gets loaded by the system INIT processing. That process inserts the ROM resource
; map and performs a _GetResource. Thus looking both in ROM and the System File. To over-
; ride INIT18 then, one only needs to place a ROVR for it and its replacement resource in
; the System file.
; LMGR (this code) gets loaded by whatever technique INIT18 uses. It may be loaded out of
; ROM or the AppleTalk file depending on the INIT18. As a general rule, if INIT18 is in ROM,
; LMGR is loaded from ROM, and if INIT18 is in the system file, LMGR is loaded from the
; AppleTalk file.
; .MPP/.ATP drivers are loaded from ROM or the AppleTalk file. For each one, the ROM resource
; map is inserted and a _Get1Resource is performed. If that finds the driver AND it's version
; is acceptable, it is used from ROM, otherwise a _Get1Resource is performed on the AppleTalk
; file and another version check is made. If neither yields a driver resource, an initial-
; zation error is assumed.
; Built-in ATLK is searched for in ROM and the system file by inserting the ROM resource map
; and using _GetResource. To overide it, one needs to provide a ROVR and replacement resource
; in the System File. A file version of the code is NEVER used.
; ALL other ATLK files are searched for first in ROM then in an ADEV file in the System folder.
; Any alternate ROM ATLK is overidden in the same manner as the Built-in ATLK.
;_____________________________________________________________
;
; The actual INIT code - this code allocates our variables and
; installs us in the LAPWrite hook. The LAP manager code
; starts at the address pointed to by the hook, plus 2.
;_____________________________________________________________
InitCode
BSR InstallDRVRs ; install .MPP and .ATP (don't _Open)
BNE InitRTS ; could not do it
BSR ReadPRAM ; D1 = logical AppleTalk info
MOVEQ #1,D2 ; Assume just one port
MOVEQ #PESize,D0 ; size for ONE port entry
@3
ADD #PETblStart,D0 ; Add in room for rest of variables
_NewPtr ,SYS,CLEAR ; A0 -> our variables
BNE InitRTS ; If can't get, go away
MOVE D2,NumPorts(A0) ; Set number of ports we support
MOVEA.L ExpandMem,A1 ; A1 -> expanded memory
LEA ExpandMemRec.emLMgrGlobals(A1),A1 ; A1 -> our variable pointer
MOVE.L A0,(A1) ; Save it
MOVE.L D1,-(SP) ; Save D1 (PRAM value)
; <1.8> BSR LoadSTRs ; load strings for alerts
MOVEA.L ExpandMem,A0 ; A0 -> expanded memory
MOVEA.L ExpandMemRec.emLMgrGlobals(A0),A0 ; A0 -> our variables
LEA ATalkHk2,A1 ; A1 -> LAP write hook
MOVEA.L UTableBase,A2 ; A2->unit table
MOVEQ #MPPUnitNum*4,D1 ; D1=offset to .MPP DCE
MOVEA.L (A2,D1.W),A2 ; A2=MPP DCE handle
MOVEA.L (A2),A2 ; deref
MOVEA.L dCtlDriver(A2),A2 ; A2=.MPP pointer
MOVE.W drvrOpen(A2),D1 ; D1=offset to .MPP open code
MOVE.W -2(A2,D1.W),D1 ; D1=offset to LAP Manager code
LEA (A2,D1.W),A3 ; A3 -> the LAP mgr code
MOVE.L A3,D0
_StripAddress ; get real address
MOVE.L D0,(A1) ; Set in LAPWrite hook
MOVEQ #LInit,D0 ; init run time
JSR LAPMgrCall(A3)
MOVEA.L ExpandMem,A3 ; A3 -> expanded memory
MOVEA.L ExpandMemRec.emLMgrGlobals(A3),A3 ; A3 -> our variables
; <1.8>
; PEA BrdgName(A3) ; Push where to put name
; MOVE #BridgeSTR,-(SP) ; Push STR# resource ID
; MOVE #BridgeNameSTR,-(SP) ; Push index for file name
; JSR GetIndString ; Get it (nil if not found)
; <1.8>
MOVE.L (SP)+,D1 ; Restore D1
TST.B D1 ; Printer port AppleTalk?
BNE.S DoAltATlk ; no, this is alternate atlk
BSR InstallPrintAtlk ; Go get proper Printer Port AppleTalk
BRA.S FinishUp
DoAltATlk
BSR ATlkInit ; Otherwise initialize the alternate
FinishUp
LEA PETblStart(A3),A3 ; A3->port rec
TST.L PEpRAM(A3) ; using built-in?
BNE.S @useAtlk ; no
BSET #LWSrvrWks,PEOurFlags(A3) ; localtalk honors server/wks addresses
@useAtlk
InitRTS
RTS ; That's it
;_____________________________________________
;
; ATlkInit - not built-in AppleTalk. Install alternate.
;
; <1.8> If an error occurs, default to the built in and reopen
;
; D1 = pRAM value
; A3 -> our variables
;_____________________________________________
ATlkInit MOVE.L D4,-(SP) ; Save some registers
; CMP.B #BridgeAtlk,D1 ; Are we configured for a bridge?
; BEQ.S BridgeInit ; If so, do different initialization
MOVEQ #-1,D4 ; Indicate install is for non-bridge
BSR InstallADEV ; Install AppleTalk indicated by D1
MOVE.L D1,PETblStart+PEpRAM(A3) ; Save our pRAM value
@5 TST D0 ; Installed ok?
BEQ.S ATlkIDone ; <1.8>
BSR InstallE ; <1.8> process error - reset to built-in
; <1.8> and reopen
ATlkIDone MOVE.L (SP)+,D4 ; Restore registers
RTS ; And return
;_____________________________________________
;
; InstallE - process an installation error
;
; Uses:
; D0-D1,A3
;_____________________________________________
InstallE
MOVEQ #0,D1 ; Set pRAM back to zero
BSR WritePRAM ; Write it
BSR InstallPrintAtlk ; Go install proper Printer Port AppleTalk
MOVEA.L ExpandMem,A3 ; A3 -> expanded memory
MOVEA.L ExpandMemRec.emLMgrGlobals(A3),A3 ; A3 -> our variables
CLR.L PETblStart+PEpRAM(A3) ; Set port 0 pRAM value
MOVE #1,NumPorts(A3) ; We can only support one port
RTS ; Return
;__________________________________________________________
;
; InstallADEV - perform alternate AppleTalk installation
;
; Call:
; A3 -> our variables
; D1 (long) = pRAM value (low byte is atlk resource ID)
; D4 (word) = port number to install on (-1 for non-bridge)
;
; Return:
; D0 = error code
; D1 = new pRAM value (if bridge, must be same as old one)
; D2 = 0 if couldn't find adev file; otherwise error was from AInstall
; Uses D3,A0-A2
;
; NOTE: trashes the application heap
;__________________________________________________________
InstallPrintAtlk
move.w #LAPPrinter,d0 ; Printer atlk ID
bsr.s GetRomAtlk ; get ROM atlk resource handle
move.l a0,d0 ; is there a ROM atlk?
beq.s @Xit ; no, leave it to Builtin
@useRomPrinter
move.l #'SC ',d1 ; set up printer port atlk special value in d1
move.w #$101,d1 ; includes LAPPrinter value in low byte
move.w #-1,d4 ; Builtin => non-Router
bsr.s InstallTheAtlk ; go install atlk
@Xit
rts
;__________________________________________________________________
;
; GetRomAtlk - try to load ROM 'atlk' resource
;
; Call:
; D0 (word) = atlk resource ID
;
; Return:
; A0 (long) = handle returned by GetResource
;__________________________________________________________________
GetRomAtlk
move.l d2,-(sp) ; save d2
move.w #mapTrue,RomMapInsert ; map ROM into Resource Chain
subq #4,sp ; Make room for handle
move.l #'atlk',-(sp) ; Push resource type
move.w d0,-(sp) ; Push resource ID
_GetResource ; get atlk from ROM or from System file
move.l (sp)+,a0 ; get result
move.l (sp)+,d2 ; restore d2
rts
;__________________________________________________________________
;
; InstallTheAtlk - make install call to atlk
;
; Call:
; a0 (long) = handle to atlk
; d1 (long) = value from parameter RAM with Resource ID in low byte
; d4 (word) = port number to install on (-1 for non-bridge)
;
; Return:
; d0 (word) = result
; noErr => atlk installed successfully
; negative => error
; condition codes reflect result in D0
;__________________________________________________________________
InstallTheAtlk
movem.l a0/a2/a3/d2-d4,-(sp) ; Save registers
movea.l a0,a3 ; Pass handle in a3
move.l (a0),a0 ; A0 -> atlk code
tst.w d4 ; is this a router?
bpl.s @installIt ; yes, d4 is proper port
moveq #0,d4 ; no, indicate port 0
@InstallIt
moveq #AInstall,d0 ; Set code to do installation
jsr atlkCall(a0) ; Call it (returns D1 = pRAM value)
movem.l (sp)+,a0/a2/a3/d2-d4 ; Restore registers
tst.w d0 ; Set Condition Codes
rts
;__________________________________________________________
;
; InstallADEV - perform alternate AppleTalk installation
;
; Call:
; A3 -> our variables
; D1 (long) = pRAM value (low byte is atlk resource ID)
; D4 (word) = port number to install on (-1 for non-bridge)
;
; Return:
; D0 = error code
; D1 = new pRAM value (if bridge, must be same as old one)
; D2 = 0 if couldn't find adev file; otherwise error was from AInstall
; Uses D3,A0-A2
;
; NOTE: trashes the application heap
;__________________________________________________________
InstallADEV
MOVEQ #0,D2 ; init part of return code
CLR.W D0 ; Prepare word for atlk Resource ID
MOVE.B D1,D0 ; Resource ID of atlk is low byte of PRAM
BSR.S GetRomAtlk ; Try to get from ROM
MOVE.L A0,D0 ; Did we get it?
BEQ.S @done ; <1.8> no, punt
MOVE.L D1,D3 ; D3 = current pRAM value
BSR.S InstallTheAtlk ; an atlk was in ROM, use it
BEQ.S @checkRomAtlk ; installation was successful
@installFailed
MOVE.W D0,D2 ; indicate installation failed
BRA.S @done ; and exit
@checkRomAtlk
BSR.S CheckPramVal ; go check pRam value
BNE.S @installFailed ; pRam changed when it shouldn't have been
CMP.L D1,D3 ; Changed pRAM value?
BEQ.S @okRomAtlk ; Branch if not
BSR WritePRAM ; Write it out
@okRomAtlk
MOVEQ #0,D0 ; Indicate no error
@done
TST.W D0 ; Set condition codes
RTS ; That's it
;______________________________________________________________________
;
; CheckPramVal - If running Router don't allow atlk to change PRAM value
;
; Call:
; D1 = value returned by atlk install
; D3 = current PRAM value
; D4 = port number to install (-1 for non-bridge)
;
; Return:
; D0 = error code
; Condition codes set for value in D0
;
;______________________________________________________________________
CheckPramVal
MOVEQ #0,D0 ; Assume successful completion code
MOVE.B D3,D1 ; Low pRAM byte must be resource ID
TST D4 ; For a non-bridge?
BMI.S @letsRts ; If so no need to check
CMP.L D1,D3 ; Did atlk change pRAM?
BEQ.S @letsRts ; Branch if not
MOVE.L (A0),A0 ; A0 -> atlk code again
BSR DoAShutdown ; Shut it down
MOVEQ #ChangedPRAMErr,D0 ; Set error code
@letsRts
TST.W D0 ; Set condition codes
RTS ; And return result
;
; DoAShutdown - issue a shutdown call. A0 -> atlk code.
;
DoAShutdown MOVEM.L A0-A3/D0-D3,-(SP) ; Save registers
MOVEQ #AShutdown,D0 ; D0 = code for shutdown
JSR atlkCall(A0) ; Make the shutdown call
MOVEM.L (SP)+,A0-A3/D0-D3 ; Restore registers
RTS ; And return
; EJECT
;______________________________________________________________________
; Load and lock .MPP and .ATP drivers and setup DCE entries.
InstallDRVRs
MOVEQ #-(ATPUnitNum+1),D3
BSR.S @LoadAndLock ; load .ATP
BNE.S @BadInstall
MOVEQ #-(MPPUnitNum+1),D3 ; D3=refnum
BSR.S @LoadAndLock ; load .MPP
BNE.S @BadInstall ; failed
MOVEQ #0,D0
RTS ; good install
@BadInstall
; <1.8> BSR CloseAppleTalk ; close down AppleTalk
@IError
MOVEQ #-1,D0
RTS
@LoadAndLock ; D3=refnum
MOVE.W #mapTrue,RomMapInsert ; map ROM into Resource Chain
SUBQ #4,SP ; Make room for handle
MOVE.L #'DRVR',-(SP) ; Push resource type
MOVE.W D3,-(SP) ; Push resource ID
NOT.W (SP) ; id
_GetResource ; get atlk only from ROM
MOVE.L (SP)+,A0 ; get result
MOVE.L A0,-(SP) ; Keep on stack
MOVE.L A0,D0 ; Did we get ROM resource?
BEQ.S @IError ; no, check file load
MOVE.W D3,D0
DC.W $A43D ; _DrvrInstall,LOCK - make a DCE
MOVEA.L UTableBase,A0 ; A0->unit table
NOT.W D3 ; convert D3 to unit number
LSL.W #2,D3 ; convert to offset
MOVEA.L (A0,D3.W),A0 ; A0=DCE handle
MOVEA.L (A0),A0 ; A0->DCE
MOVE.L (SP)+,A1 ; A1 is handle to driver resource
; Set a pointer and keep ram bit clear even if we are in RAM due to unlocking of MPP by IOcore.
MOVE.L (A1),dCtlDriver(A0) ; set POINTER to DRVR in DCE
MOVEA.L dCtlDriver(A0),A1 ;A1->driver code
MOVE.B drvrFlags(A1),dCtlFlags(A0) ; copy flag byte from driver
BCLR #dRAMBased,dCtlFlags+1(A0) ; simulate being in ROM
MOVEQ #0,D0 ; good return
RTS
;__________________________________________________________________
;
; ReadPRAM - read from our PRAM
;
; D1 = value of PRAM
; Uses A0, D0
;__________________________________________________________________
ReadPRAM
CLR.L -(SP) ; Allocate room for read
BTST #14,HWCfgFlags ; New clock chip?
BEQ.S @10 ; Assume built-in if not
MOVE.L SP,A0 ; A0 -> where to read PRAM
MOVE.L #4*256*256+ATalkPRAM,D0 ; D0 = read length and offset
_ReadXPRam ; Do the read
@10 MOVE.L (SP)+,D1 ; D1 = value from parameter RAM
RTS
;__________________________________________________________________
;
; WritePRAM - write to our PRAM
;
; D1 = value to write
; Uses D0
;__________________________________________________________________
WritePRAM MOVE.L A0,-(SP) ; Save A0
MOVE.L D1,-(SP) ; Set value on stack
MOVE.L SP,A0 ; A0 -> where to write from
MOVE.L #4*256*256+ATalkPRAM,D0 ; D0 = count and offset
_WriteXPRam ; Write to PRAM
ADDQ #4,SP ; Pop word written
MOVE.L (SP)+,A0 ; Restore A0
@10 RTS ; That's it
ENDP
END