User Tools

Site Tools


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}
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
start/eti/carte/sources/ucfgbs55.txt · Last modified: 2016/07/24 01:56 by admin