prog8/examples/cx16/automatons.p8

91 lines
2.2 KiB
Plaintext
Raw Normal View History

; Wolfram's Cellular Automatons.
%import math
%import conv
%import textio
%option no_sysinit
%zeropage basicsafe
main {
ubyte rulenumber
bool[256] cells_previous
bool[256] cells
sub start() {
void cx16.screen_mode(128, false)
setup()
txt.clear_screen()
print_title(rulenumber)
init_automaton(rulenumber)
ubyte y
for y in 32 to 199+32 {
cx16.FB_cursor_position((320-len(cells))/2,y)
cx16.FB_set_pixels(cells, len(cells))
sys.memcopy(cells, cells_previous, sizeof(cells))
ubyte @zp x
for x in 0 to len(cells)-1 {
cells[x] = generate(x) ; next generation
}
}
}
sub setup() {
str userinput = "?"*10
txt.print("\n\nwolfram's cellular automatons.\n\n")
txt.print("suggestions for interesting rules:\n 30, 45, 90, 110, 117, 184.\n\n")
txt.print("enter rule number, 0-255: ")
void txt.input_chars(userinput)
rulenumber = conv.str2ubyte(userinput)
txt.print("\nstart state: (r)andomize or (s)ingle? ")
void txt.input_chars(userinput)
if userinput[0]=='r' {
for cx16.r0L in 0 to len(cells)-1
cells[cx16.r0L] = math.rnd() >= 128
} else {
cells[len(cells)/2] = true
}
}
sub print_title(ubyte number) {
cx16.FB_cursor_position(92,16)
for cx16.r9L in "Cellular Automaton #" {
cx16.GRAPH_put_next_char(cx16.r9L)
}
uword num_str = conv.str_ub(number)
do {
cx16.GRAPH_put_next_char(@(num_str))
num_str++
} until @(num_str)==0
}
bool[8] states
sub init_automaton(ubyte number) {
ubyte state
for state in 0 to 7 {
number >>=1
if_cs
states[state] = true
else
states[state] = false
}
}
sub generate(ubyte x) -> bool {
ubyte pattern = 0
if cells_previous[x-1]
pattern |= %100
if cells_previous[x]
pattern |= %010
if cells_previous[x+1]
pattern |= %001
return states[pattern]
}
}