Direct Memory Access — Änderungen 7357 → 8040

Zeile 1: Zeile 1:
−
{{TODO|Diesen Artikel erweitern}}
 
 
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:
 
|}
 
|}
  
−
=== Alles zusammensetzen: Vorbereiten einer Übertragung ===
+
=== Beispielcode ===
−
'''TODO'''
+
Folgende Funktion bereitet eine Übertragung vor:
 +
<c>
 +
#define CHANNEL_ADRESS 0x04
 +
#define CHANNEL_COUNTER 0x05
 +
#define CHANNEL_PAGE 0x81
  
−
=== Beispiel ===
+
VOID dma_begin_transfer(VOID* buffer, WORD size, BOOL write)
−
'''TODO''': was mit dem Diskettenlaufwerk?
+
{
 +
  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]]