H4TH Applications

ZX-Team Forum
Antworten
Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

H4TH Applications

Beitrag von ZX-Heinz » 30.04.2017, 18:37

Da die Arbeit mit dem Husband-Forth (H4TH) durch den Anschluss des Vdrives nun sehr einfach geworden ist, besteht vielleicht bei einigen Freunden Lust zum Experimentieren. Eine Hürde könnten schwache Forth-Kenntnisse sein. Am besten lernt man Programmiersprachen durch Modifikation fertiger Programme. Daher sollen in diesem Thread schöne Anwendungen für Forth unter Einbindung der für den Zeddy vorhandenen Hardware vorgestellt werden. Gelegentlich auch kommentierte Programme.

Zum Umgang mit H4TH & Vdrive: Wenn es zum "Einfrieren" des Cursors kommt: Nicht verzweifeln, ein kurzes Shift&Space erzeugt einen Warmstart ohne Datenverlust. Sollte das Vdrive blockieren, so hilft manchmal ein PRT<CR>, um Datenreste abzusaugen. Dem sind dann in der Regel falsche Befehle vorausgegangen. Der Editor Screen, den man mit Shift&1 erreicht, fasst 512 Bytes. Das ist daher auch die Standardlänge eines Forth-files nach VSTORE.

Sämtliche Notationen in FORTH erfolgen "polnisch rückwärts" – dieses Herangehen geht auf den polnischen Mathematiker und Logiker Lukasiewicz (1878-1956) zurück. Der Vorteil: Man braucht weder Klammern noch Klammerregeln bei der Auswertung von Ausdrücken. Der Nachteil: Ungewohnt! Statt 2 + 3 = ? muss also eingegeben werden: 2 3 + . (Punkt steht für die Anzeige auf dem Bildschirm.). Zum Ausführen anderer Befehle entsprechend: Zuerst die Parameter eingeben, dann die Operation. Z.B. Laden eines Files mit Namen NAME geht wie folgt: " NAME" VLOAD

Da sehr gute Manual zu Husband-Forth H4TH findet ihr in 8bit-wiki unter:
http://www.8bit-wiki.de/index.php?id=3& ... 03fcdb0000

Es ist aber ein Manual, kein Lehrbuch. Daher hier im folgenden die Beispielsammlung. Die Programme könnten per past'n'copy direkt übernommen werden, passen von der Formatierung her aber nicht so gut zum Zeddy-screen. Daher sind in der Anlage die Programme nochmals mit einer für den Zeddy besseren Formatierung und als 512-Bytes lange Programme angefügt. Die Endung .TXT kann entfernt werden, sie ist nur wegen der Forumsregeln erforderlich.
Zuletzt geändert von ZX-Heinz am 30.04.2017, 18:57, insgesamt 1-mal geändert.

Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

H4TH Applications: Erste Beispiele

Beitrag von ZX-Heinz » 30.04.2017, 18:40

Einfachste Beispiele zur Arbeit mit dem Editor-screen und dem Execute-screen:

1. Nach dem Start von H4TH kann durch Shift&1 eine Splittung des Screens in oberen Teil=Editor screen und unteren Teil=Execute screen erricht werden. Mit Shift&1 nochmals kann der Cursor von unten nach oben geholt werden, und umgekehrt.

2. Die mittlere schwarze Zeile kann als PAD zur Zwischenspeicherung von Zeilen benutzt werden: Mit Shift&3 hineinspeichern, mit Shift&2 herausholen.

Nun die erste Programmzeile im oberen, dem Editor-Screen:

: SUMME 2 3 + . ;

Mit Shift&1 zurück zum Exec-scr, dann CPL<CR> und SUMME<CR>. Ergebnis: 5 OK

Wollen wir variable Summenden haben, so brauchen wir eine Eingabe-Prozedur. Die gibt es nicht "fertig" in Forth, man muss die Routine schreiben:

: INPUT ." ZAHL=?" S@ ># DROP ;
: ADDIERE INPUT INPUT + . ;


Unser Programm besteht also aus zwei Teilen, die beide kompiliert werden müssen. Die Benutzung dann: ADDIERE<CR>.
Dateianhänge
ADD.TXT
(512 Bytes) 14-mal heruntergeladen

Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

H4TH Applications - Arithmetik

Beitrag von ZX-Heinz » 30.04.2017, 18:45

Hier drei Beispiele zur Arithmetik

1. Größter Gemeinsamer Teiler (GGT) zweier Zahlen A,B:

