Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; ---------------------------------------------------------------------------
- ; Subroutine to load a level's objects
- ; ---------------------------------------------------------------------------
- ; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||
- ObjPosLoad: ; XREF: Level; et al
- moveq #0,d0
- move.b ($FFFFF76C).w,d0 ; load OPL routine counter
- move.w OPL_Index(pc,d0.w),d0
- jmp OPL_Index(pc,d0.w)
- ; End of function ObjPosLoad
- ; ===========================================================================
- OPL_Index: dc.w OPL_Main-OPL_Index
- dc.w OPL_Next-OPL_Index
- ; ===========================================================================
- OPL_Main: ; XREF: OPL_Index
- addq.b #2,($FFFFF76C).w ; increase OPL routine counter
- move.w ($FFFFFE10).w,d0 ; load zone number
- lsl.b #6,d0
- lsr.w #4,d0
- lea (ObjPos_Index).l,a0 ; load object list pointers
- movea.l a0,a1
- adda.w (a0,d0.w),a0 ; load object list for the level
- move.l a0,($FFFFF770).w
- move.l a0,($FFFFF774).w
- adda.w 2(a1,d0.w),a1
- move.l a1,($FFFFF778).w
- move.l a1,($FFFFF77C).w
- lea ($FFFFFC00).w,a2
- move.w #$101,(a2)+
- move.w #$5E,d0
- OPL_ClrList:
- clr.l (a2)+
- dbf d0,OPL_ClrList ; clear pre-destroyed object list
- lea ($FFFFFC00).w,a2 ; load pre-destroyed object list
- moveq #0,d2
- move.w ($FFFFF700).w,d6 ; load camera X-pos
- subi.w #$80,d6
- bcc.s loc_D93C
- moveq #0,d6
- loc_D93C:
- andi.w #$FF80,d6
- movea.l ($FFFFF770).w,a0
- loc_D944:
- cmp.w (a0),d6
- bls.s loc_D956
- tst.b 4(a0)
- bpl.s loc_D952
- move.b (a2),d2
- addq.b #1,(a2)
- loc_D952:
- addq.w #6,a0
- bra.s loc_D944
- ; ===========================================================================
- loc_D956:
- move.l a0,($FFFFF770).w
- movea.l ($FFFFF774).w,a0
- subi.w #$80,d6
- bcs.s loc_D976
- loc_D964:
- cmp.w (a0),d6
- bls.s loc_D976
- tst.b 4(a0)
- bpl.s loc_D972
- addq.b #1,1(a2)
- loc_D972:
- addq.w #6,a0
- bra.s loc_D964
- ; ===========================================================================
- loc_D976:
- move.l a0,($FFFFF774).w
- move.w #-1,($FFFFF76E).w
- OPL_Next: ; XREF: OPL_Index
- lea ($FFFFFC00).w,a2 ; load pre-destroyed object list
- moveq #0,d2
- move.w ($FFFFF700).w,d6 ; load camera X-pos
- andi.w #$FF80,d6 ; make it multiple of 128
- cmp.w ($FFFFF76E).w,d6
- beq.w locret_DA3A
- bge.s loc_D9F6
- move.w d6,($FFFFF76E).w
- movea.l ($FFFFF774).w,a0
- subi.w #$80,d6
- bcs.s loc_D9D2
- loc_D9A6:
- cmp.w -6(a0),d6
- bge.s loc_D9D2
- subq.w #6,a0
- tst.b 4(a0)
- bpl.s loc_D9BC
- subq.b #1,1(a2)
- move.b 1(a2),d2
- loc_D9BC:
- bsr.w loc_DA3C
- bne.s loc_D9C6
- subq.w #6,a0
- bra.s loc_D9A6
- ; ===========================================================================
- loc_D9C6:
- tst.b 4(a0)
- bpl.s loc_D9D0
- addq.b #1,1(a2)
- loc_D9D0:
- addq.w #6,a0
- loc_D9D2:
- move.l a0,($FFFFF774).w
- movea.l ($FFFFF770).w,a0
- addi.w #$300,d6
- loc_D9DE:
- cmp.w -6(a0),d6
- bgt.s loc_D9F0
- tst.b -2(a0)
- bpl.s loc_D9EC
- subq.b #1,(a2)
- loc_D9EC:
- subq.w #6,a0
- bra.s loc_D9DE
- ; ===========================================================================
- loc_D9F0:
- move.l a0,($FFFFF770).w
- rts
- ; ===========================================================================
- loc_D9F6:
- move.w d6,($FFFFF76E).w
- movea.l ($FFFFF770).w,a0
- addi.w #$280,d6 ; boundary range: ($200) - ($200+$80)
- loc_DA02:
- cmp.w (a0),d6 ; compare object X-pos to the boundary
- bls.s loc_DA16 ; if object is out of boundary, branch
- tst.b 4(a0) ; is 'remember sprite' flag set?
- bpl.s loc_DA10 ; if not, branch
- move.b (a2),d2 ; load slot number for this object in pre-destoyed object list
- addq.b #1,(a2) ; increase number of entries in pre-destoyed object list
- loc_DA10:
- bsr.w loc_DA3C
- beq.s loc_DA02
- loc_DA16:
- move.l a0,($FFFFF770).w
- movea.l ($FFFFF774).w,a0
- subi.w #$300,d6
- bcs.s loc_DA36
- loc_DA24:
- cmp.w (a0),d6
- bls.s loc_DA36
- tst.b 4(a0)
- bpl.s loc_DA32
- addq.b #1,1(a2)
- loc_DA32:
- addq.w #6,a0
- bra.s loc_DA24
- ; ===========================================================================
- loc_DA36:
- move.l a0,($FFFFF774).w
- locret_DA3A:
- rts
- ; ===========================================================================
- loc_DA3C:
- tst.b 4(a0) ; is 'remember sprite' flag set?
- bpl.s OPL_MakeItem ; if not, branch
- bset #7,2(a2,d2.w) ; mark obj as created
- beq.s OPL_MakeItem ; if it wasn't created before, branch
- addq.w #6,a0
- moveq #0,d0 ; set to continue obj creating loop
- rts
- ; ===========================================================================
- OPL_MakeItem:
- bsr.w SingleObjLoad
- bne.s locret_DA8A ; if creating object failed, branch
- move.w (a0)+,8(a1)
- move.w (a0)+,d0
- move.w d0,d1
- andi.w #$FFF,d0
- move.w d0,$C(a1)
- rol.w #2,d1
- andi.b #3,d1
- move.b d1,1(a1)
- move.b d1,$22(a1)
- move.b (a0)+,d0 ; load object id
- bpl.s loc_DA80 ; if 'remember sprite' flag is not set, branch
- andi.b #$7F,d0
- move.b d2,$23(a1)
- loc_DA80:
- move.b d0,0(a1) ; set object id
- move.b (a0)+,$28(a1) ; set subtype
- moveq #0,d0 ; set to continue obj creating loop
- locret_DA8A:
- rts
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement