home *** CD-ROM | disk | FTP | other *** search
- 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.
-
-