Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Flohmarkt » FORTH » Themenansicht

Autor Thread - Seiten: -1-
000
05.07.2021, 13:44 Uhr
madnex1966



Hallo in die Runde,

hat jemand das Buch "Programmieren in Forth" vom VEB Verlag Technik? Als Autor ist "Vack" angegeben.

mfg Roland
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
05.07.2021, 14:12 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

klar, das hab ich. auch als PDF.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
05.07.2021, 20:57 Uhr
madnex1966



Hallo Volker,

siehe PN

Gruß Roland




Zitat:
volkerp schrieb
klar, das hab ich. auch als PDF.

Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
09.07.2021, 21:59 Uhr
madnex1966



Hallo in die Runde,

hab mich mal ein wenig mit dem Thema Forth83 eingelesen und bin schon auf das erste Problem gestoßen.

Im JTCEMU mit 6K System und geladenem Forth bringt die Befehlsfolge:

CREATE UDO 2 ALLOT eine Fehlermeldung UDO?

Kann mir jemand auf die Schnelle sagen was da verkehrt läuft? Die Befehlsfolge sollte laut FORTH83 Kurs der JU+TE ein Wort erzeugen, welches einer Variable mit 16 Bit gleicht.

mfg Roland

Dieser Beitrag wurde am 09.07.2021 um 22:00 Uhr von madnex1966 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
09.07.2021, 23:14 Uhr
Perser

Avatar von Perser

Forth kennt die Variable nicht, zu erst eingeben
VARIABLE UDO danach funktioniert es.
Ich hasse solche Beschreibungen wenn diese nicht funktionieren, gerade
wenn man Anfänger ist, in diesem Forth Kurs sollten auch mehr Beispiele drin sein.

Viele Grüße
Perser
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
09.07.2021, 23:24 Uhr
madnex1966



Hallo Perser,

danke für die schnelle Antwort. Aber ist es echt so, dass der Verfasser dort einen Fehler gemacht hat? wenn ich "Words" eingebe, wird doch CREATE angezeigt.

mfg Roland

Dieser Beitrag wurde am 09.07.2021 um 23:27 Uhr von madnex1966 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
10.07.2021, 08:36 Uhr
Perser

Avatar von Perser

lese nochmal den Artikel durch wo Create beschrieben wird, da steht nochwas mit einen Komma, obwohl ein Komma nicht im Wörterbuch steht, für mich ist das auch etwas unverständlich, ich werde mal wo anders gucken ob ich dazu was finde.

Viele Grüße
Perser
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
10.07.2021, 08:43 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

https://hc-ddr.hucki.net/wiki/doku.php/tiny/forth

„Am ehesten wird CREATE vermißt. Es läßt sich mit VARIABLE (name) -2 ALLOT ersetzen.“

Der Forth-83-Kurs gilt allgemein, die Besonderheiten der konkreten Implementierung sollte man immer parallel dazu beachten
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)

Dieser Beitrag wurde am 10.07.2021 um 08:55 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
10.07.2021, 08:57 Uhr
madnex1966



Vielen Dank,
man muss eben doch die richtigen Dokumente lesen um zu verstehen....

mfg Roland
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
10.07.2021, 09:01 Uhr
Perser

Avatar von Perser

würde mich trotzdem mal interessieren was es mit dem Komma auf sich hat, Hinweis steht ja auch an der Stelle.

Viele Grüße
Perser
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
10.07.2021, 10:30 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

S. Abbildung 5, das Komma kann man leicht selbst definieren ( steht auch in meiner zusammenfassenden Seite, außerdem empfehle ich einen Blick in die Assemblerquelle, dort hab ich auch diverse Anmerkungen gemacht )


Quellcode:

  : , HERE 2 ALLOT ! ;


--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)

Dieser Beitrag wurde am 10.07.2021 um 10:31 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
13.10.2021, 22:14 Uhr
Merilix




Zitat:
madnex1966 schrieb
Im JTCEMU mit 6K System und geladenem Forth bringt die Befehlsfolge:

CREATE UDO 2 ALLOT eine Fehlermeldung UDO?



Das sollte noch keine Fehlermeldung erzeugen. Erst eine nachfolgende Verwendung des eben erzeugten Wortes 'UDO' weil die Definition des Worts noch nicht abgeschlossen ist.

CREATE erzeugt nur einen noch funktionslosen Dictionary Eintrag für das folgende Token des Eingabestreams, ALLOT reserviert die zwei nachfolgenden 2 Bytes im Dictionary.

CREATE UDO 2 ALLOT erzeugt folgendes:

02A4 A3 55 44 CF Das ist der Name 'UDO' mit gesetztem SMUDGE-Bit der den Namen als ungültig markiert
02A8 8D 02 Das Link-Feld zum vorigen Wort im Dictionary
02AA AC 02 Das Codefeld: Auf Adresse 02AC wird der Maschinencode erwartet der ausgeführt wird wenn UDO aufgerufen wird. Dort steht aber noch nichts vernünftiges
02AC 05 41 Die reservierten 2 Bytes. der Wert darin ist aber mehr oder weniger random.

