Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   assembler Sprungbefehle (https://www.delphipraxis.net/207948-assembler-sprungbefehle.html)

JJFCNC 19. Mai 2021 15:27

assembler Sprungbefehle
 
Hi Guy's

wer kann helfen, bei "JL @ELSE_b" wird falsch ausgwertet, warum ?

thanks.

Delphi-Quellcode:
procedure TFanucForm.NC_programm;
const
  hundert: double      = 100;
  halbieren_asm: double = 2;
var
  nZaehler   : integer;
  int        : ^integer;
  liste      : TStringList;
  D_Ist      : double;
  D_von      : double;
  D_bis      : double;
  AP         : double;
  ersteRate  : double;
  Rate       : double;
  H          : double;
  apX        : double;
  apMin      : double;
  Summe      : double;
  ergebnis_asm: double;
begin
  int     := @nZaehler;
  Abbruch := false;
  nZaehler := 0;
  H       := 0;
  apX     := 0;
  D_Ist   := 0;
  Summe   := 0;

  try
    D_von    := StrToFloat(EditTextToString(MinEdit).Replace(#46, #44));
    D_bis    := StrToFloat(EditTextToString(MaxEdit).Replace(#46, #44));
    AP       := StrToFloat(EditTextToString(APEdit).Replace(#46, #44));
    ersteRate := StrToFloat(EditTextToString(ersteRateEdit).Replace(#46, #44));
    ersteRate := ersteRate / hundert;
    Rate     := StrToFloat(EditTextToString(RateEdit).Replace(#46, #44));
    Rate     := Rate / hundert;
    apMin    := StrToFloat(EditTextToString(APMinEdit).Replace(#46, #44));
  except
    exit;
  end;

  if not((D_bis > 0) or (D_von > 0))
  then
    exit
  else if (D_von = D_bis)
  then
    exit
  else if not(AP > 0)
  then
    begin
      ShowMessage('Schnitttiefe <ap> kann nicht berechnet werden.');
      exit;
    end
  else if not(apMin > 0)
  then
    begin
      ShowMessage('mind. Schnitttiefe <apMin> kann nicht berechnet werden.');
      exit;
    end
  else if (AP < apMin)
  then
    begin
      ShowMessage('Schnitttiefe <ap> kleiner als mind. Schnitttiefe <apMin>.');
      exit;
    end
  else if not(Rate > 0)
  then
    begin
      ShowMessage('Zustellung Rate <%> kann nicht berechnet werden.');
      exit;
    end
  else if not(ersteRate > 0)
  then
    begin
      ShowMessage('1. Zustellung Rate <&> kann nicht berechnet werden.');
      exit;
    end;

  if (D_bis > D_von)
  then
    bearbeitung.innen := true;

  if (D_von > D_bis)
  then
    bearbeitung.aussen := true;

  liste := TStringList.Create;

  SetLength(
    data1,
    3);

  repeat
    case (bearbeitung.innen) of
      true:
        begin
          case (int^) of
            0:
              begin
                asm
                  INC nZaehler
                  JMP @START
                @START:
                  FLD D_bis          // ST(0) = D_bis
                  FSUB D_von         // ST(0) = ST(0) - D_von
                  FDIV halbieren_asm // ST(0) = ST(0) / 2
                  FSTP H             // ST(0) zurückschreiben auf Variable: H
                  FLD AP
                  FMUL ersteRate
                  FSTP apX
                  FLD apX
                  FMUL halbieren_asm
                  FADD D_von
                  FSTP D_Ist
                  FLD Summe
                  FADD apX
                  FSTP Summe
                end;

                { Inc(nZaehler);

                  H    := (D_bis - D_von) / 2;
                  apX  := AP * (ersteRate / hundert);
                  D_Ist := D_von + (2 * apX);
                  Summe := Summe + apX; }

                data1[0] := int^;
                data1[1] := apX;
                data1[2] := D_Ist;

                liste.ADD(SetStringFormat(data1));
              end;
          else
            begin
              asm
                INC nZaehler
                JMP @START
              @START:
                FLD apX
                FMUL Rate
                FCOM apMin    // vergleiche, ST(0) : apMin
                JG @ELSE_a    // wenn größer, springe
                FLD apMin
                FSTP apX
                JMP @END_a
              @ELSE_a:
                FLD apX
                FMUL Rate
                FSTP apX
                JMP @END_a
              @END_a:
                FLD Summe
                FADD apX
                FCOM H
                JL @ELSE_b    // wenn kleiner, springe: Abfrage wird falsch ausgewertet !?!
                FLD H
                FSUB Summe
                FSTP apX
                JMP @END_b
              @ELSE_b:
                JMP @END_b
              @END_b:
                FLD apX
                FMUL halbieren_asm
                FADD D_Ist
                FSTP D_Ist
                FLD Summe
                FADD apX
                FSTP Summe
              end;

              { if ((apX * (Rate / hundert)) < apMin)
                then
                begin
                apX := apMin;
                end
                else
                begin
                apX := apX * (Rate / hundert);
                end;

                if ((Summe + apX) > H)
                then
                apX := H - Summe;

                D_Ist := D_Ist + (2 * apX);
                Summe := Summe + apX; }

              data1[0] := int^;
              data1[1] := apX;
              data1[2] := D_Ist;

              liste.ADD(SetStringFormat(data1));
            end;
          end;
        end;
    end;

    case (bearbeitung.aussen) of
      true:
        begin
          case (int^) of
            0:
              begin
                INC(nZaehler);
                H    := (D_von - D_bis) / 2;
                apX  := AP * (ersteRate / hundert);
                D_Ist := D_von - (2 * apX);
                Summe := Summe + apX;

                data1[0] := int^;
                data1[1] := apX;
                data1[2] := D_Ist;

                liste.ADD(SetStringFormat(data1));
              end;
          else
            begin
              INC(nZaehler);
              if ((apX * (Rate / hundert)) < apMin)
              then
                begin
                  apX := apMin;
                end
              else
                begin
                  apX := apX * (Rate / hundert);
                end;
              if ((Summe + apX) > H)
              then
                apX := H - Summe;
              D_Ist := D_Ist - (2 * apX);
              Summe := Summe + apX;

              data1[0] := int^;
              data1[1] := apX;
              data1[2] := D_Ist;

              liste.ADD(SetStringFormat(data1));
            end;
          end;
        end;
    end;
  until (Summe >= H);

  FProgressBarMax := int^;

  DataProgressBarComponent(
    true,
    clRed,
    FProgressBarMax);

  SetFormControl(true);

  for nZaehler := 1 to (liste.Count) do
    begin
      BerechnungProgressBar.Position := int^;

      self.Caption := String.Format('%s [%d %%]',
        [FFormCaption, ProzentProgressbar(nZaehler, FProgressBarMax)]);

      BerechnungListBox.AddItem(
        liste[int^ - 1],
        BerechnungListBox);

      WriteZählerEdit(int^.ToString);

      if (THoistThread(DataFanucThread).Terminated)
      then
        begin
          AbbruchRoutine(Abbruch);
          break;
        end
      else
        begin
          BerechnungListBox.Perform(
            WM_VSCROLL,
            SB_BOTTOM,
            0); // Botschaft direkt an die Fensterprozedur des Steuerelements senden
          Application.ProcessMessages;
        end;
    end;

  if not(Abbruch)
  then
    begin
      SetFormControl(false);
      DataProgressBarComponent(false);
    end;

  liste.Free;

  SetLength(
    data1,
    0);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz