Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

DMA

Declared in <gba/dma>.

AddressstdgbaAccessTypetonclib
0x40000B0reg_dmasad[4]Wconst void* volatile[4]REG_DMA0SAD..REG_DMA3SAD
0x40000B4reg_dmadad[4]Wvoid* volatile[4]REG_DMA0DAD..REG_DMA3DAD
0x40000B8reg_dmacnt_l[4]Wvolatile unsigned short[4]REG_DMA0CNT_L..REG_DMA3CNT_L
0x40000BAreg_dmacnt_h[4]RWdma_control[4]REG_DMA0CNT_H..REG_DMA3CNT_H
0x40000B0reg_dma[4]Wvolatile dma[4]-

All DMA arrays have a stride of 12 bytes between channels.

dma_control

struct dma_control {
    short : 5;
    dest_op dest_op : 2;   // increment / decrement / fixed / increment_reload
    src_op src_op : 2;     // increment / decrement / fixed
    bool repeat : 1;
    dma_type dma_type : 1; // half (16-bit) / word (32-bit)
    bool gamepak_drq : 1;
    dma_cond dma_cond : 2; // now / vblank / hblank / sound_fifo (or video_capture)
    bool irq_on_finish : 1;
    bool enable : 1;
};

dma - high-level descriptor

struct dma {
    const void* source;
    void* destination;
    unsigned short units;
    dma_control control;

    static constexpr dma copy(const void* src, void* dst, std::size_t count);
    static constexpr dma copy16(const void* src, void* dst, std::size_t count);
    static constexpr dma fill(const void* val, void* dst, std::size_t count);
    static constexpr dma fill16(const void* val, void* dst, std::size_t count);
    static constexpr dma on_vblank(const void* src, void* dst, std::size_t count);
    static constexpr dma on_hblank(const void* src, void* dst, std::size_t count);
    static constexpr dma to_fifo_a(const void* samples);
    static constexpr dma to_fifo_b(const void* samples);
};
gba::reg_dma[3] = gba::dma::copy(src, dst, 256);