mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-29 05:49:19 +00:00
176 lines
4.1 KiB
Plaintext
176 lines
4.1 KiB
Plaintext
;
|
|
; File: ZoomRect.a
|
|
;
|
|
; Contains: A convenient window-zooming routine
|
|
;
|
|
; Written by: Phil Goldman
|
|
;
|
|
; Copyright: © 1986-1991 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <0> x/xx/87 PYG New Today.
|
|
;
|
|
;--------------------------------------------------------------------
|
|
|
|
;=====================================FUtil68K=====================================
|
|
;
|
|
; PROCEDURE ZoomRect(VAR smallRect,bigRect: Rect; zoomUp: BOOLEAN);
|
|
;
|
|
; Frees the passed dialog record (or 0 if none).
|
|
;
|
|
;=====================================FUtil68K=====================================
|
|
|
|
LOAD 'ProcessMgrIncludes.D'
|
|
|
|
zoomSteps EQU 12
|
|
tickDelay EQU 1 ; 1*1/60 sec between rects
|
|
|
|
; takes two rects in a2/a3 and blends into rect in a4
|
|
; fract in d7, factor in d5.
|
|
|
|
ZoomRect PROC EXPORT
|
|
ZoomRectRegs REG d2-d7/a2-a4
|
|
|
|
link a6,#-32 ; 4 rectangles
|
|
movem.l ZoomRectRegs,-(sp) ; save registers
|
|
|
|
lea -32(a6),a0
|
|
moveq #7,d0
|
|
nilRects
|
|
clr.l (a0)+ ; zero out all the rects
|
|
dbra d0,nilRects
|
|
|
|
subq.l #4,sp
|
|
move.l sp,-(sp)
|
|
_GetPort
|
|
|
|
move.l wmgrPort,-(sp)
|
|
_SetPort
|
|
|
|
move.l GrayRgn,a0 ; get rgn hdl of gray rgn
|
|
move.l (a0),a0 ; hdl -> ptr
|
|
pea rgnBBox(a0) ; push the rect
|
|
_ClipRect
|
|
|
|
move.l (a5),a0
|
|
pea gray(a0)
|
|
_PenPat
|
|
move.w #notpatXor,-(sp)
|
|
_PenMode
|
|
|
|
; see if going up or down (point a0 to starting rect)
|
|
|
|
tst.b 8(a6) ; up or down
|
|
beq.s zoomDown
|
|
zoomUp
|
|
subq.l #4,sp
|
|
move.l #$00050007,-(sp) ; 7/5
|
|
_FixRatio
|
|
move.l (sp),d5 ; factor in d5 (leave on stack)
|
|
|
|
move.l #$271000B0,-(sp) ; 5/7 ^zoomSteps = 0.017638
|
|
_FixRatio
|
|
move.l (sp)+,d7 ; fract in d7
|
|
BRA.S zoomStart
|
|
|
|
zoomDown
|
|
subq.l #4,sp
|
|
move.l #$00070005,-(sp) ; 5/7
|
|
_FixRatio
|
|
move.l (sp)+,d5 ; factor in d5
|
|
|
|
moveq #1,d7 ; fract is 1
|
|
swap d7 ; fract in d7
|
|
|
|
zoomStart
|
|
moveq #zoomSteps,d4 ; counter
|
|
subq.l #4,sp ; make room for result
|
|
_TickCount
|
|
move.l (sp)+,d6 ; sync with ticks
|
|
zoomloop
|
|
lea -8(a6),a4 ; start w/rect 4
|
|
move.l 10(a6),a3 ; point to big rect
|
|
move.l 14(a6),a2 ; point to small rect
|
|
|
|
bsr.s Blender ; 4 halves of the rect
|
|
bsr.s Blender
|
|
bsr.s Blender
|
|
bsr.s Blender
|
|
|
|
pea -8(a6) ; frame newest
|
|
_FrameRect
|
|
|
|
ticksSync
|
|
cmp.l Ticks,d6 ; less than time we want?
|
|
bhs.s ticksSync ; unsigned! wait
|
|
|
|
; move.l d0,d6 ; save current time
|
|
addq.l #tickDelay,d6 ; wait until this time is by
|
|
|
|
tst.l -32(a6) ; oldest topLeft nil?
|
|
bne.s @frameIt ; br if not
|
|
tst.l -28(a6) ; botRight nil?
|
|
beq.s @skipFrame ; br if so, skip empty rect
|
|
|
|
@frameIt
|
|
pea -32(a6) ; remove oldest
|
|
_FrameRect
|
|
|
|
@skipFrame
|
|
lea -24(a6),a0 ; rect1=rect2, etc.
|
|
lea -32(a6),a1
|
|
moveq #24,d0
|
|
_BlockMove
|
|
|
|
subq.l #4,sp
|
|
move.l d7,-(sp) ; bump interp.
|
|
move.l d5,-(sp)
|
|
_FixMul
|
|
move.l (sp)+,d7
|
|
|
|
subq.w #1,d4 ; more to do?
|
|
bne.s zoomLoop
|
|
|
|
pea -32(a6) ; remove oldest
|
|
_FrameRect
|
|
|
|
pea -24(a6) ; remove oldest
|
|
_FrameRect
|
|
|
|
pea -16(a6) ; remove oldest
|
|
_FrameRect
|
|
|
|
_PenNormal
|
|
_SetPort
|
|
|
|
noZoom
|
|
movem.l (sp)+,ZoomRectRegs ; and restore regs
|
|
unlk a6 ; get rid of frame ptr
|
|
move.l (sp)+,a0 ; get ret addr
|
|
add.l #10,sp ; strip params
|
|
jmp (a0) ; and return
|
|
|
|
Blender
|
|
subq.l #6,sp ; room for temp
|
|
move.l d7,-(sp)
|
|
clr.w -(sp) ; zero fractional part
|
|
move.w (a3)+,-(sp) ; get big rect part
|
|
_FixMul
|
|
subq.l #4,sp ; room for temp
|
|
clr.l -(sp) ; make a $00010000 on the stack
|
|
addq.w #1,(sp)
|
|
sub.l d7,(sp) ; subtract fract
|
|
clr.w -(sp) ; zero fractional part
|
|
move.w (a2)+,-(sp) ; get small rect part
|
|
_FixMul
|
|
move.l (sp)+,d0
|
|
add.l d0,(sp) ; add the two
|
|
_FixRound
|
|
move.w (sp)+,(a4)+ ; stuff rect
|
|
rts
|
|
|
|
ENDPROC ; ZoomRect
|
|
|
|
END
|