mirror of
https://github.com/irmen/prog8.git
synced 2024-12-01 00:50:00 +00:00
e9edffa9f0
Just use an explicit sys.memcopy(src, dest, sizeof(dest)) or assign array members individually.
91 lines
2.2 KiB
Lua
91 lines
2.2 KiB
Lua
; 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]
|
|
}
|
|
}
|
|
|