: GGT ( ANWENDUNG: N M GGT ) BEGIN SWAP OVER MOD ?DUP 0 = UNTIL . ;
GGT.TXT
(512 Bytes) 12-mal heruntergeladen
2. Primzahlen

( PRIMES BY RUNE )
0 VARIABLE S
0 VARIABLE F
: NXTPRIME 3 F ! BEGIN F @ S @ F @ / * S @ = IF S @ F ! ELSE 2 F @ + F !
THEN F @ F @ * S @ > UNTIL F @ S @ < IF S @ . THEN ;
: PRIMES 100 5 DO I S ! NXTPRIME 2 +LOOP ;


Im exec-scr: CPL<CR> PRIMES<CR>
PRIMES.TXT
(514 Bytes) 13-mal heruntergeladen
Alternativ unter Verwendung von Feldern und dem "Sieb des Erathostenes"

( SIEVE ) 500 VARIABLE Z Z @ ALLOT
0 VARIABLE S
: CANCEL S @ BEGIN DUP 1 SWAP Z + C! S @ + DUP Z @ > UNTIL ;
: LW Z @ 2 DO 0 Z I + C! LOOP ;
: SIEVE LW Z @ 2 DO I Z + C@ 0= IF ( I=PRIME ) I S ! S @ . CANCEL THEN LOOP ;

Im exec-scr: CPL<CR> SIEVE<CR>
SIEVE.TXT
(512 Bytes) 14-mal heruntergeladen

Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

H4TH Applications - MrX Musik

Beitrag von ZX-Heinz » 30.04.2017, 18:47

Musik: MrX, ZONX und H4TH

Mit der MrX-Karte am H4TH-Zeddy steht das nächste Programm beispielhaft für Musikausgabe. Kompilieren und dann PHASOR<CR>:

: MRX ( DATA LATCH MRX ) CODE D7 7D D3 DF D7 7D D3 1F C9 ;C ;
: PAUSE 100 0 DO LOOP ;
: SILENCE 0 0 MRX ;
: INI HEX 0F 8 MRX FE 7 MRX 0 0 MRX 0 1 MRX ;
: PHASOR INI FE 60 DO I 0 MRX PAUSE 5 +LOOP SILENCE ;
Dateianhänge
PHASOR.TXT
(512 Bytes) 12-mal heruntergeladen

moggy
User
Beiträge: 34
Registriert: 09.09.2011, 16:30

Re: H4TH Applications

Beitrag von moggy » 30.04.2017, 20:58

I have a simpler prime number program for primes selectable up to 32767 and a simple RND number generator plus a few other odds and ends I could dig out if that is acceptable?

bokje
User
Beiträge: 50
Registriert: 02.05.2015, 15:38

Re: H4TH Applications

Beitrag von bokje » 30.04.2017, 22:48

Hi Moggy,

The RND I posted earlier looks like:

Code: Alles auswählen

TIME D@ 2VAR SEED
: RND SEED D@ 1 62237 D/ 0 16807 D* DSWAP 0 2836 D* D- OVER OVER 32767 65535 D> IF 32767 65535 D+ THEN DUP ROT ROT SEED D! 32767 AND ;
based on the algorithm on page 1195 of reference 2 on https://en.wikipedia.org/wiki/Lehmer_ra ... _generator

And yours?

Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

Re: H4TH Applications

Beitrag von ZX-Heinz » 30.04.2017, 23:29

moggy hat geschrieben:
30.04.2017, 20:58
I have a simpler prime number program for primes selectable up to 32767 and a simple RND number generator plus a few other odds and ends I could dig out if that is acceptable?
I'm curious about it!

Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

Re: H4TH Applications

Beitrag von ZX-Heinz » 30.04.2017, 23:42

bokje hat geschrieben:
30.04.2017, 22:48

Code: Alles auswählen

TIME D@ 2VAR SEED
: RND SEED D@ 1 62237 D/ 0 16807 D* DSWAP 0 2836 D* D- OVER OVER 32767 65535 D> IF 32767 65535 D+ THEN DUP ROT ROT SEED D! 32767 AND ;
@bokje: I am happy that it is so easy now to copy a line like yours into the Vdrive and the H4TH-Zeddy. I tried your program and it looks nice. There is a rough test if RNDs are good: Plot pairs of numbers on the plane, it should look like rain drops, no regular pattern. Did you did it using your plot-pgm?

bokje
User
Beiträge: 50
Registriert: 02.05.2015, 15:38

Re: H4TH Applications

Beitrag von bokje » 01.05.2017, 08:26

@Heinz: Good idea! What do you think of the following:

Code: Alles auswählen

