mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-28 13:52:37 +00:00
1226 lines
50 KiB
Plaintext
1226 lines
50 KiB
Plaintext
;
|
||
; File: JMFBPrimaryInit.a
|
||
;
|
||
; Contains: PrimaryInit for 4•8/8•24 Cards.
|
||
;
|
||
; Written by: Casey King/Mike Puckett
|
||
;
|
||
; Copyright: © 1986-1993 by Apple Computer, Inc. All rights reserved.
|
||
;
|
||
; This file is used in these builds: Mac32
|
||
;
|
||
;
|
||
; Change History (most recent first):
|
||
;
|
||
; <SM3> 6/14/93 kc Roll in Ludwig.
|
||
; <LW4> 5/14/93 fau This delay is still not right. While I get the source for the
|
||
; latest ROM for this card, I'm upping the delay to 5ms and doing
|
||
; a Nubus read in between rights, to flush the MUNI FIFO's.
|
||
; <LW3> 5/14/93 fau Put a delay in writing to Endeavor so that it works with
|
||
; Cylone40. It looks like MUNI is writing out the data too fast!
|
||
; <LW2> 4/27/93 fau Bug #1081554: Added an extra delay before starting JMFB, so
|
||
; that they work on Cyclone 40MHz.
|
||
; <SM2> 11/18/92 SWC Changed SlotEqu.a->Slots.a and VideoEqu.a->Video.a.
|
||
; <2> 1/15/92 KC Repair "uncompleted conditional directive" error. Removed
|
||
; gratuitous branch.
|
||
; <1> 1/7/92 RB first checked in
|
||
; =============== Terror History ========================
|
||
;
|
||
; <4> 6/17/91 jmp Eliminated support for PAL displays & encoder boxes since the
|
||
; versions of the 4•8 & 8•24 cards that we’re patching out don’t
|
||
; have the sRsrcs.
|
||
; <3> 4/4/91 jmp Cleaned up the conditional assembly stuff (i.e., started using
|
||
; ForRom instead of PadForOverPatch).
|
||
; <2> 2/25/91 jmp Rolled in Casey’s latest changes.
|
||
; <1> 01/06/90 jmp Checked into TERROR ROM for the first time.
|
||
; <0> 11/19/90 jmp Formatted for use with TERROR ROM (as opposed to a
|
||
; declaration ROM).
|
||
;
|
||
;-------------------------------------------------------------------
|
||
;
|
||
; This file contains the primary initialization code for the Elmer
|
||
; Fudd video ROM and is included by ElmerROM.a. The purpose of the
|
||
; primary initialization is to detect the monitor type in use and the
|
||
; memory available so that the appropriate sResource list can be selected
|
||
; and the others discarded. In addition the the display device is setup
|
||
; for 1 BPP operation by setting the color lookup table to black and white,
|
||
; initializing the hardware for 1 BPP and then graying the screen.
|
||
;
|
||
; Notes:
|
||
; ------
|
||
;
|
||
; 1. The basic flow of the primary initialization code is as follows:
|
||
;
|
||
; Start
|
||
; Header Information
|
||
; Set Initial Vendor Status to good
|
||
; Form 32 bit slot base address
|
||
; Setup a slot parameter block for sRsrc pruning
|
||
; Check to see which slot mgr is around and save
|
||
; Decode sense lines to detect monitor type
|
||
; Setup Mode to be Disabled to invalid
|
||
; Get saved monitor type from parameter RAM
|
||
; Init the inval screen flag to false
|
||
; If monitor type is different then invalidate scrn resource flag
|
||
; If ntsc then determine oscan/uscan state and if changed then inval scrn flag
|
||
; Size video RAM and set VRAM configuration bit
|
||
; Form the spID candidate to disable
|
||
; If Inval scrn then save new mode in pram
|
||
; Remove Invalid sRsrc Lists
|
||
; Setup Hardware
|
||
; Disable Interrupts (card resets disabled!)
|
||
; Setup CLUT for 1 BPP
|
||
; Gray the Screen
|
||
; End
|
||
;
|
||
; 2. Monitor Sensing
|
||
;
|
||
; The raw monitor sense lines read in are reformatted to facilitate sRsrc pruning
|
||
; and the following table summarizes the raw sense line combinations and the
|
||
; the reformatted ones. The RGB Kong monitor is the only one that is reformated.
|
||
; The 2 least significant bits of the sRsrc IDs (see ROM.a header comments) are
|
||
; idenitical to the 2 least significant bits (b1:b0) of the reformated sense line
|
||
; combination and b2 of the sense line indicates whether its RGB or B/W.
|
||
;
|
||
; Sense(2:0) Raw Reformatted Sense Monitor Type
|
||
; -------------- ----------------- -------------
|
||
; 000 111 RGB Workstation (Kong)
|
||
; 001 001 B/W Full Page (Portrait)
|
||
; 010 010 Modified Apple II-GS RGB (Rubik)
|
||
; 011 011 B/W Workstation (Kong)
|
||
; 100 100 NTSC (Interlaced)
|
||
; 101 101 RGB Full Page (Portrait)
|
||
; 110 110 Standard RGB
|
||
; 111 000 No Sense read (unconnected)
|
||
;
|
||
; There are a couple of interesting relationships that we can take advantage of from
|
||
; the reformatted sense line combinations:
|
||
;
|
||
; a) Kong or Portrait = b0
|
||
; b) Other = not b0
|
||
; c) Kong timing = b1 and b0
|
||
; d) Portrait timing = not b1 and b0
|
||
;
|
||
; In addition to the traditional monitor sensing that we have normally done, this
|
||
; card also utilizes Rosko's extended sense scheme. We use this only to detect if
|
||
; the Sarnoff breakout box is connected and if it is we will always default to
|
||
; the RS170 timing mode. This will enable us to at least use the box as an RGB
|
||
; to NTSC encoder when it arrives.
|
||
;
|
||
; 3. Pruning
|
||
;
|
||
; Refer to the comment in the code.
|
||
;
|
||
; 4. Hardware setup sequence
|
||
;
|
||
; a) Setup CLUT pixel bus control register
|
||
; Setup JMFB CSR except for REFEN, VRSTB, and VIDEN
|
||
; Setup JMFB Load Divisor Register
|
||
; Setup JMFB Base Register
|
||
; Setup JMFB Row Long Words Register
|
||
; b) Set up the Endeavor chip (M,N, and EXTCLK)
|
||
; c) Enable the Endeavor clock by set PIXSEL1 in the JMFB CSR
|
||
; d) Delay to guarantee a stable clock from Endeavor
|
||
; e) Enable JMFB by setting VRSTB in JMFB CSR
|
||
; f) Setup Stopwatch parameters (must happen after VRSTB is set because
|
||
; that also reinitializes Stopwatch!)
|
||
; g) Enable Stopwatch by setting SRST
|
||
; h) Enable REFEN in JMFB CSR
|
||
; i) Enable Video Transfer Cycle in JMFB CSR
|
||
;
|
||
; 5. 24 Bit addressing and 32 bit addressing
|
||
;
|
||
; This card is not accessible in 24 bit addressing mode and all accesses must be made
|
||
; in 32 bit mode when hitting the hardware. That's explains the frequent use of
|
||
; SwapMMUMode to switch back and forth. It is not desirable to access a 32 bit
|
||
; address in 24 bit mode as we will not go where we want to!!!
|
||
;
|
||
; 6. Trident use of PRAM
|
||
;
|
||
; This card uses pram as follows:
|
||
;
|
||
; byte 0, 1 -> board ID
|
||
; byte 2 -> mode (screen depth)
|
||
; byte 3 -> saves the default sRsrcID (changed by SetDefault)
|
||
; byte 4 -> pinit raw sRsrcID (only modified by pinit)
|
||
; byte 5 -> specialFlag (set to $FF if connected to interlaced monitor and past shutdown mode is 32 bpp)
|
||
; byte 6 -> clockType flag (set to $00 if Endeavor and $FF if National)
|
||
;
|
||
; Register usage:
|
||
; ---------------
|
||
;
|
||
; D0 - Initially used to form the cards slot number.
|
||
; Later used as the switch ID for SwapMMUMode trap.
|
||
; Used in the vRAM test to hold test pattern.
|
||
; D1 - Used throughout as a utility register (counter or index usually).
|
||
; D2 - Used in Pruning section to form the candidate spID to be deleted.
|
||
; Used in Gray Screen to hold the number of rowlongs as a counter.
|
||
; D3 - Used to hold the spID of the mode to be disabled (interlaced modes only)
|
||
; Used in Gray Screen to hold the number of screen rows.
|
||
; D4 - Used to hold the reformated sense line combination.
|
||
; Used to form the spID based on monitor and memory.
|
||
; Used to select which parameter list to be used in hardware setup.
|
||
; Used to determine appropriate default fb base offset in grayscreen.
|
||
; D5 - Used to hold the dither pattern in gray screen.
|
||
; D6 - Used to identify if the new slot manager is present (0=new, $FF=old) .
|
||
; D7 - Used to temporarily hold previous addr state during SwapMMUMode
|
||
; - Used to count the number of sRsrcs deleted.
|
||
;
|
||
; A0 - On entry contains a parameter block pointer to an SEBlock
|
||
; Later used to point to the slot parameter block.
|
||
; Later used to point to the hardware setup parameter data.
|
||
; A1 - Used initially to point to the cards base address ($Fs00 0000).
|
||
; Used later to point to control register space during hardware setup.
|
||
; A2 - Used to point to the valid mode list during sRsrc pruning
|
||
; Used to point to the JMFB Control and Status Register during hardware setup.
|
||
; Used to point to the CLUT during color table initialization.
|
||
; Used to point to the frame buffer during gray screen
|
||
; A3 - Used to save the cards base address (A1) in hardware setup, clut setup and gray screen.
|
||
;
|
||
|
||
If ForRom Then
|
||
|
||
Machine MC68020
|
||
|
||
Load 'StandardEqu.d'
|
||
|
||
Print Off
|
||
Include 'GestaltEqu.a'
|
||
Include 'ROMEqu.a'
|
||
Include 'Slots.a'
|
||
Include 'Video.a'
|
||
|
||
Include 'JMFBDepVideoEqu.a'
|
||
Print On
|
||
|
||
JMFBPrimaryInit Proc Export
|
||
|
||
Else
|
||
|
||
;Header
|
||
;------
|
||
DC.B sExec2 ;Code revision (Primary init)
|
||
DC.B sCPU68020 ;CPU type is 68020
|
||
DC.W 0 ;Reserved
|
||
DC.L Begin-* ;Offset to code.
|
||
|
||
Endif
|
||
|
||
;Initialization Code
|
||
;-------------------
|
||
WITH seBlock,spBlock
|
||
|
||
Begin
|
||
|
||
If ForROM Then ; For Terror ROM, PrimaryInit is NOT executed thru _sExec.
|
||
SaveRegs Reg A0-A4/D0-D7 ; So, we need to save our work registers.
|
||
Movem.l SaveRegs,-(Sp)
|
||
Endif
|
||
|
||
;
|
||
; set initial vendor status to good
|
||
; - PrimaryInit must return a good status or else SecondaryInit will not run.
|
||
;
|
||
|
||
MOVE.W #1,seStatus(A0) ; VendorStatus <- good
|
||
|
||
;
|
||
; form 32-bit base address in A1
|
||
;
|
||
|
||
MOVE.L #$F0000000,D1 ; D1 <- F0000000
|
||
MOVE.B seSlot(A0),D0 ; get slot number
|
||
BFINS D0,D1{4:4} ; D1 <- Fs000000
|
||
MOVE.L D1,A1 ; copy to address reg
|
||
|
||
;
|
||
; set up a slot parameter block for sRsrc pruning
|
||
;
|
||
|
||
SUBA #spBlockSize,SP ; make an slot parameter block on stack
|
||
MOVE.L SP,A0 ; get pointer to parm block now
|
||
MOVE.B D0,spSlot(A0) ; put slot in pBlock
|
||
CLR.B spExtDev(A0) ; external device = 0
|
||
;
|
||
; determine if new slot manager is around
|
||
;
|
||
CLR.B D6 ; D6 will indicate which slot mgr is present
|
||
_sVersion ; determine which one (0 = new 32 BQD one)
|
||
SNE D6 ; D6 = 0 if new, D6 = $FF if old
|
||
;
|
||
; decode sense lines to detect monitor type
|
||
; - the monitor sense combination is read from the JMFB CSR which is located at zero offset
|
||
; - from the JMFB control space.
|
||
;
|
||
GetMonitor
|
||
MOVEQ #true32b,D0 ; change to 32 bit addressing to get
|
||
_SwapMMUMode ; sense lines
|
||
MOVE.L D0,-(SP) ; save prior mode cause we might need it!
|
||
|
||
MOVE.L #JMFB,D1 ; get offset in register
|
||
BFEXTU (A1,D1.L){20:3},D4 ; get the state of the sense lines
|
||
|
||
CMP.B #NoSense,D4 ; check for no connect (sense = 7)
|
||
BNE.S @DoNext
|
||
|
||
BSR pGetXtndSense ; go see if we see an xtended sense
|
||
CMP.B #Sarnoff,D0 ; we only understand sarnoff
|
||
|
||
If ForROM Then
|
||
Bne.s @NoConnect ; if not Sarnoff (NTSC), then no connect
|
||
Else
|
||
BNE.S @TryPAL ; if not Sarnoff (NTSC), then try for PAL
|
||
EndIf
|
||
|
||
MOVE.B #_NTSC_,D4 ; force sarnoff to ntsc timing for now
|
||
BRA.S @SwapBack ; we have a current mode so go on
|
||
|
||
If Not ForROM Then
|
||
@TryPAL CMP.B #PAL,D0 ; check for PAL xtnded sense
|
||
BNE.S @TryPAL2
|
||
MOVE.B #rPAL,D4
|
||
BRA.S @SwapBack
|
||
@TryPAL2 CMP.b #PALmonitor,D0 ; check for PAL monitor xtnded sense
|
||
BNE.S @NoConnect ; if not found then do no connect
|
||
MOVE.B #rPAL,D4
|
||
BRA.S @SwapBack
|
||
EndIf
|
||
|
||
@NoConnect MOVE.B #InvalidSRsrcID,D4 ; no valid xtnd sense so do no connect
|
||
BRA.S @SwapBack ;
|
||
@DoNext
|
||
CMP.B #RGBKong,D4 ; check to see if its an RGBKong
|
||
BNE.S @SwapBack ; if not skip and go on
|
||
MOVE.B #rRGBKong,D4 ; if it is, reformat to maintain convention
|
||
|
||
@SwapBack MOVE.L (SP)+,D0 ; restore past mode
|
||
_SwapMMUMode ; swap back to previous addr mode (D0 still valid)
|
||
MOVE.L D4,D5 ; save reformated sense combo for InitCLUT
|
||
;
|
||
; setup the 'Mode to be disabled' to be invalid.
|
||
; - if we are in connected to a monitor that supports multiple screen sizes,
|
||
; - D3 will be set to a valid sRsrc ID.
|
||
;
|
||
MOVE.B #InvalidSRsrcID,D3 ; this upper nibble is invalid
|
||
;
|
||
; Get the saved monitor type from slot parameter RAM
|
||
; - Refer to IM V (Slot Manager) for a description of the sPRAM record. This card uses the
|
||
; - vendorUse1 field to hold the saved mode, and vendorUse2 field to hold the saved monitor type.
|
||
;
|
||
SUBA #sizesPRAMRec,SP ; make room for the pRAM block
|
||
MOVE.L SP,spResult(A0) ; point to it
|
||
_sReadPRAMRec ; read it
|
||
MOVE.B savedSRsrcID(SP),D1 ; save in D1
|
||
;
|
||
; initialize the 'Invalidate screen flag' to false
|
||
;
|
||
SF D2 ; $00 = don't invalidate later
|
||
;
|
||
; before we determine if the monitor has changed, determine which clock we're using
|
||
;
|
||
MOVE.L A1,A3 ; setup for call to pGetClockType
|
||
MOVEQ #true32b,D0 ; setup for change to 32 bit addressing
|
||
_SwapMMUMode ; do it
|
||
MOVE D0,D7 ; save past mode so it will be restored later
|
||
BSR pGetClockType ; returns clock type in D0
|
||
CMP.B savedClockType(SP),D0 ; check to see if it's changed
|
||
BEQ.S @checkMonitor ; it hasn't change so skip the rest
|
||
MOVE.B D0,savedClockType(SP) ; setup for when PRAM is reset as a f(D2)
|
||
ST D2 ; invalidate PRAM later
|
||
@checkMonitor
|
||
MOVE D7,D0 ; restore addressing mode
|
||
_SwapMMUMode
|
||
;
|
||
; get the low 3 bits of the saved sRsrc ID
|
||
;
|
||
BFEXTU D1{29:3},D0 ; get the last connected monitor state
|
||
;
|
||
; determine the state of the 'Invalidate screen flag' based on past and current monitor hookup
|
||
;
|
||
CMP.B D4,D0 ; compare the current sense with the saved sense
|
||
BEQ.S @sametype ; if equal then branch for further processing
|
||
ST D2 ; else the monitor has changed so set invalidate flag
|
||
BRA.S SizeVRAM ; and go on to next section of pinit
|
||
;
|
||
; - if we got here the basic monitor type was the same
|
||
;
|
||
@sametype
|
||
MOVE.B D4,D0 ; get the current sense
|
||
ANDI.B #3,D0 ; only keep the lower two bits as they provide interlaced info
|
||
CMP.B #0,D0 ; compare the current sense with interlaced (special case)
|
||
BNE.S SizeVRAM ; if its not NTSC, then monitor is same and go to next section
|
||
;
|
||
; we're interlaced mode, so check to see if we shutdown in 32 bpp (special case because 24 bpp mode has a different baddr!)
|
||
; - if we're in this state, a special flag will be set in PRAM so SecondaryInit can write the correct baddr if installing
|
||
; - a 32 bit sRsrc. We can't simply look at driver privates or PRAM (savedMode) when 32 BQD is a patch because if the
|
||
; - card is the startup screen, the card will have been temporarily reset to 1 bpp by the system before secondaryinit
|
||
; - because 32 BQD will not have been loaded yet. During that temporary period, the driver privates and PRAM (savedMode)
|
||
; - will reflect 1 bpp. This is only a problem if our card is a startup screen! UGH... The special flag is reset to false
|
||
; - initially assuming the special case won't be in effect. Note that PInit is the sole place where this flag is set and
|
||
; - reset. It is never used by anyone, unless it's an interlaced monitor and the card is the startup screen.
|
||
;
|
||
|
||
MOVE.B #$00,specialFlag(SP)
|
||
TST.B D6 ; check for new slot manager
|
||
BEQ.S @hitPRAM ; 0=new, FF=old, branch if new (specialFlag should be false)
|
||
CMP.B #FifthVidMode,savedMode(SP) ; check past mode and compare with 32 bpp mode
|
||
BNE.S @hitPRAM ; past mode was 1,2,4, or 8 bpp (specialFlag should be false)
|
||
MOVE.B #$FF,specialFlag(SP) ; we don't have 32 BQD (yet) so this is probably the case
|
||
@hitPRAM
|
||
MOVE.L spResult(A0),spsPointer(A0) ; set up parameter block
|
||
_SPutPRAMRec ; write the new record out
|
||
;
|
||
; continue regular and weird interlaced initialization
|
||
;
|
||
BTST #fSRsrcOscanBit,D1 ; see if the requested NTSC spID is underscan (0) or overscan (1)
|
||
BEQ.S @uScan ; if it is underscan, don't set the overscan bit in D4
|
||
BSET #fSRsrcOscanBit,D4 ; it's overscan, so set the overscan bit in D4
|
||
|
||
@uScan
|
||
CMP.B savedRawSRsrcID(SP),D1 ; this will only be different if the user did it thru monitors
|
||
BEQ.S SizeVRAM ; if they are equal go to next section
|
||
ST D2 ; it's changed so set invalidate flag
|
||
;
|
||
; size the video RAM and set VRAM configuration bit in mode nibble
|
||
;
|
||
SizeVRAM
|
||
MOVEQ #true32b,D0 ; setup for change to 32 bit addressing
|
||
_SwapMMUMode ; do it
|
||
MOVE D0,D7 ; save D0 for restore, since slotmgr could trash it on error
|
||
MOVE.L #TestPos,D1 ; get offset in D1
|
||
MOVE.L #OneBitGray,D5 ; get a test pattern
|
||
MOVE.L D5,(A1,D1.L) ; write it to alleged vRAM
|
||
MOVE.L MinusOne,-(SP) ; write out some garbage to clear data lines
|
||
ADDQ #4,SP ; and pitch it
|
||
CMP.L (A1,D1.L),D5 ; did it stick?
|
||
BNE.S DisableSRsrc ; if <>, 512 RAM
|
||
BSET #fSRsrcXMemBit,D4 ; set 1024 vRAM bit
|
||
;
|
||
; setup the sRsrc to disable and complete the formation of the spID in D4
|
||
;
|
||
DisableSRsrc
|
||
BSET #fSRsrcMSBBit,D4 ; continue to form the spID in D4
|
||
TST.B D6 ; check for new slot manager
|
||
BEQ.S @1 ; 0=new, FF=old, branch if new and b4 will be 0 for 32 bit srsrc
|
||
BSET #fSRsrc24Bit,D4 ; complete the spID formation by setting the 24 bit srsrc bit
|
||
BRA.S CheckInval ; go to next section, the old slot manager doesn't allow disabling
|
||
|
||
@1 MOVE.B D4,D3 ; copy the desired spID to activate into the one to disable
|
||
BCHG #fSRsrcOscanBit,D3 ; swap the overscan/underscan bit in the one to disable
|
||
;
|
||
; invalidate the screen resource and save states in PRAM if the invalidate flag is set
|
||
;
|
||
CheckInval
|
||
TST.B D2 ; test to see if we should invalidate the screen and update pram
|
||
BEQ.S @FixStack ; if equal to 0 then don't do it
|
||
|
||
; it is not necessary to do this since CheckDevices will invalidate if the rect is different. The only case
|
||
; where this could be an issue would be if we come up with a different mem config (1 or 2 banks), or if we
|
||
; change monitors, but they have the same screen dimensions (like ntsc oscan and standard 13"). In the first
|
||
; case, the new sRsrc installed will only support certain valid screen depths and even if an past mode
|
||
; which is not in the new mode list is called, ChkMode will not allow the mode request. In the second case, the
|
||
; problem may result in desirable operation, since the menu bar will stick on the new monitor if it was there
|
||
; prior to the restart. (i.e. in other scenarios, like a different sized monitor, CheckDevices will invalidate
|
||
; and the main screen will go back to the card in the lower slot number).
|
||
;
|
||
; Although this allows various opportunities to simplify, I took the easy way out since we're so close to shipping,
|
||
; and I would hate to introduce a careless pinit bug at this point!.
|
||
;
|
||
;+++ CLR.B scrnInval ; flag CQD thta the scrn resource is bad
|
||
MOVE.B D4,savedSRsrcID(SP) ; put new monitor type in pBlock
|
||
MOVE.B D4,savedRawSRsrcID(SP) ; save spID in pram (this one's not changed by SetDefault)
|
||
MOVE.B #FirstVidMode,savedMode(SP) ; make one bit the new default (mode 128 is always the default)
|
||
MOVE.B #$00,specialFlag(SP) ; clear the special flag, since we are making 1 bpp the new depth
|
||
MOVE.L SP,spsPointer(A0) ; be careful, must be SP (not spResult(A0)), because the old slot
|
||
; mgr has a bug and trashed spResult(A0) on the last _SPutPRAMRec call.
|
||
_SPutPRAMRec ; write the new record out
|
||
@FixStack
|
||
ADDA #SizesPRAMRec,SP ; eliminate pram block
|
||
;
|
||
; reset b4 in D4 and D3 since the pruning logic works better if it's off (pram spID will have b4 set properly)
|
||
; - a side note...it is entirely possible that secondaryinit will need to fix up the active spID based on
|
||
; - the presence of 32 bqd. It will also have to fix up the diabled spID and fix PRAM...ugh!
|
||
;
|
||
BCLR #fSRsrc24Bit,D4 ; D4 now holds the active spID minus b4
|
||
BCLR #fSRsrc24Bit,D3 ; D3 now holds the disabled spID minus b4
|
||
;
|
||
; remove invalid sResource lists
|
||
;
|
||
; - The following section of code prunes out the undesirable and invalid sResources
|
||
; - from the sResource table. The undesirable sResources are the 24 bit sResources
|
||
; - when the new slot manager/32 BQD code is in ROM, or the undesirable sResources
|
||
; - are the 32 bit sResources when the new slot manager/32 BQD code is not present
|
||
; - or installed as a patch after primary initialization is run. Each bit in the
|
||
; - sResource ID has a meaning and it is summarized here:
|
||
; -
|
||
; - b7 = 1
|
||
; - b6 = 0
|
||
; - b5 = 1 if 1024K of vRAM, otherwise 0 for 512K of vRAM
|
||
; - b4 = 0 if 32 bit sRsrc, otherwise its a 24 bit sRsrc and b4 = 1
|
||
; - b3 = a b3, b2, b1 and b0 are used to identify monitor type
|
||
; - b2 = b b3, b2, b1 and b0 are used to identify monitor type
|
||
; - b1 = c b3, b2, b1 and b0 are used to identify monitor type
|
||
; - b0 = d b3, b2, b1 and b0 are used to identify monitor type
|
||
; -
|
||
; - b3:b2:b1:b0 = 0000 -> NTSC overscan "System 7.0" mode sRsrc
|
||
; - b3:b2:b1:b0 = 0001 -> 640 x 870 portrait monitor
|
||
; - b3:b2:b1:b0 = 0010 -> 512 x 384 modified Apple IIGS RGB monitor
|
||
; - b3:b2:b1:b0 = 0011 -> 1152 x 870 two page display monitor
|
||
; - b3:b2:b1:b0 = 0100 -> NTSC overscan mode sRsrc
|
||
; - b3:b2:b1:b0 = 0101 -> not used (reformats to 001 for RGBPortrait sense)
|
||
; - b3:b2:b1:b0 = 1110 -> 640 x 480 standard monitor
|
||
; - b3:b2:b1:b0 = 0111 -> not used (reformats to 011 for RGBKong sense)
|
||
; - b3:b2:b1:b0 = 1000 -> NTSC underscan "System 7.0" mode sRsrc
|
||
; - b3:b2:b1:b0 = 1001 -> not used (defaults to 0001)
|
||
; - b3:b2:b1:b0 = 1010 -> not used (defaults to 0010)
|
||
; - b3:b2:b1:b0 = 1011 -> not used (defaults to 0011)
|
||
; - b3:b2:b1:b0 = 1100 -> NTSC underscan mode sRsrc
|
||
; - b3:b2:b1:b0 = 1101 -> not used (defaults to 0001)
|
||
; - b3:b2:b1:b0 = 1110 -> not used (defaults to 0110)
|
||
; - b3:b2:b1:b0 = 1111 -> not used (defaults to 0011)
|
||
;
|
||
; - Once _sVersion is called, we know which version of the slot manager we have and
|
||
; - all of the undesirable sResources (determined by the mode list, b7, and b4) will
|
||
; - be deleted.
|
||
; -
|
||
; - After the undesirable sResources are removed, the invalid sResources are handled as in
|
||
; - previous Apple ROMs where the current mode (as determined by the monitor sense test and
|
||
; - vRAM test) is in the low 4 bits of D4 (see b3:b0 above). The current mode is compared
|
||
; - to all allowable modes and the invalid ones are deleted and the lone valid one is left.
|
||
; - Note that b2 is of no importance at this time and it is cleared prior to the comparisons.
|
||
; -
|
||
; - Refer to the Video Configuration ROM Software Specification (3/15/89) for details on the
|
||
; - goofy things required to play in a 32 bit world!!
|
||
;
|
||
Prune
|
||
MOVE D7,D0 ; restore previous mode in D0
|
||
_SwapMMUMode ; swap back to previous mode (contained in D0)
|
||
|
||
LEA pModeList,A2 ; A2 points to the Trident valid mode list
|
||
MOVEQ #sRsrc_NumModes-1,D1 ; counter in D1 (because of BRA, not -1)
|
||
@0 MOVE.B (A2)+,D2 ; get the partial spID to test against (24/32 addr bit not set)
|
||
TST.B D6 ; check which version of the slot manager
|
||
BNE.S @2 ; branch if old one so 32 bit sRsrcs are deleted
|
||
BSET #fSRsrc24Bit,D2 ; its the new one so 24 bit sRsrcs are deleted
|
||
@2 MOVE.B D2,spID(A0) ; set the mode
|
||
@5 _sDeleteSRTRec ; remove the invalid entry
|
||
DBRA D1,@0
|
||
|
||
CLR.W D7
|
||
BTST #fSRsrcBigScrnBit,D4 ; determine if its a Kong or Portrait from b0
|
||
BEQ.S @DontClear ; its not, so branch
|
||
BCLR #fSRsrcRGBBit,D4 ; bit 2 (RGB/BW select) not needed
|
||
@DontClear
|
||
LEA pModeList,A2 ; A2 points to the Trident valid mode list
|
||
MOVEQ #sRsrc_NumModes-1,D1 ; counter in D1 (because of BRA, not -1)
|
||
@10 MOVE.B (A2)+,D2 ; get the partial spID to test against (24/32 addr bit not set)
|
||
|
||
CMP.B D3,D2 ; see if this one should be disabled instead of deleted
|
||
BNE.S @7 ; it's not equal so it must be valid mode or to be deleted
|
||
TST.B D6 ; check for new slot manager
|
||
BNE.S @7 ; if the old one then we can't make the new call here
|
||
BCLR #fSRsrc24Bit,D2 ; it's the new slot mgr so it must be the 32 bit addr spID
|
||
MOVE.B D2,spID(A0) ; set up the spID to disable
|
||
MOVE.L #sRsrcDisable,spParamData(A0) ; set up for disable
|
||
CLR.B spExtDev(A0) ; external device = 0
|
||
_SetsRsrcState ; make the trap
|
||
CLR.L spParamData(A0) ; restore spParamData
|
||
BRA.S @20 ; go do the next one
|
||
@7
|
||
CMP.B D4,D2 ; is this the valid mode?
|
||
BEQ.S @20 ; yup, so skip deletion
|
||
TST.B D6 ; check which version of the slot manager
|
||
BEQ.S @15 ; branch if new one so 32 bit sRsrc is formed
|
||
BSET #fSRsrc24Bit,D2 ; its the old one so form a 24 bit sRsrc spID
|
||
@15 MOVE.B D2,spID(A0) ; set the mode
|
||
_sDeleteSRTRec ; remove the invalid entry
|
||
ADDQ #1,D7 ; increment the # deleted counter
|
||
@20 DBRA D1,@10
|
||
CMP.W #sRsrc_NumModes,D7 ; check to see if we've deleted all sRsrcs (i.e. disconnected)
|
||
BEQ CleanUp ; if we have then get out, otherwise continue
|
||
|
||
MOVE.B D4,D2 ; spID to be used later for ntsc processing
|
||
ANDI.B #monSenseMask,D4 ; now only keep the monitor sense in D4
|
||
;
|
||
; Fix default video device in PRAM if necessary (This is to fix the MacsBug anchoring annoyance)
|
||
; - We use D6 to tell us whether we've installed a 32 bit sRsrc, since D2 was stripped of this
|
||
; - information earlier. This has to be unraveled in 2nd init, so check there for more weirdness!
|
||
;
|
||
TST.B D6 ; test to see if 32 BQD is around (and if we are a 32 bist sRsrc)
|
||
BEQ.S HWSetup ; branch over if we're already a 32 bit sRsrc
|
||
MOVE.B spSlot(A0),D3 ; get the current slot
|
||
SUBA #2,SP ; make a DefVideoRec
|
||
MOVE.L SP,A0 ; and point to it
|
||
_GetVideoDefault ; get the current default video device
|
||
CMP.B sdSlot(A0),D3 ; test to see if it's our slot
|
||
BNE.S @notWelcome ; if not then skip
|
||
|
||
BCLR #fSRsrc24Bit,D2 ; make a 32 bit sRsrc temporarily
|
||
CMP.B sdSResource(A0),D2 ; test to see if it's our 32 bit sRsrc
|
||
BNE.S @notWelcome ; if it's not then skip
|
||
|
||
BSET #fSRsrc24Bit,D2 ; fool MacsBug into thinking its 24 bit
|
||
|
||
MOVE.B D2,sdSResource(A0) ; do it
|
||
_SetVideoDefault
|
||
|
||
BCLR #fSRsrc24Bit,D2 ; restore D2
|
||
@notWelcome
|
||
ADDA #2,SP
|
||
|
||
;
|
||
; setup hardware
|
||
;
|
||
HWSetUp
|
||
CMP.B #Rubik,D4 ; is monitortype = Rubik
|
||
BEQ.S @useRubik ; if yes then get Rubik parameters
|
||
CMP.B #Kong,D4 ; is monitortype = Kong
|
||
BEQ.S @useKong ; if yes then get Kong parameters
|
||
CMP.B #Portrait,D4 ; else is monitortype = Portrait
|
||
BEQ.S @usePortrait ; if yes then get Portrait parameters
|
||
CMP.B #_NTSC_,D4 ; else is monitortype = NTSC
|
||
BEQ.S @testNTSC ; if yes then get NTSC parameters
|
||
CMP.B #rPAL,D4 ; else is monitortype = PAL
|
||
BEQ.S @testPAL ; if yes then get PAL parameters
|
||
LEA pOBM30Parms,A0 ; else it better be standard size monitor
|
||
BRA.S @setup ; branch to the setup code
|
||
|
||
@useRubik LEA pOBM16Parms,A0 ; point to the parameters
|
||
BRA.S @setup ; branch to the setup code
|
||
|
||
@useKong LEA pOBM100Parms,A0 ; point to the parameters
|
||
BRA.S @setup ; branch to the setup code
|
||
|
||
@usePortrait LEA pOBM57Parms,A0 ; point to the parameters
|
||
BRA.S @setup ; branch to the setup code
|
||
|
||
@testNTSC
|
||
BTST #fSRsrcXMemBit,D2 ; D2 still contains the selected sRsrc ID
|
||
BEQ.S @useNTSC ; if only 1 bank (b3=0) then no convolution
|
||
BTST #fSRsrcOscanBit,D2 ; test the underscan (0) / overscan (1) bit
|
||
BEQ.S @useConvUscan ; if equal to 0 then its underscan so load uscan params
|
||
LEA pOBM12CParms,A0 ; if 2 banks (b3=1) then convolution
|
||
BRA.S @setup
|
||
@useConvUscan LEA pOBM12CuParms,A0
|
||
BRA.S @setup
|
||
|
||
@useNTSC BTST #fSRsrcOscanBit,D2
|
||
BEQ.S @useNTSCu
|
||
LEA pOBM12Parms,A0 ; point to the no convolution parameters
|
||
BRA.S @setup
|
||
|
||
@useNTSCu LEA pOBM12uParms,A0 ; point to the no convolution underscan paramters
|
||
BRA.S @setup
|
||
|
||
@testPAL
|
||
BTST #fSRsrcXMemBit,D2 ; D2 still contains the selected sRsrc ID
|
||
BEQ.S @usePAL ; if only 1 bank (b3=0) then no convolution
|
||
BTST #fSRsrcOscanBit,D2 ; test the underscan (0) / overscan (1) bit
|
||
BEQ.S @usePALConvUscan ; if equal to 0 then its underscan so load uscan params
|
||
LEA pOBM14CParms,A0 ; if 2 banks (b3=1) then convolution
|
||
BRA.S @setup
|
||
@usePALConvUscan LEA pOBM14CuParms,A0
|
||
BRA.S @setup
|
||
|
||
@usePAL BTST #fSRsrcOscanBit,D2
|
||
BEQ.S @usePALu
|
||
LEA pOBM14Parms,A0 ; point to the no convolution parameters
|
||
BRA.S @setup
|
||
|
||
@usePALu LEA pOBM14uParms,A0 ; point to the no convolution underscan paramters
|
||
|
||
@setup
|
||
MOVEQ #true32b,D0 ; change to 32 bit addressing to get
|
||
_SwapMMUMode ; at hardware
|
||
MOVE D0,-(SP) ; save past mode so it will be restored later
|
||
|
||
MOVE.L A1,A3 ; A3 <- slot base addr
|
||
ADD.L #CLUT+CLUTPBCR,A1 ; point to the CLUT Pixel Bus Control Register
|
||
|
||
CLR.L D0 ; to ensure that the upper 2 bytes are 0
|
||
MOVE.W (A0)+,D0 ; setup the CLUT PBCR (data table field is word sized)
|
||
MOVE.L D0,(A1)+ ; make a long write to hw always for this card
|
||
|
||
MOVE.L A3,A1 ; get back to the slot base addr
|
||
ADD.L #JMFB,A1 ; add cntl base offset to slotbase
|
||
MOVE.L A1,A2 ; save for later (A2 <- JMFB base)
|
||
MOVE.W #3,D1 ; setup the 4 JMFB registers
|
||
|
||
CLR.L D0 ; to ensure that the upper 2 bytes are 0
|
||
@part1 MOVE.W (A0)+,D0 ; do it (data table field is word sized)
|
||
MOVE.L D0,(A1)+ ; make a long write to hw always for this card
|
||
DBRA D1,@part1
|
||
|
||
BSR pGetClockType ; returns clock type in D0 (0=Endeavor, $FFFF=National)
|
||
MOVE.L D0,-(SP) ; save the clock type
|
||
MOVE.L A3,A1 ; get back to the slot base addr
|
||
ADD.L #Endeavor,A1 ; point to the base of the Endeavor Registers
|
||
|
||
cmp.w #EndeavorID,D0 ; check for Endeavor
|
||
bne.s @natlClock
|
||
MOVE.W #2,D1 ; setup the 3 Endeavor registers
|
||
|
||
CLR.L D0 ; to ensure that the upper 2 bytes are 0
|
||
@part2 MOVE.W (A0)+,D0 ; do it (data table field is word sized)
|
||
MOVE.L D0,(A1)+ ; make a long write to hw always for this card
|
||
DBRA D1,@part2
|
||
ADD.L #16,A0 ; skip the National params (16*1)
|
||
BRA.S @startClock
|
||
|
||
@natlClock
|
||
ADD.L #6,A0 ; skip the Endeavor params (3 * 2)
|
||
MOVE.W #15,D1 ; setup the 16 National registers
|
||
|
||
CLR.L D0 ; to ensure that the upper 3 bytes are 0
|
||
@part2a MOVE.B (A0)+,D0 ; do it (data table field is byte sized)
|
||
MOVE.L D0,(A1)+ ; make a long write to hw always for this card
|
||
DBRA D1,@part2a
|
||
|
||
@startClock ADD.L #JMFBCSR,A2 ; point to JMFB CSR
|
||
|
||
MOVE.L (SP)+,D0 ; restore the clock type
|
||
CMP.W #0,D0
|
||
BNE.S @SkipEndeavorReset
|
||
MOVE.L (A2),D1
|
||
ANDI.W #MaskSenseLine,D1 ; Ensure sense lines will be written out as 000
|
||
ORI.W #PIXSEL1,D1 ; set PIXSEL1 to start Endeavor
|
||
MOVE.L D1,(A2)
|
||
|
||
@SkipEndeavorReset
|
||
MOVE.W TimeDBRA,D1 ; setup delay loop count for 1 millisecond
|
||
@delayLoop
|
||
DBRA D1,@delayLoop ; wait for stable clock from Endeavor
|
||
|
||
; The second 1 millisecond loop is a hedge that we wont ship a Mac that does a dbra 8 times faster
|
||
; than a IIfx. The parameter is word size and that is the only data size that dbra does anyway.
|
||
; The easier, but risker way would be to do a ASL.W #1,D1 in the first time loop.
|
||
|
||
MOVE.W TimeDBRA,D1 ; setup delay loop count for 1 millisecond
|
||
@delayLoop2
|
||
DBRA D1,@delayLoop2 ; wait for stable clock from National
|
||
|
||
; On a Cyclone 40, we needed an extra delay before enabling the Stopwatch <LW3>
|
||
; <LW3>
|
||
Wait5ms Move.l #(-5)<<16,d1 ; outer loop count 5*1ms <LW3>
|
||
@outer Move.w TimeDBRA,d1 ; inner loop count 1ms <LW3>
|
||
@inner dbra d1,@inner ; wait 1ms <LW3>
|
||
Addq.l #1,d1 ; increment outer loop counter <LW3>
|
||
Bne.s @outer ; wait 5*1ms <LW3>
|
||
|
||
MOVE.L (A2),D1
|
||
ANDI.W #MaskSenseLine,D1 ; Ensure sense lines will be written out as 000
|
||
ORI.W #VRSTB,D1 ; set VRSTB to start JMFB
|
||
MOVE.L D1,(A2)
|
||
|
||
MOVE.L A3,A1 ; get back to the slot base addr
|
||
ADD.L #Stopwatch,A1 ; point to the base of the Stopwatch Registers
|
||
MOVE.W #14,D1 ; setup next 15 registers (Stopwatch)
|
||
|
||
CLR.L D0 ; to ensure that the upper 2 bytes are 0
|
||
@part3 MOVE.W (A0)+,D0 ; do it (data table field is word sized)
|
||
MOVE.L D0,(A1)+ ; make a long write to hw always for this card
|
||
|
||
Move.l #(-5)<<16,d7 ; outer loop count 5*1ms <LW3>
|
||
@outer1 Move.w TimeDBRA,d7 ; inner loop count 1ms <LW3>
|
||
@inner1 dbra d7,@inner1 ; wait 1ms <LW3>
|
||
Addq.l #1,d7 ; increment outer loop counter <LW3>
|
||
Bne.s @outer1 ; wait 5*1ms <LW3>
|
||
|
||
Move.l (A2),D7 ; dummy read
|
||
|
||
; On a Cyclone 40, the writing of these registers does not happen, so, by trial and error, I put in <LW3>
|
||
; this 1 ms delay in writing each register. It could be MUNI writing data out too fast. <LW3>
|
||
; <LW3>
|
||
|
||
DBRA D1,@part3
|
||
MOVE.L #$6,(A1) ; both interrupts off and stopwatch soft reset in Pinit
|
||
MOVE.L #$07,(A1) ; now start Stopwatch
|
||
|
||
MOVE.L (A2),D1
|
||
ANDI.W #MaskSenseLine,D1 ; Ensure sense lines will be written out as 000
|
||
ORI.W #REFEN,D1 ; set REFEN to start VRAM refresh
|
||
MOVE.L D1,(A2)
|
||
|
||
MOVE.L A2,A4 ; save, since we'll start video as the last thing!
|
||
|
||
;+++ BSR PDelay1VSP ; wait for one vertical blanking interval
|
||
|
||
;+++ MOVE.L (A2),D1
|
||
;+++ ANDI.W #MaskSenseLine,D1 ; Ensure sense lines will be written out as 000
|
||
;+++ ORI.W #VIDGO,D1 ; set VRSTB line to start video transfer cycle ... Video!
|
||
;+++ MOVE.L D1,(A2)
|
||
;
|
||
; setup CLUT for 1 bit per pixel
|
||
;
|
||
InitCLUT
|
||
MOVE.L A3,A1 ; get slotbase back into A1 from A3
|
||
MOVE.L #CLUT+CLUTDataReg,D1 ; get CLUT data register addr
|
||
MOVE.L #0,CLUTAddrReg-CLUTDataReg(A1,D1.L) ; set address reg to $0
|
||
|
||
;
|
||
; I noticed a problem with Trident on the RGB Kong (only the blue gun is active at PInit time). In the
|
||
; driver all of the guns are turned on correctly for RGB Kong. Since we are making a revision to the
|
||
; ROM for the RS170 stuff, I thought we'd fix this too, altho the implementation will be cleaned up again
|
||
; for the 4 layer board. For simplicity, all guns are activated in PInit, regardless if monochrome or RGB,
|
||
; and the driver will only activate the appropriate gun correctly. This will result in the nice gray screen
|
||
; during PInit on a RGB Kong if we ever make one!
|
||
;
|
||
BRA.S @RGB ; turn on all guns only during PInit
|
||
;+++ IF NOT ProtoVRAM THEN
|
||
;+++ BTST #0,D4 ; check for Kong or Portrait monitor (bit 0 = 1)
|
||
;+++ BEQ.S @RGB ; if it is, branch and enable all 3 guns
|
||
;+++ ELSE
|
||
;+++ BRA.S @RGB ; always enable all guns for proto boards
|
||
;+++ ENDIF
|
||
; CLUT element 1 (white)
|
||
CLR.L (A1,D1.L) ; B/W mode so write black to red
|
||
CLR.L (A1,D1.L) ; " " " " black " green
|
||
MOVE.L #$FF,(A1,D1.L) ; " " " " white " blue
|
||
|
||
; CLUT element 2 (black)
|
||
CLR.L (A1,D1.L) ; write black to red
|
||
CLR.L (A1,D1.L) ; " " " green
|
||
CLR.L (A1,D1.L) ; " " " blue
|
||
|
||
BRA.S GrayScrn ; skip on to graying the screen section
|
||
|
||
; CLUT element 1 (white)
|
||
@RGB MOVE.L #$FF,(A1,D1.L) ; RGB so do them all, white to red
|
||
MOVE.L #$FF,(A1,D1.L) ; " " " " " " " green
|
||
MOVE.L #$FF,(A1,D1.L) ; : " " " " " " blue
|
||
|
||
; CLUT element 2 (black)
|
||
CLR.L (A1,D1.L) ; write black to red
|
||
CLR.L (A1,D1.L) ; " " " green
|
||
CLR.L (A1,D1.L) ; " " " blue
|
||
;
|
||
; gray the screen
|
||
; - Use the appropriate frame buffer offset depending on noninterlaced/interlaced operations.
|
||
; - Note that the first $2000 bytes of the frame buffer are always preloaded with black if
|
||
; - the mode is interlaced. This eliminates complicated logic like JMFBSetPage in the
|
||
; - driver and is little overhead to pay for noninterlaced operation. The first #2560 bytes
|
||
; - of the frame buffer are always preloaded with white if the mode is noninterlaced. You may
|
||
; - ask why ... well believe it or not, I found it very hard to believe initially!, if you
|
||
; - keep black in there, that translates to white when the user switches to 24 bpp mode and that
|
||
; - will cause the board to exceed EMI limits (It has to do with bank switching and the front
|
||
; - porch of vertical blanking). Note also that for simplicity, the hw and sw baseoffsets for the
|
||
; - big screens are the same as the small progressive screens.
|
||
;
|
||
GrayScrn
|
||
MOVE.L A3,A2 ; retrieve saved slotbase address
|
||
|
||
ANDI.B #3,D4 ; last use of D4 and we're only interested in lo 2 bits
|
||
CMP.B #InterlacedScreen,D4 ; check to see if we're hooked up to interlaced (b0=b1=0)
|
||
BEQ.S @InterlacedBlackTop ; do the special interlaced blacken of the top fb section
|
||
|
||
MOVE.W #defmBaseOffset,D3 ; get the number of bytes to blacken for top in non interlaced modes
|
||
LSR #2,D3 ; convert bytes to longs
|
||
SUBQ #1,D3 ; and subtract 1 for dbra
|
||
@NxtTopLongNI MOVE.L #$00000000,(A2)+ ; write white (seen as black in 24 bpp) to top $2560 bytes in frame buffer for noninterlaced
|
||
DBF D3,@NxtTopLongNI ; loop until done
|
||
BRA.S @DoTheGray
|
||
|
||
@InterlacedBlackTop
|
||
MOVE.W #defmBaseOffset12,D3 ; get the number of bytes to blacken for top in interlaced modes
|
||
LSR #2,D3 ; convert bytes to longs
|
||
SUBQ #1,D3 ; and subtract 1 for dbra
|
||
@NxtTopLong MOVE.L #$FFFFFFFF,(A2)+ ; write black to top $2000 bytes in frame buffer for interlaced
|
||
DBF D3,@NxtTopLong ; loop until done
|
||
|
||
@DoTheGray
|
||
MOVE.L A3,A2 ; retrieve saved slotbase address
|
||
CMP.B #InterlacedScreen,D4 ; check to see if we're hooked up to interlaced (b0=b1=0)
|
||
BEQ.S @Interlaced ; if so use the interlaced baseoffset
|
||
ADD.L #defmBaseOffset,A2 ; if not, use normal offset and gray the screen
|
||
BRA.S @setPattern ; all done here ... go gray the screen
|
||
@Interlaced ADD.L #defmBaseOffset12,A2 ; We're in NTSC (convolution) so point to the phantom row
|
||
@setPattern MOVE.L #OneBitGray,D5 ; get 1 BPP dither gray pattern
|
||
|
||
MOVE.W (A0)+,D3 ; get the number of rows
|
||
|
||
NxtRow MOVE.W (A0),D1 ; get the number of rowlongs
|
||
|
||
NxtLong MOVE.L D5,(A2)+ ; write a line of gray
|
||
DBF D1,NxtLong
|
||
NOT.L D5 ; invert graypattern for dither
|
||
DBF D3,NxtRow ; repeat for all rows
|
||
|
||
BTST #fSRsrcOscanBit,D2 ; see if the requested NTSC spID is underscan (0) or overscan (1)
|
||
BNE.S SwapBack ; if overscan, we're all done here (No need to black the end part!)
|
||
|
||
MOVE.W #(256*58)-1,D1 ; should be 50 for RS170 and 58 for PAL, but it's easiest to do worst case
|
||
@BotBlock MOVE.L #-1,(A2)+
|
||
DBRA D1,@BotBlock
|
||
|
||
SwapBack
|
||
MOVE.L (A4),D1
|
||
ANDI.W #MaskSenseLine,D1 ; Ensure sense lines will be written out as 000
|
||
ORI.W #VIDGO,D1 ; set VRSTB line to start video transfer cycle ... Video!
|
||
MOVE.L D1,(A4)
|
||
|
||
MOVE (SP)+,D0 ; restore past mode to D0
|
||
_SwapMMUMode ; swap back to previous mode (D0 contains previous mode)
|
||
|
||
;
|
||
; clean up spBlock on stack
|
||
;
|
||
CleanUp
|
||
ADDA #spBlockSize,SP ; flush the block
|
||
;
|
||
; return to your regularily scheduled start code
|
||
;
|
||
|
||
If ForRom Then
|
||
Movem.l (Sp)+,SaveRegs
|
||
Endif
|
||
|
||
RTS
|
||
|
||
|
||
|
||
*******************************************************************
|
||
*
|
||
* pGetXtndSense reads the extended sense code from the sense lines.
|
||
* In this driver, we are looking for the Sarnoff breakout box, which
|
||
* has the sense lines assigned as 010100. Note that the returned sense
|
||
* is of the format bc ac ab, where the first two bits are read when a
|
||
* is set high, the second two bits are read when b is set high, and the
|
||
* third two bits are read when c is set high. a, b, and c correspond to
|
||
* sense lines 2, 1, and 0 where 2 is the msb.
|
||
*
|
||
* Called by:
|
||
*
|
||
* PrimaryInit, VideoOpen
|
||
*
|
||
* Traps and Utilities called:
|
||
*
|
||
* None.
|
||
*
|
||
* Register usage:
|
||
*
|
||
* Input:
|
||
*
|
||
* A1 - card base address
|
||
* D1 - offset to JMFB CSR (contains sense lines)
|
||
*
|
||
* Output:
|
||
* D0 - returns the extended sense.
|
||
*
|
||
* Locally used:
|
||
* D2 - scratch (saved and restored)
|
||
* D3 - scratch (used to hold the sense line to be output to the CSR
|
||
* (i.e. 100, 010, or 001)
|
||
*
|
||
* Miscellaneous:
|
||
*
|
||
* 1. Must be called in 32 bit addressing mode.
|
||
*
|
||
*******************************************************************
|
||
pGetXtndSense
|
||
|
||
MOVEM.L D2-D6,-(SP) ; save D2 working register
|
||
CLR D0 ; initialize the return value
|
||
MOVE.L #9,D5 ; initialize the number of bits to shift due to byte swapping
|
||
MOVE.L #readBC,D3 ; set up 1 bit to be output
|
||
|
||
|
||
LSL D5,D3 ; shift up due to byte swapping
|
||
MOVE.L (A1,D1.L),D4 ; get current state of the JMFB CSR
|
||
ANDI.W #MaskSenseLine,D4 ; Ensure sense lines will be written out as 000
|
||
OR.L D3,D4 ; write out
|
||
MOVE.L D4,(A1,D1.L)
|
||
;+++ BFINS D3,(A1,D1.L){20:3} ; set a in sense reg high (This doesn't work to the card!)
|
||
|
||
BFEXTU (A1,D1.L){20:3},D2 ; read the sense register a,b,c
|
||
MOVE.B D2,D0 ; move into return register
|
||
LSL.B #2,D0 ; move over 2 bits for next one
|
||
|
||
MOVE.L #readAC,D3 ; set up 1 bit to be output
|
||
|
||
LSL D5,D3 ; shift up due to byte swapping
|
||
MOVE.L (A1,D1.L),D4 ; get current state of the JMFB CSR
|
||
ANDI.W #MaskSenseLine,D4 ; Ensure sense lines will be written out as 000
|
||
OR.L D3,D4 ; write out
|
||
MOVE.L D4,(A1,D1.L)
|
||
;+++ BFINS D3,(A1,D1.L){20:3} ; set b in sense reg high (This doesn't work to the card!)
|
||
|
||
BFEXTU (A1,D1.L){20:3},D2 ; read the sense register a,b,c
|
||
MOVE.B D2,D6 ; save bit c
|
||
ANDI.B #1,D6 ; and only bit c
|
||
LSR.B #1,D2 ; move bit a over 1 to form 2 bit code
|
||
OR.B D6,D2 ; form it
|
||
OR.B D2,D0 ; move into return register
|
||
LSL.B #2,D0 ; move over 2 bits for next one
|
||
|
||
MOVE.L #readAB,D3 ; set up 1 bit to be output
|
||
|
||
LSL.L D5,D3 ; shift up due to byte swapping
|
||
MOVE.L (A1,D1.L),D4 ; get current state of the JMFB CSR
|
||
ANDI.W #MaskSenseLine,D4 ; Ensure sense lines will be written out as 000
|
||
OR.L D3,D4 ; write out
|
||
MOVE.L D4,(A1,D1.L)
|
||
;+++ BFINS D3,(A1,D1.L){20:3} ; set c in sense reg high (This doesn't work to the card!)
|
||
|
||
BFEXTU (A1,D1.L){20:3},D2 ; read the sense register a,b,c
|
||
LSR.L #1,D2 ; shift a,b into lo 2 bits
|
||
OR.B D2,D0 ; move into return register
|
||
|
||
MOVEM.L (SP)+,D2-D6 ; restore D2
|
||
|
||
RTS
|
||
|
||
;--------------------------------
|
||
;
|
||
; pGetClockType determines if we have a National part or an Endeavor Part. D0 will return 00 it is
|
||
; an Endeavor part and will return a $FF if it is a National part. The Endeavor registers can be
|
||
; read as well as written to.
|
||
;
|
||
; A0 - used to point to the Endeavor/National address space
|
||
; A3 - Input and holds the slot base address for the card
|
||
; D0 - returns the result (0 = Endeavor, FF = National)
|
||
;
|
||
pGetClockType
|
||
MOVE.L A0,-(SP) ; save work register
|
||
MOVE.L A3,A0
|
||
ADD.L #Endeavor,A0
|
||
|
||
MOVE.L #$55,(A0)
|
||
MOVE.L (A0),D0
|
||
AND.W #$00FF,D0
|
||
CMP.W #$55,D0
|
||
BNE.S @ItsNational
|
||
MOVE.L #$AA,(A0)
|
||
MOVE.L (A0),D0
|
||
AND.W #$00FF,D0
|
||
CMP.W #$AA,D0
|
||
BNE.S @ItsNational
|
||
|
||
MOVE.W #EndeavorID,D0
|
||
BRA.S pEndGetClockType
|
||
@ItsNational MOVE.W #NationalID,D0
|
||
pEndGetClockType MOVE.L (SP)+,A0
|
||
RTS
|
||
|
||
|
||
; Here is the Trident valid mode list to be used in the pruning section.
|
||
; - note that only the 32 bit sRsrcs are shown here, the 24 bit ones are built
|
||
; - and used in the pruning section from these.
|
||
;
|
||
pModeList DC.B sRsrc_Vid12Au,sRsrc_Vid12Bu
|
||
DC.B sRsrc_Vid57A,sRsrc_Vid57B
|
||
DC.B sRsrc_Vid30A,sRsrc_Vid30B
|
||
DC.B sRsrc_Vid100A,sRsrc_Vid100B
|
||
DC.B sRsrc_Vid16A,sRsrc_Vid16B
|
||
DC.B sRsrc_Vid12A,sRsrc_Vid12B
|
||
|
||
If Not ForROM Then
|
||
DC.B sRsrc_Vid14Au,sRsrc_Vid14Bu
|
||
DC.B sRsrc_Vid14A,sRsrc_Vid14B
|
||
EndIf
|
||
|
||
;
|
||
; Here are the Elmer hardware parameters for the 4 different monitors. The seven lines of data
|
||
; correspond to the initialization setup sequence summarized below.
|
||
;
|
||
; Line 1 - CLUT PBCR
|
||
; Line 2 - JMFB CSR, JMFB load divisor register, JMFB base register,JMFB row long words register
|
||
; Line 3 - Endeavor M, Endeavor N, Endeavor external clock
|
||
; Line 4 - Stopwatch horizontal timing control parameters (see Stopwatch spec)
|
||
; Line 5 - Stopwatch vertical timing control parameters (see Stopwatch spec)
|
||
; Line 6 - Stopwatch composite timing control parameters (see Stopwatch spec)
|
||
; Line 7 - Stopwatch vertical interrupts enable
|
||
;
|
||
; The last two lines of data are used to determine the appropriate number of lines and longs/row
|
||
; to be used while graying the screen.
|
||
;
|
||
|
||
pOBM14Parms DC.W $0080
|
||
IF ProtoVRAM THEN
|
||
DC.W $8113,$00E0,defmBaseOffset12>>5,OBM14RB/4
|
||
ELSE
|
||
DC.W $8112,$00E0,defmBaseOffset12>>5,OBM14RB/4
|
||
ENDIF
|
||
DC.W $0000,$0000,$0000
|
||
DC.B $0D,$09,$01,$00,$06,$04,$00,$01
|
||
DC.B $01,$03,$0D,$06,$00,$01,$00,$00
|
||
DC.W $0003,$0000,$0160,$02FE,$0031,$0043,$0036
|
||
DC.W $0003,$0000,$023F,$0028,$0005,$0005
|
||
DC.W $005E,$0193
|
||
DC.W defmBounds_B14-1
|
||
DC.W (OBM14RB/4)-1
|
||
|
||
pOBM14CParms DC.W $00C1
|
||
IF ProtoVRAM THEN
|
||
DC.W $8133,$00F8,(defmbaseOffset12-convBOfix)>>5,OBM14CRB/4
|
||
ELSE
|
||
DC.W $8132,$00F8,(defmbaseOffset12-convBOfix)>>5,OBM14CRB/4
|
||
ENDIF
|
||
DC.W $0000,$0000,$0000
|
||
DC.B $0D,$09,$01,$00,$06,$04,$00,$01
|
||
DC.B $01,$01,$0D,$06,$00,$01,$00,$00
|
||
DC.W $0003,$0000,$0160,$02FE,$0031,$0043,$0036
|
||
DC.W $0003,$0000,$023F,$0028,$0005,$0005
|
||
DC.W $005E,$0193
|
||
DC.W defmBounds_B14-1
|
||
DC.W (OBM14CRB/4)-1
|
||
|
||
pOBM14uParms DC.W $0080
|
||
IF ProtoVRAM THEN
|
||
DC.W $8113,$00E0,defmBaseOffset12>>5,OBM14uRB/4
|
||
ELSE
|
||
DC.W $8112,$00E0,defmBaseOffset12>>5,OBM14uRB/4
|
||
ENDIF
|
||
DC.W $0000,$0000,$0000
|
||
DC.B $0D,$09,$01,$00,$06,$04,$00,$01
|
||
DC.B $01,$03,$0D,$06,$00,$01,$00,$00
|
||
DC.W $0003,$0000,$0114,$0266,$007D,$0043,$0082
|
||
DC.W $0003,$0000,$0205,$0062,$0005,$0005
|
||
DC.W $005E,$0193
|
||
DC.W defmBounds_B14u-1
|
||
DC.W (OBM14uRB/4)-1
|
||
|
||
pOBM14CuParms DC.W $00C1
|
||
IF ProtoVRAM THEN
|
||
DC.W $8133,$00F8,(defmbaseOffset12-convBOfix)>>5,OBM14CRB/4
|
||
ELSE
|
||
DC.W $8132,$00F8,(defmbaseOffset12-convBOfix)>>5,OBM14CRB/4
|
||
ENDIF
|
||
DC.W $0000,$0000,$0000
|
||
DC.B $0D,$09,$01,$00,$06,$04,$00,$01
|
||
DC.B $01,$01,$0D,$06,$00,$01,$00,$00
|
||
DC.W $0003,$0000,$0114,$0266,$007D,$0043,$0082
|
||
DC.W $0003,$0000,$0205,$0062,$0005,$0005
|
||
DC.W $005E,$0193
|
||
DC.W defmBounds_B14u-1
|
||
DC.W (OBM14CRB/4)-1
|
||
|
||
pOBM12Parms DC.W $0080
|
||
IF ProtoVRAM THEN
|
||
DC.W $0113,$00E0,defmbaseOffset12>>5,OBM12CRB/4
|
||
ELSE
|
||
DC.W $0112,$00E0,defmbaseOffset12>>5,OBM12CRB/4
|
||
ENDIF
|
||
DC.W $001B,$00B0,$0000
|
||
DC.B $0c,$01,$02,$00,$07,$03,$00,$00
|
||
DC.B $00,$04,$0D,$06,$04,$01,$00,$00
|
||
DC.W $0003,$0000,$0136,$027E,$0012,$003A,$003a
|
||
DC.W $0003,$0000,$01E0,$0021,$0006,$0006
|
||
DC.W $006E,$014a
|
||
DC.W defmBounds_B12-1
|
||
DC.W (OBM12CRB/4)-1
|
||
|
||
pOBM12CParms DC.W $00C1
|
||
IF ProtoVRAM THEN
|
||
DC.W $0133,$00F8,(defmbaseOffset12-OBM12CRB)>>5,OBM12CRB/4
|
||
ELSE
|
||
DC.W $0132,$00F8,(defmbaseOffset12-OBM12CRB)>>5,OBM12CRB/4
|
||
ENDIF
|
||
DC.W $006C,$00B0,$0000
|
||
DC.B $0c,$01,$02,$00,$07,$03,$00,$00
|
||
DC.B $00,$02,$0D,$06,$04,$01,$00,$00
|
||
DC.W $0003,$0000,$0136,$027E,$0012,$003A,$003A
|
||
DC.W $0003,$0000,$01E0,$0021,$0006,$0006
|
||
DC.W $006E,$014a
|
||
DC.W defmBounds_B12-1
|
||
DC.W (OBM12CRB/4)-1
|
||
|
||
pOBM12uParms DC.W $0080
|
||
IF ProtoVRAM THEN
|
||
DC.W $0113,$00E0,defmbaseOffset12>>5,OBM12CRB/4
|
||
ELSE
|
||
DC.W $0112,$00E0,defmbaseOffset12>>5,OBM12CRB/4
|
||
ENDIF
|
||
DC.W $001B,$00B0,$0000
|
||
DC.B $0c,$01,$02,$00,$07,$03,$00,$00
|
||
DC.B $00,$04,$0D,$06,$04,$01,$00,$00
|
||
; Based on lab measurements the delta value to fp/bp is $8 rather than $20.
|
||
DC.W $0003,$0000,$00f4,$01fe,$0054,$003A,$0078
|
||
DC.W $0003,$0000,$01B0,$0051,$0006,$0006
|
||
DC.W $006E,$014A
|
||
DC.W defmBounds_B12u-1
|
||
DC.W (OBM12CRB/4)-1
|
||
|
||
pOBM12CuParms DC.W $00C1
|
||
IF ProtoVRAM THEN
|
||
DC.W $0133,$00F8,(defmbaseOffset12-OBM12CRB)>>5,OBM12CRB/4
|
||
ELSE
|
||
DC.W $0132,$00F8,(defmbaseOffset12-OBM12CRB)>>5,OBM12CRB/4
|
||
ENDIF
|
||
DC.W $006C,$00B0,$0000
|
||
DC.B $0c,$01,$02,$00,$07,$03,$00,$00
|
||
DC.B $00,$02,$0D,$06,$04,$01,$00,$00
|
||
; Based on lab measurements the delta value to fp/bp is $8 rather than $20.
|
||
DC.W $0003,$0000,$00f4,$01fe,$0054,$003A,$0078
|
||
DC.W $0003,$0000,$01B0,$0051,$0006,$0006
|
||
DC.W $006E,$014A
|
||
DC.W defmBounds_B12u-1
|
||
DC.W (OBM12CRB/4)-1
|
||
|
||
pOBM16Parms DC.W $0080
|
||
IF ProtoVRAM THEN
|
||
DC.W $0083,$00E0,defmBaseOffset>>5,OBM16RB/4
|
||
ELSE
|
||
DC.W $0082,$00E0,defmBaseOffset>>5,OBM16RB/4
|
||
ENDIF
|
||
DC.W $002F,$00F0,$0000
|
||
DC.B $0E,$05,$00,$00,$0F,$00,$00,$00
|
||
DC.B $00,$03,$0D,$06,$04,$01,$00,$00
|
||
DC.W $0003,$0000,$0100,$01FE,$002A,$001E,$0032
|
||
DC.W $0003,$0000,$0300,$0026,$0006,$0002
|
||
DC.W $0004,$0260
|
||
DC.W defmBounds_B16-1
|
||
DC.W (OBM16RB/4)-1
|
||
|
||
pOBM30Parms DC.W $00C0
|
||
IF ProtoVRAM THEN
|
||
DC.W $0083,$00F8,defmBaseOffset>>5,OBM30RB/4
|
||
ELSE
|
||
DC.W $0082,$00F8,defmBaseOffset>>5,OBM30RB/4
|
||
ENDIF
|
||
DC.W $0011,$002d,$0000
|
||
DC.B $0F,$07,$00,$00,$05,$01,$00,$00
|
||
DC.B $00,$02,$0D,$06,$04,$01,$00,$00
|
||
DC.W $0003,$0000,$0050,$009E,$000A,$000E,$001A
|
||
DC.W $0003,$0000,$03C0,$004E,$0006,$0006
|
||
DC.W $0004,$00c8
|
||
DC.W defmBounds_B30-1
|
||
DC.W (OBM30RB/4)-1
|
||
|
||
pOBM57Parms DC.W $00A0
|
||
IF ProtoVRAM THEN
|
||
DC.W $0003,$00F0,defmBaseOffset>>5,OBM57RB/4
|
||
ELSE
|
||
DC.W $0002,$00F0,defmBaseOffset>>5,OBM57RB/4
|
||
ENDIF
|
||
DC.W $002b,$003c,$0000
|
||
DC.B $0E,$07,$00,$00,$06,$01,$00,$00
|
||
DC.B $00,$01,$0D,$06,$04,$01,$00,$00
|
||
DC.W $0003,$0000,$00A0,$013E,$0012,$0026,$0022
|
||
DC.W $0003,$0000,$06CC,$0054,$0006,$0006
|
||
DC.W $0000,$0178
|
||
DC.W defmBounds_B57-1
|
||
DC.W (OBM57RB/4)-1
|
||
|
||
pOBM100Parms DC.W $00C0
|
||
IF ProtoVRAM THEN
|
||
DC.W $2003,$00F8,defmBaseOffset>>5,OBM100RB/4
|
||
ELSE
|
||
DC.W $2002,$00F8,defmBaseOffset>>5,OBM100RB/4
|
||
ENDIF
|
||
DC.W $0005,$0004,$0000
|
||
DC.B $0E,$0B,$00,$00,$03,$01,$00,$00
|
||
DC.B $00,$01,$0D,$06,$04,$01,$00,$00
|
||
DC.W $0003,$0000,$0090,$011E,$0016,$001E,$0012
|
||
DC.W $0003,$0000,$06CC,$004E,$0006,$0006
|
||
DC.W $0000,$014C
|
||
DC.W defmBounds_B100-1
|
||
DC.W (OBM100RB/4)-1
|
||
|
||
|
||
ENDWITH
|
||
|
||
If ForRom Then
|
||
Endp
|
||
Endif
|
||
End
|