home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / memory / dma / dma.pas next >
Pascal/Delphi Source File  |  1994-10-11  |  4KB  |  117 lines

  1. unit DMA;
  2.  
  3. interface
  4.  
  5. TYPE DMAarray = array[0..7] of byte;
  6.  
  7. CONST
  8.  { Adresses des contrôleurs DMA }
  9.  DMA_Adress            : 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.  { Modes des registres DMA DMA_Wr_mode_Reg }
  26.  Mode_Demande       = $00;
  27.  Mode_Unique        = $40;
  28.  Mode_Bloc          = $80;
  29.  Mode_Cascade       = $C0;
  30.  Adresses_Decrement = $20;
  31.  Adresses_Increment = $00;
  32.  Autoinit_Enable    = $10;
  33.  Autoinit_Disable   = $00;
  34.  Verif_transfer     = $00;
  35.  Ecrit_Transfer     = $04;
  36.  Lect_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_def(canal,mode : byte);
  44. procedure DMA_Normmode_def(canal,mode : byte);
  45. procedure DMA_Clear_Flipflop(canal : byte);
  46. procedure DMA_Startadresse(canal : byte; Start : pointer);
  47. procedure DMA_Taille_bloc(canal : byte; size : word);
  48. procedure DMA_canal_Masquer(canal : byte);
  49. procedure DMA_canal_Demasquer(canal : byte);
  50. procedure DMA_Init_Transfer(canal,mode : byte; p : pointer; s : word);
  51.  
  52. implementation
  53.  
  54. TYPE
  55.   pt = record                           { Permet de traiter }
  56.     ofs,sgm  :  word;                   { simplement les pointeurs }
  57.   end;
  58.  
  59. procedure DMA_mode_def(canal,mode : byte);
  60. begin;
  61.   port[DMAWr_Mode_Reg[canal]] := mode;
  62. end;
  63.  
  64. procedure DMA_Normmode_def(canal,mode : byte);
  65. begin;
  66.   port[DMAWr_Mode_Reg[canal]] := mode+Adresses_Increment+Lect_Transfer+
  67.                                  Autoinit_Disable+canal;
  68. end;
  69.  
  70. procedure DMA_Clear_Flipflop(canal : byte);
  71. begin;
  72.   port[DMAClear_Flipflop[canal]] := 0;
  73. end;
  74.  
  75. procedure DMA_Startadresse(canal : 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_Adress[canal]] := lo(offs);
  83.   port[DMA_Adress[canal]] := hi(offs);
  84.   port[DMA_Lower_Page[canal]] := lo(pn);
  85.   port[DMA_Higher_Page[canal]] := hi(pn);
  86. end;
  87.  
  88. procedure DMA_Taille_bloc(canal : byte; size : word);
  89. begin;
  90.   DMA_Clear_Flipflop(canal);
  91.   port[DMA_Count[canal]]:= lo(size);
  92.   port[DMA_Count[canal]] := hi(size);
  93. end;
  94.  
  95. procedure DMA_canal_Masquer(canal : byte);
  96. begin;
  97.  port[DMAWr_single_mask_Reg[canal]] := canal + Set_Mask_Bit;
  98. end;
  99.  
  100. procedure DMA_canal_Demasquer(canal : byte);
  101. begin;
  102.  port[DMAWr_single_mask_Reg[canal]] := canal + Clear_Mask_Bit;
  103. end;
  104.  
  105. procedure DMA_Init_Transfer(canal,mode : byte; p : pointer; s : word);
  106. begin;
  107.   DMA_canal_Masquer(canal);
  108.   DMA_Startadresse(canal,p);
  109.   DMA_Taille_bloc(canal,s);
  110.   DMA_Normmode_Def(canal,mode+canal);
  111.   DMA_canal_Demasquer(canal);
  112. end;
  113.  
  114. begin;
  115. end.
  116.  
  117.