sgdk
|
00001 00010 #include "config.h" 00011 #include "types.h" 00012 00013 #ifndef _DMA_H_ 00014 #define _DMA_H_ 00015 00016 00021 #define DMA_VRAM 0 00022 00026 #define DMA_CRAM 1 00027 00031 #define DMA_VSRAM 2 00032 00033 #define DMA_QUEUE_SIZE_DEFAULT 80 00034 #define DMA_QUEUE_SIZE_MIN 32 00035 00036 #define DMA_TRANSFER_CAPACITY_NTSC 7200 00037 #define DMA_TRANSFER_CAPACITY_PAL_LOW 8000 00038 #define DMA_TRANSFER_CAPACITY_PAL_MAX 15000 00039 00040 // better to allocate a bit more than DMA capacity 00041 #define DMA_BUFFER_SIZE_NTSC 8192 00042 #define DMA_BUFFER_SIZE_PAL_LOW 8192 00043 #define DMA_BUFFER_SIZE_PAL_MAX (14 * 1024) 00044 #define DMA_BUFFER_SIZE_MIN (2 * 1024) 00045 00046 00051 typedef enum 00052 { 00053 CPU = 0, 00054 DMA = 1, 00055 DMA_QUEUE = 2, 00056 DMA_QUEUE_COPY = 3 00057 } TransferMethod; 00058 00059 00064 typedef struct 00065 { 00066 u16 regLenL; // (newLen & 0xFF) | 0x9300; 00067 u16 regLenH; // ((newLen >> 8) & 0xFF) | 0x9400; 00068 u32 regAddrMStep; // (((addr << 7) & 0xFF0000) | 0x96008F00) + step; 00069 u32 regAddrHAddrL; // ((addr >> 1) & 0x7F00FF) | 0x97009500; 00070 u32 regCtrlWrite; // VDP_DMA_VRAMCOPY_ADDR(to) 00071 } DMAOpInfo; 00072 00073 00078 extern DMAOpInfo *dmaQueues; 00083 extern u16* dmaDataBuffer; 00084 00094 void DMA_init(void); 00114 void DMA_initEx(u16 size, u16 capacity, u16 bufferSize); 00115 00124 bool DMA_getAutoFlush(void); 00133 void DMA_setAutoFlush(bool value); 00140 u16 DMA_getMaxQueueSize(void); 00152 void DMA_setMaxQueueSize(u16 value); 00160 void DMA_setMaxQueueSizeToDefault(void); 00168 u16 DMA_getMaxTransferSize(void); 00181 void DMA_setMaxTransferSize(u16 value); 00188 void DMA_setMaxTransferSizeToDefault(void); 00196 u16 DMA_getBufferSize(void); 00210 void DMA_setBufferSize(u16 value); 00217 void DMA_setBufferSizeToDefault(void); 00224 bool DMA_getIgnoreOverCapacity(void); 00235 void DMA_setIgnoreOverCapacity(bool value); 00236 00242 void DMA_clearQueue(void); 00255 void DMA_flushQueue(void); 00256 00261 u16 DMA_getQueueSize(void); 00268 u16 DMA_getQueueTransferSize(void); 00269 00283 void* DMA_allocateTemp(u16 len); 00293 void DMA_releaseTemp(u16 len); 00294 00326 bool DMA_transfer(TransferMethod tm, u8 location, void* from, u16 to, u16 len, u16 step); 00327 00345 bool DMA_canQueue(u8 location, u16 len); 00373 void* DMA_allocateAndQueueDma(u8 location, u16 to, u16 len, u16 step); 00400 bool DMA_copyAndQueueDma(u8 location, void* from, u16 to, u16 len, u16 step); 00426 bool DMA_queueDma(u8 location, void* from, u16 to, u16 len, u16 step); 00432 bool DMA_queueDmaFast(u8 location, void* from, u16 to, u16 len, u16 step); 00433 00456 void DMA_doDma(u8 location, void* from, u16 to, u16 len, s16 step); 00462 void DMA_doDmaFast(u8 location, void* from, u16 to, u16 len, s16 step); 00463 00485 void DMA_doCPUCopy(u8 location, void* from, u16 to, u16 len, s16 step); 00501 void DMA_doCPUCopyDirect(u32 cmd, void* from, u16 len, s16 step); 00502 00518 void DMA_doVRamFill(u16 to, u16 len, u8 value, s16 step); 00533 void DMA_doVRamCopy(u16 from, u16 to, u16 len, s16 step); 00534 00539 void DMA_waitCompletion(void); 00540 00541 00542 #endif // _DMA_H_