SPDX-FileCopyrightText: Copyright (c) 2O22, Theodore Preduta.
SPDX-License-Identifier: BSD-2-Clause

Rule 11O cellular automata.

Just run this file.  The program will exit when it receives a key input
(due to buffering you may also need to hit return).

Load modules/basic-io.ooonooo.
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 n    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 .    0000000000 0000000000 0000000000 0000000000 000000
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 i    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 -    0000000000 0000000000 0000000000 0000000000 00000
0000000000 c    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000000
0000000000 i    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 s    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 a    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000
0000000000 b    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000000
0000000000 /    0000000000 0000000000 0000000000 0000000000 0000000
0000000000 s    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 e    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 l    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000000
0000000000 u    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000
0000000000 d    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 m    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000000
0000000000 24   0000000000 0000000000 0000
0000000000 1O   0000000000 the offset
000000000

Load modules/basic-math.ooonooo.
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 n    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 .    0000000000 0000000000 0000000000 0000000000 000000
0000000000 h    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000
0000000000 t    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000
0000000000 a    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000
0000000000 m    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000000
0000000000 -    0000000000 0000000000 0000000000 0000000000 00000
0000000000 c    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000000
0000000000 i    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 s    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 a    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000
0000000000 b    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000000
0000000000 /    0000000000 0000000000 0000000000 0000000000 0000000
0000000000 s    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 e    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 l    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000000
0000000000 u    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000
0000000000 d    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 m    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000000
0000000000 26   0000000000 0000000000 000000
0000000000 2O   0000000000 0000000000 the offset
000000000

Load modules/basic-bitmath.ooonooo.
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 n    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 .    0000000000 0000000000 0000000000 0000000000 000000
0000000000 h    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000
0000000000 t    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000
0000000000 a    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000
0000000000 m    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000000
0000000000 t    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000
0000000000 i    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 b    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000000
0000000000 -    0000000000 0000000000 0000000000 0000000000 00000
0000000000 c    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000000
0000000000 i    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 s    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 a    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000
0000000000 b    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000000
0000000000 /    0000000000 0000000000 0000000000 0000000000 0000000
0000000000 s    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 e    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 l    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000000
0000000000 u    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000
0000000000 d    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 o    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 m    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000000
0000000000 29   0000000000 0000000000 000000000
0000000000 3O   0000000000 0000000000 0000000000 the offset
000000000

Create a display function that displays a single character, consumes the current state and a shift.
0000000000 drop 00
0000000000 eval 0
0000000000 wchr 0000000000 0000000000 0000000000 0
0000000000 bnch 000000
0000000000 swap 0000
0000000000 #    0000000000 0000000000 0000000000 0000000000 00000
0000000000 swap 0000
0000000000 spce 0000000000 0000000000 0000000000 0000000000 00
0000000000 eval 0
0000000000 and  0000000000 0000000000 0000000000 0000000000 0000000000 00
0000000000 1    0000000000 0
0000000000 eval 0
0000000000 shr  0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 13   0000000000 000
0000000000 P    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 P    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 2    00
0000000000 1O   0000000000
0000000

Create a display function that displays a row of characters.
0000000000 eval 0
0000000000 bnch 000000
0000000000 swap 0000
0000000000 PPP  0000000000 0000000000 0
0000000000 swap 0000
0000000000 NOP  0000000000
0000000000 dup  000
0000000000 eval 0
0000000000 subt 0000000000 0000000000 0000000000 0000000000 0
0000000000 swap 0000
0000000000 1    0000000000 0
0000000000 swap 0000
0000000000 eval 0
0000000000 PP   0000000000 0000000000
0000000000 swap 0000
0000000000 rot  00000
0000000000 dup  000
0000000000 rot  00000
0000000000 dup  000
0000000000 19   0000000000 000000000
0000000000 P    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 P    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 P    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 3    000
0000000000 11   0000000000 0
0000000

Create a function for the OOO (O) pattern.
0000000000 O    0000000000
0000000000 1    0
0000000000 O    0000000000 0000000000 0000000000 0000000000 00000000
0000000000 1    0
0000000000 8O   0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
0000000

Create a function for the OO1 (1) pattern.
0000000000 1    0000000000 0
0000000000 1    0
0000000000 1    0000000000 0000000000 0000000000 0000000000 000000000
0000000000 1    0
0000000000 81   0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000

Create a function for the O1O (2) pattern.
0000000000 1    0000000000 0
0000000000 1    0
0000000000 2    0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 1    0
0000000000 82   0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00
0000000

Create a function for the O11 (3) pattern.
0000000000 1    0000000000 0
0000000000 1    0
0000000000 3    0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 1    0
0000000000 83   0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000
0000000

Create a function for the 1OO (4) pattern.
0000000000 O    0000000000
0000000000 1    0
0000000000 4    0000000000 0000000000 0000000000 0000000000 0000000000 00
0000000000 1    0
0000000000 84   0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000
0000000

Create a function for the 1O1 (5) pattern.
0000000000 1    0000000000 0
0000000000 1    0
0000000000 5    0000000000 0000000000 0000000000 0000000000 0000000000 000
0000000000 1    0
0000000000 85   0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000

Create a function for the 11O (6) pattern.
0000000000 1    0000000000 0
0000000000 1    0
0000000000 6    0000000000 0000000000 0000000000 0000000000 0000000000 0000
0000000000 1    0
0000000000 86   0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000
0000000

Create a function for the 111 (7) pattern.
0000000000 O    0000000000
0000000000 1    0
0000000000 7    0000000000 0000000000 0000000000 0000000000 0000000000 00000
0000000000 1    0
0000000000 87   0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000
0000000

Create a function that processes a row.
0000000000 eval 0
0000000000 bnch 000000
0000000000 eval 0
0000000000 add  0000000000 0000000000 0000000000 0000000000
0000000000 1    0000000000 0
0000000000 swap 0000
0000000000 R    0000000000 0000000000 00
0000000000 swap 0000
0000000000 NOP  0000000000
0000000000 dup  000
0000000000 eval 0
0000000000 subt 0000000000 0000000000 0000000000 0000000000 0
0000000000 swap 0000
0000000000 1    0000000000 0
0000000000 swap 0000
^ loop end ^
0000000000 eval 0
0000000000 or   0000000000 0000000000 0000000000 0000000000 0000000000 000
^ set the destination ^
0000000000 eval 0
0000000000 shl  0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 swap 0000
^ make the bitmask ^
0000000000 eval 0
0000000000 add  0000000000 0000000000 0000000000 0000000000
0000000000 rot  00000
0000000000 33   0000000000 0000000000 0000000000 0000000000 000
^ get the destination ^
0000000000 eval 0
0000000000 eval 0
0000000000 add  0000000000 0000000000 0000000000 0000000000
0000000000 8O   0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
^ collect the result ^
0000000000 eval 0
0000000000 shr  0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 rot  00000
0000000000 dup  000
0000000000 swap 0000
0000000000 eval 0
0000000000 and  0000000000 0000000000 0000000000 0000000000 0000000000 00
0000000000 eval 0
0000000000 shl  0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 7    0000000000 0000000
^ extract the pattern ^
0000000000 swap 0000
0000000000 rot  00000
0000000000 dup  000
0000000000 rot  00000
0000000000 dup  000
0000000000 rot  00000
0000000000 dup  000
^ setup some copies ^
0000000000 45   0000000000 0000000000 0000000000 0000000000 00000
0000000000 R    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 00
0000000000 1    0
0000000000 12   0000000000 00
0000000

Create the main loop function.
0000000000 eval 0
0000000000 bnch 000000
0000000000 eval 0
0000000000 pchr 0000000000 0000000000 0000000000 00
0000000000 NOP  0000000000
0000000000 E    0000000000 0000000000 000000000
^ check for keyboard input ^
0000000000 eval 0
0000000000 shl  0000000000 0000000000 0000000000 0000000000 0000000000
0000000000 swap 0000
0000000000 1    0000000000 0 note we do this extra shift to clear the last bit, kinda a hack but it seems to work
0000000000 eval 0
0000000000 shr  0000000000 0000000000 0000000000 0000000000 0000000000 0
0000000000 swap 0000
0000000000 33   0000000000 0000000000 0000000000 0000000000 000
^ shift the destination on to the source ^
0000000000 drop 00
0000000000 eval 0
0000000000 R    0000000000 0000000000 00
0000000000 31   0000000000 0000000000 0000000000 0000000000 0
^ update the state         ^
0000000000 drop 00
0000000000 eval 0
0000000000 wchr 0000000000 0000000000 0000000000 0
0000000000 \n   0000000000 0000000000
0000000000 drop 00
0000000000 eval 0
0000000000 PPP  0000000000 0000000000 0
0000000000 3O   0000000000 0000000000 0000000000 0000000000
^ print out the row        ^
0000000000 26   0000000000 0000000000 000000
0000000000 E    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 000000000
0000000000 1    0
0000000000 19   0000000000 000000000
0000000

Start the main loop.
0000000000 2    00
0000000000 E    0000000000 000000000
0
00