mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-24 17:32:59 +00:00
330 lines
6.8 KiB
Plaintext
330 lines
6.8 KiB
Plaintext
;
|
|
; File: Angles.m.a
|
|
;
|
|
; Contains: xxx put contents here (or delete the whole line) xxx
|
|
;
|
|
; Written by: xxx put name of writer here (or delete the whole line) xxx
|
|
;
|
|
; Copyright: © 1988-1990 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <2> 10/10/90 JL Change FixRatio to MFixRatio to avoid conflict with Traps.a
|
|
; <1.1> 11/11/88 CCH Fixed Header.
|
|
; <1.0> 11/9/88 CCH Adding to EASE.
|
|
; <1.2> 10/12/88 CCH Changed “m.GrafType.a” to “GrafType.m.a”.
|
|
; <1.1> 5/18/88 MSH Changed inclides to use m.GRAPHTYPES to work under EASE.
|
|
; <1.0> 2/11/88 BBM Adding file for the first time into EASE…
|
|
;
|
|
; To Do:
|
|
;
|
|
|
|
;EASE$$$ READ ONLY COPY of file “ANGLES.m.a”
|
|
; 1.1 CCH 11/11/1988 Fixed Header.
|
|
; 1.0 CCH 11/ 9/1988 Adding to EASE.
|
|
; OLD REVISIONS BELOW
|
|
; 1.2 CCH 10/12/1988 Changed “m.GrafType.a” to “GrafType.m.a”.
|
|
; 1.1 MSH 5/18/88 Changed inclides to use m.GRAPHTYPES to work under EASE.
|
|
; 1.0 BBM 2/11/88 Adding file for the first time into EASE…
|
|
; END EASE MODIFICATION HISTORY
|
|
BLANKS ON
|
|
STRING ASIS
|
|
|
|
INCLUDE 'GrafTypes.m.a'
|
|
|
|
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
|
|
_MFixRatio ;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
|
|
_MFixRatio ;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
|
|
_MFixMul ;CALC SLOPE*ASPECT
|
|
MOVE.L (SP)+,D0 ;GET RESULT SLOPE2
|
|
|
|
CLR.W -(SP) ;ROOM FOR FCN RESULT
|
|
MOVE.L D0,-(SP) ;PUSH SLOPE2
|
|
JSR 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'
|
|
|
|
|
|
|
|
END
|
|
|
|
|
|
|
|
|