Repository URL to install this package:
|
Version:
3.0.0 ▾
|
{$ifdef NDS_INTERFACE}
const
DMA0_SRC : pcuint32 = pointer($040000B0);
DMA0_DEST : pcuint32 = pointer($040000B4);
DMA0_CR : pcuint32 = pointer($040000B8);
DMA1_SRC : pcuint32 = pointer($040000BC);
DMA1_DEST : pcuint32 = pointer($040000C0);
DMA1_CR : pcuint32 = pointer($040000C4);
DMA2_SRC : pcuint32 = pointer($040000C8);
DMA2_DEST : pcuint32 = pointer($040000CC);
DMA2_CR : pcuint32 = pointer($040000D0);
DMA3_SRC : pcuint32 = pointer($040000D4);
DMA3_DEST : pcuint32 = pointer($040000D8);
DMA3_CR : pcuint32 = pointer($040000DC);
function DMA_SRC(n: cint): pcuint32; inline;
function DMA_DEST(n: cint): pcuint32; inline;
function DMA_CR(n: cint): pcuint32; inline;
{$ifdef ARM9}
function DMA_FILL(n: cint): pcuint32; inline;
{$endif ARM9}
// DMA control register contents
// The defaults are 16-bit, increment source/dest addresses, no irq
const
DMA_ENABLE = (1 shl 31); //BIT(31);
DMA_BUSY = (1 shl 31); //BIT(31);
DMA_IRQ_REQ = (1 shl 30); //BIT(30);
DMA_START_NOW = 0;
DMA_START_CARD = (5 shl 27);
{$ifdef ARM7}
DMA_START_VBL = (1 shl 27); //BIT(27);
{$endif ARM7}
{$ifdef ARM9}
DMA_START_HBL = (1 shl 28); //BIT(28);
DMA_START_VBL = (1 shl 27); //BIT(27);
// DMA_START_FIFO = (7 shl 27);
DMA_DISP_FIFO = (4 shl 27);
{$endif ARM9}
DMA_START_FIFO = (7 shl 27);
DMA_16_BIT = 0;
DMA_32_BIT = (1 shl 26); //BIT(26);
DMA_REPEAT = (1 shl 25); //BIT(25);
DMA_SRC_INC = (0);
DMA_SRC_DEC = (1 shl 23); //BIT(23);
DMA_SRC_FIX = (1 shl 24); //BIT(24);
DMA_DST_INC = (0);
DMA_DST_DEC = (1 shl 21); //BIT(21);
DMA_DST_FIX = (1 shl 22); //BIT(22);
DMA_DST_RESET = (3 shl 21);
DMA_COPY_WORDS = (DMA_ENABLE or DMA_32_BIT or DMA_START_NOW);
DMA_COPY_HALFWORDS = (DMA_ENABLE or DMA_16_BIT or DMA_START_NOW);
{ $ifdef ARM9}
DMA_FIFO = (DMA_ENABLE or DMA_32_BIT or DMA_DST_FIX or DMA_START_FIFO);
{ $endif ARM9}
procedure dmaCopyWords(channel: cuint8; const src: pointer; dest: pointer; size: cuint32); inline;
procedure dmaCopyHalfWords(channel: cuint8; const src: pointer; dest: pointer; size: cuint32); inline;
procedure dmaCopy(const source: pointer; dest: pointer; size: cuint32); inline;
procedure dmaCopyWordsAsynch(channel: cuint8; const src: pointer; dest: pointer; size: cuint32); inline;
procedure dmaCopyHalfWordsAsynch(channel: cuint8; const src: pointer; dest: pointer; size: cuint32); inline;
procedure dmaCopyAsynch(const source: pointer; dest: pointer; size: cuint32); inline;
procedure dmaFillWords(value: cuint32; dest: pointer; size: cuint32); inline;
procedure dmaFillHalfWords(value: cuint16; dest: pointer; size: cuint32); inline;
function dmaBusy(channel: cuint8): cint; inline;
{$endif NDS_INTERFACE}
{$ifdef NDS_IMPLEMENTATION}
function DMA_SRC(n: cint): pcuint32; inline;
begin
DMA_SRC := pcuint32($040000B0 + (n * 12));
end;
function DMA_DEST(n: cint): pcuint32; inline;
begin
DMA_DEST := pcuint32($040000B4 + (n * 12));
end;
function DMA_CR(n: cint): pcuint32; inline;
begin
DMA_CR := pcuint32($040000B8 + (n * 12));
end;
{$ifdef ARM9}
function DMA_FILL(n: cint): pcuint32; inline;
begin
DMA_FILL := pcuint32($040000E0 + (n * 4));
end;
{$endif ARM9}
procedure dmaCopyWords(channel: cuint8; const src: pointer; dest: pointer; size: cuint32); inline;
begin
DMA_SRC(channel)^ := cuint32(src);
DMA_DEST(channel)^ := cuint32(dest);
DMA_CR(channel)^ := DMA_COPY_WORDS or (size shr 2);
while (DMA_CR(channel)^ and DMA_BUSY) <> 0 do;
end;
procedure dmaCopyHalfWords(channel: cuint8; const src: pointer; dest: pointer; size: cuint32); inline;
begin
DMA_SRC(channel)^ := cuint32(src);
DMA_DEST(channel)^ := cuint32(dest);
DMA_CR(channel)^ := DMA_COPY_HALFWORDS or (size shr 1);
while (DMA_CR(channel)^ and DMA_BUSY) <> 0 do;
end;
procedure dmaCopy(const source: pointer; dest: pointer; size: cuint32); inline;
begin
DMA_SRC(3)^ := cuint32(source);
DMA_DEST(3)^ := cuint32(dest);
DMA_CR(3)^ := DMA_COPY_HALFWORDS or (size shr 1);
while (DMA_CR(3)^ and DMA_BUSY <> 0) do;
end;
procedure dmaCopyWordsAsynch(channel: cuint8; const src: pointer; dest: pointer; size: cuint32); inline;
begin
DMA_SRC(channel)^ := cuint32(src);
DMA_DEST(channel)^ := cuint32(dest);
DMA_CR(channel)^ := DMA_COPY_WORDS or (size shr 2);
end;
procedure dmaCopyHalfWordsAsynch(channel: cuint8; const src: pointer; dest: pointer; size: cuint32); inline;
begin
DMA_SRC(channel)^ := cuint32(src);
DMA_DEST(channel)^ := cuint32(dest);
DMA_CR(channel)^ := DMA_COPY_HALFWORDS or (size shr 1);
end;
procedure dmaCopyAsynch(const source: pointer; dest: pointer; size: cuint32); inline;
begin
DMA_SRC(3)^ := cuint32(source);
DMA_DEST(3)^ := cuint32(dest);
DMA_CR(3)^ := DMA_COPY_HALFWORDS or (size shr 1);
end;
procedure dmaFillWords(value: cuint32; dest: pointer; size: cuint32); inline;
begin
{$ifdef ARM7}
pcuint32($027FFE04)^ := value;
DMA_SRC(3)^ := $027FFE04;
{$else ARM7}
DMA_FILL(3)^ := value;
// pcuint32(DMA_SRC(3)^) := pcuint32(DMA_FILL(3));
DMA_SRC(3)^ := cuint32(DMA_FILL(3));
{$endif ARM7}
DMA_DEST(3)^ := cuint32(dest);
DMA_CR(3)^ := DMA_SRC_FIX or DMA_COPY_WORDS or (size shr 2);
while (DMA_CR(3)^ and DMA_BUSY) <> 0 do;
end;
procedure dmaFillHalfWords(value: cuint16; dest: pointer; size: cuint32); inline;
begin
{$ifdef ARM7}
pcuint32($027FFE04)^ := value;
DMA_SRC(3)^ := $027FFE04;
{$else ARM7}
DMA_FILL(3)^ := value;
// pcuint32(DMA_SRC(3)^) := pcuint32(DMA_FILL(3));
DMA_SRC(3)^ := cuint32(DMA_FILL(3));
{$endif ARM7}
DMA_DEST(3)^ := cuint32(dest);
DMA_CR(3)^ := DMA_SRC_FIX or DMA_COPY_HALFWORDS or (size shr 1);
while (DMA_CR(3)^ and DMA_BUSY) <> 0 do;
end;
function dmaBusy(channel: cuint8): cint; inline;
begin
dmaBusy := (DMA_CR(channel)^ and DMA_BUSY) shr 31;
end;
{$endif NDS_IMPLEMENTATION}