mac-rom/DeclData/DeclVideo/CSC/CSCPrimaryInit.a
Elliot Nunn 0ba83392d4 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-09-20 18:04:16 +08:00

803 lines
31 KiB
Plaintext

;
; File: CSCPrimaryInit.a
;
; Written by: Mike Puckett, December 20, 1992.
;
; Copyright: © 1991-1993 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM2> 12/13/93 PN Roll in KAOs and Horror changes to support Malcom and AJ
; machines
; <1> 01-12-93 jmp first checked in
; <H2> 01-05-93 jmp Added some temporary family modes to test out 16bpp.
; <1> 12-23-92 jmp first checked in
PRINT OFF
LOAD 'StandardEqu.d'
INCLUDE 'HardwarePrivateEqu.a'
INCLUDE 'ROMEqu.a'
INCLUDE 'Video.a'
INCLUDE 'SlotMgrEqu.a'
INCLUDE 'SonicEqu.a'
INCLUDE 'UniversalEqu.a'
INCLUDE 'DockingEqu.a'
INCLUDE 'PowerPrivEqu.a'
INCLUDE 'DepVideoEqu.a'
PRINT ON
SEG '_sCSCPrimaryInit'
BLANKS ON
STRING ASIS
MACHINE MC68020
CSCPrimaryInit Main Export
;---------------------------------------------------------------------
; Header
;---------------------------------------------------------------------
Dc.b sExec2 ; Header
Dc.b sCPU68020
Dc.w 0
Dc.l BeginCSCInit-*
;---------------------------------------------------------------------
; Local variables, definitions, etc....
;---------------------------------------------------------------------
With SEBlock,SPBlock
CSCFrame Record {A6Link},Decrement
Return Ds.l 1 ; Return address.
A6Link Ds.l 1 ; Saved A6.
spBlk Ds SPBlock ; SpBlock for generic use.
sPRAMBlk Ds.b SizeSPRAMRec ; sPRAMRec for generic use.
configParamsPtr Ds.l 1 ; Pointer to configruation parameters.
vidParamsPtr Ds.l 1 ; Pointer to video parameters.
mscBaseAddr Ds.l 1 ; DonÕt want to look up MSCÕs address more than once.
prodID Ds.b 1 ; For easily distinguishing between products.
disableLCD Ds.b 1 ; When true, weÕre shutting the LCD down.
CSCFSize Equ *
Endr
Endwith
CSCProdCnfgRec Record 0 ;
memConfig Ds.b 1 ; Physical VRAM configuration type.
refreshRate Ds.b 1 ; The desired refresh rate.
vramControl Ds.b 1 ; CPU/VRAM interface control.
Ds.b 1 ; <pad>
CSCProdCnfgSize Equ *
Endr
CSCVRAMCnfgRec Record 0 ;
sRsrcID Ds.b 1 ; sRsrc ID for this VRAM configuration.
modeID Ds.b 1 ; Favored modeID (depth).
boxID Ds.b 1 ; BoxFlag to write out.
Ds.b 1 ; <pad>
familiesOffset Ds.w 1 ; Offset to family mode table.
CSCVRAMCnfgSize Equ *
Endr
With MiniGamma,CSCVRAMCnfgRec
CSCCnfgRec Record 0
gammaTbl Ds.b GT_Size ; Mini-gamma table (defined in PrimaryInit.a).
CSCCnfgHdrSize Equ *
csc512KVRAM Ds.b CSCVRAMCnfgSize ; 512K vRAM preferences.
CSCCnfgRecSize Equ *
Endr
CSCCnfgTblSize Equ (8*CSCCnfgRec.CSCCnfgRecSize) ; 0..7 (8) Panel IDs per table.
Endwith
;---------------------------------------------------------------------
; Utils
;---------------------------------------------------------------------
;---------------------------------------------------------------------
;
; PruneList
;
; Loops thru a table of sRsrcIDs comparing the ÒkeeperÓ with each
; of the entries in the table. Those IDs that donÕt match
; the keeper are pruned.
;
; -> D0: sRsrcID of the ÒkeeperÓ
; -> A0: pointer to appropriately filled-out SpBlock
; -> A1: pointer to list of sRsrcIDs
;
; Trashes: D0-D1/A1.
;
With SpBlock
CSCPruneList
Move.b D0,-(Sp) ; Remember the ID of the Òkeeper.Ó
Move.w (A1)+,D1 ; Get the zero-based counter into D1.
@Repeat Move.b (A1)+,D0 ; Get an sRsrc ID.
Cmp.b (Sp),D0 ; If itÕs the keeper,
Beq.s @Until ; then donÕt prune it.
Move.b D0,spID(A0) ; Otherwise, prune it.
_sDeleteSRTRec
@Until Dbra D1,@Repeat ; Loop until done.
Tst.b (Sp)+ ; Clean up the stack.
Rts ; Return to caller.
Endwith
;---------------------------------------------------------------------
;
; BuildFamilyList
;
; Loops thru a table of sRsrcIDs comparing the ÒkeeperÓ with each
; of the entries in the table. Those IDs that donÕt match
; the keeper are inserted back in as disabled.
;
; -> D0: sRsrcID of the ÒkeeperÓ
; -> A0: pointer to appropriately filled-out SpBlock
; -> A1: pointer to list of sRsrcIDs
;
; Trashes: D0-D1/A1.
;
With SpBlock
CSCBuildFamilyList
Move.b D0,-(Sp) ; Remember the ID of the Òkeeper.Ó
Move.w (A1)+,D1 ; Get the zero-based counter into D1.
@Repeat Move.b (A1)+,D0 ; Get an sRsrc ID.
Cmp.b (Sp),D0 ; If itÕs the keeper,
Beq.s @Until ; then leave it alone.
Move.b D0,spID(A0) ; Otherwise, load that sRsrc ID.
Clr.l spsPointer(A0) ; Tell the Slot Manager that itÕs in ROM.
Move.l #1,spParamData(A0) ; Say that we want it disabled.
Clr.w spRefNum(A0) ; Say that thereÕs no driver yet.
_InsertSRTRec ; Do it!
@Until Dbra D1,@Repeat ; Loop until done.
Tst.b (Sp)+ ; Clean up the stack.
Rts ; Return to caller.
Endwith
;---------------------------------------------------------------------
; Main
;---------------------------------------------------------------------
With SEBlock,SPBlock,CSCFrame
BeginCSCInit
;
; Set up initial ÒvendorÓ status.
;
Link A6,#CSCFSize ; Allocate stack space for locals.
Move.w #seSuccess,seStatus(A0) ; Just say that weÕre okay.
;
; Perform some generic initializations.
;
Clr.b spBlk.spSlot(A6) ; Built-in video is always Slot $0.
Clr.b spBlk.spExtDev(A6) ; Why ask why? Just clear this guy.
Move.l UnivInfoPtr,A4 ; Keep a pointer to ProductInfo.
;
; Initialize the BoardID part of the Slot $0 pRAM if necessary, and prune the board sResources.
;
With SP_Params,ProductInfo,VideoInfo
Lea spBlk(A6),A0 ; Point A0 at our local SpBlock.
Lea sPRAMBlk(A6),A2 ; Get a pointer to our local SPRAMBlock.
Move.l A2,spResult(A0) ; Put our pointer in the SpBlock.
_sReadPRAMRec ; Read Slot $0Õs pRAM.
Move.l A4,A3 ; Copy the ProductInfo pointer.
Adda.l VideoInfoPtr(A3),A3 ; Point to the VideoInfo record.
Tst.w SP_BoardID(A2) ; If the board ID is non-zero,
Bne.s @PruneBoardSRsrc ; then just go on.
Move.b BoardSRsrcID(A3),spID(A0) ; Get the appropriate board sRsrc ID.
_sRsrcInfo ; Get the spsPointer.
Move.b #BoardID,spID(A0) ; Set up to get the correct board ID.
_sReadWord ; Get it.
Move.w spResult+2(A0),SP_BoardID(A2) ; Save the board ID into pRAM.
Move.l A2,spsPointer(A0) ; Point to the pRAM param block.
_InitSlotPRAM ; Write it out.
@PruneBoardSRsrc
Lea CSCSpIDTbl,A1 ; Point to the table of supported board sRsrcs.
Move.b BoardSRsrcID(A3),D0 ; Get the sRsrc ID of the keeper into D0.
Move.b D0,prodID(A6) ; (Remember the sRsrc ID for later.)
Bsr.s CSCPruneList ; Call our pruning utility.
;
; Set up the right CPU sResource. We only recognize Õ030 and Õ040 CPUs; all others
; are ignored (i.e., the CPU sResources are all deleted in that case).
;
Move.b CPUFlag,D1 ; Get the CPUFlag (680x0-flag) for compares.
Lea @CPUTable,A1 ; Get pointer to the table of valid CPU types.
@CPULoop Move.b (A1)+,D0 ; Pick up the next CPU type.
Beq.s @EndPruneCPUSRsrcs ; If weÕre done, leave.
Move.b (A1)+,spID(A0) ; Assume we wonÕt find a match.
Cmp.b D0,D1 ; But, if they do match,
Beq.s @SkipDelete ; then just go on.
_sDeleteSRTRec ; Otherwise, delete non-matching CPU sRsrc type.
@SkipDelete Bra.s @CPULoop ; And loop until done.
@CPUTable Dc.b cpu68030,sRsrc_CPUMac030
Dc.b cpu68040,sRsrc_CPUMac040
Dc.b 0,0
@EndPruneCPUSRsrcs
;
; HereÕs where we actually get the CSC video going, or we decide whether to just shut
; things down. WeÕll end up shutting things down if we either donÕt recognize the
; type of LCD attached (which is highly unlikely, since the LCDs are built-in), or
; the LCD is currently in an unuseable state. For example, Escher could be
; docked into a Gemini or an Atlantis, or, in BlackbirdÕs case, the lid could
; just be closed.
;
CSCVideoInit
Clr.l vidParamsPtr(A6) ; DonÕt try to throw away non-existent storage.
; Get some useful values up front.
;
Movea.l A4,A3 ; Copy the ProductInfo pointer.
Adda.l ProductInfo.DecoderInfoPtr(A3),A3 ; Point to the base address table.
Movea.l DecoderInfo.VDACAddr(A3),A3 ; Get the CSC base address into A3.
; First, disable the video interrupts sources as well as the power planes.
;
TestFor MSCChipBit ; If we donÕt have an MSC,
Beq.s @NoMSC ; then just go on.
Movea.l A4,A2 ; Copy the ProductInfo pointer.
Adda.l ProductInfo.DecoderInfoPtr(A2),A2 ; Point to the BaseAddr table.
Movea.l DecoderInfo.RBVAddr(A2),A2 ; Point to the MSCÕs base address.
Move.l A2,mscBaseAddr(A6) ; Save it for later.
Move.b #(0<<ifIRQ)|(1<<RvIRQ0En),MSCSlotIER(A2) ; Disable CSC interrupts.
Bclr #MSCLCDReset,MSCClkCntl(A2) ; Turn off CSC clock inputÉ
_CSCMinDelay ; Éwait for at least 32 PixClks, and
Bset #MSCLCDReset,MSCClkCntl(A2) ; Éturn CSC clock input back on to complete reset.
@NoMSC
Clr.b CSCDisplayStatus(A3) ; Disable CSC interrupt source.
Clr.b CSCPanelSetup(A3) ; Disable the panel power.
; Size the amount of VRAM. When done, D4 is set to one of {0,1}, where 0=512K,1=1024K.
; (Note: CSC supports a variety of VRAM types and configuration. At the moment,
; though, weÕll just simply say thereÕs 512K.)
;
;
With CSCProdCnfgRec
Lea CSCProdTable,A1 ; Point to the CSC ProductTable.
Move.w #CSCProdCnfgSize,D0 ; Get the size of each entry into D0.
Moveq #0,D1 ; Clear D1 for good measure.
Move.b prodID(A6),D1 ; Get the product ID.
Subq #1,D1 ; Normalize it.
Mulu D1,D0 ; Multiply by the right entry.
Adda.w D0,A1 ; Skip to the entry we want.
Move.b memConfig(A1),CSCMemConfig(A3) ; Set up for the right VRAM configuration.
Move.b refreshRate(A1),CSCRefreshRate(A3) ; Set up the refresh rate.
Move.b vramControl(A1),CSCVRAMControl(A3) ; Interface the VRAM correctly to the CPU.
Moveq #0,D4 ; Just say thereÕs 512K of VRAM for now.
Endwith
; Sense the type of panel to drive. For now, we have no extended-sense panels, so we just
; do a passive read of the panel senselines.
;
Moveq #0,D6 ; Initialize the senseline register.
Move.b #tristateCSC,CSCPanelIDControl(A3) ; Make the senselines inputs.
_CSCMinDelay ; Wait a moment.
Move.b CSCPanelID(A3),D6 ; Read Õem.
; Pick up the favored configuration based on the amount of VRAM and the type of display sensed or assumed.
;
With CSCVRAMCnfgRec,CSCCnfgRec
Lea CSCConfigTable,A1 ; Point to the CSC configuration table.
Move.w #CSCCnfgTblSize,D0 ; Get the size of each table into D0.
Moveq #0,D1 ; Clear D1 for good measure.
Move.b prodID(A6),D1 ; Get the product ID.
Subq #1,D1 ; Normalize it.
Mulu D1,D0 ; Multiply by the right entry.
Adda.w D0,A1 ; Skip to the entry we want.
Move.w #CSCCnfgRecSize,D0 ; Get the size of each entry into D0.
Mulu D6,D0 ; Multiply it by the right entry.
Adda.w D0,A1 ; Skip to the entry we want.
Move.l A1,configParamsPtr(A6) ; Save it for later.
Adda.w #CSCCnfgHdrSize,A1 ; Skip past the header.
Move.w #CSCVRAMCnfgSize,D0 ; Get the size of the VRAM entries.
Mulu D4,D0 ; Multiply by the right entry.
Adda.w D0,A1 ; Skip to the right VRAM entry.
Move.b modeID(A1),D7 ; Get the default mode (depth).
Move.b sRsrcID(A1),D5 ; Get the default sRsrcID.
Cmp.b #sRsrc_CSC_NeverMatch,D5 ; If weÕve come up with an unknown configuration, <K18>
Beq.s @NoAdjustBoxflag ; then skip boxflag adjustment. <K18>
Move.b boxID(A1),BoxFlag ; Set the BoxFlag value based on the PanelID.
@NoAdjustBoxflag
Endwith
; Next, check to see whether or not we should even bring up the CSC.
;
WITH PMgrRec, pmCommandRec
Movea.l PMgrBase,A2 ; point to Power Manager variables
Bclr #ignoreClamshell,PmgrFlags3(A2) ; reset ignore clamshell
Subq #4,Sp ; Make room for the docking result.
Move.l #dockDockingAttr,-(Sp) ; Say that we want the attributes.
Clr.l -(Sp) ; No params.
_DockingDispatch ; Call the Docking Manager.
Move.l (Sp)+,D0 ; Get the attributes.
Btst #dockNoLCDScreen,D0 ; Find out if the LCD is in a useable state.
Beq.s @ClamLook ; can use LCD, but check clamshell first
Bra.s @ClamDone ; set the flag to ignore LCD
;------------------------------------------------------------------------------------------------------ <H28>
; this code checks to see if we're docked, if we have external video, and if the clamshell is closed: |
; in such a case, we want to allow the system to boot on the external monitor but disable the internal v
; monitor and ignore the state of the clamshell switch
@ClamLook Subq.w #4,SP ; result
Move.l #dockHardwareAttr,-(SP) ; docking selector = get hardware attributes
Clr.l -(SP) ; params = nil
_DockingDispatch ; call the handler
Move.l (SP)+,D0
Btst #dockHasVideo,D0 ; do we have external video power?
Beq.s @EndDockChk ; nope, so skip case to ignore clamshell
Clr.w -(SP)
Move.l SP,-(SP) ; pmRBuffer
Move.l (SP),-(SP) ; pmSBuffer
Clr.w -(SP) ; pmLength = 0
Move.w #readExtSwitches,-(SP) ; pmCommand
Movea.l SP,A0 ; point to the parameter block
_PMgrOp ; get the clamshell info
Lea pmRBuffer+4(SP),SP ; toss the parameter block
Btst #clamshell,(SP)+ ; is the clamshell closed?
Beq.s @EndDockChk ; -> nope, all done
Bset #ignoreClamshell,PmgrFlags3(A2) ; set ignore clamshell
@ClamDone St disableLCD(A6) ; don't use internal LCD
Move.b #sRsrc_CSC_NeverMatch,D5 ; Make sure all the sResources get pruned.
Bra @SetConfig ; Skip the dynamic config code.
@EndDockChk
;------------------------------------------------------------------------------------------------------ <H28>
ENDWITH
; Initialize built-in videoÕs pRAM.
;
With SP_Params
@InitPRAM
Lea sPRAMBlk(A6),A2 ; Point to the sPRAM block.
Move.b SP_Flags(A2),D0 ; Copy the flags byte.
Bfins D4,D0{spVRamBits:numSPVRamBits} ; Load the amount of VRAM.
Move.b D0,SP_Flags(A2) ; Remember how much VRAM we setup for.
Bclr #spFamilyChanged,SP_Flags(A2) ; Always reset the family-changed bit.
Beq.s @EndScrnChk ; If it was already reset, then just go on.
Move.w #drHwCSC,ScrnInval ; Remind ourselves to manually update the 'scrn' resource (so disk can make things right).
@EndScrnChk Move.b D6,SP_MonID(A2) ; Remember which panel we sensed (or assumed).
Cmp.b SP_DfltConfig(A2),D5 ; If this is the same configuration/family we had last time,
Beq.s @WritePRAM ; then just write out the minimal pRAM info.
Move.b D5,SP_LastConfig(A2) ; Set the identification configuration.
Move.b D5,SP_DfltConfig(A2) ; Set the default/family configuration.
Move.b D7,SP_Depth(A2) ; Set the default depth for this configuration.
@WritePRAM Lea spBlk(A6),A0 ; Point to the slot param block.
Move.l A2,spsPointer(A0) ; Set up the pRAM parameter block.
_sPutPRAMRec ; Write out Slot $0Õs pRAM.
Move.b SP_LastConfig(A2),D5 ; Get the right (family member) sRsrc into D5.
Endwith
; First, prune all of the video sResources except for the selected one. If there are no families, then weÕre done.
; Otherwise, weÕre either done (because weÕve come up with an unknown configuration), or we re-insert all the members
; of the selected configurationÕs family as disabled.
;
With CSCVRAMCnfgRec,CSCCnfgRec
@SetConfig
Lea spBlk(A6),A0 ; Point A0 at our local SpBlock.
Lea CSCModeList,A1 ; Point to the table of supported video sRsrcs.
Move.b D5,D0 ; Get the sRsrcID of the keeper into D0.
Bsr CSCPruneList ; Call our pruning utility.
Cmp.b #sRsrc_CSC_NeverMatch,D5 ; If weÕve come up with an unknown configuration,
Beq CSCExit ; then weÕre now done.
Move.l configParamsPtr(A6),A1 ; Point to this configÕs parameters.
Adda.w #CSCCnfgHdrSize,A1 ; Skip past the header.
Move.w #CSCVRAMCnfgSize,D0 ; Get the size of the VRAM entries.
Mulu D4,D0 ; Multiply by the right entry.
Adda.w D0,A1 ; Skip to the right VRAM entry.
Move.w familiesOffset(A1),D0 ; If there arenÕt any families,
Beq.s @EndConfig ; then just go on.
Move.l configParamsPtr(A6),A1 ; Point back to this configÕs parameters.
Adda.w D0,A1 ; Point to the table of supported families.
Move.b D5,D0 ; Get the sRsrcID of the keeper into D0.
Bsr CSCBuildFamilyList ; Call our family-building utility.
@EndConfig
Endwith
; Initialize the video hardware.
;
With CSCVidParams,MiniGamma
Clr.w spID(A0) ; Start looking at spID 0, no external devices.
Clr.b spTBMask(A0) ; Only look for the board sRsrc.
Move.w #catBoard,spCategory(A0) ; Look for: catBoard,
Move.w #typBoard,spCType(A0) ; typBoard,
Clr.w spDrvrSW(A0) ; 0,
Clr.w spDrvrHW(A0) ; 0.
Clr.l spParamData(A0) ; (The board sRsrc must be enabled.)
Bset #foneslot,spParamData+3(A0) ; Limit search to this slot 0.
_GetTypeSRsrc ; Get the spsPointer.
Move.b #sVidParmDir,spID(A0) ; Look for the video parameters directory.
_sFindStruct
Move.b D5,spID(A0) ; Look in the directory for this configÕs params.
_sGetBlock
Move.l spResult(A0),A1 ; Get a pointer to the vidParams.
Move.l A1,vidParamsPtr(A6) ; Save for later disposal.
; Set up the CSC and the Palette (if necessary).
;
Move.b cscvpPanelType(A1),CSCPanelType(A3) ; Set up for the attached panel.
Move.b cscvpPanelSetup(A1),CSCPanelSetup(A3) ;
Move.b cscvpDataOutForm(A1),CSCDataOutputForm(A3) ; Set up the framebuffer.
Move.b cscvpGFRCControl(A1),CSCFRCControl(A3) ;
Move.b cscvpGPolyMAdj(A1),CSCPolyMAdj(A3) ;
Move.b cscvpGPolyNAdj(A1),CSCPolyNAdj(A3) ;
Move.b cscvpHSkewHi(A1),CSCHSkewHi(A3) ; Set up the H/V timing.
Move.b cscvpHSkewLo(A1),CSCHSkewLo(A3) ;
Move.b cscvpVSkewHi(A1),CSCVSkewHi(A3) ;
Move.b cscvpVSkewLo(A1),CSCVSkewLo(A3) ;
Move.b cscvpACDClkHi(A1),CSCACDClkHi(A3) ; Set up the clocking.
Move.b cscvpACDClkLo(A1),CSCACDClkLo(A3) ;
Move.b cscvpLPStart(A1),CSCLPStart(A3) ;
Move.b cscvpLPWidth(A1),CSCLPWidth(A3) ;
Move.b cscvpFLMControl(A1),CSCFLMControl(A3) ;
Clr.b CSCDisplayDataForm(A3) ; Set the panel into 1-bpp mode.
Clr.b CSCGTweak(A3) ; Clear the GTweak register.
Cmpi.b #sRsrc_Vid_CSC_G_D_STN_400,D5 ; If weÕre on a fixed panel,
Beq.s @STNTweak ; then just go gray the screen.
Cmpi.b #sRsrc_Vid_CSC_G_D_STN_400y,D5 ;
Beq.s @STNTweak ;
Cmpi.b #sRsrc_Vid_CSC_G_D_STN_480,D5 ;
Beq.s @STNTweak ;
Cmpi.b #sRsrc_Vid_CSC_G_S_TFT_400,D5 ;
Beq.s @TFTTweak ;
Cmpi.b #sRsrc_Vid_CSC_G_S_TFT_400y,D5 ;
Beq.s @TFTTweak ;
Move.b #CSCNoMask,CSCMaskReg(A3) ; Enable all video data in the Palette.
Move.l A3,A2 ; Copy the base address of CSC.
Adda.w #CSCDataReg,A2 ; Point to the Palette data register.
Move.l configParamsPtr(A6),A5 ; Point to the config parameters.
Move.b #$00,CSCAddrRegW-CSCDataReg(A2) ; Setup to write 1bpp white.
Move.b whiteRed(A5),(A2) ; Write: Red,
Move.b whiteGreen(A5),(A2) ; Green,
Move.b whiteBlue(A5),(A2) ; Blue.
Move.b #$80,CSCAddrRegW-CSCDataReg(A2) ; Setup to write 1bpp black.
Move.b blackRed(A5),(A2) ; Write: Red,
Move.b blackGreen(A5),(A2) ; Green,
Move.b blackBlue(A5),(A2) ; Blue.
Bra.s @GrayScreen ;
; Gray the VRAM.
;
@TFTTweak Bset #CSCInvertVRAM,CSCGTweak(A3) ; Invert the VRAM data (for double blacks).
@STNTweak Bset #CSCBetterDither,CSCGTweak(A3) ; Make the dither patterning look better!
@GrayScreen Movea.l A4,A2 ; Copy the ProductInfo pointer.
Adda.l ProductInfo.VideoInfoPtr(A2),A2 ; Point to the VideoInfo record.
Move.l VideoInfo.VRAMLogAddr32(A2),A2 ; Point to the base of VRAM.
Moveq #true32b,D0 ; Set up to flip into 32-bit addressing mode.
_SwapMMUMode ; Do flip.
Move.b D0,-(Sp) ; Save previous addressing mode.
Move.w cscvpNumRows(A1),D3 ; Get the number of rows.
Move.w D3,D0 ; Remember them.
Move.l #OneBitGray,D2 ; Set the 1bpp gray pattern.
@NxtRow Move.w #(OBMLCDRB/4-1),D1 ; Get the number of longwords/row.
@NxtLong Move.l D2,(A2)+ ; Write out gray to the frame bufferÉ
Dbra D1,@NxtLong ; Éfor each scanline.
Not.l D2 ; Invert the pattern for the next row.
Dbra D3,@NxtRow ; Repeat for each row.
Cmpi.w #(defmBounds_BLCD-1)-1,D0 ; If weÕre not doing the 16bpp Ò400-lineÓ panel,
Bne.s @SwapBack ; then just go on.
Moveq #IndexedBlack,D2 ; Set up to write out black to the bottom-most line.
Move.w #(OBMLCDRB/4-1),D1 ; Get the number of longwords/row.
@LastLine Move.l D2,(A2)+ ; Write out black to the last line ofÉ
Dbra D1,@LastLine ; Éto whole last line.
@SwapBack Move.b (Sp)+,D0 ; Set up to flip back to previous addressing mode.
_SwapMMUMode ; Do flip.
Move.b #CSCUnblank,CSCDisplayStatus(A3) ; Unblank the video display.
Bset #CSCPnlPwr,CSCPanelSetup(A3) ; Turn on the power.
_CSCMaxDelay ; Wait 50 ms.
Endwith
; Now that the CSC is set up (i.e., either fully programmed for the attached LCD, or is
; completely shutdown), we need to make sure that the panelÕs backlighting is
; appropriately set up.
;
CSCExit
TestFor MSCChipBit ; If we donÕt have an MSC,
Beq.s @NoMSC ; then just go on.
Movea.l mscBaseAddr(A6),A0 ; Get the MSC base address.
Tst.b disableLCD(A6) ; If weÕll be using the LCD screen,
Beq.s @UseLCD1 ; then just go on.
Bclr #MSCLCDReset,MSCClkCntl(A0) ; Otherwise, turn off CSC clock input.
Bra.s @Dont ; And keep the CSC interrupts off.
@UseLCD1 Move.b #(1<<ifIRQ)|(1<<RvIRQ0En),MSCSlotIER(A0) ; Allow CSC interrupts to occur.
@Dont
@NoMSC Moveq #screenOn-256,D0 ; Assume weÕll be using the LCD.
Tst.b disableLCD(A6) ; If we are, then
Beq.s @UseLCD2 ; just go on.
Moveq #screenOff,D0 ; Otherwise, say that weÕre shutting it down.
@UseLCD2
Move.b D0,-(Sp) ; Put the on/off switch into the buffer.
Move.l Sp,-(Sp) ; pmRBuffer
Move.l (Sp),-(Sp) ; pmSBuffer
Move.w #1,-(Sp) ; pmLength = 1
Move.w #power1Cntl,-(Sp) ; pmCommand
Movea.l Sp,A0 ; Point to the param block.
_PMgrOp ; Turn the LCD screen on/off.
Lea pmCommandRec.pmRBuffer+4+2(Sp),Sp ; Toss the param block.
; Clean up and go home.
;
Move.l vidParamsPtr(A6),D0 ; If the vidParamsPtr is nil,
Beq.s @CSCDone ; then just leave.
Movea.l D0,A0 ; Dispose of the vidParams pointer.
_DisposPtr
@CSCDone
Unlk A6 ; De-allocate local stack frame.
Rts ; Return to caller.
Endwith
;---------------------------------------------------------------------
; Data
;---------------------------------------------------------------------
Align 4
; The CSCSpIDTbl is a list of all the board sRsrcIDs supported in the CSC
; sRsrc directory. It is used to prune all the unnecessary board sRsrcs.
;
; The CSCModeList is used to prune the various functional sRsrcs.
;
CSCSpIDTbl Dc.w EndCSCSpIDTbl-BeginCSCSpIDTbl-1
BeginCSCSpIDTbl
Dc.b sRsrc_BdEscher
Dc.b sRsrc_BdBlackBird
Dc.b sRsrc_BdYeager
Dc.b 0
EndCSCSpIDTbl
Align 4
CSCModeList Dc.w EndCSCML-BeginCSCML-2
BeginCSCML
Dc.b sRsrc_Vid_CSC_C_S_TFT_399,sRsrc_Vid_CSC_C_S_TFT_480 ; Escher
Dc.b sRsrc_Vid_CSC_G_D_STN_400
Dc.b sRsrc_Vid_CSC_G_S_TFT_400
Dc.b sRsrc_Vid_CSC_C_S_TFT_399a,sRsrc_Vid_CSC_C_S_TFT_480a ; Blackbird
Dc.b sRsrc_Vid_CSC_C_S_TFT_399b,sRsrc_Vid_CSC_C_S_TFT_480b
Dc.b sRsrc_Vid_CSC_C_S_TFT_399c,sRsrc_Vid_CSC_C_S_TFT_480c
Dc.b sRsrc_Vid_CSC_C_S_TFT_399d,sRsrc_Vid_CSC_C_S_TFT_480d
Dc.b sRsrc_Vid_CSC_C_D_STN_480
Dc.b sRsrc_Vid_CSC_G_D_STN_480
Dc.b sRsrc_Vid_CSC_G_S_TFT_480
Dc.b sRsrc_Vid_CSC_C_S_TFT_399y,sRsrc_Vid_CSC_C_S_TFT_480y ; Yeager
Dc.b sRsrc_Vid_CSC_G_D_STN_400y
Dc.b sRsrc_Vid_CSC_G_S_TFT_400y
Dc.b 0 ; Pad for word-alignment.
EndCSCML
Align 4
; In order to support family modes, we list all the members of each
; family in a table. These tables are below.
;
C_S_TFT_480_L Dc.w EndC_S_TFT_480-BeginC_S_TFT_480-1
BeginC_S_TFT_480
Dc.b sRsrc_Vid_CSC_C_S_TFT_480,sRsrc_Vid_CSC_C_S_TFT_399
EndC_S_TFT_480
C_S_TFT_480_AL Dc.w EndC_S_TFT_480a-BeginC_S_TFT_480a-1
BeginC_S_TFT_480a
Dc.b sRsrc_Vid_CSC_C_S_TFT_480a,sRsrc_Vid_CSC_C_S_TFT_399a
EndC_S_TFT_480a
C_S_TFT_480_BL Dc.w EndC_S_TFT_480b-BeginC_S_TFT_480b-1
BeginC_S_TFT_480b
Dc.b sRsrc_Vid_CSC_C_S_TFT_480b,sRsrc_Vid_CSC_C_S_TFT_399b
EndC_S_TFT_480b
C_S_TFT_480_CL Dc.w EndC_S_TFT_480c-BeginC_S_TFT_480c-1
BeginC_S_TFT_480c
Dc.b sRsrc_Vid_CSC_C_S_TFT_480c,sRsrc_Vid_CSC_C_S_TFT_399c
EndC_S_TFT_480c
C_S_TFT_480_DL Dc.w EndC_S_TFT_480d-BeginC_S_TFT_480d-1
BeginC_S_TFT_480d
Dc.b sRsrc_Vid_CSC_C_S_TFT_480d,sRsrc_Vid_CSC_C_S_TFT_399d
EndC_S_TFT_480d
Align 4
; The CSCProdTable is an array of configuration parameters indexed by
; bthe board sRsrc ID. This allows us to distinguish between the various
; CSC-based CPUs by product. At the moment, there are only Eschers
; and Blackbirds, and both of their tables are the same for now.
;
CSCProdTable
; Mem,Refresh,VRAM,<pad>
; -----------------
Dc.b $02,$02,$00,0 ; Escher Configuration.
Dc.b $02,$02,$05,0 ; Blackbird.
Dc.b $02,$02,$02,0 ; Yeager.
Align 4
; The CSCConfigTable is an array of configuration parameters indexed
; by panel ID. Within each set of panel parameters is a set of parameters
; that are indexed by the amount of VRAM available. These parameters
; are used in setting up the intial values of the Palette and selecting
; the right functional sRsrc per panel per VRAM configuration.
;
With CSCCnfgRec
CSCConfigTable
C_S_TFT_480_Tbl Dc.b $00,$FF,$00,$FF,$00,$FF,0,0 ; Mini-gamma table. [Color, TFT, Single-Drive, 640x480, Sharp]
Dc.b sRsrc_Vid_CSC_C_S_TFT_480,FourthVidMode ; 512K VRAM prefs.
Dc.b boxPowerBookDuo270c,0 ; BoxFlag.
Dc.w C_S_TFT_480_L-C_S_TFT_480_Tbl ; Offset to family modes.
Dcb.b CSCCnfgRecSize,sRsrc_CSC_NeverMatch ; ID=1 [Unused]
Dcb.b CSCCnfgRecSize,sRsrc_CSC_NeverMatch ; ID=2 [Unused]
Dcb.b CSCCnfgRecSize,sRsrc_CSC_NeverMatch ; ID=3 [Unused]
G_S_TFT_400_Tbl Dc.b $00,$FF,$00,$00,$00,$00,0,0 ; Mini-gamma table. [Gray, TFT, Single-Drive, 640x400, Hosiden]
Dc.b sRsrc_Vid_CSC_G_S_TFT_400,ThirdVidMode ; 512K VRAM prefs.
Dc.b boxPowerBookDuo270c,0 ; BoxFlag.
Dc.w 0 ; No family modes.
Dcb.b CSCCnfgRecSize,sRsrc_CSC_NeverMatch ; ID=5 [Unused]
G_D_STN_400_Tbl Dc.b $00,$FF,$00,$00,$00,$00,0,0 ; Mini-gamma table. [Gray, STN, Dual-Drive, 640x400, Sharp]
Dc.b sRsrc_Vid_CSC_G_D_STN_400,SecondVidMode ; 512K VRAM prefs.
Dc.b boxPowerBookDuo270c,0 ; BoxFlag.
Dc.w 0 ; No family modes.
Dcb.b CSCCnfgRecSize,sRsrc_CSC_NeverMatch ; ID=7, No-Connect. [No Panel Connected]
;---------------------------------------------------------------------
C_S_TFT_480_A Dc.b $00,$FF,$00,$FF,$00,$FF,0,0 ; Mini-gamma table. [Color, TFT, Single-Drive, 640x480, Sharp]
Dc.b sRsrc_Vid_CSC_C_S_TFT_480a,FourthVidMode ; 512K VRAM prefs.
Dc.b boxBlackbird,0 ; BoxFlag.
Dc.w C_S_TFT_480_AL-C_S_TFT_480_A ; Offset to family modes.
C_D_STN_480 Dc.b $00,$FF,$00,$FF,$00,$FF,0,0 ; Mini-gamma table. [Color, STN, Dual-Drive, 640x480, Sharp]
Dc.b sRsrc_Vid_CSC_C_D_STN_480,FourthVidMode ; 512K VRAM prefs.
Dc.b boxBlackbird,0 ; BoxFlag.
Dc.w 0 ; No family modes.
C_S_TFT_480_B Dc.b $00,$FF,$00,$FF,$00,$FF,0,0 ; Mini-gamma table. [Color, TFT, Single-Drive, 640x480, NEC]
Dc.b sRsrc_Vid_CSC_C_S_TFT_480b,FourthVidMode ; 512K VRAM prefs.
Dc.b boxBlackbird,0 ; BoxFlag.
Dc.w C_S_TFT_480_BL-C_S_TFT_480_B ; Offset to family modes.
C_S_TFT_480_C Dc.b $00,$FF,$00,$FF,$00,$FF,0,0 ; Mini-gamma table. [Color, TFT, Single-Drive, 640x480, Hosiden]
Dc.b sRsrc_Vid_CSC_C_S_TFT_480c,FourthVidMode ; 512K VRAM prefs.
Dc.b boxBlackbird,0 ; BoxFlag.
Dc.w C_S_TFT_480_CL-C_S_TFT_480_C ; Offset to family modes.
C_S_TFT_480_D Dc.b $00,$FF,$00,$FF,$00,$FF,0,0 ; Mini-gamma table. [Color, TFT, Single-Drive, 640x480, Toshiba]
Dc.b sRsrc_Vid_CSC_C_S_TFT_480d,FourthVidMode ; 512K VRAM prefs.
Dc.b boxBlackbird,0 ; BoxFlag.
Dc.w C_S_TFT_480_DL-C_S_TFT_480_D ; Offset to family modes.
G_D_STN_480_Tbl Dc.b $00,$FF,$00,$00,$00,$00,0,0 ; Mini-gamma table. [Gray, STN, Dual-Drive, 640x480, Sharp]
Dc.b sRsrc_Vid_CSC_G_D_STN_480,SecondVidMode ; 512K VRAM prefs.
Dc.b boxBlackbird,0 ; BoxFlag.
Dc.w 0 ; No family modes.
G_S_TFT_480_Tbl Dc.b $00,$FF,$00,$00,$00,$00,0,0 ; Mini-gamma table. [Gray, TFT, Single-Drive, 640x480, Hosiden]
Dc.b sRsrc_Vid_CSC_G_S_TFT_480,FourthVidMode ; 512K VRAM prefs.
Dc.b boxBlackbird,0 ; BoxFlag.
Dc.w 0 ; No family modes.
Dcb.b CSCCnfgRecSize,sRsrc_CSC_NeverMatch ; ID=7, No-Connect. [No Panel Connected]
;---------------------------------------------------------------------
C_S_TFT_480_Y Dc.b $00,$FF,$00,$FF,$00,$FF,0,0 ; Mini-gamma table. [Color, TFT, Single-Drive, 640x480, Sharp]
Dc.b sRsrc_Vid_CSC_C_S_TFT_480,FourthVidMode ; 512K VRAM prefs.
Dc.b boxYeagerC,0 ; BoxFlag.
Dc.w C_S_TFT_480_L-C_S_TFT_480_Y ; Offset to family modes.
Dcb.b CSCCnfgRecSize,sRsrc_CSC_NeverMatch ; ID=1 [Unused]
Dcb.b CSCCnfgRecSize,sRsrc_CSC_NeverMatch ; ID=2 [Unused]
Dcb.b CSCCnfgRecSize,sRsrc_CSC_NeverMatch ; ID=3 [Unused]
G_S_TFT_400_Y Dc.b $00,$FF,$00,$00,$00,$00,0,0 ; Mini-gamma table. [Gray, TFT, Single-Drive, 640x400, Hosiden-Yeager]
Dc.b sRsrc_Vid_CSC_G_S_TFT_400y,ThirdVidMode ; 512K VRAM prefs.
Dc.b boxYeagerG,0 ; BoxFlag.
Dc.w 0 ; No family modes.
Dcb.b CSCCnfgRecSize,sRsrc_CSC_NeverMatch ; ID=5 [Unused]
G_D_STN_400_Y Dc.b $00,$FF,$00,$00,$00,$00,0,0 ; Mini-gamma table. [Gray, STN, Dual-Drive, 640x400, Sharp-Yeager]
Dc.b sRsrc_Vid_CSC_G_D_STN_400y,SecondVidMode ; 512K VRAM prefs.
Dc.b boxYeagerFSTN,0 ; BoxFlag. <H45>
Dc.w 0 ; No family modes.
Dcb.b CSCCnfgRecSize,sRsrc_CSC_NeverMatch ; ID=7, No-Connect. [No Panel Connected]
Endwith
End