\ We should be able to define the size of the space in a manner that is \ independent of the topology (so long as it will fit), and define some \ I/O words and buffer words that know about this arrangement variable volume variable volume/space : #modules/space (s -- n ) #modules/x #modules/y #modules/z * * ; create space-l-array 64 allot create subspace-l-array 64 allot : full-space #dim @ 0 ?do i space-l-array + c@ 1 swap << ( len ) i 0 = if #modules/x / then ( len' ) i 1 = if #modules/y / then ( len'' ) i 2 = if #modules/z / then ( len''' ) i limit 1- <> if by else sector then loop ; : space (s n -- ) by 1 top-dim @ << dup #cells ! dup volume ! volume/space ! #dim @ 0 ?do i lp 2@ drop ( log.len ) i space-l-array + c! loop full-space delay ; \ Only internal dimensions (dimensions that aren't glued) can have \ sizes in the subspace that differ from their sizes in the whole space. \ "subspace" thus allows us to slice our space along the internal \ dimensions. : subspace (s n -- ) by 1 top-dim @ << dup #cells ! volume ! #dim @ 0 ?do i lp 2@ drop ( log.len ) i subspace-l-array + c! loop #dim @ 0 ?do i subspace-l-array + c@ 1 swap << ( len ) i 3 < if i subspace-l-array + c@ i space-l-array + c@ <> i {{ glue-x? glue-y? glue-z? }} @ and abort" Can only split internal dimensions!" i {{ #modules/x #modules/y #modules/z }} / then ( len' ) i limit 1- <> if by else subsector then loop delay ; : select-subspace (s n1 n2 ... n#dim -- ) select-subsector ; \ Create words for returning the size of all possible space and \ subspace dimensions (and sector and subsector dimensions). : dim-exists? (s n -- ) #dim @ >= abort" Dimension out of range!" ; : Un (s -- n ) dup dim-exists? lp/sector 2@ drop 1 swap << ; : Un' (s -- n ) dup dim-exists? lp 2@ drop 1 swap << ; : Xn (s -- n ) dup dim-exists? space-l-array + c@ 1 swap << ; : Xn' (s -- n ) dup dim-exists? subspace-l-array + c@ 1 swap << ; : create-Un (s n -- ) create , does> @ Un ; : create-Un' (s n -- ) create , does> @ Un' ; : create-Xn (s n -- ) create , does> @ Xn ; : create-Xn' (s n -- ) create , does> @ Xn' ; \ Sector and subsector dimension sizes 0 create-Un U 0 create-Un' U' 1 create-Un V 1 create-Un' V' 2 create-Un W 2 create-Un' W' \ Space and subspace dimension sizes 0 create-Xn X 0 create-Xn' X' 1 create-Xn Y 1 create-Xn' Y' 2 create-Xn Z 2 create-Xn' Z' \ If we know the size of the space, we know how to run a frame with \ display sync. : run-frame scan-format X log esc! run frame Y 1 ?do run line loop display 0 map! scan-format 0 stm! ; : show-frame site-src site display site run-frame step ; \ File-io for a volume 0 create-buffer pattern begin-defaults select definitions : module' (s module -- module' ) 1+ dup #modules >= if #modules - then module ; end-defaults : pattern>cam full-space site-src host #modules 0 do select i module' scan-io pattern i #modules part loop select all step ; : cam>pattern full-space site-src site display site #modules 0 do select i module' scan-io pattern i #modules part read loop select all step ; : full-pattern volume @ ['] pattern change-reglen ; : cam>file (s file.pstr -- ) full-pattern cam>pattern pattern save-buffer ; : file>cam (s file.pstr -- ) full-pattern pattern load-buffer pattern>cam ; : random>cam layer-mask @ full-space site-src site layer-mask ! host #modules 0 do select i module' scan-io pattern i #modules part randomize-buf loop select all step ; \ : file>cam (s filename-pstr -- ) \ \ volume @ ['] pattern change-reglen \ pattern load-buffer \ \ site-src host \ scan-io pattern \ \ *step* \ ; \ \ : cam>file (s filename-pstr -- ) \ \ volume @ ['] pattern change-reglen \ \ site-src site \ display site \ scan-io read pattern \ \ \ *********** fix a bug temporarily *********** \ \ buffer length bounds do i c@ drop loop \ \ *step* \ \ pattern save-buffer \ ; variable space-io-bufptr variable space-io-usrbuf variable space-io-reglen variable space-io-direction : spacebuf (s x y z -- ) space-io-reglen @ reglen ! #modules/x #modules/y * * -rot #modules/x * + + reglen @ * /w* dup space-io-bufptr @ + bufptr ! space-io-usrbuf @ + usrbuf ! space-io-direction @ if read then ; : (space-io) start-instruction select 0 0 0 xyz scan-io finish-instruction bufptr @ space-io-bufptr ! usrbuf @ space-io-usrbuf ! read? space-io-direction ! reglen @ #modules/space / dup space-io-reglen ! reglen ! #modules/z 0 ?do #modules/y 0 ?do #modules/x 0 ?do i j k or or 0<> if select i j k xyz scan-io i j k spacebuf then loop loop loop ; create-mode space-io ' (space-io) , \ Insert any special "space-io" definitions here. only forth also step-list also definitions