sys7.1-doc-wip/QuickDraw/QD.a

506 lines
14 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; File: QD.a
;
; Contains: RAM Based Color QuickDraw
;
; Written by: Bruce Leak
;
; Copyright: © 1989-1991, 1993 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM2> 9/12/93 SAM Added "NOT forROM" around the code that implements
; _Translate24to32. SuperMario is a 32-bit only ROM.
; <19> 8/30/91 DTY Define hasCQD since we took it out of BBSStartup. QuickDraw
; used to use {Defs32}, so hasCQD needs to be true as it was in
; that case.
; <18> 7/10/91 JSM Remove obsolete SysVers conditional and some code that never is
; compiled.
; <17> 6/14/91 JL Removed benign redefinition of HWCfgFlags declared in Private.a.
; <16> 6/12/91 LN Removed #includes for private interfaces from public interfaces.
; Changed #include 'HardwareEqu.a' to 'HardwarePrivateEqu.a'
; <15> 8/17/90 KON Added support for Restor Macro so traps can be installed to
; point to ROM addresses.
; <14> 7/26/90 KON Removed nsStackerr, now defined in ColorEqu.a
; <13> 7/24/90 gbm axe some duplicate definitions
; <12> 7/11/90 gbm argh, more asm warnings bite the dust
; <11> 6/25/90 DVB Fix alignment problem
; <10> 6/25/90 CL Included fontPrivate.a for build
; <9> 6/20/90 CL Taking out rswapmmuMode since it now exists in qdHooks.a.
; <8> 5/30/90 JT Added equates for hasPenFraction for the included source files
; that need it.
; <7> 2/2/90 BAL Unhook the crsr code from the vbl task during the
; installation process. Deallocate old crsr data
; structures before jetisoning them.
; <6> 2/1/90 BAL Unhook the crsr code from the vbl task during the installation
; process. Deallocate old crsr data structures before jetisoning
; them.
; <5> 1/18/90 DVB Include PalettePriv.a
; <4> 1/17/90 BAL Made the installation of the new crsr code AUX conditional.
; <3> 1/15/90 BAL For AUX: Only install Translate24To32 if it doesn't already
; exist.
; <2> 1/3/90 EMT (with BAL) Moved trap installs to QDTrapInstall.a.
; <2.7> 11/19/89 BAL Added StdOpcodeProc to the install process.
; <2.6> 11/18/89 BAL Added QuickerDraw conditional "Quicker" for fast 8-bit
; arithmetic modes
; <2.5> 11/17/89 BAL Moved GetPMData outside of a conditional
; <2.4> 11/16/89 BAL Added GetPMData as a vector for picture unpacking.
; <2.3> 11/15/89 KON Split GetPMData.a into separate file and included here and in
; B&W QD.
; <2.2> 11/8/89 BAL Added NewOpenPicture and suppport for special cased 8 bit
; arithmetic modes.
; <2.1> 11/1/89 BAL Reworked to support separate "32-Bit QuickDraw" builds as well.
; <•2.0> 10/10/89 djw Removed _alloccursor, _initcursor since the magical slot manager
; patch takes care of that for us.
; <1.9> 9/25/89 CCH Changed include of "DeclRomEqu.a" to "ROMEqu.a".
; <1.8> 9/25/89 BAL Made compatible with the current version of qdTrapInstall.a
; <1.7> 9/25/89 BAL Removed _debugger from install process
; <1.6> 9/25/89 BAL Merged into System 7.0 EASE build process; broke off text/font
; stuff.
; <1.5> 6/30/89 BAL Now supports ram based build of aurora sources
; <•1.4> 5/29/89 BAL Blasting in 32-Bit QuickDraw version 1.0 Final
;
;--------------------------------------------------------------------------------
;
; QuickDraw patch program
;
;--------------------------------------------------------------------------------
BLANKS ON
STRING ASIS
MACHINE MC68020
;--------------------------------------------------------------------------------
; This file builds Color QuickDraw
;
;--------------------------------------------------------------------------------
;Modification History
;
;
IF (&TYPE('useColorICON') = 'UNDEFINED') THEN
useColorICON EQU 0
ENDIF
IF (&TYPE('installText') = 'UNDEFINED') THEN
installText EQU 0
ENDIF
IF (&TYPE('installFont') = 'UNDEFINED') THEN
installFont EQU installText
ENDIF
IF (&TYPE('installAllQD') = 'UNDEFINED') THEN
installAllQD EQU 0
ENDIF
IF (&TYPE('separateFile') = 'UNDEFINED') THEN
separateFile EQU 0
ENDIF
ROMPaletteMgr EQU 1
has32BitQD EQU 1
Quicker EQU 1
IF (&TYPE('hasPenFraction') = 'UNDEFINED') THEN
IF forROM THEN
hasPenFraction EQU 0
ELSE
hasPenFraction EQU 1
ENDIF
ENDIF
if (&type('hasCQD') = 'UNDEFINED') then
hasCQD: equ 1
endif
PrintinROM EQU 1
PrNonPortable EQU 1
WholeErrors EQU 1
print off
INCLUDE 'quickequ.a'
INCLUDE 'SysEqu.a'
INCLUDE 'syserr.a'
INCLUDE 'toolequ.a'
INCLUDE 'fasttraps.a'
INCLUDE 'qdHooks.a'
INCLUDE 'fontPrivate.a'
INCLUDE 'colorequ.a'
INCLUDE 'SlotMgrEqu.a'
INCLUDE 'ROMEqu.a'
INCLUDE 'VideoEqu.a'
INCLUDE 'HardwarePrivateEqu.a'
INCLUDE 'PaletteEqu.a'
INCLUDE 'PalettePriv.a'
_FixDiv OPWORD $A84D
_PMForeColor OPWORD $Aa97
_PMBackColor OPWORD $Aa98
MACRO
_SeedFill
JSR ([$E00+$39*4])
ENDM
MACRO
_CalcMask
JSR ([$E00+$38*4])
ENDM
MACRO
_rGetCTSeed
JSR ([$E00+$228*4])
ENDM
MACRO
_ColorThing2Index
JSR ([$E00+$392*4])
ENDM
MACRO
_tstMFExists
move.l ($E00+$9f*4),d0 ;get address of unimplemented trap
cmp.l ($E00+$8f*4),d0 ;same as OSDispatch?
ENDM
;Sleezy Low-Memory Locations pilfered by FCQD
FMSynthXtra equ $c1c
jpCicn equ $1c4c
;$d44 is a block of 12 lowmem bytes: Could be good!
ShieldJunkBase EQU $d44
ShieldRect EQU ShieldJunkBase
ShieldDepth EQU ShieldJunkBase+8
;new private equates used by FCQD
runMaskBit equ 30 ;bit number for run MASK instruction
staleRGBbkBit equ 2 ;bit number in PMFlags
staleRGBfgBit equ 3 ;bit number in PMFlags
PMVersMask EQU $7FFF ; mask to remove high bit of version
fAddr32clean EQU $8000 ; flag to say pixMap's baseAddr is 32 bit clean
CLUTBusy EQU 13 ; bit number in CTFlags (TransIndex) to
; mark CLUT is being changed in SetEntries
PRINT NOGEN,NOMDIR
PRINT ON
BlockHead MAIN EXPORT
Export CodeStart
Import Install
bra.l Install
DC.B 'ptchQD32'
ALIGN
GBLC &CurFile ;current file name used by Drawing Vars
CodeStart equ *
if separateFile then
lea BlockHead,a0 ; get block start pointer in a0
rts
endif
if quicker then
INCLUDE 'arith8blt.a'
endif
INCLUDE 'GDevice.a'
INCLUDE 'LCURSOR.a'
if installText then
INCLUDE 'DRAWTEXT.a'
INCLUDE 'TEXT.a'
endif
INCLUDE 'LINES.a'
INCLUDE 'PUTLINE.a'
INCLUDE 'DRAWLINE.a'
INCLUDE 'RGNBLT.a'
INCLUDE 'RECTS.a'
INCLUDE 'BITBLT.a'
INCLUDE 'cCrsrCore.a'
INCLUDE 'QDUtil.a'
INCLUDE 'Colorasm.a'
INCLUDE 'Patterns.a'
INCLUDE 'GRAFAsm.a'
INCLUDE 'PICTURES.a'
INCLUDE 'getPMData.a'
INCLUDE 'POLYGONS.a'
INCLUDE 'RRECTS.a'
INCLUDE 'DRAWARC.a'
INCLUDE 'BITMAPS.a'
INCLUDE 'REGIONS.a'
INCLUDE 'SEEKRGN.a'
INCLUDE 'STRETCH.a'
INCLUDE 'seekMask.a'
INCLUDE 'OVALS.a'
INCLUDE 'ARCS.a'
INCLUDE 'SORTPOINTS.a'
INCLUDE 'PUTRGN.a'
INCLUDE 'ColorMgr.a'
INCLUDE 'ANGLES.a'
INCLUDE 'PUTOVAL.a'
INCLUDE 'PACKRGN.a'
INCLUDE 'RGNOP.a'
INCLUDE 'MaskAsm.a'
INCLUDE 'PaletteMgr.a'
if installText then
INCLUDE 'fontmgr.a'
endif
INCLUDE 'GWorld.a'
;----------------------------------------------------------------------
CodeEnd PROC EXPORT
bra.s @1
@CutBack DC.L 0 ;do nothing flag for cut back code
@1
lea @CutBack,a1 ;set up pointer to end o' code
rts
Install PROC EXPORT
IMPORT CodeEnd,CodeStart
IMPORT FastStart
lea CleanStart,A0
move.l A0,D0
_StripAddress ; clean the pc
move.l D0,-(sp)
DummyTask rts ; go there
CleanStart
PEA -4(A5) ; push address of QuickDraw vars
_InitGraf ; initialize QuickDraw
_HideCursor ; restore the screen data
if separateFile then
bsr.l CodeStart ; get src pointer in a0
bsr.s CodeEnd ; get end pointer in a1
sub.l a0,a1 ; compute size
move.l a1,d0 ; get size in d0
sub.l d0,BufPtr ; make room above stack
move.l BufPtr,a1 ; get dst in a1
MOVE.L A1,A4 ; copy dst ptr
sub.l a0,a4 ; compute there-here offset
_BlockMove
else
sub.l a4,a4 ; compute there-here offset
endif
MOVE.W HwCfgFlags,D0 ; check em the compulsive way
BTST #hwCbAUX,D0 ; is it A/UX time?
BNE.S @skipCrsr ; if so, show the crsr
lea DummyTask,a0
move.l a0,JCrsrTask ; unhook the crsr during install
@skipCrsr
JSR FastStart
MOVE.W HwCfgFlags,D0 ; check em the compulsive way
BTST #hwCbAUX,D0 ; is it A/UX time?
BNE.S @AUX ; if so, show the crsr
move.l crsrPtr,a0 ; pick up handle to crsr save record
move.l (a0),a2
move.l CCMap(a2),-(sp) ; get handle to crsr pixmap
_disposPixmap
move.l CCData(a2),a0 ; get handle to crsr color data
_disposHandle
move.l CCSave(a2),a0 ; get handle to save bits under crsr
_disposHandle
move.l crsrPtr,a0 ; pick up handle to crsr save record
_disposHandle
MOVE.L MINUSONE,CRSRPTR ; deallocate crsr data
; LEA JAllocCrsr,A1 ; first entry in second table
; move.l (a1),a1 ; get vector
; JSR (a1) ; allocate it right
; _InitCursor
bra.s @noAUX
@AUX
_InitCursor ; make sure the cursor gets shown
@noAUX
clr.l -(sp) ; take params from theGD
clr.l -(sp)
clr.w -(sp)
_MakeITable ; force a rebuild of the ITab
IF useColorICON THEN
theZone equ $118
sysZone equ $2a6
move.l theZone,-(sp)
move.l sysZone,theZone
subq #4,sp ;make room for result
move.w #32,-(sp) ;push id
_getCicon
move.l (sp)+,a0 ;get cicn handle
move.l a0,jpCicn ;save for later
_MoveHHi
_HLock
MOVE.L (A0),A3 ; keep pointer in A3
MOVE iconPMap+bounds+bottom(A3),D3 ; get bottom
SUB iconPMap+bounds+top(A3),D3 ; calc height, keep in D3
; set the base addresses of the pixMap, the mask, and the bitMap
LEA iconRec(A3),A0 ; point to the mask data
MOVE.L A0,iconMask+baseAddr(A3) ; and set the mask's base address
MOVE iconMask+rowBytes(A3),D0 ; get mask's rowbytes
MULU D3,D0 ; get size of mask
ADD.L D0,A0 ; point to BitMap data
MOVE.L A0,iconBMap+baseAddr(A3) ; and set the b/w icon's base address
MOVE.L iconData(A3),A0 ; get the pixmap data handle
_MoveHHi
_HLock
MOVE.L (A0),A0 ; point at the data
MOVE.L A0,iconPMap+baseAddr(A3) ; and set the color icon's base address
move.l (sp)+,theZone
ENDIF
if not separateFile then
bsr.l CodeEnd ; get end pointer in a1
move.l a1,a0 ; copy for cut back code
endif
rts
;--------------------------------------------------------------------------------------
FastStart PROC EXPORT
IMPORT INITCRTABLE,CRSRVBLTASK,Translate24To32
; This patch installs the Translate24To32 routine as trap number $A091 if it doesn't
; already exist. Since this is the very first implementation of Translate24To32,
; if another version is already installed, it is a later version, which we don't want
; to override.
; Does the Translate24To32 dispatch trap exist?
IF NOT forROM THEN ; SuperMario is a 32-bit only ROM.
MOVE.W #$A091, D0 ; Translate24To32 Trap number
_GetTrapAddress ,NewOS ; get the address of Translate24To32
MOVEA.L A0, A1 ; Hold it for a sec
MOVE.W #$A89F, D0 ; get address of Unimplemented trap
_GetTrapAddress
CMPA.L A0,A1 ; see if a later version is already installed
BNE.S @skip ; if so, we're done
move.w #$91,d0
lea ((Translate24To32).L,pc),a0 ; install address translation routine
ADD.L A4,a0 ; really get the actual address
_SetTrapAddress ,newOS
@skip
ENDIF
lea $4081c11c,a0 ;point to copyright notice in rom78
move.l a0,d7 ;make a copy
MOVE.W HwCfgFlags,D0 ; check em the compulsive way
BTST #hwCbAUX,D0 ; is it A/UX time?
BNE.S MDONE ; if so, skip crsr installs
;offset from here to there in a4
lea ((InitCrTable).L,pc),a2 ; get address of jump table
LEA JHideCursor,A1 ; first entry in the lo-mem jump table
MOVE.L A2,A0 ; get a trashable copy of the table addr
MOVEQ #7,D1 ; there are 8 vectors
@8 MOVEQ #0,D2 ; clear the register for add
MOVE.W (A0)+,D2 ; get a vector (actually an offset)
ADD.L A2,D2 ; get the actual address
ADD.L A4,D2 ; really get the actual address
MOVE.L D2,(A1)+ ; and put in the lo-mem table
DBRA D1,@8 ; do them all
LEA JAllocCrsr,A1 ; first entry in second table
MOVEQ #1,D1 ; there are 2 vectors
@9 MOVEQ #0,D2 ; clear the register for add
MOVE.W (A0)+,D2 ; get a vector (actually an offset)
ADD.L A2,D2 ; get the actual address
ADD.L A4,D2 ; really get the actual address
MOVE.L D2,(A1)+ ; and put in the lo-mem table
DBRA D1,@9 ; do them all
MOVE.L Mouse,D0 ; get the current mouse position...
LEA MTemp,A0 ; point to the temp mouse variable
MOVE.L D0,(A0)+ ; put MTemp AT 15,15
MOVE.L D0,(A0)+ ; put RawMouse AT 15,15 TOO
MOVE.L D0,(A0)+ ; put Mouse AT 15,15 TOO
MOVE.L #0,(A0)+ ; top = 0, left = 0
MOVE.W ColLines,(A0)+ ; set bottom
MOVE.W RowBits,(A0) ; set left
MOVE.W #$0006,CrsrThresh ; CrsrThresh
MDONE
MOVEM.L A2-A3,-(SP) ; save regs
LEA LastTrap,A2 ; point to end
LEA FirstTrap,A3 ; point to first trap
NxtTrap MOVE.L A3,d1 ; get pointer to offset
ADD.L (A3)+,d1 ; add offset to pointer
ADD.L A4,D1 ; really get the actual address
moveq #0,d0
MOVE.W (A3)+,D0 ; get trap number
bpl.s @NotROMAddress
and.w #$7fff,d0 ;strip high bit indicating it's a ROM address
move.l -6(a3),d1 ;get ROM offset
add.l ROMBase,d1 ;make it real
@NotROMAddress
lsl.l #2,d0
move.l d0,a0
add.w #$0e00,a0
move.l d1,(a0) ; _SetTrapAddress ,New,Tool
CMP.L A3,A2 ; done yet?
BNE.S NxtTrap ; =>no
MOVE.W HwCfgFlags,D0 ; check em the compulsive way
BTST #hwCbAUX,D0 ; is it A/UX time?
BNE.S @AUX ; if so, skip crsr installs
lea ((CrsrVBLTask).L,pc),a0 ; install cursor VBL task
ADD.L A4,A0 ; really get the actual address
MOVE.L A0,JCrsrTask ; JCrsrTask
@AUX
move.l $1204,jswapfont ;font manager hack
MOVEM.L (SP)+,A2-A3 ; restore regs
RTS ; and return
INCLUDE 'QDTrapInstall.a'
END