The current URL is datacrystal.tcrf.net.
EarthBound/ASM/VRAM DMA Transfer Routines: Difference between revisions
(→$C0865F-$C086DD: Perform DMA transfer (JSR): Document where transfer parameters are saved when not in VBLANK.) |
(Document temporary data block allocation routine) |
||
Line 48: | Line 48: | ||
''Note: Subroutine expects to always be called with Data Bank set to <code>#$00</code> and Data Page set to <code>#$0000</code>. This is normally done via the subroutine at [[#$C08643|<tt>$C08643</tt>]].'' | ''Note: Subroutine expects to always be called with Data Bank set to <code>#$00</code> and Data Page set to <code>#$0000</code>. This is normally done via the subroutine at [[#$C08643|<tt>$C08643</tt>]].'' | ||
==<tt>$C086DE-$C08704</tt>: Allocate temporary WRAM for VRAM DMA<span class="anchor" id="$C086DE"></span>== | |||
Allocates a block of memory (from the [[EarthBound:Temp_VRAM_DMA_Data_Block|Temp VRAM DMA Data Block]]) to store temporary data for use in the next VRAM DMA transfer. All allocated memory is always deallocated after each transfer. | |||
===Inputs=== | |||
* <tt>accumulator</tt>: Num bytes to allocate. ''Note: Total allocatable memory is typically 512 bytes, so this routine may deadlock if more than 512 bytes are requested.'' | |||
===Outputs=== | |||
* <tt>accumulator</tt>: Pointer (in <tt>$7E</tt> bank) to allocated memory. | |||
[[Category:EarthBound:ASM|VRAM DMA Transfer Routines]] | [[Category:EarthBound:ASM|VRAM DMA Transfer Routines]] | ||
{{Internal Data|game=EarthBound}} | {{Internal Data|game=EarthBound}} |
Revision as of 03:03, 21 August 2023
This is a sub-page of EarthBound/ASM.
$C085B7-$C08615: Batched memory/VRAM transfer
Batched transfers between main memory (ROM/WRAM) and VRAM. Sets up VRAM DMA memory and makes the transfers using multiple calls to $C08643 for batches of 0x1200 bytes, with a final transfer of the remainder up to 0x1201 bytes. Before each batch, spins on $7E0099, waiting for the value to become #$0000
.
Inputs
- accumulator: Transfer style. Byte index into VRAM DMA Transfer Style Table
- x: Transfer size (bytes)
- y: VRAM address (word)
- $0e..$10: Memory address long pointer
$C08616-$C0865A: Memory/VRAM transfer
Prepares memory (see VRAM DMA memory) and sets Data Bank and Data Page to zero. Then calls $C0865F to perform the DMA transfer.
Subroutine has multiple entry points.
Entry point $C08616
Setup including long pointer for memory address
Inputs
- accumulator: Transfer style. Byte index into VRAM DMA Transfer Style Table
- x: Transfer size (bytes)
- y: VRAM address (word)
- $0e..$10: Memory address long pointer
Entry point $C0862E
Setup including separated address/bank for memory address
Inputs
- accumulator: Transfer style. Byte index into VRAM DMA Transfer Style Table
- x: Transfer size (bytes)
- y: Memory address
- $0e: Memory address bank
- $10: VRAM address (word)
Entry point $C08643
Set up only Data Bank and Data Page registers. Used when VRAM DMA memory has already been prepared separately.
$C0865B-$C0865E: Perform DMA transfer (JSL)
Trivial JSL
wrapper around a call to $C0865F.
Note: Subroutine expects to always be called with Data Bank set to #$00
and Data Page set to #$0000
. This is normally done via the subroutine at $C08643.
$C0865F-$C086DD: Perform DMA transfer (JSR)
Primary memory/VRAM DMA transfer subroutine. Performs a DMA transfer using the parameters saved in VRAM DMA memory.
Depending on the value stored in $7E000D, either directly prepares and initiates DMA using the SNES DMA registers, or saves the transfer parameters to the VRAM DMA Circular Queue to allow the transfer to be performed upon the next vblank period by the VBLANK Interrupt Routine.
Note: Subroutine expects to always be called with Data Bank set to #$00
and Data Page set to #$0000
. This is normally done via the subroutine at $C08643.
$C086DE-$C08704: Allocate temporary WRAM for VRAM DMA
Allocates a block of memory (from the Temp VRAM DMA Data Block) to store temporary data for use in the next VRAM DMA transfer. All allocated memory is always deallocated after each transfer.
Inputs
- accumulator: Num bytes to allocate. Note: Total allocatable memory is typically 512 bytes, so this routine may deadlock if more than 512 bytes are requested.
Outputs
- accumulator: Pointer (in $7E bank) to allocated memory.
Internal Data for EarthBound
| |
---|---|