Es ist gut das das SMUDGE-Bit gesetzt ist. Würde UDO aufgerufen würde das System crashen.

Also am besten mit 'SMUDGE FORGET UDO' das Wort gültig machen und sofort vergessen
--------

Zitat:
Perser schrieb
würde mich trotzdem mal interessieren was es mit dem Komma auf sich hat,


Das Komma schreibt die zwei Bytes die auf dem Stack liegen sollten ins Dictionary. Anders als ALLOT, das nur Bytes reserviert, hängt man so geziehlt Werte (Konstanten/Adressen/oder was auch immer) an die letzte Wortdefinition an. Das HERE in der Definition von ',' ist der Zeiger auf die erste freie Zelle hinter dem Dictionary. ALLOT verschiebt diesen Zeiger.

Dieser Beitrag wurde am 13.10.2021 um 22:46 Uhr von Merilix editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
15.10.2021, 11:33 Uhr
Merilix



FORGET meinen_letzten_Post
Das Tiny-FORTH ist doch erheblich anders als alle Forth-Dialekte die ich kenne.
Ich hätte genauer lesen sollen -- Sorry.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
05.01.2022, 06:59 Uhr
madnex1966



Hallo noch einmal und Allen ein gesundes neues Jahr von mir.
Ich bin immer noch mit dem Forth für den Ju+Te 6K beschäftigt und stoße in der Beschreibung die Volker verlinkt hat
https://hc-ddr.hucki.net/wiki/doku.php/tiny/forth
mal wieder an meine Grenzen. Dort heißt es:
"Nach Eingabe des letzten Bytes des Maschinen-Unterprogramms (meist AF) wird die Definition mit
OFF abgeschlossen. Dabei verwendet das FORTH-System die aktuelle Eingabeadresse als HERE
(Adresse des ersten freien Bytes). Es ist daher nicht gleichgültig, in welchem Zustand der DATA-
Modes verlassen wird. Soll die automatische Adreßberechnung (Binden) zum Einsatz kommen,
müssen die betreffenden Operandenbytes bei der Eingabe zunächst frei bleiben (z.B. %FF). Nach
Eingabe dieses unfertigen Programms unter FORTH kann es mit VIEW angezeigt werden. Über RESET und PROG ist das Nachtragen der Marken und schließlich das Binden nötig. Nach dem Neustart des FORTH-Systems steht das neue Wort dann zur Verfügung. Die Adresse der Markentabelle sollte bei diesem Verfahren vor Beginn der Definition des Maschinenprogramms bereits vereinbart sein, damit PROG gleich zur richtigen Adresse führt."

Wenn ich mit Code T1 Enter ein neues Wort definiere, springt man beim 6K in den Monitor. Dort kann ich dann mit Hxxxx den inhalt der Speicherzellen anzeigen lassen und diese dort auch ändern. OFF zum beenden gibt es da nicht also beende ich die Eingabe mit "Q" und lande zurück im Forth. Mit Words erscheint das neue Wort im Wörterbuch. Wenn ich jetzt mit Reset zurück zum Monitor gehe steht an der Stelle des von mir eingegebenen Maschinencodes direkt nach dem Kennbyte die Adresse des "Countbytes" des neu angelegten Wortes. Was mache ich falsch? Welche Marke muss ich wo nachtragen und wie funktioniert das "Binden"?

Gruß Roland
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
014
05.01.2022, 07:45 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

Ich denke, du machst alles richtig. Es wird wohl ein Bug im ES40-Forth sein.

Wort: CODE

Quellcode:
...
        call    ES_DATA        ; ES: DATA-Modus
        srp    #10h
        ld    R12, 20h ; aktuelle Adr.
        ld    R13, 21h
        call    TIB

...

in ES1988 werden original die Register 70h,71h genutzt. Hier wird die letzte Adr. von ES_DATA zurückgegeben. Im ES40 muss das möglicherweise noch anders sein. Wir haben aber noch kein komplett reassembliertes Listing des ES40-Systems.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
015
05.01.2022, 09:45 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

Hab noch was gefunden (Beschreibung zur ES40-Kassette)


- angepasstes FORTH, Laden mit LD000

Starten mit JD000, entspricht im
wesentlichen dem FORTH des 4K-Systems,
wurde aber auf %D000 verschoben
Befehl VIEW existiert nicht
Befehl CODE ruft den MON auf, in
Register %20/21 steht, wo man mit Ein-
tragen des Codes beginnen kann, vor
Rueckkehr mit Q in %20/21 die Adresse
hinter dem Code eintragen

Nutzt den 80-Zeichen-Modus des EDI
Vor einer Eingabezeile braucht kein so
merkwuerdiges Zeichen stehen wie bei
4K-Version

