EarthBound/ASM/VRAM DMA Transfer Routines: Difference between revisions

From Data Crystal
Jump to navigation Jump to search
(Add notes about subroutines expecting to be called with zero D/DB.)
(→‎$C0865F-$C086DD: Perform DMA transfer (JSR): Document where transfer parameters are saved when not in VBLANK.)
Line 45: Line 45:
Primary memory/VRAM DMA transfer subroutine. Performs a DMA transfer using the parameters saved in [[EarthBound:VRAM_DMA_memory|VRAM DMA memory]].
Primary memory/VRAM DMA transfer subroutine. Performs a DMA transfer using the parameters saved in [[EarthBound:VRAM_DMA_memory|VRAM DMA memory]].


Depending on the value stored in [[EarthBound:$7E000D|<tt>$7E000D</tt>]], either directly prepares and initiates DMA using the [https://snes.nesdev.org/wiki/DMA_registers SNES DMA registers], or saves the transfer parameters to allow the transfer to be performed upon the next vblank period.
Depending on the value stored in [[EarthBound:$7E000D|<tt>$7E000D</tt>]], either directly prepares and initiates DMA using the [https://snes.nesdev.org/wiki/DMA_registers SNES DMA registers], or saves the transfer parameters to the [[EarthBound:VRAM_DMA_Circular_Queue|VRAM DMA Circular Queue]] to allow the transfer to be performed upon the next vblank period by the [[EarthBound:ASM:VBLANK_Interrupt_Routine|VBLANK Interrupt Routine]].


''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>]].''

Revision as of 19:12, 20 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.