;EASE$$$ READ ONLY COPY of file ÒANGLES.aÓ ;¥1.5 BAL 05/29/1989 Blasting in 32-Bit QuickDraw version 1.0 Final ;¥1.4 BAL 04/12/1989 Blasting in 32-Bit QuickDraw 1.0B1 ;¥1.3 BAL 04/12/1989 -d ; File Angles.a ; ; Copyright Apple Computer, Inc. 1981-1986 ; All Rights Reserved ; ; BLANKS ON STRING ASIS AngleFromSlope FUNC EXPORT EXPORT SlopeFromAngle ;----------------------------------------------------- ; ; FUNCTION AngleFromSlope(slope: Fixed): INTEGER; ; ; Scans slope table for angle and returns angle 0..180 ; MOVE.L 4(SP),D0 ;GET SLOPE SMI D2 ;REMEMBER IF IT WAS NEGATIVE BPL.S NOTNEG ;CONTINUE IF POSITIVE NEG.L D0 ;ELSE MAKE SLOPE POS NOTNEG SUB.L #500,D0 ;BIAS THE COMPARE MOVE.L D0,4(SP) LEA CONTINUE,A0 ;POINT TO TABLE OF SLOPES MOVEQ #-1,D1 ;INIT ANGLE COUNT SCAN ADD.W #1,D1 MOVE.W D1,D0 CLR.L -(SP) BRA.S A2SLOPE CONTINUE MOVE.L 8(SP),D0 ;GET SLOPE CMP.L (SP)+,D0 ;SCAN THRU SLOPE TABLE BGT.S SCAN MOVE #180,D0 SUB D1,D0 ;CALC 180-ANGLE = 90..180 TST.B D2 ;WAS DH POS ? BPL.S DONE ;NO, RETURN 90..180 MOVE D1,D0 ;YES, RETURN 0..90 DONE MOVE.L (SP)+,(SP) ;STRIP PARAM MOVE.W D0,4(SP) ;RETURN FUNCTION RESULT RTS ;---------------------------------------------------------------- ; ; FUNCTION SlopeFromAngle(angle: INTEGER): Fixed; ; ; calculate the fixed point slope of a line, DH/DV = -65536 * Tan(angle). ; Input angle is treated MOD 180. ; SlopeFromAngle MOVE.L (SP)+,A0 ;POP RETURN ADDR MOVE (SP)+,D0 ;GET INTEGER ANGLE EXT.L D0 ;SIGN EXTEND FOR DIVIDE DIVS #180,D0 ;TREAT ANGLE MOD 180 SWAP D0 ;GET THE REMAINDER TST D0 ;WAS IT NEGATIVE ? BPL.S OK1 ;NO, CONTINUE ADD #180,D0 ;YES, PUT IN RANGE 0..179 OK1 MOVE #$8000,(SP) A2SLOPE CMP #90,D0 BLE.S OK2 CLR.W (SP) SUB #180,D0 NEG D0 OK2 CMP #45,D0 BLT.S SHARE ADD #1,(SP) CMP #64,D0 BLT.S SHARE MOVE.B SLOPE-91(D0),1(SP) BPL.S SHARE OR.B #$7F,(SP) SHARE ADD D0,D0 MOVE.W SLOPE(D0),2(SP) CHECK BCLR #7,(SP) BEQ.S OK3 NEG.L (SP) OK3 JMP (A0) ; .BYTE $01 ;45 ; .BYTE $01 ; .BYTE $01 ; .BYTE $01 ; .BYTE $01 ; .BYTE $01 ;50 ; .BYTE $01 ; .BYTE $01 ; .BYTE $01 ; .BYTE $01 ; .BYTE $01 ;55 ; .BYTE $01 ; .BYTE $01 ; .BYTE $01 ; .BYTE $01 ; .BYTE $01 ;60 ; .BYTE $01 ; .BYTE $01 DC.B $01 DC.B $02 DC.B $02 ;65 DC.B $02 DC.B $02 DC.B $02 DC.B $02 DC.B $02 ;70 DC.B $02 DC.B $03 DC.B $03 DC.B $03 DC.B $03 ;75 DC.B $04 DC.B $04 DC.B $04 DC.B $05 DC.B $05 ;80 DC.B $06 DC.B $07 DC.B $08 DC.B $09 DC.B $0B ;85 DC.B $0E DC.B $13 DC.B $1C DC.B $39 DC.B $FF ;90 SLOPE DC.W $0000 ;0 DC.W $0478 DC.W $08F1 DC.W $0D6B DC.W $11E7 DC.W $1666 ;5 DC.W $1AE8 DC.W $1F6F DC.W $23FA DC.W $288C DC.W $2D24 ;10 DC.W $31C3 DC.W $366A DC.W $3B1A DC.W $3FD4 DC.W $4498 ;15 DC.W $4968 DC.W $4E44 DC.W $532E DC.W $5826 DC.W $5D2D ;20 DC.W $6245 DC.W $676E DC.W $6CAA DC.W $71FB DC.W $7760 ;25 DC.W $7CDC DC.W $8270 DC.W $881E DC.W $8DE7 DC.W $93CD ;30 DC.W $99D2 DC.W $9FF7 DC.W $A640 DC.W $ACAD DC.W $B341 ;35 DC.W $B9FF DC.W $C0E9 DC.W $C802 DC.W $CF4E DC.W $D6CF ;40 DC.W $DE8A DC.W $E681 DC.W $EEB9 DC.W $F737 DC.W $0000 ;45 DC.W $0919 DC.W $1287 DC.W $1C51 DC.W $267F DC.W $3117 ;50 DC.W $3C22 DC.W $47AA DC.W $53B9 DC.W $605B DC.W $6D9B ;55 DC.W $7B89 DC.W $8A35 DC.W $99AF DC.W $AA0E DC.W $BB68 ;60 DC.W $CDD6 DC.W $E177 DC.W $F66E DC.W $0CE1 DC.W $24FE ;65 DC.W $3EFC DC.W $5B19 DC.W $799F DC.W $9AE7 DC.W $BF5B ;70 DC.W $E77A DC.W $13E3 DC.W $4556 DC.W $7CC7 DC.W $BB68 ;75 DC.W $02C2 DC.W $54DB DC.W $B462 DC.W $2501 DC.W $ABD9 ;80 DC.W $5051 DC.W $1D88 DC.W $24F3 DC.W $83AD DC.W $6E17 ;85 DC.W $4CF5 DC.W $14BD DC.W $A2D7 DC.W $4A30 DC.W $FFFF ;90 PtToAngle PROC EXPORT IMPORT AngleFromSlope ;-------------------------------------------------------------- ; ; PROCEDURE PtToAngle(r: Rect; pt: Point; VAR angle: INTEGER); ; ; Given a rectangle and a point, return the angle subtended by pt. ; ; A6 OFFSETS OF PARAMETERS AFTER LINK: ; PARAMSIZE EQU 12 ;TOTAL BYTES OF PARAMS RECT EQU PARAMSIZE+8-4 ;ADDR OF RECT PT EQU RECT-4 ;POINT ANGLE EQU PT-4 ;ADDR OF INTEGER; LINK A6,#0 ;NO LOCALS MOVEM.L D6-D7/A4,-(SP) ;SAVE REGS MOVE.L RECT(A6),A4 ;POINT TO RECT MOVE BOTTOM(A4),D0 ADD TOP(A4),D0 ASR #1,D0 ;CENTER.V := (TOP+BOTTOM)/2 MOVE PT+V(A6),D1 SUB D0,D1 ;DV := PT.V - CENTER.V MOVE RIGHT(A4),D0 ADD LEFT(A4),D0 ASR #1,D0 ;CENTER.H := (LEFT+RIGHT)/2 MOVE PT+H(A6),D7 SUB D0,D7 ;DH := PT.H - CENTER.H BNE.S DHOK ;CONTINUE IF DH <> 0 TST D1 ;WAS DV > 0 ? BLE.S ZERO ;NO, RETURN ANGLE = 0 MOVE #180,D0 ;YES, RETURN ANGLE = 180 BRA.S DONE DHOK CLR.L -(SP) ;ROOM FOR FCN RESULT MOVE D7,-(SP) ;PUSH DH MOVE D1,-(SP) ;PUSH DV _FixRatio ;CALC SLOPE := DH/DV MOVE.L (SP)+,D6 ;GET SLOPE RESULT CLR.L -(SP) ;ROOM FOR FCN RESULT MOVE BOTTOM(A4),D0 SUB TOP(A4),D0 MOVE D0,-(SP) ;PUSH HEIGHT MOVE RIGHT(A4),D0 SUB LEFT(A4),D0 MOVE D0,-(SP) ;PUSH WIDTH _FixRatio ;CALC ASPECT := HT/WD MOVE.L (SP)+,D0 ;GET ASPECT RESULT CLR.L -(SP) ;ROOM FOR FCN RESULT MOVE.L D6,-(SP) ;PUSH SLOPE MOVE.L D0,-(SP) ;PUSH ASPECT _FixMul ;CALC SLOPE*ASPECT MOVE.L (SP)+,D0 ;GET RESULT SLOPE2 CLR.W -(SP) ;ROOM FOR FCN RESULT MOVE.L D0,-(SP) ;PUSH SLOPE2 _AngleFromSlope ;SCAN FOR ARCTAN MOVE (SP)+,D0 ;GET RESULT ANGLE TST D7 ;WAS DH POSITIVE ? BPL.S DONE ;YES, CONTINUE ADD #180,D0 ;NO, ADD 180 TO ANG CMP #360,D0 ;IS RESULT = 360 ? BNE.S DONE ;NO, CONTINUE ZERO CLR D0 ;YES, ANGLE := 0 DONE MOVE.L ANGLE(A6),A0 ;GET VAR ADDR MOVE D0,(A0) ;STORE INTO ANGLE MOVEM.L (SP)+,D6-D7/A4 ;RESTORE REGS UNLINK PARAMSIZE,'PTTOANGL' ENDPROC