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.
239 lines
7.4 KiB
Plaintext
239 lines
7.4 KiB
Plaintext
;__________________________________________________________________________________________________
|
|
;
|
|
; File: netBoot.a
|
|
;
|
|
; Contains: This is the driver that is pointed to (refnum) by the drive queue element
|
|
; installed at _NetBootInit time. It will be called (Read) to read in the
|
|
; first two blocks of the disk (the "boot blocks");
|
|
;
|
|
; The idea is that we find an, or the, preffered boot protocol and open its
|
|
; boot driver. We then issue a getBootImage control call to it. If these
|
|
; are successful we go on to execute the boot image, replacing ourselves
|
|
; with the driver that it returns.
|
|
;
|
|
; We accept:
|
|
; read - the os initial read for the blocks
|
|
; control - an "eject" call
|
|
; open,
|
|
; close - our init and ending routines
|
|
;
|
|
; Written by: Patrick Dyson
|
|
;
|
|
; Copyright © 1989-1990, 1992 by Apple Computer, Inc. All rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM2> 11/5/92 SWC Changed INCLUDEs to a LOAD of StandardEqu.d.
|
|
; <7> 2/20/90 PWD Fixed dynamic heap sizing to re-init the app heap and
|
|
; update applzone and thezone appropriately.
|
|
; <6> 2/1/90 PWD Fixed dynamic heap sizing to re-init the app heap and update
|
|
; applzone and thezone appropriately
|
|
; <5> 1/2/90 PWD Adding back in support for an eject control call.
|
|
; <4> 12/28/89 SWC Fixed header and set tabs to 4.
|
|
; <3> 12/19/89 PWD Adding to bbs
|
|
; <1.1> 12/12/89 PWD Added support for self-authenticating images
|
|
; <1.0> 10/30/89 PWD Adding to EASE
|
|
;__________________________________________________________________________________________________
|
|
|
|
;Include files
|
|
|
|
PRINT OFF
|
|
LOAD 'StandardEqu.d'
|
|
INCLUDE 'AppleTalk.a' ; AppleTalk equates
|
|
INCLUDE 'NetBootEqu.a' ; Net Boot equates
|
|
PRINT ON
|
|
|
|
|
|
NBSubVersion EQU 2 ; our sub version number
|
|
|
|
;_________________________________________________
|
|
|
|
netBOOT PROC EXPORT
|
|
|
|
IMPORT findNOpenDriver ; our open guts
|
|
IMPORT DoClose ; our close guts
|
|
IMPORT DoRead ; our read guts
|
|
IMPORT DoOpen
|
|
STRING PASCAL
|
|
MACHINE MC68000
|
|
|
|
; *****************************************
|
|
; * *
|
|
; * Start of Boot driver *
|
|
; * *
|
|
; *****************************************
|
|
|
|
;
|
|
; Driver header
|
|
;
|
|
DC.W $4000+$0400+$0100 ; control,locked,read
|
|
DC.W 0,0 ; No time, no events
|
|
DC.W 0 ; No menu
|
|
|
|
;
|
|
; Entry points offset table
|
|
;
|
|
DC.W NBOpen-netBOOT ; open offset
|
|
DC.W NBRead-netBOOT ; prime (read,write)
|
|
DC.W NBControl-netBOOT ; control (eject only ?)
|
|
DC.W NBAnRTS-netBOOT ; status
|
|
DC.W NBClose-netBOOT ; close
|
|
|
|
DC.W '.netBOOT' ; Driver name
|
|
|
|
DC.B NBSubVersion ; Sub version number
|
|
DC.B 0 ; No main version number
|
|
|
|
|
|
;________________________________________________________________________
|
|
;
|
|
; Open - initialize the BOOT driver
|
|
;
|
|
; Called:
|
|
; D0 = 0
|
|
; A0 -> queue element
|
|
; A1 -> DCE
|
|
;
|
|
; Usage:
|
|
; D1 = pointer to our globals
|
|
; A2 = queue element
|
|
;________________________________________________________________________
|
|
NBOpen
|
|
MOVE.L A1,-(SP) ; save DCE
|
|
MOVE.L dCtlStorage(A1), D1 ; get our globals
|
|
BNE.S Xit ; punt if already opened
|
|
MOVE.L A0,A2 ; save queue element
|
|
|
|
IF &ForRAM THEN
|
|
LEA netBOOT, A0 ; pick up our pointer
|
|
_RecoverHandle ,SYS ; make it a handle
|
|
move.l a0,-(SP)
|
|
_DetachResource
|
|
ENDIF
|
|
MOVE.L #dGlobalsSize, D0 ; size of globals
|
|
_NewPtr ,SYS,CLEAR ; get it
|
|
BNE.S ErrXit
|
|
MOVE.L A0,D1 ; put it where we want it
|
|
move.l (SP), a1 ; restore a1
|
|
MOVE.L A0,dCtlStorage(A1) ; and where we can get it later
|
|
|
|
MOVEQ.L #0,D0
|
|
MOVE ioRefNum(A2),D0
|
|
MOVE.L A0, -(SP) ; push the globals
|
|
MOVE.L D0,-(SP) ; and our refnum
|
|
JSR DoOpen ; call the C glue
|
|
ADDQ.L #8,SP ; clean up stack
|
|
|
|
;
|
|
; We have now installed an entry in the drive queue, and pointed its refNum at
|
|
; this driver. The read routine will be the next called, for the boot blocks.
|
|
;
|
|
Xit MOVEQ #0,D0 ; Indicate no error
|
|
ADDQ.L #4,SP ; pop saved DCE
|
|
RTS ; And return
|
|
ErrXit MOVE.L (SP)+, A1 ; pop saved DCE
|
|
MOVE.L dCtlStorage(A1),D1
|
|
BEQ.S @1
|
|
MOVE.L D1,A0
|
|
_DisposPtr ; indicate we didn't open right
|
|
|
|
@1 MOVE.W #openErr,D0
|
|
RTS
|
|
|
|
RTS
|
|
EJECT
|
|
;________________________________________________________________________
|
|
;
|
|
; Close - close the BOOT driver.
|
|
;
|
|
; We need to clean up the boot protocol driver, if it is open, and
|
|
; remove the drive queue entry, deallocate our globals, and return
|
|
;
|
|
; A1 -> DCE
|
|
;________________________________________________________________________
|
|
|
|
NBClose MOVE.L dCtlStorage(A1),D1 ; get our storage
|
|
BEQ.S NBAnRTS ; punt if already closed ??
|
|
MOVE.L A1, -(SP) ; save across call
|
|
MOVE dCtlRefNum(A1),D0 ; D0 clear from above
|
|
MOVE.L D0, -(SP) ; push the refnum (long in C)
|
|
MOVE.L D1, -(SP) ; push our globals
|
|
JSR DoClose ;
|
|
ADDQ.L #8, SP ; clean up after C
|
|
MOVE.L (SP)+, A1 ; restore
|
|
CLR.L dCtlStorage(A1) ; make sure this doesn't get called again
|
|
TST.L D0 ; check for error
|
|
BEQ.S OkExit ; go home
|
|
MOVE.L #closErr, D0 ; whoops, make the error known
|
|
OkExit ;
|
|
NBAnRTS RTS ; And return
|
|
|
|
;________________________________________________________________________
|
|
;
|
|
; NBControl - close the BOOT driver.
|
|
;
|
|
; We need to clean up the boot protocol driver, if it is open, and
|
|
; remove the drive queue entry, deallocate our globals, and return
|
|
;
|
|
; A1 -> DCE
|
|
;________________________________________________________________________
|
|
|
|
NBControl
|
|
MOVE.W #offLinErr, D0 ; we don't eject
|
|
BRA.S GoHome ; return via jIODone
|
|
|
|
;________________________________________________________________________
|
|
;
|
|
; Read - get the boot image (Actually a prime call)
|
|
;
|
|
; This routine clears the queued param block and the driver active bit before
|
|
; it actually completes to allow the called routines to make control calls on
|
|
; us.
|
|
;
|
|
; A0 -> queue element
|
|
; A1 -> DCE
|
|
;________________________________________________________________________
|
|
|
|
; equates for the boot image directory
|
|
;
|
|
; moved to BootEqu.a
|
|
CASE OBJ
|
|
NBRead
|
|
IMPORT myGrowZone ; from BootUtils.a
|
|
|
|
controlBit EQU 3 ; Bit for control key down
|
|
controlByte EQU 7 ; Byte for control keys
|
|
|
|
BTST #controlBit,KeyMap+controlByte ; Control key skips boot
|
|
BEQ NBDontSkip ; Branch if not down
|
|
|
|
MOVE.W #offLinErr, D0 ; try again later (sadistic)
|
|
BRA GoHome
|
|
NBDontSkip
|
|
|
|
MOVE.L dCtlStorage(A1), D1 ; pick up our globals
|
|
BEQ.S GoHome ; punt if null
|
|
|
|
MOVEM.L A0-A1, -(SP) ; save DCE, IOPB accross call
|
|
|
|
MOVE.L SysZone, A1 ; pick up system heap pointer
|
|
move.l a1,TheZone ; <PWD 5>set default to system heap
|
|
|
|
MOVE.L gzProc(A1), -(SP) ; save old grow zone
|
|
LEA myGrowZone, A2 ; pick up my grow zone proc
|
|
MOVE.L A2, gzProc(A1) ; tell the memory manager
|
|
|
|
MOVE.L A0, -(SP) ; set up for doread, below
|
|
MOVE.L D1, -(SP)
|
|
JSR DoRead ; go do it
|
|
ADD.L #8, SP ; clean up stack
|
|
|
|
MOVE.L SysZone, A0 ; pick up system heap pointer
|
|
MOVE.L (SP)+,gzProc(A0) ; restore old grow zone
|
|
|
|
NBRestore MOVEM.L (SP)+, A0-A1 ; restore A0, A1
|
|
GoHome MOVE.W D0,IOResult(A0) ; show that call done
|
|
MOVE.L JIODone,A3 ; This is how we exit (Prime, Control, Status)
|
|
JMP (A3)
|
|
|
|
END |