mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-27 10:29:32 +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.
333 lines
10 KiB
Plaintext
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 |