: TRND EOFF CLS ZFNT BEGIN RND 63 AND RND 693 / PLOT REPEAT ;
rnd.png
rnd.png (38.43 KiB) 952 mal betrachtet

Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

Re: H4TH Applications

Beitrag von ZX-Heinz » 01.05.2017, 11:40

@bokje: It looks really good! And it makes me reflecting on including your plot-pgm in my ROM if you agree.
viewtopic.php?f=2&t=2076&p=27874#p27874
Waiting for HRG is not a good idea. This could takes several month. Talk to you by PM.
Heinz
Zuletzt geändert von ZX-Heinz am 01.05.2017, 19:32, insgesamt 1-mal geändert.

moggy
User
Beiträge: 34
Registriert: 09.09.2011, 16:30

Re: H4TH Applications

Beitrag von moggy » 01.05.2017, 16:50

PRIMES.

: PRIMES 2 SWAP 2 . 3 . 5 DO DUP DUP * I
< IF 1 + THEN 1 OVER 1 + 3 DO J I MOD 0=
IF 1 - LEAVE THEN 2 +LOOP IF I . THEN 2 +LOOP DROP ;

To use enter number upto 32767 then "PRIMES"


RANDOM NUMBER GENERATOR PLUS RND SHUFFLE.

CO REV

0 VARIABLE SEED

: RANDOM SEED @ 259 * 3 + 32767 AND DUP SEED ! ;

: RND RANDOM 32767 */ 1 + ;

: Z 1001 1 DO I . ." NUMBER=" 12 RND . CR LOOP ;

: SHUFFLE 0 DO RANDOM RND LOOP ;


This is taken from a program used on the BBC computer and adapted by myself to ignore zero,the output routine "Z" is something I put together to make the display a bit more fun although a bit too fast to read!
To use just enter "Z" and 1000 RND numbers between 1-12 will be generated(the number 12 in routine "Z" can be altered upto 32767)

I have experimented with the output going to different "SCREENS" in the display which is slightly problematic insofar as separately created screens whilst happy with character output are not so happy with computational outputs and often crash but I have had some success which just needs tidying up.


The shuffle is just that. It shuffles the seed by an entered amount of times before RND generation ,a bit like BASIC's RAND X function. To use enter shuffle number then "SHUFFLE(large numbers take some time) then call "Z".


I have also done a screen routine which has messages scrolling in six different screens in what looks like different directions due to a trick of the eye, which I'm happy to share after I change the messages in them(they were a bit personal!) if anyone is interested plus a very simple branch conditional routine I wrote whilst learning.


@ bokje

As soon as this is posted I will be trying your RND routine in Eighty One is there an example of how to use this practically?
I sense a nice forth learning group could be created here. :D
Although I'm stuck with tape store/load at the moment and cannot use your plot routines. :(
Zuletzt geändert von moggy am 01.05.2017, 17:10, insgesamt 1-mal geändert.

Benutzeravatar
tokabln
User
Beiträge: 1054
Registriert: 10.11.2013, 00:24
Wohnort: D, Berlin (Mariendorf)

Re: H4TH Applications

Beitrag von tokabln » 01.05.2017, 17:07

The above shown QR Code picture doesn't work, I'm not redirected to the web page given in the QR Code :mrgreen:




Just kidding... :D
Lieben Gruß Torsten
BMZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500, Amiga 1200, Atari Portfolio, HP200LX, IBM PC 5155, TP755c, T41, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e

Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

H4TH Applications - Multitasking

Beitrag von ZX-Heinz » 01.05.2017, 17:23

Multitasking
Ein eindrucksvolles Beispiel für Multitasking ist H4TH.Manual , Seite 64, entnommen. Sechs Tasks laufen im Hintergrund:

: BYTE DUP FBUF + @ 128 XOR SWAP FBUF + ! ;
: PG1 0 BYTE ;
: PG2 2 BYTE ;
: PG3 4 BYTE ;
: PG4 6 BYTE ;
: PG5 8 BYTE ;
: PG6 10 BYTE ;
TASK TA1 PG1 EVERY 25 TT TA1
TASK TA2 PG2 EVERY 25 TT TA2
TASK TA3 PG3 EVERY 25 TT TA3
TASK TA4 PG4 EVERY 25 TT TA4
TASK TA5 PG5 EVERY 25 TT TA5
TASK TA6 PG6 EVERY 25 TT TA6

MULTITAS.TXT
(512 Bytes) 14-mal heruntergeladen

Stackanzeige in Hintergrund

Von Nutzen ist das folgende Programm, das durch Multitasking im Hintergrund läuft und die aktuellen obersten vier Positionen im Stack und die Stacktiefe anzeigt. Dies Programm ist hilfreich, um einige Forth-Befehle und ihre Reaktionen im Stack anzuschauen. Auch zur Fehlersuche in Programmen gut zu gebrauchen. Es wurde dem Manual, Seite 63, entnommen.

HEX CLS 16 CO 5 + C!
0 17 1F 17 SCREEN ST ( ST REV )
: SCL 0 C N>C ST .W ;
: STD # 5 W> ST .W ;
: ST4 4 0 DO 4 I - PICK STD LOOP ;
: STE SCL ST4 FA7E SP@ - 2/ " SP = " ST .W STD ;
TASK STK STE EVERY 1 TS STK
STACK.TXT
(512 Bytes) 14-mal heruntergeladen

bokje
User
Beiträge: 50
Registriert: 02.05.2015, 15:38

Re: H4TH Applications

Beitrag von bokje » 01.05.2017, 19:15

@Heinz: Sure!
@Moggy: Thanks!
@Tokabln: It all depends on the seed ;)
qr.png
qr.png (22.39 KiB) 881 mal betrachtet
(Created with https://davidshimjs.github.io/qrcodejs/ and BASIC PRINT statements, there is no H4TH QR generator, yet!)

Benutzeravatar
PokeMon
User
Beiträge: 4335
Registriert: 31.08.2011, 23:41

Re: H4TH Applications

Beitrag von PokeMon » 01.05.2017, 21:58

Ich bin sehr erstaunt, was mit Forth alles geht.
Bislang hatte ich das für eine eher abstrakte und praxisferne Sprache gehalten.
Ich habe mich aber auch nicht sehr im Detail damit befasste, da nicht nur die Syntax sondern auch die Programmierweise recht gewöhnungsbedürftig ist. Ich bin aber mittlerweile beeindruckt, was damit alles machbar ist. Hut ab ! 8)
Wer seinen Computer ehrt, lebt nicht verkehrt.

Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

Re: H4TH Applications

Beitrag von ZX-Heinz » 02.05.2017, 11:45

PokeMon hat geschrieben:
01.05.2017, 21:58
Ich bin sehr erstaunt, was mit Forth alles geht.
Bislang hatte ich das für eine eher abstrakte und praxisferne Sprache gehalten.
Ich habe mich aber auch nicht sehr im Detail damit befasste, da nicht nur die Syntax sondern auch die Programmierweise recht gewöhnungsbedürftig ist. Ich bin aber mittlerweile beeindruckt, was damit alles machbar ist. Hut ab ! 8)
Dein Interesse erfreut mich sehr! Eine der Stärken von FORTH liegt in der einfachen Verbindung von MC Programmen mit der "Hochsprache" FORTH, der einfachen Möglichkeit, den Wortschatz zu vergrößern, und der hohen Geschwindigkeit (da MC-nah). Extra für Dich hatte ich auch Beispiele zu Multitasking eingestellt. Es freut mich auch sehr, dass bokje eine Modifikation von H4TH für den ZXmore geschrieben hat.
Eine Hürde für das Erlernen von FORTH ist diese "polnisch rückwärts"-Denkweise und die Arbeit mit dem Stack. Wobei letzteres für Assembler-Programmierer die kleinste Schwierigkeit ist.
Gruß, Heinz

bokje
User
Beiträge: 50
Registriert: 02.05.2015, 15:38

Re: H4TH Applications

Beitrag von bokje » 03.05.2017, 00:09

TL gives a task list (status to be added). The tasks are in a linked list; 48 +ORG @ gives the first. However, this address does not point to its (variable length) name, so FNM finds the address of the name, and PNM prints it.

Code: Alles auswählen

HEX
: PNM 20 EMIT DUP DUP C@ 3F AND + 1 + SWAP 1 + DO I C@ EMIT LOOP ;
: FNM T @ BEGIN OVER OVER > WHILE DUP DUP C@ 3F AND + 1 + @ + REPEAT SWAP DROP ;
: TL 48 +ORG BEGIN @ DUP 0= WHILE DUP FNM PNM REPEAT DROP ;
: PRG 1 . ;
TASK FIRST PRG
TASK SECOND PRG

Benutzeravatar
bodo
User
Beiträge: 293
Registriert: 14.02.2007, 17:21
Kontaktdaten:

Re: H4TH Applications

Beitrag von bodo » 05.05.2017, 21:51

Soweit ich mich erinnere, rechnet H4TH nur mit ganzen Zahlen. Daher liegt die hohe Geschwindigkeit von FORTH (gegenüber dem ZX81-BASIC) je nach Anwendung vor allem an der Ganzzahl-Arithmetik. Allerdings ist die Art des Systems, eine Art Hybrid aus Compiler und Interpreter, auch ein Grund.

Es wäre deshalb mal interessant, Benchmarks zwischen ZX80-BASIC und FORTH laufen zu lassen...
B0D0: Real programmers do it in hex.

Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

Re: H4TH Applications

Beitrag von ZX-Heinz » 05.05.2017, 22:19

bodo hat geschrieben:
05.05.2017, 21:51
Soweit ich mich erinnere, rechnet H4TH nur mit ganzen Zahlen. Daher liegt die hohe Geschwindigkeit von FORTH (gegenüber dem ZX81-BASIC) je nach Anwendung vor allem an der Ganzzahl-Arithmetik. Allerdings ist die Art des Systems, eine Art Hybrid aus Compiler und Interpreter, auch ein Grund.

Es wäre deshalb mal interessant, Benchmarks zwischen ZX80-BASIC und FORTH laufen zu lassen...
Hallo bodo,
in
viewtopic.php?f=7&t=566#p5867
hat Bernd den Primzahltest mit dem ZX80 gemacht: >1min. In H4TH sind das nur ein paar Sekunden:
viewtopic.php?f=7&t=566&start=25#p29448

Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

Re: H4TH Applications: GRAPHIC

Beitrag von ZX-Heinz » 05.05.2017, 22:28

GRAPHIC
Damit es nicht verloren geht und weil es eigentlich hierher gehört: In
viewtopic.php?f=2&t=2151#p27462
hat bokje auch für H4TH eine Pseudographic inplementiert: Der Befehl M N PLOT setzt einen 2x2 Pixel großen Block auf den Bildschirm. Hierauf aufbauend lassen sich Geraden u.a. zeichnen. Auch das Bild in
viewtopic.php?f=2&t=2338&p=29932#p29780
ist hiermit (und mit der vorgeschlagenen RND-Funktion) gezeichnet worden.
Hier ein neues Bild, bei dem SIN, COS und SQRT implementiert wurden:
spinne.jpg
spinne.jpg (17.21 KiB) 652 mal betrachtet

Benutzeravatar
ZX-Heinz
User
Beiträge: 1256
Registriert: 05.12.2011, 14:45

Re: H4TH Applications - Joachims UART-board

Beitrag von ZX-Heinz » 23.07.2017, 20:47

Joachims serielles Board mit der 8251-SIO läuft natürlich auch bestens am H4TH-Zeddy mit dem zusätzlichen Vorteil, dass H4TH ja ASCII-Code benutzt. Hier ist ein Test/User-Program. Die Adressen wurden auf C/D = #EF/#E7 gesetzt, um Komplikationen mit dem Vdrive (A2=0!!) zu vermeiden. Also nur die Jumper JP1.3 und JP1.4 setzen!

Editiert 18.8.2017:

: SIOINI ( ZXSER JOACH8N1 J3-4) CODE 3E 40 D3 EF 3E 4E D3 EF 3E 05 D3 EF C9 ;C HEX ;
: SIORD CODE DB EF 1F 1F 30 FA DB E7 21 00 00 6F CF C9 ;C ;
: SIOWR CODE D7 7D D3 E7 DB EF 1F 30 FB C9 ;C ;
: SIOTEST 60 40 DO I SIOWR LOOP ;
: R1 BEGIN SIORD EMIT 0 UNTIL ;
: RW BEGIN SIORD . 0 UNTIL ;


Start mit SIOINI. Dann z.B. SIOTEST(senden) oder R1(empfangen) Eingestellt sind 8N1 und keine Flusssteuerung.
Zuletzt geändert von ZX-Heinz am 18.08.2017, 18:46, insgesamt 5-mal geändert.

Benutzeravatar
tokabln
User
Beiträge: 1054
Registriert: 10.11.2013, 00:24
Wohnort: D, Berlin (Mariendorf)

Re: H4TH Applications

Beitrag von tokabln » 23.07.2017, 21:04

Man Heinz,

Du bist ja was emsig... hast Du keine anderen Hobbies :mrgreen:

Wenn meine Zeit es mal wieder zulässt, werde ich das sicher mal testen. Vorher muß ich aber noch etwas fertig stellen.

Wünsche einen schönen Restsonntag
Lieben Gruß Torsten
BMZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500, Amiga 1200, Atari Portfolio, HP200LX, IBM PC 5155, TP755c, T41, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e

Antworten