home *** CD-ROM | disk | FTP | other *** search
/ PC Underground / UNDERGROUND.ISO / memory / dma / dma.pas next >
Encoding:
Pascal/Delphi Source File  |  1995-07-28  |  3.7 KB  |  124 lines

  1. unit DMA;
  2.  
  3. interface
  4.  
  5. TYPE DMAarray = array[0..7] of byte;
  6.  
  7. CONST
  8.  { DMA controller addresses }
  9.  DMA_Address           : DMAarray = ($00,$02,$04,$06,$C0,$C4,$C8,$CC);
  10.  DMA_Count             : DMAarray = ($01,$03,$05,$07,$C2,$C6,$CA,$CE);
  11.  DMARead_status_Reg    : DMAarray = ($08,$08,$08,$08,$D0,$D0,$D0,$D0);
  12.  DMAWrite_status_Reg   : DMAarray = ($08,$08,$08,$08,$D0,$D0,$D0,$D0);
  13.  DMAWrite_requ_Reg     : DMAarray = ($09,$09,$09,$09,$D2,$D2,$D2,$D2);
  14.  DMAWr_single_mask_Reg : DMAarray = ($0A,$0A,$0A,$0A,$D4,$D4,$D4,$D4);
  15.  DMAWr_mode_Reg        : DMAarray = ($0B,$0B,$0B,$0B,$D6,$D6,$D6,$D6);
  16.  DMAClear_Flipflop     : DMAarray = ($0C,$0C,$0C,$0C,$D8,$D8,$D8,$D8);
  17.  DMARead_Temp_Reg      : DMAarray = ($0D,$0D,$0D,$0D,$DA,$DA,$DA,$DA);
  18.  DMAMaster_Clear       : DMAarray = ($0D,$0D,$0D,$0D,$DA,$DA,$DA,$DA);
  19.  DMA_Clear_Mask_Reg    : DMAarray = ($0E,$0E,$0E,$0E,$DC,$DC,$DC,$DC);
  20.  DMA_Wr_All_Mask_Reg   : DMAarray = ($0F,$0F,$0F,$0F,$DE,$DE,$DE,$DE);
  21.  DMA_Lower_Page        : DMAarray = ($87,$83,$81,$82,$00,$8B,$89,$8A);
  22.  DMA_Higher_Page       : Array[0..7] of word
  23.                             = ($487,$483,$481,$482,$0,$48B,$489,$48A);
  24.  
  25.  { Mode Register  DMA_Wr_mode_Reg }
  26.  Request_mode  = $00;
  27.  Single_mode         = $40;
  28.  Block_mode          = $80;
  29.  Cascade_mode = $C0;
  30.  Addresses_Decrement = $20;
  31.  Addresses_Increment = $00;
  32.  Autoinit_Enable     = $10;
  33.  Autoinit_Disable    = $00;
  34.  Check_transfer      = $00;
  35.  Write_Transfer      = $04;
  36.  Read_Transfer       = $08;
  37.  
  38.  Set_Request_Bit     = $04;
  39.  Clear_Request_Bit   = $00;
  40.  Set_Mask_Bit        = $04;
  41.  Clear_Mask_Bit      = $00;
  42.  
  43. procedure DMA_Mode_set(Channel,Mode : byte);
  44. procedure DMA_NormMode_set(Channel,Mode : byte);
  45. procedure DMA_Clear_Flipflop(Channel : byte);
  46. procedure DMA_Startaddress(Channel : byte; Start : pointer);
  47. procedure DMA_Blocksize(Channel : byte; size : word);
  48. procedure DMA_Channel_maskon(Channel : byte);
  49. procedure DMA_Channel_maskoff(Channel : byte);
  50. procedure DMA_Init_Transfer(Channel,Mode : byte; p : pointer; s : word);
  51.  
  52. implementation
  53.  
  54. TYPE
  55.   pt = record                           { makes simple pointer    }
  56.     ofs,sgm  :  word;                   { handling possible    }
  57.   end;
  58.  
  59. procedure DMA_Mode_set(Channel,Mode : byte);
  60. begin;
  61.   port[DMAWr_Mode_Reg[Channel]] := Mode;
  62. end;
  63.  
  64. procedure DMA_NormMode_set(Channel,Mode : byte);
  65. begin;
  66.   port[DMAWr_Mode_Reg[Channel]] := Mode+Addresses_Increment+Read_Transfer+
  67.                                  Autoinit_Disable+Channel;
  68. end;
  69.  
  70. procedure DMA_Clear_Flipflop(Channel : byte);
  71. begin;
  72.   port[DMAClear_Flipflop[Channel]] := 0;
  73. end;
  74.  
  75. procedure DMA_Startaddress(Channel : byte; Start : pointer);
  76. var l : longint;
  77.     pn,offs : word;
  78. begin;
  79.   l := 16*longint(pt(Start).sgm)+pt(Start).ofs;
  80.   pn := pt(l).sgm;
  81.   offs := pt(l).ofs;
  82.   port[DMA_Address[Channel]] := lo(offs);
  83.   port[DMA_Address[Channel]] := hi(offs);
  84.   port[DMA_Lower_Page[Channel]] := lo(pn);
  85.   port[DMA_Higher_Page[Channel]] := hi(pn);
  86. end;
  87.  
  88. procedure DMA_Blocksize(Channel : byte; size : word);
  89. begin;
  90.   DMA_Clear_Flipflop(Channel);
  91.   port[DMA_Count[Channel]]:= lo(size);
  92.   port[DMA_Count[Channel]] := hi(size);
  93. end;
  94.  
  95. procedure DMA_Channel_maskon(Channel : byte);
  96. begin;
  97.  port[DMAWr_single_mask_Reg[Channel]] := Channel + Set_Mask_Bit;
  98. end;
  99.  
  100. procedure DMA_Channel_maskoff(Channel : byte);
  101. begin;
  102.  port[DMAWr_single_mask_Reg[Channel]] := Channel + Clear_Mask_Bit;
  103. end;
  104.  
  105. procedure DMA_Init_Transfer(Channel,Mode : byte; p : pointer; s : word);
  106. begin;
  107.   DMA_Channel_maskon(Channel);
  108.   DMA_Startaddress(Channel,p);
  109.   DMA_Blocksize(Channel,s);
  110.   DMA_NormMode_Set(Channel,Mode+Channel);
  111.   DMA_Channel_maskoff(Channel);
  112. end;
  113.  
  114. begin;
  115. end.
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.