All pastes #421167 Raw Edit

tri-wave

public text v1 · immutable
·published 2007-04-02 17:42 UTC
rendered paste body
: +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