mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 01:29:20 +00:00
4325cdcc78
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.
310 lines
6.0 KiB
Plaintext
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
|
|
|
|
|
|
|
|
|