000
31.05.2017, 16:20 Uhr
_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
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 |