start:eti:carte:sources:ucfgbs55
uCfgBs55.pas
UNIT Ucfgbs55; {----------------------------------------------------------------------------- NOM DE L'UNITE : UCFGBS55.PAS BUT : Configuration de l'adresse de base du PPI8255 et du PIT8254 AUTEUR : Stéphane Claus DATE : Décembre 1996 MODIFIE LE : 14.02.1997 - EDT:01 RAISON : Adaptation pour le choix des deux adresses simultanément: 8255 + 8254, et non pas uniquement pour le PPI8255. MODIFIE LE : 11.03.1997 - EDT:02 RAISON : - Ajouté le décodage d'adresse pour J96-J98. - Possibilité de choisir l'offset pour le PIT8254 MODIFIE LE : 12.04.1997 - EDT:03 RAISON : - Ajout de commentaires - Fusionné les procédures ChangeAdresse et ChangeAdresse2 - Correction bug dans spnbtnChangeOffsetDownClick et spnbtnChangeOffsetUpClick REMARQUES : IL DOIT Y AVOIR UN BUG LA DEDANS, OU JE N'AI PAS TOUT COMPRIS LE DECODAGE D'ADRESSES.... CAR UNE SEULE ADRESSE EST SELECTIONNABLE: 300h TOUTES LES AUTRES NE FONT PAS PARTIE DE LA PLAGE AUTORISEE ! Mais non, il n'y a pas de bug. Il faut juste rajouter le décodage possible avec J96, J97 et J98... Cf. modifs de l'EDT 02 -----------------------------------------------------------------------------} {=============================================================================} INTERFACE {============================================== I N T E R F A C E } {=============================================================================} USES SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, DigDisp, StdCtrls, Buttons, ExtCtrls, Spin; TYPE TfrmAdresseBase = CLASS(TForm) digdspTitre: TDigitalDisplay; bitbtnOK: TBitBtn; bitbtnAide: TBitBtn; bitbtnCancel: TBitBtn; grpbxSW1: TGroupBox; chkbxNotUsed1: TCheckBox; chkbxEnabled: TCheckBox; chkbxA9: TCheckBox; chkbxA8: TCheckBox; chkbxA7: TCheckBox; chkbxA6: TCheckBox; chkbxA5: TCheckBox; chkbxNotUsed3: TCheckBox; grpbxAdresse: TGroupBox; pnlAdresse8255: TPanel; lblAdresse: TLabel; grpbxEtat: TGroupBox; pnlEtat: TPanel; lblEtat: TLabel; grpbxLegende: TGroupBox; chkbxReserve: TCheckBox; chkbxOFF: TCheckBox; chkbxON: TCheckBox; grpbxJ96_J97_J98: TGroupBox; rgrpJ97: TRadioGroup; rgrpJ96: TRadioGroup; rgrpJ98: TRadioGroup; GroupBox1: TGroupBox; lblOffset: TLabel; spnbtnChangeOffset: TSpinButton; PROCEDURE ChangeAdresse(Sender: TObject); PROCEDURE bitbtnOKClick(Sender: TObject); PROCEDURE FormActivate(Sender: TObject); PROCEDURE chkbxEnabledClick(Sender: TObject); PROCEDURE spnbtnChangeOffsetDownClick(Sender: TObject); PROCEDURE spnbtnChangeOffsetUpClick(Sender: TObject); PRIVATE { Private-déclarations } PUBLIC { Public-déclarations } PROCEDURE AfficheCroixAdresse(Sender: TObject); END; {CLASS} VAR frmAdresseBase: TfrmAdresseBase; {=============================================================================} IMPLEMENTATION {================================= I M P L E M E N A T I O N } {=============================================================================} {$R *.DFM} USES Uprincpl; TYPE wbit = 0..15; VAR AdresseBaseTmp : WORD; { On récupére temporairement l'adresse du PPI 8255 pour la retravailler dans cette unité } offset8254Tmp : BYTE; { Offset temporaire entre les 2 adresses de base } FUNCTION BitSetW(W : Word; bit : wbit) : Boolean; ASSEMBLER; {----------------------------------------------------------------------------- BUT ........... : Test si un des bits et à 1 ENTREE ........ : W = Le mot qui contient un bit à tester bit = Le n° du bit à tester SORTIE ........ : TRUE = Le bit testé est à 1 FALSE = Le bit testé est à 0 EFFETS DE BORDS : -- REMARQUE(S) ... : Je ne suis pas sûr que cette fonction fonctionne sous Delphi 2.0 -----------------------------------------------------------------------------} ASM MOV CL, bit MOV BX, 1 SHL BX, CL MOV AL, 0 {positionne result à FALSE} TEST W, BX JZ @No INC AL {positionne result à TRUE} @No: END; {FUNCTION BitSetW} PROCEDURE TfrmAdresseBase.ChangeAdresse(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Modification de l'adresse de base du 8255. ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : - La propriété TAG des CheckBox chkbxA9, chkbxA8, chkbxA7, chkbxA6 et chkbxA5 est > 0. - Les CheckBox symbolisent le switch SW1 - La propriété TAG des RadioGroup rgrpJ97, rgrpJ96 et rgrpJ98 est < 0. - Ces RadioGroup symbolisent les jumpers J96 à J98 -----------------------------------------------------------------------------} VAR Adresses : STRING; { L'adresse à afficher } BEGIN {-- MAJ de l'adresse } IF Tag > 0 THEN BEGIN { Ckeck Box } IF (Sender AS TCheckBox).Checked THEN BEGIN AdresseBaseTmp := AdresseBaseTmp - (Sender AS TCheckBox).Tag; END {IF} ELSE BEGIN AdresseBaseTmp := AdresseBaseTmp + (Sender AS TCheckBox).Tag; END; {ELSE} END {IF} ELSE BEGIN IF (Sender AS TRadioGroup).ItemIndex = 0 THEN BEGIN AdresseBaseTmp := AdresseBaseTmp - Abs((Sender AS TRadioGroup).Tag); END {IF} ELSE BEGIN AdresseBaseTmp := AdresseBaseTmp + Abs((Sender AS TRadioGroup).Tag); END; {ELSE} END; {ELSE} {-- Affiche la nouvelle adresse } (* EDT:01 - Affiche les deux adresses lblAdresse.Caption := IntToHex(AdresseBaseTmp, 3) + ' h'; *) Adresses := IntToHex(AdresseBaseTmp, 3) + ' h / '; Adresses := Adresses + IntToHex(AdresseBaseTmp + offset8254Tmp, 3) + ' h'; lblAdresse.Caption := Adresses; END; {PROCEDURE ChangeAdresse} (*EDT:03 Cette procédure n'est plus utilisée. Fusionnée avec ChangeAdresse PROCEDURE TfrmAdresseBase.ChangeAdresse2(Sender: TObject); VAR Adresses : STRING; BEGIN IF (Sender AS TRadioGroup).ItemIndex = 0 THEN BEGIN AdresseBaseTmp := AdresseBaseTmp - (Sender AS TRadioGroup).Tag; END {IF} ELSE BEGIN AdresseBaseTmp := AdresseBaseTmp + (Sender AS TRadioGroup).Tag; END; {ELSE} { Affiche les nouvelles adresses } Adresses := IntToHex(AdresseBaseTmp, 3) + ' h / '; Adresses := Adresses + IntToHex(AdresseBaseTmp + offset8254Tmp, 3) + ' h'; lblAdresse.Caption := Adresses; END; {PROCEDURE ChangeAdresse2} *) PROCEDURE TfrmAdresseBase.AfficheCroixAdresse(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Affiche les croix aux bons endroits pour l'affichage de l'adresse ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : Des croix apparaissent dans les ChekBox et des points dans les RadioGroup REMARQUE(S) ... : Il faut relire à chaque fois l'adresse de base, car elle est chaque fois modifiée par "ChangeAdresse" -----------------------------------------------------------------------------} BEGIN {EDT:03 Il faut aussi lire l'adresse pour la 1ère croix} AdresseBaseTmp := frmMain.PPI8255.Adresse; chkbxA9.Checked := NOT BitSetW(AdresseBaseTmp, 9); AdresseBaseTmp := frmMain.PPI8255.Adresse; chkbxA8.Checked := NOT BitSetW(AdresseBaseTmp, 8); AdresseBaseTmp := frmMain.PPI8255.Adresse; chkbxA7.Checked := NOT BitSetW(AdresseBaseTmp, 7); AdresseBaseTmp := frmMain.PPI8255.Adresse; chkbxA6.Checked := NOT BitSetW(AdresseBaseTmp, 6); AdresseBaseTmp := frmMain.PPI8255.Adresse; chkbxA5.Checked := NOT BitSetW(AdresseBaseTmp, 5); AdresseBaseTmp := frmMain.PPI8255.Adresse; IF BitSetW(AdresseBaseTmp, 4) THEN rgrpJ97.ItemIndex := 1 ELSE rgrpJ97.ItemIndex := 0; AdresseBaseTmp := frmMain.PPI8255.Adresse; IF BitSetW(AdresseBaseTmp, 3) THEN rgrpJ96.ItemIndex := 1 ELSE rgrpJ96.ItemIndex := 0; AdresseBaseTmp := frmMain.PPI8255.Adresse; IF BitSetW(AdresseBaseTmp, 2) THEN rgrpJ98.ItemIndex := 1 ELSE rgrpJ98.ItemIndex := 0; AdresseBaseTmp := frmMain.PPI8255.Adresse; END; {PROCEDURE AfficheCroixAdresse} PROCEDURE TfrmAdresseBase.bitbtnOKClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Prend en compte l'adresse choisie par l'utilisateur ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : - Les constantes suivants sont mises à jour: base8255, offset8254, en8255_8254 - La propriété Adresse des composants PPI8255 et PIT8254 de la fiche principale frmMain sont mises à jour en fonction des variables AdresseBaseTmp et offset8254Tmp REMARQUE(S) ... : - La prise en compte de la nouvelle adresse n'est possible que s'il on est pas en mode DEBUG, càd que debugmode soit à FALSE - Si l'adresse n'est pas dans la plage $300 à $31F, elle est refusée + message d'erreur à l'utilisateur -----------------------------------------------------------------------------} VAR Msg : STRING; BEGIN IF NOT debugmode THEN BEGIN IF (((AdresseBaseTmp >= $300) AND (AdresseBaseTmp <= $31F)) AND (((AdresseBaseTmp + offset8254Tmp) >= $300) AND ((AdresseBaseTmp + offset8254Tmp) <= $31F)))THEN BEGIN {-- Réinitialisation de l'adresse de base des 8255 et 8254 } frmMain.PPI8255.Adresse := AdresseBaseTmp; frmMain.PIT8254.Adresse := AdresseBaseTmp + offset8254Tmp; base8255 := AdresseBaseTmp; offset8254 := offset8254Tmp; END {IF} ELSE BEGIN {-- Adresses choisient hors de la plage autorisée => on ne fait rien, et on signale l'erreur } Msg := 'L''adresse ' + IntToHex(AdresseBaseTmp, 3) + 'h ne fait '; Msg := Msg + 'pas partie de la plage d''adresses prévues pour les '; Msg := Msg + 'cartes prototypes (300h -> 31Fh).' + #10; Msg := Msg + 'L''adresse de base n''a pas été changée.'; {-- Affiche les croix représentant l'adresse de base (juste) } AfficheCroixAdresse(Sender); {-- Affiche la boîte de dialogue } MessageDlg(Msg, mtWarning, [mbOk, mbHelp], 21); END; {ELSE} {-- 8255 et 8254 activés ? } en8255_8254 := chkbxEnabled.Checked; END; {IF} END; {PROCEDURE bitbtnOKClick} PROCEDURE TfrmAdresseBase.FormActivate(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Initialisation des contrôles lors de l'ouverture de la fenêtre ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : - Le titre de la fenêtre est mis à jour - Sa couleur également - L'affichage des Hints est activé ou non REMARQUE(S) ... : Si l'adresse de base est actuellement hors de la plage autorisée, elle est initialisée à $300 -----------------------------------------------------------------------------} VAR Adresses : STRING; Msg : STRING; BEGIN {-- Titre de la fenêtre } Caption := Application.Title; {-- Couleur de la fenêtre } IF debugmode THEN BEGIN Color := debugcolor; pnlAdresse8255.Color := debugcolor; pnlEtat.Color := debugcolor; END {IF} ELSE BEGIN Color := clBtnFace; pnlAdresse8255.Color := clBtnFace; pnlEtat.Color := clBtnFace; END; {ELSE} {-- Affichage des Hint ? } bitbtnOK.ShowHint := affichehint; bitbtnAide.ShowHint := affichehint; bitbtnCancel.ShowHint := affichehint; spnbtnChangeOffset.ShowHint := affichehint; rgrpJ96.ShowHint := affichehint; rgrpJ97.ShowHint := affichehint; rgrpJ98.ShowHint := affichehint; chkbxA5.ShowHint := affichehint; chkbxA6.ShowHint := affichehint; chkbxA7.ShowHint := affichehint; chkbxA8.ShowHint := affichehint; chkbxA9.ShowHint := affichehint; chkbxEnabled.ShowHint := affichehint; {-- Récupère temporairement l'adresse de base du 8255 } AdresseBaseTmp := frmMain.PPI8255.Adresse; offset8254Tmp := offset8254; {-- Adresses correctes ? } IF NOT ((AdresseBaseTmp >= $300) AND (AdresseBaseTmp <= $31F)) AND (((AdresseBaseTmp + offset8254Tmp) >= $300) AND ((AdresseBaseTmp + offset8254Tmp) <= $31F)) THEN BEGIN {-- Adresse actuelle hors de la plage autorisée => on réinitialise une adresse correcte, et on le signale } Msg := 'L''adresse ' + IntToHex(AdresseBaseTmp, 3) + 'h ne fait '; Msg := Msg + 'pas partie de la plage d''adresses prévues pour les '; Msg := Msg + 'cartes prototypes (300h -> 31Fh).' + #10; Msg := Msg + 'L''adresse de base a donc été initialisée à 300h..'; {-- Affiche la boîte de dialogue } MessageDlg(Msg, mtError, [mbOk, mbHelp], 21); {-- Réinitialisation de l'adresse de base du 8255 } AdresseBaseTmp := $300; offset8254Tmp := 8; {EDT:03 Les adresses du PPI et du PIT sont réinitialisés } frmMain.PPI8255.Adresse := AdresseBaseTmp; frmMain.PIT8254.Adresse := AdresseBaseTmp + offset8254Tmp; END; {IF} { Affiche les adresses } (* EDT:01 - Affiche les deux adresses lblAdresse.Caption := IntToHex(AdresseBaseTmp, 3) + ' h'; *) Adresses := IntToHex(AdresseBaseTmp, 3) + ' h / '; Adresses := Adresses + IntToHex(AdresseBaseTmp + offset8254Tmp, 3) + ' h'; lblAdresse.Caption := Adresses; {-- PPI 8255 et PIT 8254 activés ?? } chkbxEnabled.Checked := en8255_8254; {-- Affiche les croix représentant l'adresse de base} AfficheCroixAdresse(Sender); {-- Affichage de l'offset } lblOffset.Caption := IntToHex(offset8254Tmp,2) + ' h'; END; {PROCEDURE FormActivate} PROCEDURE TfrmAdresseBase.chkbxEnabledClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Indique si le PPI 8255 et le PIT8254 sont activés. Cet affichage est réalisé quand on clique sur la CheckBox du SW 7 du Switch 1 ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : Un label est mis à jour REMARQUE(S) ... : -- -----------------------------------------------------------------------------} BEGIN IF chkbxEnabled.Checked THEN lblEtat.Caption := 'Activés' ELSE lblEtat.Caption := 'Désactivés'; END; {PROCEDURE chkbx8255EnabledClick} PROCEDURE TfrmAdresseBase.spnbtnChangeOffsetDownClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Change l'offset entre l'adresse du PPI 8255 et PIT 8254. ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : Cet offset est sélectionné sur la carte par la sortie utilisée sur IC9. Il peut être de 0 (Y0) à 28 (Y9) -----------------------------------------------------------------------------} VAR Adresses : STRING; BEGIN {EDT:03 L'incrément est de 4, et non pas 2} IF offset8254Tmp >= 4 THEN Dec(offset8254Tmp, 4); lblOffset.Caption := IntToHex(offset8254Tmp, 2) + ' h'; Adresses := IntToHex(AdresseBaseTmp, 3) + ' h / '; Adresses := Adresses + IntToHex(AdresseBaseTmp + offset8254Tmp, 3) + ' h'; lblAdresse.Caption := Adresses; END; {PROCEDURE spnbtnChangeOffsetDownClick} PROCEDURE TfrmAdresseBase.spnbtnChangeOffsetUpClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Change l'offset entre l'adresse du PPI 8255 et PIT 8254. ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : Cet offset est sélectionné sur la carte par la sortie utilisée sur IC9. Il peut être de 0 (Y0) à 28 (Y9) -----------------------------------------------------------------------------} VAR Adresses : STRING; BEGIN {EDT:03 L'incrément est de 4, et non pas 2} IF offset8254Tmp <= 24 THEN Inc(offset8254Tmp, 4); lblOffset.Caption := IntToHex(offset8254Tmp, 2) + ' h'; Adresses := IntToHex(AdresseBaseTmp, 3) + ' h / '; Adresses := Adresses + IntToHex(AdresseBaseTmp + offset8254Tmp, 3) + ' h'; lblAdresse.Caption := Adresses; END; {PROCEDURE spnbtnChangeOffsetUpClick} {=============================================================================} { INITIALISATIONS ------------------------------------------- Initialisations } {=============================================================================} INITIALIZATION END. {UNIT Ucfgbs55}
start/eti/carte/sources/ucfgbs55.txt · Last modified: 2016/07/24 01:56 by admin