home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
memory
/
dma
/
dma.pas
next >
Wrap
Pascal/Delphi Source File
|
1994-10-11
|
4KB
|
117 lines
unit DMA;
interface
TYPE DMAarray = array[0..7] of byte;
CONST
{ Adresses des contrôleurs DMA }
DMA_Adress : DMAarray = ($00,$02,$04,$06,$C0,$C4,$C8,$CC);
DMA_Count : DMAarray = ($01,$03,$05,$07,$C2,$C6,$CA,$CE);
DMARead_status_Reg : DMAarray = ($08,$08,$08,$08,$D0,$D0,$D0,$D0);
DMAWrite_status_Reg : DMAarray = ($08,$08,$08,$08,$D0,$D0,$D0,$D0);
DMAWrite_requ_Reg : DMAarray = ($09,$09,$09,$09,$D2,$D2,$D2,$D2);
DMAWr_single_mask_Reg : DMAarray = ($0A,$0A,$0A,$0A,$D4,$D4,$D4,$D4);
DMAWr_mode_Reg : DMAarray = ($0B,$0B,$0B,$0B,$D6,$D6,$D6,$D6);
DMAClear_Flipflop : DMAarray = ($0C,$0C,$0C,$0C,$D8,$D8,$D8,$D8);
DMARead_Temp_Reg : DMAarray = ($0D,$0D,$0D,$0D,$DA,$DA,$DA,$DA);
DMAMaster_Clear : DMAarray = ($0D,$0D,$0D,$0D,$DA,$DA,$DA,$DA);
DMA_Clear_Mask_Reg : DMAarray = ($0E,$0E,$0E,$0E,$DC,$DC,$DC,$DC);
DMA_Wr_All_Mask_Reg : DMAarray = ($0F,$0F,$0F,$0F,$DE,$DE,$DE,$DE);
DMA_Lower_Page : DMAarray = ($87,$83,$81,$82,$00,$8B,$89,$8A);
DMA_Higher_Page : Array[0..7] of word
= ($487,$483,$481,$482,$0,$48B,$489,$48A);
{ Modes des registres DMA DMA_Wr_mode_Reg }
Mode_Demande = $00;
Mode_Unique = $40;
Mode_Bloc = $80;
Mode_Cascade = $C0;
Adresses_Decrement = $20;
Adresses_Increment = $00;
Autoinit_Enable = $10;
Autoinit_Disable = $00;
Verif_transfer = $00;
Ecrit_Transfer = $04;
Lect_Transfer = $08;
Set_Request_Bit = $04;
Clear_Request_Bit = $00;
Set_Mask_Bit = $04;
Clear_Mask_Bit = $00;
procedure DMA_mode_def(canal,mode : byte);
procedure DMA_Normmode_def(canal,mode : byte);
procedure DMA_Clear_Flipflop(canal : byte);
procedure DMA_Startadresse(canal : byte; Start : pointer);
procedure DMA_Taille_bloc(canal : byte; size : word);
procedure DMA_canal_Masquer(canal : byte);
procedure DMA_canal_Demasquer(canal : byte);
procedure DMA_Init_Transfer(canal,mode : byte; p : pointer; s : word);
implementation
TYPE
pt = record { Permet de traiter }
ofs,sgm : word; { simplement les pointeurs }
end;
procedure DMA_mode_def(canal,mode : byte);
begin;
port[DMAWr_Mode_Reg[canal]] := mode;
end;
procedure DMA_Normmode_def(canal,mode : byte);
begin;
port[DMAWr_Mode_Reg[canal]] := mode+Adresses_Increment+Lect_Transfer+
Autoinit_Disable+canal;
end;
procedure DMA_Clear_Flipflop(canal : byte);
begin;
port[DMAClear_Flipflop[canal]] := 0;
end;
procedure DMA_Startadresse(canal : byte; Start : pointer);
var l : longint;
pn,offs : word;
begin;
l := 16*longint(pt(Start).sgm)+pt(Start).ofs;
pn := pt(l).sgm;
offs := pt(l).ofs;
port[DMA_Adress[canal]] := lo(offs);
port[DMA_Adress[canal]] := hi(offs);
port[DMA_Lower_Page[canal]] := lo(pn);
port[DMA_Higher_Page[canal]] := hi(pn);
end;
procedure DMA_Taille_bloc(canal : byte; size : word);
begin;
DMA_Clear_Flipflop(canal);
port[DMA_Count[canal]]:= lo(size);
port[DMA_Count[canal]] := hi(size);
end;
procedure DMA_canal_Masquer(canal : byte);
begin;
port[DMAWr_single_mask_Reg[canal]] := canal + Set_Mask_Bit;
end;
procedure DMA_canal_Demasquer(canal : byte);
begin;
port[DMAWr_single_mask_Reg[canal]] := canal + Clear_Mask_Bit;
end;
procedure DMA_Init_Transfer(canal,mode : byte; p : pointer; s : word);
begin;
DMA_canal_Masquer(canal);
DMA_Startadresse(canal,p);
DMA_Taille_bloc(canal,s);
DMA_Normmode_Def(canal,mode+canal);
DMA_canal_Demasquer(canal);
end;
begin;
end.