mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-27 22:51:28 +00:00
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
|
||
|
|
||
|
|
||
|
|
||
|
|