mac-rom/OS/NetBoot/ATBoot.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

333 lines
10 KiB
Plaintext

;__________________________________________________________________________________________________
;
; File: ATBoot.a
;
; Contains: a boot protocol driver for AppleTalk
;
; This is the driver that is called by the boot management driver to run a
; boot protocol. This involves finding a server, and later getting some sort
; of boot blocks to return.
;
; We accept:
; control - "getBootBlocks"
; - getSysVol
; - mountSysVol
; open,
; close - our init and ending routines
;
; Written by: Patrick Dyson
;
; Copyright © 1989-1993 by Apple Computer, Inc. All rights reserved.
;
; Change History (most recent first):
;
; <SM3> 6/14/93 kc Roll in Ludwig.
; <LW2> 4/8/93 fau Rolled in the changes from Horror that were causing us from
; NetBooting. Also, in the ATOpen routine, moved the saving of
; registers to the beginning/end of the file and moved the
; fetching of the RefNum from the open to happen before it's
; storage is released!
; <H2> 4/28/92 dns Corrected a couple of outstanding problems relating to opening
; the LAP Manager for net booting.
; <4> 6/17/90 CV Preflight .MPP _Open by checking SPConfig byte - if the port
; isn't configured .MPP will crash cleaning up in it's exit code.
; <3> 6/15/90 CV Handle error on Lap open.
; <2> 5/30/90 CV Changed Close to close the AppleTalk drivers as well.
; <SM2> 11/5/92 SWC Changed INCLUDEs to a LOAD of StandardEqu.d.
; <6> 2/20/90 PWD Recover and detach our handle so that we don't go away
; if we are ram based and the system file is closed
; (switch launch). Only do this if the ForRam flag is set
; <5> 2/1/90 PWD Recover and detach our handle so that we don't go away if we are
; ram based and the system file is closed (switch launch).
; <4> 12/28/89 SWC Fixed header and set tabs to 4.
; <3> 12/19/89 PWD 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.0> 10/29/89 PWD Adding to EASE
;__________________________________________________________________________________________________
;Include files
PRINT OFF
LOAD 'StandardEqu.d'
INCLUDE 'Slots.a' ; Slot equates
INCLUDE 'ROMEqu.a' ; Slot ROM equates
INCLUDE 'AppleTalk.a' ; AppleTalk equates
INCLUDE 'NetBootEqu.a' ; Net Boot equates
PRINT NOGEN,NOMDIR
PRINT ON
INCLUDE 'ATBootEqu.a' ; protocol equates
;
; New equates for the lmgr resource
;
IF &TYPE('lmgrCall') = 'UNDEFINED' THEN
lmgrCall EQU 2 ; Offset into lmgr of function dispatcher
lmgrROMBooting EQU 2 ; Tells lmgr we're doing ROM boot
ENDIF
;_________________________________________________
ATBOOT PROC EXPORT
STRING PASCAL
MACHINE MC68000
; *****************************************
; * *
; * Start of Boot driver *
; * *
; *****************************************
;
; Driver header
;
DC.W $4000+$0400 ; control,locked
DC.W 0,0 ; No time, no events
DC.W 0 ; No menu
;
; Entry points offset table
;
DC.W ATOpen-ATBOOT ; open offset
DC.W ATAnRTS-ATBOOT ; prime (read,write)
DC.W ATControl-ATBOOT ; control
DC.W ATAnRTS-ATBOOT ; status
DC.W ATClose-ATBOOT ; close
DC.W '.ATBOOT' ; Driver name
DC.B 1 ; Sub version number
DC.B 0 ; No main version number
;________________________________________________________________________
;
; Open - initialize the BOOT driver
;
; Called:
; D0 = 0
; A0 -> queue element
; A1 -> DCE
;
;________________________________________________________________________
ATOpen
IMPORT DoOpenLap, mySysEnvirons
; Go get some storage
MOVEM.L D2-D7/A0-A6, -(SP) ; save regs in a paranoid fashion
MOVE.L dCtlStorage(A1), D3 ; are we running yet?
MOVE.L D3, A3 ; pick up globals
BGT.S GotMem ; skip the allocate
IF &ForRam THEN
LEA ATBOOT, A0 ; pick up our pointer
_RecoverHandle ,SYS ; make it a handle
move.l a1, a2 ; save a1
move.l a0, -(SP) ; push handle
_DetachResource
move.l a2, a1 ; pop saved a1
ENDIF
MOVE.L #ATGlobalsSize, D0 ; size of our globals
_NewPtr ,SYS,CLEAR
MOVE.L A0, D3 ; did we get?
BEQ ATErrXit
MOVE.L D3, dCtlStorage(A1) ; save globals pointer
; pick up the .netBoot driver refnum
GotMem SUB #IOQElSize,SP ;Allocate parameter block for device manager calls
MOVE.L SP,A0
CLR.B IOPermssn(A0) ;r/w permissions
LEA BootDiskName, A1
MOVE.L A1,IOFileName(A0)
_Open ; OPEN net boot disk driver
MOVE IORefNum(A0),d4 ; save refnum
TST IOResult(A0) ; any problems?
ADD.L #IOQElSize, SP ; nuke param block
BGT ATErrXit
MOVE d4,netBootRefNum(A3) ; get refnum
; Open up AppleTalk
controlBit EQU 3 ; Bit for control key down
controlByte EQU 7 ; Byte for control keys
BTST #controlBit,KeyMap+controlByte ; Control key skips boot
BNE ATErrXit ; Branch if down
MOVEQ #PortNotCf,d1 ;<4> Assume a port-not-configured error
MOVE.B SPConfig,d0 ;<4> D1 = port configuration byte
AND.B #$0F,d0 ;<4> Clear all but port use bits
SUBQ.B #UseATalk,d0 ;<4> Must be unconfig'ed, or config'd for ATalk
BGT @NoPatchee ;<4> Return error if not
MOVE.W #mapTrue,RomMapInsert ; map ROM into Resource Chain
SUBQ #4,SP ; Make room for handle
MOVE.L #'lmgr',-(SP) ; Push resource type
CLR.W -(SP) ; Push resource ID
_GetResource ; get lmgr from ROM
MOVE.L (SP)+,D5 ; D5 -> lmgr master pointer
BEQ.S @OldAppleTalk ; shouldn't happen, but ...
;
; We got the lmgr from ROM. So call it at its function dispatcher entry point.
; The function code is passed on the stack. We need to tell the lmgr that we're
; booting from ROM. This code only works with AppleTalk 57.0.4 or higher.
;
move.l d5,a0 ; move handle to A0
move.l (a0),a0 ; get ptr to lmgr code
move.l #lmgrROMBooting,-(sp) ; tell lmgr what do to. (function selector)
jsr lmgrCall(a0) ; Call the 'lmgr' to do its thing
addq #4,sp ; remove parameter (C-Calling conventions)
tst.w d0 ; check result
beq.s @lapOK ;<3> no error, continue
move d0, d1 ;<3> exit handler wants error in d1
bra.s @NoPatchee ;<3> branch to exit code
;
; .MPPOpen is a bad boy and calls SysEnvirons. We patch it so it doesn't crash
;
@lapOK MOVE.W #$A090, D0 ; SysEnvirons
_GetTrapAddress ,newOS
MOVE.L A0, A5 ; save address
MOVE.W #$A090, D0 ; SysEnvirons
LEA mySysEnvirons, A0 ; pick up our patch
_SetTrapAddress ,newOS ; patch that pup
@OldAppleTalk
SUB #ioQElSize,SP ; Allocate a queue element
MOVE.L SP,A0 ; A0 -> queue element
CLR.B ioPermssn(A0) ; Any permission
LEA MPPName,A1 ; A1 -> name of MPP
MOVE.L A1,ioFileName(A0) ; Set in queue element
_Open ; Open it
MOVE.W ioResult(A0), D1 ; pick up result of open
ADD #ioQElSize,SP ; Get rid of qEl
TST.L D5 ; Old AppleTalk?
BEQ.S @NoPatchee ; didn't patch iff so
MOVE.L A5, A0 ; pick up old SysEnvirons trap
MOVE.W #$A090, D0 ; and number
_SetTrapAddress ,newOS
@NoPatchee
TST.W D1 ; check open result
BNE.S ATErrXit ; Error if couldn't open
ATXit
MOVEM.L (SP)+, D2-D7/A0-A6 ; restorem
MOVEQ #0,D0 ; Indicate no error
Go RTS ; And return
ATErrXit
MOVEM.L (SP)+, D2-D7/A0-A6 ; restorem
MOVE.W #openErr,D0
RTS
STRING PASCAL
MPPName DC.W '.MPP'
BootDiskName
DC.W '.netBOOT'
OpenStr DC.W 'ATBoot Open'
ALIGN 4
;________________________________________________________________________
;
; Close - close the ATBOOT driver.
;
; We just do housekeeping
; and return.
;
; A1 -> DCE
;________________________________________________________________________
ATClose MOVE.L dCtlStorage(A1), D3 ; do we have storage
BEQ.S ATCloseExit ; skip the deallocate
MOVE.L D3, A3 ; address register
move.l netpram(a3), d0 ; <7>do we have a pram buffer?
beq.s @nopram ; <7>no buffer, no dispose
move.l d0,a0 ; <7>set up for dispos
_DisposPtr ; <7>
@nopram MOVE.L netimageBuffer(A3), D0 ; test
BEQ.S @noBuffer
MOVE.L D0,A0
_DisposPtr
@noBuffer
MOVE.L A3, A0 ; globals pointer
_DisposPtr
CLR.L dCtlStorage(A3) ; don't point at old storage
ATCloseExit
sub #ioQElSize,sp ; <7>Allocate a queue element
move.l sp,a0 ; <7>A0 -> queue element
move #-10,ioRefNum(a0) ; <7>Set in queue element
_Close ; <7>Close .MPP driver
add #ioQElSize,sp ; <7>Get rid of qEl
moveq.l #0, d0 ; <7>no error
ATAnRTS RTS ; And return
CloseStr DC.W 'ATBoot Close'
;________________________________________________________________________
;
; Read - never called
;
; A0 -> queue element
; A1 -> DCE
;________________________________________________________________________
ATRead
RTS
;________________________________________________________________________
;
; Control - control requests to driver
;
; The "guts" of the driver, this is called to get the boot blocks,
; mount a system volume, etc.
;
; Call: A0 -> I/O queue element
; A1 -> device control entry
;________________________________________________________________________
IMPORT PLOTMYICON ; from ATBoot.c
IMPORT DOATCONTROL ; from ATBoot.c
ATControl
; PEA ControlStr
; _DebugStr
MOVE.L A1, -(SP) ; save DCE pointer for jIoDone
MOVE.L A0,-(SP) ; save that param block pointer
MOVEQ #-1, D0 ; assume error return
;
; Go do the real work
;
MOVE.L dCtlStorage(A1), -(SP) ; push globals pointer
BEQ NoGo ; paranoia check
MOVE.L A0, -(SP) ; push param block
JSR DOATCONTROL ; get boot blocks, image, etc.
NoGo ADDQ.L #8, SP ; clean up stack
ErrExit
Exit MOVE.L (SP)+,A0 ; restore iopb
MOVE.L #1024,IOActCount(A0) ; fake good read
MOVE.W D0, ioResult(A0) ; return code in D0.W
MOVE.L (SP)+, A1 ; MUST BE VALID FOR JIODONE!!!
MOVE.L JIODone,A3 ; This is how we exit (Prime, Control, Status)
JMP (A3)
ControlStr DC.W 'ATBoot Control'
ENDP
mySysEnvirons PROC EXPORT
MOVE.W #$0605, SysEnvRec.systemVersion(A0) ; fake good sys version
MOVEQ.L #0, D0 ; and return no error
RTS
ENDP
END