RC/Funge-98 Description: ------------ RC/Funge-98 is a funge interpreter based upon the Funge-98 specification by Cats-Eye Technologies. The full language specification (including the 'i', 'o', '=', and 't' commands) are supported. Unefunge, befunge, and trefunge all supported by RC/Funge-98, with befunge being the default mode. Several extensions are also provided, including minimal windows support (currently only on unix version). Handprint: ----------- RCS Funge interpreters can be identified with the following handprints: "RCSU" 0x52425355 Unix version Built-in Fingerprints: ---------------------- "BASE" 0x42415345 I/O for numbers in other bases (RCS) "CPLI" 0x43504C49 Complex Integer extension (RCS) "DIRF" 0x44495246 Directory functions extension (RCS) "EVAR" 0x45564152 Environment variables extension (RCS) "FILE" 0x46494C45 File I/O functions (RCS) "FNGR" 0x464E4752 Fingerprint management extension (RCS) "FPDP" 0x46504450 Double precision floating point (RCS) "FPSP" 0x46505350 Single precision floating point (RCS) "FRTH" 0x46525448 Some common forth commands (RCS) "FIXP" 0x46495850 Some useful math functions (RCS) "HRTI" 0x48525449 High resolution timer interface (Cats-Eye) "IMAP" 0x494D4150 Instruction remap extension (RCS) "INDV" 0x494E4456 Pointer functions (RCS) "MODE" 0x4D4F4445 Standard modes (Cats-Eye) "MODU" 0x4D4F4455 Modulo Arithmetic Extension (Cats-Eye) "NULL" 0x4E554C4C Null (Cats-Eye) "ORTH" 0x4F525448 Orthogonal Easement Library (Cats-Eye) "PERL" 0x5045524C Generic Interface to Perl (Cats-Eye) "REFC" 0x52454643 Referenced Cells Extension (Cats-Eye) "ROMA" 0x524F4D41 Roman numerals extension (Cats-Eye) "STRN" 0x5354524E String functions (RCS) "SUBR" 0x53554252 Subroutine extension (RCS) "TERM" 0x5445524D Terminal extension (RCS) "TOYS" 0x544F5953 Standard Toys (Cats-Eye) (not yet fully implemented) "WIND" 0x57494E44 Windows extensions (RCS) Limits: ------- Maximum IPs 100 Maximum Overloads 100 Stack space per IP 1000 entries Stack Stacks 200 Mini Funges 100 Mini-funge size 40x10 These limits can be changed by altering funge.h and recompiling. Enclosed Files: --------------- Makefile Makefile to build RC/Funge main.c Main source file ext.c Source file for overloads mem.c Memory manager mterm.c Terminal functions mfunge.c Mini-funge executor xfunge.c Source file for x windows functions funge.h Header file Demo Files: ----------- base.f Demonstration of number base extension over1.f Demonstration of overlays over2.f File loaded by over1.f overdemo.f Demonstration of overloading roman.f Demonstration of rom2.fl funge-lib subr.f Demonstration of subr extension sys.f Demonstrates = command (unix ls command) sysinfo.f Shows information about your funge environment threads.f Demonstrates concurrent threads win.f Demo file for windows functions Funge-lib Files: ---------------- rom2.fl Roman numeral extension Memory Models: RC/Funge provides two memory models, Fixed and Dynamic: FIXED - In this mode the interpreter allocates the entire Funge-space at execution time. If you want a large addressable Funge-space you could run out of memory. This is the fastest of the two modes, and is therefore the default. DYNAMIC - This mode the virtual dimensioning used by Funge/98. In this mode the dimensions are no longer a factor in memory usage. Instead a block of cells are allocated and can be located anywhere in Funge-space. The current mechanism for implementing this memory model is not so good, and therefore a bit slow. Invokation: ----------- funge [switches] source-files -1 Use single dimension Funge-space -2 Use two dimensional Funge-space (default) -3 Use three dimensional Funge-space -93 Allow only Funge/93 instructions -c n Change maximum number of cells in dynamic memory model (def 10000) -d Enable debugger -D Delay between instruction execution -i Change stack sIze (def 1000) -md Dynamic memory model -mf Use fixed memory model (default) -r n Change maximum number of rows in dynamic memory model (def 1000) -s Map Funge-space to screen -S Suppress summary -t Enable tracing mode -v Show version -w Enable warnings -x n Change x dimension of Funge-space for fixed memory model (def 100) -y n Change y dimension of Funge-space for fixed memory model (def 100) -z n Change z dimension of Funge-space for fixed memory model (def 1) -Y Use official version of 'y' command Funge/98 Instruction Set: ------------------------- Nop ! (n -- !n) Logical Negate " Toggle string mode # Skip next cell $ (n -- ) Drop top stack entry % (n1 n2 -- n1%n2) Modulo & ( -- n) Read number from stdin ' ( -- c) Push next cell onto stack ( (gnirts n -- ) Overload functions A-Z ) (gnirts n -- ) Unload functions A-Z * (n1 n2 -- n1*n2) Multiplication + (n1 n2 -- n1+n2) Addition , (n -- ) Print tos as a character - (n1 n2 -- n1-n2) Subtraction . (n -- ) Print tos as a number / (n1 n2 -- n1/n2) Division 0 ( -- 0) Push 0 onto stack 1 ( -- 1) Push 1 onto stack 2 ( -- 2) Push 2 onto stack 3 ( -- 3) Push 3 onto stack 4 ( -- 4) Push 4 onto stack 5 ( -- 5) Push 5 onto stack 6 ( -- 6) Push 6 onto stack 7 ( -- 7) Push 7 onto stack 8 ( -- 8) Push 8 onto stack 9 ( -- 9) Push 9 onto stack : (n -- n n) Duplicate tos ; Skip to next ; < Set ip delta to -1,0,0 = (0gnirts -- n) Pass string to underlying system > Set ip delta to 1,0,0 ? Set ip delta to random direction @ Terminate thread A-Z Overloadable functions [ Turn ip delta to the left \ (n1 n2 -- n2 n1) Swap top two stack elements ] Turn ip delta to the right ^ Set ip delta to 0,-1,0 _ (n -- ) does > if tos is zero, else < ` (a b -- n) Pushes 1 if a>b else pushes 0 a ( -- 10) Push 10 onto stack b ( -- 11) Push 11 onto stack c ( -- 12) Push 12 onto stack d ( -- 13) Push 13 onto stack e ( -- 14) Push 14 onto stack f ( -- 15) Push 15 onto stack g (v -- n) Get value stored in funge cell h Sets ip delta to 0,0,1 i (v f 0gnirts -- vs vo) Load a file, Acts as r on failure j (n -- ) jumps ip delta * tos; k (n -- ) Execute command in next cell n times l Sets ip delta to 0,0,-1 m (n -- ) Does l if tos is zero else h n Clears stack o (vs vo 0gnirts -- ) Write funge space to file p (n v -- ) Put value into funge cell q (n -- ) Immedietly quit program, tos is return code r Reflect the delta s (n -- ) Take tos and store into next cell t Start new thread u Transfer entries between soss and toss v Set ip delta to 0,1,0 w (a b -- ) do ] if a>b, [ if a ^ v h or l V (Vd Vsz Vsrc -- ) High order move of funge space X ( -- ) Increments IP's delta X Y ( -- ) Increments IP's delta Y Z ( -- ) Increments IP's delta Z "WIND" 0x57494E44 B (x1 y1 x2 y2 h -- ) Draw a box C (h -- ) Close GC D (h -- ) Drop (lower) Window E (h -- ) Call event checker I (Va e h -- ) Install event handler e: 1 = Mouse Down 2 = Mouse Up 3 = Mouse Motion 4 = Key Pressed 5 = Expose 6 = Configuration K (h -- ) Kill a window L (x1 y1 x2 y2 h -- ) Draw a line M (x y h -- ) Move a window O (h -- ) Open GC P (x y h -- ) Draw a point R (h -- ) Raise Window S (x y h -- ) resize a window T (0gnirts x y h --) Draw text in a window W (x y w h -- h) Open a window Note: Drawing commands: B, L, P, and T require an open GC Mini-Funge: ----------- When a fingerprint is requested that is not built into the interpreter, RC/Funge will search for a file corresponding to the fingerprint. The filename is built from the ascii characters associated with the fingerprint and using an extension of 'fl'. example fingerprint: 0x524F4D41 would search for file ROMA.fl If the file is found it is loaded as the semantics for the overloaded functions. The file must be in the funge-lib file format. The following commands are not available in Mini-Funge: ( (gnirts n -- ) Overload functions A-Z ) (gnirts n -- ) Unload functions A-Z = (0gnirts -- n) Pass string to underlying system h Sets ip delta to 0,0,1 i (v f 0gnirts -- vs vo) Load a file, Acts as r on failure l Sets ip delta to 0,0,-1 m (n -- ) Does l if tos is zero else h o (vs vo 0gnirts -- ) Write funge space to file q (n -- ) Immedietly quit program, tos is return code t Start new thread u Transfer entries between soss and toss x (x y z -- ) Set ip delta from stack { (n -- ) Begin Block } (n -- ) End Block The following commands have altered functions in Mini-Funge: ' ( -- c) Push next mini-funge cell onto stack @ Terminate mini-funge program g (v -- n) Get value stored in main funge-space cell p (n v -- ) Put value into main funge-space cell The following are commands added to Mini-Funge: B Move calling ip backwards one delta unit D (v -- ) Set delta of calling ip E (.. -- n) Push depth of stack F Move calling ip forwards one delta unit G (v -- n) Get value stored in mini funge-space cell K (.. n -- .. n) Forth Pick command L (v -- ) Set location of calling ip O ( .. n -- .. n) Forth Roll command P (n v -- ) Put value into mini funge-space cell R Reflect the delta of calling ip Unless otherwise noted above, accesses to funge space access the mini- funge space. All stack access are from the stack of the calling ip. An entire mini-funge program executes in a single tick in comparison to other concurent funge ip pointers. funge-lib file format: ---------------------- A funge-lib file contains the funge source code for commands which can be loaded into A-Z with the ( command. Each command starts with a line beginning with = and an uppercase letter. All lines up til the next = line are the funge source lines for the function. Example: Here is a funge-lib file describing Cat's-eye's ROMA extension: =I 1@ =V 5@ =X a@ =L a5*@ =C aa*@ =D aa5**@ =M aaa**@ Debugger: --------- back - Move ip backward by its delta del bp x [y [z]] - Delete a breakpoint del trap c - Delete a command trap drop - Drop top entry from stack fore - Move ip forward by its delta pop - Pop and display top of stack push n - Push a number onto the stack quit - Quit program run - Prevent single stepping on current ip set bp x [y [z]] - Set a breakpoint set cell v x [y [z]] - Set value in specified funge cell set ip delta x [y [z]] - Set ip delta set ip pos x [y [z]] - Set ip position set trap c - Set a command breakpoint show bp - Show breakpoints show cell x [y [z]] - Show value in specified funge cell show ip - Show ip information show fingers - Show A-Z overloaded fingerprints show mapper - Show instruction mappings show stack - Show stack for current ip show stacks - Show entries in all stacks show traps - Show command breakpoints steps n - Allow the current ip to step n instructions - Step one instruction Note: Any single character command will be executed as the associated funge instruction (example, . will do the same as pop, with only a single keystroke.) For more information: --------------------- For more information on funges, visit: http://www.cats-eye.com/funge/ "JSTR" 0x4a535452 P (Vd Va n -- ) pop n cells off of the stack and write at Va with delta Vd. G (Vd Va n -- 0gnirts) read n cells from position Va and delta Vd, push on stack as a string. This extension is the Right Way to handle string writing/reading in fungespace. multidimensionality, people! "SGNL" 0x53474E4C H ( Va n -- ) sets code at position Va to be handler for signal n. K ( p n -- ) send signal n to PID p R ( n -- ) restore default handler for signal n. Not a stack! M ( h n -- ) adjust signal mask by n with method h. X ( c -- ) set current cell to character c. esp. useful with 'Y'. Y ( -- ) stall; ip will not advance, delta is maintained. All signals start with their default handlers. When a signal is received, pid of sender and signal number are pushed onto stack, in that order. A new thread is created to handle each signal; to exit the signal handler, kill the thread with @. For the 'M' command, h can be one of 0(SIG_BLOCK), 1(SIG_UNBLOCK), or 2(SIG_SETMASK). Whatever X becomes has no effect on the ip that triggered it. "NCRS" 0x4E435253 B ( -- ) Beep or visible beep. E (m -- ) Set echo mode to m (1 == echo, 0 == noecho). G ( -- c) get character c, modified by various flags I (m -- ) initialize curses mode if m == 1, else end curses mode. K (m -- ) set keypad mode to m (1 == keypad, 0 == nokeypad) M (x y -- ) move cursor to x,y N (m -- ) toggle input mode to m (1 == wait for newline, 0 == cbreak) R ( -- ) refresh(update) window. U (c -- ) unget character c. only guaranteed to work once. P (c -- ) put the character c at the current cursor location. S (0gnirts -- ) write given string at current cursor location. C (m -- ) clear all or part of the screen. m can be one of 0(whole screen), 1(end of line), or 2(bottom of screen). All functions act as r on error. K is useful for getting KEY_foo codes, i.e. arrow keys, other special keys. R must be called for the results of other operations to be displayed. You *must* call 'I' at the beginning *and* end of each program that uses NCRS.