ACTION! eine Frage

Moderator: Rockford

Antworten
Erhard
Beiträge: 1244
Registriert: 04.11.2021 15:52
Has thanked: 148 times
Been thanked: 389 times
Kontaktdaten:

ACTION! eine Frage

Beitrag von Erhard »

Hallo,

da ich durch jahrelange Nichtbeschäftigung mein Know-How dafür großteils verloren habe muß ich hier aus gegebenem Anlaß einmal etwas nachfragen.

Normalerweise definiert man eine Prozedur wie zum Beispiel

PROC PRINT(BYTE X)

Ich bin nun auf eine damals von mir erstellte Prozedur gestoßen, die mit

PROC PRINT=(BYTE ARRAY X)

erstellt wurde.

Es geht hier um das Gleichheitszeichen. Das hat eine besondere Bewandnis, aber ich weiß nicht mir welche.

Und nein, es ist nicht

PROC PRINT=*(BYTE ARRAY X)

gemeint.
Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.

Benutzeravatar
24sumo
Beiträge: 248
Registriert: 17.08.2021 08:53
Has thanked: 119 times
Been thanked: 54 times
Kontaktdaten:

Re: ACTION! eine Frage

Beitrag von 24sumo »

Das meint die KI dazu:

Was bedeutet das = zwischen Print und der Parameterübergabe?

In der Programmiersprache Action! hat das Gleichheitszeichen (=) in einer Prozedur-Definition eine ganz spezifische Bedeutung, die sich von modernen Sprachen wie C oder Java unterscheidet.

Es dient dazu, den Beginn der Parameterliste zu markieren.

Die Bedeutung des =
In Action! trennt das = den Namen der Prozedur von ihren Eingabevariablen. Man könnte es fast wie ein "besteht aus" oder "benötigt" lesen.

Syntax: PROC <Name> = ( <Parameter> )

Es sagt dem Compiler: "Die Prozedur mit diesem Namen verwendet die folgenden Variablen im Speicher."

Vergleich mit anderen Sprachen

Um es verständlicher zu machen, hier der Vergleich, wie man denselben Kopf definieren würde:
Sprache Syntax
Action!: PROC Print = (BYTE ARRAY x)
C / C++: void Print(unsigned char *x)
Pascal: procedure Print(x: array of byte);

Erhard
Beiträge: 1244
Registriert: 04.11.2021 15:52
Has thanked: 148 times
Been thanked: 389 times
Kontaktdaten:

ACTION! eine Frage

Beitrag von Erhard »

.
24sumo hat geschrieben:
14.01.2026 20:20
Das meint die KI dazu:
Vielen Dank für Deine Antwort, aber ich meine, daß das was die KI meint falsch ist.

Wie ich in meinem ersten Beitrag angeführt hatte werden Parameter für eine Prozedur ja auch ohne das Gleichheitszeichen definiert:

PROC TEST(BYTE X,Y CARD ADR INT ID)

Hier werden nach meiner Erinnerung die Werte für die Variablen in Speicherzellen abgelegt, die im Arbeitsspeicher vor dem Programmcode der Prozedur liegen.

Bei PROC TEST=*(...) fällt der JMP Befehl vor der Prozedur weg, womit die Adresse der Prozedur nicht mehr durch das Programm geändert werden kann.

Bei PROC TEST=(...) könnte es sein, daß die an die Variablen übergebenen Werte statt in Speicherzellen vor der Prozedur in den CPU-Registern A,X,Y sowie den Speicherzellen $A3-$AF abgelegt werden - aber da bin ich mir nicht mehr sicher.
Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.

Benutzeravatar
DjayBee
Beiträge: 1178
Registriert: 17.08.2021 04:02
Has thanked: 901 times
Been thanked: 463 times
Kontaktdaten:

Re: ACTION! eine Frage

Beitrag von DjayBee »

Laut Handbuch dient das "=" dazu, die Adresse der PROCedure zu definieren. Dein Beispiel sieht dahingehend aber irgendwie sinnlos aus, weil die Variablenliste die Adresse ist.

Ausschnitt aus GoodbyteXLs deutscher Übersetzung:

