: +field ( n "name" -- ) over create , + does> ( addr -- addr' ) @ + ; : field: ( "name" -- ) aligned 1 cells +field ; \ set sign of value at addr. : positive ( addr -- ) dup @ abs swap ! ; : negative ( addr -- ) dup @ abs negate swap ! ; \ add n1 to the value at addr, returning the original value. : increment ( n1 addr -- n2 ) tuck @ tuck + rot ! ; 0 1 cells field: tri-cur 1 cells field: tri-inc 1 cells field: tri-max 1 cells field: tri-min drop : bottom? ( wav -- flag ) dup tri-cur @ swap tri-min @ <= ; : top? ( wav -- flag ) dup tri-cur @ swap tri-max @ >= ; : tri-wave ( min max inc -- ) create 1 , , , , does> ( -- cur ) dup bottom? if dup tri-inc positive then dup top? if dup tri-inc negative then dup tri-inc @ swap tri-cur increment ; 1 4 1 tri-wave a-wave \ generates a series: 1 2 3 4 3 2 1 2 3... \ with repeated calls to a-wave a-wave . a-wave . a-wave . a-wave . a-wave . a-wave . a-wave . a-wave . a-wave . a-wave . a-wave . a-wave . cr bye