UF - Version 9 ============== ! ( x a -- ) Store x at a !+ ( a1 x -- a2 ) Store and increase address " ( | ..." -- a u ) Store quoted string ' ( | -- a ) Push execution token of # ( u1 -- u2 ) Store next digit in number buffer #> ( u1 -- a u2 ) Finish numeric conversion #s ( u1 -- 0 ) Convert remaining digits ( ( C: | ...) -- ) Ignore everything up to next ")" [C] (.) ( n -- a u ) Convert number to string (u.) ( u1 -- a u2 ) Convert unsigned number to string * ( n1 n2 -- n3 ) Multiply + ( n1 n2 -- n3 ) Add +! ( n a -- ) Increase number at a by n +field ( n | -- ) Define structure field, word adds field offset [X] +loop ( u -- ) Increase index by n and loop [C] , ( x -- ) Store x in dictionary and increase dictionary pointer - ( n1 n2 -- n3 ) Subtract -> ( x -- x| ) Equivalent to `over = if` [C] -; ( -- ) Terminate colon definition, if previous operation is a call, convert to jump -rot ( x y z -- z x y ) Rotate down -trailing ( a u1 -- a u2 ) Drop trailing blanks . ( n -- ) Print number ." ( |..." -- ) Print quoted string [C] .( ( |...) -- ) Print comment .r ( n u -- ) Print n right-justified by u .s ( -- ) Show contents of working stack .vocs ( -- ) Show all defined vocabularies / ( n1 n2 -- n3 ) Signed division /mod ( n1 n2 -- n3 n4 ) Signed division with rest in u3 and result in u4 /string ( a1 u1 u2 -- a2 u3 ) Advance string start by u2 0< ( n -- f ) Less than zero 0<> ( x -- f ) -1 if not zero 0= ( x -- f ) Equal to zero 1+ ( n1 -- n2 ) Increase by 1 1- ( nq -- n2 ) Decrease by 1 2! ( x y a -- ) Store y, x at a, a + 1 2* ( n1 -- n2 ) Shift left by 1 bit 2/ ( u1 -- u2 ) Shift right by 1 bit (unsigned) 2@ ( a -- x y ) Fetch y, x at a, a + 1 2>r ( x y -- ) Swap 2 values and push on return stack 2constant ( x y | -- ) Define 2 cell constant 2drop ( x y -- ) Drop 2 values 2dup ( x y -- x y x y ) Dup 2 values 2nip ( x y z q -- z q ) Nip 2 values 2over ( x y z q -- x y z q x y ) Over 2 values 2r@ ( -- x y ) Fetch topmost 2 values from return stack and swap 2r> ( -- x y ) Pop 2 values from return stack and swap 2rot ( x y z q v w -- z q v w x y ) Rotate 2 values 2swap ( x y z q -- z q x y ) Swap 2 values 2variable ( | -- ) Define 2-cell variable : ( | ... -- ) Start colon definition, add compiler vocabulary and start compiling :noname ( | ... -- xt ) Compile headerless word and push execution token ; ( -- ) Terminate colon definition and remove topmost vocabulary from vocabulary stack [C] < ( n1 n2 -- f ) Signed less than <= ( n1 n2 -- f ) Signed less than or equal <# ( -- ) Begin number conversion <> ( x y -- f ) Not equal = ( x y -- f ) Equal > ( n1 n2 -- f ) Signed greater than >= ( n1 n2 -- f ) Signed greater than or equal >in ( -- a ) Variable holding position in `tib` >limit ( -- a ) Variable holding end position in `tib` >r ( x -- ) Push on return stack ? ( a -- ) Equivalent to `@ .` [X] ?do ( u1 u2 -- ) Start `do` loop if u1 > u2, or skip otherwise [C] ?dup ( x -- x x | x ) Duplicate if not 0 ?exit ( f -- ) Conditional exit @ ( a -- x ) Fetch x from a @+ ( a1 -- a2 x ) Fetch and increase address [ ( | ... -- ) Enter interpretation mode [C] ['] ( | -- xt ) Push execution token of [C] [char] ( | -- c ) Push code of first character of [C] [defined] ( | -- f ) Immediate test whether word is defined [X] [else] ( | ... -- ) Interpreter conditional [X] [if] ( | ... -- ) Interpreter conditional [X] [then] ( -- ) Interpreter conditional [X] [undefined] ( | -- f ) Immediate test whether word is not defined [X] \ ( | ... -- ) Ignore to end of line [C] \s ( | ... -- ) Ignore to end of line or block, when loading [G] ] ( -- ) Enter compilation mode Abort ( -- ) Abort editing [G] Doc ( -- ) Switch editing to documentation block [G] Load ( -- ) Save and evaluate current block [G] Next ( -- ) Edit next block [G] Paste ( -- ) Insert contents of ".snarf" file [G] Prev ( -- ) Edit previous block [G] Save ( -- ) Save current block if modified [G] Snarf ( -- ) Write current line or marked region to ".snarf" file [G] Source ( -- ) Switch editing to source block [G] abort ( ... -- ) Clear stacks and re-enter interpretation mode [D] abort" ( f | ..." -- ) If true, show quoted text and abort [C] abs ( n -- u ) Absolute value accept ( a u1 -- u2 ) Read keyboard input at a, at most u1 bytes, pushes actual number of chars read adsr ( u -- ) Set ADSR field of audio device [G] again ( -- ) Repeat `begin ... again` loop [C] and ( n1 n2 -- n3 ) Binary AND align ( -- ) Align dictionary top aligned ( n1 -- n2 ) Align number allot ( u -- ) Allocate u bytes in dictionary also ( -- ) Duplicate topmost entry on vocabulary stack at-xy ( x y -- ) Set cursor position to row y column x [G] audio ( u -- ) Select audio-device 0 - 3 [X] auto ( u -- ) Set AUTO field of screen device [G] base ( a -- ) Variable holding numeric base begin ( -- ) Start loop [C] begin-structure ( | -- u ) Start structure definition, word pushes total length [X] bl ( -- 32 ) Blank space constant blank ( a u -- ) Fill area with spaces boot ( -- ) Entry point bounds ( a1 n -- a2 a1 ) Gives range from a1 to a1 + n (not inclusive) blk ( -- a ) Variable holding currently edited block number [G] brk ( -- ) Perform BRK instruction buffer: ( u | -- ) Define buffer of u bytes bye ( -- ) Exit VM [D] c! ( c a -- ) Store byte c at address a c@ ( a -- c ) Fetch byte from address a c, ( c -- ) Store byte in dictionary and increase dictionary pointer cfield: ( | -- ) Define byte sized structure field, word adds field offset [X] char ( | -- c ) Push first character of cell+ ( n1 -- n2 ) Add 2 cells ( u1 -- u2 ) Multiplies u1 by 2 cin ( -- c ) Read character from console device [GD] clear ( ... -- ) Clear value stack clamp ( n1 n2 n3 -- n4 ) Ensure n1 is between n2 and n3 (inclusive) cmove ( a1 a2 u -- ) Copy memory from a1 to a2 cmove> ( a1 a2 u -- ) Copy memory from a1 to a2 from the end code ( | -- ) Start assembler word definition [X] colors ( r g b -- ) Set screen colors [G] compare ( a1 u1 a2 u2 -- n ) Compares memory lexicographically compile, ( xt -- ) Compile execution token as subroutine call compiler ( -- ) replace the current vocabulary with the `compiler` vocabulary constant ( x | -- ) Define constant copyright ( -- a ) Address of zero-terminated copyright string count ( a1 -- a2 u ) Push counted string at a1 as start address and length cout ( c -- ) Write character to console device [GD] cr ( -- ) Write newline character crash ( ... -- ) Abort with error create ( | -- ) Create word pointing to current dictionary top ctype ( a u -- ) Write string to console [G] cvector ( xt -- ) Set console vector d# ( | -- n ) Push decimal numeric literal [X] day ( -- u ) Push day of the month decimal ( -- ) Set `base` to 16 decompile ( xt -- ) Decompile from address [X] defer ( | -- ) Define deferred word defer! ( xt1 xt2 -- ) Set vector of deferred word xt2 to xt1 defer@ ( xt1 -- xt2 ) Fetch vector of deferred word xt1 definitions ( -- ) Further dictionary definitions are added to the current vocabulary dei ( c1 -- c2 ) Read byte port c1 of device dei2 ( c -- u ) Read short port c of device deo ( c1 c2 -- ) Write byte port c2 of device deo2 ( u c -- ) Write short port c of device depth ( -- u ) Push stack depth diff ( u1 u2 -- u3 ) Reverse subtract do ( u1 u2 -- ) Start `do` loop, counting from u2 to u1 [C] does> ( | ... -- a ) Set behaviour of last created word [C] dotw ( -- u ) Push day of the week doty ( -- u ) Push day of the year drop ( x -- ) Drop topmost stack value dump ( a u -- ) Dump memory [X] dup ( x -- x x ) Duplicate topmost value on stack dup>r ( x -- x ) Faster combination of `dup >r` edit ( u -- ) Load and edit block [GD] else ( -- ) Begin `else` part of conditional emit ( c -- ) Print character with code c [D] emits ( c u -- ) `emit` c u times end-code ( -- ) End assembler word definition [X] end-structure ( -- ) End structure definition [X] erase ( a u -- ) Clear memory evector ( xt -- ) Set error ("catch") system vector [X] execute ( xt -- ) Invoke execution token exit ( -- ) Exit word export ( u1 u2 -- ) Dump contents of blocks u1 to u2 (inclusive) to the console [G] false ( -- 0 ) Push false constant field: ( | -- ) Define cell sized structure field, word adds field offset [X] fileappend ( a u -- u2 ) Append data to file specified in file device and return success field filedelete ( -- ) Delete file filename ( a u -- ) Set name field of file device (uses the `pad`) fileread ( a u -- u2 ) Read from file specified in file device and return success field filewrite ( a u -- u2 ) Write to file specified in file device and return success field fill ( a u c -- ) Fill memory with byte u find ( a1 -- a2 n ) Locate counted string at a1 in vocabulary stack and push original address and 0 or found xt and 1 (immediate) or -1 forth ( -- ) Change current vocabulary to the default one h# ( | -- n ) Push hexadecimal numeric literal [X] h. ( n -- ) Write hexadecimal number halt ( code -- ) Terminate uxn VM with status code [X] here ( -- a ) Push top of dictionary pointer hex ( -- ) Set `base` to 16 hold ( c -- ) Prepend character to numeric conversion holds ( a u -- ) Prepend string to numeric conversion hour ( -- u ) Push current hour i ( -- u ) Push index of innermost `do` loop icon ( -- a ) Address of UF logo (8x8 icn) if ( f -- ) Start conditional [C] immediate ( -- ) Make most recent definition immediate include ( | -- ) Include file designated by "" [X*] included ( a u -- ) Include file designated by given string [X*] input-type ( -- u ) Return console input type [X] interpret ( | ... -- ) Interpret code in `tib` invert ( n1 -- n2 ) Perform binary NOT is ( xt | -- ) Set execution vector of deferred word isdst ( -- f ) Push daylight saving time flag j ( -- u ) Push index of 2nd innermost `do` loop jbutton ( -- u ) Push button field of controller device [GX] jkey ( -- c ) Push key field of controller device [GX] jvector ( xt -- ) Set vector of controller device [GX] key ( -- c ) Read char and push code [D] list ( u -- ) Type contents of block u [G] literal ( x -- ) Compile literal load ( u -- ) Load block, ignores rest of line if interpreted [G] loadrom ( a u -- ) Load rom file with name given by a,u loop ( -- ) End of `do ... loop` loop lshift ( u1 u2 -- u3 ) Shift u1 left by u2 bits marker ( | -- ) Define marker to restore dictionary and vocabularies to current state [X] max ( n1 n2 -- n3 ) Maximum value min ( n1 n2 -- n3 ) Minimum value minute ( -- u ) Push current minute [X] mod ( n1 n2 -- n3 ) Modulo month ( -- u ) Push current month [X] mouse ( -- x y ) Push x/y fields of mouse device [GX] mscroll ( -- x y ) Push x/y scroll fields of mouse device [GX] mstate ( -- u ) Push state field of mouse device [GX] mvector ( xt -- ) Set vector of mouse device [GX] negate ( n1 -- n2 ) Negate value new ( -- ) Marker, restore dictionary and vocabularies to defaults [GX] nip ( x y -- y ) Remove second value on stack noop ( -- ) Does nothing number ( a -- a 0 | n 1 ) Convert counted string at a to number off ( a -- ) Store 0 at a on ( a -- ) Store -1 at a only ( -- ) Clear vocabulary stack and set default vocabulary or ( n1 n2 -- n3 ) Perform binary OR order ( -- ) Print vocabulary stack and definition vocabulary [X] output ( -- u ) Return loudness of envelope [X] over ( x y -- x y x ) Push second value on stack pad ( -- a ) Push scratchpad area address page ( -- ) Clear screen [GD] parse ( c | ... -- a u ) Parse and return string delimited by c pick ( ... u -- x ) Push u-th value on stack, coujnted from top pixel ( u -- ) Set pixel field of screen device [GX] place ( a1 u a2 -- ) Store string a1,u as counted string at a2 play ( u -- ) Set pitch field of audio device [GX] position ( x y -- ) Set x/y fields of screen device [GX] postpone ( | -- ) Compile word if immediate or code to compile call to word if not [C] previous ( -- ) Pop topmost vocabulary on vocabulary stack prompt ( -- ) Show prompt before reading user input [D] query ( -- ) Read user input into `tib` [D] quit ( ... -- ) Clear stacks and read user input r> ( -- x ) Pop value from return stack r>drop ( -- ) Drop topmost value on return stack r@ ( -- x ) Fetch topmost value from return stack randomize ( -- ) Set the random number seed to some value [X] recurse ( -- ) Invoke current definition rfind ( xt -- a f ) Searches the dictionary entry for a particular execution token [X] repeat ( -- ) End of `begin ... while ... repeat` loop [C] reset ( -- ) Clear return stack rnd ( -- n ) Returns a random number [X] rot ( x y z -- y z x ) Rotate values on stack rshift ( u1 u2 -- u3 ) Shift u1 right by u2 bits s" ( | ..." -- a u ) Push string literal [C] sample ( a u -- ) Set addr and length field of audio device [GX] save ( | -- ) Save memory from h# 100 to dictionary top in file saved ( a1 u1 a2 u2 -- ) Save u1 bytes at a1 in file with name given by a2, u2 scan ( a1 u1 c -- a2 u2 ) Skip characters until c is found screensize! ( w h -- ) Set size fields of screen device [GX] screensize@ ( -- w h ) Read size fields of screen device [GX] search ( a1 u1 a2 u2 -- a3 u3 f ) Searches a1/u1 for a2/u2 and pushes a flag, the address and remaining length where it was found second ( -- u ) Push current second [X] see ( | -- ) Decompile word [X] seed ( -- a ) Current random number seed [X] sign ( n -- ) Emit sign of n during numeric conversion sliteral ( a u -- ) Compile string literal snarf ( a u -- ) Writes data to ".snarf" file [X] space ( -- ) Write space character spaces ( u -- ) Write u spaces sprite ( u -- ) Set sprite field of screen device [X] spritedata ( a -- ) Set addr field of screen device [X] state ( -- a ) Address of variable holding compilation state flag stdin ( -- ) Invoked when console-input is available [XD] svector ( xt -- ) Set vector of screen device [X] swap ( x y -- y x ) Swap topmost stack values th ( a1 u -- a2 ) Compute address of u-th cell at a1 then ( -- ) End of conditional [C] tib ( -- a ) Text input buffer tick ( -- ) Called by screen-vector while waiting for input events [XD] theme ( -- ) Loads ".theme" file if it exists and sets system colors [X] thru ( u1 u2 -- ) Load block range, ignores rest of line if interpreted [G] true ( -- -1 ) Push literal -1 tuck ( x y -- y x y ) Tuck top stack value under 2nd type ( a u -- ) Print string u. ( u -- ) Print unsigned value u.r ( u1 u2 -- ) Print unsigned value right-justified in u2 places u/ ( u1 u2 -- u3 ) Unsigned division u/mod ( u1 u2 -- u3 u4 ) Unsigned division with rest in u3 and result in u4 u< ( u1 u2 -- f ) Unsigned less than u> ( u1 u2 -- f ) Unsigned greater than umod ( u1 u2 -- u3 ) Unsigned modulo under+ ( n1 x n2 -- n3 x ) Add n2 to third value on stack unloop ( -- ) Remove runtime counters for `do ... loop` loop until ( f -- ) Test and repeat `begin ... until` loop [C] unused ( -- u ) Available free space [X] variable ( | -- ) Define variable vocabulary ( | -- ) Define new empty vocabulary, invoke to replace current vocabulary vocs ( -- ) Print vocabulary stack, in order of search volume ( u -- ) Set volume field of audio device [G] wait ( -- ) Waits for input events (never returns) [X] where ( u1 u2 | -- ) Scan blocks u1 to u2 for and list occurrences within ( n1 n2 n3 -- f ) Pushes flag indicating whether n1 is between n2 and n3 (not inclusive) while ( f -- ) Conditional in `begin ... while ... repeat` loop [C] word ( c | ... -- a ) Skip spaces and parse and return string delimited by c as address of counted string in dictionary words ( -- ) Print all words visible on vocabulary stack [X] xor ( n1 n2 -- n3 ) Perform binary XOR yank ( -- a u ) Reads contents of the file ".snarf" if it exists, uses `pad`, u may be 0 [X] year ( -- u ) Push current year [X] | ( -- ) Equivalent to `exit then` Notes: [C] Only available at compile time [G] Only available in the graphical interface ("ufx.rom"), implies [X] [X] Available in "ufx.rom" and "ufc.rom" [D] Deferred word [*] Check note in README