home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cdisk.zip / DMA / DMA.C next >
Text File  |  1992-07-06  |  3KB  |  146 lines

  1. USHORT  SetupDMA(USHORT channel)
  2.     {
  3.     if(DMAChannelBusy(channel))
  4.        return (DMA_CHANNEL_BUSY);
  5.     MaskDMA(channel);
  6.     SetDMAMode(channel,DMA_SINGLE | DMA_READ);
  7.     InitDMA(channel,(UCHAR) DMACh.PageSelect,
  8.        (USHORT) DMACh.BaseAddress,
  9.        (USHORT) DMACh.WordCount);
  10.     UnmaskDMA(channel);
  11.     return (DMA_COMPLETE);
  12.     }
  13.  
  14.  
  15. void MaskDMA(USHORT channel)
  16. {
  17. UCHAR channel_mask;
  18.  
  19. /* output a channel specific value to mask a DMA channel */
  20.  
  21. switch (channel) {
  22.  
  23.     case 5:
  24.       channel_mask = 5;
  25.       break;
  26.  
  27.     case 6:
  28.       channel_mask = 6;
  29.       break;
  30.  
  31.     case 7:
  32.       channel_mask = 7;
  33.       break;
  34.       }
  35.   out8reg(DMA_MASK_REGISTER,channel_mask);
  36. }
  37.  
  38.  
  39. void SetDMAMode(USHORT channel,UCHAR mode)
  40. {
  41. unsigned char mode_byte;
  42.  
  43. /* output a channel specific value to unmask a DMA channel */
  44.  
  45. switch (channel) {
  46.  
  47.    case 5:
  48.        mode_byte = mode | 0x01;
  49.        break;
  50.  
  51.    case 6:
  52.        mode_byte = mode | 0x02;
  53.        break;
  54.  
  55.    case 7:
  56.        mode_byte = mode | 0x03;
  57.        break;
  58.       }
  59.    out8reg(DMA_MODE_REGISTER,mode_byte);
  60. }
  61.  
  62.  
  63. void InitDMA(USHORT channel,UCHAR page,USHORT address,
  64.             USHORT count)
  65. {
  66. /* set up page select, addr, and cnt for specified channel */
  67.  
  68. switch (channel) {
  69.  
  70.    case 5:
  71.       out8reg(DMA_PAGE_SELECT_5,page);
  72.       out16reg(DMA_BASE_ADDRESS_5,address);
  73.       out16reg(DMA_WORD_COUNT_5,count);
  74.       break;
  75.  
  76.    case 6:
  77.       out8reg(DMA_PAGE_SELECT_6,page);
  78.       out16reg(DMA_BASE_ADDRESS_6,address);
  79.       out16reg(DMA_WORD_COUNT_6,count);
  80.       break;
  81.  
  82.    case 7:
  83.       out8reg(DMA_PAGE_SELECT_7,page);
  84.       out16reg(DMA_BASE_ADDRESS_7,address);
  85.       out16reg(DMA_WORD_COUNT_7,count);
  86.       break;
  87.       }
  88. }
  89.  
  90.  
  91. void UnmaskDMA(USHORT channel)
  92. {
  93. unsigned char unmask_byte;
  94.  
  95. /* output a channel specific value to unmask a DMA channel */
  96.  
  97. switch (channel) {
  98.  
  99. case 5:
  100.     unmask_byte = 1;
  101.     break;
  102.  
  103. case 6:
  104.     unmask_byte = 2;
  105.     break;
  106.  
  107. case 7:
  108.     unmask_byte = 3;
  109.     break;
  110.     }
  111.  out8reg(DMA_MASK_REGISTER,unmask_byte);
  112. }
  113.  
  114.  
  115. USHORT DMAChannelBusy(USHORT ch)
  116. {
  117.  
  118.   UCHAR ch_status;
  119.   USHORT rc;
  120.  
  121. /* returns 0 if not busy, 1 if busy */
  122.  
  123.    ch_status = inp (DMA_STATUS_REG47)
  124.    rc = 0;
  125.    switch(ch) {
  126.  
  127.       case 5:
  128.          if (ch_status & 0x20)
  129.          rc = 1;
  130.          break;
  131.  
  132.       case 6:
  133.          if (ch_status & 0x40)
  134.          rc = 1;
  135.          break;
  136.  
  137.       case 7:
  138.          if (ch_status & 0x80)
  139.          rc = 1;
  140.          break
  141.       }
  142.    return (rc);
  143. }
  144.  
  145.  
  146.