Ha, thanks. And this information proves useful. I keep coming across a function that handles up to $40 blocks of data $40 bytes in side, starting at $FFAD08. However, 8 allocated zones * 7 allocated acts * 4 allocated times of day == $E0 supported blocks, so I may be wrong.
In any case, one could assume the real offset for enable grow is $39(aN). The following code looks relevant:
CODE
ROM:0088418C; ---------------------------------------------------------------------------
ROM:0088418C
ROM:0088418C loc_88418C: ; CODE XREF: sub_883B32+644j
ROM:0088418C tst.w $26(a6)
ROM:00884190 bne.w loc_884074
ROM:00884194 moveq #0,d0
ROM:00884196 subq.b #1,$39(a6)
ROM:0088419A bne.s loc_8841C0
ROM:0088419C move.b $38(a6),d0
ROM:008841A0 addq.b #4,d0
ROM:008841A2 cmpi.b #$20,d0; ' '
ROM:008841A6 bcs.s loc_8841AA
ROM:008841A8 moveq #0,d0
ROM:008841AA
ROM:008841AA loc_8841AA: ; CODE XREF: sub_883B32+674j
ROM:008841AA move.b d0,$38(a6)
ROM:008841AE move.b #3,$39(a6)
ROM:008841B4 move.w word_8841E6(pc,d0.w),0(a4)
ROM:008841BA move.w word_8841E8(pc,d0.w),$C(a4)
ROM:008841C0
ROM:008841C0 loc_8841C0: ; CODE XREF: sub_883B32+668j
ROM:008841C0 subq.b #1,$3B(a6)
ROM:008841C4 bne.s locret_8841E4
ROM:008841C6 move.b $3A(a6),d0
ROM:008841CA addq.b #1,d0
ROM:008841CC cmpi.b #4,d0
ROM:008841D0 bcs.s loc_8841D4
ROM:008841D2 moveq #0,d0
ROM:008841D4
ROM:008841D4 loc_8841D4: ; CODE XREF: sub_883B32+69Ej
ROM:008841D4 move.b d0,$3A(a6)
ROM:008841D8 move.b #8,$3B(a6)
ROM:008841DE move.b byte_884206(pc,d0.w),4(a4)
ROM:008841E4
ROM:008841E4 locret_8841E4: ; CODE XREF: sub_883B32+692j
ROM:008841E4 rts
ROM:008841E4; END OF FUNCTION CHUNK FOR sub_883B32
In this case, a6 is the value of $FFFFE028, which is set to the value of the first entry in the above array. When a level is loaded, the entires are cycled away:
CODE
ROM:00880D64; =============== S U B R O U T I N E =======================================
ROM:00880D64
ROM:00880D64
ROM:00880D64 sub_880D64: ; CODE XREF: DoGameMode+56Ep
ROM:00880D64 ; DoGameMode+1A28p ...
ROM:00880D64 moveq #0,d0
ROM:00880D66 lea ($FFFFE026).w,a0
ROM:00880D6A move.w d0,(a0)+
ROM:00880D6C move.w d0,(a0)+
ROM:00880D6E move.w d0,(a0)+
ROM:00880D70 move.w d0,(a0)+
ROM:00880D72 move.w d0,(a0)+
ROM:00880D74 move.w #$7FFF,(a0)+
ROM:00880D78 lea ($FFAD08).l,a0
ROM:00880D7E moveq #$3F,d7; '?'
ROM:00880D80 move.w a0,($FFFFE026).w
ROM:00880D84
ROM:00880D84 loc_880D84: ; CODE XREF: sub_880D64+28j
ROM:00880D84 lea $40(a0),a1
ROM:00880D88 move.w a1,(a0)
ROM:00880D8A movea.w a1,a0
ROM:00880D8C dbf d7,loc_880D84
ROM:00880D90 move.w d0,-$40(a0)
ROM:00880D94 move.l d0,($FFFFCA9E).w
ROM:00880D98 move.l d0,($FFFFCAA2).w
ROM:00880D9C move.w d0,($FFFFE1A2).w
ROM:00880DA0 move.w #$D45E,($FFFFD01E).w
ROM:00880DA6 move.w #5,($FFFFE01E).w
ROM:00880DAC move.w #$F,($FFFFE020).w
ROM:00880DB2 move.w #$3F,($FFFFE022).w; '?'
ROM:00880DB8 move.w #$3F,($FFFFE024).w; '?'
ROM:00880DBE rts
ROM:00880DBE; End of function sub_880D64
This is called by more than just the level loader, so at this point I'm not entirely sure. And then there's this... thing:
CODE
ROM:00880DC0; =============== S U B R O U T I N E =======================================
ROM:00880DC0
ROM:00880DC0
ROM:00880DC0 sub_880DC0: ; CODE XREF: sub_8AAB9C+2AEp
ROM:00880DC0 move.l #$FF0000,d0
ROM:00880DC6 move.w ($FFFFE032).w,d0
ROM:00880DCA bmi.s loc_880DE2
ROM:00880DCC cmpi.l #$FF0D08,d0
ROM:00880DD2 bcc.s loc_880DDC
ROM:00880DD4 move.l #$FFAD08,d0
ROM:00880DDA bra.s loc_880DE2
ROM:00880DDC; ---------------------------------------------------------------------------
ROM:00880DDC
ROM:00880DDC loc_880DDC: ; CODE XREF: sub_880DC0+12j
ROM:00880DDC move.l #$FF8000,d0
ROM:00880DE2
ROM:00880DE2 loc_880DE2: ; CODE XREF: sub_880DC0+Aj
ROM:00880DE2 ; sub_880DC0+1Aj
ROM:00880DE2 movea.w d0,a0
ROM:00880DE4 subi.l #$FFAD08,d0
ROM:00880DEA neg.w d0
ROM:00880DEC andi.w #$7FC0,d0
ROM:00880DF0 beq.s loc_880E12
ROM:00880DF2 lsr.w #6,d0
ROM:00880DF4 add.w d0,($FFFFE024).w
ROM:00880DF8 move.w ($FFFFE026).w,d1
ROM:00880DFC move.w a0,($FFFFE026).w
ROM:00880E00 subq.w #1,d0
ROM:00880E02
ROM:00880E02 loc_880E02: ; CODE XREF: sub_880DC0+4Aj
ROM:00880E02 lea $40(a0),a1
ROM:00880E06 move.w a1,(a0)
ROM:00880E08 movea.w a1,a0
ROM:00880E0A dbf d0,loc_880E02
ROM:00880E0E move.w d1,-$40(a0)
ROM:00880E12
ROM:00880E12 loc_880E12: ; CODE XREF: sub_880DC0+30j
ROM:00880E12 clr.w ($FFFFE032).w
ROM:00880E16 rts
ROM:00880E16; End of function sub_880DC0
But in any case there is just no single code to enable grow and shrink, nor a proper series, but rather a code based on the value of another memory address at any given point in time.
..................
EDIT
Apparently the value of $FFFFE028 depends on... the last address that level mappings are loaded to. Stay tuned.
This post has been edited by Andlabs: 29 January 2010 - 01:28 PM