home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 17
/
CD_ASCQ_17_101194.iso
/
dos
/
prg
/
mos
/
exemples
/
soft
/
ds_lib.pas
next >
Wrap
Pascal/Delphi Source File
|
1994-08-31
|
107KB
|
2,585 lines
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - DISK SPEED VERSION 1.0 - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ - UNITE PRINCIPALE - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ Coded by Zuul alias Cheveau Frédéric. ║
║ Programmé à HTS sur Turbo Pascal v7.00. ║
║ Contact me on 36.14 RTEL1 - Bal "BouFFtou". ║
╚═══════════════════════════════════════════════════════════════════════════╝}
UNIT DS_LIB; {*Nom de l'Unité*}
INTERFACE
USES ZUUL_BAS, {*Unitées Nécessaires*}
ZUUL_ASM,
ZUUL_COL,
ZUUL_TOO,
ZUUL_MSE,
ZUUL_TXT,
ZUUL_GAD,
ZUUL_DIR,
ZUUL_REQ,
ZUUL_WIN,
Crt,
Graph;
CONST Max_Mod=6; {*Nombre Maximum de Modules*}
Max_Pts=500; {*Nombre Maximum de Points Gfx*}
TYPE TWrite =Record {====== STRUCTURE MODULES ======}
Name :String; {*Nom ASCII du Module*}
FName :String[12]; {*Nom du Fichier EXE du Module*}
FPath :String[64]; {*Chemin du Fichier Module*}
Fragment :String[12]; {*Fragmenté ou Linéaire*}
Length :Longint; {*Taille du Fichier à Ecrire*}
Buffer :Longint; {*Taille du Buffer d'écriture*}
System :String[32]; {*Systeme Utilisé (DOS/BIOS...)*}
Algo :String[32]; {*Methode Utilisé (Commande Write)*}
StatusMod:String[12]; {*Internal ou External*}
Number :Byte; {*Numéro d'Ordre du Module*}
Time :Longint; {*Temps en Millisecondes du Write*}
Rate :Longint; {*Taux de Transfert (Byte/s)*}
BRate :Longint; {*Best Taux de Transfert (Byte/s)*}
WRate :Longint; {*Worse Taux de Transfert (Byte/s)*}
Comments :String[64]; {*Commentaires Eventuels*}
End;
TYPE TParam =Record {====== STRUCTURE DES PARAMETRES ======}
Length :Longint; {*Datas pour Ecriture sur DK*}
Buffer :Longint;
TMoy :Longint; {*Différents Temps*}
TBes :Longint;
TWor :Longint;
End;
Var Modules :String; {*Noms des Différents Modules*}
Qtt_Mod :Byte; {*Nombres de Modules Existants*}
T :Array[1..Max_Mod] Of TWrite;{*Tableau des Structures*}
P :Array[1..Max_Pts] Of Integer;{*Tableau des Points Gfx*}
NbModules:Byte; {*Nombre de Modules*}
Handle :Word; {*Handle du Fichier Pour ASM DOS*}
Macro :Boolean; {*Pour Aff Graphique ou non*}
Qtt_Points:Longint; {*Nombre de Points pour le Tableau*}
Max_Buffer:Integer; {*Maximum Buffer pour Abscisse Repère*}
Freq :Longint; {*Frequence du Timer en Hertz*}
PasFile :File; {*Type Pour Fichier Pascal*}
Scan,Scan1:Longint; {*Scan pour Macro*}
Step,Step1:Integer; {*Pas Buffer pour Macro*}
Ite,Ite1 :Byte; {*Nb d'Iterations pour Macro*}
Help :Boolean; {*Display Help on Gadgets*}
Drive :Shortint; {*Drive to be Writed with Tracks*}
XMin,XMax:Longint; {*Bornes Min et Max de la Courbe*}
Nb_Points:Integer; {*Nb de Points ds les Bornes*}
But_Lens :ButG; {*Bouton Lens*}
Grid :Boolean; {*Show Grid or No: True=Show*}
Del_File :Boolean; {*Delete File Test Automatiquely*}
Disp_Rate:Boolean; {*Affiche Rate Sinon Time*}
NoClear :Boolean; {*Clear Screen or No*}
DOS_Error:Word; {*Numéro de l'Erreur DOS*}
DOS_Class_Error, {*Le Pourquoi de l'Erreur*}
DOS_Correct_Error, {*Comment y Remedier*}
DOS_Local_Error:Byte; {*Sa Localisation*}
{ FWRITE.OBJ} {*Intégrer le module FWRITE en CPP*}
{ CS.LIB}
{ C0S.OBJ}
{ MATHS.LIB}
{ EMU.LIB}
{****************** PROCEDURES POUVANT ETRES APPELLEES **********************}
Procedure ERROR_09; {*Gestion des Erreurs*}
Procedure ERROR_17;
Procedure ERROR_18;
Procedure ERROR_20;
Procedure ERROR_21;
Function WARNING_14:Boolean; {*Avertissement Write in Tracks*}
Function WARNING_19:Boolean; {*Second Avertissement Write in Tracks*}
Procedure INIT_DATAS; {*Initialisation des Datas*}
Procedure PARAMETERS_MODULES; {*Definitions des Parametres*}
Procedure CONFIGURE_MODULES; {*Configurations des Modules*}
Procedure MACRO_PREFS(Var Num:Byte; W4:Win; Var Choix:Byte);{*Paramètre et Execute Macro*}
Procedure MAIN_RESULTS; {*Résultats Généraux*}
Function SELECT_DRIVE:Shortint; {*Sélectionne Drive to Write Sectors*}
Procedure OPEN_PASCAL_FILE; {*Procedures pour Pascal*}
Procedure CLOSE_PASCAL_FILE;
Procedure DELETE_PASCAL_FILE;
Procedure WRITE_PASCAL_FILE(Var NBO:Word);
Procedure OPEN_DOS_FILE; {*Procedures pour ASM - DOS*}
Procedure CREATE_DOS_FILE;
Procedure CLOSE_DOS_FILE;
Procedure DELETE_DOS_FILE;
Procedure WRITE_DOS_FILE(Var NBO:Word);
Procedure WRITE_TRACKS_I26(Var NBO:Word; NumDisk:Byte);{*Write Tracks With DOS*}
{Function WRITE_FWCPP(NBO:Integer):Integer; {*FWrite - CPP*}
Procedure DISPLAY_DOS_ERROR; {*Affiche Erreurs DOS - INT $59*}
Procedure DISPLAY_RESULTS_WRITING(Pos,It,NbO:Longint);{*Affiche Resultats Ecriture*}
Function CALC_TIME:Longint; {*Renvois Difference en MicroSec*}
Procedure INIT_TIME; {*Initialise le Temps*}
Procedure COORDONEES_REPERE(W:Win; Var X1,Y1,X2,Y2:Integer);
Procedure DRAW_REPERE(Num:Integer;W:Win);{*Affiche le Repère dans la Fenêtre*}
Procedure DRAW_COURBE(Num:Integer;W:Win);{*Affiche la Courbe*}
Procedure ZOOM_COURBE(Xa,Xb:Integer;Num:Byte;W:Win);{*Zoom sur les Points de la Courbe*}
Procedure DRAW_GRID(W:Win); {*Dessine la Grille*}
Procedure UPDATE_GRID(Num:Integer;W:Win);{*Affiche ou Sucre la Grid*}
Procedure UPDATE_ORDONEE(Num:Integer; Var W4:Win);{*Swap Beetween Time/Rate*}
Procedure UPDATE_HELP; {*Switch for Help on Gadgets*}
Procedure UPDATE_CLEAR; {*Switch for Clear Window*}
Procedure UPDATE_FILE;
Procedure AFF(Number:Byte); {*Affiche Help*}
Procedure ADD_GADGET_LENS(W:Win); {*Add Gadget Lens*}
IMPLEMENTATION
{╔═══════════════════════════════════════════════════════════════════════════╗
║ FONCTIONS GET_PROCESSOR, GET_COPRO ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: Numéro Processor/CoPro. ║
║ EXPLAIN: Renvois un Numéro correspondant au type de Processeur et Copro. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
{Function WRITE_CPP_FWRITE(NBO:Integer):Integer; External;{*Recupère le .OBJ en Asm*}
{Function WRITE_FWCPP(NBO:Integer):Integer; {*Transmet Resultat Proc*}
{Begin WRITE_FWCPP:=WRITE_CPP_FWRITE(NBO); End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - GESTION DES ERREURS PAR EZ-REQUEST - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Affiche les Erreurs par un EZ-Request. (Plusieurs Procédures). ║
╚═══════════════════════════════════════════════════════════════════════════╝}
{***************************** LIST IS EMPTY ********************************}
Procedure ERROR_01;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST', {*List is Empty*}
'MODULE LIST IS EMPTY|TRY CONFIGURE MODULES BEFORE USE US !|','_I KNOW !|',NUM);
Modules:='|'; {*Clear Module List*}
End;
{************************* MODULE LIST NOT FOUND ****************************}
Procedure ERROR_02;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'FILE ''DSMODULE.LIS'' NOT FOUND|OPERATION ABORTED !|','_I KNOW !|',NUM);
Modules:='|'; {*Clear Module List*}
End;
{********************** MODULES DATAS CAN'T BE SAVED ************************}
Procedure ERROR_03;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'CAN''T SAVE ''DSMODULE.DTA''|OPERATION ABORTED !|','_I KNOW !|',NUM);
End;
{***************** FILE BUFFER MORE LARGE THAN FILE LENGTH ******************}
Procedure ERROR_04;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'FILE BUFFER CANNOT BE HIGHTER THAN FILE LENGTH|PREVIOUS VALUE WILL BE DISPLAYED|',
'_I KNOW !|',NUM);
End;
{************************* MODULES DATAS NOT FOUND **************************}
Procedure ERROR_05;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'FILE ''DSMODULE.DTA'' NOT FOUND|OPERATION ABORTED !|','_I KNOW !|',NUM);
End;
{********************* CANNOT DELETE INTERNAL MODULES ***********************}
Procedure ERROR_06;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'CANNOT DELETE INTERNAL MODULES|OPERATION ABORTED !|','_I KNOW !|',NUM);
End;
{*********************** MAXIMUM MODULES IS REACHED *************************}
Procedure ERROR_07;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'MAXIMUM MODULES IS REACHED !|OPERATION ABORTED !|','_I KNOW !|',NUM);
End;
{************************ MODULE LIST CAN'T SAVED ***************************}
Procedure ERROR_08;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'MODULE LIS CANNOT UPDATED AND SAVED AS ''DSMODULE.LIS''|OPERATION ABORTED !|','_I KNOW !|',NUM);
End;
{************************ ERROR WRITING TEST FILE ***************************}
Procedure ERROR_09;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'TEST FILE CANNOT BE CREATED|OPERATION ABORTED !|','_I KNOW !|',NUM);
End;
{************************** FILE BUFFER TOO LARGE ***************************}
Procedure ERROR_10;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'FILE BUFFER CANNOT BE HIGHTER THAN 34464|PREVIOUS VALUE WILL BE DISPLAYED|','_I KNOW !|',NUM);
End;
{********************* CAN'T HAVE ACCESS TO POINTS FILE *********************}
Procedure ERROR_11;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'I CAN''T HAVE ACCESS TO THE FILE|OPERATION ABORTED !|','_I KNOW !|',NUM);
End;
{*********************** SIZE OR BUFFER EQUAL TO 0 !!! **********************}
Procedure ERROR_12;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'FILE SIZE OR BUFFER SIZE CANNOT BE EQUAL TO 0 |PREVIOUS VALUES WILL BE DISPLAYED|','_I KNOW !|',NUM);
End;
{******************** FILE BUFFER CANNOT HIGHER THAN 65535 ******************}
Procedure ERROR_13;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'FILE BUFFER CANNOT BE HIGHTER THAN 65535|PREVIOUS VALUE WILL BE DISPLAYED|','_I KNOW !|',NUM);
End;
{********************* BE CARREFULL - WRITTING TRACKS !!! *******************}
Function WARNING_14:Boolean; {*Avertissement Write in Tracks*}
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'*** WARNING ***||THIS MODULE WRITE TRACKS ON YOUR DISK|'+
'AND ALL YOUR FILES AND DIRECTORIES WILL BE SCRATCHED,|'+
'YOU MUST USE A TOTAL FREE PARTITION.||'+
'SHALL I CONTINUE ?|','<<< _YES >>>| _NO |',NUM);
If NUM<>1 Then WARNING_14:=False Else WARNING_14:=True;
End;
{*********************** MAXIMUM QTT POINTS IS REACHED **********************}
Procedure ERROR_15;
Var NUM:Integer;
St :String;
Begin
Str(Max_Pts,St);
EZ_REQUESTG('D-SPEED REQUEST',
'NUMBER OF POINTS TO STOCK IS TOO MUCH,|MAXIMUM = '+St+'|'+
'PLEASE CHOOSE ANOTHER VALUE FOR SCAN OR STEP|','_I KNOW !|',NUM);
End;
{***************** STEP CANNOT BE HIGHTER THAN SCAN BUFFER ******************}
Procedure ERROR_16;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'STEP SIZE CANNOT BE HIGHTER THAN SCAN SIZE|'+
'PLEASE CHOOSE ANOTHER VALUE FOR STEP|','_I KNOW !|',NUM);
End;
{********************* UNABLE TO SAVE CONFIGURATION FILE ********************}
Procedure ERROR_17;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'! DISK ERROR !|'+
'UNABLE TO SAVE CONFIGURATION FILE|','_I KNOW !|',NUM);
End;
{********************* UNABLE TO READ CONFIGURATION FILE ********************}
Procedure ERROR_18;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'! DISK ERROR !|'+
'UNABLE TO READ CONFIGURATION FILE|','_I KNOW !|',NUM);
End;
{******************* BE CARREFULL - WRITTING TRACKS II !!! ******************}
Function WARNING_19:Boolean; {*Avertissement Write in Tracks*}
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'! IT''S NOT A JOKE !|'+
'IF YOU SELECT (YES) YOUR DISK PARTITION WILL BE TOTATLY SCRACHED|'+
'IT''S THE LAST ADVERTISMENT BEFORE EXECUTION.||'+
'SHALL I REALLY CONTINUE ?|',' _YES | _NO |',NUM);
If NUM<>1 Then WARNING_19:=False Else WARNING_19:=True;
End;
{************************ FONCTION NOT IMPLEMENTED **************************}
Procedure ERROR_20;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'FUNCTION NOT IMPLEMENTED|'+
'WAIT FOR THE NEXT VERSION TO USE IT|','_I KNOW !|',NUM);
End;
{************************* MODULE NOT IMPLEMENTED ***************************}
Procedure ERROR_21;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'MODULE NOT IMPLEMENTED|'+
'PLEASE SELECT ANOTHER MODULE|','_I KNOW !|',NUM);
End;
{************************* DATA FILE UNKNOWN FORMAT *************************}
Procedure ERROR_22;
Var NUM:Integer;
Begin
EZ_REQUESTG('D-SPEED REQUEST',
'DATA FILE UNKNOWN FORMAT|'+
'IT''S NOT A (DS) DATA FILE, PLEASE SELECT ANOTHER FILE|','_I KNOW !|',NUM);
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ PROCEDURE DISPLAY_DOS_ERRORS ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure DISPLAY_DOS_ERROR;
Var St1,St2,St3,St4:String;
NUM:Integer;
Begin
Set_Pointer(P_Arrow);
Str(DOS_Error,St1); Str(DOS_Class_Error,St2);
Str(DOS_Correct_Error,St3); Str(DOS_Local_Error,St4);
EZ_REQUESTG('D-SPEED REQUEST','--- AN ERROR HAS OCCURED ---||'+
'DOS ERROR: '+St1+
'|DOS ERROR CLASS: '+St2+
'|DOS ERROR CORRECTION: '+St3+
'|DOS ERROR LOCALISATION: '+St4+'|'
,'_I KNOW |',NUM);
DOS_Error:=0; {*Set Error to 0 after Read it*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - AFFICHE L'AIDE SUR LES GADGETS - ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure AFF(Number:Byte); {*Affiche Help*}
Begin
If Help=False Then Exit; {*Pas de Help => On Sort*}
SetColor(Col15);
BEVEL(3,GetMaxY-20,636,GetMaxY-3,1,4,False,True);
Case Number of
1: DispG(20,332,Col4,'SET PARAMETERS AND EXECUTE A MACRO');
2: DispG(20,332,Col4,'EXECUTE CURRENT MACRO WITH DEFINED PARAMETERS');
3: DispG(20,332,Col4,'OPERATION CANCELED');
4: DispG(20,332,Col4,'LOAD DATAS POINTS AND DISPLAY IT IN THE GFX WINDOW');
5: DispG(20,332,Col4,'SAVE CALCULATED POINTS AS A DATA FILE');
6: DispG(20,332,Col4,'SELECT A TYPE OF REPRESENTATION');
7: DispG(20,332,Col4,'SELECT THE VARIABLE TO BE ANALYSED');
8: DispG(20,332,Col4,'DISPLAY RESULTS IN A BI-DIMENSIONAL ARRAY (DATA BASE)');
9: DispG(20,332,Col4,'DISPLAY RESULTS WITH GRAPHICAL REPRESENTATION');
10: DispG(20,332,Col4,'SHOW RESULTS OF WRITING TESTS');
11: DispG(20,332,Col4,'SHOW AND MODIFIE MODULES PARAMETERS');
12: DispG(20,332,Col4,'SELECT PATH AND NAME FOR AN EXTERNAL MODULE');
13: DispG(20,332,Col4,'EDIT COMMENTS FOR THE CURRENT MODULE (OPTIONAL)');
14: DispG(20,332,Col4,'SELECT THE MODULE TO VIEW PARAMETERS');
15: DispG(20,332,Col4,'DISPLAY MEMORY STATUS (CONVENTIONAL MEMORY, EMS, XMS), AND THE DOS VERSION');
16: DispG(20,332,Col4,'EXIT D-SPEED ??? - DON''T FORGET TO SAVE YOUR DATAS');
17: DispG(20,332,Col4,'DISPLAY THE ''ABOUT'' TEXT FOR D-SPEED v1.0');
18: DispG(20,332,Col4,'DISPLAY SOME INFO ON D-SPEED v1.0');
19: DispG(20,332,Col4,'GO TO WRITE TEST FILE WITH THE CURRENT MODULE (SEE BELOW)');
20: DispG(20,332,Col4,'TEST FILE WILL NOT BE DELETED. NOW, DEFRAG THE TEST FILE AND TRY AGAIN TEST.');
21: DispG(20,332,Col4,'SELECT THE TYPE OF REPRESENTATION (WRITING TIME OR RATE TRANSFERT)');
22: DispG(20,332,Col4,'DISPLAY OR NO INLINE HELP');
23: DispG(20,332,Col4,'DISPLAY GRID OR NO');
24: DispG(20,332,Col4,'SELECT THE CURRENT MODULE TO BE USED');
25: DispG(20,332,Col4,'SELECT YOUR COLORS IN PALETTE');
26: DispG(20,332,Col4,'SELECT YOUR FAVORITE FONT');
27: DispG(20,332,Col4,'SHOW YOUR HARDWARE CONFIGURATION');
28: DispG(20,332,Col4,'LOAD THE D-SPEED CONFIGURATION FILE');
29: DispG(20,332,Col4,'SAVE THE D-SPEED CONFIGURATION FILE');
30: DispG(20,332,Col4,'ADD OR SUB A NEW EXTERNAL MODULE AND SET PATH AND NAME FOR IT');
31: DispG(20,332,Col4,'SHOW AND MODIFIE THE M.O.S SYSTEM CONFIGURATION');
32: DispG(20,332,Col4,'SAVE THE NEW MODULES CONFIGURATION');
33: DispG(20,332,Col4,'ADD AND APPEND A NEW MODULE IN MODULE LIST');
34: DispG(20,332,Col4,'DELETE THE LAST MODULE IN THE LIST');
35: DispG(20,332,Col4,'SELECT MODULE TO MODIFIE DATAS');
36: DispG(20,332,Col4,'UNDO MODIFS AND GO BACK TO MAIN SCREEN');
37: DispG(20,332,Col4,'MODIFIE STRUCTURE OF THE GFX WINDOW');
38: DispG(20,332,Col4,'SCROLL THE LIST OF MODULES TO SHOW RESULTS');
39: DispG(20,332,Col4,'PLEASE SELECT DRIVE TO BE WRITED WITH SECTORS');
40: DispG(20,332,Col4,'ENABLE/DISABLE MULTI GRAPHICS ON GFX WINDOW');
41: DispG(20,332,Col4,'SELECT GFX BLOCK TO ZOOM');
42: DispG(20,332,Col4,'UNCLICK R.M.B HAS MADE ZOOM. USE THE ''LENS ICON'' ON TITLE WINDOW TO UNZOOM');
43: DispG(20,332,Col4,'DRAG POINTER IN WINDOW TO SHOW COORDINATES');
44: DispG(20,332,Col4,'READY...');
45: DispG(20,332,Col4,'TEST FILE WILL BE DELETED. NO DEFRAG TEST WILL BE PERFORMING');
End;
SetColor(Col0);
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - CALCULE LES COORDONEES DU REPERE - ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure COORDONEES_REPERE(W:Win; Var X1,Y1,X2,Y2:Integer);
Begin
X1:=W.X1+LaF*4+14; Y1:=W.Y2-HaF-12; {*Calcule Coordonées du Repère*}
X2:=W.X2-HaF-10; Y2:=W.Y1+HaF+20;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - ADD_GADGET_LENS - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Ajoute et Affiche le Gadget Lens dals la Fenêtre des Gfx. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure ADD_GADGET_LENS(W:Win);
Begin
If (XMin<>1) Or (XMax<>Qtt_Points) Then
Begin
W.NbGsp:=3;
ButtonG(W.X2-20*W.NbGsp,W.Y1,20,False,But_Lens,'');
But_Lens.ButSp:=10;
PutImage(W.X2-20*W.NbGsp+1,W.Y1+1,GpD^,NormalPut);
SetColor(Col0); Line(W.X2-20*W.NbGsp-1,W.Y1,W.X2-20*W.NbGsp-1,W.Y1+HaF+4);
End;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - AFFICHE LE REPERE DAND LA FENETRE GFX - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Affiche le Repère de Base dans la Fenêtre des Gfx. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure DRAW_REPERE(Num:Integer; W:Win);{*Affiche le Repère dans la Fenêtre*}
Var X1,Y1,X2,Y2:Integer; {*Coordonées du Repère*}
Px :Longint; {*Internal Var*}
PxR :Real; {*Internal Var*}
A :Longint;
St :String;
High_Point:Longint; {*Valeur du Point le Plus Elevé*}
Begin
COORDONEES_REPERE(W,X1,Y1,X2,Y2); {*Calcule Coordonée du Repère*}
SetColor(0);
High_Point:=0; {*On Recherche la Valeur Maximum*}
For A:=XMin to XMax do {*du Tableau*}
If P[A]>High_Point Then High_Point:=P[A];
If (High_Point=0) Or (Qtt_Points=0) Then
Begin Qtt_Points:=100; High_Point:=400; End;
If Disp_Rate=False Then
Begin
High_Point:=0; {*On Recherche la Valeur Maximum*}
For A:=XMin to XMax do {*Du Tableau*}
If P[A]>High_Point Then High_Point:=P[A];
If (High_Point=0) Or (Qtt_Points=0) Then
Begin Qtt_Points:=100; {*Valeurs par Défaut*}
High_Point:=700; End;
End;
HideMouse;
Line(X1,Y1,X1,Y2); {*Draw Line Horizontale du Repère*}
Line(X1,Y1,X2,Y1); {*Draw Line Verticale du Repère*}
PutImage(X2-1,Y1-6,Gp3^,NormalPut); {*draw Arrows Aux Extrémitées*}
PutImage(X1-8,Y2-11,Gp4^,NormalPut);
A:=0; {*Init Data*}
Repeat
If A Mod 10=0 Then Begin {*Draw Repère Horizontal*}
Line(X1+A*3,Y1-4,X1+A*3,Y1+4);
Px:=Round((Max_Buffer*A*3)/Abs(X2-X1));
If Px>=1024 Then Begin {*Exprime en Kb au Lieu de Byte*}
PxR:=Px/1024;
Str(PxR:3:1,St);
End
Else Str(Px,St); {*Calul Pos X*}
OutTextXY(X1+A*3-LaF-2,Y1+7,St);
End
Else Line(X1+A*3,Y1-2,X1+A*3,Y1+2);
Inc(A);
Until X1+A*3>X2;
A:=0;
Repeat
If A Mod 10=0 Then Begin {*Draw Repère Vertical*}
Line(X1-4,Y1-A*2,X1+4,Y1-A*2);
Str(Round((High_Point*A*2)/Abs(Y2-Y1)),St);{*Calul Pos Y*}
OutTextXY(X1-24-LaF,Y1-A*2-6,St);
End
Else Line(X1-2,Y1-A*2,X1+2,Y1-A*2);
Inc(A);
Until Y1-A*2<Y2;
ShowMouse;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ PROCEDURE ZOOM_COURBE ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ EXPLAIN: Zoom sur les Points de la Courbe dans la Fenêtre Gfx. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure ZOOM_COURBE(Xa,Xb:Integer; Num:Byte; W:Win);
Var X1,Y1,X2,Y2:Integer; {*Coordonées du Repère*}
Trans:Real;
OldXMin:Integer;
Begin
COORDONEES_REPERE(W,X1,Y1,X2,Y2); {*Calcule Coordonée du Repère*}
If Xa>Xb Then Exg(Xa,Xb); {*Sens du Box => Permutation*}
OldXMin:=XMin;
Trans:=(Nb_Points/(X2-X1))*Xb; XMax:=XMin+Round(Trans); {*Calcule Borne Max*}
Trans:=(Nb_Points/(X2-X1))*Xa; XMin:=XMin+Round(Trans)-1; {*Calcule Borne Min*}
If XMin<1 Then XMin:=1;
If XMax>Nb_Points+XMin-1 Then XMax:=Nb_Points+XMin-1;
If XMax<XMin Then XMax:=XMin;
If XMax-XMin<2 Then Begin XMin:=OldXMin; XMax:=XMin+1; End;
If (XMin=XMax) Or (XMax<1) Then Exit; {*Erreur de Coordonées*}
Nb_Points:=XMax-XMin+1; {*Calcul du Nombre de Points*}
{gotoxy(1,5); writeln('Xa=',Xa,' Xb=',Xb,' ');
gotoxy(1,6); writeln('XMin=',XMin,' XMax=',XMax,' ');
gotoxy(1,7); writeln('Nb_Points=',Nb_Points,' ');}
If NoClear=False Then CLEAR_WINDOW(W); {*Cls Window*}
DRAW_REPERE(Num,W); {*Affiche le Repère*}
If Grid=True Then DRAW_GRID(W); {*Affiche la Grille*}
DRAW_COURBE(Num,W); {*Affiche la Courbe*}
ADD_GADGET_LENS(W);
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ PROCEDURE DRAW_COURBE ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ EXPLAIN: Affiche à Nouveau la Courbe dans la Fenêtre Gfx. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure DRAW_COURBE(Num:Integer; W:Win);
Var Pos:Integer; {*Position dans Tableau*}
X1,Y1,X2,Y2:Integer; {*Coordonées du Repère*}
OldX,OldY:Longint; {*Anciennes Coordonées*}
Px,Py:Longint; {*Position X et Y du point*}
StockX:Real; {*Stockage Trés Long Pour Eviter Bug*}
PasX:Real; {*Pas en X*}
High_Point:Integer; {*Valeur du Point le Plus Elevé*}
IncX:Real; {*Augmentation du Pas X*}
Begin
High_Point:=0; {*On Recherche la Valeur Maximum*}
For Pos:=XMin to XMax do {*du Tableau*}
If P[Pos]>High_Point Then High_Point:=P[Pos];
Pos:=XMin; {*Xeme Elément du Tableau = First*}
If (High_Point=0) Or (Qtt_Points=0) Then Exit;
COORDONEES_REPERE(W,X1,Y1,X2,Y2); {*Calcule les Coordonées*}
X1:=X1-W.X1-1; Y1:=Y1-W.Y1-16; {*Deplace Coordonées pour Clipping*}
X2:=X2-W.X1; Y2:=Y2-W.Y1;
OldX:=X1; {*Save Olds Coordonées*}
If Disp_Rate=True Then OldY:=Y1 {*Point de Depart = Fn(Time ou Rate)*}
Else OldY:=-200;
PasX:=Abs(X2-X1)/(Nb_Points-1); {*Calcul du Pas X*}
IncX:=PasX; {*Initialisation des Incréments*}
Repeat
Px:=Round(X1+IncX); {*Calcul Position X et Y*}
StockX:=Abs(Y1-Y2+20)/High_Point;
Py:=Y1-Round(StockX*P[Pos]);
SetColor(Col13); {*Determine Couleur de Tracé*}
If (P[Pos]=0) Or (OldY=Y1) Then If Pos<>1 Then SetColor(Col9) Else
Else SetColor(Col13);
Clip_Window(ClipOn,W); {*Clipping Window On*}
Hidemouse;
Line(OldX,OldY,Px,Py); {*Draw Line*}
ShowMouse;
Clip_Window(ClipOff,W); {*Clipping Window Off*}
OldX:=Px; OldY:=Py;
Inc(Pos); {*Next Element*}
IncX:=IncX+PasX; {*Addition du Pas à L'Incrément*}
Until Pos>=XMax; {*Parcours tout le Tableau -> XMax*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - CALCULE LE TEMP EN MILLISECONDES - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Calcul du temps en DixMillisecondes entre deux Periodes Données. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure INIT_TIME;
Begin
Set_Timer(Freq); {*Initialise Timer to Freq Hertz*}
End;
Function CALC_TIME:Longint; {*Renvois Difference en MicroSec*}
Begin
CALC_TIME:=CountT; {*Transmet le Temps*}
Restore_Timer; {*Restore Normal Timer*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - CHARGEMENT DU FICHIER "DSMODULE.DTA" - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: True/False (BOOLEAN): Chargement Correctement Effectué ou pas. ║
║ EXPLAIN: Charge les Différents Modules Datas contenus dans "DSMODULE.DTA".║
╚═══════════════════════════════════════════════════════════════════════════╝}
Function LOAD_MODULES_DATAS:Boolean; {*Charges Les Datas des Modules*}
Var St :String;
Fil1:Text;
P :Byte; {*Nb De Modules Lus*}
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - ASSIGNEMENT DES DATAS DES MODULES - ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure ASSIGN_DATAS;
Var X:String; {*Trash Variable*}
Begin
Readln(Fil1,X); Readln(Fil1,X);
Readln(Fil1,T[P].Name); {*Init Labels*}
Readln(Fil1,T[P].FName);
Readln(Fil1,T[P].FPath);
Readln(Fil1,T[P].Fragment);
Readln(Fil1,T[P].Length); {*Tableau des Paramêtres*}
Readln(Fil1,T[P].Buffer);
Readln(Fil1,T[P].System);
Readln(Fil1,T[P].Algo);
Readln(Fil1,T[P].StatusMod);
Readln(Fil1,T[P].Number);
Readln(Fil1,T[P].Time);
Readln(Fil1,T[P].Rate);
Readln(Fil1,T[P].BRate);
Readln(Fil1,T[P].WRate);
Readln(Fil1,T[P].Comments); {*Read Comments*}
Readln(Fil1,X); {*Skip Blank Line*}
End;
Begin
Assign(Fil1,'DSMODULE.DTA');
{$I-}
Reset(Fil1);
{$I+}
If IOResult=0 Then {*Teste les Erreurs...*}
Begin
P:=1; {*1er Module*}
While Not Eof(Fil1) do
Begin
ASSIGN_DATAS; {*Lecture 1er Module*}
Inc(P);
End;
LOAD_MODULES_DATAS:=True; {*Loading Succesfull*}
Close(Fil1);
NbModules:=P-1; {*Nb de Modules*}
End
Else LOAD_MODULES_DATAS:=False; {*Error Loading !*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - SWITCH DE L'HELP SUR GADGETS - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ EXPLAIN: Commute l'aide sur les Gadgets. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure UPDATE_HELP;
Begin
BEVEL(3,GetMaxY-20,636,GetMaxY-3,1,4,False,True);
AFF(22); {*Help on Gadgets*}
If Help=True Then Help:=False Else Help:=True;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - SWITCH DU DELETE FILE - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ EXPLAIN: Commute le Delete File pour Defragmenter. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure UPDATE_FILE;
Begin AFF(20);
If Del_File=True Then Begin
AFF(20); Del_File:=False;
CREATE_DOS_FILE; {*Crée Fichier pour Write*}
CLOSE_DOS_FILE; {*Le Referme*}
End
Else Begin
AFF(45); Del_File:=True;
DELETE_DOS_FILE; {*Suprime Fichier car Delete*}
End;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - SWITCH DU CLEAR SUR GADGETS - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ EXPLAIN: Commute le Cls de la Fenêtre Graphique. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure UPDATE_CLEAR;
Begin
AFF(40); {*Help on Gadgets*}
If NoClear=True Then NoClear:=False Else NoClear:=True;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - INITIALISATION DES DATAS - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Initialise la Liste des Modules et Quelques Babioles. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure INIT_DATAS;
Var Fil1 :Text; {*Fichier Texte des Datas Modules*}
Code :Integer; {*Pour Conversion Val*}
NUM :Integer;
St :String;
A :Integer;
Begin
SetRGBPalette(Col9,58,12,00); {*Couleurs Modifiées*}
SetRGBPalette(Col11,46,43,40);
Qtt_Points:=100; {*Arbitraire*}
Max_Buffer:=10000; {*Taille Buffer pour Abscisse Repère*}
Grid:=True; {*Show Grid*}
Del_File:=True; {*Supression du Fichier Test en Auto*}
Disp_Rate:=True; {*Display Rate de Base*}
Freq:=1000; {*Timer de 1000 Hertz*}
Scan:=10; Scan1:=Scan; {*Scan pour Macro*}
Step:=1; Step1:=Step; {*Pas du Buffer pour Macro*}
Ite:=1; Ite1:=Ite; {*Nb d'itérations pour Macro*}
Help:=True; {*Help sur Gadgets de Base*}
NoClear:=False; {*On Clear la Gfx Window à Chaque Fois*}
XMin:=1; XMax:=100; {*Bornes Min et Max de la Courbe*}
Nb_Points:=XMax-XMin+1; {*Calcul Nb de Points*}
Assign(Fil1,'DSMODULE.LIS'); {*Try to Load "DSMODULE.LIS"*}
{$I-}
Reset(Fil1); {*Open It*}
{$I+}
Modules:=''; {*Clear Module Old List*}
Qtt_Mod:=0; {*Nombres de Modules Existants*}
If IOResult=0 Then {*Teste les Erreurs...*}
Begin
Readln(Fil1,Modules); {*Read Module Name*}
For A:=1 to Length(Modules) do
If Copy(Modules,A,1)='|' Then
Qtt_Mod:=Qtt_Mod+1; {*1 Module de Plus*}
End
Else Begin
ERROR_02; Exit; {*List Not Found...*}
End;
If LOAD_MODULES_DATAS=False Then {*Charges Les Datas des Modules*}
Begin
ERROR_05; {*Module Datas not Found*}
End;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - SAVE AND RESTORE POINTS - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Procedures de Sauvegarde et d'Ecriture des Coordonées de Points. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure SAVE_POINTS(Num:Integer; PF:String); {*Save Points*}
Var Fil1:Text;
A:Integer;
St:String;
Begin
Assign(Fil1,PF);
{$I-}
Rewrite(Fil1);
{$I+}
If IOResult=0 Then Begin
Str(T[Num].Length,St); St:='FILESIZE='+St; Writeln(Fil1,St);{*Save FileSize*}
Str(Max_Buffer,St); St:='SCAN='+St; Writeln(Fil1,St);{*Save Maximum Abscisse pour Repère*}
Str(Step,St); St:='STEP='+St; Writeln(Fil1,St); {*Step*}
Str(Ite,St); St:='PASS='+St; Writeln(Fil1,St); {*Itérations*}
Str(Num,St); St:='MODULE='+St; Writeln(Fil1,St); {*Numéro du Module*}
Str(Qtt_Points,St); St:='QTT POINTS='+St; Writeln(Fil1,St);{*Nb de Points*}
Writeln(Fil1,''); {*Ligne Vide*}
For A:=1 to Qtt_Points-1 do
Writeln(Fil1,P[A]);
Close(fil1);
End Else ERROR_11; {*Can't Save*}
End;
Procedure LOAD_POINTS(Var Num:Byte; PF:String);{*Load Points*}
Var Fil1:Text;
A,Code:Integer;
St,St0,St1,St2,St3,St4,St5:String;
Result:Integer;
Begin
Assign(Fil1,PF);
{$I-}
Reset(Fil1);
{$I+}
If IOResult=0 Then Begin
Readln(Fil1,St0); {*Read FileSize*}
If Copy(St0,1,9)<>'FILESIZE=' Then Begin {*Ce n'est pas 1 bon Fichier !*}
Max_Buffer:=0; {*Pour Indiquer une Erreur*}
ERROR_22;
Exit;
End;
St0:=Copy(St0,10,Length(St0)-9);
Readln(Fil1,St1); {*Restore Maximum Abscisse pour Repère*}
St1:=Copy(St1,6,Length(St1)-5); Val(St1,Max_Buffer,Code);
Readln(Fil1,St2); {*Step*}
St2:=Copy(St2,6,Length(St2)-5); Val(St2,Step,Code);
Readln(Fil1,St3); {*Itérations*}
St3:=Copy(St3,6,Length(St3)-5); Val(St3,Ite,Code);
Readln(Fil1,St4); {*Restore Numéro Module Utilisé*}
St4:=Copy(St4,8,Length(St4)-7); Val(St4,Num,Code);
Readln(Fil1,St5); {*Nb de Points*}
St5:=Copy(St5,12,Length(St5)-11);
Readln(Fil1,St); {*Skip Ligne Vide*}
A:=1;
While Not Eof(Fil1) do
Begin
Readln(Fil1,P[A]);
Inc(a);
End;
Close(Fil1);
Qtt_Points:=A;
EZ_REQUESTG('D-SPEED REQUEST','DATAS CORRECTLY READED,||'+
'FILE SIZE = '+St0+
'|BUFFER SCAN RANGE = 0 <-> '+St1+
'|STEP BUFFER = '+St2+
'|ITERATIONS = '+St3+
'|MODULE NUMBER = '+St4+
'|MODULE NAME = '+T[Num].Name+
'|QTT POINTS = '+St5+'|',
'_I KNOW !|',Result);
End Else ERROR_11; {*Can't Save*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - AFFICHAGE DE LA GRILLE - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Affiche la Grille dans la Fenêtre Graphique. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure DRAW_GRID(W:Win);
Var X1,Y1,X2,Y2:Integer; {*Coordonées du Repère*}
A:Integer;
Begin
Grid:=True;
COORDONEES_REPERE(W,X1,Y1,X2,Y2); {*Calcule Coordonée du Repère*}
SetColor(Col1);
HideMouse; A:=0; {*Init Data*}
Repeat
If A Mod 10=0 Then Line(X1+A*3,Y2,X1+A*3,Y1-4); {*Draw Repère Horizontal*}
Inc(A);
Until X1+A*3>X2;
A:=0;
Repeat
If A Mod 10=0 Then Line(X1+4,Y1-A*2,X2,Y1-A*2); {*Draw Repère Vertical*}
Inc(A);
Until Y1-A*2<Y2;
ShowMouse;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - AFFICHAGE OU SUPRESSION DE LA GRILLE - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Affiche ou Suprime la Grille dans la Fenêtre Graphique. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure UPDATE_GRID(Num:Integer; W:Win);
Begin
AFF(23); {*Display Help on Gadgets*}
If NoClear=False Then CLEAR_WINDOW(W); {*Redraw All*}
DRAW_REPERE(Num,W);
If Grid=True Then Grid:=False {*Grid is "Off"*}
Else Begin DRAW_GRID(W); {*Grid is "On"*}
Grid:=True; End;
DRAW_COURBE(Num,W);
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - SWAP BEETWEEN TIME/RATE - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Affiche en Ordonnée soit le Temps, soit le Taux de Transfert. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure UPDATE_ORDONEE(Num:Integer; Var W4:Win);
Var A:Integer; {*Pour la Boucle*}
Begin
AFF(21); {*Help on Gadgets*}
If Disp_Rate=False Then
Begin
Disp_Rate:=True;
RENAME_WINDOW('DRAWING TRANSFERT RATE FOR MODULE '+T[Num].Name,W4);
For A:=1 to Qtt_Points do {*Convertit Temps en Rate*}
If P[A]<>0 Then P[A]:=(Freq*(T[Num].Length Div 1024)) Div P[A];
End
Else Begin
Disp_Rate:=False;
RENAME_WINDOW('DRAWING SPEED WRITING FOR MODULE '+T[Num].Name,W4);
For A:=1 to Qtt_Points do {*Convertit Rate en Temps*}
If P[A]<>0 Then P[A]:=(Freq*(T[Num].Length Div 1024)) Div P[A];
End;
If NoClear=False Then CLEAR_WINDOW(W4); {*Redraw All*}
DRAW_REPERE(Num,W4);
If Grid=True Then DRAW_GRID(W4); {*Grid is "On"*}
DRAW_COURBE(Num,W4);
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - EXECUTION DU MODULE PASCAL - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Execute l'Ecriture par le Module PASCAL. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure OPEN_PASCAL_FILE;
Begin
Assign(PasFile,'DSTEST.BIN'); {*Try to Rewrite "DSTEST.BIN"*}
{$I-}
Rewrite(PasFile,1); {*Open It*}
{$I+}
If IOResult<>0 Then DOS_Error:=1; {*Teste les Erreurs...*}
End;
Procedure CLOSE_PASCAL_FILE; {*Ferme le Fichier PASCAL*}
Begin
Close(PasFile);
End;
Procedure DELETE_PASCAL_FILE; {*Suprime le Fichier Pascal*}
Begin
Erase(PasFile);
End;
Procedure WRITE_PASCAL_FILE(Var NBO:Word);{*Ecrit les Données*}
Var NB:Word;
Begin
BlockWrite(PasFile,NB,NBO,Nb); {*Write les Datas à Partir de "P"*}
If Nb<>NBO Then DOS_Error:=1;
NBO:=NB; {*Transmet la Taille Ecrite*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - EXECUTION DU MODULE ASM DOS - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Execute l'Ecriture par le Module ASM DOS. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
{╔═══════════════════════════════════════════════════════════════════════════╗
║ PROCEDURE GET_DOS_ERROR ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: NUM (BYTE) = Numéro de l'Erreur. ║
║ EXPLAIN: Recupere le Numéro de la Derniere Erreur Produite, ║
║ Ainsi que Diverse info à son Sujet. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure GET_DOS_ERROR; Assembler;
Asm
Push Bx
Push Ax
Mov Ah,$59
Mov Bx,$00
Int $21
Mov DOS_Error,Ax {*Numéro de l'Erreur DOS*}
Mov DOS_Class_Error,Bh {*Le Pourquoi de l'Erreur*}
Mov DOS_Correct_Error,Bl {*Comment y Remedier*}
Mov DOS_Local_Error,Ch {*Sa Localisation*}
Pop Ax
Pop Bx
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ PROCEDURE OPEN_DOS_FILE ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Ouvre en Ecriture le Fichier "DSTEST.BIN". ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure OPEN_DOS_FILE;
Begin
Asm
@START:
Jmp @BEGIN {*Skip Datas*}
@FileName: DB 'DSTEST.BIN',0 {*Path + Nom Fichier*}
@BEGIN:
Mov DOS_ERROR,0 {*Clear Var Errors Détections*}
Mov DOS_Class_Error,0
Mov DOS_Correct_Error,0
Mov DOS_Local_Error,0
Push Dx
Push Ax
Push Ds
Mov Ax,Seg @FileName
Mov Ds,Ax
Mov Dx,Offset @FileName {*Pointeur sur Nom*}
Mov Al,$02 {*Ouverture en Lecture/Ecriture*}
Mov Ah,$3D {*Only Open File With Handle*}
Int $21 {*Go !!!*}
Jnc @EXIT {*Si tout est Ok => Go to Fin*}
Mov DOS_ERROR,$-1 {*On Signale 1 Erreur à Traiter*}
@EXIT: {*The End*}
Pop Ds
Mov Handle,Ax {*Recupère le Handle*}
Pop Ax
Pop Dx
@GOTODEBUT: {*Positionnement Début Fichier*}
Push Bx
Push Cx
Push Dx
Mov Ah,$42
Mov Al,$00
Mov Bx,Handle
Mov Cx,0
Mov Dx,0
int $21 {*Go !!!*}
Pop Dx
Pop Cx
Pop Bx
End;
If DOS_ERROR<>0 Then
Begin
GET_DOS_ERROR; {*Récupère Numéro de l'Erreur*}
DISPLAY_DOS_ERROR; {*Affiche Erreur*}
End;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ PROCEDURE CREATE_DOS_FILE ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Crée et Ouvre en Ecriture le Fichier "DSTEST.BIN". ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure CREATE_DOS_FILE;
Begin
Asm
@START:
Jmp @BEGIN {*Skip Datas*}
@FileName: DB 'DSTEST.BIN',0 {*Path + Nom Fichier*}
@BEGIN:
Mov DOS_ERROR,0 {*Clear Var Errors Détections*}
Mov DOS_Class_Error,0
Mov DOS_Correct_Error,0
Mov DOS_Local_Error,0
Push Cx
Push Dx
Push Ax
Push Ds
Mov Cx,$00 {*Attribut. $00 = Archive*}
Mov Ax,Seg @FileName
Mov Ds,Ax
Mov Dx,Offset @FileName {*Pointeur sur Nom*}
Mov Ah,$3C {*Function Create File With Handle*}
Int $21 {*Create File*}
Jnc @EXIT1 {*Si tout est Ok => Go to Fin*}
Mov DOS_ERROR,$-1 {*On Signale 1 Erreur à Traiter*}
@EXIT1: {*The End*}
Pop Ds
Mov Handle,Ax {*Recupère le Handle*}
Pop Ax
Pop Dx
Pop Cx
End;
If DOS_ERROR<>0 Then
Begin
GET_DOS_ERROR; {*Récupère Numéro de l'Erreur*}
DISPLAY_DOS_ERROR; {*Affiche Erreur*}
End;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ PROCEDURE CLOSE_DOS_FILE ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Ferme le Fichier Ouvert par OPEN_DOS_FILE. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure CLOSE_DOS_FILE;
Begin
Asm
Push Bx
Mov Ah,$3E {*Function Close File*}
Mov Bx,Handle {*Handle Fichier*}
Int $21 {*Create File*}
Pop Bx
Jnc @EXIT {*Si tout est Ok => Go to Fin*}
Mov DOS_ERROR,$-1 {*On Signale 1 Erreur à Traiter*}
@EXIT: {*The End*}
End;
If DOS_ERROR<>0 Then
Begin
GET_DOS_ERROR; {*Récupère Numéro de l'Erreur*}
DISPLAY_DOS_ERROR; {*Affiche Erreur*}
End;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ PROCEDURE DELETE_DOS_FILE ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Suprime le Fichier Créé par OPEN_DOS_FILE. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure DELETE_DOS_FILE;
Begin
Asm
@START:
Jmp @BEGIN
@FileName: DB 'DSTEST.BIN',0 {*Path + Nom Fichier*}
@BEGIN:
Push Ds
Push Dx
Push Ax
Mov Ax,Seg @FileName
Mov Ds,Ax
Mov Dx,Offset @FileName {*Pointeur Path + Nom Fichier*}
Mov Ah,$41 {*Function Delete File*}
Int $21 {*Delete File*}
Pop Ax
Pop Dx
Pop Ds
Jnc @EXIT {*Si tout est Ok => Go to Fin*}
Mov DOS_ERROR,$-1 {*On Signale 1 Erreur à Traiter*}
@EXIT: {*The End*}
End;
If DOS_ERROR<>0 Then
Begin
GET_DOS_ERROR; {*Récupère Numéro de l'Erreur*}
DISPLAY_DOS_ERROR; {*Affiche Erreur*}
End;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ PROCEDURE WRITE_DOS_FILE ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Ecrit Des Données Quelconques dans le Fichier. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure WRITE_DOS_FILE(Var NBO:Word);
Var NB:Word;
Begin
NB:=NBO; {*Transmet la Taille à Ecrire*}
Asm
@BEGIN:
Push Bx
Push Ax
Push Ds
Push Cx
Mov Bx,Handle {*Handle Fichier*}
Mov Cx,NB {*Nombre d'Octets à Ecrire*}
Mov Ax,Seg @BEGIN
Mov Ds,Ax
Mov Dx,Offset @BEGIN {*Adr des Datas à Ecrire*}
Mov Ah,$40 {*Function Write in File*}
Int $21 {*Create File*}
Jnc @EXIT {*Si tout est Ok => Go to Fin*}
Mov DOS_ERROR,$-1 {*On Signale 1 Erreur à Traiter*}
@EXIT: {*The End*}
Pop Cx
Pop Ds
Mov NB,Ax {*Recupère Nb Octets Ecrits*}
Pop Ax
Pop Bx
End;
If DOS_ERROR<>0 Then
Begin
GET_DOS_ERROR; {*Récupère Numéro de l'Erreur*}
DISPLAY_DOS_ERROR; {*Affiche Erreur*}
End;
NBO:=NB; {*Renvois Nb Octets Ecrits*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - EXECUTION DU MODULE TRACK I26 - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Execute l'Ecriture par le Module Track Interruption 26. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure WRITE_TRACKS_I26(Var NBO:Word; NumDisk:Byte);
Var NbS:Longint; {*Nombre de Secteurs Calculés*}
Ite:Word; {*Nb d'itérations de 128 Secteurs à Faire*}
Rest:Word; {*Reste des Secteurs à Ecrire Aprés la Boucle*}
A :Word; {*Variable de Boucle pour Itération*}
Procedure WRITE_ASM_DOS_TRACK_REAL(NbSecteurs:Word); Assembler;
Asm {*Partie Assembleur*}
@BEGIN: Push Ax {*Sauvegarde Registres à la Con !!!*}
Push Bx
Push Cx
Push Ds
Mov Al,NumDisk {*Numéro du Disque où écrire*}
Mov Ax,Seg @BEGIN {*Adresse des Datas à écrire*}
Mov Ds,Ax
Mov Bx,Offset @BEGIN
Mov Cx,NbSecteurs {*Nombre de Secteurs à écrire*}
Mov Dx,0 {*Premier Secteur = Boot*}
Int $26 {*Appel Ecriture*}
Popf {*Désempile Flags à cause du RET et pas IRET*}
jnc @EXIT {*No Carry = Ok => go to @EXIT*}
Mov DOS_ERROR,$-1 {*On Signale une Erreur !*}
@EXIT: Pop Ax {*Restore Registres Toujours à la Con !!!*}
Pop Bx
Pop Cx
Pop Ds
End;
{**************** PROCEDURE PRINCIPALE DE CALCUL DES TRACKS *****************}
Begin
NbS:=NBO Div 1024; {*Calcul des Secteurs*}
If NBO Mod NbS<>0 Then Inc(NbS);{*Majore de 1 Secteurs Suplémentaire*}
Ite:=NbS Div 128; {*Calcul du nombre d'Itérations*}
Rest:=NbS-(Ite*128); {*Reste des Secteurs à Ecrire Aprés la Boucle*}
DOS_ERROR:=0; {*Annulation Flag d'erreur*}
If Ite=0 Then WRITE_ASM_DOS_TRACK_REAL(Rest){*Write Less Than 128 Blocks*}
Else Begin
For A:=1 to Ite do {*Boucle d'Itérations des Blocks de 128 Secteurs*}
WRITE_ASM_DOS_TRACK_REAL(128);{*Write Real Tracks per 128 Blocks long*}
WRITE_ASM_DOS_TRACK_REAL(Rest){*Write the Rest*}
End;
If DOS_ERROR<>0 Then {*Error During Writing ?*}
Begin
GET_DOS_ERROR; {*Récupère et Affiche Erreur du DOS*}
DISPLAY_DOS_ERROR;
End;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - CONFIGURATION DES PARAMETRES DES MODULES - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: FIL1 (TEXT): Fichier Texte Eventuellement Modifié. ║
║ EXPLAIN: Affiche les Datas des Différents Modules, et Permet de les Modif.║
╚═══════════════════════════════════════════════════════════════════════════╝}
{************************** AFFICHAGE DU SCREEN ****************************}
Procedure PARAMETERS_MODULES;
Var W :Win;
B0,B1,B2:ButG; {*Gadgets Buttons*}
B3 :ButG;
C1 :ButG; {*Gadget Cycler*}
Exit_Flg:Boolean;
Even :Byte; {*Evenement Fenêtre*}
DirSel :String; {*Datas Fichiers*}
FilSel :String;
FSize :Longint;
Fil1 :Text; {*Fichier Texte des Datas Modules*}
NUM :Integer;
P :Byte; {*Nb De Modules Lus*}
HasChanged:Boolean; {*Modifications Pour Sauvegarde*}
Cor1,Cor2,Cor3,Cor4,Cor5,
Cor6,Cor7,Cor8,Cor9,CorA:TCoReq;
Cin1,Cin2,Cin3,Cin4,Cin5,
Cin6,Cin7,Cin8,Cin9,CinA,
CinB,CinC,CinD:String;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - SAUVEGARDE DES DATAS DES MODULES - ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure SAVE_NEW_DATAS;
Var A:Integer;
Begin
HasChanged:=False; {*Update Has Been Made !!!*}
Assign(Fil1,'DSMODULE.DTA');
{$I-}
Rewrite(Fil1); {*Open to Write...*}
{$I+}
If IOResult=0 Then {*Teste les Erreurs...*}
Begin
For A:=1 to NbModules do
Begin
Writeln(Fil1,'************************************');
Writeln(Fil1,'');
Writeln(Fil1,T[A].Name); {*Save Labels*}
Writeln(Fil1,T[A].FName);
Writeln(Fil1,T[A].FPath);
Writeln(Fil1,T[A].Fragment);
Writeln(Fil1,T[A].Length);
Writeln(Fil1,T[A].Buffer);
Writeln(Fil1,T[A].System);
Writeln(Fil1,T[A].Algo);
Writeln(Fil1,T[A].StatusMod);
Writeln(Fil1,T[A].Number);
Writeln(Fil1,T[A].Time);
Writeln(Fil1,T[A].Rate);
Writeln(Fil1,T[A].BRate);
Writeln(Fil1,T[A].WRate);
Writeln(Fil1,T[A].Comments); {*Save Comments*}
Writeln(Fil1,''); {*Skip Blank Line*}
End;
Close(Fil1);
End
Else ERROR_03; {*Error Saving !*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - AFFICHAGE DES DATAS MODULES - ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure REDRAW_DATAS;
Begin
Cin1:=T[P].Name;
Cin2:=T[P].FName;
Cin3:=T[P].Fragment;
Str(T[P].Length,Cin4);
Str(T[P].Buffer,Cin5);
Cin6:=T[P].System;
Cin7:=T[P].Algo;
Cin8:=T[P].StatusMod;
Str(T[P].Number,Cin9);
Str(T[P].Time,CinA);
Str(T[P].Rate,CinB);
Str(T[P].BRate,CinC);
Str(T[P].WRate,CinD);
HideMouse;
Bevel(W.X1+185,W.Y1+15+HaF*1,W.X1+265,W.Y1+19+HaF*2,1,12,False,True);
Bevel(W.X1+245,W.Y1+23+HaF*2,W.X1+265,W.Y1+27+HaF*3,1,12,False,True);
Bevel(W.X1+185,W.Y1+31+HaF*3,W.X1+265,W.Y1+35+HaF*4,1,12,False,True);
Bevel(W.X1+185,W.Y1+39+HaF*4,W.X1+265,W.Y1+43+HaF*5,1,12,False,True);
Bevel(W.X1+185,W.Y1+47+HaF*5,W.X1+265,W.Y1+51+HaF*6,1,12,False,True);
Bevel(W.X1+185,W.Y1+55+HaF*6,W.X1+265,W.Y1+59+HaF*7,1,12,False,True);
DRAW_CO_REQUESTG(W.X1+15,W.Y1+15+HaF*1,79,16,6,1,Cor1,Cin1);
DRAW_CO_REQUESTG(W.X1+15,W.Y1+23+HaF*2,79,16,6,1,Cor2,Cin2);
DRAW_CO_REQUESTG(W.X1+15,W.Y1+31+HaF*3,79,16,6,1,Cor3,Cin3);
DRAW_CO_REQUESTG(W.X1+30,W.Y1+39+HaF*4,64,16,6,1,Cor4,Cin4);
DRAW_CO_REQUESTG(W.X1+30,W.Y1+47+HaF*5,64,16,6,1,Cor5,Cin5);
DRAW_CO_REQUESTG(W.X1+15,W.Y1+55+HaF*6,79,16,6,1,Cor6,Cin6);
DRAW_CO_REQUESTG(W.X1+15,W.Y1+63+HaF*7,79,16,6,1,Cor7,Cin7);
DispG(W.X1+190,W.Y1+16+HaF*1,12,Cin8);
DispG(W.X1+250,W.Y1+24+HaF*2,12,Cin9);
DispG(W.X1+190,W.Y1+32+HaF*3,12,CinA+' 1/1000s');
DispG(W.X1+190,W.Y1+40+HaF*4,12,CinB+' Kb/s');
DispG(W.X1+190,W.Y1+48+HaF*5,12,CinC+' Kb/s');
DispG(W.X1+190,W.Y1+56+HaF*6,12,CinD+' Kb/s');
ShowMouse;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - UPDATE DES DATAS DES MODULES EN MEMOIRE - ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure UPDATE_VALUES;
Var I,Code:Integer;
Save_Length, Save_Buffer:Longint; {*Save Values for UNDO*}
Begin
Save_Length:=T[P].Length; {*Save Values*}
Save_Buffer:=T[P].Buffer;
T[P].Name:=Cin1;
T[P].FName:=Cin2;
T[P].Fragment:=Cin3;
Val(Cin4,T[P].Length,Code);
Val(Cin5,T[P].Buffer,Code);
T[P].System:=Cin6;
T[P].Algo:=Cin7;
T[P].StatusMod:=Cin8;
Val(Cin9,T[P].Number,Code);
Val(CinA,T[P].Time,Code);
Val(CinB,T[P].Rate,Code);
Val(CinC,T[P].BRate,Code);
Val(CinD,T[P].WRate,Code);
If (T[P].Buffer=0)Or (T[P].Length=0) Then
Begin
ERROR_12; {*Size or Buffer = 0 !!!*}
T[P].Length:=Save_Length; {*Restore Good Values*}
T[P].Buffer:=Save_Buffer;
End;
If (T[P].Buffer>34464) And (P=3) Then {*For Asm DOS Only*}
Begin
ERROR_10; {*File Buffer too Large*}
T[P].Buffer:=Save_Buffer; {*Restore Good Value*}
End;
If T[P].Buffer>65535 Then
Begin
ERROR_13; {*File Buffer too Large*}
T[P].Buffer:=Save_Buffer; {*Restore Good Value*}
End;
If T[P].Buffer>T[P].Length Then
Begin
ERROR_04; {*File Buffer Higher Len*}
T[P].Length:=Save_Length; {*Restore Good Values*}
T[P].Buffer:=Save_Buffer;
End;
REDRAW_DATAS; {*Réaffiche le Screen*}
HasChanged:=True;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - AFFICHAGE DU SCREEN PRINCIPAL - ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure REDRAW_FRAME;
Begin
HideMouse;
Bevel(W.X1+10,W.Y1+10+HaF,W.X2-10,W.Y2-15-HaF,1,Col7,False,True);
ButtonG(W.X1+26,W.Y2-10-HaF,70,False,B0,'_OK'); {*Bouton SAVE,USE,CANCEL*}
ButtonG(W.X1+274,W.Y2-10-HaF,70,False,B1,'_CANCEL');
ButtonG(W.X1+185,W.Y2-34-HaF*1,159,False,B3,'_EDIT MODULE COMMENTS');
Cycler_But(W.X1+132,W.Y2-10-HaF,87,P,C1,Modules);
SetColor(Col0);
DispG(W.X1+100,W.Y1+16+HaF*1,7,'MODULE NAME');
ButtonG(W.X1+100,W.Y1+23+HaF*2,70,False,B2,'_FILE NAME');
DispG(W.X1+100,W.Y1+32+HaF*3,7,'FILE STATUS');
DispG(W.X1+100,W.Y1+40+HaF*4,7,'FILE LENGTH');
DispG(W.X1+100,W.Y1+48+HaF*5,7,'SIZE BUFFER');
DispG(W.X1+100,W.Y1+56+HaF*6,7,'USED SYSTEM');
DispG(W.X1+100,W.Y1+64+HaF*7,7,'ALGORITHM');
DispG(W.X1+270,W.Y1+16+HaF*1,7,'MODULE STATUS');
DispG(W.X1+270,W.Y1+24+HaF*2,7,'MODULE NUMBER');
DispG(W.X1+270,W.Y1+32+HaF*3,7,'WRITING TIME');
DispG(W.X1+270,W.Y1+40+HaF*4,7,'TRANSFERT RATE');
DispG(W.X1+270,W.Y1+48+HaF*5,7,'BEST RATE');
DispG(W.X1+270,W.Y1+56+HaF*6,7,'WORSE RATE');
REDRAW_DATAS; {*Affiche Datas Modules*}
ShowMouse;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - MODIFICATION DES COMMENTAIRES- ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure MODIF_COMMENTS;
Var NUM:Integer;
St :String;
Begin
St:=T[P].Comments;
STRING_REQUESTG('D-SPEED REQUEST',
'PLEASE MODIFIE COMMENTS FOR MODULE '''+T[P].Name+'''||PRESS ''OK'' TO CONFIRM|',
' _OK |_CANCEL|',64,390,St,NUM);
If NUM=1 Then
Begin
HasChanged:=True; {*For Save if Quit with "Ok"*}
T[P].Comments:=St; {*Modifie Comments*}
End;
End;
{***************************** MAIN PROCEDURE ******************************}
Begin
AFF(11); {*Display Help on Gadgets*}
If Modules='|'Then
Begin
ERROR_01; Exit; {*List is Empty*}
End;
INIT_WINDOW(100,70,470,148+HaF*10,$51D9,'CONFIGURATION PARAMETERS MODULES',W);
SUP_WINDOW(0,0,0,0,0,0,0,0,0,Col5,$0004,W);
If NError<>0 Then Exit; {*Erreurs Initialisations*}
P:=1; {*Premier Module*}
HasChanged:=False;
DRAW_WINDOW(W); {*Affiche Screen Principal*}
REDRAW_FRAME; {*Affiche Gadgets*}
Exit_Flg:=False;
{=== BOUCLE PRINCIPALE ===}
Repeat
If WINDOW_READY(W) Then {*Window Ok !*}
Begin
If CO_REQUESTG(Cor1,Cin1)=True Then UPDATE_VALUES;{*Co_RequestG String-Line*}
If CO_REQUESTG(Cor2,Cin2)=True Then UPDATE_VALUES;
If CO_REQUESTG(Cor3,Cin3)=True Then UPDATE_VALUES;
If CO_REQUESTG(Cor4,Cin4)=True Then UPDATE_VALUES;
If CO_REQUESTG(Cor5,Cin5)=True Then UPDATE_VALUES;
If CO_REQUESTG(Cor6,Cin6)=True Then UPDATE_VALUES;
If CO_REQUESTG(Cor7,Cin7)=True Then UPDATE_VALUES;
If GetMsg_But(B0,1)=True Then
Begin
Exit_Flg:=True;
If HasChanged=True Then
EZ_REQUESTG('D-SPEED REQUEST',
'DATAS HAS BEEN CHANGED,|SO, DO YOU WANT TO UPDATE AND SAVE DATAS ?|',
'_YES|_NO|',NUM);
If NUM=1 Then SAVE_NEW_DATAS;
End;
If GetMsg_But(B1,1)=True Then Exit_Flg:=True;
If GetMsg_But(B2,1)=True Then Begin
AFF(12); {*Display Help on Gadgets*}
GET_FILEDIR(250,50,300,'SELECT A MODULE...','_SELECT','*.*',0,DirSel,FilSel,FSize);
If FilSel<>'' Then Begin
HasChanged:=True; {*Save Modif*}
T[P].FName:=FilSel; {*Stocke New Values*}
T[P].FPath:=DirSel;
Cin2:=DirSel+FilSel; {*Transmet New Path+Name*}
DRAW_CO_REQUESTG(W.X1+15,W.Y1+23+HaF*2,79,16,6,1,Cor2,Cin2);
End;
End;
If GetMsg_But(B3,1)=True Then Begin AFF(13); MODIF_COMMENTS; End;
If GetMsg_But(C1,1)=True Then Begin AFF(14); P:=C1.CyclVal; REDRAW_DATAS; End;
End;
Even:=Active_Window(W);
If Even=9 Then REDRAW_FRAME; {*Window Re-Drawed*}
If Even=1 Then Exit_Flg:=True; {*Window Closed*}
If Even=5 Then SET_POINTER(P_Arrow); {*Pointer Arrow*}
If Even=6 Then SET_POINTER(P_Busy); {*Pointer Busy*}
Until Exit_Flg=True; {*Sortie de la Boucle*}
Kill_Window(W); {*Destroy Window*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - CONFIGURATION DES MODULES - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: FIL1 (TEXT): Fichier Texte Eventuellement Modifié. ║
║ EXPLAIN: Permet de Rajouter un Module dans la Liste des Modules. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure CONFIGURE_MODULES;
Var W :Win;
B0,B1,B2, {*Boutons Gadgets*}
B3,B4 :ButG;
C0 :ButG; {*Boutons Cycler*}
Exit_Flg:Boolean;
Even :Byte; {*Evenement Window*}
St :String; {*Pour Conversion en Strings*}
Fil1 :Text; {*Handle Fichier*}
P :Byte; {*Nb De Modules Lus*}
T :Array[1..Max_Mod] Of TWrite; {*Tableau des Structures*}
Old_Mod :String; {*Pour Save Old Module String*}
Old_Qtt :Byte; {*Pour Save Old Module Qtt*}
Cor1,Cor2,Cor3:TCoReq; {*Command RequestG*}
Cin1,Cin2,Cin3:String; {*String Pour Command RequestG*}
{**************************** REDRAW MAIN SCREEN ****************************}
Procedure REDRAW_FRAME;
Begin
HideMouse;
Bevel(W.X1+10,W.Y1+10+HaF,W.X2-10,W.Y2-15-HaF,1,Col7,False,True);
ButtonG(W.X1+60,W.Y2-10-HaF,70,False,B0,'_SAVE'); {*Boutons SAVE, CANCEL*}
ButtonG(W.X1+210,W.Y2-10-HaF,70,False,B4,'_CANCEL');
Bevel(W.X1+185,W.Y1+26+HaF*2,W.X2-20,W.Y2-22-HaF*1,1,Col11,True,True);
Bevel(W.X1+20,W.Y1+26+HaF*2,W.X1+175,W.Y2-22-HaF*1,1,Col11,True,True);
Str(Qtt_Mod,St);
ButtonG(W.X1+200,W.Y2-48-HaF*4,105,False,B3,'QTT MODULES: '+ST);
ButtonG(W.X1+200,W.Y2-40-HaF*3,105,False,B1,'_ADD MODULE');
ButtonG(W.X1+200,W.Y2-32-HaF*2,105,False,B2,'_DELETE MODULE ');
Cycler_But(W.X1+170,W.Y1+16+HaF,87,P,C0,Modules); {*Bouton Cycler*}
Cin1:=T[P].Name; {*Read Datas Values*}
Cin2:=T[P].FName;
Cin3:=T[P].FPath;
DRAW_CO_REQUESTG(W.X1+30,W.Y2-48-HaF*4,79,16,6,1,Cor1,Cin1);
DRAW_CO_REQUESTG(W.X1+30,W.Y2-40-HaF*3,79,16,6,1,Cor2,Cin2);
DRAW_CO_REQUESTG(W.X1+30,W.Y2-32-HaF*2,79,16,6,1,Cor3,Cin3);
SetColor(Col0);
DispG(W.X1+50,W.Y1+17+HaF*1,Col7,'SELECTED MODULE -->');
DispG(W.X1+115,W.Y2-47-HaF*4,Col11,'MODULE');
DispG(W.X1+115,W.Y2-39-HaF*3,Col11,'FILE NAME');
DispG(W.X1+115,W.Y2-31-HaF*2,Col11,'PATH NAME');
ShowMouse;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - CHARGEMENT DU FICHIER "DSMODULE.DTA" - ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Function LOAD_MODULES_DATAS:Boolean; {*Charges Les Datas des Modules*}
Var St:String;
A:Integer;
Begin
Assign(Fil1,'DSMODULE.DTA');
{$I-}
Reset(Fil1);
{$I+}
If IOResult=0 Then {*Teste les Erreurs...*}
Begin
P:=1; {*1er Module*}
While Not Eof(Fil1) do
Begin
Readln(Fil1,St); Readln(Fil1,St);
Readln(Fil1,T[P].Name); {*Init Labels*}
Readln(Fil1,T[P].FName);
Readln(Fil1,T[P].FPath);
For A:=1 to 13 do Readln(Fil1,St); {*Skip Some Datas Values*}
Inc(P);
End;
LOAD_MODULES_DATAS:=True; {*Loading Succesfull*}
Close(Fil1);
End
Else LOAD_MODULES_DATAS:=False; {*Error Loading !*}
End;
{************************ SAUVE LA LISTE DES MODULES ************************}
Procedure SAVE_CNF_MODULES; {*Save Liste des Modules et Datas*}
Var A:Integer;
Begin
AFF(32); {*Help on Gadgets*}
Exit_Flg:=True; {*On Sort Aprés ça !!!*}
Assign(Fil1,'DSMODULE.LIS');
{$I-}
Rewrite(Fil1);
{$I+}
If IOResult=0 Then {*Teste les Erreurs...*}
Begin
Writeln(Fil1,Modules);
Close(Fil1);
End
Else ERROR_08; {*Can't Save Module List*}
If Qtt_Mod<=3 Then Exit; {*Teste si il Existe New Modules*}
Assign(Fil1,'DSMODULE.DTA');
{$I-}
Append(Fil1); {*Open At The End of File*}
{$I+}
If IOResult=0 Then {*Teste les Erreurs...*}
Begin
For A:=4 to Qtt_Mod do
Begin
Writeln(Fil1,'************************************');
Writeln(Fil1,'');
Writeln(Fil1,T[A].Name); {*Save Labels*}
Writeln(Fil1,T[A].FName);
Writeln(Fil1,T[A].FPath);
Writeln(Fil1,'');
Writeln(Fil1,0);
Writeln(Fil1,0);
Writeln(Fil1,'');
Writeln(Fil1,'');
Writeln(Fil1,'EXTERNAL'); {*For Sure !!!*}
Writeln(Fil1,A);
Writeln(Fil1,0);
Writeln(Fil1,0);
Writeln(Fil1,0);
Writeln(Fil1,0);
Writeln(Fil1,'NO COMMENTS'); {*To be Continued...*}
Writeln(Fil1,''); {*Skip Blank Line*}
End;
Close(Fil1);
End
Else ERROR_03; {*Error Saving Modules Datas!*}
End;
{************************* UPDATE VALUES DES DATAS **************************}
Procedure UPDATE_VALUES;
Begin
T[P].Name:=Cin1; {*Stocke Valeurs*}
T[P].FName:=Cin2;
T[P].FPath:=Cin3;
REDRAW_FRAME; {*Réaffiche le Screen*}
End;
{***************** UPDATE VALUES DES DATAS ET LABEL DU MODULE ***************}
Procedure UPDATE_LABELS;
Var A:Integer;
Begin
T[P].Name:=Cin1; {*Stocke Valeur New Label*}
Modules:=''; {*Clear String Modules*}
For A:=1 to Qtt_Mod do
Begin
Modules:=Modules+T[A].Name+'|';
End;
UPDATE_VALUES;
End;
{******************************** ADD MODULE ********************************}
Procedure ADD_MODULE;
Begin
AFF(33); {*Help on Gadgets*}
If Qtt_Mod=Max_Mod Then Begin {*Max Modules is Reached !*}
ERROR_07; Exit;
End;
Inc(Qtt_Mod);
Modules:=Modules+'|'; {*1 Label de Plus*}
REDRAW_FRAME; {*Display Again Screen*}
End;
{****************************** DELETE MODULE *******************************}
Procedure DEL_MODULE;
Var A:Integer;
Begin
AFF(34); {*Help on Gadgets*}
If Qtt_Mod=3 Then Begin {*Cannot Delete Internal Modules*}
ERROR_06; Exit;
End;
Dec(Qtt_Mod);
Modules:=Copy(Modules,1,Length(Modules)-1);{*Delete Last Pipe*}
For A:=Length(Modules) DownTo 1 do {*Parcours String Modules*}
Begin
If Copy(Modules,A,1)='|' Then Begin {*Search Before Actual Module*}
Modules:=Copy(Modules,1,A); {*New String Modules*}
If Modules='' Then Modules:='|'; {*1 Module Minimum !*}
REDRAW_FRAME; {*Display Again Screen*}
Exit;
End;
End;
If Modules='' Then Modules:='|'; {*1 Module Minimum !*}
End;
{************************ RESTORE ALL BEFORE TO QUIT ************************}
Procedure RESTORE_ALL;
Begin
AFF(36); {*Help on Gadgets*}
Exit_Flg:=True;
Modules:=Old_Mod; {*Restore Modules String*}
Qtt_Mod:=Old_Qtt; {*Restore Qtt Modules*}
End;
{***************** NETTOIE TABLEAU DATAS MODULES EN MEMOIRE ******************}
Procedure CLEAR_TABLEAU_MODULES; {*Nettoie Tableau en Mémoire*}
Var A:Integer;
Begin
For A:=1 to Max_Mod do
Begin
T[A].Name:='-'; {*Clear Main Labels*}
T[A].FName:='-';
T[A].FPath:='-';
End;
End;
{*************************** PROCEDURE PRINCIPALE ***************************}
Begin
INIT_WINDOW(250,100,590,180+HaF*6,$51D9,'CONFIGURE MODULES LIST',W);
SUP_WINDOW(0,0,0,0,0,0,0,0,0,Col5,$0004,W);
If NError<>0 Then Exit; {*Erreurs Initialisations*}
CLEAR_TABLEAU_MODULES; {*Nettoie Tableau en Mémoire*}
If LOAD_MODULES_DATAS=False Then {*Charges Les Datas des Modules*}
Begin
ERROR_05; Exit; {*Module Datas not Found*}
End;
P:=1; {*Premier Module*}
DRAW_WINDOW(W);
REDRAW_FRAME; {*Affiche Gadgets*}
Old_Mod:=Modules; {*Save Modules String*}
Old_Qtt:=Qtt_Mod; {*Save Number of Modules*}
Exit_Flg:=False;
Repeat
If WINDOW_READY(W) Then {*Fenêtre Ok !*}
Begin
If GetMsg_But(B0,1)=True Then SAVE_CNF_MODULES;{*Save And Exit*}
If GetMsg_But(B1,1)=True Then ADD_MODULE; {*Add Module*}
If GetMsg_But(B2,1)=True Then DEL_MODULE; {*Sub Module*}
If GetMsg_But(B4,1)=True Then RESTORE_ALL; {*Restore All And Exit*}
If GetMsg_But(C0,1)=True Then Begin
AFF(35); P:=C0.CyclVal; REDRAW_FRAME; End; {*Cycler*}
If CO_REQUESTG(Cor1,Cin1)=True Then UPDATE_LABELS;{*Co_RequestG*}
If CO_REQUESTG(Cor2,Cin2)=True Then UPDATE_VALUES;
If CO_REQUESTG(Cor3,Cin3)=True Then UPDATE_VALUES;
End;
Even:=ACTIVE_WINDOW(W); {*Evenements Window*}
If Even=9 Then REDRAW_FRAME;
If Even=1 Then Exit_Flg:=True; {*On Sort...*}
If Even=5 Then SET_POINTER(P_Arrow); {*Pointer Arrow*}
If Even=6 Then SET_POINTER(P_Busy); {*Pointer Busy*}
Until Exit_Flg=True;
If W.Destroyed=False Then KILL_WINDOW(W); {*Destroy Window !*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - RESULTATS DE L'ECRITURE - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: It (LONGINT) = Nombres d'Itéations Necéssaire à l'Ecriture. ║
║ NbO (LONGINT) = Nombre d'Octets Réelement Ecrits. ║
║ OUT....: / Display Results. ║
║ EXPLAIN: Affiche les Resultats et Statistiques des Modules. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure DISPLAY_RESULTS_WRITING(Pos,It,NbO:Longint);
Var W :Win; {*Structure Window*}
B0 :ButG; {*Boutons Gadgets*}
Exit_Flg:Boolean;
Even :Byte; {*Evenement Window*}
Procedure REDRAW_FRAME;
Var St:String;
Begin
HideMouse;
Bevel(W.X1+10,W.Y1+10+HaF*1,W.X2-10,W.Y2-15-HaF*1,1,Col7,False,True);
Bevel(W.X1+20,W.Y1+11+HaF*2,W.X2-20,W.Y2-16-HaF*2,1,Col7,False,True);
ButtonG(((W.X1+W.X2) Div 2)-35,W.Y2-10-HaF,70,False,B0,'_I KNOW !'); {*Bouton*}
SetColor(Col15);
DispG(W.X1+66,W.Y1+15+HaF*1,7,' TEST FILE WRITED ');
SetColor(Col0);
Str(NbO,St);
DispG(W.X1+30,W.Y1+22+HaF*2,7,'NUMBER OF BYTES WRITED . '+St);
Str(It,St);
DispG(W.X1+30,W.Y1+27+HaF*3,7,'NUMBER OF ITERATIONS .... '+St);
Str(T[Pos].Time,St);
DispG(W.X1+30,W.Y1+32+HaF*4,7,'WRITING TIME (1/1000s) .. '+St);
Str(T[Pos].Rate,St);
DispG(W.X1+30,W.Y1+37+HaF*5,7,'TRANSFERT RATE (Kb/s) ... '+St);
Str(T[Pos].BRate,St);
DispG(W.X1+30,W.Y1+42+HaF*6,7,'BEST RATE (Kb/s) .......... '+St);
Str(T[Pos].WRate,St);
DispG(W.X1+30,W.Y1+47+HaF*7,7,'WORSE RATE (Kb/s) ......... '+St);
ShowMouse;
End;
{*************************** PROCEDURE PRINCIPALE ***************************}
Begin
INIT_WINDOW(250,100,490,182+HaF*9,$51D9,'WRITING RESULTS',W);
SUP_WINDOW(0,0,0,0,0,0,0,0,0,Col5,$0004,W);
If NError<>0 Then Exit; {*Erreurs Initialisations*}
DRAW_WINDOW(W);
REDRAW_FRAME; {*Affiche Gadgets*}
Exit_Flg:=False;
Repeat
If (W.FlgM=False) And (W.IDCMP And $1=$1) Then
If GetMsg_But(B0,1)=True Then Exit_Flg:=True;{*Exit*}
Even:=ACTIVE_WINDOW(W); {*Evenements Window*}
If Even=9 Then REDRAW_FRAME; {*Redraw Contents*}
If Even=1 Then Exit_Flg:=True; {*On Sort...*}
If Even=5 Then SET_POINTER(P_Arrow); {*Pointer Arrow*}
If Even=6 Then SET_POINTER(P_Busy); {*Pointer Busy*}
Until Exit_Flg=True;
If W.Destroyed=False Then KILL_WINDOW(W); {*Destroy Window !*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - CONFIGURATION DES MACROS - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Permet de Parametrer et d'Executer une Macro. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure MACRO_PREFS(Var Num:Byte; W4:Win; Var Choix:Byte);
Var W :Win;
B0,B1,B2,B3:ButG; {*Boutons Gadgets*}
C0 :ButG; {*Bouton Cycler*}
S0,S1,S2:Slide; {*Sliders Type*}
Exit_Flg:Boolean;
Even :Byte; {*Evenement Window*}
Fil1 :Text; {*Handle Fichier*}
PCycl :Byte; {*Label Actuel du Bouton Cycler*}
DirSel,FilSel:String; {*Variables pour File-Requester*}
FSize :Longint;
OldPs0,OldPs2:Word; {*Old Value -> Restoring*}
{********************* AFFICHAGE DES VALEURS DES SLIDERS ********************}
Procedure DISPLAY_VALUE_SLIDERS;
Var St:String;
A:Longint; {*Pour Transfert Temporaire*}
Begin
SetFillStyle(1,Col7);
SetColor(0);
HideMouse;
A:=S0.Psl*S0.Psl; If A>999 Then Begin A:=A Div 1024; Str(A,St); St:=St+' Kb'; End
Else Str(A,St);
Bar(W.X1+287,W.Y1+HaF*1+16,W.X1+319,W.Y1+HaF*2+17); DispG(W.X1+287,W.Y1+HaF*1+16,Col7,St);
A:=S2.Psl*S2.Psl; If A=529 Then A:=512; {*Correction*}
If A>999 Then Begin A:=A Div 1024; Str(A,St); St:=St+' Kb'; End
Else Str(A,St);
Bar(W.X1+287,W.Y1+HaF*2+26,W.X1+319,W.Y1+HaF*3+27); DispG(W.X1+287,W.Y1+HaF*2+26,Col7,St);
Str(S1.Psl,St);DispG(W.X1+287,W.Y1+HaF*3+36,Col7,St+' ');
ShowMouse;
End;
{**************************** REDRAW MAIN SCREEN ****************************}
Procedure REDRAW_FRAME;
Begin
HideMouse;
Bevel(W.X1+10,W.Y1+10+HaF,W.X2-10,W.Y2-15-HaF,1,Col7,False,True);
ButtonG(W.X1+60,W.Y2-10-HaF,70,False,B0,'_EXECUTE'); {*Boutons Gadgets*}
ButtonG(W.X1+200,W.Y2-10-HaF,70,False,B1,'_CANCEL');
ButtonG(W.X1+35,W.Y1+HaF*5+55,110,False,B2,'_LOAD POINTS');
ButtonG(W.X1+185,W.Y1+HaF*5+55,110,False,B3,'_SAVE POINTS');
Cycler_But(W.X1+97,W.Y1+45+HaF*4,180,PCycl,C0,
'TRANSFERT RATE = F(BUFFER)|TRANSFERT RATE = F(FILE SIZE)|');{*Bouton Cycler*}
Slider(W.X1+127,W.Y1+HaF*1+15,W.X1+240,0,200,20,0,True,S0,S0.Psl);
Slider(W.X1+127,W.Y1+HaF*2+25,W.X1+240,0,80,8,0,True,S2,S2.Psl);
Slider(W.X1+127,W.Y1+HaF*3+35,W.X1+240,0,112,11,0,True,S1,S1.Psl);
SetColor(Col0);
DispG(W.X1+20,W.Y1+HaF*1+16,Col7,'BUFFER SCAN RANGE');
DispG(W.X1+62,W.Y1+HaF*2+26,Col7,'STEP RANGE');
DispG(W.X1+64,W.Y1+HaF*3+36,Col7,'ITERATIONS');
DispG(W.X1+20,W.Y1+HaF*4+46,Col7,'COURBE TYPE');
DISPLAY_VALUE_SLIDERS;
ShowMouse;
End;
{*************************** PROCEDURE PRINCIPALE ***************************}
Begin
INIT_WINDOW(100,100,430,180+HaF*7,$51D9,'MACRO BOARD AND PREFERENCES',W);
SUP_WINDOW(0,0,0,0,0,0,0,0,0,Col5,$0000,W);
If NError<>0 Then Exit; {*Erreurs Initialisations*}
PCycl:=1; {*1er Label du Cycler*}
S0.Psl:=Scan1; S1.Psl:=Ite1; S2.Psl:=Step1;{*Init Valeurs Sliders*}
DRAW_WINDOW(W);
REDRAW_FRAME; {*Affiche Gadgets*}
Exit_Flg:=False;
Repeat
If WINDOW_READY(W) Then {*Fenêtre Ok !*}
Begin
If GetMsg_But(B0,1)=True Then {*Maximum Points Reached !*}
If (S0.Psl*S0.Psl) Div (S2.Psl*S2.Psl)>Max_Pts Then ERROR_15
Else Begin {*Got to draw & Exit*}
AFF(2); {*Display Help on Gadgets*}
Choix:=1; Exit_Flg:=True;
XMin:=1; XMax:=Qtt_Points; Nb_Points:=Qtt_Points;
Scan:=S0.Psl*S0.Psl; Ite:=S1.Psl; Step:=S2.Psl*S2.Psl;
If Step=529 Then Step:=512; {*Correction pour 1/2 Kb*}
End;
If GetMsg_But(B1,1)=True Then Begin {*Cancel*}
AFF(3); {*Display Help on Gadgets*}
Choix:=2; Exit_Flg:=True; End;
If GetMsg_But(B2,1)=True Then {*Load Points*}
Begin
AFF(4); {*Display Help on Gadgets*}
GET_FILEDIR(200,140,349,'SELECT A DATA POINTS FILE...','_LOAD','*.PTS',0,DirSel,FilSel,FSize);
If FilSel<>'' Then Begin
LOAD_POINTS(Num,DirSel+FilSel); {*Test if Cancel*}
If Max_Buffer<>0 Then Begin {*Pas d'Erreur de Fichier*}
Choix:=3; Exit_Flg:=True; End;
End;
End;
If GetMsg_But(B3,1)=True Then {*Save Points*}
Begin
AFF(5); {*Display Help on Gadgets*}
GET_FILEDIR(100,50,300,'PLEASE GIVE A NAME...','_SAVE','*.PTS',0,DirSel,FilSel,FSize);
If FilSel<>'' Then SAVE_POINTS(NUM,DirSel+FilSel);
End;
OldPs0:=S0.Psl; OldPs2:=S2.Psl; {*Keep Last Value -> Restoring*}
If GetMsg_But(C0,1)=True Then PCycl:=C0.CyclVal; {*Cycler*}
If GetMsg_Slider(S0,1)=True Then DISPLAY_VALUE_SLIDERS;
If GetMsg_Slider(S1,1)=True Then DISPLAY_VALUE_SLIDERS;
If GetMsg_Slider(S2,1)=True Then DISPLAY_VALUE_SLIDERS;
End;
If S0.Psl*S0.Psl < S2.Psl*S2.Psl Then
Begin ERROR_16;
Slider(W.X1+127,W.Y1+HaF*1+15,W.X1+240,0,200,20,0,True,S0,OldPs0);
Slider(W.X1+127,W.Y1+HaF*2+25,W.X1+240,0,80,8,0,True,S2,OldPs2);
DISPLAY_VALUE_SLIDERS; End;
Even:=ACTIVE_WINDOW(W); {*Evenements Window*}
If Even=9 Then REDRAW_FRAME; {*Redraw Contents*}
If Even=1 Then Begin Exit_Flg:=True; Choix:=2; End;{*On Sort...*}
If Even=5 Then SET_POINTER(P_Arrow); {*Pointer Arrow*}
If Even=6 Then SET_POINTER(P_Busy); {*Pointer Busy*}
Until Exit_Flg=True;
KILL_WINDOW(W); {*Destroy Window !*}
Scan1:=S0.Psl; Ite1:=S1.Psl; Step1:=S2.Psl;{*Save Valeurs Sliders*}
If Choix=3 Then {*Display Loaded Courbe*}
Begin
XMin:=1; XMax:=Qtt_Points; Nb_Points:=Qtt_Points;
If Disp_Rate=True
Then RENAME_WINDOW('DRAWING TRANSFERT RATE FOR MODULE '+T[Num].Name,W4)
Else RENAME_WINDOW('DRAWING SPEED WRITING FOR MODULE '+T[Num].Name,W4);
If Disp_Rate=False Then UPDATE_ORDONEE(Num,W4){*Affiche Tj le Taux*}
Else Begin
If NoClear=False Then CLEAR_WINDOW(W4); {*Cls Window*}
DRAW_REPERE(Num,W4); {*Affiche le Repère*}
If Grid=True Then DRAW_GRID(W4); {*Affiche la Grille*}
DRAW_COURBE(Num,W4); {*Affiche la Courbe*}
End;
End;
If (C0.CyclVal=2) And (Choix<>3) And (Choix<>2){*Function not Implemented*}
Then Begin ERROR_20; Choix:=2; End;
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - PROCEDURE BARS_GRAPH - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Affiche les Résultats sous forme de graphes. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure BAR_GRAPH;
Var W :Win;
B0 :ButG; {*Boutons Gadgets*}
C0,C2 :ButG; {*Boutons Cyclers*}
Exit_Flg:Boolean;
Even :Byte; {*Evènement Window*}
PCyc0,PCyc1,PCyc2:Word;
{**************************** REDRAW MAIN SCREEN ****************************}
Procedure REDRAW_FRAME;
Begin
Bevel(W.X1+10,W.Y1+10+HaF,W.X2-10,W.Y2-15-HaF,1,Col7,False,True);
HideMouse;
ButtonG(((W.X1+W.X2) Div 2)-80,W.Y2-HaF-10,160,False,B0,'_RETURN TO RESULTS MENU'); {*Boutons Gadgets*}
Cycler_But(W.X1+20,W.Y2-HaF*2-25,100,PCyc0,C0,
' BARS 3D| BARS 2D| BORDERS| DOTS| LINES| CALENDOS|'); {*Bouton Cycler*}
Cycler_But(W.X1+192,W.Y2-HaF*2-25,100,PCyc2,C2,' WRITING TIME|TRANSFERT RATE| BEST RATE| WORSE RATE|');
ShowMouse;
End;
{********************* AFFICHE LE GRAPHIQUE EN QUESTION *********************}
Procedure DRAW_GRAPHIQUE;
Const Espace=5; {*Espace Entre deux Bars*}
Var A:Integer;
XMin,XMax:Word; {*Bornes Gauches et Droites des Gfx*}
Step:Word; {*Pas = Taille d'une Barre (Exemple)*}
Top:Longint; {*Hauteur de la Barre en Pixels*}
Tet0,Tet1:Longint; {*Angles pour PieSlice*}
Color:Byte; {*Couleurs Pour PieSlice*}
MaxPara:Word; {*Paramètre Maximum en pixels*}
Pourcentage:Real; {*Paramètre Maximum en Pourcent*}
Haut,Bas:Word; {*Max Haut et Base des Graphs*}
Somme:Longint; {*Somme des Valeurs pour 1 Paramètre*}
PrevBas:Integer; {*Previous Point for Tracé lines*}
St:String; {*For Conversion ASCII*}
{******************* AFFICHE LES POURCENTAGES SUR LE GFX ********************}
Procedure DISPLAY_PERCENTAGES; {*Affiche les Pourcentages*}
Begin
Str(Round(Pourcentage),St);
St:=St+' %';
If PCyc0<5 Then
If Top+18>Bas
Then DispG(XMin+(Step Div 2)-(TextWidth(St) Div 2)+10, Top-25,Col7,St)
Else DispG(XMin+(Step Div 2)-(TextWidth(St) Div 2), Top+4,Col7,St);
If PCyc0=5 Then
DispG(XMin+(Step Div 2)-(TextWidth(St) Div 2)+2, Bas-12,Col7,St);
End;
{*************************** PROCEDURE PRINCIPALE ***************************}
Begin
XMin:=W.X1+30; XMax:=W.X2-30; {*Bornes Gauches et Droites des Gfx*}
Haut:=W.Y1+40; Bas:=W.Y2-HaF*3-34;
Step:=((XMax-XMin) Div Qtt_Mod)-Espace; {*Calcul du Pas*}
Case PCyc2 of
1: MaxPara:=T[PCyc1].Time; {*Stocke 1ere Valeur*}
2: MaxPara:=T[PCyc1].Rate;
3: MaxPara:=T[PCyc1].BRate;
4: MaxPara:=T[PCyc1].WRate;
End;
Somme:=0;
For A:=1 to Qtt_Mod do {*Cherche le Maximum du Paramètre*}
Case PCyc2 of
1: If T[A].Time>MaxPara Then MaxPara:=T[A].Time;
2: If T[A].Rate>MaxPara Then MaxPara:=T[A].Rate;
3: If T[A].BRate>MaxPara Then MaxPara:=T[A].BRate;
4: If T[A].WRate>MaxPara Then MaxPara:=T[A].WRate;
End; {*On a Récupéré la Valeur la plus Haute*}
For A:=1 to Qtt_Mod do {*Calc la Somme de toutes les Valeurs pour un Paramètre Donné*}
Case PCyc2 of
1: Somme:=Somme+T[A].Time;
2: Somme:=Somme+T[A].Rate;
3: Somme:=Somme+T[A].BRate;
4: Somme:=Somme+T[A].WRate;
End; {*On a Récupéré la Valeur la plus Haute*}
SetFillStyle(1,Col7);
HideMouse;
Bar(W.X1+11,W.Y1+11+HaF,W.X2-11,W.Y2-HaF*3-21);
Tet0:=0; {*Initialise Angle Téta à 0*}
PrevBas:=Bas; {*Pour Tracé par Lignes*}
For A:=1 to Qtt_Mod do
Begin
Str(A,St); St:='MOD '+St;
If PCyc0<>6 Then {*Display Number Module*}
DispG(XMin+(Step Div 2)-(TextWidth(St) Div 2)+3, Bas+4,Col7,St);
SetFillStyle(1,13);
Case PCyc2 of {*Calcul du Haut des Barres (en %)*}
1:Pourcentage:=(100*T[A].Time) / MaxPara;
2:Pourcentage:=(100*T[A].Rate) / MaxPara;
3:Pourcentage:=(100*T[A].BRate) / MaxPara;
4:Pourcentage:=(100*T[A].WRate) / MaxPara;
End;
Top:=Round(Haut+(Bas-Haut)-((Bas-Haut)*Pourcentage)/100);{*Calcul du Haut des Barres (Pixels)*}
Case PCyc0 of
1: Bar3D(XMin,Top,XMin+Step,Bas,(Step+1) Div 4,TopOn);{*Bars 3D*}
2: Bar(XMin,Top,XMin+Step,Bas); {*Bars 2D*}
3: Rectangle(XMin,Top,XMin+Step,Bas);{*Rectangle*}
4: Begin SetFillStyle(9,13);
Bar (XMin,Top,XMin+Step,Bas); {*Dots*}
Rectangle(XMin,Top,XMin+Step,Bas);
SetFillStyle(1,13);
End;
5: Begin {*Lines*}
If A=1 Then Line(XMin,PrevBas,XMin+(Step+Espace) Div 2,Top);
If A=Qtt_Mod Then Line(XMin+(Step+Espace) Div 2,Top,XMax-2,Bas);
If A<>1 Then Line(XMin-(Step+Espace) Div 2,PrevBas,XMin+(Step+Espace) Div 2,Top);
Line(XMin+(Step+Espace) Div 2,Bas,XMin+(Step+Espace) Div 2,Top);
Line(XMin,Bas,XMax-Espace+2,Bas);
PrevBas:=Top;
End;
6: Begin {*PieSlice = Calendos*}
Color:=12+A;
If Color=16 Then Color:=Color+1;
SetFillStyle(1,Color);
Case PCyc2 of {*Récupère Valeur en Fn du Paramètre*}
1:Pourcentage:=(100*T[A].Time) / Somme;
2:Pourcentage:=(100*T[A].Rate) / Somme;
3:Pourcentage:=(100*T[A].BRate) / Somme;
4:Pourcentage:=(100*T[A].WRate) / Somme;
End;
Tet1:=Round(Tet0+(360*Pourcentage)/100);{*Calcule Nouvel Angle*}
If Tet1>360 Then Tet1:=360;
If Tet0>=360 Then Begin ShowMouse; Exit; End; {*Pas de Draw*}
If (A=Qtt_Mod) And (Tet1<360) Then Tet1:=360;
SetColor(Col0);
PieSlice(W.X1+96,W.Y1+86,Tet0,Tet1,72);
Tet0:=Tet1;
Bevel(W.X1+185, W.Y1+15+A*5+(HaF+3)*A, W.X1+220, W.Y1+10+(A+1)*5+(HaF+3)*(A+1),1,Color,False,True);
SetColor(Col0);
DispG(W.X1+230, W.Y1+16+A*5+(HaF+3)*A, 7,T[A].Name);
Str(Round(Pourcentage),St); St:=St+' %';
DispG(W.X1+190, W.Y1+16+A*5+(HaF+3)*A, Color,St);
SetFillStyle(1,13);
End;
End;
DISPLAY_PERCENTAGES; {*Affiche les Pourcentages*}
XMin:=XMin+Step+Espace; {*Incrément du Pas*}
End;
ShowMouse;
End;
{*************************** PROCEDURE PRINCIPALE ***************************}
Begin
AFF(9); {*Display Help on Gadgets*}
INIT_WINDOW(170,120,500,140+150+HaF*3,$51D9,'GRAPHICAL REPRESENTATION',W);
SUP_WINDOW(0,0,0,0,0,0,0,0,0,Col5,$0000,W);
If NError<>0 Then Exit; {*Erreurs Initialisations*}
DRAW_WINDOW(W);
PCyc0:=1; {*Init Valeurs Cyclers*}
PCyc1:=1;
PCyc2:=2;
REDRAW_FRAME; {*Affiche Gadgets*}
DRAW_GRAPHIQUE; {*Affiche le Graphique Concerné*}
Exit_Flg:=False;
Repeat
If WINDOW_READY(W) Then {*Fenêtre Ok !*}
Begin
If GetMsg_But(B0,1)=True Then Exit_Flg:=True;{*Exit*}
If GetMsg_But(C0,1)=True Then Begin {*Cycler Forme de Représentations*}
PCyc0:=C0.CyclVal; AFF(6);
DRAW_GRAPHIQUE; End;
If GetMsg_But(C2,1)=True Then Begin {*Cycler Variable*}
PCyc2:=C2.CyclVal; AFF(7);
DRAW_GRAPHIQUE; End;
End;
Even:=ACTIVE_WINDOW(W); {*Evenements Window*}
If Even=9 Then Begin REDRAW_FRAME; {*Redraw Contents*}
DRAW_GRAPHIQUE; End;
If Even=1 Then Exit_Flg:=True; {*On Sort...*}
If Even=5 Then SET_POINTER(P_Arrow); {*Pointer Arrow*}
If Even=6 Then SET_POINTER(P_Busy); {*Pointer Busy*}
Until Exit_Flg=True;
KILL_WINDOW(W); {*Destroy Window !*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - PROCEDURE STATISTICS - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Affiche les Résultats sous forme de Chiffres. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure STATISTICS;
Var W :Win;
B0 :ButG; {*Boutons Gadgets*}
S0 :Slide; {*Slider*}
Exit_Flg:Boolean;
Even :Byte; {*Evènement Window*}
PCyc0,PCyc1,PCyc2:Word;
{**************************** REDRAW MAIN SCREEN ****************************}
Procedure REDRAW_FRAME;
Var A:Byte;
St:String;
MTime,MRate,MBRate,MWRate:Longint; {*Stockage des Moyennes*}
TV:Longint; {*Variable pour Calcul*}
Begin
Bevel(W.X1+10,W.Y1+10+HaF,W.X2-10,W.Y2-15-HaF,1,Col7,False,True);
HideMouse;
ButtonG(((W.X1+W.X2) Div 2)-80,W.Y2-HaF-10,160,False,B0,'_RETURN TO RESULTS MENU'); {*Boutons Gadgets*}
Slider(W.X2-38,W.Y1+HaF*1+15,0,W.Y2-HaF*1-52,100,15,1,True,S0,S0.Psl);
MTime:=0; MRate:=0; MBRate:=0; MWRate:=0;
For A:=1 to 4 do {*Affiche Box et Tableau Design*}
Begin
Bevel(W.X1+35+A*95,W.Y1+15+HaF*1,W.X1+120+A*95,W.Y1+30+HaF*1,1,Col11,False,True);
Bevel(W.X1+35+A*95,W.Y1+30+HaF*1,W.X1+78+A*95,W.Y1+45+HaF*1,1,Col5,False,True);
Bevel(W.X1+79+A*95,W.Y1+30+HaF*1,W.X1+120+A*95,W.Y1+45+HaF*1,1,Col5,False,True);
SetColor(Col0); DispG(W.X1+88+A*95,W.Y1+32+HaF*1,Col5,'PERC');
SetColor(Col0); DispG(W.X1+40+A*95,W.Y1+32+HaF*1,Col5,'Kb/Sec');
MTime:=MTime+T[A].Time;
MRate:=MRate+T[A].Rate;
MBRate:=MBRate+T[A].BRate;
MWRate:=MWRate+T[A].WRate;
End;
MTime:=MTime Div Qtt_Mod; {*Calcul des Moyennes*}
MRate:=MRate Div Qtt_Mod;
MBRate:=MBRate Div Qtt_Mod;
MWRate:=MWRate Div Qtt_Mod;
For A:=1 to 4 do {*Affiche Box et Tableau Design*}
Begin
Case A of {*Affiche Moyennes*}
1: Str(MTime,St);
2: Str(MRate,St);
3: Str(MBRate,St);
4: Str(MWRate,St);
End;
Bevel(W.X1+35+A*95,W.Y1+70+HaF*6,W.X1+120+A*95,W.Y1+85+HaF*6,1,Col11,False,True);
SetColor(Col0); St:='MOY = '+St;
DispG(W.X1+77+A*95-TextWidth(St) Div 2,W.Y1+72+HaF*6,Col11,St);
End;
SetColor(Col0); DispG(W.X1+39+95,W.Y1+32+HaF*1,Col5,'1/1000');
DispG(W.X1+49+95,W.Y1+17+HaF,Col11,'WRITE TIME');
DispG(W.X1+162+95,W.Y1+17+HaF,Col11,'RATE');
DispG(W.X1+242+95,W.Y1+17+HaF,Col11,'BEST RATE');
DispG(W.X1+333+95,W.Y1+17+HaF,Col11,'WORSE RATE');
For A:=1 to Qtt_Mod do
Begin
Bevel(W.X1+20,W.Y1+40+A*8+HaF*A,W.X1+115,W.Y1+55+A*8+HaF*A,1,Col12,False,True);
SetColor(Col0); DispG(W.X1+33,W.Y1+42+A*8+HaF*A,Col12,T[A].Name);
Bevel(W.X1+35+95,W.Y1+40+A*8+HaF*A,W.X1+78+95,W.Y1+55+A*8+HaF*A,1,Col7,False,True);
Str(T[A].Time,St); SetColor(Col0); DispG(W.X1+57-TextWidth(St) Div 2+95,W.Y1+42+A*8+HaF*A,Col7,St);
Bevel(W.X1+35+95*2,W.Y1+40+A*8+HaF*A,W.X1+78+95*2,W.Y1+55+A*8+HaF*A,1,Col7,False,True);
Str(T[A].Rate,St); SetColor(Col0); DispG(W.X1+57-TextWidth(St) Div 2+95*2,W.Y1+42+A*8+HaF*A,Col7,St);
Bevel(W.X1+35+95*3,W.Y1+40+A*8+HaF*A,W.X1+78+95*3,W.Y1+55+A*8+HaF*A,1,Col7,False,True);
Str(T[A].BRate,St); SetColor(Col0); DispG(W.X1+57-TextWidth(St) Div 2+95*3,W.Y1+42+A*8+HaF*A,Col7,St);
Bevel(W.X1+35+95*4,W.Y1+40+A*8+HaF*A,W.X1+78+95*4,W.Y1+55+A*8+HaF*A,1,Col7,False,True);
Str(T[A].WRate,St); SetColor(Col0); DispG(W.X1+57-TextWidth(St) Div 2+95*4,W.Y1+42+A*8+HaF*A,Col7,St);
Bevel(W.X1+79+95,W.Y1+40+A*8+HaF*A,W.X1+120+95,W.Y1+55+A*8+HaF*A,1,Col7,False,True);
TV:=(T[A].Time*100) Div MTime; If TV<100 Then Begin Str(100-TV,St); St:='-'+St; End
Else Begin Str(TV-100,St); St:='+'+St; End;
SetColor(Col0); DispG(W.X1+100-TextWidth(St) Div 2+95,W.Y1+42+A*8+HaF*A,Col7,St);
Bevel(W.X1+79+95*2,W.Y1+40+A*8+HaF*A,W.X1+120+95*2,W.Y1+55+A*8+HaF*A,1,Col7,False,True);
TV:=(T[A].Rate*100) Div MRate; If TV<100 Then Begin Str(100-TV,St); St:='-'+St; End
Else Begin Str(TV-100,St); St:='+'+St; End;
SetColor(Col0); DispG(W.X1+100-TextWidth(St) Div 2+95*2,W.Y1+42+A*8+HaF*A,Col7,St);
Bevel(W.X1+79+95*3,W.Y1+40+A*8+HaF*A,W.X1+120+95*3,W.Y1+55+A*8+HaF*A,1,Col7,False,True);
TV:=(T[A].BRate*100) Div MBRate; If TV<100 Then Begin Str(100-TV,St); St:='-'+St; End
Else Begin Str(TV-100,St); St:='+'+St; End;
SetColor(Col0); DispG(W.X1+100-TextWidth(St) Div 2+95*3,W.Y1+42+A*8+HaF*A,Col7,St);
Bevel(W.X1+79+95*4,W.Y1+40+A*8+HaF*A,W.X1+120+95*4,W.Y1+55+A*8+HaF*A,1,Col7,False,True);
TV:=(T[A].WRate*100) Div MWRate; If TV<100 Then Begin Str(100-TV,St); St:='-'+St; End
Else Begin Str(TV-100,St); St:='+'+St; End;
SetColor(Col0); DispG(W.X1+100-TextWidth(St) Div 2+95*4,W.Y1+42+A*8+HaF*A,Col7,St);
End;
ShowMouse;
End;
{*************************** PROCEDURE PRINCIPALE ***************************}
Begin
AFF(8); {*Display Help on Gadgets*}
INIT_WINDOW(50,120,600,140+65+HaF*(5+Qtt_Mod),$51D9,'STATISTICAL REPRESENTATION',W);
SUP_WINDOW(0,0,0,0,0,0,0,0,0,Col5,$0000,W);
If NError<>0 Then Exit; {*Erreurs Initialisations*}
DRAW_WINDOW(W);
S0.Psl:=1; {*Init Valeurs Slider*}
REDRAW_FRAME; {*Affiche Gadgets*}
Exit_Flg:=False;
Repeat
If WINDOW_READY(W) Then {*Fenêtre Ok !*}
Begin
If GetMsg_But(B0,1)=True Then Exit_Flg:=True;{*Exit*}
If GetMsg_Slider(S0,1)=True Then AFF(38);{*Aff Help*}
End;
Even:=ACTIVE_WINDOW(W); {*Evenements Window*}
If Even=9 Then REDRAW_FRAME; {*Redraw Contents*}
If Even=1 Then Exit_Flg:=True; {*On Sort...*}
If Even=5 Then SET_POINTER(P_Arrow); {*Pointer Arrow*}
If Even=6 Then SET_POINTER(P_Busy); {*Pointer Busy*}
Until Exit_Flg=True;
KILL_WINDOW(W); {*Destroy Window !*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - PROCEDURE MAIN_RESULTS - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: / ║
║ EXPLAIN: Affiche et Gère le Menu principal pour les Results. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Procedure MAIN_RESULTS; {*Résultats Généraux*}
Var W :Win;
B0,B1,B2:ButG; {*Boutons Gadgets*}
Exit_Flg:Boolean;
Even :Byte; {*Evenement Window*}
{**************************** REDRAW MAIN SCREEN ****************************}
Procedure REDRAW_FRAME;
Begin
Bevel(W.X1+10,W.Y1+10+HaF,W.X2-10,W.Y2-15-HaF,1,Col7,False,True);
HideMouse;
ButtonG(W.X1+20,W.Y1+HaF+15,80,False,B0,'_BARS GRAPH'); {*Boutons Gadgets*}
ButtonG(W.X1+110,W.Y1+HaF+15,80,False,B1,'_STATISTICS');
ButtonG(W.X1+30,W.Y2-HaF-10,150,False,B2,'_RETURN TO MAIN MENU');
ShowMouse;
End;
{*************************** PROCEDURE PRINCIPALE ***************************}
Begin
AFF(10); {*Display Help on Gadgets*}
If Modules='|'Then Begin ERROR_01; Exit; End; {*List is Empty*}
INIT_WINDOW(100,90,310,130+HaF*3,$51D9,'SELECT TYPE OF RESULTS...',W);
SUP_WINDOW(0,0,0,0,0,0,0,0,0,Col5,$0000,W);
If NError<>0 Then Exit; {*Erreurs Initialisations*}
DRAW_WINDOW(W);
REDRAW_FRAME; {*Affiche Gadgets*}
Exit_Flg:=False;
Repeat
If WINDOW_READY(W) Then {*Fenêtre Ok !*}
Begin
If GetMsg_But(B0,1)=True Then BAR_GRAPH; {*Résultats sous Formes de Graphes*}
If GetMsg_But(B1,1)=True Then STATISTICS;{*Résultats sous Formes de Chiffres*}
If GetMsg_But(B2,1)=True Then Exit_Flg:=True;{*Exit*}
End;
Even:=ACTIVE_WINDOW(W); {*Evenements Window*}
If Even=9 Then REDRAW_FRAME; {*Redraw Contents*}
If Even=1 Then Exit_Flg:=True; {*On Sort...*}
If Even=5 Then SET_POINTER(P_Arrow); {*Pointer Arrow*}
If Even=6 Then SET_POINTER(P_Busy); {*Pointer Busy*}
Until Exit_Flg=True;
KILL_WINDOW(W); {*Destroy Window !*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ - FUNCTION SELECT_DRIVE - ║
╠═══════════════════════════════════════════════════════════════════════════╣
║ IN.....: / ║
║ OUT....: Num (BYTE) : ║
║ EXPLAIN: Demande la Selection d'une unité de Disque. ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Function SELECT_DRIVE:Shortint; {*Sélectionne Drive to Write Sectors*}
Var W :Win;
B0 :ButG; {*Bouton Gadget*}
C0 :ButG; {*Bouton Cycler*}
Exit_Flg:Boolean;
Even :Byte; {*Evenement Window*}
{**************************** REDRAW MAIN SCREEN ****************************}
Procedure REDRAW_FRAME;
Begin
Bevel(W.X1+10,W.Y1+10+HaF,W.X2-10,W.Y2-15-HaF,1,Col7,False,True);
ButtonG(((W.X1+W.X2) Div 2)-55,W.Y2-HaF-10,110,False,B0,'_GO TO WRITE'); {*Bouton Gadget*}
Cycler_But(W.X1+105,W.Y1+HaF*2+25,63,C0.CyclVal,C0,' DISK A:| DISK B:| HD C:| HD D:|');
DispG(W.X1+28,W.Y1+HaF+15,Col7,'PLEASE SELECT DRIVE UNIT TO WRITE TRACKS');
End;
{*************************** PROCEDURE PRINCIPALE ***************************}
Begin
AFF(39); {*Display Help on Gadgets*}
INIT_WINDOW(190,90,480,140+HaF*4,$51D9,'SELECT DRIVE...',W);
SUP_WINDOW(0,0,0,0,0,0,0,0,0,Col5,$0000,W);
If NError<>0 Then Exit; {*Erreurs Initialisations*}
C0.CyclVal:=4;
DRAW_WINDOW(W);
REDRAW_FRAME; {*Affiche Gadgets*}
Exit_Flg:=False;
Repeat
If WINDOW_READY(W) Then {*Fenêtre Ok !*}
Begin
If GetMsg_But(B0,1)=True Then Exit_Flg:=True;{*Résultats sous Formes de Graphes*}
If GetMsg_But(C0,1)=True Then Else; {*Cycler Gadget*}
End;
Even:=ACTIVE_WINDOW(W); {*Evenements Window*}
If Even=9 Then REDRAW_FRAME; {*Redraw Contents*}
If Even=1 Then Exit_Flg:=True; {*On Sort...*}
If Even=5 Then SET_POINTER(P_Arrow); {*Pointer Arrow*}
If Even=6 Then SET_POINTER(P_Busy); {*Pointer Busy*}
Until Exit_Flg=True;
KILL_WINDOW(W); {*Destroy Window !*}
SELECT_DRIVE:=C0.CyclVal-1; {*Renvois Valeur du Drive*}
If Even=1 Then SELECT_DRIVE:=-1; {*Annulation*}
End;
{╔═══════════════════════════════════════════════════════════════════════════╗
║ CODE UNITE PRINCIPALE ║
╚═══════════════════════════════════════════════════════════════════════════╝}
Begin
End.