; loc_1E7D0: FindFloor: bsr.w Floor_ChkTile move.w (a1),d0 move.w d0,d4 andi.w #$3FF,d0 beq.s loc_1E7E2 btst d5,d4 bne.s loc_1E7F0 loc_1E7E2: add.w a3,d2 bsr.w FindFloor2 sub.w a3,d2 addi.w #$10,d1 rts ; =========================================================================== loc_1E7F0: ; block has some solidity movea.l (Collision_addr).w,a2 ; pointer to collision data, i.e. blockID -> collisionID array move.b (a2,d0.w),d0 ; get collisionID andi.w #$FF,d0 beq.s loc_1E7E2 cmpi.b #death_egg_zone,(Current_Zone).w bne.s LoadFloorColCurveMap_NotDEZ lea (ColCurveMap_DEZ).l,a2 bra.s ContinueLoadingFloorColCurveMap LoadFloorColCurveMap_NotDEZ: lea (ColCurveMap).l,a2 ContinueLoadingFloorColCurveMap: move.b (a2,d0.w),(a4) ; get angle from AngleMap --> (a4) lsl.w #4,d0 move.w d3,d1 ; x_pos btst #$A,d4 ; adv.blockID in d4 - X flipping beq.s + not.w d1 neg.b (a4) + btst #$B,d4 ; Y flipping beq.s + addi.b #$40,(a4) neg.b (a4) subi.b #$40,(a4) + andi.w #$F,d1 ; x_pos (mod 16) add.w d0,d1 ; d0 = 16*blockID -> offset in ColArray to look up cmpi.b #death_egg_zone,(Current_Zone).w bne.s LoadFloorColArray_NotDEZ lea (ColArray_DEZ).l,a2 bra.s ContinueLoadingFloorColArray LoadFloorColArray_NotDEZ: lea (ColArray).l,a2 ContinueLoadingFloorColArray: move.b (a2,d1.w),d0 ; heigth from ColArray ext.w d0 eor.w d6,d4 btst #$B,d4 ; Y flipping beq.s + neg.w d0 + tst.w d0 beq.w loc_1E7E2 ; no collision bmi.s loc_1E85E cmpi.b #$10,d0 beq.s loc_1E86A move.w d2,d1 andi.w #$F,d1 add.w d1,d0 move.w #$F,d1 sub.w d0,d1 rts ; =========================================================================== loc_1E85E: move.w d2,d1 andi.w #$F,d1 add.w d1,d0 bpl.w loc_1E7E2 loc_1E86A: sub.w a3,d2 bsr.w FindFloor2 add.w a3,d2 subi.w #$10,d1 rts ; End of function FindFloor ; ||||||||||||||| S U B R O U T I N E ||||||||||||||||||||||||||||||||||||||| ; loc_1E878: FindFloor2: bsr.w Floor_ChkTile move.w (a1),d0 move.w d0,d4 andi.w #$3FF,d0 beq.s loc_1E88A btst d5,d4 bne.s loc_1E898 loc_1E88A: move.w #$F,d1 move.w d2,d0 andi.w #$F,d0 sub.w d0,d1 rts ; =========================================================================== loc_1E898: movea.l (Collision_addr).w,a2 move.b (a2,d0.w),d0 andi.w #$FF,d0 beq.s loc_1E88A cmpi.b #death_egg_zone,(Current_Zone).w bne.s LoadFloor2ColCurveMap_NotDEZ lea (ColCurveMap_DEZ).l,a2 bra.s ContinueLoadingFloor2ColCurveMap LoadFloor2ColCurveMap_NotDEZ: lea (ColCurveMap).l,a2 ContinueLoadingFloor2ColCurveMap: move.b (a2,d0.w),(a4) lsl.w #4,d0 move.w d3,d1 btst #$A,d4 beq.s + not.w d1 neg.b (a4) + btst #$B,d4 beq.s + addi.b #$40,(a4) neg.b (a4) subi.b #$40,(a4) + andi.w #$F,d1 add.w d0,d1 cmpi.b #death_egg_zone,(Current_Zone).w bne.s LoadFloor2ColArray_NotDEZ lea (ColArray_DEZ).l,a2 bra.s ContinueLoadingFloor2ColArray LoadFloor2ColArray_NotDEZ: lea (ColArray).l,a2 ContinueLoadingFloor2ColArray: move.b (a2,d1.w),d0 ext.w d0 eor.w d6,d4 btst #$B,d4 beq.s + neg.w d0 + tst.w d0 beq.w loc_1E88A bmi.s loc_1E900 move.w d2,d1 andi.w #$F,d1 add.w d1,d0 move.w #$F,d1 sub.w d0,d1 rts ; =========================================================================== loc_1E900: move.w d2,d1 andi.w #$F,d1 add.w d1,d0 bpl.w loc_1E88A not.w d1 rts ; =========================================================================== ; loc_1E910: Obj_CheckInFloor: bsr.w Floor_ChkTile move.w (a1),d0 move.w d0,d4 andi.w #$3FF,d0 beq.s loc_1E922 btst d5,d4 bne.s loc_1E928 loc_1E922: move.w #$10,d1 rts ; =========================================================================== loc_1E928: movea.l (Collision_addr).w,a2 move.b (a2,d0.w),d0 andi.w #$FF,d0 beq.s loc_1E922 cmpi.b #death_egg_zone,(Current_Zone).w bne.s LoadObjChkFloorColCurveMap_NotDEZ lea (ColCurveMap_DEZ).l,a2 bra.s ContinueLoadingObjChkFloorColCurveMap LoadObjChkFloorColCurveMap_NotDEZ: lea (ColCurveMap).l,a2 ContinueLoadingObjChkFloorColCurveMap: move.b (a2,d0.w),(a4) lsl.w #4,d0 move.w d3,d1 btst #$A,d4 beq.s + not.w d1 neg.b (a4) + btst #$B,d4 beq.s + addi.b #$40,(a4) neg.b (a4) subi.b #$40,(a4) + andi.w #$F,d1 add.w d0,d1 cmpi.b #death_egg_zone,(Current_Zone).w bne.s LoadFloorCheckColArray_NotDEZ lea (ColArray_DEZ).l,a2 bra.s ContinueLoadingFloorCheckColArray LoadFloorCheckColArray_NotDEZ: lea (ColArray).l,a2 ContinueLoadingFloorCheckColArray: move.b (a2,d1.w),d0 ext.w d0 eor.w d6,d4 btst #$B,d4 beq.s + neg.w d0 + tst.w d0 beq.s loc_1E922 bmi.s loc_1E996 cmpi.b #$10,d0 beq.s loc_1E9A2 move.w d2,d1 andi.w #$F,d1 add.w d1,d0 move.w #$F,d1 sub.w d0,d1 rts ; =========================================================================== loc_1E996: move.w d2,d1 andi.w #$F,d1 add.w d1,d0 bpl.w loc_1E922 loc_1E9A2: sub.w a3,d2 bsr.w FindFloor2 add.w a3,d2 subi.w #$10,d1 rts ; =========================================================================== ; ||||||||||||||| S U B R O U T I N E ||||||||||||||||||||||||||||||||||||||| ; d2 = y_pos ; d3 = x_pos ; d5 = ($c,$d) - solidity type bit (L/R/B or top) ; returns relevant block ID in (a1) ; returns distance to left/right in d1 ; returns angle in (a4) ; loc_1E9B0: FindWall: bsr.w Floor_ChkTile move.w (a1),d0 move.w d0,d4 andi.w #$3FF,d0 ; plain blockID beq.s loc_1E9C2 ; no collision btst d5,d4 bne.s loc_1E9D0 loc_1E9C2: add.w a3,d3 bsr.w FindWall2 sub.w a3,d3 addi.w #$10,d1 rts ; =========================================================================== loc_1E9D0: movea.l (Collision_addr).w,a2 move.b (a2,d0.w),d0 andi.w #$FF,d0 ; relevant collisionArrayEntry beq.s loc_1E9C2 cmpi.b #death_egg_zone,(Current_Zone).w bne.s LoadWallColCurveMap_NotDEZ lea (ColCurveMap_DEZ).l,a2 bra.s ContinueLoadingWallColCurveMap LoadWallColCurveMap_NotDEZ: lea (ColCurveMap).l,a2 ContinueLoadingWallColCurveMap: move.b (a2,d0.w),(a4) lsl.w #4,d0 ; offset in collision array move.w d2,d1 ; y btst #$B,d4 ; y-mirror? beq.s + not.w d1 addi.b #$40,(a4) neg.b (a4) subi.b #$40,(a4) + btst #$A,d4 ; x-mirror? beq.s + neg.b (a4) + andi.w #$F,d1 ; y add.w d0,d1 ; line to look up cmpi.b #death_egg_zone,(Current_Zone).w bne.s LoadWallColArray_NotDEZ lea (ColArray2_DEZ).l,a2 bra.s ContinueLoadingWallColArray LoadWallColArray_NotDEZ: lea (ColArray2).l,a2 ; rotated collision array ContinueLoadingWallColArray: move.b (a2,d1.w),d0 ; collision value ext.w d0 eor.w d6,d4 ; set x-flip flag if from the right btst #$A,d4 ; x-mirror? beq.s + neg.w d0 + tst.w d0 beq.w loc_1E9C2 bmi.s loc_1EA3E cmpi.b #$10,d0 beq.s loc_1EA4A move.w d3,d1 ; x andi.w #$F,d1 add.w d1,d0 move.w #$F,d1 sub.w d0,d1 rts ; =========================================================================== loc_1EA3E: move.w d3,d1 andi.w #$F,d1 add.w d1,d0 bpl.w loc_1E9C2 ; no collision loc_1EA4A: sub.w a3,d3 bsr.w FindWall2 add.w a3,d3 subi.w #$10,d1 rts ; End of function FindWall ; ||||||||||||||| S U B R O U T I N E ||||||||||||||||||||||||||||||||||||||| ; loc_1EA58: FindWall2: bsr.w Floor_ChkTile move.w (a1),d0 move.w d0,d4 andi.w #$3FF,d0 beq.s loc_1EA6A btst d5,d4 bne.s loc_1EA78 loc_1EA6A: move.w #$F,d1 move.w d3,d0 andi.w #$F,d0 sub.w d0,d1 rts ; =========================================================================== loc_1EA78: movea.l (Collision_addr).w,a2 move.b (a2,d0.w),d0 andi.w #$FF,d0 beq.s loc_1EA6A cmpi.b #death_egg_zone,(Current_Zone).w bne.s LoadWall2ColCurveMap_NotDEZ lea (ColCurveMap_DEZ).l,a2 bra.s ContinueLoadingWall2ColCurveMap LoadWall2ColCurveMap_NotDEZ: lea (ColCurveMap).l,a2 ContinueLoadingWall2ColCurveMap: move.b (a2,d0.w),(a4) lsl.w #4,d0 move.w d2,d1 btst #$B,d4 beq.s + not.w d1 addi.b #$40,(a4) neg.b (a4) subi.b #$40,(a4) + btst #$A,d4 beq.s + neg.b (a4) + andi.w #$F,d1 add.w d0,d1 cmpi.b #death_egg_zone,(Current_Zone).w bne.s LoadWall2ColArray_NotDEZ lea (ColArray2_DEZ).l,a2 bra.s ContinueLoadingWall2ColArray LoadWall2ColArray_NotDEZ: lea (ColArray2).l,a2 ; rotated collision array ContinueLoadingWall2ColArray: move.b (a2,d1.w),d0 ext.w d0 eor.w d6,d4 btst #$A,d4 beq.s + neg.w d0 + tst.w d0 beq.w loc_1EA6A bmi.s loc_1EAE0 move.w d3,d1 andi.w #$F,d1 add.w d1,d0 move.w #$F,d1 sub.w d0,d1 rts ; =========================================================================== loc_1EAE0: move.w d3,d1 andi.w #$F,d1 add.w d1,d0 bpl.w loc_1EA6A not.w d1 rts ; End of function FindWall2