mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-29 07:29:15 +00:00
0ba83392d4
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
2697 lines
59 KiB
Plaintext
2697 lines
59 KiB
Plaintext
;
|
||
; File: Arith8Blt.a
|
||
;
|
||
; Contains: xxx put contents here (or delete the whole line) xxx
|
||
;
|
||
; Written by: xxx put name of writer here (or delete the whole line) xxx
|
||
;
|
||
; Copyright: © 1987-1990 by Apple Computer, Inc., all rights reserved.
|
||
;
|
||
; Change History (most recent first):
|
||
;
|
||
; <5> 10/8/90 SMC Removed patchciRom tests in bTransparent8 and rTransparent8.
|
||
; They are now handled in QDciPatchROM.a.
|
||
; <4> 8/16/90 SMC Fixed horizontal pattern alignment of complex patterns in
|
||
; transparent and arithmetic slab transfer modes.
|
||
; <3> 1/29/90 BAL Fixed conditionals for JP build.
|
||
; <2> 1/28/90 KON Conditionalized an equate table for ci Rom patch. This file is
|
||
; included by QDciPatchROM.a.
|
||
; <1.1> 11/18/89 BAL Made a real part of 32-Bit QuickDraw 1.2
|
||
; <1.0> 11/9/89 BAL Added to Ease
|
||
; <1.2> 1/16/89 CCH Merged 6.0.3 final sources into 7.0.
|
||
; <¥1.1> 11/16/88 CCH Updated to newest version.
|
||
; <AJH> 2/23/88 fixed arithmetic mode cache initialization (add and sub modes) (1.1)
|
||
; <AJH> 2/22/88 fixed bug in 8-1 copybits (can't assume map is 0 or 1 only)
|
||
; <AJH> 2/21/88 fixed wrong reg (A4 -> A2) bump bug in oval handler (MacDraw crash)
|
||
; (1.0)
|
||
; <AJH> 2/21/88 fixed bug in arithmetic mode cache initialization
|
||
; <AJH> 2/18/88 fixed bug in transparent mode fill (LSR instead of ASR)
|
||
; <AJH> 2/18/88 fixed bug in unclipped, less than 5 wide arithmetic modes
|
||
; <AJH> 2/7/88 added configuration code at startup time (.99)
|
||
; <AJH> 2/4/88 fixed arithmetic mode bug with type 0 patterns (-$68, not -68!) (.987)
|
||
; AJH 05-Feb-88 converted to cdev
|
||
; <AJH> 2/4/88 added transparent modes
|
||
; <AJH> 2/2/88 added blend mode; fixed arithmetic copyBits bug AJH 03-Feb-88 removed
|
||
; hilite by invert hack (.985) AJH 03-Feb-88 further optimized
|
||
; hilite, 1 to 8 copybits
|
||
; <AJH> 2/1/88 added arithmetic transfer mode fills for clipped rects (.98)
|
||
; <AJH> 1/31/88 added arithmetic transfer mode fills for unclipped rects
|
||
; <AJH> 1/30/88 added arithmetic transfer mode fills for rrects/ovals
|
||
; <AJH> 1/29/88 added oval/rrects with complex patterns
|
||
; <AJH> 1/28/88 check if already installed; if so, display logo AJH 29-Jan-88 removed
|
||
; OR mode complex fills; fixed OR mode simple fills AJH 29-Jan-88
|
||
; reject patterns > 8 pixels wide
|
||
; <AJH> 1/28/88 INIT wasn't locked bug (.97)
|
||
; <AJH> 1/27/88 OR mode fills (simple and complex patterns) (.96)
|
||
; <AJH> 1/26/88 added oval/rrects in OR mode
|
||
; <AJH> 1/24/88 broke LogoPict into separate resource; separate 1-bit logo (.95) AJH
|
||
; 25-Jan-88 region counting for InvertClip AJH 26-Jan-88
|
||
; significantly improved oval/rrects when unclipped
|
||
; <AJH> 1/23/88 fixed bug when region is a mask (CB1to8 from CopyMask)
|
||
; <AJH> 1/22/88 fixed OR mode fill, added $335 for MacDraw Plus
|
||
; <AJH> 1/17/88 fixed scaling rejection bug in mapped copyBits AJH 18-Jan-88
|
||
; implemented fast 8 to 1 copyBits; fixed 1-8 seekRgn bug (.94)
|
||
; AJH 20-Jan-88 region counting for clipped blit
|
||
; <AJH> 1/16/88 fixed seek region bug in mapped copyBits (.93)
|
||
; <AJH> 1/14/88 fixed bug in unclipped pattern fill (.92)
|
||
; <AJH> 1/13/88 made fills work in modes other than 8-bit (.91)
|
||
; <AJH> 1/11/88 st Beta release, version .9
|
||
;
|
||
; To Do:
|
||
;
|
||
|
||
;EASE$$$ READ ONLY COPY of file Òarith8blt.aÓ
|
||
; 1.1 BAL 11/18/1989 Made a real part of 32-Bit QuickDraw 1.2
|
||
; 1.0 BAL 11/09/1989 Added to Ease
|
||
; END EASE MODIFICATION HISTORY
|
||
; 1.2 CCH 01/16/1989 Merged 6.0.3 final sources into 7.0.
|
||
;¥1.1 CCH 11/16/1988 Updated to newest version.
|
||
|
||
PRINT ON
|
||
|
||
; File QuickLoops.a
|
||
;-----------------------------------------------------------------------------
|
||
;
|
||
; High performance Mac II Color QuickDraw Inner Loops (for 8-bit mode)
|
||
;
|
||
; written by Andy Hertzfeld December 22, 1987
|
||
;
|
||
; This INIT patches out some of the Color QuickDraw inner loop traps
|
||
; to improve 8-bit performance by a factor of 2 to 3 (or even more!)
|
||
;
|
||
; Modification History:
|
||
;
|
||
; AJH 11-Jan-88 1st Beta release, version .9
|
||
; AJH 13-Jan-88 made fills work in modes other than 8-bit (.91)
|
||
; AJH 14-Jan-88 fixed bug in unclipped pattern fill (.92)
|
||
; AJH 16-Jan-88 fixed seek region bug in mapped copyBits (.93)
|
||
; AJH 17-Jan-88 fixed scaling rejection bug in mapped copyBits
|
||
; AJH 18-Jan-88 implemented fast 8 to 1 copyBits; fixed 1-8 seekRgn bug (.94)
|
||
; AJH 20-Jan-88 region counting for clipped blit
|
||
; AJH 22-Jan-88 fixed OR mode fill, added $335 for MacDraw Plus
|
||
; AJH 23-Jan-88 fixed bug when region is a mask (CB1to8 from CopyMask)
|
||
; AJH 24-Jan-88 broke LogoPict into separate resource; separate 1-bit logo (.95)
|
||
; AJH 25-Jan-88 region counting for InvertClip
|
||
; AJH 26-Jan-88 significantly improved oval/rrects when unclipped
|
||
; AJH 26-Jan-88 added oval/rrects in OR mode
|
||
; AJH 27-Jan-88 OR mode fills (simple and complex patterns) (.96)
|
||
; AJH 28-Jan-88 INIT wasn't locked bug (.97)
|
||
; AJH 28-Jan-88 check if already installed; if so, display logo
|
||
; AJH 29-Jan-88 removed OR mode complex fills; fixed OR mode simple fills
|
||
; AJH 29-Jan-88 reject patterns > 8 pixels wide
|
||
; AJH 29-Jan-88 added oval/rrects with complex patterns
|
||
; AJH 30-Jan-88 added arithmetic transfer mode fills for rrects/ovals
|
||
; AJH 31-Jan-88 added arithmetic transfer mode fills for unclipped rects
|
||
; AJH 01-Feb-88 added arithmetic transfer mode fills for clipped rects (.98)
|
||
; AJH 02-Feb-88 added blend mode; fixed arithmetic copyBits bug
|
||
; AJH 03-Feb-88 removed hilite by invert hack (.985)
|
||
; AJH 03-Feb-88 further optimized hilite, 1 to 8 copybits
|
||
; AJH 04-Feb-88 added transparent modes
|
||
; AJH 04-Feb-88 fixed arithmetic mode bug with type 0 patterns (-$68, not -68!) (.987)
|
||
; AJH 05-Feb-88 converted to cdev
|
||
; AJH 07-Feb-88 added configuration code at startup time (.99)
|
||
; AJH 18-Feb-88 fixed bug in transparent mode fill (LSR instead of ASR)
|
||
; AJH 18-Feb-88 fixed bug in unclipped, less than 5 wide arithmetic modes
|
||
; AJH 21-Feb-88 fixed bug in arithmetic mode cache initialization
|
||
; AJH 21-Feb-88 fixed wrong reg (A4 -> A2) bump bug in oval handler (MacDraw crash) (1.0)
|
||
; AJH 22-Feb-88 fixed bug in 8-1 copybits (can't assume map is 0 or 1 only)
|
||
; AJH 23-Feb-88 fixed arithmetic mode cache initialization (add and sub modes) (1.1)
|
||
;
|
||
;---- A New Life at Apple --------------------
|
||
;
|
||
; PB415 DAF/BAL 01Mar88 QuickerDraw integrated into system patch files
|
||
; PB427 BAL 17Mar88 Corrected some edge masking bugs in arithmetic modes.
|
||
; Return to ROM if arithmetic mode copybits from left to right.
|
||
; PB428 DAF 18Mar88 Fixed QuickerDraw to be A/UX friendly.
|
||
; PB433 DAF 22Mar88 Improved dispatches to ROM (saved a couple of bytes and cycles)
|
||
; BAL 25Mar88 Converted to use symbolic stack frame references
|
||
; PB446 DBG 29Mar88 Fixed up missed JMPs into ROM in QuickerDraw.a, which cause certain
|
||
; CopyBits cases to crash.
|
||
; PB448 DBG 30Mar88 Fixed erroneous references to HBUMP to be to SRCBUMP
|
||
; PB452 BAL 01Apr88 Fixed bug in DrawSlab OR mode handler ($381) to preserve fgColor
|
||
; PB471 BAL 18Apr88 Fixed 1 to 8 bit expansion to first insure CLUT is B/W.
|
||
; PB473 DAF 19Apr88 Modified PB471 to allow more cases to be accelerated.
|
||
; PB471 BAL/DVB 13Jun88 Fixed 1 to 8 bit expansion to first insure src = scalebuf
|
||
; (i.e. dest not before pixmap's baseAddr).
|
||
; PBnnn dÃb 12Jul88 Fixed error in 8 to 1 when white doesn't map to white.
|
||
;
|
||
;--------------------------------------------------------------------------------------------------
|
||
|
||
fooo proc ; make following defines global
|
||
endproc
|
||
|
||
IF (&TYPE('patchciRom') = 'UNDEFINED') THEN
|
||
patchciRom EQU 0
|
||
ENDIF
|
||
|
||
|
||
MACHINE MC68020
|
||
|
||
; for reference, here are the patched traps
|
||
|
||
IF 0 THEN
|
||
|
||
InstToolTp AddOverFillO,$38A
|
||
InstToolTp SubOverFillO,$38E
|
||
InstToolTp AddPinFillO,$389
|
||
InstToolTp SubPinFillO,$38B
|
||
InstToolTp AddMaxFillO,$38D
|
||
InstToolTp AddMinFillO,$38F
|
||
InstToolTp BlendFillO,$388
|
||
InstToolTp TransFillO,$38C
|
||
|
||
InstToolTp AddOverFillR,$368
|
||
InstToolTp SubOverFillR,$36C
|
||
InstToolTp AddPinFillR,$367
|
||
InstToolTp SubPinFillR,$369
|
||
InstToolTp AddMaxFillR,$36B
|
||
InstToolTp AddMinFillR,$36D
|
||
InstToolTp BlendFillR,$366
|
||
InstToolTp TransFillR,$36A
|
||
|
||
InstToolTp AddOverUnClip,$352
|
||
InstToolTp SubOverUnClip,$356
|
||
InstToolTp AddPinUnClip,$351
|
||
InstToolTp SubPinUnClip,$353
|
||
InstToolTp AddMaxUnClip,$355
|
||
InstToolTp AddMinUnClip,$357
|
||
InstToolTp BlendUnClip,$350
|
||
InstToolTp TransUnClip,$354
|
||
|
||
ENDIF
|
||
|
||
;******************************************************************************************
|
||
|
||
;
|
||
; to make scoping for upcoming equates happier, we force the end of the previous procedure here
|
||
;
|
||
|
||
QuickerDraw PROC EXPORT
|
||
|
||
EXPORT slAddOver8
|
||
EXPORT slSubOver8
|
||
EXPORT slAddPin8
|
||
EXPORT slSubPin8
|
||
EXPORT slMax8
|
||
EXPORT slMin8
|
||
EXPORT slAvg8
|
||
|
||
EXPORT rAddOver8
|
||
EXPORT rSubOver8
|
||
EXPORT rAddPin8
|
||
EXPORT rSubPin8
|
||
EXPORT rMax8
|
||
EXPORT rMin8
|
||
EXPORT rAvg8
|
||
|
||
EXPORT bAddOver8
|
||
EXPORT bSubOver8
|
||
EXPORT bAddPin8
|
||
EXPORT bSubPin8
|
||
EXPORT bMax8
|
||
EXPORT bMin8
|
||
EXPORT bAvg8
|
||
|
||
EXPORT slTransparent8
|
||
EXPORT rTransparent8
|
||
EXPORT bTransparent8
|
||
|
||
if patchciRom THEN
|
||
; now patch the inner loop traps; so far we handle:
|
||
|
||
Old350 EQU $2DAD0 ; bAvg-- blend fill, unclipped rects
|
||
Old351 EQU $2D450 ; bAddPin-- addPin fill, unclipped rects
|
||
Old352 EQU $2D340 ; bAddOver-- addOver fill, unclipped rects (and bitmaps)
|
||
Old353 EQU $2D6E0 ; bSubPin-- subPin fill, unclipped rects
|
||
Old354 EQU $2DE80 ; bTransparent-- transparent fill, unclipped rects
|
||
Old355 EQU $2D870 ; bMax-- addMax fill, unclipped rects
|
||
Old356 EQU $2D5D0 ; bSubOver-- subOver fill, unclipped rects
|
||
Old357 EQU $2D9A0 ; bMin-- addMin fill, unclipped rects
|
||
|
||
Old366 EQU $2BBB0 ; rAvg-- blend fill, clipped rects
|
||
Old367 EQU $2B4C0 ; rAddPin-- addPin fill, clipped rects
|
||
Old368 EQU $2B3A0 ; rAddOver-- addOver fill, clipped rects (and bitmaps)
|
||
Old369 EQU $2B790 ; rSubPin-- subPin fill, clipped rects
|
||
Old36A EQU $2C060 ; rTransparent-- transparent fill, clipped rects
|
||
Old36B EQU $2B930 ; rMax-- addMax fill, clipped rects
|
||
Old36C EQU $2B660 ; rSubOver-- subOver fill, clipped rects
|
||
Old36D EQU $2BA70 ; rMin-- addMin fill, clipped rects
|
||
|
||
Old388 EQU $2F670 ; slAvg-- blend fill, ovals
|
||
Old389 EQU $2F3E0 ; slAddPin-- addPin fill, ovals
|
||
Old38A EQU $2F330 ; slAddOver-- addOver fill, ovals
|
||
Old38B EQU $2F4E0 ; slSubPin-- subPin fill, ovals
|
||
Old38C EQU $2F790 ; slTransparent-- transparent fill, ovals
|
||
Old38D EQU $2F570 ; slMax-- AddMax fill, ovals
|
||
Old38E EQU $2F470 ; slSubOver-- subOver fill, ovals
|
||
Old38F EQU $2F5F0 ; slMin-- AddMin fill, ovals
|
||
|
||
Old380 EQU $2F1C4 ; slMASK8-- oval/rrect copy mode scan line handler
|
||
Old381 EQU $2F1E6 ; slMASK9-- oval/rrect OR mode scan line handler
|
||
Old384 EQU $2F230 ; slXMask8-- oval/rrect complex fill, copy mode
|
||
|
||
ELSEIF 0 THEN ;these are the equates for MacII
|
||
|
||
Old350 EQU $1BF24 ; bAvg-- blend fill, unclipped rects
|
||
Old351 EQU $1BC6A ; bAddPin-- addPin fill, unclipped rects
|
||
Old352 EQU $1BBF4 ; bAddOver-- addOver fill, unclipped rects (and bitmaps)
|
||
Old353 EQU $1BD7C ; bSubPin-- subPin fill, unclipped rects
|
||
Old354 EQU $1C0B0 ; bTransparent-- transparent fill, unclipped rects
|
||
Old355 EQU $1BE18 ; bMax-- addMax fill, unclipped rects
|
||
Old356 EQU $1BD06 ; bSubOver-- subOver fill, unclipped rects
|
||
Old357 EQU $1BE9E ; bMin-- addMin fill, unclipped rects
|
||
|
||
Old366 EQU $1CF94 ; rAvg-- blend fill, clipped rects
|
||
Old367 EQU $1CDE8 ; rAddPin-- addPin fill, clipped rects
|
||
Old368 EQU $1CD9C ; rAddOver-- addOver fill, clipped rects (and bitmaps)
|
||
Old369 EQU $1CE88 ; rSubPin-- subPin fill, clipped rects
|
||
Old36A EQU $1D094 ; rTransparent-- transparent fill, clipped rects
|
||
Old36B EQU $1CEDC ; rMax-- addMax fill, clipped rects
|
||
Old36C EQU $1CE3C ; rSubOver-- subOver fill, clipped rects
|
||
Old36D EQU $1CF38 ; rMin-- addMin fill, clipped rects
|
||
|
||
Old388 EQU $1E1BE ; slAvg-- blend fill, ovals
|
||
Old389 EQU $1DF50 ; slAddPin-- addPin fill, ovals
|
||
Old38A EQU $1DEBA ; slAddOver-- addOver fill, ovals
|
||
Old38B EQU $1E042 ; slSubPin-- subPin fill, ovals
|
||
Old38C EQU $1E2CE ; slTransparent-- transparent fill, ovals
|
||
Old38D EQU $1E0CE ; slMax-- AddMax fill, ovals
|
||
Old38E EQU $1DFDA ; slSubOver-- subOver fill, ovals
|
||
Old38F EQU $1E146 ; slMin-- AddMin fill, ovals
|
||
|
||
Old380 EQU $1DD7E ; slMASK8-- oval/rrect copy mode scan line handler
|
||
Old381 EQU $1DD9A ; slMASK9-- oval/rrect OR mode scan line handler
|
||
Old384 EQU $1DDCE ; slXMask8-- oval/rrect complex fill, copy mode
|
||
|
||
ENDIF
|
||
;----------------------------------------------------
|
||
;
|
||
; A6 OFFSETS OF LOCAL VARIABLES AFTER LINK:
|
||
;
|
||
; STACKFRAME LINKED AND LOCALS INITIALIZED BY STRETCHBITS.
|
||
;
|
||
&CurFile SETC 'STRETCH'
|
||
|
||
INCLUDE 'DrawingVars.a'
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Arithmetic transfer modes start here...
|
||
|
||
;******************************************************************************************
|
||
|
||
; Here's where we implement the arithmetic transfer mode fills for ovals/rrects
|
||
; Use a common loop for all the transfer modes, with specialized handlers to do the
|
||
; pixel arithmetic.
|
||
|
||
; the first receiver is for AddOver mode for ovals and roundRects
|
||
|
||
;>>>>>>>>>>>
|
||
AddOverFillO
|
||
slAddOver8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BEQ.S @0 ;if not, skip
|
||
JMPRom Old38A ; continue in ROM <S433>
|
||
|
||
endif
|
||
|
||
; OK, first do the pattern setup
|
||
@0
|
||
MOVE.L A0,A3 ;set up pattern base
|
||
LEA AddOverHandler,A0 ;use addOver
|
||
DoArithMode
|
||
MOVEM.L D7/A4-A5,-(SP) ;save work regs
|
||
|
||
BSR.S ArithModeHandler ;invoke the handler
|
||
|
||
MOVEM.L (SP)+,D7/A4-A5 ;restore regs
|
||
RTS
|
||
|
||
; here is the general handler for a scan line of arithmetic fills
|
||
|
||
ArithModeHandler
|
||
MOVEQ #0,D6 ;init pattern index
|
||
|
||
MOVE.W PATROW(A6),D4 ;get pattern size in bytes
|
||
SUBQ #4,D4 ;is it a simple one?
|
||
BLE ArithSimplePat ;if so, handle faster
|
||
|
||
; sometimes simple patterns come in as 8 byte ones, so check for that
|
||
|
||
MOVE.W PATHPOS(A6),D6 ; <SMC 16Aug90>
|
||
ASR.W #3,D6 ;turn bits back into bytes <SMC 16Aug90>
|
||
ADD.W D0,D6 ; <SMC 16Aug90>
|
||
|
||
SUBQ #4,D4 ;is it 8 long?
|
||
BNE.S ArithComplexPat ;if not, skip
|
||
|
||
; fetch both halves of the pattern and see if they match
|
||
|
||
MOVE.W PATHMASK(A6),D4 ;get pattern mask
|
||
ASR #3,D4 ;turn bit index to byte index
|
||
AND.W D4,D6 ;mask it
|
||
|
||
MOVE.L EXPAT(A6),A4
|
||
ADD.l PATVPOS(A6),A4 ;compute pattern address
|
||
|
||
MOVE.L 0(A4,D6),D4 ;get source longword
|
||
EOR #4,D6
|
||
CMP.L 0(A4,D6),D4 ;is it really simple?
|
||
BEQ ArithSimplePat ;if so, go handle
|
||
|
||
EOR #4,D6 ;restore D6
|
||
|
||
; set up the pattern variables, since it's a complex pattern
|
||
|
||
ArithComplexPat
|
||
MOVE.L EXPAT(A6),A3
|
||
ADD.l PATVPOS(A6),A3 ;compute pattern address
|
||
ArithComplex1
|
||
MOVE.L D1,-(SP) ;remember right edge mask
|
||
|
||
MOVEQ #0,D1
|
||
MOVEQ #0,D7 ;clear for pixCache
|
||
|
||
; set up A0 to point to the proper handler, depending on the width of the inverse table
|
||
|
||
MOVE.L A0,A4 ;remember handler base
|
||
|
||
MOVE.W INVSIZE(A6),D4 ;get shift count (3,4,5)
|
||
SUBQ #3,D4
|
||
ADD.W 0(A0,D4.W*2),A0 ;point to proper handler
|
||
|
||
; init the single pixel cache, where D1 is last source, D7 is last dest, and D0 is last result
|
||
|
||
MOVEQ #0,D5
|
||
MOVE.L COLORTABLE(A6),A5 ;get color table ptr
|
||
|
||
MOVE.B D1,D5
|
||
LEA 0(A5,D5.W*8),A4 ;point to source color
|
||
|
||
MOVE.B D7,D5
|
||
LEA 0(A5,D5.W*8),A5 ;point to dest color
|
||
|
||
JSR (A0) ;map it
|
||
MOVE.B ([INVCOLOR,A6],D0.W,6),D0 ;look up in inverse table
|
||
|
||
; test for the single long case
|
||
|
||
TST.W D2
|
||
BRA ArithBot0
|
||
|
||
; here's the main loop for complex patterns, where we process a longword at a time
|
||
; use a single pixel cache for speed using D0, D1 and D7
|
||
|
||
ArithRight0
|
||
AND.L (SP)+,D3
|
||
ArithLoop0
|
||
MOVE.W PATHMASK(A6),D4 ;get pattern mask
|
||
ASR #3,D4 ;turn bit index to byte index
|
||
AND.W D4,D6 ;mask it
|
||
|
||
MOVE.L 0(A3,D6),D4 ;get source longword
|
||
ADDQ #4,D6
|
||
|
||
MOVE.L A2,D5 ;no clipping?
|
||
BEQ.S @0 ;if none, skip
|
||
|
||
AND.L (A2)+,D3 ;get region/edge mask in D3
|
||
BEQ ArithMask0
|
||
@0
|
||
MOVE.L (A1),D5 ;get dest longword
|
||
|
||
; map 1st byte
|
||
|
||
TST.B D3
|
||
BEQ.S @8 ;if mask zero, we can skip
|
||
|
||
; if same as previous, we can short-circuit the mapping
|
||
|
||
CMP.B D4,D1 ;source the same?
|
||
BNE.S @9 ;if not, skip
|
||
|
||
CMP.B D5,D7 ;dest the same?
|
||
BNE.S @9 ;if not, skip
|
||
|
||
; it's the same, so use it
|
||
|
||
MOVE.B D0,D5 ;use last result
|
||
BRA.S @8 ;skip the mapping
|
||
|
||
; it's different than the last one, so map it
|
||
|
||
@9
|
||
MOVE.B D4,D1
|
||
|
||
MOVE.L COLORTABLE(A6),A5
|
||
LEA 0(A5,D1.W*8),A4 ;point to source color
|
||
|
||
MOVE.B D5,D7
|
||
LEA 0(A5,D7.W*8),A5 ;point to dest color
|
||
|
||
JSR (A0) ;map according to Xfer mode
|
||
MOVE.B ([INVCOLOR,A6],D0.W,6),D5 ;look up in inverse table
|
||
MOVE.B D5,D0
|
||
@8
|
||
LSR.L #8,D3
|
||
LSR.L #8,D4
|
||
ROR.L #8,D5
|
||
|
||
; map 2nd byte
|
||
|
||
TST.B D3
|
||
BEQ.S @2 ;if mask zero, we can skip
|
||
|
||
; if same as previous, we can short-circuit the mapping
|
||
|
||
CMP.B D4,D1 ;source the same?
|
||
BNE.S @1 ;if not, skip
|
||
|
||
CMP.B D5,D7 ;dest the same?
|
||
BNE.S @1 ;if not, skip
|
||
|
||
; it's the same, so use it
|
||
|
||
MOVE.B D0,D5 ;use last result
|
||
BRA.S @2 ;skip the mapping
|
||
|
||
; it's different than the last one, so map it
|
||
|
||
@1
|
||
MOVE.B D4,D1
|
||
MOVE.L COLORTABLE(A6),A5
|
||
|
||
LEA 0(A5,D1.W*8),A4 ;point to source color
|
||
|
||
MOVE.B D5,D7
|
||
LEA 0(A5,D7.W*8),A5 ;point to dest color
|
||
|
||
JSR (A0) ;map according to Xfer mode
|
||
MOVE.B ([INVCOLOR,A6],D0.W,6),D5 ;look up in inverse table
|
||
MOVE.B D5,D0
|
||
@2
|
||
LSR.L #8,D3
|
||
LSR.L #8,D4
|
||
ROR.L #8,D5
|
||
|
||
; map 3rd byte
|
||
|
||
TST.B D3
|
||
BEQ.S @4 ;if mask zero, we can skip
|
||
|
||
; if same as previous, we can short-circuit the mapping
|
||
|
||
CMP.B D4,D1 ;source the same?
|
||
BNE.S @3 ;if not, skip
|
||
|
||
CMP.B D5,D7 ;dest the same?
|
||
BNE.S @3 ;if not, skip
|
||
|
||
; it's the same, so use it
|
||
|
||
MOVE.B D0,D5 ;use last result
|
||
BRA.S @4 ;skip the mapping
|
||
|
||
; it's different than the last one, so map it
|
||
|
||
@3
|
||
MOVE.B D4,D1
|
||
|
||
MOVE.L COLORTABLE(A6),A5
|
||
LEA 0(A5,D1.W*8),A4 ;point to source color
|
||
|
||
MOVE.B D5,D7
|
||
LEA 0(A5,D7.W*8),A5 ;point to dest color
|
||
|
||
JSR (A0) ;map according to Xfer mode
|
||
MOVE.B ([INVCOLOR,A6],D0.W,6),D5 ;look up in inverse table
|
||
MOVE.B D5,D0
|
||
@4
|
||
LSR.L #8,D3
|
||
LSR.L #8,D4
|
||
ROR.L #8,D5
|
||
|
||
; map final byte
|
||
|
||
TST.B D3
|
||
BEQ.S @6 ;if mask zero, we can skip
|
||
|
||
; if same as previous, we can short-circuit the mapping
|
||
|
||
CMP.B D4,D1 ;source the same?
|
||
BNE.S @5 ;if not, skip
|
||
|
||
CMP.B D5,D7 ;dest the same?
|
||
BNE.S @5 ;if not, skip
|
||
|
||
; it's the same, so use it
|
||
|
||
MOVE.B D0,D5 ;use last result
|
||
BRA.S @6 ;skip the mapping
|
||
|
||
; it's different than the last one, so map it
|
||
|
||
@5
|
||
MOVE.B D4,D1
|
||
|
||
MOVE.L COLORTABLE(A6),A5
|
||
LEA 0(A5,D1.W*8),A4 ;point to source color
|
||
|
||
MOVE.B D5,D7
|
||
LEA 0(A5,D7.W*8),A5 ;point to dest color
|
||
|
||
JSR (A0) ;map according to Xfer mode
|
||
MOVE.B ([INVCOLOR,A6],D0.W,6),D5 ;look up in inverse table
|
||
MOVE.B D5,D0
|
||
@6
|
||
ROR.L #8,D5
|
||
|
||
; it's all mapped, so store the result
|
||
|
||
MOVE.L D5,(A1)+ ;store the destination
|
||
ArithBotCommon
|
||
MOVEQ #-1,D3 ;set up the mask for the middle
|
||
SUBQ #1,D2
|
||
ArithBot0
|
||
BGT ArithLoop0
|
||
BEQ ArithRight0
|
||
|
||
; all done with this scan line
|
||
|
||
RTS
|
||
|
||
; handle a region of all zeros
|
||
|
||
ArithMask0
|
||
ADDQ #4,A1 ;skip over destination
|
||
BRA.S ArithBotCommon
|
||
|
||
; the pattern is simpler (it fits in a register), so use a separate loop to make things
|
||
;faster. Use a longword cache instead of the single pixel caches.
|
||
|
||
ArithSimplePat
|
||
MOVE.L D1,-(SP) ;save right edge mask
|
||
|
||
MOVEQ #0,D7 ;clear for pixIndexing
|
||
|
||
MOVE.L (A3),D4 ;keep pattern in D4
|
||
MOVE.L COLORTABLE(A6),A3 ;use A3 for color table ptr
|
||
|
||
; set up A0 to point to the proper handler, depending on the width of the inverse table
|
||
|
||
MOVE.L A0,A4 ;remember handler base
|
||
|
||
MOVE.W INVSIZE(A6),D0 ;get shift count (3,4,5)
|
||
SUBQ #3,D0
|
||
ADD.W 0(A0,D0.W*2),A0 ;point to proper handler
|
||
|
||
; init the longword pattern cache by mapping the four pixels in D4
|
||
|
||
MOVEQ #3,D5
|
||
MOVE.L D4,D6 ;init lastDest
|
||
BRA.S CacheILoop0 ;skip cache check 1st time
|
||
|
||
; if the next pixel in D4 is the same as the previous (in D7), take a shortcut
|
||
|
||
CacheInitLoop
|
||
CMP.B D4,D7 ;does it match?
|
||
BNE.S CacheILoop0 ;if not, must do the hard way
|
||
|
||
MOVE.B D0,D1 ;use last result
|
||
|
||
ROL.L #8,D1
|
||
ROL.L #8,D4
|
||
|
||
DBRA D5,CacheInitLoop
|
||
BRA.S CacheIDone
|
||
|
||
; it's not the same, so do it the hard way
|
||
|
||
CacheILoop0
|
||
MOVE.B D4,D7
|
||
LEA 0(A3,D7.W*8),A4 ;point to source color
|
||
MOVE.L A4,A5 ;source and dest are same
|
||
|
||
JSR (A0) ;map next pixel
|
||
MOVE.B ([INVCOLOR,A6],D0.W,6),D1 ;look up in inverse table
|
||
|
||
MOVE.L D1,D0 ;remember last result
|
||
ROL.L #8,D1
|
||
ROL.L #8,D4
|
||
|
||
DBRA D5,CacheInitLoop
|
||
|
||
; OK, here's the start of the main loop; first, see if there's only one long to do
|
||
|
||
CacheIDone
|
||
TST.W D2
|
||
BNE.S ArithLoop1
|
||
|
||
; here's the main loop for simple patterns, where we process a longword at a time
|
||
; We use a longword cache in D6
|
||
|
||
ArithRight1
|
||
AND.L (SP)+,D3
|
||
ArithLoop1
|
||
MOVE.L A2,D5 ;no clipping?
|
||
BEQ.S @0 ;if none, skip
|
||
|
||
AND.L (A2)+,D3 ;get mask in D4
|
||
BEQ ArithMask1
|
||
@0
|
||
MOVE.L (A1),D5 ;get dest longword
|
||
|
||
CMP.L #-1,D3 ;mask all ones?
|
||
BNE.S ArithMapIt1A ;if not, can't use cache
|
||
|
||
CMP.L D5,D6 ;same as last time?
|
||
BNE.S ArithMapIt1 ;if not, skip
|
||
|
||
; the long was the same as last time, so we can skip the mapping. Better make sure
|
||
; the mask was the same, too
|
||
|
||
MOVE.L D1,D5 ;use last result
|
||
BRA ArithStoreIt ;skip the mapping
|
||
|
||
; it was different, so we have to map it the hard way
|
||
|
||
ArithMapIt1
|
||
MOVE.L D5,D6 ;remember for next time
|
||
ArithMapIt1A
|
||
TST.B D3
|
||
BEQ.S @0 ;if mask zero, we can skip
|
||
|
||
MOVE.B D4,D7
|
||
LEA 0(A3,D7.W*8),A4 ;point to source color
|
||
|
||
MOVE.B D5,D7
|
||
LEA 0(A3,D7.W*8),A5 ;point to dest color
|
||
|
||
JSR (A0) ;map according to Xfer mode
|
||
MOVE.B ([INVCOLOR,A6],D0.W,6),D5 ;look up in inverse table
|
||
@0
|
||
ROR.L #8,D3
|
||
ROR.L #8,D4
|
||
ROR.L #8,D5
|
||
|
||
; map 2nd byte
|
||
|
||
TST.B D3
|
||
BEQ.S @2 ;if mask zero, we can skip
|
||
|
||
MOVE.B D4,D7
|
||
LEA 0(A3,D7.W*8),A4 ;point to source color
|
||
|
||
MOVE.B D5,D7
|
||
LEA 0(A3,D7.W*8),A5 ;point to dest color
|
||
|
||
JSR (A0) ;map according to Xfer mode
|
||
MOVE.B ([INVCOLOR,A6],D0.W,6),D5 ;look up in inverse table
|
||
@2
|
||
ROR.L #8,D3
|
||
ROR.L #8,D4
|
||
ROR.L #8,D5
|
||
|
||
; map 3rd byte
|
||
|
||
TST.B D3
|
||
BEQ.S @4 ;if mask zero, we can skip
|
||
|
||
; map it
|
||
MOVE.B D4,D7
|
||
LEA 0(A3,D7.W*8),A4 ;point to source color
|
||
|
||
MOVE.B D5,D7
|
||
LEA 0(A3,D7.W*8),A5 ;point to dest color
|
||
|
||
JSR (A0) ;map according to Xfer mode
|
||
MOVE.B ([INVCOLOR,A6],D0.W,6),D5 ;look up in inverse table
|
||
@4
|
||
ROR.L #8,D3
|
||
ROR.L #8,D4
|
||
ROR.L #8,D5
|
||
|
||
; map final byte
|
||
|
||
TST.B D3
|
||
BEQ.S @6 ;if mask zero, we can skip
|
||
|
||
; it's different than the last one, so map it
|
||
|
||
MOVE.B D4,D7
|
||
LEA 0(A3,D7.W*8),A4 ;point to source color
|
||
|
||
MOVE.B D5,D7
|
||
LEA 0(A3,D7.W*8),A5 ;point to dest color
|
||
|
||
JSR (A0) ;map according to Xfer mode
|
||
MOVE.B ([INVCOLOR,A6],D0.W,6),D5 ;look up in inverse table
|
||
@6
|
||
ROR.L #8,D4
|
||
ROR.L #8,D5
|
||
|
||
; it's all mapped, so store the result
|
||
|
||
ArithStoreIt
|
||
MOVE.L D5,(A1)+ ;store the destination
|
||
ADDQ.L #1,D3 ;was mask all ones?
|
||
BNE.S ArithCom1 ;if not, skip
|
||
|
||
MOVE.L D5,D1 ;remember last result
|
||
ArithCom1
|
||
MOVEQ #-1,D3 ;set up the mask for the middle
|
||
SUBQ #1,D2
|
||
ArithBot1
|
||
BGT ArithLoop1
|
||
BEQ ArithRight1
|
||
|
||
; all done with this scan line
|
||
|
||
RTS
|
||
|
||
; handle a region of all zeros
|
||
|
||
ArithMask1
|
||
ADDQ #4,A1 ;skip over destination
|
||
BRA.S ArithCom1
|
||
|
||
; Here is the handler for the AddOver mode. A4 points to the source RGBColor, while
|
||
; A5 points to the destination. Return the index in D0 (to be looked up in the
|
||
; inverse table). First there is a case table for using a static shift count
|
||
|
||
AddOverHandler
|
||
DC.W AddOver3-AddOverHandler
|
||
DC.W AddOver4-AddOverHandler
|
||
DC.W AddOver5-AddOverHandler
|
||
|
||
AddOver3
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0 ;red
|
||
ADD.W (A5)+,D0
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A4)+,D0 ;green
|
||
ADD.W (A5)+,D0
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A4),D0 ;blue
|
||
ADD.W (A5),D0
|
||
LSL.L #3,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
AddOver4
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0 ;red
|
||
ADD.W (A5)+,D0
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A4)+,D0 ;green
|
||
ADD.W (A5)+,D0
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A4),D0 ;blue
|
||
ADD.W (A5),D0
|
||
LSL.L #4,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
AddOver5
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0 ;red
|
||
ADD.W (A5)+,D0
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A4)+,D0 ;green
|
||
ADD.W (A5)+,D0
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A4),D0 ;blue
|
||
ADD.W (A5),D0
|
||
LSL.L #5,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
;*************************************************************************************
|
||
|
||
|
||
; Here is the receiver for the SubOver arithmetic fill mode, for ovals and roundRects.
|
||
; It uses mainly common code with the other oval handlers
|
||
|
||
;>>>>>>>>>>>
|
||
SubOverFillO
|
||
slSubOver8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BEQ.S @0 ;if not, skip <S433>
|
||
|
||
JMPRom Old38E ; <S433>
|
||
|
||
endif
|
||
|
||
; OK, first do the pattern setup
|
||
|
||
@0 MOVE.L A0,A3 ;set up pattern base
|
||
LEA SubOverHandler,A0 ;use subOver
|
||
BRA DoArithMode
|
||
|
||
; Here is the handler for the SubOver mode. A4 points to the source RGBColor, while
|
||
; A5 points to the destination. Return the index in D0 (to be looked up in the
|
||
; inverse table). First there is a case table for using a static shift count
|
||
|
||
SubOverHandler
|
||
DC.W SubOver3-SubOverHandler
|
||
DC.W SubOver4-SubOverHandler
|
||
DC.W SubOver5-SubOverHandler
|
||
|
||
SubOver3
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
LSL.L #3,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
SubOver4
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
LSL.L #4,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
SubOver5
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
LSL.L #5,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
|
||
;*************************************************************************************
|
||
|
||
; Here is the receiver for the AddPin arithmetic fill mode, for ovals and roundRects.
|
||
; It uses mainly common code with the other oval handlers
|
||
|
||
;>>>>>>>>>>>
|
||
AddPinFillO
|
||
slAddPin8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BEQ.S @0 ;if not, skip <S433>
|
||
|
||
JMPRom Old389 ; <S433>
|
||
|
||
endif
|
||
|
||
; set up handlers and use common code
|
||
|
||
@0 MOVE.L A0,A3 ;set up pattern base
|
||
LEA AddPinHandler,A0 ;use addPin
|
||
BRA DoArithMode
|
||
|
||
|
||
; Here is the handler for the AddPin mode. A4 points to the source RGBColor, while
|
||
; A5 points to the destination. Return the index in D0 (to be looked up in the
|
||
; inverse table). First there is a case table for using a static shift count
|
||
|
||
AddPinHandler
|
||
DC.W AddPin3-AddPinHandler
|
||
DC.W AddPin4-AddPinHandler
|
||
DC.W AddPin5-AddPinHandler
|
||
|
||
AddPin3
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0 ;red
|
||
ADD.W (A5)+,D0
|
||
BCS.S @0
|
||
|
||
CMP.W WEIGHT+BLUE(A6),D0
|
||
BLS.S @1
|
||
@0
|
||
MOVE.W WEIGHT+BLUE(A6),D0
|
||
@1
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A4)+,D0 ;green
|
||
ADD.W (A5)+,D0
|
||
BCS.S @2
|
||
|
||
CMP.W WEIGHT+GREEN(A6),D0
|
||
BLS.S @3
|
||
@2
|
||
MOVE.W WEIGHT+GREEN(A6),D0
|
||
@3
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A4),D0 ;blue
|
||
ADD.W (A5),D0
|
||
BCS.S @4
|
||
|
||
CMP.W WEIGHT+RED(A6),D0
|
||
BLS.S @5
|
||
@4
|
||
MOVE.W WEIGHT+RED(A6),D0
|
||
@5
|
||
LSL.L #3,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
AddPin4
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0 ;red
|
||
ADD.W (A5)+,D0
|
||
BCS.S @0
|
||
|
||
CMP.W WEIGHT+BLUE(A6),D0
|
||
BLS.S @1
|
||
@0
|
||
MOVE.W WEIGHT+BLUE(A6),D0
|
||
@1
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A4)+,D0 ;green
|
||
ADD.W (A5)+,D0
|
||
BCS.S @2
|
||
|
||
CMP.W WEIGHT+GREEN(A6),D0
|
||
BLS.S @3
|
||
@2
|
||
MOVE.W WEIGHT+GREEN(A6),D0
|
||
@3
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A4),D0 ;blue
|
||
ADD.W (A5),D0
|
||
BCS.S @4
|
||
|
||
CMP.W WEIGHT+RED(A6),D0
|
||
BLS.S @5
|
||
@4
|
||
MOVE.W WEIGHT+RED(A6),D0
|
||
@5
|
||
LSL.L #4,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
AddPin5
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0 ;red
|
||
ADD.W (A5)+,D0
|
||
BCS.S @0
|
||
|
||
CMP.W WEIGHT+BLUE(A6),D0
|
||
BLS.S @1
|
||
@0
|
||
MOVE.W WEIGHT+BLUE(A6),D0
|
||
@1
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A4)+,D0 ;green
|
||
ADD.W (A5)+,D0
|
||
BCS.S @2
|
||
|
||
CMP.W WEIGHT+GREEN(A6),D0
|
||
BLS.S @3
|
||
@2
|
||
MOVE.W WEIGHT+GREEN(A6),D0
|
||
@3
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A4),D0 ;blue
|
||
ADD.W (A5),D0
|
||
BCS.S @4
|
||
|
||
CMP.W WEIGHT+RED(A6),D0
|
||
BLS.S @5
|
||
@4
|
||
MOVE.W WEIGHT+RED(A6),D0
|
||
@5
|
||
LSL.L #5,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
;*************************************************************************************
|
||
|
||
; Here is the receiver for the SubPin arithmetic fill mode, for ovals and roundRects.
|
||
; It uses mainly common code with the other oval handlers
|
||
|
||
;>>>>>>>>>>>
|
||
SubPinFillO
|
||
slSubPin8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BEQ.S @0 ;if not, skip <S433>
|
||
|
||
JMPRom Old38B ; <S433>
|
||
|
||
endif
|
||
|
||
; set up handlers and use common code
|
||
|
||
@0 MOVE.L A0,A3 ;set up pattern base
|
||
LEA SubPinHandler,A0 ;use SubPin
|
||
BRA DoArithMode
|
||
|
||
|
||
; Here is the handler for the SubPin mode. A4 points to the source RGBColor, while
|
||
; A5 points to the destination. Return the index in D0 (to be looked up in the
|
||
; inverse table). First there is a case table for using a static shift count
|
||
|
||
SubPinHandler
|
||
DC.W SubPin3-SubPinHandler
|
||
DC.W SubPin4-SubPinHandler
|
||
DC.W SubPin5-SubPinHandler
|
||
|
||
SubPin3
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
BCS.S @0
|
||
|
||
CMP.W WEIGHT+BLUE(A6),D0
|
||
BCC.S @1
|
||
@0
|
||
MOVE.W WEIGHT+BLUE(A6),D0
|
||
@1
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
BCS.S @2
|
||
|
||
CMP.W WEIGHT+GREEN(A6),D0
|
||
BCC.S @3
|
||
@2
|
||
MOVE.W WEIGHT+GREEN(A6),D0
|
||
@3
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
BCS.S @4
|
||
|
||
CMP.W WEIGHT+RED(A6),D0
|
||
BCC.S @5
|
||
@4
|
||
MOVE.W WEIGHT+RED(A6),D0
|
||
@5
|
||
LSL.L #3,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
SubPin4
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
BCS.S @0
|
||
|
||
CMP.W WEIGHT+BLUE(A6),D0
|
||
BCC.S @1
|
||
@0
|
||
MOVE.W WEIGHT+BLUE(A6),D0
|
||
@1
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
BCS.S @2
|
||
|
||
CMP.W WEIGHT+GREEN(A6),D0
|
||
BCC.S @3
|
||
@2
|
||
MOVE.W WEIGHT+GREEN(A6),D0
|
||
@3
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
BCS.S @4
|
||
|
||
CMP.W WEIGHT+RED(A6),D0
|
||
BCC.S @5
|
||
@4
|
||
MOVE.W WEIGHT+RED(A6),D0
|
||
@5
|
||
LSL.L #4,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
SubPin5
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
BCS.S @0
|
||
|
||
CMP.W WEIGHT+BLUE(A6),D0
|
||
BCC.S @1
|
||
@0
|
||
MOVE.W WEIGHT+BLUE(A6),D0
|
||
@1
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
BCS.S @2
|
||
|
||
CMP.W WEIGHT+GREEN(A6),D0
|
||
BCC.S @3
|
||
@2
|
||
MOVE.W WEIGHT+GREEN(A6),D0
|
||
@3
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A5)+,D0 ;red
|
||
SUB.W (A4)+,D0
|
||
BCS.S @4
|
||
|
||
CMP.W WEIGHT+RED(A6),D0
|
||
BCC.S @5
|
||
@4
|
||
MOVE.W WEIGHT+RED(A6),D0
|
||
@5
|
||
LSL.L #5,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
;*************************************************************************************
|
||
|
||
|
||
; Here is the receiver for the AddMax arithmetic fill mode, for ovals and roundRects.
|
||
; It uses mainly common code with the other oval handlers
|
||
|
||
;>>>>>>>>>>>
|
||
AddMaxFillO
|
||
slMax8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BEQ.S @0 ;if not, skip <S433>
|
||
|
||
JMPRom Old38D ; <S433>
|
||
|
||
endif
|
||
|
||
; OK, first do the pattern setup
|
||
|
||
@0 MOVE.L A0,A3 ;set up pattern base
|
||
LEA AddMaxHandler,A0 ;use AddMax
|
||
BRA DoArithMode
|
||
|
||
; Here is the handler for the AddMax mode. A4 points to the source RGBColor, while
|
||
; A5 points to the destination. Return the index in D0 (to be looked up in the
|
||
; inverse table). First there is a case table for using a static shift count
|
||
|
||
AddMaxHandler
|
||
DC.W AddMax3-AddMaxHandler
|
||
DC.W AddMax4-AddMaxHandler
|
||
DC.W AddMax5-AddMaxHandler
|
||
|
||
AddMax3
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BCC.S @0
|
||
MOVE.W (A5),D0
|
||
@0
|
||
ADDQ #2,A5
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BCC.S @1
|
||
MOVE.W (A5),D0
|
||
@1
|
||
ADDQ #2,A5
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BCC.S @2
|
||
MOVE.W (A5),D0
|
||
@2
|
||
ADDQ #2,A5
|
||
LSL.L #3,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
AddMax4
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BCC.S @0
|
||
MOVE.W (A5),D0
|
||
@0
|
||
ADDQ #2,A5
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BCC.S @1
|
||
MOVE.W (A5),D0
|
||
@1
|
||
ADDQ #2,A5
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BCC.S @2
|
||
MOVE.W (A5),D0
|
||
@2
|
||
ADDQ #2,A5
|
||
LSL.L #4,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
AddMax5
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BCC.S @0
|
||
MOVE.W (A5),D0
|
||
@0
|
||
ADDQ #2,A5
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BCC.S @1
|
||
MOVE.W (A5),D0
|
||
@1
|
||
ADDQ #2,A5
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BCC.S @2
|
||
MOVE.W (A5),D0
|
||
@2
|
||
ADDQ #2,A5
|
||
LSL.L #5,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
|
||
;*************************************************************************************
|
||
|
||
|
||
; Here is the receiver for the AddMin arithmetic fill mode, for ovals and roundRects.
|
||
; It uses mainly common code with the other oval handlers
|
||
|
||
|
||
;>>>>>>>>>>>
|
||
AddMinFillO
|
||
slMin8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BEQ.S @0 ;if not, skip <S433>
|
||
|
||
JMPRom Old38F ; <S433>
|
||
|
||
endif
|
||
|
||
; OK, first do the pattern setup
|
||
|
||
@0 MOVE.L A0,A3 ;set up pattern base
|
||
LEA AddMinHandler,A0 ;use addMin
|
||
BRA DoArithMode
|
||
|
||
; Here is the handler for the AddMin mode. A4 points to the source RGBColor, while
|
||
; A5 points to the destination. Return the index in D0 (to be looked up in the
|
||
; inverse table). First there is a case table for using a static shift count
|
||
|
||
AddMinHandler
|
||
DC.W AddMin3-AddMinHandler
|
||
DC.W AddMin4-AddMinHandler
|
||
DC.W AddMin5-AddMinHandler
|
||
|
||
AddMin3
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BLS.S @0
|
||
MOVE.W (A5),D0
|
||
@0
|
||
ADDQ #2,A5
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BLS.S @1
|
||
MOVE.W (A5),D0
|
||
@1
|
||
ADDQ #2,A5
|
||
LSL.L #3,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BLS.S @2
|
||
MOVE.W (A5),D0
|
||
@2
|
||
ADDQ #2,A5
|
||
LSL.L #3,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
AddMin4
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BLS.S @0
|
||
MOVE.W (A5),D0
|
||
@0
|
||
ADDQ #2,A5
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BLS.S @1
|
||
MOVE.W (A5),D0
|
||
@1
|
||
ADDQ #2,A5
|
||
LSL.L #4,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BLS.S @2
|
||
MOVE.W (A5),D0
|
||
@2
|
||
ADDQ #2,A5
|
||
LSL.L #4,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
AddMin5
|
||
MOVEQ #0,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BLS.S @0
|
||
MOVE.W (A5),D0
|
||
@0
|
||
ADDQ #2,A5
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BLS.S @1
|
||
MOVE.W (A5),D0
|
||
@1
|
||
ADDQ #2,A5
|
||
LSL.L #5,D0
|
||
|
||
MOVE.W (A4)+,D0
|
||
CMP.W (A5),D0
|
||
BLS.S @2
|
||
MOVE.W (A5),D0
|
||
@2
|
||
ADDQ #2,A5
|
||
LSL.L #5,D0
|
||
|
||
SWAP D0 ;return inverse table index
|
||
RTS
|
||
|
||
|
||
;*************************************************************************************
|
||
|
||
|
||
; Here is the receiver for the blend arithmetic fill mode, for ovals and roundRects.
|
||
; It uses mainly common code with the other oval handlers
|
||
|
||
|
||
;>>>>>>>>>>>
|
||
BlendFillO
|
||
slAvg8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BEQ.S @0 ;if not, skip <S433>
|
||
|
||
JMPRom Old388 ; <S433>
|
||
|
||
endif
|
||
|
||
; OK, first do the pattern setup
|
||
|
||
@0 MOVE.L A0,A3 ;set up pattern base
|
||
LEA BlendHandler,A0 ;use blend
|
||
BRA DoArithMode
|
||
|
||
; Here is the handler for the Blend mode. A4 points to the source RGBColor, while
|
||
; A5 points to the destination. Return the index in D0 (to be looked up in the
|
||
; inverse table). First there is a case table for using a static shift count
|
||
|
||
BlendHandler
|
||
DC.W Blend3-BlendHandler
|
||
DC.W Blend4-BlendHandler
|
||
DC.W Blend5-BlendHandler
|
||
|
||
Blend3
|
||
MOVEM.L D1-D3,-(SP)
|
||
|
||
MOVEQ #3,D2 ;set up shift count
|
||
BRA.S BlendCommon
|
||
Blend4
|
||
MOVEM.L D1-D3,-(SP)
|
||
MOVEQ #4,D2
|
||
BlendCommon
|
||
MOVEQ #0,D0 ;clear accum reg
|
||
|
||
; do red
|
||
|
||
MOVE.W (A4)+,D1
|
||
MULU WEIGHT+BLUE(A6),D1
|
||
|
||
MOVE.W (A5)+,D3
|
||
MULU NOTWEIGHT+BLUE(A6),D3
|
||
|
||
ADD.L D1,D3
|
||
SWAP D3
|
||
MOVE.W D3,D0
|
||
ASL.L D2,D0
|
||
|
||
; do green
|
||
|
||
MOVE.W (A4)+,D1
|
||
MULU WEIGHT+GREEN(A6),D1
|
||
|
||
MOVE.W (A5)+,D3
|
||
MULU NOTWEIGHT+GREEN(A6),D3
|
||
|
||
ADD.L D1,D3
|
||
SWAP D3
|
||
MOVE.W D3,D0
|
||
ASL.L D2,D0
|
||
|
||
; do blue
|
||
|
||
MOVE.W (A4)+,D1
|
||
MULU WEIGHT+RED(A6),D1
|
||
|
||
MOVE.W (A5)+,D3
|
||
MULU NOTWEIGHT+RED(A6),D3
|
||
|
||
ADD.L D1,D3
|
||
SWAP D3
|
||
MOVE.W D3,D0
|
||
ASL.L D2,D0
|
||
|
||
SWAP D0
|
||
|
||
MOVEM.L (SP)+,D1-D3
|
||
RTS
|
||
Blend5
|
||
MOVEM.L D1-D3,-(SP)
|
||
MOVEQ #5,D2
|
||
BRA.S BlendCommon
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Now we start on the arithmetic fills for clipped rectangles. Use the common
|
||
; scan line handler for ovals/rrects to save code.
|
||
|
||
; First we handle AddOver mode
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld368
|
||
JMPROM Old368 ; <S433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
AddOverFillR
|
||
rAddOver8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld368 ;if not, skip
|
||
tst.l d3 ;right to left? <PB427 BAL>
|
||
bmi.s UseOld368 ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA AddOverHandler,A0 ;set up the handler
|
||
ArithFillCommon
|
||
MOVE.L A0,-(SP) ;remember handler address
|
||
|
||
; set up the registers and invoke the common scan-line handler
|
||
|
||
MOVE.L A4,A2 ;set up region pointer
|
||
ASR #3,D6 ;bit index to byte index
|
||
MOVE.L A5,A1 ;set up destination
|
||
ArithFillLoop
|
||
MOVEQ #-1,D1
|
||
MOVEQ #-1,D3 ;edge masks all ones (edges in region)
|
||
|
||
MOVE.W BUFSIZE(A6),D2 ;set up the count
|
||
ADDQ #4,D2 ;make one based <PB427 BAL>
|
||
LSR.W #2,D2
|
||
SUBQ #1,D2 ;make zero based <PB427 BAL>
|
||
|
||
MOVE.L (SP),A0 ;get handler address
|
||
|
||
; call the appropriate handle, depending on whether the pattern is simple or complex
|
||
|
||
CMP.W #8,PATROW(A6) ;is pattern real complex?
|
||
BGT.S @0 ;if so, go handle it
|
||
|
||
TST.B endSwitch(A6) ;test pattern mode
|
||
BMI.S @0 ;treat bitmap as complex
|
||
|
||
MOVE.L 0(A3,D6),D0 ;get left pattern
|
||
EOR #4,D6
|
||
CMP.L 0(A3,D6),D0 ;left same as right?
|
||
BEQ.S @1 ;if so, it's simple
|
||
|
||
EOR #4,D6 ;restore D6
|
||
@0
|
||
BSR ArithComplex1 ;invoke scan-line handler for complex pats
|
||
BRA.S @2
|
||
@1
|
||
EOR #4,D6
|
||
BSR ArithSimplePat
|
||
|
||
; bump pointers to next time, and loop until done
|
||
|
||
@2
|
||
MOVE.L patOffset(A6),D6 ;get pattern index
|
||
ASR.L #3,D6 ;bit index to byte index
|
||
|
||
moveq #0,d0 ;patPos should be a long
|
||
MOVE.W patPos(A6),D0
|
||
|
||
TST.B endSwitch(A6) ;test pattern mode
|
||
BEQ.S AFPat1 ;if zero, handle
|
||
BMI.S AFBitMap1 ;if <0, go handle bitmap
|
||
|
||
; handle bumping the pattern pointers
|
||
|
||
MOVE.L SRCADDR(A6),A3 ;set up pattern pointer
|
||
SUB.l D0,A3
|
||
ADD.W PATROW(A6),D0
|
||
AND.W PATVMASK(A6),D0
|
||
MOVE.W D0,patPos(A6)
|
||
ADD.l D0,A3
|
||
|
||
BRA.S AFSetPatPtr
|
||
|
||
; handle second type of pattern
|
||
|
||
AFPat1
|
||
ADDQ #1,D0
|
||
AND #15,D0
|
||
LEA ([EXPAT,A6],D0.W*4),A3
|
||
|
||
MOVE.W D0,patPos(A6)
|
||
AFSetPatPtr
|
||
MOVE.L A3,SRCADDR(A6)
|
||
|
||
; bump to the next scan line
|
||
|
||
ArithFillNextLine
|
||
MOVE.L DSTROW(A6),D0
|
||
ADD.L D0,DSTADDR(A6)
|
||
|
||
MOVE.W VERT(A6),D0
|
||
ADD.W VBUMP(A6),D0
|
||
MOVE.W D0,VERT(A6)
|
||
|
||
CMP.W LASTV(A6),D0
|
||
BNE.S @0
|
||
|
||
; all done, so strip stack and return
|
||
|
||
MOVE.L SAVESTK2(A6),A7
|
||
RTS
|
||
|
||
; set up registers and loop for the next line
|
||
|
||
@0
|
||
MOVE.L SEEKMASK(A6),A0
|
||
JSR (A0) ;seek new region
|
||
|
||
MOVE.L SRCADDR(A6),A3 ;set up pattern pointer
|
||
MOVE.L DSTADDR(A6),A1 ;set up dest ptr
|
||
MOVE.L RGNADDR(A6),A2 ;set up region ptr
|
||
|
||
BRA ArithFillLoop
|
||
|
||
; handle bumping the source if it's a bitmap
|
||
|
||
AFBitMap1
|
||
MOVE.L SRCROW(A6),D0
|
||
ADD.L D0,SRCADDR(A6)
|
||
|
||
BRA.S ArithFillNextLine
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle SubOver clipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld36C
|
||
JMPRom Old36C ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
SubOverFillR
|
||
rSubOver8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld36C ;if not, skip
|
||
tst.l d3 ;right to left? <PB427 BAL>
|
||
bmi.s UseOld36c ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA SubOverHandler,A0 ;set up the handler
|
||
BRA ArithFillCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle AddPin clipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld367
|
||
JMPRom Old367 ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
AddPinFillR
|
||
rAddPin8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld367 ;if not, skip
|
||
tst.l d3 ;right to left? <PB427 BAL>
|
||
bmi.s UseOld367 ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA AddPinHandler,A0 ;set up the handler
|
||
BRA ArithFillCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle SubPin clipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld369
|
||
JMPRom Old369 ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
SubPinFillR
|
||
rSubPin8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld369 ;if not, skip
|
||
tst.l d3 ;right to left? <PB427 BAL>
|
||
bmi.s UseOld369 ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA SubPinHandler,A0 ;set up the handler
|
||
BRA ArithFillCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle AddMax clipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld36B
|
||
JMPRom Old36B ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
AddMaxFillR
|
||
rMax8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld36B ;if not, skip
|
||
tst.l d3 ;right to left? <PB427 BAL>
|
||
bmi.s UseOld36B ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA AddMaxHandler,A0 ;set up the handler
|
||
BRA ArithFillCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle AddMin clipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld36D
|
||
JMPRom Old36D ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
AddMinFillR
|
||
rMin8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld36D ;if not, skip
|
||
tst.l d3 ;right to left? <PB427 BAL>
|
||
bmi.s UseOld36D ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA AddMinHandler,A0 ;set up the handler
|
||
BRA ArithFillCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle Blend clipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld366
|
||
JMPRom Old366 ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
BlendFillR
|
||
rAvg8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld366 ;if not, skip
|
||
tst.l d3 ;right to left? <PB427 BAL>
|
||
bmi.s UseOld366 ;if s0, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA BlendHandler,A0 ;set up the handler
|
||
BRA ArithFillCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Now we start on the arithmetic fills for unclipped rectangles. Use the common
|
||
; scan line handler for ovals/rrects to save code.
|
||
|
||
; First we handle AddOver mode, unclipped
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld352
|
||
JMPRom Old352 ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
AddOverUnClip
|
||
bAddOver8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld352 ;if not, skip
|
||
tst.l (sp) ;right to left? <PB427 BAL>
|
||
bmi.s UseOld352 ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA AddOverHandler,A0 ;set up the handler
|
||
ArithUCCommon
|
||
MOVE.L A0,-(SP) ;remember handler address
|
||
|
||
; set up the registers and invoke the common scan-line handler
|
||
|
||
SUB.L A2,A2 ;no region pointer
|
||
ASR #3,D6 ;bit index to byte index
|
||
MOVE.L A4,A3 ;set up pattern pointer
|
||
MOVE.L A5,A1 ;set up destination
|
||
ArithUCLoop
|
||
MOVE.L FIRSTMASK(A6),D3 ;set up left edge
|
||
MOVE.L LASTMASK(A6),D1 ;set up right edge
|
||
|
||
; compute the count from the three pieces: left, mid and right
|
||
|
||
MOVE.W LONGCNT(A6),D2 ;get left count
|
||
BPL.S @3 ;if positive, we're cool
|
||
|
||
MOVEQ #0,D2 ;only one word
|
||
BRA.S @4
|
||
@3
|
||
ADD.W MIDCOUNT(A6),D2 ;add in the middle
|
||
ADD.W PIXINLONG(A6),D2 ;add in the right
|
||
ADDQ.W #2,D2 ;add for count bias
|
||
LSR.W #2,D2 ;bytes -> longs
|
||
@4
|
||
MOVE.L (SP),A0 ;get handler address
|
||
|
||
; call the appropriate handle, depending on whether the pattern is simple or complex
|
||
|
||
CMP.W #8,PATROW(A6) ;is pattern real complex?
|
||
BGT.S @0 ;if so, go handle it
|
||
|
||
TST.B ENDSWITCH(A6) ;test pattern mode
|
||
BMI.S @0 ;if bitmap, it's complex
|
||
|
||
MOVE.L 0(A3,D6),D0 ;get left pattern
|
||
EOR #4,D6
|
||
CMP.L 0(A3,D6),D0 ;left same as right?
|
||
BEQ.S @1 ;if so, it's simple
|
||
|
||
EOR #4,D6 ;restore D6
|
||
@0
|
||
MOVE.L A1,-(SP)
|
||
BSR ArithComplex1 ;invoke scan-line handler for complex pats
|
||
MOVE.L (SP)+,A1
|
||
|
||
BRA.S @2
|
||
@1
|
||
EOR #4,D6
|
||
|
||
MOVEM.L A1/A3,-(SP)
|
||
BSR ArithSimplePat
|
||
MOVEM.L (SP)+,A1/A3
|
||
|
||
; bump pointers to next time, and loop until done
|
||
|
||
@2
|
||
TST.B ENDSWITCH(A6) ;test pattern mode
|
||
BEQ.S AFUCPat1 ;if zero, handle
|
||
BMI.S AFUCBitMap1 ;if <0, go handle bitmap
|
||
|
||
; handle bumping the pattern pointers
|
||
|
||
moveq #0,d0 ;patPos should be a long
|
||
MOVE.W PATPOS(A6),D0
|
||
SUB.l D0,A3
|
||
ADD.W PATROW(A6),D0
|
||
AND.W PATVMASK(A6),D0
|
||
MOVE.W D0,PATPOS(A6)
|
||
ADD.l D0,A3
|
||
|
||
BRA.S ArithUCNextLine
|
||
|
||
; handle second type of pattern
|
||
|
||
AFUCPat1
|
||
MOVE.W PATPOS(A6),D0
|
||
ADDQ #1,D0
|
||
AND #15,D0
|
||
LEA ([EXPAT,A6],D0.W*4),A3
|
||
|
||
MOVE.W D0,PATPOS(A6)
|
||
|
||
; bump to the next scan line
|
||
|
||
ArithUCNextLine
|
||
MOVE.L PATOFFSET(A6),D6
|
||
ASR.L #3,D6 ;bits to bytes
|
||
ArithUCNL2
|
||
ADD.W DSTROW+2(A6),A1 ;bump destination
|
||
|
||
SUBQ.W #1,height(A6)
|
||
BNE ArithUCLoop
|
||
|
||
ADDQ #8,SP
|
||
RTS
|
||
|
||
; handle unclipped blits source setup
|
||
|
||
AFUCBitMap1
|
||
ADD.W D6,A3
|
||
ADD.W SRCBUMP(A6),A3 ;bump to next line <PB448 DBG>
|
||
MOVEQ #0,D6
|
||
BRA.S ArithUCNL2
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle SubOver unclipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld356
|
||
JMPRom Old356 ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
SubOverUnclip
|
||
bSubOver8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld356 ;if not, skip
|
||
tst.l (sp) ;right to left? <PB427 BAL>
|
||
bmi.s UseOld356 ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA SubOverHandler,A0 ;set up the handler
|
||
BRA ArithUCCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle AddPin unclipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld351
|
||
JMPRom Old351 ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
AddPinUnclip
|
||
bAddPin8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld351 ;if not, skip
|
||
tst.l (sp) ;right to left? <PB427 BAL>
|
||
bmi.s UseOld351 ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA AddPinHandler,A0 ;set up the handler
|
||
BRA ArithUCCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle SubPin unclipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld353
|
||
JMPRom Old353 ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
SubPinUnclip
|
||
bSubPin8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld353 ;if not, skip
|
||
tst.l (sp) ;right to left? <PB427 BAL>
|
||
bmi.s UseOld353 ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA SubPinHandler,A0 ;set up the handler
|
||
BRA ArithUCCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle AddMax unclipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld355
|
||
JMPRom Old355 ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
AddMaxUnclip
|
||
bMax8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld355 ;if not, skip
|
||
tst.l (sp) ;right to left? <PB427 BAL>
|
||
bmi.s UseOld355 ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA AddMaxHandler,A0 ;set up the handler
|
||
BRA ArithUCCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle AddMin unclipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld357
|
||
JMPRom Old357 ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
AddMinUnclip
|
||
bMin8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld357 ;if not, skip
|
||
tst.l (sp) ;right to left? <PB427 BAL>
|
||
bmi.s UseOld357 ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA AddMinHandler,A0 ;set up the handler
|
||
BRA ArithUCCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Handle Blend unclipped rectangle fill
|
||
|
||
if patchciRom THEN
|
||
|
||
UseOld350
|
||
JMPRom Old350 ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
BlendUnclip
|
||
bAvg8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld350 ;if not, skip
|
||
tst.l (sp) ;right to left? <PB427 BAL>
|
||
bmi.s UseOld350 ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
LEA BlendHandler,A0 ;set up the handler
|
||
BRA ArithUCCommon ;use comon code
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Here's where we handle transparent mode. The basic strategy is to create a mask from
|
||
; the pattern (for one and two long patterns) so we don't have to keep examining it
|
||
; pixel by pixel. (If the mask is all ones, fall into the standard fills).
|
||
|
||
; the first one is for transparent mode for ovals and roundRects
|
||
|
||
;>>>>>>>>>>>
|
||
TransFillO
|
||
slTransparent8
|
||
|
||
if patchciRom THEN
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BEQ.S @0 ;if not, skip
|
||
|
||
JMPRom Old38C ;
|
||
|
||
endif
|
||
|
||
@0 CMP.W #4,PATROW(A6) ;is it a simple pattern?
|
||
BGT.S TransComplexPat ;if not, inspect it closer
|
||
|
||
; it's a simple pattern, so make a mask according to the see-through color
|
||
|
||
TransSimple1
|
||
MOVE.L (A0),D6 ;fetch the pattern
|
||
MOVEQ #-1,D4 ;mask is initially all ones
|
||
MOVE.B TRANSCOLOR(A6),D5 ;get color to compare with
|
||
|
||
CMP.B D6,D5
|
||
BNE.S @0
|
||
|
||
CLR.B D4
|
||
@0
|
||
ROR.L #8,D4
|
||
ROR.L #8,D6
|
||
|
||
CMP.B D6,D5
|
||
BNE.S @1
|
||
|
||
CLR.B D4
|
||
@1
|
||
ROR.L #8,D4
|
||
ROR.L #8,D6
|
||
|
||
CMP.B D6,D5
|
||
BNE.S @2
|
||
|
||
CLR.B D4
|
||
@2
|
||
ROR.L #8,D4
|
||
ROR.L #8,D6
|
||
|
||
CMP.B D6,D5
|
||
BNE.S @3
|
||
|
||
CLR.B D4
|
||
@3
|
||
ROR.L #8,D4
|
||
ROR.L #8,D6
|
||
|
||
; if the mask is all ones, plot it quickly using the standard fill routine
|
||
|
||
MOVE.L A2,D0 ;if no clipping
|
||
BEQ.S @4 ;skip optimization (things not set up)
|
||
|
||
CMP.L #-1,D4 ;is mask all ones?
|
||
bne.s @4 ;no
|
||
jmp ([$E00+$380*4]) ;yes, use standard pattern fill
|
||
|
||
; OK, mask is in D4, A2 points to the region, pattern in D6 and A1 is the destination.
|
||
; use the straightforward loop, since region optimizations aren't worth it since we
|
||
; always have to read the destination.
|
||
|
||
@4
|
||
TST.W D2 ;only one long?
|
||
BNE.S TransSimpleLoop ;if not, skip
|
||
TSL0
|
||
AND.L D1,D3 ;combine edges for last one
|
||
TransSimpleLoop
|
||
MOVE.L A2,D0
|
||
BEQ.S @0
|
||
|
||
AND.L (A2)+,D3 ;pick up the region mask
|
||
@0
|
||
AND.L D4,D3 ;punch out transparent part
|
||
|
||
MOVE.L D6,D0
|
||
AND.L D3,D0
|
||
|
||
NOT.L D3
|
||
AND.L (A1),D3
|
||
OR.L D0,D3
|
||
MOVE.L D3,(A1)+
|
||
|
||
MOVEQ #-1,D3
|
||
|
||
SUBQ.W #1,D2 ;decrement counter
|
||
BGT.S TransSimpleLoop ;loop until done
|
||
BEQ.S TSL0
|
||
|
||
RTS
|
||
|
||
; see if the complex pattern is really a simple one, if so, we can speed things up
|
||
|
||
TransComplexPat
|
||
MOVE.W PATHPOS(A6),D6 ; <SMC 16Aug90>
|
||
ASR.W #3,D6 ;turn bits back into bytes <SMC 16Aug90>
|
||
ADD.W D0,D6 ; <SMC 16Aug90>
|
||
|
||
MOVE.W PATHMASK(A6),D4 ;get pattern mask
|
||
ASR #3,D4 ;turn bit index to byte index
|
||
AND.W D4,D6 ;mask it
|
||
|
||
MOVE.L EXPAT(A6),A3
|
||
ADD.l PATVPOS(A6),A3 ;compute pattern address
|
||
|
||
CMP.W #8,PATROW(A6) ;is it a double pattern?
|
||
BGT.S TransComplex1 ;if not, must be complex
|
||
|
||
MOVE.L 0(A3,D6),D4 ;get source longword
|
||
EOR #4,D6
|
||
CMP.L 0(A3,D6),D4 ;is it really simple?
|
||
BEQ TransSimple1 ;if so, go handle
|
||
|
||
EOR #4,D6 ;restore D6
|
||
TransComplex1
|
||
MOVE.L D7,-(SP)
|
||
MOVE.L TRANSCOLOR(A6),D5 ;get color to compare with
|
||
|
||
TST.W D2
|
||
BNE.S TCPatLoop
|
||
|
||
; it's complex, so plot it ourselves. First fetch the pattern.
|
||
|
||
TCPLoop0
|
||
AND.L D1,D3
|
||
TCPatLoop
|
||
MOVE.W PATHMASK(A6),D4 ;get pattern mask
|
||
ASR #3,D4 ;turn bit index to byte index
|
||
AND.W D4,D6 ;mask it
|
||
|
||
MOVE.L 0(A3,D6),D7 ;get source longword
|
||
ADDQ #4,D6
|
||
|
||
CMP.L D7,D5 ;all transparent?
|
||
BEQ.S TCPSkip
|
||
|
||
; now create a mask for it
|
||
|
||
MOVEQ #-1,D4 ;mask is initially all ones
|
||
|
||
CMP.B D7,D5
|
||
BNE.S @0
|
||
|
||
CLR.B D4
|
||
@0
|
||
ROR.L #8,D4
|
||
ROR.L #8,D7
|
||
|
||
CMP.B D7,D5
|
||
BNE.S @1
|
||
|
||
CLR.B D4
|
||
@1
|
||
ROR.L #8,D4
|
||
ROR.L #8,D7
|
||
|
||
CMP.B D7,D5
|
||
BNE.S @2
|
||
|
||
CLR.B D4
|
||
@2
|
||
ROR.L #8,D4
|
||
ROR.L #8,D7
|
||
|
||
CMP.B D7,D5
|
||
BNE.S @3
|
||
|
||
CLR.B D4
|
||
@3
|
||
ROR.L #8,D4
|
||
ROR.L #8,D7
|
||
|
||
; now we can finally plot it
|
||
|
||
MOVE.L A2,D0
|
||
BEQ.S @8
|
||
|
||
AND.L (A2)+,D3 ;pick up the region mask
|
||
@8
|
||
AND.L D4,D3 ;punch out transparent part
|
||
|
||
MOVE.L D7,D0
|
||
AND.L D3,D0
|
||
|
||
NOT.L D3
|
||
AND.L (A1),D3
|
||
OR.L D0,D3
|
||
MOVE.L D3,(A1)+
|
||
|
||
; loop until done
|
||
|
||
NextTCP
|
||
MOVEQ #-1,D3
|
||
|
||
SUBQ.W #1,D2 ;decrement counter
|
||
BGT.S TCPatLoop ;loop until done
|
||
BEQ.S TCPLoop0
|
||
|
||
MOVE.L (SP)+,D7
|
||
RTS
|
||
|
||
TCPSkip
|
||
MOVE.L A2,D0
|
||
BEQ.S @0
|
||
|
||
ADDQ.L #4,A2
|
||
@0
|
||
ADDQ #4,A1
|
||
|
||
BRA.S NextTCP
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
; Here's where we handle the clipped transparent mode rectangle fill
|
||
|
||
; if patchciRom THEN ;<SMC 08OCT90> <5>
|
||
if 0 THEN ;<SMC 08OCT90> <5>
|
||
|
||
UseOld36A
|
||
JMPRom Old36A ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
TransFillR
|
||
rTransparent8
|
||
|
||
; if patchciRom THEN ;<SMC 08OCT90> <5>
|
||
if 0 THEN ;<SMC 08OCT90> <5>
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld36A ;if not, skip
|
||
tst.l d3 ;right to left? <PB427 BAL>
|
||
bmi.s UseOld36A ;if s0, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
; set up the registers and invoke the common scan-line handler
|
||
|
||
MOVE.L A4,A2 ;set up region pointer
|
||
ASR #3,D6 ;bit index to byte index
|
||
MOVE.L A5,A1 ;set up destination
|
||
TransFillLoop
|
||
MOVEQ #-1,D1
|
||
MOVEQ #-1,D3 ;edge masks all ones (edges in region)
|
||
|
||
MOVE.W BUFSIZE(A6),D2 ;set up the count
|
||
ADDQ #4,D2 ;make one based <PB427 BAL>
|
||
LSR.W #2,D2
|
||
SUBQ #1,D2 ;make zero based <PB427 BAL>
|
||
|
||
; call the appropriate handle, depending on whether the pattern is simple or complex
|
||
|
||
CMP.W #8,PATROW(A6) ;is pattern real complex?
|
||
BGT.S @0 ;if so, go handle it
|
||
|
||
TST.B endSwitch(A6) ;test pattern mode
|
||
BMI.S @0 ;treat bitmap as complex
|
||
|
||
MOVE.L 0(A3,D6),D0 ;get left pattern
|
||
EOR #4,D6
|
||
CMP.L 0(A3,D6),D0 ;left same as right?
|
||
BEQ.S @1 ;if so, it's simple
|
||
|
||
EOR #4,D6 ;restore D6
|
||
@0
|
||
BSR TransComplex1 ;invoke scan-line handler for complex pats
|
||
BRA.S @2
|
||
@1
|
||
EOR #4,D6
|
||
MOVE.L A3,A0
|
||
BSR TransSimple1
|
||
|
||
; bump pointers to next time, and loop until done
|
||
|
||
@2
|
||
moveq #0,d0 ;patPos should be a long
|
||
MOVE.W patPos(A6),D0
|
||
|
||
TST.B endSwitch(A6) ;test pattern mode
|
||
BEQ.S TransPat1 ;if zero, handle
|
||
BMI.S TransBitMap1 ;if <0, go handle bitmap
|
||
|
||
MOVE.L patOffset(A6),D6 ;get pattern index
|
||
ASR.L #3,D6 ;bit index to byte index
|
||
|
||
; handle bumping the pattern pointers
|
||
|
||
MOVE.L SRCADDR(A6),A3 ;set up pattern pointer
|
||
SUB.l D0,A3
|
||
ADD.W PATROW(A6),D0
|
||
AND.W PATVMASK(A6),D0
|
||
MOVE.W D0,patPos(A6)
|
||
ADD.l D0,A3
|
||
|
||
BRA.S TransSetPatPtr
|
||
|
||
; handle second type of pattern
|
||
|
||
TransPat1
|
||
MOVE.L patOffset(A6),D6 ;get pattern index
|
||
ASR.L #3,D6 ;bit index to byte index
|
||
|
||
ADDQ #1,D0
|
||
AND #15,D0
|
||
LEA ([EXPAT,A6],D0.W*4),A3
|
||
|
||
MOVE.W D0,patPos(A6)
|
||
TransSetPatPtr
|
||
MOVE.L A3,SRCADDR(A6)
|
||
|
||
; bump to the next scan line
|
||
|
||
TransFillNextLine
|
||
MOVE.L DSTROW(A6),D0
|
||
ADD.L D0,DSTADDR(A6)
|
||
|
||
MOVE.W VERT(A6),D0
|
||
ADD.W VBUMP(A6),D0
|
||
MOVE.W D0,VERT(A6)
|
||
|
||
CMP.W LASTV(A6),D0
|
||
BNE.S @0
|
||
|
||
; all done, so strip stack and return
|
||
|
||
MOVE.L SAVESTK2(A6),A7
|
||
RTS
|
||
|
||
; set up registers and loop for the next line
|
||
|
||
@0
|
||
MOVE.L SEEKMASK(A6),A0
|
||
JSR (A0) ;seek new region
|
||
|
||
MOVE.L SRCADDR(A6),A3 ;set up pattern pointer
|
||
MOVE.L DSTADDR(A6),A1 ;set up dest ptr
|
||
MOVE.L RGNADDR(A6),A2 ;set up region ptr
|
||
|
||
BRA TransFillLoop
|
||
|
||
; handle bumping the source if it's a bitmap
|
||
|
||
TransBitMap1
|
||
MOVE.L SRCROW(A6),D0
|
||
;<PB427 BAL>
|
||
ADD.L D0,SRCADDR(A6)
|
||
|
||
MOVE.l patOffset(A6),D6
|
||
asr.l #3,d6 ;make byte offset <PB427 BAL>
|
||
BRA.S TransFillNextLine
|
||
|
||
|
||
;******************************************************************************************
|
||
|
||
|
||
; if patchciRom THEN ;<SMC 08OCT90> <5>
|
||
if 0 THEN ;<SMC 08OCT90> <5>
|
||
|
||
UseOld354
|
||
JMPRom Old354 ; <PB433>
|
||
|
||
endif
|
||
|
||
;>>>>>>>>>>>
|
||
TransUnClip
|
||
bTransparent8
|
||
|
||
; if patchciRom THEN ;<SMC 08OCT90> <5>
|
||
if 0 THEN ;<SMC 08OCT90> <5>
|
||
|
||
CMP.W #8,DSTPIX+PIXELSIZE(A6) ;is it 8 bit mode?
|
||
BNE.S UseOld354 ;if not, skip
|
||
tst.l (sp) ;right to left? <PB427 BAL>
|
||
bmi.s UseOld354 ;if so, skip <PB427 BAL>
|
||
|
||
endif
|
||
|
||
; set up the registers and invoke the common scan-line handler
|
||
|
||
SUB.L A2,A2 ;no region pointer
|
||
ASR #3,D6 ;bit index to byte index
|
||
MOVE.L A4,A3 ;set up pattern pointer
|
||
MOVE.L A5,A1 ;set up destination
|
||
TransUCLoop
|
||
MOVE.L FIRSTMASK(A6),D3 ;set up left edge
|
||
MOVE.L LASTMASK(A6),D1 ;set up right edge
|
||
|
||
; compute the count from the three pieces: left, mid and right
|
||
|
||
MOVE.W LONGCNT(A6),D2 ;get left count
|
||
BPL.S @3 ;if positive, we're cool
|
||
|
||
MOVEQ #0,D2 ;only one word
|
||
BRA.S @4
|
||
@3
|
||
ADD.W MIDCOUNT(A6),D2 ;add in the middle
|
||
ADD.W PIXINLONG(A6),D2 ;add in the right
|
||
ADDQ.W #2,D2 ;add for count bias
|
||
LSR.W #2,D2 ;bytes -> longs
|
||
|
||
; call the appropriate handle, depending on whether the pattern is simple or complex
|
||
|
||
@4
|
||
CMP.W #8,PATROW(A6) ;is pattern real complex?
|
||
BGT.S @0 ;if so, go handle it
|
||
|
||
TST.B ENDSWITCH(A6) ;test pattern mode
|
||
BMI.S @0 ;if bitmap, handle as complex
|
||
|
||
MOVE.L 0(A3,D6),D0 ;get left pattern
|
||
EOR #4,D6
|
||
CMP.L 0(A3,D6),D0 ;left same as right?
|
||
BEQ.S @1 ;if so, it's simple
|
||
|
||
EOR #4,D6 ;restore D6
|
||
@0
|
||
MOVE.L A1,-(SP)
|
||
BSR TransComplex1 ;invoke scan-line handler for complex pats
|
||
MOVE.L (SP)+,A1
|
||
|
||
BRA.S @2
|
||
@1
|
||
EOR #4,D6
|
||
|
||
MOVEM.L A1/A3,-(SP)
|
||
MOVE.L A3,A0
|
||
BSR TransSimple1
|
||
MOVEM.L (SP)+,A1/A3
|
||
|
||
; bump pointers to next time, and loop until done
|
||
|
||
@2
|
||
TST.B ENDSWITCH(A6) ;test pattern mode
|
||
BEQ.S TransUCPat1 ;if zero, handle
|
||
BMI.S TransUCBitMap1 ;if <0, go handle bitmap
|
||
|
||
; handle bumping the pattern pointers
|
||
|
||
moveq #0,d0 ;patPos should be a long
|
||
MOVE.W PATPOS(A6),D0
|
||
SUB.l D0,A3
|
||
ADD.W PATROW(A6),D0
|
||
AND.W PATVMASK(A6),D0
|
||
MOVE.W D0,PATPOS(A6)
|
||
ADD.l D0,A3
|
||
|
||
BRA.S TransUCNextLine
|
||
|
||
; handle second type of pattern
|
||
|
||
TransUCPat1
|
||
MOVE.W PATPOS(A6),D0
|
||
ADDQ #1,D0
|
||
AND #15,D0
|
||
LEA ([EXPAT,A6],D0.W*4),A3
|
||
|
||
MOVE.W D0,PATPOS(A6)
|
||
|
||
; bump to the next scan line
|
||
|
||
TransUCNextLine
|
||
MOVE.L PATOFFSET(A6),D6
|
||
ASR.L #3,D6 ;bits to bytes
|
||
TransUCNL2
|
||
ADD.W DSTROW+2(A6),A1 ;bump destination
|
||
|
||
SUBQ.W #1,height(A6)
|
||
BNE TransUCLoop
|
||
|
||
ADDQ #4,SP
|
||
RTS
|
||
|
||
; handle unclipped blits source setup
|
||
|
||
TransUCBitMap1
|
||
ADD.W D6,A3
|
||
ADD.W SRCBUMP(A6),A3 ;bump to next line <PB448 DBG>
|
||
MOVEQ #0,D6
|
||
BRA.S TransUCNL2
|
||
|
||
;******************************************************************************************
|
||
|
||
; End of arithmetic transfer modes!
|
||
|
||
;******************************************************************************************
|
||
|
||
ENDPROC
|