1
1
; this routine check if car pointed in a0 collides with
2
2
; car pointed in a1
3
3
DISTANCE_BETWEEN_CENTERS: dc.l 0
4
- SEPARATION_VECTOR: dc.l 0
5
- ;APP: dc.l 0
4
+ SEPARATION_VECTOR: dc.l 0
6
5
CHECK_COLLISIONS_WITH_OTHER_CAR:
7
- move .l a0 ,a2
8
- move .l a1 ,a3
6
+ movea .l a0 ,a2
7
+ movea .l a1 ,a3
9
8
10
9
; distance vector between 2 cars
11
- adda.l #MOVER_POSITION_OFFSET,a0
12
- adda.l #MOVER_POSITION_OFFSET,a1
13
- SUB2DVECTORSTATIC DISTANCE_BETWEEN_CENTERS
14
- ;move.l DISTANCE_BETWEEN_CENTERS,APP
10
+ adda.l #MOVER_POSITION_OFFSET,a0
11
+ adda.l #MOVER_POSITION_OFFSET,a1
12
+ SUB2DVECTORSTATIC DISTANCE_BETWEEN_CENTERS
15
13
16
- move .l a2 ,a0
17
- move .l a3 ,a1
14
+ movea .l a2 ,a0
15
+ movea .l a3 ,a1
18
16
19
17
; get absolute values for the vector
20
- ABS_WORD DISTANCE_BETWEEN_CENTERS ; absolute x distance
21
- ABS_WORD DISTANCE_BETWEEN_CENTERS+2 ; absolute y distance
18
+ ABS_WORD DISTANCE_BETWEEN_CENTERS ; absolute x distance
19
+ ABS_WORD DISTANCE_BETWEEN_CENTERS+2 ; absolute y distance
22
20
23
21
; get half width for car 1 + half width of car 2
24
22
;let shw = this.wheel_base/2 + othercar.wheel_base/2;
25
- move.w MOVER_WHEEL_BASE_OFFSET(a2 ),d0
26
- move.w MOVER_WHEEL_BASE_OFFSET(a3 ),d1
27
- add.w d1 ,d0
28
- lsl.w #6 ,d0
23
+ move.w MOVER_WHEEL_BASE_OFFSET(a2 ),d0
24
+ move.w MOVER_WHEEL_BASE_OFFSET(a3 ),d1
25
+ add.w d1 ,d0
26
+ lsl.w #6 ,d0
29
27
30
28
; half height sum
31
29
;let shh = this.wheel_base/2 + othercar.wheel_base/2;
32
- move.w MOVER_WIDTH_DIV_2_OFFSET(a2 ),d2
33
- move.w MOVER_WIDTH_DIV_2_OFFSET(a2 ),d3
34
- add.w d3 ,d2
35
- lsl.w #6 ,d2
30
+ move.w MOVER_WIDTH_DIV_2_OFFSET(a2 ),d2
31
+ move.w MOVER_WIDTH_DIV_2_OFFSET(a2 ),d3
32
+ add.w d3 ,d2
33
+ lsl.w #6 ,d2
36
34
37
35
; if abs X value of distance vector is < then sum of half width of the 2 cars
38
36
; I am sure they are not colliding, in this case just branch to car not collision
39
37
;move.w #$0,$dff180
40
- cmp.w DISTANCE_BETWEEN_CENTERS,d0
41
- ble.w nocarcollision
38
+ cmp.w DISTANCE_BETWEEN_CENTERS,d0
39
+ ble.w nocarcollision
42
40
43
41
; if abs Y value of distance vector is < then sum of half height of the 2 cars
44
42
; I am sure they are not colliding, in this case just branch to car not collision
45
- cmp.w DISTANCE_BETWEEN_CENTERS+2 ,d2
46
- ble.w nocarcollision
43
+ cmp.w DISTANCE_BETWEEN_CENTERS+2 ,d2
44
+ ble.w nocarcollision
47
45
48
46
; if we are here, it means car pointed in a0 is colliding with car in a1 (and car a1 is colliding with car in a0)
49
47
; we must now resove the collision
50
48
51
49
; sx = sum of car widths / 2 - x absolute distance (which is on d0) ==> result in d1
52
- move.w d0 ,d1
53
- sub.w DISTANCE_BETWEEN_CENTERS,d1 ; d1 = sx
50
+ move.w d0 ,d1
51
+ sub.w DISTANCE_BETWEEN_CENTERS,d1 ; d1 = sx
54
52
55
53
; sy = sum of car heights / 2 - y absolute distance (which is on d2) ==> result in d3
56
- move.w d2 ,d3
57
- sub.w DISTANCE_BETWEEN_CENTERS+2 ,d3 ; d3 = sy
54
+ move.w d2 ,d3
55
+ sub.w DISTANCE_BETWEEN_CENTERS+2 ,d3 ; d3 = sy
58
56
59
57
; compare sx with sy, if sx is smaller, reset
60
-
61
- move.l d3 ,d4
62
- move.l d4 ,d3
63
- cmp.w d1 ,d3
64
- ble.s sxgreaterthansy
65
- moveq #0 ,d3
66
- bra.s correctsign
58
+ cmp.w d1 ,d3
59
+ ble.s sxgreaterthansy
60
+ moveq #0 ,d3
61
+ bra.s correctsign
67
62
sxgreaterthansy:
68
- moveq #0 ,d1
63
+ moveq #0 ,d1
69
64
correctsign:
70
- move.w MOVER_X_POSITION_OFFSET(a3 ),d4
71
- cmp.w MOVER_X_POSITION_OFFSET(a2 ),d4
72
- ble.s nochangexsign
73
- neg.w d1
65
+ move.w MOVER_X_POSITION_OFFSET(a3 ),d4
66
+ cmp.w MOVER_X_POSITION_OFFSET(a2 ),d4
67
+ ble.s nochangexsign
68
+ neg.w d1
74
69
nochangexsign:
75
- move.w MOVER_Y_POSITION_OFFSET(a3 ),d4
76
- cmp.w MOVER_Y_POSITION_OFFSET(a2 ),d4
77
- ble.s nochangeysign
78
- neg.w d3
70
+ move.w MOVER_Y_POSITION_OFFSET(a3 ),d4
71
+ cmp.w MOVER_Y_POSITION_OFFSET(a2 ),d4
72
+ ble.s nochangeysign
73
+ neg.w d3
79
74
nochangeysign
80
75
;move.w #$FFFF,$dff180
81
76
82
77
; add separation vector to car position
83
- SETCARPROPERTYADDR MOVER_POSITION_OFFSET,a0
84
- move.w d1 ,SEPARATION_VECTOR
85
- move.w d3 ,SEPARATION_VECTOR+2
86
- ;move.l SEPARATION_VECTOR,APP
87
- lea SEPARATION_VECTOR,a1
78
+ lea SEPARATION_VECTOR(PC ),a0
79
+ move.w d1 ,(a0 )
80
+ move.w d3 ,2 (a0 )
81
+ SETCARPROPERTYADDR MOVER_POSITION_OFFSET,a1
88
82
ADD2DVECTOR
89
- move.l (a1 ),(a0 )
90
83
91
- ; add SEPARATION_VECTOR to other
92
- move.w MOVER_X_VELOCITY_OFFSET(a2 ),d1
93
- move.w MOVER_Y_VELOCITY_OFFSET(a2 ),d3
94
- ;lsr.w #4,d1
95
- ;lsr.w #4,d3
96
- add.w d1 ,MOVER_X_VELOCITY_OFFSET(a3 )
97
- add.w d3 ,MOVER_Y_VELOCITY_OFFSET(a3 )
84
+ move.w MOVER_X_VELOCITY_OFFSET(a2 ),d1
85
+ move.w MOVER_Y_VELOCITY_OFFSET(a2 ),d3
98
86
99
- sub .w d1 ,MOVER_X_VELOCITY_OFFSET( a2 )
100
- sub .w d3 ,MOVER_Y_VELOCITY_OFFSET( a2 )
87
+ asr .w # 1 , d1
88
+ asr .w # 1 , d3
101
89
102
- nocarcollision:
90
+ add.w d1 ,MOVER_X_VELOCITY_OFFSET(a3 )
91
+ add.w d3 ,MOVER_Y_VELOCITY_OFFSET(a3 )
103
92
93
+ sub.w d1 ,MOVER_X_VELOCITY_OFFSET(a2 )
94
+ sub.w d3 ,MOVER_Y_VELOCITY_OFFSET(a2 )
95
+
96
+ nocarcollision:
104
97
105
- move .l a2 ,a0
106
- move .l a3 ,a1
98
+ movea .l a2 ,a0
99
+ movea .l a3 ,a1
107
100
rts
0 commit comments