mac-rom/Patches/VideoPatch.a

1228 lines
51 KiB
Plaintext

;
; File: VideoPatch.a
;
; Contains: Patches to fix problems in various Apple Video Drivers.
;
; Written by: George Norman, Dave Fung, Mike Puckett.
;
; Copyright: © 1987-1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM2> 5/16/92 kc Include ROMEqu instead of ROMPrivateEqu.
; <9> 1/8/92 RB Removed definition of drHwJMFB, since it is now in ROMEqu.a
; <8> 12/31/91 RB Removed definition of DAFB_PgMdEn, it is now in
; HardwarePrivateEqu.a
; <7> 12/2/91 SAM Using official boxflag equates now.
; <6> 10/28/91 SAM/KSM Rolled in Regatta file.
;
; Regatta change history:
;
; <10> 10/2/91 SAM (jmp) Fixed a problem when looking at gDevices that donÕt
; actually contain associated video drivers.
; <9> 8/25/91 SAM (jmp) Put the DAFB/JMFB WITH statements around the DAFB/JMFB
; code. The reason I had to do this is because the DAFB equates
; have similar names as the TFB equates and this was causing
; incorrect code to be generated in the TFB part of this patch.
; <8> 8/21/91 SAM (jmp) Code Review Changes: 1) Removed the unnecessary saves &
; restores of register D0 after & before calling SwapMMUMode,
; respectively, and 2) changed the slot searching from 9 to 0 in
; both the TFB & JMFB fixes for slot expansion boxes.
; <7> 8/19/91 SAM (jmp) Added support for the Bungee (1.1) version of the 4¥8/
; 8¥24 Card ROM for TERROR ROM CPUs.
; <6> 8/15/91 SAM (jmp) Fixed a problem with the DAFB sRsrc patches where I was
; not updating the driver privates correctly.
; <5> 8/8/91 SAM (jmp) Added two ÒpatchesÓ for DAFB built-in video. The first one
; just enables PageMode, while the second fixes a problem with NTSC
; and PAL sRsrcs when going from 2 Megs of VRam to 1 Meg of VRam
; across reboots.
; <4> 7/30/91 SAM Removed redefinition of drHwDAFB.
; <3> 7/29/91 SAM (jmp) Added code to check for Zydeco ROM and to skip the boxflag
; check for Spike & Eclipse that corrects a 16bpp capable sRsrc on
; those machines.
; <2> 7/18/91 SAM (jmp) Video SResoure stuff.
; <1> 7/18/91 SAM Split off from 7.0 GM sources.
;
; 7.0 Change History:
;
; <5> 11/8/90 jmp Removed a debugger statement I accidently left in.
; <4> 11/6/90 jmp Renamed DepVideoEqu.a to TFBDepVideoEqu.a; had to change INCLUDE
; name.
; <3> 11/2/90 jmp For 6.0.X and 7.0 builds: Fixed version comparison problem (word
; instead of byte alignment), and updated version number from
; DepVideoEqu.a.
; <2> 7/11/90 gbm add align, so assembler is happy
; <1.6> 11/28/89 DAF FOR 6.0.5 and 7.0 BUILDS - Somehow, the 1.5 version change
; didn't stick, so I once again updated the CurrentVersion equate
; to version 4 to match the latest version of the driver in this
; build
; <1.5> 11/27/89 DAF FOR 6.0.5 AND 7.0 BUILDS - Updated file to latest TFBDrvr
; version number.
; <1.5> 11/27/89 DAF Updated the version.
; <1.4> 8/14/89 DAF FOR 6.0.4 BUILD - Fixed a register clearing problem. Also made
; the label names local to avoid conflicts in the patch files.
; <1.3> 8/6/89 DAF FOR 6.0.4 BUILD - This version of VidInit (included in
; PatchIIROM.a and PatchIIciROM.a) properly deallocates the slot
; interrupt queue element when it does it's voodoo on the startup
; TFB driver.
; <1.2> 5/3/89 GGD TFBDrvr v3 fixes an inverted gamma table problem. This fix
; corrects the problem if the TFB is the boot device. (DAF under
; the initials of GGD)
; <1.1> 5/2/89 DAF Changed video driver version to 3 for the new TFB release
; <1.0> 11/16/88 CCH Added to EASE.
; <S376> 1/31/88 DAF Updated driver version number for test
; <S237> 9/15/87 DAF Cleared the high half of a register to guarantee unit table code
; works OK under adverse conditions
;
; To Do:
;
;------------------------------------------------------------------------
;
; Copyright Apple Computer, Inc. 1987
; All Rights Reserved
;
;------------------------------------------------------------------------
;
; File : VideoPatch.a
;
; Author : George Norman, February 16, 1987
; Converted into system patch and integrated into system disk build : David Fung, 19 Aug 1987
;
; This code scans the graphics DeviceList, testing all open video drivers
; against a video driver in the system file. If the disk version is
; newer, then the slot driver is closed and the system driver is opened
; in its place. This patch works in conjunction with changes to the
; Open routine for slot drivers so that only the boot device will
; be operated on by the code. This mechanism allows Apple to place
; newer versions of the driver in the system file without nasty side
; effects. Third party vendors should perform this override from an
; INIT 31 file.
;
; <Since 1.3 this Bug note is purely historical. See comment below>
; Bug note: The ROM version of the TFBDrvr has a bug in the Close routine, where it
; neglects to set the slot number in D0 when calling _SIntRemove. This leaves a
; pointer to a disposed block in the slot interrupt queue element when the code
; in this file is executed on the boot video device. When the RAM driver is re-opened
; a new, correct queue element is built and installed ahead of the disposed one.
; The dead element will not cause any problems, but should be corrected in future
; video ROMs. The override driver is corrected and all future close calls should work
; OK. This problem could be fixed here, but it involves brutally clobbering the
; dead queue element, since the ROM close must be executed, and the pointer block
; is disposed within the call. Since the bug is fairly benevolent, we'll let it
; go.
;
; 1.3 Bug Update : Turns out that the _SIntRemove bug is NOT a big deal to fix. In
; addition, it seemed that it could possibly cause problems if the SetInterrupt
; routine was used (it can cause multiple queue elements that point to the same
; handler), so I corrected the problem here.
;
;------------------------------------------------------------------------
INCLUDE 'TFBDepVideoEqu.a' ; To get current TFB Driver version.
Include 'InternalOnlyEqu.a' ; To get boxFlags for Spike & Eclipse.
Include 'VideoEqu.a' ; Various video-related equates.
Include 'ROMEqu.a' ; Various DAFB equates.
;-------------------------------------------------------------------
; Local Vars, definitions, etc....
;-------------------------------------------------------------------
; This is device storage which is stored in the dCtlStorage field of the DCE (for TFB).
DCEPtr EQU 0 ; pointer to our DCE
saveMode EQU DCEPtr+4 ; the current mode setting
savePage EQU saveMode+2 ; the current page setting
saveBaseAddr EQU savePage+2 ; the current base address
saveSQElPtr EQU saveBaseAddr+4 ; the SQ element pointer (for _SIntRemove). <C497>
GammaPtr EQU saveSQElPtr+4 ; the pointer to the Gamma correction table <C522> DAF
GFlags EQU GammaPtr+4 ; flags word
VRAM256K EQU GFlags+2 ; boolean - TRUE if 256K vidRAM, FALSE if 512K <C804> DAF
dCtlSize EQU VRAM256K+2 ; size of dCtlStorage <C497>
; These equates have been extracted directly from the TERROR ROM project (for DAFB).
DAFBVidPrivates RECORD 0 ; Similar to the TFB privates above, but for DAFB.
saveBaseAddr DS.L 1 ; the screen base address (NOT ST corrected!)
saveScreenBase DS.L 1 ; ST corrected version of saveBaseAddr.
saveSQElPtr DS.L 1 ; the SQ element pointer (for _SIntRemove)
saveGammaPtr DS.L 1 ; the pointer to the Gamma correction table
saveGamDispPtr DS.L 1 ; the pointer to the Gamma block
saveVDACBase DS.L 1 ; the base addr of the VDAC
saveDAFBBase DS.L 1 ; the base addr of the DAFB
saveVidPtr DS.L 1 ; pointer to a big block of DAFB video parameters
GFlags DS.W 1 ; flags word
has16bppACDC Ds.b 1 ; true if AC842A is around
pageModeSet Ds.b 1 ; true if the pRam PageMode enable bit is set
saveMode DS.W 1 ; the current mode setting
saveMonID DS.W 1 ; monitor type ID
saveSlotId DS.W 1 ; spID of video sRsrc (hi-order byte only!)
DAFBVidPrivSize EQU *
ENDR
sRsrc_Vid_DAFB_NTSCSTa EQU $D0 ; NTSC ST 1,2,4,8
sRsrc_Vid_DAFB_NTSCSTb EQU $D1 ; NTSC ST 1,2,4,8,32
sRsrc_Vid_DAFB_NTSCFFa EQU $D2 ; NTSC FF 1,2,4,8
sRsrc_Vid_DAFB_NTSCFFb EQU $D3 ; NTSC FF 1,2,4,8,32
sRsrc_Vid_DAFB_PALSTa EQU $D4 ; PAL ST 1,2,4,8
sRsrc_Vid_DAFB_PALSTb EQU $D5 ; PAL ST 1,2,4,8,32
sRsrc_Vid_DAFB_PALFFa EQU $D6 ; PAL FF 1,2,4,8
sRsrc_Vid_DAFB_PALFFb EQU $D7 ; PAL FF 1,2,4,8,32
sRsrc_Vid_DAFB_RGBFPb EQU $CD ; RGBPort 8bpp
sRsrc_Vid_DAFB_RGB2Pb EQU $CF ; Vesuvio 8bpp
sRsrc_Vid_DAFB_RGBFPbx Equ $ED ; RGBPort 16bpp
sRsrc_Vid_DAFB_RGB2Pbx Equ $EF ; Vesuvio 16bpp
kMegRAM EQU $100000 ; constant for 1Mb
k1536KvRAM Equ $180000 ; constant for 1.5Mb
k256KvRAM EQU (256*1024) ; constant for 256Kb
k512KvRAM EQU (512*1024) ; constant for 512Kb
k1MvRAM EQU (1024*1024) ; constant for 1MB
k2MvRAM EQU 2*k1MvRAM ; constant for 2MB
DAFBStdOffset EQU $1000 ; Active video offset from base of frame buffer vRAM for most displays.
DAFBBSOffset EQU $0E00 ; Active video offset for Big Screens: 2P, LP, & SVGA.
DAFBNTSCOffset Equ $1020 ; Active video offset for NTSC Displays.
DAFBPALOffset Equ $0E20 ; Active video offset for PAL Displays.
DAFBBase Equ $800000 ; Offset from $Fs000000 address for DAFB registers.
; <8> rb DAFB_PgMdEn Equ $18 ; DAFB page mode enable register.
; DAFB houses it's mode parameters in a table in the functional sRsrc list. Here's
; the ID for it. It's in the reserved range, but it's highly likely that this
; will be forever OK - I'll bet on it.
sVidParmDir EQU 126 ;
; Slot pRAM
;
; Slot pRam is used in various ways. The first two bytes are used by the Slot Manager to record
; the slotÕs boardID. The remaining bytes are left undefined by the Slot Manager. Built-in
; video uses Slot pRam as follows:
;
SP_Params Record 0
SP_BoardID Ds.w 1 ; BoardID.
SP_Depth Ds.b 1 ; spID of Depth (Mode). (vendorUse1)
SP_LastConfig Ds.b 1 ; spID of last boot-up configuration. (vendorUse2)
SP_DfltConfig Ds.b 1 ; spID of default configuration. (vendorUse3)
SP_MonID Ds.b 1 ; Sense code of last display. (vendorUse4)
SP_Flags Ds.b 1 ; Various flags. (vendorUse5)
SP_NoConnect Ds.b 1 ; Sense ID of monitor to use on no-connect (vendorUse6)
SP_Size Equ *
EndR
; Slot pRAM flag bits
;
spPageMode Equ 3 ; True if weÕre enabling DAFBÕs PageMode.
; Various extra Control/Status calls used by built-in video
;
cscPageMode Equ 130 ; Used by DAFBDriver for enabling/disabling page mode.
; These are all non-pruned and/or unsupported IDs of the sRsrcs left over from the TERROR ROM JMFB patch.
;
sRsrc_Vid12A Equ $8C ; Video sResource ID for NTSC, standard memory
sRsrc_Vid12B Equ $AC ; Video sResource ID for NTSC, expanded memory
sRsrc_Vid12C Equ $9C ; 24 bit sResource duplicate of sRsrc_Vid12A
sRsrc_Vid12D Equ $BC ; 24 bit sResource duplicate of sRsrc_Vid12B
sRsrc_Vid14A Equ $88 ; Video sResource ID for PAL, standard memory
sRsrc_Vid14B Equ $A8 ; Video sResource ID for PAL, expanded memory
sRsrc_Vid14C Equ $98 ; 24 bit sResource duplicate of sRsrc_Vid14A
sRsrc_Vid14D Equ $B8 ; 24 bit sResource duplicate of sRsrc_Vid14B
sRsrc_Vid14Au Equ $80 ; Video sResource ID for PAL underscan, standard memory
sRsrc_Vid14Bu Equ $A0 ; Video sResource ID for PAL underscan, expanded memory
sRsrc_Vid14Cu Equ $90 ; 24 bit sResource duplicate of sRsrc_Vid14A
sRsrc_Vid14Du Equ $B0 ; 24 bit sResource duplicate of sRsrc_Vid14B
TERRORBungeeVers Equ $0110 ; TERROR ROM version of the Bungee video driver.
;************************************************************************
;
; Video driver override init.
; Registers used:
; A6 - Stack frame pointer.
; A4 - ioCore parameter block pointer.
; A3 - SDM parameter block pointer.
; A2 - Control/Status parameter block pointer.
; A1 - Misc.
; A0 - Misc.
;
; D7 - Saved ptr to GDev (TFB)/Framebuffer offset value (DAFB)
; D6 - Saved ptr to the original DCE (TFB)/Re-inserted sRsrc ID (DAFB)
; D5 - Saved pointer to the original video driver entry (TFB)/Misc (DAFB)
; D4 - Saved handle to the original video driver (TFB)/Misc (DAFB)
;
;************************************************************************
; Define stack-frame
;
StackFrame RECORD {A6Link},DECR
Return DS.L 1 ;Return address
A6Link DS.L 1 ;Old A6
sMode DS.W 1 ;Saved mode.
sPage DS.W 1 ;Saved page.
sBaseAddr DS.L 1 ;Saved base address.
sGammaPtr DS.L 1 ;Saved gamma table pointer.
sGFlags DS.W 1 ;Saved gamma flags.
sSQEl DS.L 1 ;Saved slot interrupt handler queue element ptr <1.3>
minorVers Ds.b 1 ;Flag for remebering which ROM weÕre fixing.
downSizeSRsrc Ds.b 1 ;True if downSizing instead of upSizing.
hasFamilies Ds.b 1 ;True if SP_LastConfig should be reset (config has family members).
Ds.b 1 ;Padding.
bootRefNum Ds.w 1 ;RefNum of boot screenÕs video driver (for JMFB).
bootDrvrHndl Ds.l 1 ;Handle to the boot screenÕs video driver (for JMFB).
saveA5 Ds.l 1 ;For a local QuickDraw world.
localA5 Ds.l 1
thePort Ds.l 1
Ds.b GrafSize-4
aRect Ds.w 4
aPort Ds.b PortRec
LocalSize EQU * ;Size of local vars.
ENDR
Bra BeginVideoPatch
;----------------------------------------------------------------------
; Data
;----------------------------------------------------------------------
STRING PASCAL
TFBVideoTitle DC.B '.Display_Video_Apple_TFB' ;Name of TFB driver.
ALIGN 2
JMFBVideoTitle Dc.b '.Display_Video_Apple_MDC' ;Name of JMFB driver.
Align 2
JMFBSRsrcTable
Dc.w JMFBTabEnd-JMFBTabStart-1 ;Block size.
JMFBTabStart
Dc.b sRsrc_Vid14A,sRsrc_Vid14B ; All the PAL under/overscan sRsrcs.
Dc.b sRsrc_Vid14C,sRsrc_Vid14D
Dc.b sRsrc_Vid14Au,sRsrc_Vid14Bu
Dc.b sRsrc_Vid14Cu,sRsrc_Vid14Du
Dc.b sRsrc_Vid12A,sRsrc_Vid12B ; All the NTSC overscan sRsrcs.
Dc.b sRsrc_Vid12C,sRsrc_Vid12D
JMFBTabEnd
;----------------------------------------------------------------------
; Utilities
;----------------------------------------------------------------------
SwitchDepths
;---------------------------------------------------------------------
;
; SwitchDepths -- switches the bit depth of the specified boot-up
; screen to the specified depth, rounds the corners, and draws
; the arrow. Note that this utiltiy should only be called within
; the confines of the VideoPatch StackFrame.
;
; Input: D0.w = Video Driver RefNum,
; D1.l = VidMode.
;
; Trashes: A0/A1.
;---------------------------------------------------------------------
;
With StackFrame
; Set up to switch depthsÉ
Move.l A2,-(Sp) ; Save a work register.
Move.w D0,-(Sp) ; Push the driver refNum.
Move.l D1,-(Sp) ; Push the mode to change to.
Move.l DeviceList,-(Sp) ; Push the GDHandle.
_HideCursor ; Hide the cursor (to prevent visual artifacts).
Move.b #1,CrsrBusy ; Say its busy for now.
_InitGDevice ; Switch depths.
; Gray screen with rounded corners using HorstÕs patented methodsÉ
Move.l A5,saveA5(A6) ; Save the current A5.
Lea localA5(A6),A5 ; Point to our A5.
Move.l A5,CurrentA5 ; Update CurrentA5 for QD.
Pea thePort(A6) ; Push thePort.
_InitGraf ; Init our QD world.
Pea aPort(A6) ; Push aPort.
_OpenPort ; Open it.
Move.l (A5),A2 ; Point to QD globals.
Lea ScreenBits+Bounds(A2),A0 ; Point to screen rectangle.
Move.l A0,-(Sp) ; Push for FrameRoundRect.
Lea aRect(A6),A1 ; Point to aRect.
Move.l A1,-(Sp) ; Push for FrameRoundRect.
Move.l A1,-(Sp) ; Push for InsetRect.
Move.l (A0)+,(A1)+ ; aRect <- ScreenRect.
Move.l (A0),(A1) ;
Move.l #$FFFDFFFD,-(Sp) ; Make aRect bigger by 3 on each side.
_InsetRect
Move.l #$00030003,-(Sp) ; Make pen 3 pixels wide.
_PenSize
Move.l #$00160016,-(Sp) ; Rounding factor ($00100010 + 2 * $00030003).
_FrameRoundRect ; Draw black corners.
_PenNormal ; Restore the pen.
Move.l #$00100010, -(SP) ; Push the rounding factor.
Pea Gray(A2) ; Push gray.
_FillRoundRect ; Fill a round rectangle gray.
; Clean upÉ
Pea aPort(A6) ; Push aPort.
_ClosePort ; Close it.
Move.l saveA5(A6),A5 ; Restore A5.
Move.l A5,CurrentA5 ; Restore CurrentA5.
Clr.b CrsrBusy ; Un-busy the cursor.
_AllocCursor ; Update all its structs.
_InitCursor ; Reshow it as an arrow (balances the hide above).
Move.l (Sp)+,A2 ; Restore work register.
Rts
EndWith
;----------------------------------------------------------------------
; Main
;----------------------------------------------------------------------
BeginVideoPatch
WITH StackFrame,spBlock
; Allocate local varsÉ
;
LINK A6,#LocalSize
MOVEM.L A2-A4/D4-D7,-(SP) ;Save registers.
SUB.W #IOQElSize,SP ;Allocate ioCore pBlock.
MOVE.L SP,A4 ;Save pointer.
SUB.W #spBlockSize,SP ;Allocate SDM pBlock.
MOVE.L SP,A3 ;Save pointer.
SUB.W #12,SP ;Allocte CS parameter block.
MOVE.L SP,A2 ;Save pointer.
TST.L DeviceList ;Test DeviceList for nil.
BEQ AllDone ;Done if empty list.
Move.l DeviceList,A0 ; Get the DeviceList Handle. <10>
Move.l (A0),A0 ; Make it a pointer. <10>
Move.w gdRefNum(A0),D0 ; If thereÕs no driver, then <10>
Beq AllDone ; we canÕt do anything here. <10>
; If this is a TERROR ROM machine, the TFB Driver has already been patched out
; because of a byte-lane smearing problem on Õ040 CPUs. So, we can just
; skip the TFB patch. But, we need to fix a couple of problems on Spike &
; Eclipse CPUs that involve 16/32bpp-capable sRsrcs being enabled when they
; shouldnÕt be and vice-versa.
;
; Also, for Spike, Eclipse, and Zydeco, weÕre enabling DAFB PageMode. For
; TERROR ROM machines, this means we have to do all the work ourselves.
; The Zydeco ROM takes care of everything if either the pRAM bit is set
; (at VidOpen if we arenÕt the startup screen) or if we make the
; driver call. (NOTE: The TERROM ROM DAFB driver does NOT intelligently
; handle the PageMode register, while the Zydeco ROM DAFB driver does.
; This basically means that with TERROR ROM CPUs, DAFB PageMode will
; ALWAYS be on, and for Zydeco ROM CPUs, PageMode will only be on
; when itÕs applicable. At some point, it might be reasonable to
; patch the Zydeco ROM DAFB driver into TERROR ROM CPUs.)
;
With SP_Params,VDPageInfo,DAFBVidPrivates
TERROR_MajVer Equ $067C ; ROM Major version for TERROR.
TERROR_MinVer Equ $15 ; ROM Minor version for TERROR.
Zydeco_MinVer Equ $17 ; ROM Minor version for Zydeco.
ROMMajVer Equ $08 ; Offset from ROMBase to ROM Major version word.
ROMMinVer Equ $12 ; Offset from ROMBase to RAM Major version word.
Move.l RomBase,A0 ; Get RomBase into A0.
Move.w ROMMajVer(A0),D0 ; Get the major version.
Cmp.w #TERROR_MajVer,D0 ; If this is NOT a IIci-class ROM,
Bne StartTFB ; then just do the TFB stuff.
Move.b ROMMinVer(A0),D0 ; Otherwise, get the minor version.
Move.b D0,minorVers(A6) ; Save it for later.
Cmp.b #TERROR_MinVer,D0 ; If this is a TERROR ROM,
Beq.s @FixJMFB ; then do the JMFB fixes, followed by the DAFB fixes.
Cmp.b #Zydeco_MinVer,D0 ; If this is a Zydeco ROM,
Beq @ChkBoxFlag ; then just check the boxFlag for the DAFB fixes.
Bra StartTFB ; Otherwise, do the TFB stuff (just for safety).
@FixJMFB
Bsr StartJMFB ; Go do the JMFB fixes.
@ChkBoxFlag
Move.b BoxFlag,D0 ; Get the BoxFlag.
Cmp.b #boxQuadra700,D0 ; If this is a Spike, <7>
Beq.s StartDAFB ; then start doing DAFB stuff.
Cmp.b #boxQuadra900,D0 ; If this is an Eclipse, <7>
Beq.s StartDAFB ; then start doing DAFB stuff.
Cmp.b #boxZydeco,D0 ; If this is a Zydeco (Eclipse 33),
Beq.s StartDAFB ; then start doing DAFB stuff.
Bra AllDone ; Otherwise, just go home.
StartDAFB
Move.l A3,A0 ; Get spBlock ptr into A0.
Clr.b spSlot(A0) ; We only care about Slot $0.
Clr.b spExtDev(A0) ; (No external device.)
Move.w #catDisplay,spCategory(A0) ; Look for: Display,
Move.w #typVideo,spCType(A0) ; Video,
Move.w #drSwApple,spDrvrSW(A0) ; Apple,
Move.w #drHwDAFB,spDrvrHW(A0) ; DAFB.
Clr.l spParamData(A0) ; Look only for enabled sRsrcs.
Bset #foneslot,spParamData+3(A0) ; Limit search to this slot only.
_GetTypeSRsrc ; If built-in video is not on, then
Bne AllDone ; just quit.
Move.w spRefNum(A0),D5 ; If we arenÕt the startup screen,
Beq.s @NoDrvr ; then do the pRAM stuff.
Clr.b csMode(A2) ; To enable page mode, clear csMode.
Move.l A4,A0 ; Set up for the Control call:
Move.w D5,ioRefNum(A0) ; ioRefNum.
Move.w #cscPageMode,csCode(A0) ; csCode.
Move.l A2,csParam(A0) ; csParam.
_Control ,Immed ; SetPageMode.
Cmp.b #Zydeco_MinVer,minorVers(A6) ; If this is a Zydeco ROM,
Beq AllDone ; then weÕre done.
Bra.s @SRsrcPatches ; Otherwise, just go on.
@NoDrvr
Suba #SizesPRAMRec,Sp ; Make an sPRAM block on the stack.
Move.l Sp,spResult(A0) ; Point to it.
_sReadPRamRec ; Get pRAM.
Bset #spPageMode,SP_Flags(Sp) ; Tell the PrimaryInit to turn PageMode on,
Beq.s @EnableIt ; if it isnÕt already.
Adda #SizesPRAMRec,Sp ; Otherwise, restore the stack.
Cmp.b #Zydeco_MinVer,minorVers(A6) ; If this is a Zydeco ROM,
Beq AllDone ; then weÕre done.
Bra.s @SRsrcPatches ; Otherwise, just go on.
@EnableIt
Move.l Sp,spsPointer(A0) ; Set up to whack pRam.
_sPutPRAMRec ; Whack it.
Adda #SizesPRAMRec,Sp ; Restore the stack.
Cmp.b #Zydeco_MinVer,minorVers(A6) ; If this is a Zydeco ROM,
Beq AllDone ; then weÕre done.
_sFindDevBase ; Otherwise, get the DAFB baseAddressÉ
Move.l spResult(A0),D0 ; Éinto D0.
Andi.l #$FF000000,D0 ; Strip it of any offsets.
Addi.l #DAFBBase,D0 ; Point to DAFB registers.
Move.l D0,A0 ; Get it into A0.
Moveq #true32b,D0 ; Setup to swap into 32-bit addressing mode.
_SwapMMUMode ; Do swap.
Move.l #1,DAFB_PgMdEn(A0) ; Enable DAFB PageMode (unconditionally).
_SwapMMUMode ; Swap back into previous addressing mode.
;
; Note: If I had the time, I would re-write the following code in a table-driven sort of way.
; But this patch started out small, and I ran out time.
;
@SRsrcPatches
Move.b #0,downSizeSRsrc(A6) ; Genererally, weÕre going from a 'b' to an 'a' sRsrc.
Move.b #1,hasFamilies(A6) ; All the interlaced displays have family members.
Move.l A3,A0 ; Get spBlock ptr back into A0.
Clr.b spSlot(A0) ; We only care about Slot $0.
Clr.b spExtDev(A0) ; (No external device.)
Clr.l spParamData(A0) ; Clear the fNext flag; we want THIS sRsrc.
Bset #foneslot,spParamData+3(A0) ; Limit search to this slot only.
Move.b #sRsrc_Vid_DAFB_RGBFPbx,spID(A0) ; Look for the RGB PortraitÕs sRsrc.
_GetsRsrc ; If we found the RGB Portrait sRsrc,
Beq @SetupForRGBPort ; then do specifics.
Move.b #sRsrc_Vid_DAFB_RGB2Pbx,spID(A0) ; Otherwise, look for VesuvioÕs sRsrc.
_GetsRsrc ; If we found it,
Beq @SetUpForVesuvio ; then do specifics.
Move.b #sRsrc_Vid_DAFB_NTSCSTb,spID(A0) ; Otherwise, look for NTSC STbÕs sRsrc.
_GetsRsrc ; If we found it,
Beq @SetUpForNTSCST ; then do specifics.
Move.b #sRsrc_Vid_DAFB_NTSCSTa,spID(A0) ; Otherwise, look for NTSC STaÕs sRsrc.
_GetsRsrc ; If we found it,
Beq @SetUpForNTSCSTa ; then do specifics.
Move.b #sRsrc_Vid_DAFB_NTSCFFb,spID(A0) ; Otherwise, look for NTSC FFbÕs sRsrc.
_GetsRsrc ; If we found it,
Beq @SetUpForNTSCFF ; then do specifics.
Move.b #sRsrc_Vid_DAFB_NTSCFFa,spID(A0) ; Otherwise, look for NTSC FFaÕs sRsrc.
_GetsRsrc ; If we found it,
Beq @SetUpForNTSCFFa ; then do specifics.
Move.b #sRsrc_Vid_DAFB_PALSTb,spID(A0) ; Otherwise, look for PAL STbÕs sRsrc.
_GetsRsrc ; If we found it,
Beq @SetUpForPALST ; then do specifics.
Move.b #sRsrc_Vid_DAFB_PALSTa,spID(A0) ; Otherwise, look for PAL STaÕs sRsrc.
_GetsRsrc ; If we found it,
Beq @SetUpForPALSTa ; then do specifics.
Move.b #sRsrc_Vid_DAFB_PALFFb,spID(A0) ; Otherwise, look for PAL FFbÕs sRsrc.
_GetsRsrc ; If we found it,
Beq @SetUpForPALFF ; then do specifics.
Move.b #sRsrc_Vid_DAFB_PALFFa,spID(A0) ; Otherwise, look for PAL FFaÕs sRsrc.
_GetsRsrc ; If we found it,
Beq @SetUpForPALFFa ; then do specifics.
Bra AllDone ; Otherwise, just go home.
@SetupForRGBPort
Move.l #DAFBStdOffset,D7 ; Set up for vRam check below.
Move.b #sRsrc_Vid_DAFB_RGBFPb,D6 ; SpID of sRsrc weÕll need to re-insert.
Move.b #0,hasFamilies(A6) ; This configuration has no families.
Bra @DoDrvrChk
@SetupForVesuvio
Move.l #DAFBBSOffset,D7 ; Set up for vRam check below.
Move.b #sRsrc_Vid_DAFB_RGB2Pb,D6 ; SpID of sRsrc weÕll need to re-insert.
Move.b #0,hasFamilies(A6) ; This configuration has no families.
Bra.s @DoDrvrChk
@SetupForNTSCST
Move.l #DAFBNTSCOffset,D7 ; Set up for vRam check below.
Move.b #sRsrc_Vid_DAFB_NTSCSTa,D6 ; SpID of sRsrc weÕll need to re-insert.
Bra.s @DoDrvrChk
@SetupForNTSCSTa
Move.l #DAFBNTSCOffset,D7 ; Set up for vRam check below.
Move.b #sRsrc_Vid_DAFB_NTSCSTb,D6 ; SpID of sRsrc weÕll need to re-insert.
Move.b #1,downSizeSRsrc(A6) ; DownSize instead of upSize sRsrc.
Bra.s @DoDrvrChk
@SetupForNTSCFF
Move.l #DAFBNTSCOffset,D7 ; Set up for vRam check below.
Move.b #sRsrc_Vid_DAFB_NTSCFFa,D6 ; SpID of sRsrc weÕll need to re-insert.
Bra.s @DoDrvrChk
@SetupForNTSCFFa
Move.l #DAFBNTSCOffset,D7 ; Set up for vRam check below.
Move.b #sRsrc_Vid_DAFB_NTSCFFb,D6 ; SpID of sRsrc weÕll need to re-insert.
Move.b #1,downSizeSRsrc(A6) ; DownSize instead of upSize sRsrc.
Bra.s @DoDrvrChk
@SetupForPALST
Move.l #DAFBPALOffset,D7 ; Set up for vRam check below.
Move.b #sRsrc_Vid_DAFB_PALSTa,D6 ; SpID of sRsrc weÕll need to re-insert.
Bra.s @DoDrvrChk
@SetupForPALSTa
Move.l #DAFBPALOffset,D7 ; Set up for vRam check below.
Move.b #sRsrc_Vid_DAFB_PALSTb,D6 ; SpID of sRsrc weÕll need to re-insert.
Move.b #1,downSizeSRsrc(A6) ; DownSize instead of upSize sRsrc.
Bra.s @DoDrvrChk
@SetupForPALFF
Move.l #DAFBPALOffset,D7 ; Set up for vRam check below.
Move.b #sRsrc_Vid_DAFB_PALFFa,D6 ; SpID of sRsrc weÕll need to re-insert.
Bra.s @DoDrvrChk
@SetupForPALFFa
Move.l #DAFBPALOffset,D7 ; Set up for vRam check below.
Move.b #sRsrc_Vid_DAFB_PALFFb,D6 ; SpID of sRsrc weÕll need to re-insert.
Move.b #1,downSizeSRsrc(A6) ; DownSize instead of upSize sRsrc.
; In the TERROR ROM, some sRsrcs are not pruned because vRam is tested incorrectly. So,
; we must ensure that 2 Megs of vRam actually exist. If the driver is already installed,
; then we can get the device baseAddress from the AuxDCE. If it isnÕt installed, then
; we must ask the Slot Manager what it is. A similar, but opposite problem, exists
; on the NTSC/PAL non-convolved displays when going from 2 Megs of RAM down to 1 Meg;
; that is, the 1 Meg sRsrc is not pruned when it should be.
;
; Note: The Nop in the vRAM check below is used because DAFBÕs address space is non-serial,
; and we must have the writes occur before the reads.
;
@DoDrvrChk
Moveq #0,D5 ; Zero out D5 for the refNum.
Move.w spRefNum(A0),D5 ; If we arenÕt the startup screen,
Beq.s @DrvrNotInstalled ; the driver wonÕt be installed.
Move.w D5,D4 ; Save refNum for later.
Not.w D5 ; Otherwise, convert the refNum into
Lsl.w #2,D5 ; a UTable index.
Add.l UTableBase,D5 ; Get a ptr to AuxDCEHandle.
Move.l D5,A0 ; Get it into A0.
Move.l (A0),A0 ; Get the AuxDCEHandle.
Move.l (A0),A0 ; Get the AuxDCEPtr.
Move.l A0,D5 ; Save it for later.
Move.l dCtlDevBase(A0),A0 ; Get the DAFB baseAddress into A0.
Bra.s @DoDAFBVRamChk
@DrvrNotInstalled
_sFindDevBase ; Get the DAFB baseAddressÉ
Move.l spResult(A0),A0 ; Éinto A0.
@DoDAFBVRamChk
Moveq #true32b,D0 ; Setup to swap into 32-bit addressing mode.
_SwapMMUMode ; Do swap.
Sub.l D7,A0 ; Subtract off the offset to get the raw base.
Move.l #'2MEG',(k2MvRAM-4,A0) ; Attempt to write to the last four bytes of bank 3.
Nop ; (See note above.)
Cmp.l #'2MEG',(k2MvRAM-4,A0) ; If there really are 2 Megs of vRam,
Seq D1 ; then say so.
_SwapMMUMode ; Swap back into previous addressing mode.
Tst.b D1 ; If we found 2 Megs, then see
Bne.s @ChkDownSize ; if we need to downSize before leaving.
Tst.b downSizeSRsrc(A6) ; If we think we need to do a downSize
Bne AllDone ; then go home (this is the upSize case).
Bra.s @UpdtSRsrcs ; Otherwise, do upSize updated.
@ChkDownSize
Tst.b downSizeSRsrc(A6) ; If we need to downSize,
Bne.s @UpdtSRsrcs ; then do downSize update.
Bra AllDone ; Otherwise, go home.
; Delete the bad sRsrc and insert a good one.
;
@UpdtSRsrcs
Move.l A3,A0 ; Get the spBlock ptr back into A0.
_sDeleteSRTRec ; Delete the wrong sRsrc.
Move.b D6,spID(A0) ; Say that we want to re-insert the right sRsrc.
Clr.l spsPointer(A0) ; Tell the Slot Manager to look for it in ROM.
Clr.l spParamData(A0) ; And enable it.
_InsertSRTRec
Clr.l spParamData(A0) ; Enable NTSC/PAL disabled sRsrc.
_SetSRsrcState
; Check Slot pRAM. If the depth is set to 16/32bpp, then someone probably had two megs of vRam and
; took them out. In this case, we switch back to 1bpp to be consistent with the other configs
; where a change in memory size forces us back to firstVidMode. We donÕt invalidate the
; 'scrn' resource explicitely so that other displays arenÕt torched.
;
; Note: If weÕre the boot screen and we have to switch from 16/32bpp to 1bpp, the ÒWelcome To MacÓ
; box is going to go away sooner than usual.
;
Suba #SizesPRAMRec,Sp ; Allocate a Slot PRAM record on the stack.
Move.l Sp,spResult(A0) ; Point to it.
_sReadPRAMRec
Tst.l D5 ; If the driver is not installed,
Beq.s @ChkDepth ; just check the depth.
Move.l D5,A0 ; Otherwise get the AuxDCEPtr back into A0, and
Move.b D6,dCtlSlotID(A0) ; update the spID.
Move.l dCtlStorage(A0),A0 ; Get the Handle to DAFB private storage.
Move.l (A0),A0 ; Make it a pointer.
Move.b D6,saveSlotId(A0) ; Update the saved slot ID.
Move.l saveVidPtr(A0),A0 ; Set up to dispose old vidParms ptr.
_DisposPtr ; Dispose it.
Move.l A3,A0 ; Get the spBlock ptr back into A0.
_sRsrcInfo ; Get the spsPointer to the functional sRsrc.
Move.b #sVidParmDir,spID(A0) ; Get the vidParams directory.
_sFindStruct
Move.b D6,spID(A0) ; Get the vidParams.
_sGetBlock
Move.l spResult(A0),-(Sp) ; Save the vidParams ptr on the stack.
Move.l D5,A0 ; Get the AuxDCEPtr back into A0.
Move.l dCtlStorage(A0),A0 ; Get the Handle to DAFB private storage.
Move.l (A0),A0 ; Make it a pointer.
Move.l (Sp)+,saveVidPtr(A0) ; Save the vidParams into the DAFB privates.
@ChkDepth
Move.b SP_Depth(Sp),D0 ; Get the current pixel depth.
Cmp.b #FifthVidMode,D0 ; If itÕs not at 16/32bpp, then
Bne.s @WhackEm ; just whack pRAM.
Move.b #FirstVidMode,SP_Depth(Sp) ; Otherwise, set up pRam for 1bpp.
Tst.l D5 ; If the driver is not installed,
Beq.s @WhackEm ; just whack pRam.
; Set the depth to 1bppÉ
;
Move.w D4,D0 ; Pass the driver refNum in D0.
Move.l #FirstVidMode,D1 ; Pass the vidMode in D1.
Bsr SwitchDepths ; Switch depths by calling our utility.
@WhackEm
Move.l A3,A0 ; Get spBlock ptr back into A0.
Tst.b hasFamilies(A6) ; If this config doesnÕt have families,
Beq.s @NoFamilies ; then just go on.
Move.b D6,SP_LastConfig(Sp) ; Otherwise, set up pRAM for next re-boot.
@NoFamilies
Move.l Sp,spsPointer(A0) ; Set up Slot PRAM block, and
_sPutPRAMRec ; write it out.
Adda #SizesPRAMRec,Sp ; Restore the stack.
Bra AllDone ; Go home.
; In the TERROR ROM, the Bungee (1.1) version of the 4¥8/8¥24 Card ROM is incorrectly patched out.
; This problem occurs because the Trident (1.0/1.0.1) version of the 4¥8/8¥24 Card ROM is a
; subset of the Bungee ROM. However, the Bungee code was used to patch out the Trident (byte-
; lane smearing) problems. Because Trident doesnÕt support PAL displays, that part of the Bungee
; code was removed in the TERROR ROM. This is fine on Trident, but blows up on Bungee because
; none of the PAL sRsrcs are removed, ever. So, what we have to do in the System is to
; remove the non-pruned & unsupported sRsrcs left around by the TERROR ROM version of Bungee
; for both Bungee & Trident. The net side-effect for Bungee is that PAL is no longer
; a valid configuration.
;
; Notes:
; 1) This problem is fixed in the Zydeco ROM and does NOT occur with the CheapDate (1.2)
; version of the 4¥8/8¥24 Card ROM on either the TERROR or Zydeco CPU ROMs.
;
; 2) There is one case in the TERROR ROM that we canÕt patch out. ItÕs pretty obscure,
; but here goes. If a Bungee Card is selected as the boot screen by the TERROR ROMÕs
; Start Manager and there is no monitor connected to that card, the machine will hang.
; A way this can happen, for example, is if someone moves their Bungee Card from
; one slot to another, doesnÕt connect a monitor, and then restarts. Note that if
; the machine didnÕt hang, weÕd still be hosed because we would have to reset the
; entire gDevice world, including rebuilding the dummy gDevice if there are no
; other cards around. But thatÕs starting to get beyond the scope of this file,
; especially in code size! Also, itÕs getting pretty late in the (Regatta) project.
;
; 3) On screens smaller than 640x480, MacsBug gets somewhat confused because the boot
; rectangle is bigger than the final rectangle. Does anyone know how to fix
; this? For Bungee, this is only a problem on Rubik and NTSC underscan
; displays. Luckily, the lowest-numbered unpruned PAL sRsrc is underscan,
; which is 640x480, MacsBugÕs normal, uncentered size.
;
; 4) We canÕt support the NTSC 640x480 (overscan) mode because switching to it from
; Monitors causes the subsequent reboot to crash before we get here. The problem
; is that the unpruned PAL baseAddress is too high for NTSC overscan and, hence,
; causes QuickDraw to bus error. So, we just delete the NTSC overscan sRsrcs so
; they arenÕt seen by Monitors.
;
StartJMFB
Movem.l D3-D7,-(Sp) ; Save work registers.
; Get the boot device info up front so we donÕt have to keep looking.
;
Move.l DeviceList,A0 ; Get the device list Handle.
Move.l (A0),A0 ; Make it a pointer.
Moveq #0,D5 ; Zero out D5 for refNum.
Move.w gdRefNum(A0),D5 ; Get the refNum.
Move.w D5,bootRefNum(A6) ; Save it for later.
Not.w D5 ; Convert the refNum into
Lsl.w #2,D5 ; a UTable index.
Add.l UTableBase,D5 ; Get a ptr to AuxDCEHandle.
Move.l D5,A0 ; Get it into A0.
Move.l (A0),A0 ; Get the AuxDCEHandle.
Move.l (A0),A0 ; Get the AuxDCEPtr.
Move.b dCtlSlot(A0),D4 ; Remember which slot contains the boot device.
Move.l dCtlDriver(A0),bootDrvrHndl(A6) ; Save the Handle to its driver.
Moveq #0,D3 ; Start search from slot 0.
Bra.s @StartSearch
; Find the next Trident/Bungee.
;
@NextSlot Addq #1,D3 ; Seed search with the next slot number.
Cmp.b #$F,D3 ; If weÕre trying to search in a slot ³ $F
Bge.s @ExitJMFB ; then just leave.
@StartSearch
Move.l A3,A0 ; Get the spBlock ptr into A0.
Move.b D3,spSlot(A0) ; Set the slot number to search in.
Clr.b spId(A0) ; Begin at id 0.
Clr.b spExtDev(A0) ; No external device.
Clr.b spTBMask(A0) ; No mask in search.
Move.w #catDisplay,spCategory(A0) ; Look for: Display,
Move.w #typVideo,spCType(A0) ; Video,
Move.w #drSwApple,spDrvrSW(A0) ; Apple,
Move.w #drHwJMFB,spDrvrHW(A0) ; JMFB.
Clr.l spParamData(A0) ; Look only for enabled sRsrcs.
_GetTypeSRsrc ; If we find a Trident/Bungee,
Beq.s @ChkJMFB ; the go check it out.
@ExitJMFB
Movem.l (Sp)+,D3-D7 ; Otherwise, restore work regs
Rts ; and leave.
; We found a Trident/Bungee.
;
@ChkJMFB
Move.b spSlot(A0),D3 ; Save the slot number weÕre on for later.
Cmp.b D4,D3 ; If this isnÕt the boot device,
Bne.s @NoDrvr ; the driver isnÕt loaded.
; Check to see if the boot screen is a Trident/Bungee.
;
Move.l bootDrvrHndl(A6),A0 ; Get Handle to video driver.
Move.l (A0),A0 ; Get pointer to video driver.
Lea drvrName(A0),A0 ; Point to driverÕs name.
Move.l A0,D5 ; Save it for later.
Move.b (A0)+,D0 ; Get the length.
Swap D0 ; Save it.
Lea JMFBVideoTitle,A1 ; Point to the driver name we want.
Move.b (A1)+,D0 ; Get its length.
_CmpString ; Compare the names.
Tst.w D0 ; If they are not equal,
Bne.s @NoDrvr ; then our driver is not installed.
Move.l D5,A0 ; Otherwise, reload A0 with a ptr to our driver name,
Bra.s @ChkVersion ; and check the driver version.
@NoDrvr
_sGetDriver ; If we canÕt load the driver
Bne.s @NextSlot ; then search the next slot.
Moveq #0,D5 ; Flag that the driver is not installed.
Move.l spResult(A0),A0 ; Get Handle to the driver.
Move.l A0,-(Sp) ; Save it (for disposal).
Move.l (A0),A0 ; Get driver pointer.
Lea drvrName(A0),A0 ; Get driver name.
@ChkVersion
Moveq #0,D0 ; Clear D0 (for use as an index).
Move.b (A0),D0 ; Get the length of the driver name.
Addq #2,D0 ; Adjust offset to version field.
Bclr #0,D0 ; Adjust offset for word alignment.
Move.w (A0,D0),D6 ; Save the version number.
Tst.l D5 ; If the driver is already loaded,
Bne.s @ChkIt ; then just go do the check.
Move.l (Sp)+,A0 ; Otherwise, get the driver handle, and
_DisposHandle ; dispose of it.
@ChkIt
Cmp.w #TERRORBungeeVers,D6 ; If this isnÕt TERRORÕs Bungee,
Bne.s @NextSlot ; then search the next slot.
; Make sure weÕve really got a Bungee in this slot & not a Trident.
;
Move.l A3,A0 ; Get the spBlock ptr back into A0.
Move.b D3,spSlot(A0) ; Set the slot number weÕre in.
Move.b #sRsrc_Vid14Au,spID(A0) ; Look for this sRsrc.
Clr.b spExtDev(A0) ; No external device.
Clr.b spTBMask(A0) ; No mask in search.
Move.w #catDisplay,spCategory(A0) ; Look for: Display,
Move.w #typVideo,spCType(A0) ; Video,
Move.w #drSwApple,spDrvrSW(A0) ; Apple,
Move.w #drHwJMFB,spDrvrHW(A0) ; JMFB.
Clr.l spParamData(A0) ; Look only for enabled sRsrcs.
Bset #foneslot,spParamData+3(A0) ; Limit search to this slot only.
_GetSRsrc ; If this is not a Bungee (must be a Trident),
Bne.s @NextSlot ; then search the next slot.
Tst.l D5 ; If the driver is not already loaded,
Beq.s @PruneEm ; then start pruning.
Move.l A4,A0 ; Otherwise, point A0 at the I/O param block.
Move.w bootRefNum(A6),ioRefNum(A0) ; Set the refNum.
_Close ; Close the driver.
@PruneEm
Lea JMFBSRsrcTable,A1 ; Point to the table of unsupported sRsrc IDs.
Move.w (A1)+,D1 ; Load D1 with the size of the table.
Move.l A3,A0 ; Get the spBlock ptr back into A0.
@NextSRsrc Move.b (A1)+,spID(A0) ; Get one of the sRsrc IDs to prune.
Clr.l spParamData(A0) ; Set up to enable any disabled sRsrc.
_SetSRsrcState ; Enable it.
_sDeleteSRTRec ; Prune it.
Dbra D1,@NextSRsrc ; Repeat until done.
Tst.l D5 ; If the driver is not already loaded,
Beq.s @NextSlot ; then search next slot.
Move.b D3,spSlot(A0) ; Set the slot number to search in.
Clr.b spId(A0) ; Begin at id 0.
Clr.b spExtDev(A0) ; No external device.
Move.w #catDisplay,spCategory(A0) ; Look for: Display,
Move.w #typVideo,spCType(A0) ; Video,
Move.w #drSwApple,spDrvrSW(A0) ; Apple,
Move.w #drHwJMFB,spDrvrHW(A0) ; JMFB.
Clr.l spParamData(A0) ; Look only for enabled sRsrcs.
Bset #foneslot,spParamData+3(A0) ; Limit search to this slot only.
_GetTypeSRsrc ; If all the spIDs were not deleted,
Beq.s @CleanupDevice ; then go clean up this gDevice.
; ¥¥¥
_Debugger ; Call 911, weÕre dead. (See note #2 above.)
; ¥¥¥
Bra.s @NextSlot ; Search the next slot.
@CleanupDevice
Move.b spID(A0),D6 ; Save the remaining spID for later.
Suba #SizesPRAMRec,Sp ; Make an sPRAM block on the stack.
Move.l Sp,spResult(A0) ; Point to it.
_sReadPRamRec ; Get pRAM.
Moveq #0,D7 ; Clear D7 (because InitGDevice likes longs).
Move.b SP_Depth(Sp),D7 ; Save the bit depth.
Adda #SizesPRAMRec,Sp ; Restore the stack.
Move.l D5,ioFileName(A4) ; Point to our driver name.
Move.b D3,ioSlot(A4) ; Set the slot number weÕre on.
Move.b D6,ioId(A4) ; Set the sRsrc ID.
Clr.l ioMix(A4) ; No extra data.
Clr.w ioFlags(A4) ; Clear the flags.
Clr.b ioPermssn(A4) ; R/W permissions.
Move.l A4,A0 ; Point A0 at the I/O param block.
_HOpen ; Re-open the video driver.
Subq #2,Sp ; Make a DefVideoRec on the stack.
Move.l Sp,A0 ; Point to it.
_GetVideoDefault ; Get it.
Moveq #0,D0 ; Set up to compare current status with default.
Move.b D3,D0 ; Get the slot number weÕre on.
Lsl.w #8,D0 ; Shift it over.
Move.b D6,D0 ; Get the sRsrc (spID).
Cmp.w (A0),D0 ; If the current status is the default,
Beq.s @SkipReset ; then no need to reset.
Move.b #firstVidMode,D7 ; Otherwise, set up to switch to 1bpp, and
Move.w D0,(A0) ; reset the DefVideoRec for the next reboot.
_SetVideoDefault ; Do it.
@SkipReset Addq #2,Sp ; Clean up the stack.
Move.l Devicelist,A0 ; Get Handle to device list.
Move.l (A0),A0 ; Make it a pointer.
Move.w ioRefNum(A4),D0 ; Get the driverÕs new refNum into D0.
Move.w D0,gdRefNum(A0) ; Update the gDevice with the new refNum.
Clr.l gdMode(A0) ; Make InitGDevice clean up for us.
Move.l D7,D1 ; Push the depth in D1.
Bsr SwitchDepths ; Switch depths using our utility.
Bra.s @NextSlot ; Search the next slot.
EndWith
; Start looking for TFB frame buffer cards on non-TERROR/Zydeco ROM CPUs.
;
StartTFB
MOVE.B #0,spSlot(A3) ;Begin at Slot-0.
CLR.B spId(A3) ;Begin at id-0
CLR.B spExtDev(A3) ;No external device.
CLR.B spTBMask(A3) ;No mask.
MOVE.W #catDisplay,spCategory(A3) ;Look for: Display,
MOVE.W #TypVideo,spCType(A3) ; Video,
MOVE.W #DrSwApple,spDrvrSW(A3) ; Apple,
MOVE.W #DrHwTFB,spDrvrHW(A3) ; TFB.
; Find next video driver of type 'Display_Video_Apple_TFB'.
;
@Repeat
MOVE.L A3,A0
_sNextTypeSRsrc
BNE AllDone
; Check the revision.
;
MOVEQ #0,D5 ;clear the hi half of the register <PB273> DAF
MOVE.W spRefNum(A3),D5 ;Get the refnum.
BEQ.S @Repeat ;if zero, then continue
NOT.W D5 ;Convert it to a unit table index, step 1.
LSL.W #2,D5 ;Convert it to a unit table index, step 2.
ADD.L UTableBase,D5 ;Saved pointer to video driver entry.
MOVE.L D5,A0 ;Pointer to video driver entry.
MOVE.L (A0),A0 ;Get handle to DCE.
MOVE.L (A0),A0 ;Get pointer to DCE.
MOVE.L A0,D6 ;Save pointer to DCE.
MOVE.L dCtlDriver(A0),A0 ;Get handle to driver.
MOVE.L A0,D4 ;Save handle to driver.
MOVE.L (A0),A0 ;Get pointer to driver.
LEA drvrName(A0),A0 ;Point to the driver name.
; Compare the driver names so we don't kill the stupid SuperMac card that thinks it's a TFBÉ
;
MOVEQ #0,D0 ;Prepare D0.
MOVE.B (A0),D0 ;Get the length of the driver name.
MOVE.W D0,D1 ;make a copy <1.4>
ADDQ #2,D1 ;Adjust offset to version field (len + 1)
BCLR #0,D1 ;Adjust offset for Word alignment.
MOVE.W (A0,D1.W),D1 ;Get the version number
CMP.W #CurTFBDrvrVersion,D1 ;Check version.
BGE.S @Repeat ;Branch if current version is greater or same.
SWAP D0 ; get 1st str length in hi word <SXXX/28Oct87> DAF
Addq #1,A0 ; point to text of driver name (skip length byte).
LEA TFBVideoTitle,A1 ; get pointer to video title <SXXX/28Oct87> DAF
MOVE.B (A1)+,D0 ; get 2nd str length in lo word <SXXX/28Oct87> DAF
_CmpString ; are they equal? (case-insensitive)
TST D0 ; test result
BNE.S @Repeat ; different name, so continue search
; Search device list for this driver.
;
MOVE.L DeviceList,A1 ;Get head of device list.
MOVE.L A1,D7 ;Save handle to first entry.
MOVE.L (A1),D0 ;Point to the first entry in the list.
BEQ AllDone ;Done if empty list.
@10 MOVE.L D0,A1 ;Put ptr in A1.
MOVE.W spRefNum(A3),D0 ;Get RefNum.
CMP.W GDRefNum(A1),D0 ;Have we found the RefNum?
BEQ.S @GetPStorage ;Branch if found.
MOVE.L GDNextGD(A1),D7 ;Save handle to next GD.
BEQ.S @Repeat ;Branch if no more GD's.
MOVE.L D7,A1 ;Put ptr in A1.
MOVE.L (A1),D0 ;Point to GD.
BEQ.S @Repeat ;Branch if no more GD's.
BRA.S @10 ;Continue looking for RefNum.
; Get the necessary private storage.
;
@GetPStorage
MOVE.L D6,A0 ;Pointer to DCE.
MOVE.L dCtlStorage(A0),A0 ;Handle to private storage.
MOVE.L (A0),A0 ;Pointer to private storage.
MOVE.W saveMode(A0),sMode(A6) ;Save the mode.
MOVE.W savePage(A0),sPage(A6) ;Save the Page.
MOVE.W GFlags(A0),sGFlags(A6) ;Save the GFlags.
MOVE.L GammaPtr(A0),A1 ;Get the GammaPtr.
MOVE.L saveSQElPtr(A0),sSQEl(A6) ;get the slot interrupt queue pointer <1.3>
MOVE.L A1,A0 ; copy the gamma ptr
_GetPtrSize ; get the size of the current table
MOVE.L D0,D1 ; make a copy of it
_NewPtr ,SYS ; allocate another ptr of that size in sys
BNE @Repeat ;Branch if error
MOVE.L D1,D0 ; get the gamma table size again
EXG A0,A1 ; copy the gamma table
_BlockMove ; duplicate it
BNE @Repeat ;
MOVE.L A1,sGammaPtr(A6) ;Save the GammaPtr
; Since the gamma data in the boot driver is still inverted, invert the data in place
;
MOVE.W GFormulaSize(A1),D0 ; get the size of the formula data
MOVE.W GChanCnt(A1),D1 ; get the number of channels
SUBQ #1,D1 ; adjust for DBRA
ADDA #GFormulaData,A1 ; point to formula data
ADDA D0,A1 ; advance to gamma data
@ChanLoop MOVE.W #255,D0 ; loop count within each channel
@entryLoop NOT.B (A1)+ ; invert the values
DBRA D0,@entryLoop ; for each entry in channel
DBRA D1,@ChanLoop ; and each channel
; Close and dispose of the driver.
;
MOVE.L D7,A1 ;Restore A1.
MOVE.L (A1),A1 ; get pointer <!!!DAF>
CLR.L ioCompletion(A4) ;No completion routine.
MOVE.W GDRefNum(A1),ioRefNum(A4) ;The device RefNum.
MOVE.L A4,A0 ;Set A0 for use by ioCore.
_Close ;Close the driver.
BNE @Repeat ;Branch if error.
MOVE.L sSQEl(A6),A0 ;deallocate the slot interrupt queue elem <1.3>
MOVEQ #0,D0 ;clear the register <1.3>
MOVE.B spSlot(A3),D0 ;get slot number in D0 <1.3>
_SIntRemove ;take it out of the queue <1.3>
MOVE.L D4,A0 ;Get handle to driver.
_DisposHandle ;Dispose of the driver.
MOVE.L D5,A1 ;Get ptr to UT entry.
MOVE.L (A1),A0 ;Get handle to DCE.
_DisposHandle ;Dispose of the DCE.
CLR.L (A1) ;Clear entry in UT.
LEA TFBVideoTitle,A1 ;Get the name of the driver.
MOVE.L A1,ioFileName(A4) ;Set parameter.
MOVE.B spSlot(A3),ioSlot(A4) ;Slot and
MOVE.B spId(A3),ioId(A4) ;sResource Id.
CLR.L ioMix(A4) ;No extra data.
CLR.W ioFlags(A4) ;Clear the flags.
CLR.B ioPermssn(A4) ;R/W permissions.
MOVE.L A4,A0 ;Set A0 for use by ioCore.
_HOpen ;Open the video driver, using the extended parameter block. <C208>
MOVE.L D7,A0 ;Handle to the GDev.
MOVE.L (A0),A0 ;Pointer to the GDev.
MOVE.W ioRefNum(A4),GDRefNum(A0) ;Save the new RefNum.
; Detach the resource and restore the private storage.
;
MOVE.W ioRefNum(A4),D0 ;Get the refnum.
EXT.L D0 ; <!!!DAF>
NOT.L D0 ;Convert it to a unit table index, step 1.
LSL.L #2,D0 ;Convert it to a unit table index, step 2.
ADD.L UTableBase,D0 ;Saved pointer to video driver entry.
MOVE.L D0,A0 ;Pointer to video driver entry.
MOVE.L (A0),A0 ;Get handle to DCE.
MOVE.L (A0),A0 ;Get pointer to DCE.
MOVE.L A0,-(SP) ;Save A0
MOVE.L dCtlDriver(A0),-(SP) ;Get handle to driver.
_DetachResource ;Detach it.
MOVE.L (SP)+,A0 ;Restore A0
MOVE.L dCtlStorage(A0),A0 ;Handle to private storage.
MOVE.L (A0),A0 ;Pointer to private storage.
MOVE.W sMode(A6),saveMode(A0) ;Restore the mode.
MOVE.W sPage(A6),savePage(A0) ;Restore the Page.
MOVE.W sGFlags(A6),GFlags(A0) ;Restore the GFlags.
MOVE.L GammaPtr(A0),A1 ;Get the new gammaPtr.
MOVE.L sGammaPtr(A6),GammaPtr(A0) ;Restore the original gamma table.
MOVE.L A1,A0 ;Prepare to dispose of new gamma table.
_DisposPtr ;Dispose it.
BRA @Repeat ;Continue loop.
; Clean up and go home.
;
AllDone
ADD.W #IOQElSize+spBlockSize+12,SP ;Deallocate parameter blocks.
MOVEM.L (SP)+,A2-A4/D4-D7 ;Restore registers.
UNLK A6 ;Deallocate stack frame.
ENDWITH