Seite 1 von 1

ACTION! eine Frage

Verfasst: 14.01.2026 16:16
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.

Re: ACTION! eine Frage

Verfasst: 14.01.2026 20:20
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);

ACTION! eine Frage

Verfasst: 15.01.2026 08:09
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.

Re: ACTION! eine Frage

Verfasst: 15.01.2026 08:55
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.)

ACTION! eine Frage

Verfasst: 15.01.2026 09:07
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 ...

Re: ACTION! eine Frage

Verfasst: 15.01.2026 13:17
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.

ACTION! eine Frage

Verfasst: 15.01.2026 13:27
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)

Re: ACTION! eine Frage

Verfasst: 15.01.2026 16:50
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?

Re: ACTION! eine Frage

Verfasst: 14.02.2026 18:37
von slx
Im Atariwiki ist ein Analog-Artikel von Russ Wetmore (Preppie), in dem unter “An indirect detriment” erklärt wird, dass diese Art der Deklaration Speicher spart, wenn man gewisse Einschränkungen in Kauf nimmt. Ich kann nicht behaupten, dass ich das zur Gänze verstanden habe, aber es geht wohl darum, dass Action! im Normalfall so kompiliert, dass ein PROcedure mit einem JMP auf sich selbst beginnt, dass diese Notation einspart.

ACTION! eine Frage

Verfasst: 15.02.2026 09:19
von Erhard
Hallo,

@cas

die Frage ist jetzt schon "etwas" her und ich weiß im Moment nicht mehr, bei welchem Programm mir das aufgefallen ist.

Ich müßte jetzt alle Qhellcodes von mir zusammensuchen und abklappern :-(

slx hat geschrieben:
14.02.2026 18:37
dass ein PROcedure mit einem JMP auf sich selbst beginnt
ich glaube, genau das ist es.

Normalerweise kann die Adresse, auf die eine definierte Prozedur zeigt geändert werden, womit die Prozedur dann auf einen anderen Code zeigt.

Wenn der JMP-Befehl nicht da ist, geht das nicht mehr. Dafür ist der Prozeduraufruf ein paar CPU-Zyklen schneller.

Ich habe das gerade mal in die PROC Reference Card meiner angefangenen ACTION! Reference Cards unter Vorbehalt eingetragen.