\ een MINAI oplossing voor noForth - Albert Nijhof - nov2025

decimal
0 value RND
\ 16bits
: RANDOM   ( -- u )
    rnd 31421 * 6927 + hx FFFF and dup to rnd ;
: KIES ( u1 -- u2 )         \ u2 in [0,u1]
    random
    [ 1 cells 3 < ] literal     \ 16bits forth?
    if   um* nip exit
    then * 16 rshift ;          \ 32bits

\ Tekst inlezen -------------------
0 value VAN
0 value TOT
: {IN, ( <tekst> -- )       \ Tekstinvoer tot afsluiter '}'
    chere to van
    begin  bl-word count over c@ ch } <>
    while  m, bl c,
    repeat 2drop chere to tot
    van 4 m,                            \ ***
    align ;

: TXT= ( ccc -- )   \ ccc = naam voor de zojuist ingelezen tekst
    create van , tot ,
    does> @+ to van @ to tot ;


\ AI -------------------
: {SCAN} ( tot adr ch -- tot adr2 )   \ circulair zoeken naar ch
    >r          r@ scan 2dup =
    if drop van r@ scan then rdrop ;

: {1+} ( a -- a+1 | van )           \ circulaire 1+
    1+ dup tot < ?exit   drop van ;

create PATROON 4 aligned allot
0 value PLEN
: PL ( len -- ) 1 max 4 min to plen ;   \ PLEN-beveiliger

0 value TELLER

: AI ( -- ) 7 to teller  \ produceer 1 regel met 7 woorden
    plen pl
    tot van 2dup - kies +                   \ tot adr
    bl {scan}                               \ tot adr2
    dup plen cr type
    dup patroon plen move
    begin {1+}                              \ tot adr2+
        patroon c@ {scan}                   \ tot adr3
        dup plen patroon over s<> 0=
        if   {1+}                           \ tot adr3+
             dup patroon plen move
             dup plen + 1- c@   dup emit
             bl = +to teller
        then teller 0=
    until 2drop ;

\ tools  -------------------
: AIS ( n -- ) 48 umin for ai next ;    \ voer n AI's uit
: .TXT ( -- ) van tot over - cr type ;
shield MINIAI\

\ 2drop 2drop drop  \ voor de values, in noForth m
\ <><>


(*      noForth specifieke woorden

VALUE ccc neemt geen waarde aan bij de definitie van ccc (noForth m en r)

CHERE geeft de dictionary pointer

BL-WORD gebruikt REFILL en vindt daardoor altijd iets
: BL-WORD ( -- csa )
    begin bl word       dup c@ 0=
    while drop refill   0= abort" REFILL mislukt "
    repeat

CH pakt altijd het karakter dat volgt.
Gebruik CHAR als dat karakter niet onmiddelijk volgt.

: SCAN ( tot van ch -- tot adr )  \ zoek ch in het gebied van,tot
    >r
    begin 2dup >
    while count r@ =
    until 1-
    then r> drop ;

    gevonden: adr is adres waar ch staat
    niet gevonden: adr = tot

: M, ( adr len -- ) 0 ?do count c, loop drop ;
: S<> ( a1 n1 a2 n2 -- vlag ) compare 0<> ;
: ?EXIT    s" IF EXIT THEN" evaluate ; immediate
: RDROP    s" R> DROP"      evaluate ; immediate
*)