Code: Alles auswählen

PROC CIO=$e456(BYTE areg,xreg)
;*** Declaring the OS procedure CIO. 'xreg' will
;contain the iocb number times 16, and 'areg' is a
;filler, so the number won't go into register A
;(CIO expects it in X reg.)

Erhard
Beiträge: 1244
Registriert: 04.11.2021 15:52
Has thanked: 148 times
Been thanked: 389 times
Kontaktdaten:

ACTION! eine Frage

Beitrag von Erhard »

Dann muß ich wohl gelegentlich eine kleine Testroutine in den 3 Versionen kompilieren und mir den Arbeitsspeicher mit einem Debugger angucken, um da vielleicht wieder einen Hinweis zu bekommen, was da passiert.

Echt schade, daß ich damals, als ich intensiv damit gearbeitet hatte, das Thema nicht zu Ende verfolgen konnte.

Ich hatte mit ACTION! Reference Cards angefangen wo für jedes Ding grundsätzliche Erläuterungen und Anwendungsbeispiele drin sind.

Aber die sind nur zu einem kleinen Teil angefangen und da wo was drin steht ist es nicht immer vollständig, wie eben bei PROC.

Vielleicht bin ich aber auch nur auf fehlerhafte alte Notizen von mir gestoßen. Das wäre dann ein bissl blöd ...
Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.

Benutzeravatar
cas
Beiträge: 1199
Registriert: 18.06.2021 21:01
Wohnort: Solar System
Has thanked: 349 times
Been thanked: 861 times
Kontaktdaten:

Re: ACTION! eine Frage

Beitrag von cas »

Wie schon oben gesagt definiert das Gleichheitszeichen die Speicherstelle der Prozedur im Speicher.

Gibt es vielleicht ein "BYTE ARRAY X" im Programm an anderer Stelle, in welchem das BYTE ARRAY X mit Maschinensprache-Befehlen gefüllt wird?

Das wäre dann eine Variable "X" als BYTE ARRAY, mit dem Inhalt einer Maschinenspracheroutine. Und die Prozedur verweist dann auf dieses BYTE ARRAY X, so das der Maschinencode in Variable "X" über den Namen der Prozedur aufgerufen werden kann.

Erhard
Beiträge: 1244
Registriert: 04.11.2021 15:52
Has thanked: 148 times
Been thanked: 389 times
Kontaktdaten:

ACTION! eine Frage

Beitrag von Erhard »

Wie gesagt, es geht ja nicht um das Festlegen einer Adresse:

PROC CIO=$e456(BYTE areg,xreg)

sondern um sowas:

PROC TEST=(BYTE X,Y)

und vielleicht gibt es das gar nicht und ich habe das nur falsch notiert und es lautet (und muß lauten)

PROC TEST=*(BYTE X,Y)
Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.

Benutzeravatar
cas
Beiträge: 1199
Registriert: 18.06.2021 21:01
Wohnort: Solar System
Has thanked: 349 times
Been thanked: 861 times
Kontaktdaten:

Re: ACTION! eine Frage

Beitrag von cas »

Erhard hat geschrieben:
15.01.2026 13:27
Wie gesagt, es geht ja nicht um das Festlegen einer Adresse:

PROC CIO=$e456(BYTE areg,xreg)

sondern um sowas:

PROC TEST=(BYTE X,Y)

und vielleicht gibt es das gar nicht und ich habe das nur falsch notiert und es lautet (und muß lauten)

PROC TEST=*(BYTE X,Y)
Doch, es legt die Adresse fest. Auch

PROC TEST=*(BYTE X,Y)

legt die Adresse fest, auf "*", das ist der aktuelle Compile-Pointer (also die Adresse des nächsten freien Speicherplatzes im Programm an dieser Stelle).

Um Licht in die Sache zu bekommen:
1) Kompiliert der Code?
2) An welche Speicherstelle wird die PROC Funktion kompiliert?
3) Was für ein Code steht an dieser Stelle?
4) Kannst Du den Quellcode des ganzen Programms posten?

Antworten

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 1 Gast