sys7.1-doc-wip/QuickDraw/Angles.a
2019-07-27 22:37:48 +08:00

310 lines
6.0 KiB
Plaintext

;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