| Zeile 1: | Zeile 1: | ||
| − | |||
Unter '''Direct Memory Access''' (abgekürzt '''DMA''') versteht man eine Methode, Daten von Peripheriegeräten zum Arbeitsspeicher und umgekehrt zu übertragen, ohne dafür die CPU benutzen zu müssen. | Unter '''Direct Memory Access''' (abgekürzt '''DMA''') versteht man eine Methode, Daten von Peripheriegeräten zum Arbeitsspeicher und umgekehrt zu übertragen, ohne dafür die CPU benutzen zu müssen. | ||
| Zeile 212: | Zeile 211: | ||
|} | |} | ||
| − | === | + | === Beispielcode === |
| − | + | Folgende Funktion bereitet eine Übertragung vor: | |
| + | <c> | ||
| + | #define CHANNEL_ADRESS 0x04 | ||
| + | #define CHANNEL_COUNTER 0x05 | ||
| + | #define CHANNEL_PAGE 0x81 | ||
| − | == | + | VOID dma_begin_transfer(VOID* buffer, WORD size, BOOL write) |
| − | + | { | |
| + | BYTE page = (DWORD) buffer >> 16; | ||
| + | WORD offset = (DWORD) buffer - (page<<16); | ||
| + | size--; | ||
| + | |||
| + | mask_channel(2); | ||
| + | |||
| + | clear_flip_flop(); | ||
| + | outb(CHANNEL_COUNTER, size); | ||
| + | outb(CHANNEL_COUNTER, size>>8); | ||
| + | |||
| + | clear_flip_flop(); | ||
| + | outb(CHANNEL_ADRESS, offset & 0xFF); | ||
| + | outb(CHANNEL_ADRESS, offset>>8); | ||
| + | outb(CHANNEL_PAGE, page); | ||
| + | |||
| + | if (write) | ||
| + | outb(DMA_MODE, MODE_MASK_CHANNEL2 | MODE_MASK_TRANSFER_WRITE | MODE_MASK_MODE_SINGLE); // | MODE_MASK_AUTO); | ||
| + | else | ||
| + | outb(DMA_MODE, MODE_MASK_CHANNEL2 | MODE_MASK_TRANSFER_READ | MODE_MASK_MODE_SINGLE); // | MODE_MASK_AUTO); | ||
| + | |||
| + | unmask_channel(2); | ||
| + | } | ||
| + | </c> | ||
[[Kategorie:Glossar]] | [[Kategorie:Glossar]] | ||
[[Kategorie:Hardware]] | [[Kategorie:Hardware]] | ||