Bei negativem Ergebnis mit CC Funktionsbaustein aufrufen?

Scoby

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute,

wie bekomme ich bei negativem Ergebnis das VKE = 1?

Hintergrund ist das ich eine Korekturfunktion für den SFC64 in einen extra Funktionsbaustein schreiben und dann immer bei negativen Ergebnis aufrufen will. Ungefähr so:

Code:
 CALL  "Systemzeit"
      L     "System-Zeit"
      L     "alte_Systemzeit"
      -D
[B]jetzt VKE irgendwie 1 setzen wenn Ergebnis negativ[/B]
      CC   "Korrekturfunktion"
      T     "ein_Doppelword"

und die Korrekturfunktion hab ich mir dann so vorgestellt:

Code:
L     2147483647
+D


Wenn also das Ergebnis negativ ist, den Maximalwert addieren und danach weiter im Programm.
 
@M-Ott: schön!

ich hatte
Code:
 SPP
vorgeschlagen, aber dadurch wird das VKE ja nicht eins, aber ein
Code:
 CALL
würde dann funktionieren
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Für die Korrektur würde ich nicht extra eine Funktion schreiben.

Code:
//*** Aufrufzyklus bestimmen
      L     "SYS_TIME"
      L     #SYSTIME_ALT
      -D
      SPPZ  M012                         // Korrektur bei Überlauf
      L     T#-24D20H31M23S648MS         // der Systemzeit
      +D    
M012: NOP   0
      T     #ZYKLUS
 
Zuletzt bearbeitet:
@ Dagobert
Wenn ich das so mache, müsste ich diese 8 Zeilen doch aber an jede Stelle kopieren, an der die Systemzeitzeit gespeichert wird.

Bei meiner Variante sinds nur 2 Zeilen an jeder Stelle und 2 Zeilen in der Funktion.


Oder verstehe ich irgendwas falsch?
 
Dann mach doch aus Systemzeit_ALT einen IN-Parameter und aus Zyklus eine OUT-Parameter! So kannst Du sie bei jedem Aufruf aktuell übergeben.
 
Für die Korrektur bei Überlauf der Time-Tick würde ich auch nicht extra eine Funktion schreiben,
ist es doch nur 1 Zeile Code und benötigt auch keine Sprünge:
Code:
      L     "Systemzeit_jetzt"    // Time: 0 ... 2.147.483.647 ms
      L     "Systemzeit_vorher"   // Time: 0 ... 2.147.483.647 ms
      -D                          // Differenz jetzt-vorher
      UD    DW#16#7FFFFFFF        // immer positiv machen
      T     "Differenzzeit"

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
..Bei meiner Variante sinds nur 2 Zeilen an jeder Stelle und 2 Zeilen in der Funktion...
Naja, ob man immer eine Funktion schreiben muss, um zwei, drei Zeilen zu sparen? Ich würde jedenfalls nicht auf die Idee kommen. Performance und Speicher benötigt ein Bausteinaufruf auch.

@Harald,
du blendest einfach nur das Vorzeichen aus? Tut dat denn gut?
 
Ich weis nicht ob du das Bewusst machst, einfach Flag für negative Zahl ausblenden, langt aber nicht um die gleiche Zahl als positiv darzustellen...

Du müsstest eigentlich das Zweierkomplement bilden
Code:
UD DW#16#7FFFFFFF // immer positiv machen

Harald

Code:
  10100100            Ausgangszahl (-92)
  01011011            1-er Komplement, alle Bits umdrehen
  01011100            noch 1 addieren (92)
 
also
  INVD  
  INC   1
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@Harald,
du blendest einfach nur das Vorzeichen aus? Tut dat denn gut?
Ja.


Ich weis nicht ob du das Bewusst machst, einfach Flag für negative Zahl ausblenden, langt aber nicht um die gleiche Zahl als positiv darzustellen...

Du müsstest eigentlich das Zweierkomplement bilden
Ich mache das bewußt, weil es NICHT darum geht, aus -10 eine +10 zu machen.
Der Time-Tick von SFC64 nutzt nur 31 Bit und ist immer positiv. Der höchste mögliche Wert ist 2.147.483.647 (16#7FFFFFFF).
Danach "wrap"t (überläuft) der Time-Tick zu 0. Man muß bei einer negativen Differenz Jetzt-Vorher 2.147.483.648 (16#80000000)
addieren oder subtrahieren, um die negative Differenz in den positiven "32-Bit-Quadranten" zu spiegeln. (Fast so hat es auch
schon der TE Scoby im EP erkannt).
"UD DW#16#7FFFFFFF" entspricht bei negativer Differenz einem "-D DW#16#80000000" und bei positiver Differenz stört es nicht.

Beispiel:
Code:
      L     "Systemzeit_jetzt"    // 16#00000005 =             +5
      L     "Systemzeit_vorher"   // 16#7FFFFFFB = +2.147.483.643
      -D                          // 16#8000000A = -2.147.483.638
      UD    DW#16#7FFFFFFF        // 16#0000000A =            +10
      T     "Differenzzeit"
Man beachte, daß +5 - +2.147.483.643 = -2.147.483.638 (und NICHT -10 !).

btw: Es gibt eine fertige Operation um das 32-Bit-Zweierkomplement zu bilden: NEGD (Akku1 := Akku1 * -1)
INVD + INC 1 funktioniert leider nicht richtig für 32-Bit-Ganzzahl, weil INC nur die untersten 8 Bit des Akku1 inkrementiert.


2. Weiß Harald das.

@Harald: schöne Lösung!
Danke für Dein Vertrauen in meine Kenntnisse und das Lob. :D

Harald
 
Zurück
Oben