# As recommended by the Mecrisp-Stellaris unofficial docs
# @ https://mecrisp-stellaris-folkdoc.sourceforge.io/serial-terminals.html
+TTY ?= /dev/ttyUSB0
HW_FLOW_CONTROL ?= 1
LINESPEED = ""
endif
connect:
- picocom -b 115200 -f h /dev/ttyUSB0 \
+ picocom -b 115200 -f h $(TTY) \
--imap lfcrlf,crcrlf \
--omap delbs,crlf \
--send-cmd "ascii-xfr -s $(LINESPEED)"
* [GPIO](gpio.md)
* [Terminal](terminal.md)
* [UART](uart.md)
+* [RNG](rng.md)
* [Wordle](wordle.fs)
## System
--- /dev/null
+---
+title: Random Number Generator
+file: rng.fs
+---
+# RNG
+
+The random number generator relies upon the rp2040's Ring Oscilator and it's
+random bit register to generate a random integer.
+
+# Random Number Generator
+
+### random ( bits -- n )
+
+Given a number of bits, leave a number within that range on the stack.
+
+```forth
+8 random . 219 ok
+```
: [cyan/bg] ( -- ) BG CYAN + [format] ;
\ Attributes
-: [bold] ( -- ) BOLD [format] ;
+: [bold] ( -- ) BRIGHT [format] ;
: [dim] ( -- ) DIM [format] ;
: [italic] ( -- ) ITALIC [format] ;
: [underline] ( -- ) UNDERLINE [format] ;
\ Words for dealing with the system timer peripheral
+\ Section 4.6, rp2040 datasheet
$e0000000 constant PPB_BASE
PPB_BASE $e100 + constant NVIC_ISER \ Interrupt set-enable register
CREATE lexicon SIZE ALLOT
lexicon VARIABLE lex-ptr
+: advance ( -- ) WORDSIZE lex-ptr +! ;
+: store ( size addr -- ) lex-ptr @ SWAP MOVE advance ;
+
\ Given an address for storage, read and store
\ a string to memory.
: load-lexicon ( addr -- )
lex-ptr @ WORDSIZE ACCEPT
WORDSIZE =
WHILE
- WORDSIZE lex-ptr +!
+ advance
REPEAT ;
-: advance ( -- ) WORDSIZE lex-ptr +! ;
-
-: store ( size addr -- ) lex-ptr @ SWAP MOVE advance ;
-
: fake-lexicon ( addr -- )
s" women" store
s" nikau" store
: char= ( char word index -- flag ) char@ = ;
\ Select a random word from lexicon
-: randword. ( -- addr ) 2 random word. ;
+: randword. ( -- ) 2 random word. ;
: randword@ ( -- addr ) 2 random word@ ;
\ See if a word contains a letter