Letzte Position der Eingabezeile wird
normalerweise nicht genutzt, wenn dort
aber ein \ Zeichen steht, wird noch
die Eingabe der naechsten Zeile abge-
wartet, bevor sie verarbeitet wird.
Das kann man bis zu 2 mal machen, beim
3. mal erscheint \#MSG als Fehler
also max. 237 Zeichen pro Zeile
%F300-F3FF wird als Zeilenpuffer ge-
nutzt.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
016
05.01.2022, 11:08 Uhr
madnex1966



Hallo VolkerP,
vielen Dank, das war die Lösung. Es funktioniert!!!
Roland
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
017
09.01.2022, 09:38 Uhr
madnex1966



Hallo mal wieder,
ich habe meine ersten Experimente mit dem Wort CODE erfolgreich abgeschlossen und mir gedacht, die Grafikroutinen aus dem ES4.0 auch im Forth nutzbar zu machen. Dazu habe ich mich erst einmal dem xy_Plot (%17FD) gewidmet. Meine 1. Idee,:
PUSH R4E (VARIABLENADRESSE X -HIGH_BYTE)
PUSH R4F (VARIABLENADRESSE X -LOW_BYTE)
PUSH R50 (VARIABLENADRESSE Y -HIGH_BYTE)
PUSH R51 (VARIABLENADRESSE Y -LOW_BYTE)
CLR R50 (da Y max. 192)
LD R51,r3 (TOS LOW-BYTE)
LD R4F,@r15 (SECOND-LOW_BYTE)
INC r15
LD R4E;@r15 (SECOND-HIGH_BYTE)
INC r15
CALL %17FD
POP R51
POP R50
POP R4F
POP R4E
RET

Man schreibt also vor dem Befehl die x und y Koordinate in den Stack und ruft dann xy_Plot auf. Das hat soweit auch funktioniert, nur stand dann immer noch was im Stack, obwohl ich doch den Registerpointer r15 erhöht habe. Wenn ich dann zwischen POP R4E und RET noch den Drop Befehl (Call %D19C) aufrufe ist auch der Stack leer.

Nun meine 2 Fragen:

1. Reicht das bloße Erhöhen vom Arbeitsregister r15 nicht aus um den Stack (im Sinne von Drop) zu beeinflussen?
2. Ist die von mir erdachte Lösung grundsätzlich eine gangbare Lösung oder übersehe ich da was wegen der Register (insbesondere R4F R4E) die ja für den Stack reserviert sind.

Beste Grüße Roland

Dieser Beitrag wurde am 09.01.2022 um 09:41 Uhr von madnex1966 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
018
09.01.2022, 12:43 Uhr
paulotto



wenn Du Arbeitsregister R15 bearbeitest, mußt Du auch auch den Registerpointer auf 0Fh stehen haben,. Sonst ist R15 in irgendeiner Registerbank und nicht das Register Stackpointer...

Gruß,

Klaus
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
019
09.01.2022, 14:01 Uhr
madnex1966




Zitat:
paulotto schrieb
wenn Du Arbeitsregister R15 bearbeitest, mußt Du auch auch den Registerpointer auf 0Fh stehen haben,. Sonst ist R15 in irgendeiner Registerbank und nicht das Register Stackpointer...

Hallo Klaus,
der Registerpointer steht auf %10 und %1F ist, soweit ich das dem Listning von Volker entnehme, der Stackpointer im Forth ,der auf die Register %4F bis %20 zeigt.

Gruß Roland

Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
020
10.01.2022, 10:34 Uhr
volkerp
Default Group and Edit
Avatar von volkerp


Zitat:
madnex1966 schrieb
1. Reicht das bloße Erhöhen vom Arbeitsregister r15 nicht aus um den Stack (im Sinne von Drop) zu beeinflussen?
2. Ist die von mir erdachte Lösung grundsätzlich eine gangbare Lösung oder übersehe ich da was wegen der Register (insbesondere R4F R4E) die ja für den Stack reserviert sind.


Der Forth-Daten-Stack ist R15. Der oberste Stackwert liegt allerdings im Register RR2. Bei Forth-Stack-Manipulationen muss das beachtet werden.
Der Forth-Return-Stack ist der Z8-Stack-SPH/SPL. Der kann innerhalb eines Wortes ganz normal im Assembler genutzt werden.

Ansonsten ist der Lösungsansatz i.O., anders würde ich das auch nicht machen.
Man müsste sinnvollerweise die Registernutzung innerhalb Forth noch korrekt dokumentieren, das hab ich damals nicht gemacht, es war für mich nicht nötig. Ich wollte Forth ja nicht erweitern sondern nur ein wenig korrigieren. Dafür waren nicht alle Details erforderlich
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
021
11.01.2022, 19:16 Uhr
madnex1966



Vielen Dank VolkerP.
Gruß Roland
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Flohmarkt ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek