Robotrontechnik-Forum

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

Robotrontechnik-Forum » Technische Diskussionen » Pseudozufallszahlen für KC Forth 3.1 (Modul M026 für den KC 85/2-4) » Themenansicht

Autor Thread - Seiten: -1-
000
31.05.2017, 16:20 Uhr
_lars

Avatar von _lars

Hallo allerseits,

ich weiß nicht, ob ich mit diesem Post im richtigen Forum gelandet bin, da es eher um Software als um Hardware geht aber Software ist ja auch was technisches …

Ich weiß nicht, ob es hier viele Leute gibt, welche Forth nutzen, zumindest damals (1988 in Dresden an der MANOS) war ich glaube ich der einzige, welcher sich mal das Forth-Modul für die Benutzung im Computer-Kabinet ausgeliehen hat.

Nun, ich fand Forth damals besser als Basic da Forth besser erweiterbar ist als Basic, Erweiterbarkeit ist sogar das Grundprinzip der Programmierung in Forth.

Leider ist die für Forth notwendige Denkweise aufgrund der stackbasierten Programmierung so anders als das was man von Basic oder Assembler gewohnt ist. Dabei sind sogar größere Projekte in Forth ohne weiteres möglich wie z.B. OpenFirmware zeigt, welche in Forth implementiert ist.

Lange Rede, kurzer Sinn, hier ist etwas für die KC Forth Freunde:

Wie vielleicht bekannt ist, enthält der Forth Standard kein Wort zur Erzeugung von Pseudozufallszahlen. Aber kein Problem heutzutage, Google findet unter „forth random number generator“ hier http://www.forth.org/fd/FD-V02N2.pdf und hier https://www.forth.com/starting-forth/10-input-output-operators/ diesen Algorithmus:

A Random Number Generator
This simple random number generator can be useful for games, although for more sophisticated applications such as simulations, better versions are available.


Quellcode:

( Random number generation -- High level )
VARIABLE rnd HERE rnd !
: RANDOM  rnd @ 31421 *  6927 +  DUP rnd ! ;
: CHOOSE  ( u1 -- u2 )  RANDOM UM*  NIP ;

( where CHOOSE returns a random integer
  within the range 0 = or < u2 < u1. )



Here's how to use it:

To choose a random number between zero and ten (but exclusive of ten) simply enter


Quellcode:

10 CHOOSE



and CHOOSE will leave the random number on the stack.


Schön und gut, nicht weiter kompliziert.

Leider kann man diesen Algorithmus nicht sofort und ohne weiteres eins zu eins für KC Forth übernehmen denn da fehlen ein paar Wortdefinitionen. Mit Google, Geduld und Spucke habe ich dann diese Portierung hinbekommen:


Quellcode:

0 VARIABLE rnd
HERE rnd !
: RANDOM rnd @ 31421 * 6927 + DUP rnd ! ;
: CHOOSE RANDOM UM* NIP ;



https://github.com/larsbrinkhoff/lbForth/blob/master/src/core.fth


Quellcode:

: um*   1 2>r 0 0 rot 0 begin r@ while
           2r> 2dup 2* 2>r and if 2swap 2over d+ 2swap then 2dup d+
        repeat 2drop 2r> 2drop ;

: UM* 1 2>R 0 0 ROT 0 BEGIN R@ WHILE 2R> 2DUP 2* 2>R AND IF 2SWAP 2OVER D+ 2SWAP ENDIF 2DUP D+ REPEAT 2DROP 2R> 2DROP ;



https://github.com/larsbrinkhoff/lbForth/blob/master/src/dictionary.fth

https://github.com/larsbrinkhoff/lbForth/blob/master/src/kernel.fth


Quellcode:

?: 2>r   r> swap rot >r >r >r ;
?: 2r>   r> r> r> rot >r swap ;

: 2>R R> SWAP ROT >R >R >R ;
: 2R> R> R> R> ROT >R SWAP ;



https://github.com/larsbrinkhoff/lbForth/blob/master/src/core.fth


Quellcode:

?: 2*    dup + ;

: 2* DUP + ;


: 2swap   >r rot rot r> rot rot ;

: 2SWAP >R ROT ROT R> ROT ROT ;

: 2over   >r >r 2dup r> rot rot r> rot rot ;

: 2OVER >R >R 2DUP R> ROT ROT R> ROT ROT ;



https://github.com/larsbrinkhoff/lbForth/blob/master/src/kernel.fth


Quellcode:

?: 2drop   drop drop ;

: 2DROP DROP DROP ;




https://github.com/zeroflag/punyforth/issues/9


Quellcode:

: r@ ( -- n )
    r> r> dup >r swap >r ;

: R@ R> R> DUP >R SWAP >R ;




https://github.com/larsbrinkhoff/lbForth/blob/master/src/kernel.fth


Quellcode:

?: nip    swap drop ;

: NIP SWAP DROP ;





Der Code Funktioniert soweit ganz gut, natürlich sind die Zufallszahlen nicht für Crypto geeignet …

Hier noch mal der ganze Code auf Screens aufgeteilt mit einem grafischen Testprogramm welches „Konfetti“ produziert, zum Kopieren und Einfügen im JKCEMU (Rechte Maustaste über dem KC Bildschirm nachdem man Forth gestartet hat)


Quellcode:

1 SCR !
EDITOR
0 P : 2>R R> SWAP ROT >R >R >R ;
1 P : 2R> R> R> R> ROT >R SWAP ;
2 P : 2* DUP + ;
3 P : 2SWAP >R ROT ROT R> ROT ROT ;
4 P : 2OVER
5 P   >R >R 2DUP
6 P   R> ROT ROT R> ROT ROT ;
7 P : 2DROP DROP DROP ;
8 P : R@ R> R> DUP >R SWAP >R ;
9 P : NIP SWAP DROP ;
10 P : UM* 1 2>R 0 0 ROT 0 BEGIN R@
11 P   WHILE 2R> 2DUP 2* 2>R AND
12 P   IF 2SWAP 2OVER D+ 2SWAP ENDIF
13 P   2DUP D+
14 P   REPEAT 2DROP 2R> 2DROP ;
FORTH
1 LOAD

2 SCR !
EDITOR
0 P 0 VARIABLE rnd
1 P HERE rnd !
2 P : RANDOM
3 P   rnd @ 31421
4 P   * 6927 + DUP rnd ! ;
5 P : CHOOSE RANDOM UM* NIP ;
FORTH
2 LOAD

3 SCR !
EDITOR
0 P : RANDOMPIX  CR 0
1 P   12 EMIT
2 P   DO ?TERMINAL
3 P     IF LEAVE ENDIF
4 P     16 CHOOSE INKP
5 P     1 320 CHOOSE 256 CHOOSE
6 P     PIX
7 P   LOOP ;
FORTH
3 LOAD

RANDOMPIX




Viel Spaß!

_lars
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
31.05.2017, 20:44 Uhr
maleuma



Hallo _lars,

interessante Sache. Habe ich gleich einmal ausprobiert - funktioniert
Nun wollte ich sehe wie sich das Bild mit RANDOMPIX füllt, aber nach einer ganzen Weile ist dann immer Schluss mit dieser Anzeige:

Ob das an FORTH selbst liegt?
--
Mario.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
31.05.2017, 22:10 Uhr
_lars

Avatar von _lars


Zitat:
maleuma schrieb
Hallo _lars,

interessante Sache. Habe ich gleich einmal ausprobiert - funktioniert
Nun wollte ich sehe wie sich das Bild mit RANDOMPIX füllt, aber nach einer ganzen Weile ist dann immer Schluss mit dieser Anzeige:

Ob das an FORTH selbst liegt?



Soweit ich das übersehe sollte das eigentlich nicht passieren, es passiert bei mir aber auch. Ich dachte bisher, dass ich versehentlich einen Tastendruck ausgelöst hätte, da es aber auch bei Dir passiert muss es wohl einen anderen Grund haben. Ich kann im Moment aber nur raten, was es ist.

Viele Grüße,

_lars
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
31.05.2017, 22:20 Uhr
Bert



So richtig zufällig sieht das Bild aber nicht aus. Da sind eindeutig Muster zu erkennen...

Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
31.05.2017, 22:56 Uhr
_lars

Avatar von _lars


Zitat:
Bert schrieb
So richtig zufällig sieht das Bild aber nicht aus. Da sind eindeutig Muster zu erkennen...

Grüße,
Bert



ich schrieb doch bereits:

natürlich sind die Zufallszahlen nicht für Crypto geeignet …
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
02.06.2017, 10:18 Uhr
_lars

Avatar von _lars


Zitat:
maleuma schrieb
Hallo _lars,

interessante Sache. Habe ich gleich einmal ausprobiert - funktioniert
Nun wollte ich sehe wie sich das Bild mit RANDOMPIX füllt, aber nach einer ganzen Weile ist dann immer Schluss mit dieser Anzeige:

Ob das an FORTH selbst liegt?



Hallo Maleuma,

manchmal ist man blind. Es liegt an dem von mir geposteten Code, genauer gesagt an der richtigen Verwendung des von mir definierten Wortes "RANDOMPIX". Das nimmt nämlich den Wert, wie viele Zufallspixel gezeichnet werden sollen, vom Stack. Für die meisten möglichen Pixel muss es deshalb heißen:


Quellcode:

32767 RANDOMPIX



statt nur RANDOMPIX. Dann malt das Programm 32767 (größte positive 16Bit Zahl) Konfettis.

Ich hatte übersehen, dass "DO" zwei Parameter auf dem Stack erwartet. Einer davon steht ja auch im Code drin, die "0" nach dem "CR". Irgendwie war ich der irrigen Annahme, dass DO ohne Parameter dann endlos läuft, was natürlich Unsinn ist.

Viele Grüße,

_lars
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
08.06.2017, 12:38 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

Übrigens musst du gar nicht UM* definieren. Das ist FORH83-Standard.
In fig-FORTH heißt das U*, und das gibt es im KC-FORTH:


Quellcode:

VARIABLE rnd HERE rnd !
: RANDOM  rnd @ 31421 *  6927 +  DUP rnd ! ;
: CHOOSE  ( u1 -- u2 )  RANDOM U*  SWAP DROP ;



s.a. https://atariwiki.org/wiki/Wiki.jsp?page=Converting%20FIG-Forth%20Programs%20to%20Forth-83
--
VolkerP

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

Dieser Beitrag wurde am 08.06.2017 um 12:50 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
08.06.2017, 14:44 Uhr
_lars

Avatar von _lars


Zitat:
volkerp schrieb
Übrigens musst du gar nicht UM* definieren. Das ist FORH83-Standard.
In fig-FORTH heißt das U*, und das gibt es im KC-FORTH:


Quellcode:

VARIABLE rnd HERE rnd !
: RANDOM  rnd @ 31421 *  6927 +  DUP rnd ! ;
: CHOOSE  ( u1 -- u2 )  RANDOM U*  SWAP DROP ;



s.a. https://atariwiki.org/wiki/Wiki.jsp?page=Converting%20FIG-Forth%20Programs%20to%20Forth-83



Erst mal vielen Dank für den Link, der ist sehr hilfreich.

Das mit dem U* hatte ich schon fast vermutet, ich war mir aber nicht sicher was das Zahlenformat angeht, ich dachte UM* kann mehr Stellen. Man sieht, die 80er, in denen ich mehr Forth gemacht habe sind lange her. Vieles ist einfach nicht mehr präsent.

Viele Grüße,

_lars
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
08.06.2017, 15:42 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

may the forth be with you ...
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

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