mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 16:31:01 +00:00
192 lines
5.9 KiB
Plaintext
192 lines
5.9 KiB
Plaintext
|
;
|
|||
|
; File: BootItt.a
|
|||
|
;
|
|||
|
; Contains: Code to stuff d5 with a scsi id and jump to a driver
|
|||
|
;
|
|||
|
; Author: Clinton Bauder
|
|||
|
;
|
|||
|
; Copyright: <09> 1992-1993 by Apple Computer, Inc., All rights reserved.
|
|||
|
;
|
|||
|
; Change History (most recent first):
|
|||
|
;
|
|||
|
; <SM14> 10/14/93 pdw <MC> roll-in.
|
|||
|
; <MC2> 10/12/93 pdw Added support for Synchronous data transfers, rewrote State
|
|||
|
; Machine, message handling etc.
|
|||
|
; <SM13> 9/9/93 pdw Lots of little changes. Name changes, temporary cache_bug
|
|||
|
; stuff.
|
|||
|
; <SM12> 8/23/93 pdw Added support for LimitPRAMClear, IgnoreCmdOptShDel,
|
|||
|
; LoadDefaultOnly - three options required for AIX security,
|
|||
|
; enabled by setting bits in PRAM $76.
|
|||
|
; <SM11> 7/8/93 pdw Added LdD- and -LdD events to trace when drivers are being
|
|||
|
; called.
|
|||
|
; <SM10> 6/29/93 pdw Massive checkins: Change asynchronicity mechanism to CallMachine
|
|||
|
; stack switching mechanism. Adding support for Cold Fusion.
|
|||
|
; Rearranging HW/SW Init code. Some code optimizations.
|
|||
|
; <SM9> 5/29/93 PW Added line to change TheZone as well as AppZone after driver is
|
|||
|
; run.
|
|||
|
; <SM8> 5/5/93 PW Converted names to meanies-friendly names. Updated with latest
|
|||
|
; from Ludwig stuff.
|
|||
|
; <LW2> 2/2/93 DCB Saved registers around call to driver install to fix Radar bug
|
|||
|
; #1063405
|
|||
|
; <SM6> 2/1/93 PW Update from the latest of Ludwig. Also changes required for PDM
|
|||
|
; (will update Ludwig with these as needed myself).
|
|||
|
; <SM5> 12/1/92 PW Added applZone/sysZone stuff after returning from driver to fix
|
|||
|
; multiple drives not mounting bug.
|
|||
|
; <SM4> 10/30/92 DCB Changed to reflect new name for scsi.a
|
|||
|
; <SM3> 8/20/92 DCB Fixed a checksum problem
|
|||
|
; <SM2> 7/28/92 PW Added comment.
|
|||
|
; <0> 6/5/92 DCB New today.
|
|||
|
;
|
|||
|
;==========================================================================
|
|||
|
|
|||
|
MACHINE MC68020 ; '020-level
|
|||
|
BLANKS ON ; assembler accepts spaces & tabs in operand field
|
|||
|
PRINT OFF ; do not send subsequent lines to the listing file
|
|||
|
; don't print includes
|
|||
|
CASE OBJECT ; preserve case in object file
|
|||
|
|
|||
|
|
|||
|
IMPORT RecordEvent
|
|||
|
|
|||
|
;--------------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
LOAD 'StandardEqu.d'
|
|||
|
INCLUDE 'Debug.a' ; for NAME macro
|
|||
|
INCLUDE 'SCSI.a' ; <SM4>
|
|||
|
INCLUDE 'ACAM.a'
|
|||
|
|
|||
|
;--------------------------------------------------------------------------
|
|||
|
|
|||
|
JmpToDrvr PROC EXPORT
|
|||
|
|
|||
|
MOVE.L D5,-(SP) ; Save d5
|
|||
|
MOVE.L D7,-(SP) ; Save d7
|
|||
|
move.l 12(sp), D5 ; get the SCSI ID or Device Ident
|
|||
|
MOVE.L 20(SP),A0 ; Get Block zero
|
|||
|
MOVE.L SBData(A0),D7 ; save the default data area (Does anybody use this ?)
|
|||
|
MOVE.L 24(SP),A0 ; Get the partition map entry
|
|||
|
MOVE.l 16(SP),A1 ; get the driver
|
|||
|
IF RECORD_ON THEN
|
|||
|
pea 'LdD-'
|
|||
|
move.l D5, -(SP)
|
|||
|
bsr RecordEvent
|
|||
|
addq.l #8, sp
|
|||
|
ENDIF
|
|||
|
MOVEM.L A0-A6/D1-D7,-(SP) ; save everything dammit! <LW2>
|
|||
|
JSR (A1) ; install it
|
|||
|
MOVEM.L (SP)+,A0-A6/D1-D7 ; restore everything. <LW2>
|
|||
|
IF RECORD_ON THEN
|
|||
|
pea '-LdD'
|
|||
|
move.l A1, -(SP)
|
|||
|
bsr RecordEvent
|
|||
|
addq.l #8, sp
|
|||
|
ENDIF
|
|||
|
|
|||
|
; Make the System Heap growable by making the App Heap and TheZone the same zone as the System.
|
|||
|
MOVE.L SysZone,A0 ; which zone is the system zone
|
|||
|
MOVE.L A0,TheZone ; make THE REAL zone that zone
|
|||
|
MOVE.L A0,ApplZone ; good-bye to the app zone (make it same zone)
|
|||
|
MOVE.L bkLim(A0),HeapEnd ; end of System heap is now end of App Heap.
|
|||
|
|
|||
|
MOVE.L (SP)+,D7 ; restore d7
|
|||
|
MOVE.L (SP)+,D5 ; restore d5
|
|||
|
RTS ; adios
|
|||
|
|
|||
|
NAME 'JmpToDrvr'
|
|||
|
|
|||
|
CheckSumDrvr PROC EXPORT
|
|||
|
|
|||
|
MOVE.L D7,-(SP) ; save D7
|
|||
|
MOVE.L 12(SP),D1 ; the size of the driver in bytes
|
|||
|
MOVE.L 8(SP),a0 ; the driver itself
|
|||
|
|
|||
|
;
|
|||
|
; Checksum routine added <A311/31Oct86>. It uses the algorithm in the
|
|||
|
; partition design document. On entry, a0 points to the driver and d1
|
|||
|
; has the size in bytes (word quantity).
|
|||
|
;
|
|||
|
; Returns 16-bit checksum in d0. Destroys d1,d7,a0.
|
|||
|
;
|
|||
|
|
|||
|
DoCksum
|
|||
|
moveq.l #0,d0 ; initialize sum register
|
|||
|
moveq.l #0,d7 ; zero-extended byte
|
|||
|
bra.s CkDecr ; handle 0 bytes <A349/04Nov86>
|
|||
|
CkLoop
|
|||
|
move.b (a0)+,d7 ; get a byte
|
|||
|
add.w d7,d0 ; add to checksum
|
|||
|
rol.w #1,d0 ; and rotate
|
|||
|
CkDecr
|
|||
|
dbra d1,CkLoop ; next byte
|
|||
|
tst.w d0 ; convert a checksum of 0
|
|||
|
bne.s @1 ; into $FFFF (as per
|
|||
|
subq.w #1,d0 ; algorithm description).
|
|||
|
@1
|
|||
|
MOVE.L (SP)+,D7 ; restore D7
|
|||
|
rts
|
|||
|
|
|||
|
NAME 'CheckSumDrvr'
|
|||
|
|
|||
|
|
|||
|
;________________________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: Ck4IgnoreCmdShOptDel
|
|||
|
;
|
|||
|
; Inputs: none
|
|||
|
;
|
|||
|
; Outputs: Z: NE = ignore
|
|||
|
; EQ = don't ignore
|
|||
|
; D0: NE = ignore
|
|||
|
; EQ = don't ignore
|
|||
|
;
|
|||
|
; Trashes: D0, A0
|
|||
|
;
|
|||
|
;________________________________________________________________________________________
|
|||
|
|
|||
|
Ck4IgnoreCmdShOptDel PROC EXPORT
|
|||
|
|
|||
|
subq.w #2,sp ; allocate buffer on stack
|
|||
|
movea.l sp, A0 ; get buffer ptr
|
|||
|
MOVE.L #$00010076, D0 ; Read 1 bytes starting at loc $76
|
|||
|
_ReadXPRam
|
|||
|
move.b (sp)+, D0
|
|||
|
and.b #4, D0 ; bit 2
|
|||
|
rts
|
|||
|
|
|||
|
NAME 'Ck4IgnoreCmdShOptDel'
|
|||
|
|
|||
|
ENDPROC
|
|||
|
|
|||
|
;________________________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: Ck4OnlyLoadFromDefault
|
|||
|
;
|
|||
|
; Inputs: none
|
|||
|
;
|
|||
|
; Outputs: Z: NE = only load/boot from Default device
|
|||
|
; EQ = boot from Floppy or Default
|
|||
|
; D0: NE = only load/boot from Default device
|
|||
|
; EQ = boot from Floppy or Default
|
|||
|
;
|
|||
|
; Trashes: D0, A0
|
|||
|
;
|
|||
|
;________________________________________________________________________________________
|
|||
|
|
|||
|
Ck4OnlyLoadFromDefault PROC EXPORT
|
|||
|
|
|||
|
subq.w #2,sp ; allocate buffer on stack
|
|||
|
movea.l sp, A0 ; get buffer ptr
|
|||
|
MOVE.L #$00010076, D0 ; Read 1 bytes starting at loc $76
|
|||
|
_ReadXPRam
|
|||
|
move.b (sp)+, D0
|
|||
|
and.b #2, D0 ; bit 1
|
|||
|
rts
|
|||
|
|
|||
|
NAME 'Ck4OnlyLoadFromDefault'
|
|||
|
|
|||
|
ENDPROC
|
|||
|
|
|||
|
|
|||
|
END
|