DMA: Difference between revisions
m (Register formatting.) |
No edit summary |
||
Line 13: | Line 13: | ||
23 bit 16 15 bit 8 7 bit 0 | 23 bit 16 15 bit 8 7 bit 0 | ||
---- ---- ---- ---- ---- ---- | ---- ---- ---- ---- ---- ---- | ||
.... hhhh llll llll llll | .... hhhh llll llll llll lll. | ||
|||| |||| |||| | |||| |||| |||| |||| ||| | ||
++++---++++-++++---++++-++++- Linear source address | ++++---++++-++++---++++-++++- Linear source address | ||
($00000 - $ | ($00000 - $FFFFE) | ||
</pre> | </pre> | ||
DMA allows source addresses | DMA allows source addresses which can be accessed with a 16-bit width and without waitstates; any attempt to access SRAM (8-bit width) or "slow" ROM ($A0 bit 3 set) will cause DMA to immediately return, even if in the middle of a transfer. | ||
{{Anchor|GDMA Destination Address}} | {{Anchor|GDMA Destination Address}} | ||
Line 29: | Line 27: | ||
15 bit 8 7 bit 0 | 15 bit 8 7 bit 0 | ||
---- ---- ---- ---- | ---- ---- ---- ---- | ||
aaaa aaaa aaaa | aaaa aaaa aaaa aaa. | ||
|||| |||| | |||| |||| |||| ||| | ||
++++-++++--++++-+++ | ++++-++++--++++-+++-- Destination address in IRAM | ||
</pre> | </pre> | ||
Line 42: | Line 40: | ||
15 bit 8 7 bit 0 | 15 bit 8 7 bit 0 | ||
---- ---- ---- ---- | ---- ---- ---- ---- | ||
bbbb bbbb bbbb | bbbb bbbb bbbb bbb. | ||
|||| |||| | |||| |||| |||| ||| | ||
++++-++++--++++-+++ | ++++-++++--++++-+++-- Transfer length, in words | ||
(if including bit 0: in bytes) | |||
</pre> | </pre> | ||
Line 59: | Line 58: | ||
</pre> | </pre> | ||
The CPU is stalled immediately after General DMA is enabled. General DMA takes <code>(5 + 2 * | The CPU is stalled immediately after General DMA is enabled. General DMA takes <code>(5 + 2 * words)</code> cycles to complete, where <code>words</code> is the number of words (2-bytes) transferred. | ||
== Sound DMA == | == Sound DMA == | ||
Line 113: | Line 112: | ||
+--------- Enable DMA: 0 = off, 1 = on | +--------- Enable DMA: 0 = off, 1 = on | ||
</pre> | </pre> | ||
Revision as of 20:38, 30 August 2023
The WonderSwan Color introduced two DMA blocks:
- General DMA (GDMA) - allowing for fast IRAM/ROM -> IRAM transfers,
- Sound DMA (SDMA) - allowing for IRAM/ROM -> sound transfers in a much less CPU-intensive way than an interrupt.
General DMA
GDMA Source Address ($40, $41, $42)
23 bit 16 15 bit 8 7 bit 0 ---- ---- ---- ---- ---- ---- .... hhhh llll llll llll lll. |||| |||| |||| |||| ||| ++++---++++-++++---++++-++++- Linear source address ($00000 - $FFFFE)
DMA allows source addresses which can be accessed with a 16-bit width and without waitstates; any attempt to access SRAM (8-bit width) or "slow" ROM ($A0 bit 3 set) will cause DMA to immediately return, even if in the middle of a transfer.
GDMA Destination Address ($44, $45)
15 bit 8 7 bit 0 ---- ---- ---- ---- aaaa aaaa aaaa aaa. |||| |||| |||| ||| ++++-++++--++++-+++-- Destination address in IRAM
GDMA allows destination addresses in IRAM.
GDMA Length ($46, $47)
15 bit 8 7 bit 0 ---- ---- ---- ---- bbbb bbbb bbbb bbb. |||| |||| |||| ||| ++++-++++--++++-+++-- Transfer length, in words (if including bit 0: in bytes)
GDMA Control ($48)
7 bit 0 ---- ---- ed.. .... || |+-------- Direction: 0 = increment, 1 = decrement +--------- Enable DMA: 0 = off, 1 = on
The CPU is stalled immediately after General DMA is enabled. General DMA takes (5 + 2 * words)
cycles to complete, where words
is the number of words (2-bytes) transferred.
Sound DMA
Sound DMA is a specialized form of General DMA with a hard-coded destination and built-in timer logic. As such, all of the rules for GDMA apply to SDMA as well.
Due to its need to access the external cartridge bus, Sound DMA steals 7 cycles - the same amount of time GDMA would take for transferring one byte - every 128 cycles. These are always cycles {117, 118, 119, 120, 121, 122, 123} mod 128
.
TODO: How does Sound DMA interact with the cartridge waitstate configuration?
SDMA Source Address ($4A, $4B, $4C)
23 bit 16 15 bit 8 7 bit 0 ---- ---- ---- ---- ---- ---- .... hhhh llll llll llll llll |||| |||| |||| |||| |||| ++++---++++-++++---++++-++++- Linear source address ($00000 - $FFFFF)
SDMA Length ($4E, $4F, $50)
23 bit 16 15 bit 8 7 bit 0 ---- ---- ---- ---- ---- ---- .... hhhh llll llll llll llll |||| |||| |||| |||| |||| ++++---++++-++++---++++-++++- Transfer length, in bytes
SDMA Control ($52)
7 bit 0 ---- ---- ed.t r?ff || | | || || | | ++- Frequency/Rate: || | | 0 = 24000/1 = 24000 Hz || | | 1 = 24000/2 = 12000 Hz || | | 2 = 24000/4 = 6000 Hz || | | 3 = 24000/6 = 4000 Hz || | +---- Repeat: 0 = one-shot, 1 = auto-repeat || +------ Target: || 0 = Channel 2 (port $89) || 1 = Hyper Voice |+-------- Direction: 0 = increment, 1 = decrement +--------- Enable DMA: 0 = off, 1 = on