mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-12-01 02:51:04 +00:00
2309 lines
72 KiB
Plaintext
2309 lines
72 KiB
Plaintext
|
;
|
|||
|
; File: AllB&WQDPatch.a
|
|||
|
;
|
|||
|
; Contains: This linked patch gets loaded on all B&W machines.
|
|||
|
;
|
|||
|
; Written by: Konstanin Othmer
|
|||
|
;
|
|||
|
; Copyright: © 1990-1991 by Apple Computer, Inc., all rights reserved.
|
|||
|
;
|
|||
|
; Change History (most recent first):
|
|||
|
;
|
|||
|
; <35> 6/4/92 KON For CubeE - Fix OpenCPicture on Classic machines (bug #1028642).
|
|||
|
; Look at the picSize rather than the picIndex for aligning for
|
|||
|
; PICT2. This was causing problems when the stdPutpic bottleneck
|
|||
|
; proc is replaced by a 3rd party. These bottnecks must update
|
|||
|
; picsize but don't update picIndex.
|
|||
|
; <34> 2/3/92 KON Fix problem with GetForeColor trashing memory on classicQD
|
|||
|
; machines.
|
|||
|
; <33> 8/30/91 DTY Define onMac to keep GrafTypes.m.a happy. (It’s not a feature
|
|||
|
; in BBSStartup any more which is why it’s defined here.) Also
|
|||
|
; define hasCQD to be false. (This is a patchfile for black and
|
|||
|
; white machines, after all…)
|
|||
|
; <32> 8/23/91 JSM Remove benign redefinition of TRUE and FALSE, which are now
|
|||
|
; defined by the build script.
|
|||
|
; <31> 7/10/91 JSM Remove obsolete SysVers conditionals, remove code that is never
|
|||
|
; compiled.
|
|||
|
; <30> 3/26/91 KON csd, WRKSHT#RBN-QD-017: Plus patch to stdRgn calls putpicOp
|
|||
|
; which puts out a word if it's an OpenCPicture. The high part of
|
|||
|
; D0 is garbage, so this causes problems. With this change
|
|||
|
; putPicByte is called instead.
|
|||
|
; <29> 3/20/91 KON gbm, WRKSHT#SAH-QD-057: Rectangle size in picture header in
|
|||
|
; OpenCPicture was not calculated correctly.
|
|||
|
; <28> 3/13/91 JT Added the glyph state opcode support to picture drawing drawing
|
|||
|
; under old QuickDraw. This opcode records the state of the Font
|
|||
|
; Manager and TrueType so text will be drawn the same on picture
|
|||
|
; playback as it was during picture recording. Code checked by KON
|
|||
|
; and BAL. BRC numbers 82651 and 79185. Worksheet number KON-022.
|
|||
|
; <27> 2/28/91 KON csd: BRC# 83982 Patch StdRgn to patch PutRgn to handle
|
|||
|
; rectangular regions correctly. This was causing the Finder to
|
|||
|
; crash on the Plus.
|
|||
|
; <26> 2/12/91 KON SMC: BRC# unknown: Close picture opcode ($FF) is not padded to
|
|||
|
; even boundary when creating version 2 pictures on B&W machines.
|
|||
|
; <25> 2/4/91 KON smc: BRC# 81599: Fix calcmask and seedfill so it always scans
|
|||
|
; both up and down.
|
|||
|
; <24> 2/1/91 KON smc: BRC# 81818, Fix round ovals saved in PICT2 for SE, Plus,
|
|||
|
; Portable.
|
|||
|
; <23> 1/25/91 KON DDG: BRC# 81516, When saving to a picture, StdBits assumes that
|
|||
|
; the result will pack into 256 bytes or less. This is not a valid
|
|||
|
; assumption, and for large BitMaps can cause the stack to
|
|||
|
; overflow.
|
|||
|
; <22> 1/16/91 KON Comefrom patch on FixRatio to fix problem with drawing arcs.
|
|||
|
; [smc]
|
|||
|
; <21> 12/14/90 csd & gbm: Change the jShowCursor patch to call the old version
|
|||
|
; instead of jumping into ROM. This allows people who patch
|
|||
|
; jShowCursor, like the Outbound, to work.
|
|||
|
; <20> 11/25/90 gbm (with sab) Fix ROMBind addresses for PutPicLong and PutPicByte
|
|||
|
; on Portable
|
|||
|
; <19> 11/15/90 JSM <bbm> Move _OpenCPort patch from <5> to QuickDrawPatches.a,
|
|||
|
; since it isn't installed on any B&W machines.
|
|||
|
; <18> 11/8/90 KON Stretch chokes when horizonally scaling bitmaps with rowbytes >=
|
|||
|
; $100. The problem is ratiocase assumes reg. D0 is cleared
|
|||
|
; (except the low byte) which it ain't. [CEL]
|
|||
|
; <17> 9/23/90 KON Patch stdbits and stdpoly on portable so Pict2 creation via
|
|||
|
; OpenCpicture works right.
|
|||
|
; <16> 9/21/90 KON Move StdBits patch from PatchSEROM.a, PatchPortableROM.a, and
|
|||
|
; PatchPlusROM.a to this file and make it a linked patch. Added
|
|||
|
; openCpicture stuff for stdbits and stdpoly.
|
|||
|
; <15> 9/14/90 KON Added QDError, RGBForeColor, RGBBackColor, GetForeColor,
|
|||
|
; GetBackColor calls to classic machines.
|
|||
|
; <14> 8/24/90 PKE (per JT) Use new names picQdChExtra and picQdRunSlop instead of
|
|||
|
; picSMgrChar and picSMgrSlop.
|
|||
|
; <13> 8/16/90 dba use VisRgnChanged on II and IIci as well
|
|||
|
; <12> 8/15/90 dba improve the implementation of VisRgnChanged
|
|||
|
; <11> 8/10/90 gbm fix reference to JStdPutPic on the Plus
|
|||
|
; <10> 7/16/90 dba fix ROM binds ROMStdLineRtn, ROMStdLineNotPic, and
|
|||
|
; ROMShowCrsrEntry1 which were all wrong on the Plus
|
|||
|
; <9> 6/27/90 KON Always clear the script manager state variables in the picture
|
|||
|
; save record.
|
|||
|
; <8> 6/27/90 KON Always clear the script manager state information in a picture
|
|||
|
; save record.
|
|||
|
; <7> 6/26/90 KON Fix show cursor so obscure, hide, show leaves cursor obscured.
|
|||
|
; <6> 6/20/90 KON Add OpenCPicture call.
|
|||
|
; <5> 5/30/90 JT Linked patches for OpenPort, OpenCPort, InitPort, SetPort, Line,
|
|||
|
; LineTo, Move, and MoveTo all reset the horizontal pen fraction
|
|||
|
; and fall into the original code.
|
|||
|
; <4> 5/27/90 JT Clear the line layout variables in the picture state record.
|
|||
|
; <3> 5/3/90 JT Set the SCRIPT_CHAR_EXTRA flag according to the system-wide
|
|||
|
; version number and include the Script Manager equates so the
|
|||
|
; various patch files will compile.
|
|||
|
; <2> 4/4/90 KON Make it into a linked patch.
|
|||
|
; 3/26/90 KON Created file, it's ptch 44.
|
|||
|
;
|
|||
|
|
|||
|
|
|||
|
INITFILE EQU 0 ;set to 1 for standalone install, 0 for ptchInstall
|
|||
|
withFonts EQU 1 ;set to 1 to build with font name/ID binding
|
|||
|
wholeErrors EQU 1
|
|||
|
|
|||
|
IF (&TYPE('SCRIPT_CHAR_EXTRA') = 'UNDEFINED') THEN ; <5> CEL
|
|||
|
IF forROM THEN
|
|||
|
SCRIPT_CHAR_EXTRA EQU 0
|
|||
|
ELSE
|
|||
|
SCRIPT_CHAR_EXTRA EQU 1
|
|||
|
ENDIF
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF (&TYPE('hasPenFraction') = 'UNDEFINED') THEN
|
|||
|
IF forROM THEN
|
|||
|
hasPenFraction EQU 0
|
|||
|
ELSE
|
|||
|
hasPenFraction EQU 1
|
|||
|
ENDIF
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF (&TYPE('hasGlyphState') = 'UNDEFINED') THEN
|
|||
|
IF forROM THEN
|
|||
|
hasGlyphState EQU 0
|
|||
|
ELSE
|
|||
|
hasGlyphState EQU 1
|
|||
|
ENDIF
|
|||
|
ENDIF
|
|||
|
|
|||
|
if (&type('onMac') = 'UNDEFINED') then
|
|||
|
if forROM then
|
|||
|
onMac: equ 0
|
|||
|
else
|
|||
|
onMac: equ 1 ; Define as true for non-ROM because this is the way it used to be in
|
|||
|
endif ; the System featurelist in BBSStartup.
|
|||
|
endif
|
|||
|
|
|||
|
if (&type('hasCQD') = 'UNDEFINED') then
|
|||
|
hasCQD: equ 0
|
|||
|
endif
|
|||
|
|
|||
|
INCLUDE 'SysErr.a'
|
|||
|
INCLUDE 'Traps.a'
|
|||
|
INCLUDE 'QuickEqu.a'
|
|||
|
INCLUDE 'SysEqu.a'
|
|||
|
INCLUDE 'GrafTypes.m.a'
|
|||
|
INCLUDE 'LinkedPatchMacros.a'
|
|||
|
INCLUDE 'FixMath.a'
|
|||
|
INCLUDE 'ToolEqu.a'
|
|||
|
INCLUDE 'fontPrivate.a'
|
|||
|
|
|||
|
; Here's a couple of vectors used in a patch below
|
|||
|
;
|
|||
|
PStdPutPic_SE_Portable EQU $0E00+(4*$F0)
|
|||
|
PStdPutPic_Plus EQU $0C00+(4*$F0)
|
|||
|
|
|||
|
;NOTE: $400000 is stripped from the actual rom address on SE and Plus and $900000 from Esprit
|
|||
|
DPEntry ROMBind (Plus, $DAEC), (SE, $00018268), (Portable, $00025664)
|
|||
|
GetVers ROMBind (Plus, $DDA2), (SE, $0001852E), (Portable, $000259C4)
|
|||
|
;DPEntry+$FC
|
|||
|
DPQuit ROMBind (Plus, $DBE8), (SE, $00018364), (Portable, $00025782)
|
|||
|
;DPEntry+$120
|
|||
|
DPGoHome ROMBind (Plus, $DC0C), (SE, $00018388), (Portable, $000257A6)
|
|||
|
;GetVers+$24
|
|||
|
OvalEnd ROMBind (Plus, $DDC6), (SE, $00018552), (Portable, $000259F0)
|
|||
|
;GetVers+$44
|
|||
|
XOrigin ROMBind (Plus, $DDE6), (SE, $00018572), (Portable, $00025A0E)
|
|||
|
;GetVers+$C6
|
|||
|
RomLNOK ROMBind (Plus, $DE68), (SE, $000185F4), (Portable, $00025B26)
|
|||
|
;GetVers+$13C
|
|||
|
RomTextOP ROMBind (Plus, $DEDE), (SE, $0001866A), (Portable, $00025B9C)
|
|||
|
;GetVers+$180
|
|||
|
RomRectOP ROMBind (Plus, $DF22), (SE, $000186AE), (Portable, $00025BEE)
|
|||
|
;GetVers+$19A
|
|||
|
RomRRectOP ROMBind (Plus, $DF3C), (SE, $000186C8), (Portable, $00025C16)
|
|||
|
;GetVers+$1BC
|
|||
|
RomOvalOP ROMBind (Plus, $DF5E), (SE, $000186EA), (Portable, $00025C46)
|
|||
|
;GetVers+$1E0
|
|||
|
RomArcOP ROMBind (Plus, $DF82), (SE, $0001870E), (Portable, $00025C78)
|
|||
|
;GetVers+$1FA
|
|||
|
RomPolyOP ROMBind (Plus, $DF9C), (SE, $00018728), (Portable, $00025CA6)
|
|||
|
;GetVers+$22C
|
|||
|
RomRgnOP ROMBind (Plus, $DFCE), (SE, $0001875A), (Portable, $00025CEA)
|
|||
|
;GetVers+$326
|
|||
|
RomBits ROMBind (Plus, $E0C8), (SE, $00018854), (Portable, $00025E58)
|
|||
|
;GetVers+$33A
|
|||
|
RomCommentOP ROMBind (Plus, $E0DC), (SE, $00018868), (Portable, $00025EEE)
|
|||
|
;GetVers+$35E
|
|||
|
RomLongCom ROMBind (Plus, $E100), (SE, $0001888C), (Portable, $00025F12)
|
|||
|
;GetVers+$458
|
|||
|
RomGetRect ROMBind (Plus, $E1FA), (SE, $00018986), (Portable, $00025FC8)
|
|||
|
;GetVers+$4BC
|
|||
|
RomKill1 ROMBind (Plus, $E25E), (SE, $000189EA), (Portable, $00026052)
|
|||
|
;GetVers+$4C4
|
|||
|
RomAbort ROMBind (Plus, $E266), (SE, $000189F2), (Portable, $0002605A)
|
|||
|
;GetVers+$4CC
|
|||
|
RomDone ROMBind (Plus, $E26E), (SE, $000189FA), (Portable, $00026062)
|
|||
|
;DPEntry+$1EC
|
|||
|
RomXClip ROMBind (Plus, $DCD8), (SE, $00018454), (Portable, $000258E0)
|
|||
|
;DPEntry+$1F8
|
|||
|
RomXClip2 ROMBind (Plus, $DCE4), (SE, $00018460), (Portable, $000258EC)
|
|||
|
;DPEntry+$272
|
|||
|
RomXPnSize ROMBind (Plus, $DD5E), (SE, $000184DA), (Portable, $00025974)
|
|||
|
|
|||
|
ROMPutPicData ROMBind (SE, $18A1A), (Plus, $0E28E), \
|
|||
|
(Portable,$263FA) ;Trap=KillPicture
|
|||
|
|
|||
|
ROMDPutPicByte ROMBind (SE, $18A30), (Plus, $0E2A4), \
|
|||
|
(Portable,$26410) ;Trap=KillPicture
|
|||
|
|
|||
|
|
|||
|
ROMPutPicRgn ROMBind (Plus, $E32C), (SE, $00018AB8), (Portable, $00026498)
|
|||
|
ROMCopyRgn ROMBind (Plus, $BDFE), (SE, $0001656E), (Portable, $00023654)
|
|||
|
ROMEqualRgn ROMBind (Plus, $BFA0), (SE, $00016710), (Portable, $000237F6)
|
|||
|
|
|||
|
|
|||
|
;xxx Fix Me: portable needs putPicByte address
|
|||
|
|
|||
|
ROMPutPicByte ROMBind (SE, $18A36), (Plus, $0E2AA), \
|
|||
|
(Portable,$26416) ;Trap=KillPicture
|
|||
|
|
|||
|
ROMPutPicWord ROMBind (SE, $18A48), (Plus, $0E2BC), \
|
|||
|
(Portable,$26428) ;Trap=KillPicture
|
|||
|
|
|||
|
ROMPutPicLong ROMBind (SE, $18A5A), (Plus, $0E2CE), \
|
|||
|
(Portable,$2643A) ;Trap=KillPicture
|
|||
|
|
|||
|
;Open Picture + $34
|
|||
|
OpenPictptchEntry ROMBind (Plus, $DA20), (SE, $0001819C), (Portable, $00025598)
|
|||
|
;Open Picture + $B2
|
|||
|
OpenPictDone ROMBind (Plus, $DA9E), (SE, $0001821A), (Portable, $00025616)
|
|||
|
|
|||
|
;Close Picture + $E
|
|||
|
ClosePictptchEntry ROMBind (Plus, $DAB6), (SE, $00018232), (Portable, $0002562e)
|
|||
|
ClosePictptchEntryNew ROMBind (Plus, $DABC), (SE, $00018238), (Portable, $00025634)
|
|||
|
;Close Picture + $36
|
|||
|
ClosePictGoHome ROMBind (Plus, $DADE), (SE, $0001825A), (Portable, $00025656)
|
|||
|
|
|||
|
; put data to picture routines
|
|||
|
|
|||
|
|
|||
|
ROMStdBitsStart2 ROMBind (Plus, $CA06), (SE, $17182), (Portable, $24510)
|
|||
|
ROMStdBitsOK ROMBind (Plus, $CA0A), (SE, $17186), (Portable, $24514)
|
|||
|
ROMStdBitsNotPic ROMBind (Plus, $CA0C), (SE, $17188), (Portable, $24516)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
ROMStdLineRtn ROMBind (Plus, $967C), (SE, $13DEC), (Portable, $20832)
|
|||
|
ROMStdLineNotPic ROMBind (Plus, $96E8), (SE, $13E58), (Portable, $2089E)
|
|||
|
|
|||
|
ROMStdRectRtn ROMBind (Plus, $9E96), (SE, $14606), (Portable, $2104C)
|
|||
|
ROMStdRectNotPic ROMBind (Plus, $9EA4), (SE, $14614), (Portable, $2105A)
|
|||
|
|
|||
|
ROMStdRRectRtn ROMBind (Plus, $ACA8), (SE, $15418), (Portable, $21E5E)
|
|||
|
ROMStdRRectNotPic ROMBind (Plus, $ACB6), (SE, $15426), (Portable, $21E6C)
|
|||
|
|
|||
|
ROMStdOvalRtn ROMBind (Plus, $AD64), (SE, $154D4), (Portable, $21F1A)
|
|||
|
ROMStdOvalNotPic ROMBind (Plus, $AD72), (SE, $154E2), (Portable, $21F28)
|
|||
|
|
|||
|
ROMStdArcRtn ROMBind (Plus, $AF70), (SE, $156E0), (Portable, $22126)
|
|||
|
ROMStdArcNotPic ROMBind (Plus, $AF8E), (SE, $156FE), (Portable, $22144)
|
|||
|
|
|||
|
ROMStdRgnRtn ROMBind (Plus, $BC0E), (SE, $1637E), (Portable, $23464)
|
|||
|
ROMStdRgnNotPic ROMBind (Plus, $BC20), (SE, $16390), (Portable, $23476)
|
|||
|
|
|||
|
ROMStdComment ROMBind (Plus, $D8D0), (SE, $1804C), (Portable, $2544E)
|
|||
|
|
|||
|
ROMShowCrsr ROMBind (Plus, $1CE6), (SE, $18E18), (Portable, $267F8)
|
|||
|
|
|||
|
ROMStdPolyRtn ROMBind (Portable, $22B50)
|
|||
|
ROMStdPolyNotPic ROMBind (Portable, $22B60)
|
|||
|
PortableStdBitsNotPict ROMBind (Portable, $24516)
|
|||
|
PortableStdBitsRtn ROMBind (Portable, $243E8)
|
|||
|
|
|||
|
;
|
|||
|
; Binds for CalcMask and SeedFill
|
|||
|
;
|
|||
|
ROMGoHome ROMBind (Plus, $CE7C), (SE, $175F8), (Portable, $24986)
|
|||
|
ROMSeedFill ROMBind (Plus, $CDBC), (SE, $17538), (Portable, $248C6)
|
|||
|
|
|||
|
;
|
|||
|
; the following Plus and SE binds were taken from QuickPolysClassicPatch.a
|
|||
|
; and are used by that file only
|
|||
|
;
|
|||
|
|
|||
|
ROMShowCursor ROMBIND (SE, $12A2E), (Plus, $82F8)
|
|||
|
ROMShieldCursor ROMBIND (SE, $12A34), (Plus, $82FE)
|
|||
|
ROMMaskTab ROMBIND (SE, $12B6E), (Plus, $8438)
|
|||
|
ROMPatExpand ROMBIND (SE, $12BCE), (Plus, $8498)
|
|||
|
ROMColorMap ROMBIND (SE, $12C96), (Plus, $8560)
|
|||
|
ROMXorSlab ROMBIND (SE, $12D78), (Plus, $8642)
|
|||
|
ROMDrawSlab ROMBIND (SE, $12DBC), (Plus, $8686)
|
|||
|
ROMSlabMode ROMBIND (SE, $12E4C), (Plus, $8716)
|
|||
|
ROMFastSlabMode ROMBIND (SE, $12EA6), (Plus, $8770)
|
|||
|
ROMPushVerb ROMBIND (SE, $14650), (Plus, $9EE0)
|
|||
|
ROMRSect ROMBIND (SE, $14880), (Plus, $A110)
|
|||
|
ROMSeekMask ROMBIND (SE, $15DC4), (Plus, $B654)
|
|||
|
ROMFrPoly ROMBIND (SE, $162D0), (Plus, $BB60)
|
|||
|
ROMTrimRect ROMBIND (SE, $1692A), (Plus, $C1BA)
|
|||
|
ROMInitRgn ROMBIND (SE, $16A36), (Plus, $C2C6)
|
|||
|
ROMDrawRect ROMBIND (SE, $146C8), (Plus,$9F58)
|
|||
|
;PutPicVerb Equ $418AD6 ;call routine in this file instead
|
|||
|
;ROMPutPicRgn Equ $418AB8 ;already defined
|
|||
|
|
|||
|
;------------------
|
|||
|
; GetPMData trap
|
|||
|
;
|
|||
|
INCLUDE 'GetPMData.a'
|
|||
|
;
|
|||
|
;------------------
|
|||
|
|
|||
|
;
|
|||
|
; ----- Add GWorld calls. This needs to broken off into it's own file --------
|
|||
|
;
|
|||
|
include 'QDOffscreenEqu.a'
|
|||
|
|
|||
|
; put these in some romantic equate file when you are inspired
|
|||
|
|
|||
|
macro
|
|||
|
_NewHandleCommaTemp
|
|||
|
import NewHandleCommaTemp
|
|||
|
jsr NewHandleCommaTemp
|
|||
|
endm
|
|||
|
|
|||
|
macro
|
|||
|
rtd_a0 ¶ms
|
|||
|
if &eval(¶ms) = 0 then
|
|||
|
rts
|
|||
|
else
|
|||
|
if &setting('MACHINE') <> 'MC68000' then
|
|||
|
rtd #¶ms
|
|||
|
else
|
|||
|
if &eval(¶ms) = 4 then
|
|||
|
move.l (sp)+,(sp)
|
|||
|
rts
|
|||
|
elseif &eval(¶ms) <= 8 then
|
|||
|
move.l (sp)+,a0
|
|||
|
addq #¶ms,sp
|
|||
|
jmp (a0)
|
|||
|
else
|
|||
|
move.l (sp)+,a0
|
|||
|
lea ¶ms(sp),sp
|
|||
|
jmp (a0)
|
|||
|
endif
|
|||
|
endif
|
|||
|
endif
|
|||
|
endm
|
|||
|
|
|||
|
INCLUDE 'ClassicGWorld.a'
|
|||
|
;
|
|||
|
; --------------- End of ClassicGWorld stuff -----------------
|
|||
|
;
|
|||
|
;=========================================================================================
|
|||
|
;=========================================================================================
|
|||
|
;
|
|||
|
; ComeFrom patch on FixRatio to see if from arc drawing
|
|||
|
;
|
|||
|
;=========================================================================================
|
|||
|
;=========================================================================================
|
|||
|
|
|||
|
FromDrawArc ROMBind (Plus, $B17E), (SE, $158EE), (Portable, $22334)
|
|||
|
|
|||
|
newFixRatio ComeFromPatchProc _FixRatio, FromDrawArc, (Plus,SE,Portable)
|
|||
|
IMPORT FromDrawArc
|
|||
|
|
|||
|
;------------------------------------------------
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMETERS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 20 ;TOTAL SIZE OF PARAMETERS
|
|||
|
DSTRECT EQU PARAMSIZE+8-4 ;ADDR OF RECT
|
|||
|
HOLLOW EQU DSTRECT-2 ;BOOLEAN
|
|||
|
OVALWIDTH EQU HOLLOW-2 ;INTEGER
|
|||
|
OVALHEIGHT EQU OVALWIDTH-2 ;INTEGER
|
|||
|
MODE EQU OVALHEIGHT-2 ;INTEGER
|
|||
|
PAT EQU MODE-4 ;LONG, ADDR OF PATTERN
|
|||
|
STARTANGLE EQU PAT-2 ;INTEGER
|
|||
|
ARCANGLE EQU STARTANGLE-2 ;INTEGER
|
|||
|
|
|||
|
;------------------------------------------------------
|
|||
|
;
|
|||
|
; OFFSETS IN AN OVAL STATE RECORD:
|
|||
|
;
|
|||
|
OVALTOP EQU 0 ;INTEGER
|
|||
|
OVALBOT EQU OVALTOP+2 ;INTEGER
|
|||
|
OVALY EQU OVALBOT+2 ;INTEGER
|
|||
|
RSQYSQ EQU OVALY+2 ;LONGINT
|
|||
|
SQUARE EQU RSQYSQ+4 ;64 BIT LONGFIX
|
|||
|
ODDNUM EQU SQUARE+8 ;64 BIT LONGFIX
|
|||
|
ODDBUMP EQU ODDNUM+8 ;64 BIT LONGFIX
|
|||
|
LEFTEDGE EQU ODDBUMP+8 ;32 BIT FIXED POINT
|
|||
|
RIGHTEDGE EQU LEFTEDGE+4 ;32 BIT FIXED POINT
|
|||
|
ONEHALF EQU RIGHTEDGE+4 ;32 BIT FIXED POINT
|
|||
|
OVALSIZE EQU ONEHALF+4 ;SIZE OF AN OVALREC
|
|||
|
|
|||
|
;-------------------------------------------------
|
|||
|
;
|
|||
|
; A6 OFFSETS OF LOCAL VARIABLES AFTER LINK:
|
|||
|
;
|
|||
|
EXPAT EQU -64 ;16 LONGS
|
|||
|
MINRECT EQU EXPAT-8 ;RECT
|
|||
|
STATEA EQU MINRECT-RGNREC ;RGN STATE RECORD
|
|||
|
STATEB EQU STATEA-RGNREC ;RGN STATE RECORD
|
|||
|
STATEC EQU STATEB-RGNREC ;RGN STATE RECORD
|
|||
|
SAVESTK EQU STATEC-4 ;LONG
|
|||
|
RECTFLAG EQU SAVESTK-2 ;WORD
|
|||
|
MASKBUF EQU RECTFLAG-4 ;LONG
|
|||
|
BUFLEFT EQU MASKBUF-2 ;WORD
|
|||
|
BUFSIZE EQU BUFLEFT-2 ;WORD
|
|||
|
MODECASE EQU BUFSIZE-4 ;LONG
|
|||
|
DSTLEFT EQU MODECASE-4 ;LONG
|
|||
|
SAVEA5 EQU DSTLEFT-4 ;LONG
|
|||
|
PORT EQU SAVEA5-4 ;LONG
|
|||
|
FASTFLAG EQU PORT-2 ;BYTE
|
|||
|
EXTRARECT EQU FASTFLAG-8 ;RECT
|
|||
|
INNEROVAL EQU EXTRARECT-OVALSIZE ;OVAL RECORD
|
|||
|
OUTEROVAL EQU INNEROVAL-OVALSIZE ;OVAL RECORD
|
|||
|
SKIPTOP EQU OUTEROVAL-2 ;WORD
|
|||
|
SKIPBOT EQU SKIPTOP-2 ;WORD
|
|||
|
ARCFLAG EQU SKIPBOT-1 ;BYTE FLAG
|
|||
|
SKIPFLAG EQU ARCFLAG-1 ;BYTE FLAG
|
|||
|
STOPANGLE EQU SKIPFLAG-2 ;INTEGER
|
|||
|
MIDVERT EQU STOPANGLE-2 ;INTEGER
|
|||
|
MIDHORIZ EQU MIDVERT-2 ;INTEGER
|
|||
|
WIDTH EQU MIDHORIZ-2 ;INTEGER
|
|||
|
HEIGHT EQU WIDTH-2 ;INTEGER
|
|||
|
SLOPE1 EQU HEIGHT-4 ;LONG, FIXED POINT
|
|||
|
SLOPE2 EQU SLOPE1-4 ;LONG, FIXED POINT
|
|||
|
LINE1 EQU SLOPE2-4 ;LONG, FIXED POINT
|
|||
|
LINE2 EQU LINE1-4 ;LONG, FIXED POINT
|
|||
|
FLAG1 EQU LINE2-2 ;WORD
|
|||
|
FLAG2 EQU FLAG1-2 ;WORD
|
|||
|
OUTERLEFT EQU FLAG2-2 ;WORD
|
|||
|
OUTERRIGHT EQU OUTERLEFT-2 ;WORD
|
|||
|
INNERLEFT EQU OUTERRIGHT-2 ;WORD
|
|||
|
INNERRIGHT EQU INNERLEFT-2 ;WORD
|
|||
|
PATINDEX EQU INNERRIGHT-2 ;WORD
|
|||
|
VARSIZE EQU PATINDEX ;SIZE OF LOCAL VARIABLES
|
|||
|
|
|||
|
|
|||
|
MOVE.L DSTRECT(A6),A0 ;POINT TO DSTRECT
|
|||
|
MOVE TOP(A0),A1
|
|||
|
ADD BOTTOM(A0),A1
|
|||
|
MOVE.L A1,D0
|
|||
|
ASR.L #1,D0
|
|||
|
MOVE D0,MIDVERT(A6) ;MID VERT := (DSTBOT+DSTTOP)/2
|
|||
|
|
|||
|
MOVE LEFT(A0),A1
|
|||
|
ADD RIGHT(A0),A1
|
|||
|
MOVE.L A1,D0
|
|||
|
ASR.L #1,D0
|
|||
|
MOVE D0,MIDHORIZ(A6) ;MID HORIZ := (DSTLEFT+DSTRIGHT)/2
|
|||
|
|
|||
|
jmpOld
|
|||
|
|
|||
|
ENDPROC
|
|||
|
|
|||
|
;---------------- This stuff taken from PatchSEROM and PatchPlusROM ---------
|
|||
|
;___________________________________________________________________________
|
|||
|
; Patch PMA361 18Jan88 AWC StdPoly from QuickPolysClassicPatch.a
|
|||
|
;
|
|||
|
; Fix File Date Patch# Fix Routine(s) Routine(s) Fixed
|
|||
|
;AppleSystemPatch PatchSEROM.a 18Jan88 #PMA361 (StdPoly) (StdPoly)
|
|||
|
;
|
|||
|
; This patch speeds up polygons ENORMOUSLY (well, maybe just a fair bit).
|
|||
|
; But wait -- there's more! You also get this non-explosive way of drawing polygons!
|
|||
|
|
|||
|
PatchPMA361 PROC EXPORT
|
|||
|
INCLUDE 'QuickPolysClassicPatch.a'
|
|||
|
|
|||
|
;---------------- End of stuff taken from PatchSEROM and PatchPlusROM -------
|
|||
|
|
|||
|
VisRgnChanged PROC EXPORT ;<26MAR90 KON>
|
|||
|
;-----------------------------------------------------------
|
|||
|
;
|
|||
|
; Procedure VisRgnChanged(thePort: GrafPort);
|
|||
|
;
|
|||
|
; This call will be needed for video windows so the mask plane
|
|||
|
; for touchstone can be updated. Non-video QD simply returns.
|
|||
|
;
|
|||
|
rts
|
|||
|
ENDPROC
|
|||
|
|
|||
|
StretchBits PROC EXPORT
|
|||
|
IMPORT RgnBlt,RSect,ShieldCursor,ShowCursor
|
|||
|
IMPORT InitRgn,SeekRgn,SetupStretch,ColorMap,XorSlab
|
|||
|
;--------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StretchBits(srcBits,dstBits: BitMap;
|
|||
|
; srcRect,dstRect: Rect;
|
|||
|
; mode: INTEGER
|
|||
|
; rgnA,rgnB,rgnC: RgnHandle);
|
|||
|
;
|
|||
|
; Transfer a rectangle of bits from srcBits to dstBits,
|
|||
|
; stretching or compressing according to srcRect and dstRect.
|
|||
|
; The transfer is clipped to the intersection of rgnA, rgnB, and rgnC.
|
|||
|
;
|
|||
|
;
|
|||
|
; Restrictions:
|
|||
|
;
|
|||
|
; transfer mode 0..7 only.
|
|||
|
; if numer <> denom, then src and dst bitmaps do not overlap.
|
|||
|
;
|
|||
|
;
|
|||
|
; COPYRIGHT APPLE COMPUTER INC.
|
|||
|
; DESIGNED AND WRITTEN BY BILL ATKINSON
|
|||
|
;
|
|||
|
|
|||
|
|
|||
|
;----------------------------------------------------
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMETERS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 30 ;TOTAL BYTES OF PARAMETERS
|
|||
|
SRCBITS EQU PARAMSIZE+8-4 ;LONG, ADDR OF BITMAP
|
|||
|
DSTBITS EQU SRCBITS-4 ;LONG, ADDR OF BITMAP
|
|||
|
SRCRECT EQU DSTBITS-4 ;LONG, ADDR OF RECT
|
|||
|
DSTRECT EQU SRCRECT-4 ;LONG, ADDR OF RECT
|
|||
|
MODE EQU DSTRECT-2 ;WORD
|
|||
|
RGNA EQU MODE-4 ;RGNHANDLE
|
|||
|
RGNB EQU RGNA-4 ;RGNHANDLE
|
|||
|
RGNC EQU RGNB-4 ;RGNHANDLE
|
|||
|
|
|||
|
|
|||
|
;-------------------------------------------------
|
|||
|
;
|
|||
|
; A6 OFFSETS OF LOCAL VARIABLES AFTER LINK:
|
|||
|
;
|
|||
|
NUMER EQU -4 ;POINT
|
|||
|
DENOM EQU NUMER-4 ;POINT
|
|||
|
VERROR EQU DENOM-4 ;INTEGER
|
|||
|
MINRECT EQU VERROR-8 ;RECT
|
|||
|
SRCBUF EQU MINRECT-4 ;LONG
|
|||
|
DSTBUF EQU SRCBUF-4 ;LONG
|
|||
|
SRCLONGS EQU DSTBUF-2 ;WORD
|
|||
|
DSTLONGS EQU SRCLONGS-2 ;WORD
|
|||
|
STATEA EQU DSTLONGS-RGNREC ;RGN STATE RECORD
|
|||
|
STATEB EQU STATEA-RGNREC ;RGN STATE RECORD
|
|||
|
STATEC EQU STATEB-RGNREC ;RGN STATE RECORD
|
|||
|
SAVESTK EQU STATEC-4 ;LONG
|
|||
|
RECTFLAG EQU SAVESTK-2 ;WORD
|
|||
|
MASKBUF EQU RECTFLAG-4 ;LONG
|
|||
|
BUFLEFT EQU MASKBUF-2 ;WORD
|
|||
|
BUFSIZE EQU BUFLEFT-2 ;WORD
|
|||
|
SRCADDR EQU BUFSIZE-4 ;LONG
|
|||
|
DSTADDR EQU SRCADDR-4 ;LONG
|
|||
|
SRCROW EQU DSTADDR-4 ;LONG
|
|||
|
DSTROW EQU SRCROW-4 ;LONG
|
|||
|
SRCLIMIT EQU DSTROW-4 ;LONG
|
|||
|
VERT EQU SRCLIMIT-2 ;WORD
|
|||
|
MODECASE EQU VERT-4 ;LONG
|
|||
|
PAT EQU MODECASE-4 ;LONG, ADDR OF PAT
|
|||
|
RATIOCASE EQU PAT-4 ;LONG
|
|||
|
HORIZFRACTION EQU RATIOCASE-2 ;WORD
|
|||
|
VARSIZE EQU HORIZFRACTION ;SIZE OF LOCAL VARIABLES
|
|||
|
|
|||
|
LINK A6,#VARSIZE ;ALLOCATE LOCAL VARIABLES
|
|||
|
MOVEM.L D0-D7/A1-A4,-(SP) ;SAVE REGS
|
|||
|
MOVE.L SP,SAVESTK(A6) ;REMEMBER STACK FOR LATER
|
|||
|
|
|||
|
;----------------------------------------------------------------
|
|||
|
;
|
|||
|
; CALC NUMER AND DENOM BASED ON DSTRECT AND SRCRECT.
|
|||
|
; IF NUMER = DENOM THEN JUST CALL RGNBLT.
|
|||
|
;
|
|||
|
MOVE.L DSTRECT(A6),A0 ;POINT TO DSTRECT
|
|||
|
MOVE BOTTOM(A0),D0
|
|||
|
SUB TOP(A0),D0 ;CALC DST HEIGHT
|
|||
|
SWAP D0 ;PUT IN HI WORD
|
|||
|
MOVE RIGHT(A0),D0
|
|||
|
SUB LEFT(A0),D0 ;CALC DST WIDTH
|
|||
|
|
|||
|
MOVE.L SRCRECT(A6),A0 ;POINT TO SRCRECT
|
|||
|
MOVE BOTTOM(A0),D1
|
|||
|
SUB TOP(A0),D1 ;CALC SRC HEIGHT
|
|||
|
SWAP D1 ;PUT IN HI WORD
|
|||
|
MOVE RIGHT(A0),D1
|
|||
|
SUB LEFT(A0),D1 ;CALC SRC WIDTH
|
|||
|
CMP.L D0,D1 ;ARE BOTH RECTS SAME SIZE
|
|||
|
BNE.S STRETCH ;NO, CAN'T USE RGNBLT
|
|||
|
|
|||
|
XRGNBLT
|
|||
|
jmpROM ROMXRGNBLT ;back to the ROM
|
|||
|
; MOVE.L SRCBITS(A6),-(SP) ;PUSH SRCBITS
|
|||
|
; MOVE.L DSTBITS(A6),-(SP) ;PUSH DSTBITS
|
|||
|
; MOVE.L SRCRECT(A6),-(SP) ;PUSH SRCRECT
|
|||
|
; MOVE.L DSTRECT(A6),-(SP) ;PUSH DSTRECT
|
|||
|
; MOVE MODE(A6),-(SP) ;PUSH MODE
|
|||
|
; MOVE.L PAT(A6),-(SP) ;PAT ONLY USED FROM BELOW
|
|||
|
; MOVE.L RGNA(A6),-(SP) ;PUSH RGNA
|
|||
|
; MOVE.L RGNB(A6),-(SP) ;PUSH RGNB
|
|||
|
; MOVE.L RGNC(A6),-(SP) ;PUSH RGNC
|
|||
|
; JSR RGNBLT ;CALL RGNBLT
|
|||
|
; BRA GOHOME ;AND QUIT
|
|||
|
|
|||
|
MiniHeadPatch
|
|||
|
moveq #0,d0 ; <KON 6NOV90>
|
|||
|
MyJumpLoc
|
|||
|
jmp $40800000 ; <KON 6NOV90>
|
|||
|
|
|||
|
STRETCH MOVE.L D0,NUMER(A6) ;NUMER := DST SIZE
|
|||
|
MOVE.L D1,DENOM(A6) ;DENOM := SRC SIZE
|
|||
|
jsrROM ROMSetupStretch ;CALC CASEJUMP AND HORIZ FRACT <KON 6NOV90>
|
|||
|
lea MyJumpLoc+2,a1 ; <KON 6NOV90>
|
|||
|
move.l a0,(a1) ;Save address of routine <KON 6NOV90>
|
|||
|
lea MiniHeadPatch,a0 ;Address of my head patch <KON 6NOV90>
|
|||
|
jmpROM ROMBackToROM ; <KON 6NOV90>
|
|||
|
; MOVE.L A0,RATIOCASE(A6) ;SAVE CASE JUMP FOR LATER
|
|||
|
; MOVE D0,HORIZFRACTION(A6) ;SAVE FRACTION FOR LATER
|
|||
|
|
|||
|
|
|||
|
ROMXRGNBLT ROMBind (Plus, $D09A), (SE, $17816), (Portable, $24BD4)
|
|||
|
ROMSetupStretch ROMBind (Plus, $D52E), (SE, $17CAA), (Portable, $25068)
|
|||
|
ROMBackToROM ROMBind (Plus, $D0D2), (SE, $1784E), (Portable, $24C0C)
|
|||
|
|
|||
|
ENDPROC
|
|||
|
|
|||
|
NewStdGetPic FUNC EXPORT
|
|||
|
;------------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StdGetPic(dataPtr: QDPtr; byteCount: INTEGER);
|
|||
|
; Fix File Date Patch# Fix Routine(s) Routine(s) Fixed
|
|||
|
;AppleSystemPatch DrawPicturePatch.a 01Jan1904 #??? (StdGetPic) (StdGetPic)
|
|||
|
;
|
|||
|
;
|
|||
|
|
|||
|
MOVE.L (SP)+,A0 ;POP RETURN ADDR
|
|||
|
MOVE (SP)+,D1 ;POP BYTECOUNT
|
|||
|
MOVE.L (SP)+,A1 ;POP DATAPTR
|
|||
|
MOVE.L A0,-(SP) ;PUSH RETURN ADDR
|
|||
|
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
|
|||
|
MOVE.L PLAYINDEX(A0),D0 ;GET PLAYINDEX
|
|||
|
MOVE.L PLAYPIC(A0),A0 ;GET PLAY PICHANDLE
|
|||
|
MOVE.L (A0),A0 ;DE-REFERENCE IT
|
|||
|
ADD.L D0,A0 ;ADD PLAYINDEX
|
|||
|
BRA.S START ;GO TO LOOP START
|
|||
|
NXTBYTE MOVE.B (A0)+,(A1)+ ;COPY ONE BYTE
|
|||
|
START DBRA D1,NXTBYTE ;LOOP FOR ALL BYTES
|
|||
|
RTS ;AND RETURN
|
|||
|
|
|||
|
|
|||
|
;----------------------------------
|
|||
|
|
|||
|
|
|||
|
;
|
|||
|
; procedure RGBForeColor (Color : RGBColor);
|
|||
|
; procedure RGBBackColor (Color : RGBColor);
|
|||
|
; procedure GetForeColor (VAR Color : RGBColor);
|
|||
|
; procedure GetBackColor (VAR Color : RGBColor);
|
|||
|
; <14Sept90 KON>
|
|||
|
;
|
|||
|
RGBForeColor PROC EXPORT
|
|||
|
EXPORT RGBBackColor
|
|||
|
IMPORT RGB2OLD
|
|||
|
|
|||
|
MOVEQ #FGCOLOR,D0 ; get offset to index field
|
|||
|
|
|||
|
SHARE MOVE.L 4(SP),A1 ; point at the RGB color
|
|||
|
MOVE.L GRAFGLOBALS(A5),A0 ; get the QuickDraw globals pointer
|
|||
|
MOVE.L THEPORT(A0),A0 ; point at the port
|
|||
|
PEA 0(A0,D0) ; save pointer to the index field
|
|||
|
JSR RGB2OLD ; else convert RGB to old color
|
|||
|
|
|||
|
DONE MOVE.L (SP)+,A0 ; get pointer to index field
|
|||
|
MOVE.L D0,(A0) ; and set the index field
|
|||
|
RTD_a0 4 ; all done
|
|||
|
|
|||
|
;
|
|||
|
; procedure RGBBackColor (Color : RGBColor);
|
|||
|
;
|
|||
|
; This routine takes an RGB triple and sets the current Graf- or CGrafPort
|
|||
|
; fields so that drawing will take place with the best match of the
|
|||
|
; requested color, using the current GDevice's color matching rules. The
|
|||
|
; appropriate fields are set depending on portType.
|
|||
|
;
|
|||
|
|
|||
|
RGBBackColor
|
|||
|
|
|||
|
MOVEQ #BKCOLOR,D0 ; get offset to the index field
|
|||
|
BRA.S SHARE ; => and use common code
|
|||
|
ENDPROC
|
|||
|
|
|||
|
;
|
|||
|
; PROCEDURE GetForeColor (VAR Color: RGBColor);
|
|||
|
;
|
|||
|
; Return the RGB components of the current foreground color
|
|||
|
; Works for old and new ports.
|
|||
|
|
|||
|
|
|||
|
GetForeColor PROC EXPORT
|
|||
|
EXPORT GetBackColor
|
|||
|
|
|||
|
MOVEQ #FGCOLOR,D0 ; get offset to the index field
|
|||
|
MOVEQ #RGBFgColor,D1 ; get offset to RGB field
|
|||
|
|
|||
|
SHARE MOVE.L 4(SP),A1 ; point at the RGB color
|
|||
|
MOVE.L GRAFGLOBALS(A5),A0 ; get the QuickDraw globals pointer
|
|||
|
MOVE.L THEPORT(A0),A0 ; point at the port
|
|||
|
; USE CMYB BITS IN COLOR TO DERIVE PROPER RGB COMPONENTS
|
|||
|
|
|||
|
MOVE.L (A0,D0),D0 ; get planar color from port
|
|||
|
LSR #1,D0 ; CHECK FOR WHITE (I CMYB rgbw)
|
|||
|
BCS.S @BLACK ; =>NOT WHITE
|
|||
|
OR #$00E0,D0 ; ELSE SET WHITE BITS (CMY = 111)
|
|||
|
@BLACK LSR #5,D0 ; SHIFT ICMY INTO LOW NIBBLE
|
|||
|
AND #$7,D0 ; CLEAR ALL BUT CMY
|
|||
|
lea InLineQDColors,A0 ; GET DEFAULT COLORS
|
|||
|
; LEA 2(A0,D0*8),A0 ; point to proper entry
|
|||
|
lsl.w #3,d0 ;d0*8
|
|||
|
lea 2(a0,d0),a0 ;point to entry
|
|||
|
|
|||
|
MOVE.L (A0)+,(A1)+ ; copy red, green
|
|||
|
MOVE (A0)+,(A1)+ ; copy blue
|
|||
|
|
|||
|
; MOVE.L red(A0,D1),red(A1) ; copy red and green components from the port <34>
|
|||
|
; MOVE.W blue(A0,D1),blue(A1) ; and blue too <34>
|
|||
|
|
|||
|
DONE MOVE.L (SP)+,A0 ; get the return address
|
|||
|
ADDQ #4,SP ; get rid of the parameter
|
|||
|
JMP (A0) ; and return
|
|||
|
|
|||
|
;
|
|||
|
; On color machines this table resides in low memory pointed to by the QDColors global
|
|||
|
; variable.
|
|||
|
;
|
|||
|
InLineQDColors
|
|||
|
dc.w $0000, $0000, $0000, $0000 ;0 black
|
|||
|
dc.w $0001, $FC00, $F37D, $052F ;1 yellow
|
|||
|
dc.w $0002, $F2D7, $0856, $84EC ;2 magenta
|
|||
|
dc.w $0003, $DD6B, $08C2, $06A2 ;3 red
|
|||
|
dc.w $0004, $0241, $AB54, $EAFF ;4 cyan
|
|||
|
dc.w $0005, $0000, $8000, $11B0 ;5 green
|
|||
|
dc.w $0006, $0000, $0000, $D400 ;6 blue
|
|||
|
dc.w $0007, $FFFF, $FFFF, $FFFF ;7 white
|
|||
|
|
|||
|
;
|
|||
|
; PROCEDURE GetBackColor (VAR Color: RGBColor);
|
|||
|
;
|
|||
|
; Return the RGB components of the current background color
|
|||
|
; Works for old and new ports.
|
|||
|
;
|
|||
|
|
|||
|
GetBackColor
|
|||
|
|
|||
|
MOVEQ #BKCOLOR,D0 ; get offset to the index field
|
|||
|
MOVEQ #RGBBkColor,D1 ; get offset to RGB field
|
|||
|
BRA.S SHARE ; and use common code
|
|||
|
|
|||
|
ENDPROC
|
|||
|
|
|||
|
QDError PROC EXPORT
|
|||
|
clr.w 4(a7)
|
|||
|
rts
|
|||
|
ENDPROC
|
|||
|
|
|||
|
OpenCPicture FUNC EXPORT
|
|||
|
IMPORT HidePen,NewRgn,ClipRect,DPutPicOp,DPutPicByte,PUTPICWORD,PUTPICDATA
|
|||
|
;------------------------------------------------------
|
|||
|
;
|
|||
|
; Offsets in parameter block passed to OpenCPicture
|
|||
|
;
|
|||
|
ppSrcRect EQU 0 ;Rect
|
|||
|
ppHRes EQU ppSrcRect+8 ;Fixed
|
|||
|
ppVRes EQU ppHRes+4 ;Fixed
|
|||
|
ppVersion EQU ppVRes+4 ;Word (=0)
|
|||
|
ppReserved EQU ppVersion+2 ;Word
|
|||
|
ppReserved2 EQU ppReserved+2 ;Long
|
|||
|
PicParamSize EQU ppReserved2+4 ;size of a PICT2 header record
|
|||
|
|
|||
|
|
|||
|
;------------------------------------------------------
|
|||
|
;
|
|||
|
; New offsets in a PICT2 header record:
|
|||
|
;
|
|||
|
hdrVersion EQU 0 ;Word (=-2)
|
|||
|
hdrReserved EQU hdrVersion+2 ;Word
|
|||
|
hdrHRes EQU hdrReserved+2 ;Fixed
|
|||
|
hdrVRes EQU hdrHRes+4 ;Fixed
|
|||
|
hdrSrcRect EQU hdrVRes+4 ;Rect
|
|||
|
hdrReserved2 EQU hdrSrcRect+8 ;Long
|
|||
|
picHdrSize EQU hdrReserved2+4 ;size of a PICT2 header record
|
|||
|
;------------------------------------------------------------------
|
|||
|
|
|||
|
;
|
|||
|
; FUNCTION OpenCPicture(picParams: params): cPicHandle;
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 4
|
|||
|
RESULT EQU PARAMSIZE+8 ;LONG, PICHANDLE
|
|||
|
params EQU RESULT-4 ;ptr to input params
|
|||
|
|
|||
|
SAVEVERSION EQU -2 ;PICTURE VERSION NUMBER
|
|||
|
picHdrRec EQU SAVEVERSION-picHdrSize ;PICT2 header record
|
|||
|
defaultFrame EQU picHdrRec-8 ;pic frame to be recorded in picture
|
|||
|
VARSIZE EQU defaultFrame ;TOTAL BYTES OF LOCALS
|
|||
|
|
|||
|
LINK A6,#VARSIZE ;MAKE STACK FRAME
|
|||
|
MOVE #npicVersion,SAVEVERSION(A6) ;SAVE VERSION NUMBER
|
|||
|
|
|||
|
;copy input parameters into pict 2 header record and compute picFrame
|
|||
|
|
|||
|
move.l params(a6),a0 ;point to input parameters
|
|||
|
move.l ppSrcRect(a0),picHdrRec+hdrSrcRect(a6)
|
|||
|
move.l ppSrcRect+bottom(a0),picHdrRec+hdrSrcRect+bottom(a6)
|
|||
|
move.l ppHRes(a0),picHdrRec+hdrHRes(a6)
|
|||
|
move.l ppVRes(a0),picHdrRec+hdrVRes(a6)
|
|||
|
move.w ppVersion(a0),d0 ;orginal version?
|
|||
|
bne.s @newversion
|
|||
|
move.w #-2,picHdrRec+hdrVersion(a6)
|
|||
|
clr.w picHdrRec+hdrReserved(a6)
|
|||
|
clr.l picHdrRec+hdrReserved2(a6)
|
|||
|
bra.s @computePicFrame
|
|||
|
|
|||
|
@newversion ;fill out additional fields
|
|||
|
move.w d0,picHdrRec+hdrVersion(a6)
|
|||
|
move.w ppReserved(a0),picHdrRec+hdrReserved(a6)
|
|||
|
move.l ppReserved2(a0),picHdrRec+hdrReserved2(a6)
|
|||
|
|
|||
|
@computePicFrame
|
|||
|
|
|||
|
move.l picHdrRec+hdrSrcRect+top(a6),d0 ;get topLeft in d0
|
|||
|
move.l picHdrRec+hdrSrcRect+bottom(a6),d1 ;get botRight in d1
|
|||
|
move.l d0,defaultFrame+top(a6) ;set default new height
|
|||
|
move.l d1,defaultFrame+bottom(a6) ;set default new width
|
|||
|
sub.w d0,d1 ;get width in d1.w
|
|||
|
move.w d1,d2 ;save width in d2.w
|
|||
|
swap d0
|
|||
|
swap d1
|
|||
|
sub.w d0,d1 ;get height in d1.w
|
|||
|
moveq #72,d0
|
|||
|
mulu.w d0,d1 ;d1.L = height*72
|
|||
|
move.l d1,a0 ;save height*72 in a0
|
|||
|
mulu.w d0,d2 ;d2.L = width*72
|
|||
|
|
|||
|
; swap d2 ;<29>
|
|||
|
; moveq #0,d1 ;extend d1 to long in copy: don't trash high word <KON>
|
|||
|
; move.w d2,d1 ;<29>
|
|||
|
; clr.w d2 ;<29>
|
|||
|
move.l picHdrRec+hdrHRes(a6),d0 ;<29>
|
|||
|
beq.s @skip ;<29>
|
|||
|
|
|||
|
move.l a0,-(sp) ;save d1 (which has been moved to a0
|
|||
|
subq #4,sp
|
|||
|
move.l d2,-(sp) ;longint/fixed = longint
|
|||
|
move.l d0,-(sp)
|
|||
|
_FixDiv
|
|||
|
move.l (sp)+,d2 ;longint result, only interested in bottom word portion
|
|||
|
;<29> swap d2 ;get quotient (decimal part) in low word
|
|||
|
move.l (sp)+,d1 ;restore d1
|
|||
|
|
|||
|
; divu.l d0,d1:d2 ;d2.w = (width*72)/vRes
|
|||
|
|
|||
|
move.l picHdrRec+hdrVRes(a6),d0
|
|||
|
beq.s @skip
|
|||
|
|
|||
|
clr.l defaultFrame+top(a6) ;force topLeft to be 0,0
|
|||
|
move.w d2,defaultFrame+right(a6) ;right = new width
|
|||
|
|
|||
|
; moveq #0,d2 ;<29>
|
|||
|
; swap d1 ;<29>
|
|||
|
; move.w d1,d2 ;<29>
|
|||
|
; clr.w d1 ;<29>
|
|||
|
|
|||
|
subq #4,sp
|
|||
|
move.l d1,-(sp) ;longint/fixed = longint
|
|||
|
move.l d0,-(sp)
|
|||
|
_FixDiv
|
|||
|
move.l (sp)+,d1 ;longint result, only interested in low word <29>
|
|||
|
;<29> swap d1 ;get quotient (decimal part) in low word
|
|||
|
|
|||
|
; divu.l d0,d2:d1 ;d1.w = (height*72)/vRes
|
|||
|
move.w d1,defaultFrame+bottom(a6) ;bottom = new height
|
|||
|
@skip
|
|||
|
MOVEM.L D3/A3-A4,-(SP) ;SAVE REGS
|
|||
|
CLR.L RESULT(A6) ;INIT FCN RESULT TO NIL
|
|||
|
|
|||
|
; Abort OpenPicture if heap doesn't have at least 1500 bytes. <16Jan89 KON>
|
|||
|
|
|||
|
MOVE.L #1500,D0 ;GET BYTE COUNT
|
|||
|
_NewHandle ;AT LEAST 1000 BYTES IN THE HEAP ?
|
|||
|
BNE DONE ;NO, RETURN NIL AND QUIT
|
|||
|
_DisposHandle ;YES, Discard test handle
|
|||
|
|
|||
|
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
|
|||
|
MOVE.L THEPORT(A4),A3 ;GET CURRENT GRAFPORT
|
|||
|
TST.L PICSAVE(A3) ;ARE WE ALREADY SAVING ?
|
|||
|
BNE DONE ;YES, RETURN NIL AND QUIT
|
|||
|
_HidePen ;NO, TURN OFF DRAWING
|
|||
|
|
|||
|
; ALLOCATE PICSAVE RECORD
|
|||
|
|
|||
|
MOVE.L #picSaveRec,D0 ;GET BYTE COUNT
|
|||
|
_NewHandle ;ALLOCATE PICSAVE RECORD
|
|||
|
MOVE.L A0,A4 ;GET RESULT HANDLE
|
|||
|
MOVE.L A4,PICSAVE(A3) ;SAVE RESULT IN THEPORT
|
|||
|
;
|
|||
|
; ALLOCATE PICCLIPRGN (leave on stack for now)
|
|||
|
;
|
|||
|
CLR.L -(SP) ;MAKE ROOM FOR FCN RESULT
|
|||
|
_NEWRGN ;ALLOCATE A NEW REGION
|
|||
|
;
|
|||
|
; ALLOCATE THEPIC PICHANDLE
|
|||
|
;
|
|||
|
MOVE.L #256,D0 ;BYTE COUNT = 256
|
|||
|
_NewHandle ;ALLOCATE NEWHANDLE(256)
|
|||
|
MOVE.L A0,A1 ;GET THEPIC HANDLE
|
|||
|
MOVE.L A1,RESULT(A6) ;PUT HANDLE IN FCN RESULT
|
|||
|
;
|
|||
|
; NOW FILL THEPIC'S PICSIZE AND PICFRAME
|
|||
|
;
|
|||
|
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE HANDLE
|
|||
|
MOVE.L A1,(A4)+ ;SAVE PICHANDLE IN THEPIC
|
|||
|
MOVE.L (A1),A1 ;DE-REFERENCE PICHANDLE
|
|||
|
MOVE #10,(A1)+ ;INSTALL PICSIZE = 10
|
|||
|
lea defaultFrame(A6),A0 ;POINT TO PICFRAME
|
|||
|
MOVE.L (A0)+,(A1)+ ;COPY RECT INTO PICTURE
|
|||
|
MOVE.L (A0)+,(A1)+
|
|||
|
;
|
|||
|
; INIT STATE VARIABLES FOR PICTURE CAPTURE
|
|||
|
;
|
|||
|
MOVE.L #256,(A4)+ ;PICMAX := 256;
|
|||
|
MOVE.L #10,(A4)+ ;PICINDEX := 10
|
|||
|
MOVE.L (SP)+,(A4)+ ;INSTALL PICCLIPRGN
|
|||
|
CLR.L (A4)+ ;PICBKPAT := WHITE
|
|||
|
CLR.L (A4)+
|
|||
|
CLR.L (A4)+ ;PICTXFONT = 0, PICTXFACE = []
|
|||
|
MOVE #1,(A4)+ ;PICTXMODE := SRCCOPY
|
|||
|
CLR (A4)+ ;PICTXSIZE := 0
|
|||
|
CLR.L (A4)+ ;PICSPEXTRA := 0.0
|
|||
|
MOVE.L #$00010001,D0 ;GET (1,1)
|
|||
|
MOVE.L D0,(A4)+ ;PICTXNUMER := (1,1)
|
|||
|
MOVE.L D0,(A4)+ ;PICTXDENOM := (1,1)
|
|||
|
CLR.L (A4)+ ;PICTXLOC := (0,0)
|
|||
|
CLR.L (A4)+ ;PICPNLOC := (0,0)
|
|||
|
MOVE.L D0,(A4)+ ;PICPNSIZE := (1,1)
|
|||
|
MOVE #8,(A4)+ ;PICPNMODE := PATCOPY
|
|||
|
MOVEQ #-1,D0 ;GET SOME BLACK
|
|||
|
MOVE.L D0,(A4)+ ;PICPNPAT := BLACK
|
|||
|
MOVE.L D0,(A4)+
|
|||
|
MOVE.L D0,(A4)+ ;PICFILLPAT := BLACK
|
|||
|
MOVE.L D0,(A4)+
|
|||
|
CLR.L (A4)+ ;PICTHERECT := (0,0,0,0)
|
|||
|
CLR.L (A4)+
|
|||
|
CLR.L (A4)+ ;PICOVSIZE := (0,0)
|
|||
|
MOVE.L PORTRECT+TOPLEFT(A3),(A4)+ ;PICORIGIN := CURRENT ORIGIN
|
|||
|
MOVE.L #blackColor,(A4)+ ;PICFGCOLOR := blackColor
|
|||
|
MOVE.L #whiteColor,(A4)+ ;PICBKCOLOR := whiteColor
|
|||
|
clr.l (a4)+ ;picQdChExtra := 0
|
|||
|
clr.l (a4)+ ;picQdRunSlop := 0
|
|||
|
|
|||
|
;
|
|||
|
; Allocate handle for fond id's we have seen so far
|
|||
|
;
|
|||
|
; Format of picFontList handle is:
|
|||
|
; handle size [long]
|
|||
|
; # of entries - 1 used [word]
|
|||
|
; id1, id2, ... idn
|
|||
|
|
|||
|
FontListSize equ 50*2
|
|||
|
|
|||
|
doFontList
|
|||
|
moveq #FontListSize+6,d0 ;initial size for 50 entries
|
|||
|
_NewHandle
|
|||
|
move.l picSave(a3),a1 ;get picSave handle
|
|||
|
move.l (a1),a1
|
|||
|
move.l a0,picFontList(a1) ;save picFontList handle in picSave record
|
|||
|
beq.s @noHandle
|
|||
|
|
|||
|
move.l (a0),a0 ;point into fontList
|
|||
|
moveq #FontListSize+6,d0 ;initial size for 50 entries
|
|||
|
move.l d0,(a0)+
|
|||
|
clr.l (a0) ; 1 entry, first entry = 0
|
|||
|
|
|||
|
@noHandle
|
|||
|
|
|||
|
; INIT GLYPH STATE TO INVALID
|
|||
|
|
|||
|
move.l #$80808080,picGlyphState(a1) ; set glyph state to invalid values
|
|||
|
|
|||
|
; PUT VERSION NUMBER TO PICTURE
|
|||
|
|
|||
|
move.w #1,picVersion(a1) ;picVersion := new picture (non-zer)
|
|||
|
MOVEQ #opVersion,D0 ;GET VERSION OPCODE
|
|||
|
JSR DPutPicOp ;PUT TO PICTURE
|
|||
|
MOVE SAVEVERSION(A6),D0 ;GET VERSION NUMBER
|
|||
|
|
|||
|
; For new pictures, put version as word, followed by header
|
|||
|
|
|||
|
@NotPic MOVE D0,-(SP) ;ELSE PUSH VERSION
|
|||
|
JSR PUTPICWORD ;AND PUT ENTIRE WORD FOR NEW PICTURES
|
|||
|
|
|||
|
; HEADER EXTENSION = [OP] [SIZE] [BBOX] [RESERVED]
|
|||
|
|
|||
|
MOVE #ngHeaderOp,D0 ;GET HEADER OPCODE
|
|||
|
JSR DPutPicOp ;PUT TO PICTURE
|
|||
|
|
|||
|
pea picHdrRec(a6) ;PUSH POINTER TO DATA
|
|||
|
MOVE #24,-(SP) ;PUSH SIZE OF DATA
|
|||
|
JSR PUTPICDATA ;AND BLAST IT TO THE PICTURE
|
|||
|
|
|||
|
DONE MOVEM.L (SP)+,D3/A3-A4 ;RESTORE REGS
|
|||
|
UNLINK PARAMSIZE,'OPENCPIC'
|
|||
|
|
|||
|
|
|||
|
PutPicPat PROC EXPORT
|
|||
|
IMPORT PutPicData
|
|||
|
;------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE PutPicPat(pat: Pattern);
|
|||
|
;
|
|||
|
MOVE.L (SP)+,A0 ;POP RETURN ADDR
|
|||
|
MOVE #8,-(SP) ;PUSH BYTECOUNT = 8
|
|||
|
MOVE.L A0,-(SP) ;PUSH RETURN ADDR
|
|||
|
JMP PutPicData
|
|||
|
|
|||
|
PutPicVerb PROC EXPORT
|
|||
|
IMPORT DPutPicByte,PutPicWord,PutPicLong,PutPicPat,DoPict2
|
|||
|
;------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE PutPicVerb(verb: GrafVerb);
|
|||
|
;
|
|||
|
; check additional picture params associated with
|
|||
|
; this verb, and add those that have changed to thePic.
|
|||
|
;
|
|||
|
PARAMSIZE EQU 2
|
|||
|
VERB EQU PARAMSIZE+8-2 ;BYTE
|
|||
|
|
|||
|
LINK A6,#0 ;NO LOCAL VARS
|
|||
|
MOVEM.L D5-D7/A3-A4,-(SP) ;SAVE REGS
|
|||
|
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
|
|||
|
MOVE.L THEPORT(A4),A3 ;POINT TO CURRENT PORT
|
|||
|
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
|
|||
|
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
|
|||
|
MOVE.B VERB(A6),D7 ;GET VERB
|
|||
|
CMP.B #PAINT,D7 ;CASE JUMP BASSED ON VERB
|
|||
|
BLT FRAME1
|
|||
|
BEQ PAINT1 ;YES CHECK PNMODE, PNPAT
|
|||
|
CMP.B #INVERT,D7 ;IS VERB INVERT ?
|
|||
|
BEQ DONE ;YES, NOTHING TO CHECK
|
|||
|
BLT.S ERASE1
|
|||
|
|
|||
|
FILL1 MOVE.L FILLPAT(A3),D5 ;GET FILLPAT
|
|||
|
MOVE.L FILLPAT+4(A3),D6
|
|||
|
CMP.L PICFILLPAT(A4),D5 ;SAME AS PICFILLPAT ?
|
|||
|
BNE.S @1 ;NO, PUT CHANGE TO THEPIC
|
|||
|
CMP.L PICFILLPAT+4(A4),D6
|
|||
|
BEQ DONE
|
|||
|
@1 MOVE.L D5,PICFILLPAT(A4) ;UPDATE STATE VARIABLE
|
|||
|
MOVE.L D6,PICFILLPAT+4(A4)
|
|||
|
;
|
|||
|
; Do alignement for new pictures
|
|||
|
;
|
|||
|
; tst.w picVersion(a4)
|
|||
|
; beq.s @Pict1
|
|||
|
jsr DoPict2 ;align for PICT2
|
|||
|
;@Pict1
|
|||
|
MOVEQ #$0A,D0 ;PUSH FILLPAT OPCODE
|
|||
|
JSR DPutPicByte ;ADD TO THEPIC
|
|||
|
PEA FILLPAT(A3)
|
|||
|
JSR PutPicPat ;PUT PATTERN DATA
|
|||
|
BRA DONE ;AND QUIT
|
|||
|
|
|||
|
ERASE1 MOVE.L BKPAT(A3),D5 ;GET BKPAT
|
|||
|
MOVE.L BKPAT+4(A3),D6
|
|||
|
CMP.L PICBKPAT(A4),D5 ;SAME AS PICBKPAT ?
|
|||
|
BNE.S NEWBK ;NO, PUT CHANGE TO THEPIC
|
|||
|
CMP.L PICBKPAT+4(A4),D6
|
|||
|
BEQ DONE
|
|||
|
NEWBK MOVE.L D5,PICBKPAT(A4) ;UPDATE STATE VARIABLE
|
|||
|
MOVE.L D6,PICBKPAT+4(A4)
|
|||
|
;
|
|||
|
; Do alignement for new pictures
|
|||
|
;
|
|||
|
; tst.w picVersion(a4)
|
|||
|
; beq.s @Pict1
|
|||
|
jsr DoPict2 ;align for PICT2
|
|||
|
;@Pict1
|
|||
|
MOVEQ #$02,D0 ;BKPAT OPCODE
|
|||
|
JSR DPutPicByte ;ADD TO THEPIC
|
|||
|
PEA BKPAT(A3)
|
|||
|
JSR PutPicPat ;PUT PATTERN DATA
|
|||
|
BRA DONE ;AND QUIT
|
|||
|
|
|||
|
FRAME1 MOVE.L PNSIZE(A3),D6 ;GET PNSIZE
|
|||
|
CMP.L PICPNSIZE(A4),D6 ;HAS IT CHANGED ?
|
|||
|
BEQ.S PAINT1 ;NO, CONTINUE
|
|||
|
;
|
|||
|
; Do alignement for new pictures
|
|||
|
;
|
|||
|
; tst.w picVersion(a4)
|
|||
|
; beq.s @Pict1
|
|||
|
jsr DoPict2 ;align for PICT2
|
|||
|
;@Pict1
|
|||
|
MOVEQ #$07,D0
|
|||
|
JSR DPutPicByte ;YES, PUT PNSIZE OPCODE
|
|||
|
MOVE.L D6,-(SP)
|
|||
|
JSR PutPicLong ;PUT NEW PNSIZE
|
|||
|
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
|
|||
|
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
|
|||
|
MOVE.L D6,PICPNSIZE(A4) ;AND UPDATE STATE VARIABLE
|
|||
|
|
|||
|
PAINT1 MOVE PNMODE(A3),D6 ;GET PNMODE
|
|||
|
CMP PICPNMODE(A4),D6 ;HAS IT CHANGED ?
|
|||
|
BEQ.S MODEOK ;NO, CONTINUE
|
|||
|
;
|
|||
|
; Do alignement for new pictures
|
|||
|
;
|
|||
|
; tst.w picVersion(a4)
|
|||
|
; beq.s @Pict1
|
|||
|
jsr DoPict2 ;align for PICT2
|
|||
|
;@Pict1
|
|||
|
MOVEQ #$08,D0
|
|||
|
JSR DPutPicByte ;YES, PUT PNMODE OPCODE
|
|||
|
MOVE D6,-(SP)
|
|||
|
JSR PutPicWord ;PUT NEW PNMODE
|
|||
|
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
|
|||
|
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
|
|||
|
MOVE D6,PICPNMODE(A4) ;AND UPDATE STATE VARIABLE
|
|||
|
|
|||
|
MODEOK MOVE.L PNPAT(A3),D5 ;GET PNPAT
|
|||
|
MOVE.L PNPAT+4(A3),D6
|
|||
|
CMP.L PICPNPAT(A4),D5 ;SAME AS PICPNPAT ?
|
|||
|
BNE.S @1 ;NO, PUT CHANGE TO THEPIC
|
|||
|
CMP.L PICPNPAT+4(A4),D6
|
|||
|
BEQ.S DONE
|
|||
|
@1 MOVE.L D5,PICPNPAT(A4) ;UPDATE STATE VARIABLE
|
|||
|
MOVE.L D6,PICPNPAT+4(A4)
|
|||
|
;
|
|||
|
; Do alignment for new pictures
|
|||
|
;
|
|||
|
; tst.w picVersion(a4)
|
|||
|
; beq.s @Pict1
|
|||
|
jsr DoPict2 ;align for PICT2
|
|||
|
;@Pict1
|
|||
|
MOVEQ #$09,D0 ;PNPAT OPCODE
|
|||
|
JSR DPutPicByte ;ADD TO THEPIC
|
|||
|
PEA PNPAT(A3)
|
|||
|
JSR PutPicPat ;PUT PATTERN DATA
|
|||
|
|
|||
|
DONE
|
|||
|
;
|
|||
|
; Do alignment for new pictures: align for next opcode
|
|||
|
;
|
|||
|
; tst.w picVersion(a4)
|
|||
|
; beq.s @Pict1
|
|||
|
jsr DoPict2 ;align for PICT2
|
|||
|
;@Pict1
|
|||
|
MOVEM.L (SP)+,D5-D7/A3-A4 ;RESTORE REGS
|
|||
|
UNLINK PARAMSIZE,'PUTPICVERB'
|
|||
|
ENDP
|
|||
|
|
|||
|
PutPicData PROC EXPORT
|
|||
|
EXPORT DPutPicByte, PutPicByte, PutPicWord, PutPicLong
|
|||
|
IMPORT ROMDPutPicByte, ROMPutPicByte, ROMPutPicWord, ROMPutPicLong
|
|||
|
|
|||
|
jmpROM ROMPutPicData
|
|||
|
DPutPicByte
|
|||
|
jmpROM ROMDPutPicByte
|
|||
|
PutPicWord
|
|||
|
jmpROM ROMPutPicWord
|
|||
|
PutPicLong
|
|||
|
jmpROM ROMPutPicLong
|
|||
|
PutPicByte
|
|||
|
jmpROM ROMPutPicByte
|
|||
|
ENDPROC
|
|||
|
|
|||
|
DPutPicOp PROC EXPORT
|
|||
|
EXPORT PutPicOp,PutPicOp2
|
|||
|
IMPORT PutPicData,PutPicPad
|
|||
|
;------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE PutPicOp(data: word);
|
|||
|
;
|
|||
|
; Put a byte if PICT; Put a word if NPIC.
|
|||
|
;
|
|||
|
MOVE.L (SP)+,A0 ;POP RETURN ADDR
|
|||
|
MOVE D0,-(SP) ;PUSH DATA WORD
|
|||
|
MOVE.L A0,-(SP) ;PUSH RETURN ADDR
|
|||
|
PutPicOp
|
|||
|
JSR PutPicPad ;PAD TO WORD BOUNDARY
|
|||
|
PutPicOp2
|
|||
|
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
|
|||
|
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
|
|||
|
MOVE.L PICSAVE(A0),A0 ;GET PICSAVE HANDLE
|
|||
|
MOVE.L (A0),A0 ;DE-REFERENCE PICSAVE
|
|||
|
MOVEQ #2,D0 ;ASSUME IT'S A NEW PICTURE
|
|||
|
LEA 4(SP),A1 ;GET ADDR OF DATA
|
|||
|
tst.w PICVERSION(A0) ;IS IT AN OLD PICTURE?
|
|||
|
BNE.S NEWPIC ;=>NO, TWO-BYTE OPCODES
|
|||
|
MOVEQ #1,D0 ;ELSE ONE-BYTE OPCODES
|
|||
|
ADDQ #1,A1 ;POINT TO DATA
|
|||
|
NEWPIC MOVE.L A1,-(SP) ;PUSH ADDRESS OF DATA
|
|||
|
MOVE D0,-(SP) ;PUSH BYTECOUNT
|
|||
|
JSR PutPicData ;CALL PutPicData
|
|||
|
MOVE.L (SP)+,A0 ;POP RETURN ADDR
|
|||
|
TST.W (SP)+ ;STRIP PARAM
|
|||
|
JMP (A0) ;AND RETURN
|
|||
|
|
|||
|
PutPicPad PROC EXPORT
|
|||
|
IMPORT DPutPicByte
|
|||
|
;------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE PutPicPad;
|
|||
|
;
|
|||
|
; If picture is an NPIC and the current PicSize is odd, then put a 0 pad byte.
|
|||
|
;
|
|||
|
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
|
|||
|
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
|
|||
|
MOVE.L PICSAVE(A0),A0 ;GET PICSAVE HANDLE
|
|||
|
MOVE.L (A0),A0 ;DE-REFERENCE PICSAVE
|
|||
|
tst PICVERSION(A0) ;IS IT AN OLD PICTURE? <KON 12FEB90>
|
|||
|
BEQ.S DONE ;=>YES, DON'T PAD
|
|||
|
MOVE.L THEPIC(A0),A0 ;GET THEPIC HANDLE
|
|||
|
MOVE.L (A0),A0 ;POINT AT THE PIC
|
|||
|
MOVE PICSIZE(A0),D0 ;GET THE LOW WORD OF THE SIZE
|
|||
|
BTST #0,D0 ;IS SIZE ODD?
|
|||
|
BEQ.S DONE ;=>NO, JUST RETURN
|
|||
|
MOVEQ #0,D0 ;GET A PAD BYTE IN D0
|
|||
|
JSR DPutPicByte ;PUT THE BYTE TO THE PICTURE
|
|||
|
DONE RTS ;AND RETURN
|
|||
|
ENDPROC
|
|||
|
|
|||
|
;____________________________________________________________________________________
|
|||
|
; PB399 StdBits Patch
|
|||
|
;
|
|||
|
; Fix File Date Patch# Fix Routine(s) Routine(s) Fixed
|
|||
|
;AppleSystemPatch PatchPlusROM.a 21Feb88 PMAB399 StdBits StdBits
|
|||
|
;
|
|||
|
; An earlier patch fixed PackBits to work with scanlines longer than 127 bytes. Unfortunately,
|
|||
|
; when pict recording, StdBits JSRs rather than traps to PackBits, so the earlier patch
|
|||
|
; didn't help that much. This (big) patch fixes StdBits to trap to the new routine.
|
|||
|
;
|
|||
|
|
|||
|
PatchStdBits PROC EXPORT
|
|||
|
IMPORT CheckPic, DoPict2
|
|||
|
IMPORT PutPicByte,PutPicWord,PutPicData
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StdBits(VAR srcBits: BitMap;
|
|||
|
; VAR srcRect: Rect;
|
|||
|
; VAR dstRect: Rect;
|
|||
|
; mode: INTEGER;
|
|||
|
; maskRgn: RgnHandle);
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 18
|
|||
|
SRCBITS EQU PARAMSIZE+8-4 ;LONG, ADDR OF BITMAP
|
|||
|
SRCRECT EQU SRCBITS-4 ;LONG, ADDR OF RECT
|
|||
|
DSTRECT EQU SRCRECT-4 ;LONG, ADDR OF RECT
|
|||
|
MODE EQU DSTRECT-2 ;WORD
|
|||
|
MASKRGN EQU MODE-4 ;LONG, RGNHANDLE
|
|||
|
|
|||
|
MYBITS EQU -14 ;BITMAP
|
|||
|
SRCPTR EQU MYBITS-4 ;LONG
|
|||
|
DSTPTR EQU SRCPTR-4 ;LONG
|
|||
|
PACKBUF EQU DSTPTR-4 ;POINTER TO PACKING BUFFER
|
|||
|
SAVEDSP EQU PACKBUF-4 ;PRESERVE STACK POINTER
|
|||
|
VARSIZE EQU SAVEDSP
|
|||
|
|
|||
|
|
|||
|
LINK A6,#VARSIZE ;ALLOCATE STACK FRAME
|
|||
|
MOVEM.L D3-D7/A2-A4,-(SP) ;SAVE REGS
|
|||
|
JSR CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
|
|||
|
BGT.S @100 ;BRANCH IF PICSAVE
|
|||
|
JMPROM ROMStdBitsNotPic ;continue in ROM
|
|||
|
@100
|
|||
|
MOVE.L SP,SAVEDSP(A6) ;PRESERVE STACK POINTER
|
|||
|
MOVEQ #8,D6
|
|||
|
;
|
|||
|
; TRIM SRCBITS
|
|||
|
;
|
|||
|
MOVE.L SRCBITS(A6),A0 ;GET ADDR OF SRCBITS
|
|||
|
LEA MYBITS(A6),A1 ;POINT TO MY COPY
|
|||
|
MOVE.L BASEADDR(A0),A3 ;GET BASEADDR (CLOBBERS A3)
|
|||
|
MOVE ROWBYTES(A0),D4 ;GET OLD ROWBYTES
|
|||
|
MOVE.L BOUNDS+TOPLEFT(A0),BOUNDS+TOPLEFT(A1) ;COPY BOUNDS TOPLEFT
|
|||
|
MOVE.L BOUNDS+BOTRIGHT(A0),BOUNDS+BOTRIGHT(A1) ;COPY BOUNDS BOTRIGHT
|
|||
|
MOVE.L SRCRECT(A6),A0 ;POINT TO SRCRECT
|
|||
|
MOVE TOP(A0),D0 ;GET SRCRECT.TOP
|
|||
|
SUB BOUNDS+TOP(A1),D0 ;SKIPTOP:=SRCRECT.TOP-BOUNDS.TOP
|
|||
|
BLE.S TOPOK ;CONTINUE IF SKIPTOP NEG
|
|||
|
ADD D0,BOUNDS+TOP(A1) ;NEWTOP := SRCRECT TOP
|
|||
|
MULU D4,D0 ;CALC VERT OFFSET
|
|||
|
ADD.L D0,A3 ;ADJUST BASEADDR
|
|||
|
|
|||
|
TOPOK MOVE BOTTOM(A0),D0 ;GET SRCRECT.BOTTOM
|
|||
|
CMP BOUNDS+BOTTOM(A1),D0 ;IS SRCRECT BOT < BOUNDS BOT ?
|
|||
|
BGE.S BOTOK ;NO, CONTINUE
|
|||
|
MOVE D0,BOUNDS+BOTTOM(A1) ;YES, TRIM BOUNDS BOTTOM
|
|||
|
|
|||
|
BOTOK MOVE LEFT(A0),D0 ;GET SRCRECT.LEFT
|
|||
|
SUB BOUNDS+LEFT(A1),D0 ;CALC SKIPLEFT
|
|||
|
BLE.S LEFTOK ;CONTINUE IF SKIPLEFT NEG
|
|||
|
LSR #3,D0 ;DIV BY 8 FOR SKIP BYTES
|
|||
|
ADD D0,A3 ;OFFSET BASEADDR HORIZ
|
|||
|
LSL #3,D0 ;BYTES TIMES 8 FOR DOTS
|
|||
|
ADD D0,BOUNDS+LEFT(A1) ;ADD DOTS TO BOUNDS.LEFT
|
|||
|
|
|||
|
LEFTOK MOVE RIGHT(A0),D0 ;GET SRCRECT.RIGHT
|
|||
|
SUB BOUNDS+LEFT(A1),D0 ;CONVERT TO GLOBAL
|
|||
|
ADD #7,D0 ;ROUND UP
|
|||
|
LSR #3,D0 ;TO NEXT MULT OF 8
|
|||
|
LSL #3,D0
|
|||
|
ADD BOUNDS+LEFT(A1),D0 ;RETURN TO LOCAL
|
|||
|
CMP BOUNDS+RIGHT(A1),D0 ;IS RESULT < BOUNDS.RIGHT ?
|
|||
|
BGE.S RIGHTOK ;NO, CONTINUE
|
|||
|
MOVE D0,BOUNDS+RIGHT(A1) ;YES, TRIM RIGHT
|
|||
|
RIGHTOK
|
|||
|
;
|
|||
|
; CALC NEW ROWBYTES AFTER TRIMMING
|
|||
|
;
|
|||
|
MOVE BOUNDS+RIGHT(A1),D5 ;GET TRIMMED RIGHT
|
|||
|
SUB BOUNDS+LEFT(A1),D5 ;CALC WIDTH
|
|||
|
ADD #15,D5 ;ROUND UP
|
|||
|
LSR #4,D5 ;DIV BY 16
|
|||
|
BGT.S @200 ;continue if greater than 0
|
|||
|
; MOVE.L SAVEDSP(A6),SP ;RESTORE STACK POINTER
|
|||
|
JMPROM ROMStdBitsOK ;IGNORE IF NEWROW <= 0
|
|||
|
@200
|
|||
|
ADD D5,D5 ;DOUBLE FOR NEW ROWBYTES
|
|||
|
MOVE D5,ROWBYTES(A1) ;COPY ROWBYTES
|
|||
|
|
|||
|
MOVE.B #$90,-(SP) ;PUSH OPCODE=BITSRECT
|
|||
|
TST.L MASKRGN(A6) ;IS MASKRGN NIL ?
|
|||
|
BEQ.S NOTRGN ;YES, CONTINUE
|
|||
|
ADD.B #1,(SP) ;REPLACE OPCODE=BITSRGN (IE. $91)
|
|||
|
NOTRGN CMP D6,D5 ;IS NEWROW < 8 ?
|
|||
|
BLT.S NOPACK ;YES, DONT BITPACK
|
|||
|
ADD.B #8,(SP) ;SET BIT 3 FOR BITPACK
|
|||
|
NOPACK
|
|||
|
jsr DoPict2 ;align for PICT2 <17Sept90 KON>
|
|||
|
JSR PutPicByte ;PUT OPCODE TO THEPIC
|
|||
|
|
|||
|
PEA MYBITS+ROWBYTES(A6) ;PUSH ADDR OF ROWBYTYES,BOUNDS
|
|||
|
MOVE #10,-(SP) ;PUSH BYTECOUNT = 10
|
|||
|
JSR PutPicData ;PUT ROWBYTES,BOUNDS TO THEPIC
|
|||
|
|
|||
|
MOVE.L SRCRECT(A6),-(SP)
|
|||
|
MOVE D6,-(SP)
|
|||
|
JSR PutPicData ;PUT SRCRECT
|
|||
|
MOVE.L DSTRECT(A6),-(SP)
|
|||
|
MOVE D6,-(SP)
|
|||
|
JSR PutPicData ;PUT DSTRECT
|
|||
|
MOVE MODE(A6),-(SP)
|
|||
|
JSR PutPicWord ;PUT MODE
|
|||
|
|
|||
|
TST.L MASKRGN(A6) ;IS MASKRGN NIL ?
|
|||
|
BEQ.S NOMASK ;YES, SKIP IT
|
|||
|
MOVE.L MASKRGN(A6),-(SP) ;NO, PUSH MASKRGN
|
|||
|
JSRROM ROMPutPicRgn ;PUT MASKRGN TO THEPIC
|
|||
|
NOMASK
|
|||
|
;
|
|||
|
; NOW PUT THE BITMAP DATA: IF NEWROW >= 8 THEN USE PACKBITS
|
|||
|
;
|
|||
|
LEA MYBITS(A6),A2 ;POINT TO (TRIMMED) BITMAP
|
|||
|
MOVE BOUNDS+BOTTOM(A2),D7
|
|||
|
SUB BOUNDS+TOP(A2),D7 ;HEIGHT := BOUNDS BOT - TOP
|
|||
|
|
|||
|
CMP D6,D5 ;IS NEWROW < 8 ?
|
|||
|
BGE.S @PackIt ;No, use packing
|
|||
|
; MOVE.L SAVEDSP(A6),SP ;RESTORE STACK POINTER
|
|||
|
jmpROM ROMStdBitsStart2 ;continue in ROM
|
|||
|
|
|||
|
;----------------------------------------------------------------
|
|||
|
;
|
|||
|
; MAKE SURE THE STACK IS ON A LONGWORD BOUNDARY (FOR FAST BUFFERS)
|
|||
|
;
|
|||
|
@PackIt
|
|||
|
MOVE.L SP,D1 ;GET THE STACK POINTER
|
|||
|
AND.B #$FC,D1 ;FORCE LONG ALIGNMENT
|
|||
|
MOVE.L D1,SP ;USE IT
|
|||
|
|
|||
|
;----------------------------------------------------------------
|
|||
|
;
|
|||
|
; ALLOCATE PACKBUF ON THE STACK
|
|||
|
;
|
|||
|
SUB D5,SP ;SET SIZE OF PACKBUF
|
|||
|
SUB D5,SP ;TO 2*ROWBYTES FOR LONG ALIGNMENT
|
|||
|
MOVE.L SP,PACKBUF(A6) ;POINT TO PACKBUF
|
|||
|
|
|||
|
;----------------------------------------------------------------
|
|||
|
;
|
|||
|
; ROWBYTES >= 8, WRITE THE PACKED BIT/PIXMAP TO THE PICTURE
|
|||
|
;
|
|||
|
; PACKED FORMAT = [BYTECOUNT][DATA] FOR EACH SCANLINE
|
|||
|
;
|
|||
|
; IF ROWBYTES > 250 THEN BYTECOUNT IS A WORD, ELSE IT IS A BYTE
|
|||
|
;
|
|||
|
BRA.S START1 ;GO TO LOOP START
|
|||
|
MORE1 MOVE.L A3,SRCPTR(A6) ;SRCPTR := ^SCANLINE DATA
|
|||
|
move.l PACKBUF(A6),A0
|
|||
|
MOVE.L A0,DSTPTR(A6) ;DSTPTR := @PACKBUF
|
|||
|
PEA SRCPTR(A6) ;PUSH VAR SRCPTR
|
|||
|
PEA DSTPTR(A6) ;PUSH VAR DSTPTR
|
|||
|
MOVE D5,-(SP) ;PUSH SRCBYTES = NEWROW
|
|||
|
_PackBits ;PACK ROW INTO PACKBUF (here's the fix!) <PMA399/DAF>
|
|||
|
MOVE.L DSTPTR(A6),D6 ;GET UPDATED DSTPTR
|
|||
|
move.l PACKBUF(A6),A0 ;POINT TO PACKBUF
|
|||
|
SUB.L A0,D6 ;CALC PACKED BYTECOUNT
|
|||
|
CMP #250,D5 ;IS ROWBYTES > 250?
|
|||
|
BGT.S @1 ;=>YES, PUT WORD
|
|||
|
MOVE.B D6,-(SP) ;ELSE PUSH THE BYTE
|
|||
|
JSR PUTPICBYTE ;AND PUT TO PICTURE
|
|||
|
BRA.S @2 ;=>AND GO PUT DATA
|
|||
|
@1 MOVE.W D6,-(SP) ;PUSH PACKED BYTECOUNT
|
|||
|
JSR PUTPICWORD ;PUT THE WORD
|
|||
|
@2 MOVE.L PACKBUF(A6),-(SP)
|
|||
|
MOVE D6,-(SP)
|
|||
|
JSR PutPicData ;PUT PACKED DATA TO THEPIC
|
|||
|
ADD D4,A3 ;ADD OLDROW TO BITS PTR
|
|||
|
START1 DBRA D7,MORE1 ;LOOP FOR HEIGHT ROWS
|
|||
|
MOVE.L SAVEDSP(A6),SP ;RESTORE STACK POINTER
|
|||
|
jmpROM ROMStdBitsOK ;and continue in ROM
|
|||
|
|
|||
|
|
|||
|
PortablePatchStdPoly PROC EXPORT
|
|||
|
IMPORT CheckPic
|
|||
|
;---------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StdPoly(verb: GrafVerb; poly: PolyHandle);
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AND LOCALS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 6
|
|||
|
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
|
|||
|
POLY EQU VERB-4 ;LONG, PolyHandle
|
|||
|
|
|||
|
MINRECT EQU -8 ;RECT
|
|||
|
VARSIZE EQU MINRECT ;TOTAL BYTES OF LOCALS
|
|||
|
|
|||
|
LINK A6,#VARSIZE ;ALLOCATE STACK FRAME
|
|||
|
MOVEM.L D5-D7/A2-A4,-(SP) ;SAVE REGS
|
|||
|
MOVE.B VERB(A6),D7 ;GET VERB
|
|||
|
JSR CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
|
|||
|
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
|
|||
|
|
|||
|
MOVE.B D7,-(SP)
|
|||
|
peaROM ROMStdPolyRtn
|
|||
|
jmp PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
|
|||
|
NotPic
|
|||
|
jmpROM ROMStdPolyNotPic
|
|||
|
ENDPROC
|
|||
|
|
|||
|
|
|||
|
PatchStdRect PROC EXPORT
|
|||
|
IMPORT CheckPic
|
|||
|
;---------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StdRect(verb: GrafVerb; r: Rect);
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 6
|
|||
|
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
|
|||
|
RECT EQU VERB-4 ;LONG, ADDR OF RECT
|
|||
|
|
|||
|
LINK A6,#0 ;NO LOCALS
|
|||
|
MOVEM.L D7/A3-A4,-(SP) ;SAVE REGS
|
|||
|
MOVE.B VERB(A6),D7 ;GET VERB
|
|||
|
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
|
|||
|
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
|
|||
|
|
|||
|
MOVE.B D7,-(SP) ;PUSH VERB
|
|||
|
peaROM ROMStdRectRtn
|
|||
|
jmp PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
|
|||
|
NotPic
|
|||
|
jmpROM ROMStdRectNotPic
|
|||
|
|
|||
|
ENDPROC
|
|||
|
|
|||
|
PatchStdLine PROC EXPORT
|
|||
|
IMPORT CheckPic
|
|||
|
;---------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StdLine(newPt: Point);
|
|||
|
;
|
|||
|
PARAMSIZE EQU 4
|
|||
|
NEWPT EQU PARAMSIZE+8-4
|
|||
|
|
|||
|
LINK A6,#0 ;NO LOCAL VARS
|
|||
|
MOVEM.L D5-D7/A3-A4,-(SP) ;SAVE REGS
|
|||
|
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
|
|||
|
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
|
|||
|
|
|||
|
MOVE.B #FRAME,-(SP) ;PUSH VERB
|
|||
|
peaROM ROMStdLineRtn
|
|||
|
jmp PutPicVerb ;CHECK pnSize, pnMode, pnPat
|
|||
|
NotPic
|
|||
|
jmpROM ROMStdLineNotPic
|
|||
|
|
|||
|
ENDPROC
|
|||
|
|
|||
|
PatchStdRRect PROC EXPORT
|
|||
|
IMPORT CheckPic, DoPict2
|
|||
|
;---------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StdRRect(verb: GrafVerb; r: Rect; ovWd,ovHt: INTEGER);
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 10
|
|||
|
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
|
|||
|
RECT EQU VERB-4 ;LONG, ADDR OF RECT
|
|||
|
OVWD EQU RECT-2 ;WORD
|
|||
|
OVHT EQU OVWD-2 ;WORD
|
|||
|
|
|||
|
LINK A6,#0 ;NO LOCALS
|
|||
|
MOVEM.L D7/A3-A4,-(SP) ;SAVE REGS
|
|||
|
MOVE.B VERB(A6),D7 ;GET VERB
|
|||
|
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
|
|||
|
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
|
|||
|
|
|||
|
MOVE.B D7,-(SP) ;PUSH VERB
|
|||
|
jsr PutPicVerb
|
|||
|
;
|
|||
|
; CHECK FOR NEW OVAL SIZE
|
|||
|
;
|
|||
|
MOVE.L PICSAVE(A3),A0 ;GET PICSAVE HANDLE
|
|||
|
MOVE.L (A0),A0 ;DE-REFERENCE PICSAVE
|
|||
|
MOVE.L OVHT(A6),D0 ;GET OVWD AND OVHT
|
|||
|
CMP.L PICOVSIZE(A0),D0 ;SAME AS CURRENT OVAL SIZE ?
|
|||
|
BEQ.S OVALOK ;YES, CONTINUE
|
|||
|
MOVE.L D0,PICOVSIZE(A0) ;NO, UPDATE STATE VARIABLE
|
|||
|
MOVE.L D0,-(SP) ;PUSH OVSIZE FOR PutPicLong CALL
|
|||
|
MOVEQ #$0B,D0
|
|||
|
JSR DPutPicByte ;PUT OVSIZE OPCODE
|
|||
|
JSR PutPicLong ;PUT NEW OVAL SIZE DATA
|
|||
|
jsr DoPict2
|
|||
|
OVALOK
|
|||
|
jmpROM ROMStdRRectRtn
|
|||
|
|
|||
|
NotPic
|
|||
|
jmpROM ROMStdRRectNotPic
|
|||
|
ENDPROC
|
|||
|
|
|||
|
PatchStdOval PROC EXPORT
|
|||
|
IMPORT CheckPic
|
|||
|
;---------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StdOval(verb: GrafVerb; r: Rect);
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 6
|
|||
|
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
|
|||
|
RECT EQU VERB-4 ;LONG, ADDR OF RECT
|
|||
|
|
|||
|
OVWD EQU -2 ;WORD
|
|||
|
OVHT EQU OVWD-2 ;WORD
|
|||
|
VARSIZE EQU OVHT ;TOTAL BYTES OF LOCALS
|
|||
|
|
|||
|
|
|||
|
LINK A6,#VARSIZE ;ALLOCATE STACK FRAME
|
|||
|
MOVEM.L D7/A3-A4,-(SP) ;SAVE REGS
|
|||
|
MOVE.B VERB(A6),D7 ;GET VERB
|
|||
|
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
|
|||
|
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
|
|||
|
|
|||
|
MOVE.B D7,-(SP) ;PUSH VERB
|
|||
|
peaROM ROMStdOvalRtn
|
|||
|
jmp PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
|
|||
|
NotPic
|
|||
|
jmpROM ROMStdOvalNotPic
|
|||
|
ENDPROC
|
|||
|
|
|||
|
PatchStdArc PROC EXPORT
|
|||
|
IMPORT CheckPic
|
|||
|
;---------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StdArc(verb: GrafVerb; r: Rect; startAngle,arcAngle: INTEGER);
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 10
|
|||
|
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
|
|||
|
RECT EQU VERB-4 ;LONG, ADDR OF RECT
|
|||
|
STARTANG EQU RECT-2 ;WORD
|
|||
|
ARCANG EQU STARTANG-2 ;WORD
|
|||
|
|
|||
|
OVWD EQU -2 ;WORD
|
|||
|
OVHT EQU OVWD-2 ;WORD
|
|||
|
VARSIZE EQU OVHT ;TOTAL BYTES OF LOCALS
|
|||
|
|
|||
|
|
|||
|
LINK A6,#VARSIZE ;ALLOCATE STACK FRAME
|
|||
|
MOVEM.L D4/D7/A3-A4,-(SP) ;SAVE REGS
|
|||
|
MOVE.B VERB(A6),D7 ;GET VERB
|
|||
|
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
|
|||
|
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
|
|||
|
|
|||
|
MOVE.B D7,-(SP) ;PUSH VERB
|
|||
|
peaROM ROMStdArcRtn
|
|||
|
jmp PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
|
|||
|
NotPic
|
|||
|
jmpROM ROMStdArcNotPic
|
|||
|
ENDPROC
|
|||
|
|
|||
|
PatchStdRgnSEPortable PROC EXPORT
|
|||
|
IMPORT CheckPic
|
|||
|
;---------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StdRgn(verb: GrafVerb; rgn: RgnHandle);
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 6
|
|||
|
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
|
|||
|
RGN EQU VERB-4 ;LONG, RGNHANDLE
|
|||
|
|
|||
|
LINK A6,#0 ;NO LOCALS
|
|||
|
MOVEM.L D6-D7/A2-A4,-(SP) ;SAVE REGS
|
|||
|
MOVE.B VERB(A6),D7 ;GET VERB
|
|||
|
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
|
|||
|
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
|
|||
|
|
|||
|
MOVE.B D7,-(SP) ;PUSH VERB
|
|||
|
peaROM ROMStdRgnRtn
|
|||
|
jmp PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
|
|||
|
NotPic
|
|||
|
jmpROM ROMStdRgnNotPic
|
|||
|
ENDPROC
|
|||
|
;
|
|||
|
; Patch StdRgn differently on the Plus because PutRgn, which is called by
|
|||
|
; StdDraw has a bug in it only on the Plus ROM.
|
|||
|
;
|
|||
|
PatchStdRgnPlus PROC EXPORT
|
|||
|
IMPORT CheckPic,MyPutRgn
|
|||
|
ROMNotRgn ROMBind (Plus, $BC46)
|
|||
|
ROMNotFr ROMBind (Plus, $BC4C)
|
|||
|
;---------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StdRgn(verb: GrafVerb; rgn: RgnHandle);
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 6
|
|||
|
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
|
|||
|
RGN EQU VERB-4 ;LONG, RGNHANDLE
|
|||
|
|
|||
|
LINK A6,#0 ;NO LOCALS
|
|||
|
MOVEM.L D6-D7/A2-A4,-(SP) ;SAVE REGS
|
|||
|
MOVE.B VERB(A6),D7 ;GET VERB
|
|||
|
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
|
|||
|
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
|
|||
|
|
|||
|
MOVE.B D7,-(SP) ;PUSH VERB
|
|||
|
JSR PutPicVerb ;PUT ADDITONAL PARAMS TO THEPIC
|
|||
|
MOVE #$80,D0 ;PUT RGNNOUN IN HI NIBBLE
|
|||
|
ADD D7,D0 ;PUT VERB IN LO NIBBLE
|
|||
|
JSR DPutPicByte ;PUT OPCODE TO THEPIC <30>
|
|||
|
MOVE.L RGN(A6),-(SP) ;PUSH RGNHANDLE
|
|||
|
JSRROM ROMPutPicRgn ;PUT REGION TO THEPIC
|
|||
|
|
|||
|
NOTPIC MOVE.L RGN(A6),-(SP) ;PUSH RGNHANDLE
|
|||
|
jsrROM ROMPushVerb ;PUSH MODE AND PATTERN
|
|||
|
TST.B D7 ;IS VERB FRAME ?
|
|||
|
BNE.S NOTFR ;NO, CONTINUE
|
|||
|
TST.L RGNSAVE(A3) ;YES, IS RGNSAVE TRUE ?
|
|||
|
BEQ.S NOTRGN ;NO, CONTINUE
|
|||
|
MOVE.L RGN(A6),-(SP) ;YES, PUSH RGNHANDLE
|
|||
|
MOVE.L RGNBUF(A4),-(SP) ;PUSH RGNBUF
|
|||
|
PEA RGNINDEX(A4) ;PUSH VAR RGNINDEX
|
|||
|
PEA RGNMAX(A4) ;PUSH VAR RGNMAX
|
|||
|
JSR MyPutRgn ;ADD INVERSION PTS TO THERGN
|
|||
|
|
|||
|
NOTRGN jmpROM ROMNotRgn
|
|||
|
|
|||
|
; JSR FrRgn ;FrRgn(rgn,pnMode,pnPat)
|
|||
|
; BRA.S GOHOME
|
|||
|
|
|||
|
NOTFR jmpROM ROMNotFr
|
|||
|
|
|||
|
; JSR DrawRgn ;DrawRgn(rgn,mode,pat);
|
|||
|
|
|||
|
;GOHOME MOVEM.L (SP)+,D6-D7/A2-A4 ;RESTORE REGS
|
|||
|
; UNLINK PARAMSIZE,'STDRGN '
|
|||
|
ENDPROC
|
|||
|
|
|||
|
MyPutRgn PROC
|
|||
|
IMPORT SETHSIZE
|
|||
|
PlusPutRgnDone ROMBind (Plus, $C8BA)
|
|||
|
PlusNotRect ROMBind (Plus, $C8A0)
|
|||
|
PlusSetHSize ROMBind (Plus, $8798)
|
|||
|
;----------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE PutRgn(Rgn: RgnHandle; bufHandle: Handle; VAR index,size: INTEGER);
|
|||
|
;
|
|||
|
; Expands a region out to an array of inversion points.
|
|||
|
;
|
|||
|
|
|||
|
|
|||
|
;------------------------------------------------
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMETERS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 16 ;TOTAL SIZE OF PARAMETERS
|
|||
|
RGNHANDLE EQU PARAMSIZE+8-4 ;LONG,RGNHANDLE
|
|||
|
BUFHANDLE EQU RGNHANDLE-4 ;LONG, HANDLE
|
|||
|
INDEX EQU BUFHANDLE-4 ;LONG, VAR
|
|||
|
SIZE EQU INDEX-4 ;LONG, VAR
|
|||
|
|
|||
|
|
|||
|
LINK A6,#0 ;NO LOCAL VARS
|
|||
|
MOVEM.L D7/A2-A4,-(SP) ;SAVE REGS
|
|||
|
|
|||
|
;-------------------------------------------------------
|
|||
|
;
|
|||
|
; EXPAND BUF TO FIT WORST CASE BYTESNEEDED = RGNSIZE * 2
|
|||
|
;
|
|||
|
MOVE.L BUFHANDLE(A6),A4 ;GET BUFHANDLE
|
|||
|
MOVE.L RGNHANDLE(A6),A3 ;GET RGNHANDLE
|
|||
|
MOVE.L INDEX(A6),A2 ;POINT TO CURRENT INDEX
|
|||
|
MOVE.L (A3),A0 ;DE-REFERENCE RGN
|
|||
|
MOVE (A0),D7 ;GET RGNSIZE
|
|||
|
ADD D7,D7 ;TIMES 2
|
|||
|
ADD (A2),D7 ;ADD CURRENT INDEX
|
|||
|
MOVE.L SIZE(A6),A1 ;POINT TO SIZE
|
|||
|
CMP (A1),D7 ;IS REQUIRED > CURRENT SIZE ?
|
|||
|
BLE.S NOGROW ;NO, CONTINUE
|
|||
|
|
|||
|
ADD #256,D7 ;GROW IN CHUNKS
|
|||
|
MOVE D7,(A1) ;UPDATE CURRENT SIZE
|
|||
|
MOVE.L A4,-(SP) ;PUSH BUFHANDLE
|
|||
|
MOVE D7,-(SP) ;PUSH NEW SIZE
|
|||
|
jsrROM PlusSetHSize ;MAKE ROOM IN BUF
|
|||
|
MOVE.L (A3),A0 ;RE-DEREFERENCE RGNHANDLE
|
|||
|
MOVE.L INDEX(A6),A2 ;GET ADDR OF INDEX AGAIN
|
|||
|
|
|||
|
NOGROW MOVE.L (A4),A1 ;DE-REFERENCE BUFHANDLE
|
|||
|
ADD (A2),A1 ;ADD INDEX TO BUFPTR
|
|||
|
CMP #10,RGNSIZE(A0) ;IS REGION RECTANGULAR ?
|
|||
|
BNE.S NOTRECT ;NO, CONTINUE
|
|||
|
ADD #2,A0 ;YES, POINT TO BBOX TOPLEFT
|
|||
|
;
|
|||
|
; Here's the patch that was left out of the Plus ROM <28FEB90 KON>
|
|||
|
;
|
|||
|
MOVE.L (A0),(A1)+ ;COPY TOPLEFT <EHB 26Sep86>
|
|||
|
MOVE (A0)+,(A1)+ ;COPY TOP <EHB 26Sep86>
|
|||
|
MOVE (A0)+,D0 ;GET LEFT <EHB 26Sep86>
|
|||
|
MOVE.L (A0),D1 ;GET BOTRIGHT <EHB 26Sep86>
|
|||
|
MOVE D1,(A1)+ ;COPY RIGHT <EHB 26Sep86>
|
|||
|
MOVE (A0),(A1)+ ;COPY BOT <EHB 26Sep86>
|
|||
|
MOVE D0,(A1)+ ;COPY LEFT <EHB 26Sep86>
|
|||
|
MOVE.L D1,(A1)+ ;COPY BOTRIGHT <EHB 26Sep86>
|
|||
|
jmpROM PlusPutRgnDone ;Back to ROM
|
|||
|
; BRA.S DONE ;UPDATE INDEX AND QUIT
|
|||
|
|
|||
|
NOTRECT
|
|||
|
jmpROM PlusNotRect
|
|||
|
; LEA RGNDATA(A0),A0 ;POINT TO TOP VERT IN RGN
|
|||
|
;NXTVERT MOVE.L (A0)+,D7 ;GET VERT AND HORIZ COORDS
|
|||
|
;NXTHOR MOVE.L D7,(A1)+ ;PUT LEFT POINT TO DST
|
|||
|
; MOVE (A0)+,D7 ;GET HORIZ COORD
|
|||
|
; MOVE.L D7,(A1)+ ;PUT RIGHT POINT TO DST
|
|||
|
; MOVE (A0)+,D7 ;GET NEXT HORIZ COORD
|
|||
|
; CMP #32767,D7 ;END OF SCAN FLAG ?
|
|||
|
; BNE NXTHOR ;NO, GO FOR MORE
|
|||
|
; CMP #32767,(A0) ;END OF REGION ?
|
|||
|
; BNE NXTVERT ;NO, LOOP FOR MORE
|
|||
|
|
|||
|
;DONE SUB.L (A4),A1 ;CALC DSTPTR - DSTSTART
|
|||
|
; MOVE A1,(A2) ;UPDATE VAR INDEX
|
|||
|
;GOHOME MOVEM.L (SP)+,D7/A2-A4 ;RESTORE REGISTERS
|
|||
|
; UNLINK PARAMSIZE,'PUTRGN '
|
|||
|
ENDPROC
|
|||
|
|
|||
|
PatchStdComment PROC EXPORT
|
|||
|
IMPORT DoPict2
|
|||
|
;---------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE StdComment
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AFTER LINK:
|
|||
|
;
|
|||
|
peaROM ROMStdComment
|
|||
|
jmp DoPict2
|
|||
|
ENDPROC
|
|||
|
|
|||
|
DoPict2 PROC EXPORT
|
|||
|
IMPORT DPutPicByte
|
|||
|
;
|
|||
|
; if we are recording a PICT2, align pixSize by padding with zeros
|
|||
|
;
|
|||
|
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
|
|||
|
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
|
|||
|
MOVE.L PICSAVE(A0),d0 ;GET PICSAVE HANDLE
|
|||
|
beq.s @AllDone
|
|||
|
move.l d0,a0
|
|||
|
MOVE.L (A0),A0 ;DE-REFERENCE PICSAVE
|
|||
|
tst PICVERSION(A0) ;IS IT AN OLD PICTURE?
|
|||
|
BEQ.S @AllDone ;=>YES, DON'T PAD
|
|||
|
MOVE.L THEPIC(A0),A0 ;GET THEPIC HANDLE <KON 6/4/92>
|
|||
|
MOVE.L (A0),A0 ;POINT AT THE PIC <KON 6/4/92>
|
|||
|
MOVE PICSIZE(A0),D0 ;GET THE LOW WORD OF THE SIZE <KON 6/4/92>
|
|||
|
and.b #1,d0 ;odd?
|
|||
|
beq.s @OneZero
|
|||
|
moveq #0,d0
|
|||
|
jsr DPutPicByte ;put d0=0 to picture
|
|||
|
moveq #0,d0
|
|||
|
@OneZero
|
|||
|
jsr DPutPicByte ;should be odd aligned after this
|
|||
|
@AllDone
|
|||
|
rts ;return to called ROM routine
|
|||
|
ENDPROC
|
|||
|
|
|||
|
CheckPic PROC EXPORT
|
|||
|
IMPORT ROMEqualRgn,ROMCopyRgn
|
|||
|
IMPORT DPutPicByte,PutPicLong
|
|||
|
;---------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE CheckPic;
|
|||
|
;
|
|||
|
; PUT GRAFGLOBALS IN A4, THEPORT IN A3, AND CHECK PICSAVE.
|
|||
|
; IF PICSAVE IS NIL, RETURN FLAGS LE.
|
|||
|
;
|
|||
|
; IF PICSAVE NOT NIL, RETURN FLAGS GT, AND
|
|||
|
; CHECK FOR CHANGES IN FGCOLOR, BKCOLOR, ORIGIN, AND CLIPRGN.
|
|||
|
;
|
|||
|
;
|
|||
|
MOVE.L D7,-(SP) ;SAVE REGS
|
|||
|
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
|
|||
|
MOVE.L THEPORT(A4),A3 ;POINT TO CURRENT GRAFPORT
|
|||
|
TST.L PICSAVE(A3) ;ARE WE SAVING FOR A PICTURE ?
|
|||
|
BEQ DONE ;NO, QUIT
|
|||
|
CMP #-1,PNVIS(A3) ;IS PEN HIDDEN MORE THAN ONE ?
|
|||
|
BLT DONE ;YES, DON'T ADD TO THEPIC
|
|||
|
|
|||
|
MOVE.L PICSAVE(A3),A4 ;YES, GET PICSAVE HANDLE
|
|||
|
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
|
|||
|
;
|
|||
|
; CHECK FOR CHANGES IN FOREGROUND COLOR
|
|||
|
;
|
|||
|
MOVE.L FGCOLOR(A3),D7 ;GET FORGROUND COLOR
|
|||
|
CMP.L PICFGCOLOR(A4),D7 ;HAS IT CHANGED ?
|
|||
|
BEQ.S FGCOLOK ;NO, CONTINUE
|
|||
|
;
|
|||
|
; Do alignement for new pictures
|
|||
|
;
|
|||
|
; tst.w picVersion(a4)
|
|||
|
; beq.s @Pict1
|
|||
|
jsr DoPict2 ;align for PICT2
|
|||
|
;@Pict1
|
|||
|
MOVEQ #$0E,D0
|
|||
|
JSR DPutPicByte ;PUT FGCOLOR OPCODE
|
|||
|
MOVE.L D7,-(SP)
|
|||
|
JSR PutPicLong ;PUT FGCOLOR
|
|||
|
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
|
|||
|
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
|
|||
|
MOVE.L D7,PICFGCOLOR(A4) ;UPDATE CURRENT STATE
|
|||
|
FGCOLOK
|
|||
|
;
|
|||
|
; CHECK FOR CHANGES IN BACKGROUND COLOR
|
|||
|
;
|
|||
|
MOVE.L BKCOLOR(A3),D7 ;GET BACKGROUND COLOR
|
|||
|
CMP.L PICBKCOLOR(A4),D7 ;HAS IT CHANGED ?
|
|||
|
BEQ.S BKCOLOK ;NO, CONTINUE
|
|||
|
;
|
|||
|
; Do alignement for new pictures
|
|||
|
;
|
|||
|
; tst.w picVersion(a4)
|
|||
|
; beq.s @Pict1
|
|||
|
jsr DoPict2 ;align for PICT2
|
|||
|
;@Pict1
|
|||
|
MOVEQ #$0F,D0
|
|||
|
JSR DPutPicByte ;PUT BKCOLOR OPCODE
|
|||
|
MOVE.L D7,-(SP)
|
|||
|
JSR PutPicLong ;PUT BKCOLOR PARAM
|
|||
|
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
|
|||
|
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
|
|||
|
MOVE.L D7,PICBKCOLOR(A4) ;UPDATE CURRENT STATE
|
|||
|
BKCOLOK
|
|||
|
;
|
|||
|
; CHECK FOR ORIGIN CHANGES
|
|||
|
;
|
|||
|
MOVE.L PORTRECT+TOPLEFT(A3),D0 ;GET PORTRECT.TOPLEFT
|
|||
|
CMP.L PICORIGIN(A4),D0 ;SAME AS PIC ORIGIN ?
|
|||
|
BEQ.S ORIGNOK ;YES, CONTINUE
|
|||
|
|
|||
|
MOVE PORTRECT+LEFT(A3),D7 ;GET PORTRECT LEFT
|
|||
|
SUB PICORIGIN+H(A4),D7 ;CALC DH
|
|||
|
ADD D7,PICORIGIN+H(A4) ;UPDATE STATE VARIABLE
|
|||
|
SWAP D7 ;PUT DH IN HI WORD
|
|||
|
|
|||
|
MOVE PORTRECT+TOP(A3),D7 ;GET PORTRECT TOP
|
|||
|
SUB PICORIGIN+V(A4),D7 ;CALC DV
|
|||
|
ADD D7,PICORIGIN+V(A4) ;UPDATE STATE VARIABLE
|
|||
|
;
|
|||
|
; Do alignement for new pictures
|
|||
|
;
|
|||
|
; tst.w picVersion(a4)
|
|||
|
; beq.s @Pict1
|
|||
|
jsr DoPict2 ;align for PICT2
|
|||
|
;@Pict1
|
|||
|
MOVEQ #$0C,D0
|
|||
|
JSR DPutPicByte ;PUT ORIGIN OPCODE TO THEPIC
|
|||
|
MOVE.L D7,-(SP)
|
|||
|
JSR PutPicLong ;PUT DH,DV TO THEPIC
|
|||
|
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
|
|||
|
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
|
|||
|
;
|
|||
|
; CHECK FOR CLIPRGN CHANGES
|
|||
|
;
|
|||
|
ORIGNOK CLR.B -(SP) ;MAKE ROOM FOR FCN VALUE
|
|||
|
MOVE.L CLIPRGN(A3),-(SP) ;PUSH CLIPRGN
|
|||
|
MOVE.L PICCLIPRGN(A4),-(SP) ;PUSH STATE VARIABLE
|
|||
|
JSRROM ROMEqualRgn ;ARE THEY THE SAME ?
|
|||
|
TST.B (SP)+ ;TEST RESULT
|
|||
|
BNE.S CLIPOK ;QUIT IF SAME
|
|||
|
|
|||
|
MOVE.L CLIPRGN(A3),-(SP) ;SET UP FOR COPYRGN BELOW
|
|||
|
MOVE.L PICCLIPRGN(A4),-(SP)
|
|||
|
;
|
|||
|
; Do alignement for new pictures
|
|||
|
;
|
|||
|
; tst.w picVersion(a4)
|
|||
|
; beq.s @Pict1
|
|||
|
jsr DoPict2 ;align for PICT2
|
|||
|
;@Pict1
|
|||
|
MOVEQ #$01,D0
|
|||
|
JSR DPutPicByte ;PUT CLIPRGN PARAM OPCODE
|
|||
|
MOVE.L CLIPRGN(A3),-(SP) ;PUSH CLIPRGN HANDLE
|
|||
|
JSRROM ROMPutPicRgn ;PUT CLIPRGN TO THEPIC
|
|||
|
|
|||
|
JSRROM ROMCOPYRGN ;COPY CLIPRGN INTO PICCLIPRGN
|
|||
|
|
|||
|
CLIPOK
|
|||
|
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
|
|||
|
MOVEQ #1,D0 ;CLEAR ZERO FLAG
|
|||
|
DONE MOVEM.L (SP)+,D7 ;MOVEM FOR CC, RESTORE REGS
|
|||
|
RTS ;AND RETURN
|
|||
|
|
|||
|
|
|||
|
;----------------------------------
|
|||
|
PatchOpenPicture FUNC EXPORT
|
|||
|
;------------------------------------------------------------------
|
|||
|
;
|
|||
|
; FUNCTION OpenPicture(picFrame: Rect): PicHandle;
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 4
|
|||
|
RESULT EQU PARAMSIZE+8 ;LONG, PICHANDLE
|
|||
|
RECT EQU RESULT-4 ;LONG, ADDR OF RECT
|
|||
|
|
|||
|
LINK A6,#0 ;NO LOCALS
|
|||
|
MOVEM.L A3-A4,-(SP) ;SAVE REGS
|
|||
|
CLR.L RESULT(A6) ;INIT FCN RESULT TO NIL
|
|||
|
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
|
|||
|
MOVE.L THEPORT(A4),A3 ;GET CURRENT GRAFPORT
|
|||
|
TST.L PICSAVE(A3) ;ARE WE ALREADY SAVING ?
|
|||
|
BNE DONE ;YES, RETURN NIL AND QUIT
|
|||
|
_HidePen ;NO, TURN OFF DRAWING
|
|||
|
;
|
|||
|
; Abort OpenPicture if heap doesn't have at least 500 bytes.
|
|||
|
;
|
|||
|
MOVE.L #500,D0 ;GET BYTE COUNT
|
|||
|
_NewHandle ;AT LEAST 500 BYTES IN THE HEAP ?
|
|||
|
BNE DONE ;NO, RETURN NIL AND QUIT
|
|||
|
_DisposHandle ;YES, Discard test handle
|
|||
|
|
|||
|
;
|
|||
|
; ALLOCATE PICSAVE RECORD
|
|||
|
;
|
|||
|
MOVE.L #PICSAVEREC,D0 ;GET BYTE COUNT
|
|||
|
_NewHandle ;ALLOCATE PICSAVE RECORD
|
|||
|
MOVE.L A0,A4 ;GET RESULT HANDLE
|
|||
|
MOVE.L A4,PICSAVE(A3) ;SAVE RESULT IN THEPORT
|
|||
|
|
|||
|
;
|
|||
|
; Allocate handle for fond id's we have seen so far
|
|||
|
;
|
|||
|
; Format of picFontList handle is:
|
|||
|
; handle size [long]
|
|||
|
; # of entries - 1 used [word]
|
|||
|
; id1, id2, ... idn
|
|||
|
|
|||
|
FontListSize equ 50*2
|
|||
|
|
|||
|
doFontList
|
|||
|
moveq #FontListSize+6,d0 ;initial size for 50 entries
|
|||
|
_NewHandle
|
|||
|
move.l picSave(a3),a1 ;get picSave handle
|
|||
|
move.l (a1),a1
|
|||
|
move.l a0,picFontList(a1) ;save picFontList handle in picSave record
|
|||
|
beq.s @noHandle
|
|||
|
|
|||
|
move.l (a0),a0 ;point into fontList
|
|||
|
moveq #FontListSize+6,d0 ;initial size for 50 entries
|
|||
|
move.l d0,(a0)+
|
|||
|
clr.l (a0) ; 1 entry, first entry = 0
|
|||
|
|
|||
|
@noHandle
|
|||
|
clr.w picVersion(a1) ;old picture
|
|||
|
|
|||
|
; Clear picQdRunSlop and picQdChExtra
|
|||
|
|
|||
|
clr.l picQdChExtra(a1) ; picQdChExtra := 0
|
|||
|
clr.l picQdRunSlop(a1) ; picQdRunSlop := 0
|
|||
|
|
|||
|
; INIT GLYPH STATE TO INVALID
|
|||
|
|
|||
|
move.l #$80808080,picGlyphState(a1) ; set glyph state to invalid values
|
|||
|
|
|||
|
; Fall into original OpenPicture at the proper point.
|
|||
|
|
|||
|
jmpROM OpenPictptchEntry
|
|||
|
Done jmpROM OpenPictDone
|
|||
|
|
|||
|
|
|||
|
PatchClosePicture PROC EXPORT
|
|||
|
;------------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE ClosePicture;
|
|||
|
;
|
|||
|
MOVEM.L D6-D7/A3,-(SP) ;SAVE REGS
|
|||
|
MOVE.L GRAFGLOBALS(A5),A3 ;POINT TO QUICKDRAW GLOBALS
|
|||
|
MOVE.L THEPORT(A3),A3 ;GET CURRENT GRAFPORT
|
|||
|
MOVE.L PICSAVE(A3),D7 ;ARE WE SAVING A PICTURE ?
|
|||
|
BEQ.S GOHOME ;NO, OOPS, EXIT
|
|||
|
|
|||
|
MOVE.L D7,A0 ;GET PICSAVE HANDLE <Nov02-89 KON>
|
|||
|
MOVE.L (A0),A0 ;POINT TO PICSAVE RECORD <Nov02-89 KON>
|
|||
|
move.l picFontList(a0),a0 ;get fontList handle <Nov02-89 KON>
|
|||
|
_DisposHandle
|
|||
|
; move picVersion(a0),d0
|
|||
|
; bne.s @DoNewPicture
|
|||
|
; jmpROM ClosePictptchEntry
|
|||
|
;@DoNewPicture
|
|||
|
|
|||
|
MOVE #opEndPic,-(SP) ;YES, PUSH ENDPIC OPCODE
|
|||
|
JSR PutPicOp ;PUT TO THEPIC
|
|||
|
jmpROM ClosePictptchEntryNew
|
|||
|
GoHome jmpROM ClosePictGoHome
|
|||
|
ENDPROC
|
|||
|
|
|||
|
PatchOpenPort patchProc _OpenPort, (Plus,SE,Portable,II,IIci)
|
|||
|
;-------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE OpenPort(port: GrafPtr);
|
|||
|
;
|
|||
|
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
|
|||
|
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
|
|||
|
jmpOld ; join the original ROM code.
|
|||
|
endproc
|
|||
|
|
|||
|
PatchInitPort patchProc _InitPort, (Plus,SE,Portable,II,IIci)
|
|||
|
;-------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE InitPort(port: GrafPtr);
|
|||
|
;
|
|||
|
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
|
|||
|
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
|
|||
|
jmpOld ; join the original ROM code.
|
|||
|
endproc
|
|||
|
|
|||
|
PatchSetPort patchProc _SetPort, (Plus,SE,Portable,II,IIci)
|
|||
|
;----------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE SetPort(gp: GrafPtr);
|
|||
|
;
|
|||
|
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
|
|||
|
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
|
|||
|
jmpOld ; join the original ROM code.
|
|||
|
endproc
|
|||
|
|
|||
|
PatchLineTo patchProc _LineTo, (Plus,SE,Portable,II,IIci)
|
|||
|
;----------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE LineTo(h,v: INTEGER);
|
|||
|
;
|
|||
|
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
|
|||
|
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
|
|||
|
jmpOld ; join the original ROM code.
|
|||
|
endproc
|
|||
|
|
|||
|
PatchLine patchProc _Line, (Plus,SE,Portable,II,IIci)
|
|||
|
;----------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE Line(dh,dv: INTEGER);
|
|||
|
;
|
|||
|
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
|
|||
|
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
|
|||
|
jmpOld ; join the original ROM code.
|
|||
|
endproc
|
|||
|
|
|||
|
PatchMoveTo patchProc _MoveTo, (Plus,SE,Portable,II,IIci)
|
|||
|
;----------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE MoveTo(h,v: INTEGER);
|
|||
|
;
|
|||
|
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
|
|||
|
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
|
|||
|
jmpOld ; join the original ROM code.
|
|||
|
endproc
|
|||
|
|
|||
|
PatchMove patchProc _Move, (Plus,SE,Portable,II,IIci)
|
|||
|
;----------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE Move(dh,dv: INTEGER);
|
|||
|
;
|
|||
|
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
|
|||
|
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
|
|||
|
jmpOld ; join the original ROM code.
|
|||
|
endproc
|
|||
|
|
|||
|
PatchShowCursor PROC EXPORT
|
|||
|
;----------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE ShowCursor();
|
|||
|
;
|
|||
|
|
|||
|
MOVE.B #1,CRSRBUSY ;MARK CHANGE IN PROGRESS
|
|||
|
ADDQ #1,CRSRSTATE ;CURSOR HIDDEN ONE LESS DEEP
|
|||
|
BLT.S DoneHide ;QUIT IF STILL HIDDEN
|
|||
|
clr.b CrsrObscure ;unobscure if level goes +
|
|||
|
subq #1,CrsrState ; setup for ROM’s ADDQ #1 <21>
|
|||
|
jmpOld ; call the ROM (or other patcher) <21>
|
|||
|
DoneHide
|
|||
|
jmpROM ROMShowCrsr
|
|||
|
|
|||
|
endproc
|
|||
|
|
|||
|
;=========================================================================================
|
|||
|
;=========================================================================================
|
|||
|
;
|
|||
|
; Patch SeedFill and CalcMask to check both up and down on the first pass of filling
|
|||
|
;
|
|||
|
;=========================================================================================
|
|||
|
;=========================================================================================
|
|||
|
|
|||
|
SeedFill PROC EXPORT
|
|||
|
EXPORT CalcMask
|
|||
|
|
|||
|
;-------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE SeedFill(srcPtr,dstPtr: Ptr;
|
|||
|
; srcRow,dstRow,height,words: INTEGER;
|
|||
|
; seedH,seedV: INTEGER)
|
|||
|
;
|
|||
|
MOVE.L (SP)+,A0 ;pop return addr
|
|||
|
MOVEQ #-1,D0 ;get a long of -1
|
|||
|
MOVE.L D0,-(SP) ;push edge = all ones
|
|||
|
BRA.S SHARE ;share common code
|
|||
|
|
|||
|
|
|||
|
;-------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; PROCEDURE CalcMask(srcPtr,dstPtr: Ptr;
|
|||
|
; srcRow,dstRow,height,words: INTEGER);
|
|||
|
;
|
|||
|
CalcMask MOVE.L (SP)+,A0 ;pop return addr
|
|||
|
MOVEQ #-1,D0 ;get a long of -1
|
|||
|
MOVE.L D0,-(SP) ;push seed = (-1,-1)
|
|||
|
CLR.L -(SP) ;push edge = zeros
|
|||
|
SHARE MOVE.L A0,-(SP) ;restore return addr
|
|||
|
|
|||
|
|
|||
|
|
|||
|
;-------------------------------------------------------------------------
|
|||
|
;
|
|||
|
; LOCAL PROCEDURE MakeMask(srcPtr,dstPtr: Ptr;
|
|||
|
; srcRow,dstRow,height,words: INTEGER;
|
|||
|
; seedH,seedV: INTEGER;
|
|||
|
; edge: LongInt);
|
|||
|
;
|
|||
|
; A6 OFFSETS OF PARAMS AND LOCALS AFTER LINK:
|
|||
|
;
|
|||
|
PARAMSIZE EQU 24
|
|||
|
srcPtr EQU PARAMSIZE+8-4 ;long
|
|||
|
dstPtr EQU srcPtr-4 ;long
|
|||
|
srcRow EQU dstPtr-2 ;word
|
|||
|
dstRow EQU srcRow-2 ;word
|
|||
|
height EQU dstRow-2 ;word
|
|||
|
words EQU height-2 ;word
|
|||
|
seedH EQU words-2 ;word
|
|||
|
seedV EQU seedH-2 ;word
|
|||
|
edge EQU seedV-4 ;long
|
|||
|
|
|||
|
|
|||
|
dstBump EQU -2 ;word
|
|||
|
saveStk EQU dstBump-4 ;long
|
|||
|
varSize EQU saveStk ;total locals
|
|||
|
|
|||
|
|
|||
|
LINK A6,#varSize ;allocate stack frame
|
|||
|
MOVEM.L D3-D7/A2-A4,-(SP) ;save regs
|
|||
|
MOVE.L SP,saveStk(A6) ;save stack pointer
|
|||
|
|
|||
|
;
|
|||
|
; prepare height and words for DBRA count. Quit if either <= 0.
|
|||
|
;
|
|||
|
MOVE words(A6),D5 ;get count of words
|
|||
|
BLE GOHOME ;quit if words <= 0
|
|||
|
SUB #1,D5 ;subtract 1 for DBRA count
|
|||
|
SUB #1,height(A6) ;convert height to DBRA
|
|||
|
BLT GOHOME ;quit if height <= 0
|
|||
|
|
|||
|
;
|
|||
|
; init dst to all ones:
|
|||
|
;
|
|||
|
MOVE words(A6),D0 ;get # of words
|
|||
|
ADD D0,D0 ;double for bytes
|
|||
|
MOVE dstRow(A6),D1 ;get dstRow
|
|||
|
SUB D0,D1 ;subtract bytes for dstBump
|
|||
|
MOVE D1,dstBump(A6) ;save dstBump for later
|
|||
|
MOVE.L dstPtr(A6),A2 ;point to dst
|
|||
|
MOVEQ #-1,D0 ;get some black
|
|||
|
MOVE height(A6),D3 ;init DBRA rowCount
|
|||
|
BLACK1 MOVE D5,D2 ;init DBRA wordCount
|
|||
|
BLACK2 MOVE D0,(A2)+ ;put a word of black
|
|||
|
DBRA D2,BLACK2 ;loop all words in row
|
|||
|
ADD D1,A2 ;bump to next row
|
|||
|
DBRA D3,BLACK1 ;loop height rows
|
|||
|
|
|||
|
;
|
|||
|
; clear one dst pixel at seedH,seedV
|
|||
|
;
|
|||
|
MOVE seedV(A6),D0 ;get seed vert coord
|
|||
|
BLT.S NOSEED ;skip if neg (no seed)
|
|||
|
MULU dstRow(A6),D0 ;mul times dst row
|
|||
|
MOVE.L dstPtr(A6),A0 ;point to dst
|
|||
|
ADD.L D0,A0 ;add vertical offset <EHB 28-Oct-85>
|
|||
|
MOVE seedH(A6),D0 ;get seed horiz coord
|
|||
|
MOVE D0,D1 ;copy seedH
|
|||
|
ASR #3,D0 ;div by 8 for byte
|
|||
|
NOT D1 ;invert bit number
|
|||
|
BCLR D1,0(A0,D0) ;clear seed pixel
|
|||
|
NOSEED
|
|||
|
;
|
|||
|
; allocate a scanline buffer of ones or zeros on the stack:
|
|||
|
;
|
|||
|
MOVE.L edge(A6),D6 ;get zero or all ones
|
|||
|
MOVE D5,D1 ;get longCount
|
|||
|
NEXTBUF MOVE D6,-(SP) ;write a word of ones or zeros
|
|||
|
DBRA D1,NEXTBUF ;loop all words
|
|||
|
|
|||
|
MOVE.L srcPtr(A6),A0 ;point to top of src
|
|||
|
MOVE.L dstPtr(A6),A2 ;point to top of dst
|
|||
|
st d7 ;set dirty flag to force <KON 24JAN91>
|
|||
|
; bra.s FirstPass ;search up and down <KON 24JAN91>
|
|||
|
;NXTPASS SF D7 ;clear dirty flag
|
|||
|
FirstPass
|
|||
|
jmpROM ROMSeedFill
|
|||
|
GoHome
|
|||
|
jmpROM ROMGoHome
|
|||
|
ENDPROC
|
|||
|
|
|||
|
|
|||
|
; ---------------------------------------------------------------------------
|
|||
|
|
|||
|
INCLUDE 'DrawPicture32Patch.a'
|
|||
|
|
|||
|
; ---------------------------------------------------------------------------
|
|||
|
|
|||
|
ROMs Plus,SE,Portable
|
|||
|
|
|||
|
JShowCursor EQU $0804 ;this shouldn't be here
|
|||
|
|
|||
|
MakePatch CalcMask,$A838 ; CalcMask and SeedFill need to <KON 24JAN91>
|
|||
|
MakePatch SeedFill,$A839 ; always scan up as well as down <KON 24JAN91>
|
|||
|
MakePatch StretchBits, $AB27
|
|||
|
MakePatch PatchShowCursor, JShowCursor
|
|||
|
MakePatch PatchStdRect, $A8A0
|
|||
|
MakePatch PatchStdLine, $A890
|
|||
|
MakePatch PatchStdRRect, $A8AF
|
|||
|
MakePatch PatchStdOval, $A8B6
|
|||
|
MakePatch PatchStdArc, $A8BD
|
|||
|
MakePatch PatchStdComment, $A8F1
|
|||
|
|
|||
|
MakePatch NewStdGetPic, $A8EE
|
|||
|
MakePatch PatchOpenPicture, $A8F3
|
|||
|
MakePatch PatchClosePicture, $A8F4
|
|||
|
MakePatch GetPMData, $ABC4
|
|||
|
MakePatch OpenCPicture, $AA20
|
|||
|
MakePatch QDExtDispatcher, $AB1D
|
|||
|
MakePatch VisRgnChanged, $A0A5, (Plus,SE,Portable,II,IIci)
|
|||
|
|
|||
|
MakePatch PatchStdBits, $A8EB ;used to be Plus, SE only
|
|||
|
|
|||
|
;
|
|||
|
; RGBForeColor, RGBBackColor, GetForeColor, GetBackColor, and QDError
|
|||
|
;
|
|||
|
MakePatch RGBForeColor, $AA14
|
|||
|
MakePatch RGBBackColor, $AA15
|
|||
|
MakePatch GetForeColor, $AA19
|
|||
|
MakePatch GetBackColor, $AA1A
|
|||
|
MakePatch QDError, $AA40
|
|||
|
|
|||
|
; ---------------------------------------------------------------------------
|
|||
|
|
|||
|
ROMs Plus, SE
|
|||
|
|
|||
|
MakePatch PicItemPlusSE, $AB9A
|
|||
|
MakePatch PatchStdPoly, $A8C5
|
|||
|
MakePatch BitMapRgnptch, $A8D7
|
|||
|
MakePatch PlusSEDrawPicture, $A8f6
|
|||
|
|
|||
|
ROMs Portable, SE
|
|||
|
MakePatch PatchStdRgnSEPortable, $A8D1
|
|||
|
|
|||
|
ROMs Plus
|
|||
|
MakePatch PatchStdRgnPlus, $A8D1
|
|||
|
; ---------------------------------------------------------------------------
|
|||
|
|
|||
|
ROMs Portable
|
|||
|
MakePatch PicItemPortable, $AB9A
|
|||
|
MakePatch PortablePatchStdPoly, $A8C5
|
|||
|
MakePatch PortableDrawPicture, $A8f6
|
|||
|
|
|||
|
; ---------------------------------------------------------------------------
|
|||
|
|
|||
|
END
|