include/mgba/internal/gba/dma.h (view raw)
1/* Copyright (c) 2013-2016 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#ifndef GBA_DMA_H
7#define GBA_DMA_H
8
9#include <mgba-util/common.h>
10
11CXX_GUARD_START
12
13enum GBADMAControl {
14 GBA_DMA_INCREMENT = 0,
15 GBA_DMA_DECREMENT = 1,
16 GBA_DMA_FIXED = 2,
17 GBA_DMA_INCREMENT_RELOAD = 3
18};
19
20enum GBADMATiming {
21 GBA_DMA_TIMING_NOW = 0,
22 GBA_DMA_TIMING_VBLANK = 1,
23 GBA_DMA_TIMING_HBLANK = 2,
24 GBA_DMA_TIMING_CUSTOM = 3
25};
26
27DECL_BITFIELD(GBADMARegister, uint16_t);
28DECL_BITS(GBADMARegister, DestControl, 5, 2);
29DECL_BITS(GBADMARegister, SrcControl, 7, 2);
30DECL_BIT(GBADMARegister, Repeat, 9);
31DECL_BIT(GBADMARegister, Width, 10);
32DECL_BIT(GBADMARegister, DRQ, 11);
33DECL_BITS(GBADMARegister, Timing, 12, 2);
34DECL_BIT(GBADMARegister, DoIRQ, 14);
35DECL_BIT(GBADMARegister, Enable, 15);
36
37struct GBADMA {
38 GBADMARegister reg;
39
40 uint32_t source;
41 uint32_t dest;
42 int32_t count;
43 uint32_t nextSource;
44 uint32_t nextDest;
45 int32_t nextCount;
46 uint32_t when;
47};
48
49struct GBA;
50void GBADMAInit(struct GBA* gba);
51void GBADMAReset(struct GBA* gba);
52
53uint32_t GBADMAWriteSAD(struct GBA* gba, int dma, uint32_t address);
54uint32_t GBADMAWriteDAD(struct GBA* gba, int dma, uint32_t address);
55void GBADMAWriteCNT_LO(struct GBA* gba, int dma, uint16_t count);
56uint16_t GBADMAWriteCNT_HI(struct GBA* gba, int dma, uint16_t control);
57
58struct GBADMA;
59void GBADMASchedule(struct GBA* gba, int number, struct GBADMA* info);
60void GBADMARunHblank(struct GBA* gba, int32_t cycles);
61void GBADMARunVblank(struct GBA* gba, int32_t cycles);
62void GBADMARunDisplayStart(struct GBA* gba, int32_t cycles);
63void GBADMAUpdate(struct GBA* gba);
64
65CXX_GUARD_END
66
67#endif