Advertisement
vladikcomper

Sonic 1 - Objects Manager code

Feb 24th, 2013
373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ---------------------------------------------------------------------------
  2. ; Subroutine to load a level's objects
  3. ; ---------------------------------------------------------------------------
  4.  
  5. ; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||
  6.  
  7.  
  8. ObjPosLoad:             ; XREF: Level; et al
  9.         moveq   #0,d0
  10.         move.b  ($FFFFF76C).w,d0 ; load OPL routine counter
  11.         move.w  OPL_Index(pc,d0.w),d0
  12.         jmp OPL_Index(pc,d0.w)
  13. ; End of function ObjPosLoad
  14.  
  15. ; ===========================================================================
  16. OPL_Index:  dc.w OPL_Main-OPL_Index
  17.         dc.w OPL_Next-OPL_Index
  18. ; ===========================================================================
  19.  
  20. OPL_Main:               ; XREF: OPL_Index
  21.         addq.b  #2,($FFFFF76C).w ; increase OPL routine counter
  22.         move.w  ($FFFFFE10).w,d0 ; load zone number
  23.         lsl.b   #6,d0
  24.         lsr.w   #4,d0
  25.         lea (ObjPos_Index).l,a0 ; load object list pointers
  26.         movea.l a0,a1
  27.         adda.w  (a0,d0.w),a0    ; load object list for the level
  28.         move.l  a0,($FFFFF770).w
  29.         move.l  a0,($FFFFF774).w
  30.         adda.w  2(a1,d0.w),a1
  31.         move.l  a1,($FFFFF778).w
  32.         move.l  a1,($FFFFF77C).w
  33.         lea ($FFFFFC00).w,a2
  34.         move.w  #$101,(a2)+
  35.         move.w  #$5E,d0
  36.  
  37. OPL_ClrList:
  38.         clr.l   (a2)+
  39.         dbf d0,OPL_ClrList  ; clear pre-destroyed object list
  40.  
  41.         lea ($FFFFFC00).w,a2 ; load pre-destroyed object list
  42.         moveq   #0,d2
  43.         move.w  ($FFFFF700).w,d6 ; load camera X-pos
  44.         subi.w  #$80,d6
  45.         bcc.s   loc_D93C
  46.         moveq   #0,d6
  47.  
  48. loc_D93C:
  49.         andi.w  #$FF80,d6
  50.         movea.l ($FFFFF770).w,a0
  51.  
  52. loc_D944:
  53.         cmp.w   (a0),d6
  54.         bls.s   loc_D956
  55.         tst.b   4(a0)
  56.         bpl.s   loc_D952
  57.         move.b  (a2),d2
  58.         addq.b  #1,(a2)
  59.  
  60. loc_D952:
  61.         addq.w  #6,a0
  62.         bra.s   loc_D944
  63. ; ===========================================================================
  64.  
  65. loc_D956:
  66.         move.l  a0,($FFFFF770).w
  67.         movea.l ($FFFFF774).w,a0
  68.         subi.w  #$80,d6
  69.         bcs.s   loc_D976
  70.  
  71. loc_D964:
  72.         cmp.w   (a0),d6
  73.         bls.s   loc_D976
  74.         tst.b   4(a0)
  75.         bpl.s   loc_D972
  76.         addq.b  #1,1(a2)
  77.  
  78. loc_D972:
  79.         addq.w  #6,a0
  80.         bra.s   loc_D964
  81. ; ===========================================================================
  82.  
  83. loc_D976:
  84.         move.l  a0,($FFFFF774).w
  85.         move.w  #-1,($FFFFF76E).w
  86.  
  87. OPL_Next:               ; XREF: OPL_Index
  88.         lea ($FFFFFC00).w,a2    ; load pre-destroyed object list
  89.         moveq   #0,d2
  90.         move.w  ($FFFFF700).w,d6    ; load camera X-pos
  91.         andi.w  #$FF80,d6       ; make it multiple of 128
  92.         cmp.w   ($FFFFF76E).w,d6
  93.         beq.w   locret_DA3A
  94.         bge.s   loc_D9F6
  95.         move.w  d6,($FFFFF76E).w
  96.         movea.l ($FFFFF774).w,a0
  97.         subi.w  #$80,d6
  98.         bcs.s   loc_D9D2
  99.  
  100. loc_D9A6:
  101.         cmp.w   -6(a0),d6
  102.         bge.s   loc_D9D2
  103.         subq.w  #6,a0
  104.         tst.b   4(a0)
  105.         bpl.s   loc_D9BC
  106.         subq.b  #1,1(a2)
  107.         move.b  1(a2),d2
  108.  
  109. loc_D9BC:
  110.         bsr.w   loc_DA3C
  111.         bne.s   loc_D9C6
  112.         subq.w  #6,a0
  113.         bra.s   loc_D9A6
  114. ; ===========================================================================
  115.  
  116. loc_D9C6:
  117.         tst.b   4(a0)
  118.         bpl.s   loc_D9D0
  119.         addq.b  #1,1(a2)
  120.  
  121. loc_D9D0:
  122.         addq.w  #6,a0
  123.  
  124. loc_D9D2:
  125.         move.l  a0,($FFFFF774).w
  126.         movea.l ($FFFFF770).w,a0
  127.         addi.w  #$300,d6
  128.  
  129. loc_D9DE:
  130.         cmp.w   -6(a0),d6
  131.         bgt.s   loc_D9F0
  132.         tst.b   -2(a0)
  133.         bpl.s   loc_D9EC
  134.         subq.b  #1,(a2)
  135.  
  136. loc_D9EC:
  137.         subq.w  #6,a0
  138.         bra.s   loc_D9DE
  139. ; ===========================================================================
  140.  
  141. loc_D9F0:
  142.         move.l  a0,($FFFFF770).w
  143.         rts
  144. ; ===========================================================================
  145.  
  146. loc_D9F6:
  147.         move.w  d6,($FFFFF76E).w
  148.         movea.l ($FFFFF770).w,a0
  149.         addi.w  #$280,d6    ; boundary range: ($200) - ($200+$80)
  150.  
  151. loc_DA02:
  152.         cmp.w   (a0),d6     ; compare object X-pos to the boundary
  153.         bls.s   loc_DA16    ; if object is out of boundary, branch
  154.         tst.b   4(a0)       ; is 'remember sprite' flag set?
  155.         bpl.s   loc_DA10    ; if not, branch
  156.         move.b  (a2),d2     ; load slot number for this object in pre-destoyed object list
  157.         addq.b  #1,(a2)     ; increase number of entries in pre-destoyed object list
  158.  
  159. loc_DA10:
  160.         bsr.w   loc_DA3C
  161.         beq.s   loc_DA02
  162.  
  163. loc_DA16:
  164.         move.l  a0,($FFFFF770).w
  165.         movea.l ($FFFFF774).w,a0
  166.         subi.w  #$300,d6
  167.         bcs.s   loc_DA36
  168.  
  169. loc_DA24:
  170.         cmp.w   (a0),d6
  171.         bls.s   loc_DA36
  172.         tst.b   4(a0)
  173.         bpl.s   loc_DA32
  174.         addq.b  #1,1(a2)
  175.  
  176. loc_DA32:
  177.         addq.w  #6,a0
  178.         bra.s   loc_DA24
  179. ; ===========================================================================
  180.  
  181. loc_DA36:
  182.         move.l  a0,($FFFFF774).w
  183.  
  184. locret_DA3A:
  185.         rts
  186. ; ===========================================================================
  187.  
  188. loc_DA3C:
  189.         tst.b   4(a0)       ; is 'remember sprite' flag set?
  190.         bpl.s   OPL_MakeItem    ; if not, branch
  191.         bset    #7,2(a2,d2.w)   ; mark obj as created
  192.         beq.s   OPL_MakeItem    ; if it wasn't created before, branch
  193.         addq.w  #6,a0
  194.         moveq   #0,d0       ; set to continue obj creating loop
  195.         rts
  196. ; ===========================================================================
  197.  
  198. OPL_MakeItem:
  199.         bsr.w   SingleObjLoad
  200.         bne.s   locret_DA8A ; if creating object failed, branch
  201.         move.w  (a0)+,8(a1)
  202.         move.w  (a0)+,d0
  203.         move.w  d0,d1
  204.         andi.w  #$FFF,d0
  205.         move.w  d0,$C(a1)
  206.         rol.w   #2,d1
  207.         andi.b  #3,d1
  208.         move.b  d1,1(a1)
  209.         move.b  d1,$22(a1)
  210.         move.b  (a0)+,d0    ; load object id
  211.         bpl.s   loc_DA80    ; if 'remember sprite' flag is not set, branch
  212.         andi.b  #$7F,d0
  213.         move.b  d2,$23(a1)
  214.  
  215. loc_DA80:
  216.         move.b  d0,0(a1)    ; set object id
  217.         move.b  (a0)+,$28(a1)   ; set subtype
  218.         moveq   #0,d0       ; set to continue obj creating loop
  219.  
  220. locret_DA8A:
  221.         rts
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement