-
Notifications
You must be signed in to change notification settings - Fork 0
/
funge.doc
1937 lines (1614 loc) · 79.4 KB
/
funge.doc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
RC/Funge-98 v2.00
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).
Features:
---------
* Funge-98 and Funge-93 modes
* Supports Unefunge, Befunge, and Trefunge
* Concurrent Funge, 't' command is implemented
* 'i', 'o', and '=' commands implemented
* Can map funge space to screen, with command tracing
* Full command tracing with stack output
* Fixed memory model for speed
* Dynamic memory model for large dimensions
* Mini-Funge for user definable A-Z functions
* Integrated debugger
* Full source code (in C) included
* Support for multiverse funge
* Support for object oriented funge
* Passes original Cat's Eye diagnostic suite
* Passes Mycology diagnostic suite
Multiverse Funge:
-----------------
Rc/Funge-98 V2 extends the capabilities of the funge system. The V1
interpreter could only run a single Funge universe at a time. V2 now
supports the ability to have multiple funge programs all running in
independent universes, or a multiverse. A new fingerprint MVRS allows
data transfer between universes as well as the ability for an IP to
actually travel to another universe.
A new command line option -vm allows the definition of additional
virtual machines at program startup. Each time -vm is encountered a
new virtual machine is created, all options following the -vm will
apply to the newly created VM, this allows for each VM to be truly
unique. It is possible for one VM to be running a Befunge program
while another VM is running a Unefunge or Trefunge program. It is
also possible for one VM to be running Funge/98 while another VM
is running Funge/93 or Funge/108.
The B command of MVRS allows for the creation of independent universes
under program control. Universes created with the B command can be
just as unique as universes created from the command line.
Handprint:
-----------
RCS Funge interpreters can be identified with the following handprints:
"RCSU" 0x52425355 Unix version
Built-in Fingerprints:
----------------------
"3DSP" 0x33445350 3D space manipulation extension (RCS)
"ARRY" 0x41525259 Arrays (RCS)
"BASE" 0x42415345 I/O for numbers in other bases (RCS)
"BOOL" 0x424F4F4C Logic functions (RCS)
"CPLI" 0x43504C49 Complex Integer extension (RCS)
"DATE" 0x44415445 Date functions (RCS)
"DIRF" 0x44495246 Directory functions extension (RCS)
"EMEM" 0x454d454d Extended memory (RCS)
"EVAR" 0x45564152 Environment variables extension (RCS)
"EXEC" 0x45584543 Various types of k-like execs (RCS)
"FILE" 0x46494C45 File I/O functions (RCS)
"FING" 0x46494e47 Alter single fingerprint semantics (RCS)
"FNGR" 0x464E4752 Fingerprint management extension (RCS)
"FOBJ" 0x464f424a Object Oriented extension (RCS)
"FPDP" 0x46504450 Double precision floating point (RCS)
"FPRT" 0x46505254 Formatted print (RCS)
"FPSP" 0x46505350 Single precision floating point (RCS)
"FRTH" 0x46525448 Some common forth commands (RCS)
"FIXP" 0x46495850 Some useful math functions (RCS)
"FORK" 0x464F524B Process fork (RCS)
"HRTI" 0x48525449 High resolution timer interface (Cats-Eye)
"ICAL" 0x4943414c Some Intercal-like functions (RCS)
"IIPC" 0x49495043 Inter IP communicaiton extension (RCS)
"IMAP" 0x494D4150 Instruction remap extension (RCS)
"IMTH" 0x494d5448 Some integer math functions (RCS)
"INDV" 0x494E4456 Pointer functions (RCS)
"IPMD" 0x49504d44 IP dimension modes (RCS)
"JSTR" 0x4a535452 3d P and G for STRN (Jesse Van Herk)
"LONG" 0x4c4f4e47 Long integers (RCS)
"MACR" 0x4d414352 Macro extension (RCS)
"MODE" 0x4D4F4445 Standard modes (Cats-Eye)
"MODU" 0x4D4F4455 Modulo Arithmetic Extension (Cats-Eye)
"MSGQ" 0x4d534751 SysV IPC message queues (RCS)
"MVRS" 0x4d565253 Multiverse extension (RCS)
"NULL" 0x4E554C4C Null (Cats-Eye)
"NCRS" 0x4E435253 Ncurses Routines (Jesse Van Herk)
"ORTH" 0x4F525448 Orthogonal Easement Library (Cats-Eye)
"PERL" 0x5045524C Generic Interface to Perl (Cats-Eye)
"RAND" 0x52414e44 Random Numbers (RCS)
"REFC" 0x52454643 Referenced Cells Extension (Cats-Eye)
"REXP" 0x52455850 Regular expression matches (RCS)
"ROMA" 0x524F4D41 Roman numerals extension (Cats-Eye)
"SETS" 0x53455453 Set operations (RCS)
"SCKE" 0x53434b45 Extensions to SOCK (unknown)
"SGNE" 0x53474E4C Extensions to SGNL (RCS)
"SGNL" 0x53474E4C Signal handling (Jesse Van Herk)
"SMEM" 0x534d454d SysV IPC shared memory (RCS)
"SMPH" 0x534d5048 SysV IPC Semaphores (RCS)
"SOCK" 0x534F434B tcp/ip socket extension (RCS)
"SORT" 0x534f5254 Sorting (RCS)
"STCK" 0x5354434b Stack manipulation (RCS)
"STRN" 0x5354524E String functions (RCS)
"SUBR" 0x53554252 Subroutine extension (RCS)
"TRDS" 0x54524453 IP travel in time and space (RCS)
"TRGR" 0x54524752 Triggers (RCS)
"TERM" 0x5445524D Terminal extension (RCS)
"TIME" 0x54494D45 Time and Date functions (RCS)
"TURT" 0x54555254 Turtle Graphics (Cats-Eye)
"TOYS" 0x544F5953 Standard Toys (Cats-Eye)
"UNIX" 0x554e4958 Some Unix access functions (RCS)
"WIND" 0x57494E44 Windows extensions (RCS)
Invocation:
-----------
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
-98 Run in Funge/98 mode (default)
-108 Run in Funge/108 mode
-d Enable debugger
-D Delay between instruction execution
-f2 Run dynamic fingerprints in befunge mode
-i n Change initial stack size (def 1000)
-s Map Funge-space to screen
-sb Sandbox mode
-S Suppress summary
-t Enable tracing mode
-ns No stack output on trace
-nx Allow TURT to display on X terminal
-v Show version
-vm Create new Virtual Machine
-w Enable warnings
-Y Use Rc/Funge-98 version of 'y' command
Sandbox Mode:
-------------
Sandbox mode allows the interpreter to be run in a more safe environment.
It disallows the following basic funge commands:
i - Input file
o - Output file
= - Execute system command
The following fingerprints are not available in sandbox mode:
DIRF - Directory functions
EMEM - Extended memory
FILE - File access functions
FORK - Fork process
PERL - Perl interface
MSGQ - Message queues
SGNE - Signals
SGNL - Signals
SMEM - Shared memory
SMPH - Semaphores
SCKE - SOCK extensions
SOCK - Socket extension
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<b, otherwise z
x (x y z -- ) Set ip delta from stack
y (n --) Get System information
z nop
{ (n -- ) Begin Block
| (n -- ) does v if tos is zero, else ^
} (n -- ) End Block
~ ( -- c) Input character from stdin
System Information - y Command:
-------------------------------
RC/Funge interprets the 'y' command a bit differently from the specification.
According to the specs, a positive argument will leave the n'th cell from the
y command on the stack. I thought that it is more useful to allow n to
specify which information entry rather than cell. Entries 1-9 will work
excactly as the specification, but 10 up act differently. According to the
spec 55+y would retrieve one cell from the vector of the current IP
location. RC/Funge instead returns the entire vector. Entry 11 would
then contain the entire vector for the current IP's delta, whereas in the
specs, 11 would return the second cell of the location vector in befunge or
trefunge OR the x delta in unefunge. I felt it more useful to be able to
directly specify an information item rather than have to calculate beyond
entry 9 in order to find the correct cell.
If you desire this behaviour then use a -Y on the command line.
Entry Description
1 Flags
bit 0 = 1 if 't' command is implemented
bit 1 = 1 if 'i' command is implemented
bit 2 = 1 if 'o' command is implemented
bit 3 = 1 if '=' command is implemented
2 Number of bytes per cell
3 Handprint
4 Version number
5 Operating Paradigm
0=unavailable
1=Equivalent to c language system()
2=Equivalent to interpretation by specific shell program
3=Executes in shell funge was started from
6 Path separator character
7 Number of scalars per vector (1=unefunge, 2=befune, 3=trefunge)
8 ID of current IP
9 not used
10 Vector for location of current IP
11 Vector for delta of current IP
12 Vector containting storage offset of current IP
13 Vector pointing to smallest address with non-space contents
14 Vector pointing to largest address with non-space contents
15 (year-1900)*256*256 + month*256 + day
16 hour*256*256 + minute*256 + second
17 Number of stacks on the stack stack
18 Size of each stack on the stack stack
19 The command line
20 The environement, each environment entry is in the form of a 0gnirts
name=value string. double zeros denote the end of the list
Supported Fingerprints:
-----------------------
Note: Vectors used in any fingerprint are stored on the stack as (x y z)
with x being farthest from the top of stack. Z only exists in
Trefunge and y only exists in Befunge or Trefunge
All vector operations in funge-space will use the IP's storage
offset unless noted in the specific fingerprint
Unless otherwise specified fingerprint data is local to the IP
that loaded the fingerprint
"3DSP" 0x33445350
-----------------
A (V3a V3b -- V3) Add two 3d vectors
B (V3a V3b -- V3) Subtract two 3d vectors
C (V3a V3b -- V3) Cross porduct of two vectors
D (V3a V3b -- n) Dot product of two vector
L (V3 -- n) Length of vector
M (V3a V3b -- V3) Multiply two 3d vectors
N (V3 -- V3) Normalize vector (sets length to 1)
P (Vdm Vsm -- ) Copy a matrix
R (Vdm axis ang -- ) Generate a rotation matrix
S (Vdm V3 -- ) Generate a scale matrix
T (Vdm V3 -- ) Generate a translation matrix
U (V3 -- V3 V3) Duplicate vector on top of stack
V (V3 -- x y) Map 3d point to 2d view
X (V3 Vam -- V3) Transform a vector using transformation matrix
Y (Vdm Vam Vbm -- ) Multiply two matrices
Z (n V3 -- V3) Scale a vector
All numbers used by these functions are single precision floating point
like in extension "FPSP"
In R, ang is in degrees, axis is an integer (1=x,2=y,3=z)
Matrices are stored in funge-space as 2-dimenstion 4x4 arrays. the
address vector will point to the x1y1 cell.
==========================================================================
"ARRY" 0x41525259
A (Va n x -- Va) - Store single dimension
B (Va x -- Va n) - Retrieve single dimension
C (Va n x y -- Va) - Store two dimension
D (Va x y -- Va n) - Retrieve two dimension
E (Va n x y z -- Va) - Store three dimension
F (Va x y z -- Va n) - Retrieve three dimension
G ( -- n) - Get maximum dimensions allowed
Array data is stored in funge-space
Negative array indexes are allowed
Dimensionality of arrays is NOT tied to the dimensionality of the
funge-space, however it is NOT required for an interpreter to support
arrays greater than funge-space dimensions. G can be used to determine
what array dimensionality can be used. Rc/Funge-98 supports three-
dimensional arrays in all funge-spaces.
Va is a vector in the form of the current funge-space, regardless of
the array dimensionality
Addresses used by this extension are absolute, the storage offset does
NOT apply to these functions.
==========================================================================
"BASE" 0x42415345
-----------------
B (n -- ) Ouptut top of stack in binary
H (n -- ) Ouptut top of stack in hex
I (b -- n) Read input in specified base
N (n b -- ) Output n in base b
O (n -- ) Ouptut top of stack in octal
==========================================================================
"BOOL" 0x424F4F4C
-----------------
A (a b -- r) - And
N (a -- r) - Not
O (a b -- r) - Or
X (a b -- r) - Xor
==========================================================================
"CPLI" 0x43504C49
-----------------
A (ar ai br bi -- r i) Add two complex integers
D (ar ai br bi -- r i) Divide two complex integers
M (ar ai br bi -- r i) Multiply two complex integers
O (r i -- ) Output a complext number
S (ar ai br bi -- r i) Subtract two complex integers
V (r i -- n) Absolute value of a complex integer
==========================================================================
"DATE" 0x44415445
-----------------
A (y m d days -- y m d) Add days to date
C (jd -- y m d) Convert julian day to calendar date
D (y1 m1 d1 y2 m2 d2 -- days) Days between dates
J (y m d -- jd ) Convert calendar date to julian day
T (y d -- y m d) Year/day-of-year to full date
W (y m d -- d) Day of week (0=monday)
Y (y m d -- d) Day of year (0=Jan 1)
A days may be negative
Since all these functions work with integer values, julian day calculations
assume 12:00 noon as the time.
Gregorian calendar is assumed for calendar dates
==========================================================================
"DIRF" 0x44495246
-----------------
C (0gnirts -- ) Change directory
M (0gnirts -- ) Make a directory
R (0gnirts -- ) Remove a directory
All functions act as r on failure
==========================================================================
"EVAR" 0x45564152
-----------------
G (0gnirts -- 0gnirts) Get value of an environment variable
N ( -- n ) Get number of environment variables
P (0gnirts --) Put a value into the environemnt (form: name=value)
V (n -- 0gnirts) Get n'th environmnt variable (form: name=value)
==========================================================================
"EMEM" 0x454d454d
-----------------
A (size -- hnd ) Allocate memory
F (hnd -- ) Free memory
G (hand n addr -- .. ) Get bytes from memory
P (.. hand n addr -- ) Put bytes into memory
R (hnd size -- ) Reallocate memory
Errors on any instructions will reflect
This is essentially an interface into malloc.
As far as implementing this, hnd can be the direct pointer if it fits
within the cell size of the interprter, or else a seperate list can
be maintained and this would be the handle into the list.
Stack entries written to memory using P truncate to bytes.
==========================================================================
"EXEC" 0x45584543
-----------------
A ( V n -- ) Execute command at vector n times from current
location, IP will be pointed at the A
B ( V n -- ) Like A but IP will be reset each iteration
G ( V -- ) Set position of IP to vector
K ( n -- ) what k should have been, will skip following
instruction if it is the iterated one
R ( n -- ) Like K but IP is reset after each iteration
X ( cmd n -- ) execute command on stack n times
An IP reset as used in B and R reset the IP position only, nothing else.
==========================================================================
"FILE" 0x46494C45
-----------------
C (h --) Close a file
D (0gnirts -- ) Delete a file
G (h -- h 0gnirts b) Read string from file (like c fgets)
L (h -- h n) Get location of file pointer
O (Va m 0gnirts -- h) Open a file (Va=i/o buffer)
m: 0 = read
1 = write
2 = append
3 = read/write
4 = truncate read/write
5 = append read/write
P (h 0gnirts -- h) Write string to file (like c fputs)
R (h n -- h) Read n bytes from file to buffer
S (h m n -- h) Seek to position n in file
m: 0 = from beginning
1 = from current location
2 = from end
W (h n -- h) Write n bytes from buffer to file
All file functions on failure act as r. Functions W and R write cells as
bytes, any cells containing values greater than 255 will have the top bits
stripped.
==========================================================================
"FING" 0x46494e47
-----------------
X (sem sem -- ) Swap two semantics
Y (sem -- ) Drop semantic
Z (src dst -- ) Push source semantic onto dst
sem can be 0-25 or 'A through 'Z. Any other value is an error and
will reflect
Z pull push a reflect if the source semantic stack is empty
==========================================================================
"FNGR" 0x464E4752
-----------------
A ( -- ) Set ( and ) to work in absolute mode
B ( -- fp 1) Create a Blank extension on top of stack
(all entries are set to transparent). The standard
fingerprint id for this copy will be 0xFFFFFFFF.
This is useful to create a customized
extension containing pieces from many others.
C (new n old o -- ) Copy instruction 'old' in fingerprint 'o' to
instruction 'new' in fingerprint 'n'
D (inst n-- ) Delete an instruction from fingerprint with id n
F (fp -- n) Get current id for specified fingerprint
(fp is a 1 cell version, like from ) )
K (n -- ) Kill extension at selected position in fingerprint stack
N ( -- n) Get number of fingerprints loaded
O ( -- ) Return ( and ) to the official functions
R ( -- ) Set ( and ) to work in roll mode
S ( -- ) Set ( and ) to work in swap mode
T (fp n -- ) Tag stack entry n with new fingerprint fp
X (n n -- ) Exchange the positions of two fingerprints in the stack
All instructions on failure act like r.
The fingerprint stack and fingerprint ids as used by this extension:
The fingerprint stack consists of all loaded fingerprints. When a fingerprint
is loaded it is pushed onto this stack. When an A-Z instruction is executed
the tos of this stack is the first searched for the command, and then on
downwards through the stack, if the bottom is hit, then an r command will be
executed. For most all commands in this extension, the fingerprint id is
actually the position on the fingerprint stack. The top has id 0, the second
id 1, and so on. So, if you were to execute "'A1D" This would delete the 'A'
command from the extension sitting on the second position on the fingerprint
stack.
Absolute Mode:
In absolute mode, the ( and ) instructions take on new meanings:
( - A number is popped of off the stack, this numbers is the fingerprint id
(stack position) of what should be considered the top of stack. It does
not actually move anything, it only changes where the instruction search
starts. Extensions on the stack above the selected one will not be
searched whereas the selected and donward will still be searched.
Executing "0(" will return the search to the top of the fingerprint
stack.
) - A number is popped of off the stack, this number specifies which
fingerprint is to be copied over the top of the current top of stack.
The extenstion that is currently on the top of the fingerprint stack
will be deleted amd the selected one takes its place. The selected
entry also remains in its original stack position, only a copy is made.
The search point is then reset to the top of the fingerprint stack.
Unlike the ( command, this will allow all other stack entries to be
searched.
Roll Mode:
In roll mode, the ( and ) instructions take on new meanings:
( - A number is popped off the data stack and is used to roll the
fingerprint stack. The item at the selected entry is removed and
moved to the top of stack, while all other entries are moved down.
This operates like the forth "roll" command.
) - This works like (, but the roll is reversed. The top of stack is
moved to the selected position while all other entries are moved up.
This operates like the forth "-roll" command.
Swap Mode:
In swap mode, the ( and ) instructions take on new meanings:
( - A number is popped from the data stack. This specifies which entry
in the fingerprint stack is to be swapped with the top of the
fingerprint stack.
) - This command uses no arguments from the data stack. It merely
swaps the top two entries on the fingerprint stack
Note: In all modes, on failure ( and ) will act like r.
When FNGR is loaded the fingerprint stack does NOT act like the spec,
Instead there is a single fingerprint stack and unloading a fingerprint
will remove the semantics for that fingerprint and not the semantics
assigned to the various commands of the unloaded fingerprint.
When FNGR is unloaded then the ( and ) commands will work like the
official specs.
==========================================================================
"FOBJ" 0x464f424a
D (ref -- ) - Destruct an object
I (0gnirts -- ref) - Instantiate an object
M (nargs ref m -- ..) - Call an object method
N (ref -- 0gnirts) - Get object name
All functions reflect upon error
ref referes to an index into a global object table
In Funge/Multiverse each universe has its own global object table
I 0gnirts referes to the funge file containing the code for the object
M nargs specifies how many stack entries to transfer to the IP created
in the object funge-space. Stack order is preserved. The count is NOT
placed on the destination IPs stack.
Funge files are in trefunge format. Each z level is a message handler,
therefore message handlers start at 0 and go up.
Funge-space for objects is in Trefunge mode.
Starting point for any message handler is always [0][0][m] with a delta
of [1][0][0]
if cell[0][0][m] is a space then cause M to reflect
Object method calls execute in a single tick
The full capabilites of the funge engine should be available to object
message handlers, this includes i,o,=,t, fingerprints, etc.
Funge multiverse is not required for this extension, but each object must
be its own funge-space.
In Rc/Funge-98, each object is a stand-alone VM that is NOT part of the
funge multiverse.
Funge-space of a loaded object must remain consistant across method calls.
In other words, if the method modifies its own funge-space, that change
must remain for further method calls.
When the last IP terminates a value is popped off its stack, that many
stack entries are transferred back to the calling IP. Order is preserved.
Global object table should be initialized at interpreter startup, and not
by loading this fingerprint
Object reference numbers may be reused
==========================================================================
"FPDP" 0x46504450
-----------------
A (a b -- n) Add two double precision fp numbers
B (n -- n) Sin of double precision fp number
C (n -- n) Cosin of double precision fp number
D (a b -- n) Divide two double precision fp numbers
E (n -- n) Arcsin of double precision fp number
F (n -- n) Convert integer to floating point
G (n -- n) Arctangent of double precision fp number
H (n -- n) Arccosin of double precision fp number
I (n -- n) Convert floating point to integer
K (n -- n) Natural logarithm of double precision fp number
L (n -- n) Base 10 logarithm of double precision fp number
M (a b -- n) Multiply two double precision fp numbers
N (n -- n) Negate double precision fp number
P (n -- ) Print a floating point number
Q (n -- n) Double precision square root
R (0gnirts -- n) Convert ascii number to floating point
S (a b -- n) Subtract two double precision fp numbers
T (n -- n) Tangent of double precision fp number
V (n -- n) Absolute value of double precision fp number
X (n -- n) Exponential of double precision fp number (e**n)
Y (x y -- n) Raise x to the power of y
==========================================================================
"FPRT" 0x46505254
D (format fh hl -- 0gnirts) - Format FPDP type number
F (format f -- 0gnirts) - Format FPSP type number
I (format n -- 0gnirts) - Format an integer
L (format h l -- 0gnirts) - Format long integer
S (format 0gnirts -- 0gnirts) - Format string
Formats are printf style
Error in formatting causes a reflect
==========================================================================
"FPSP" 0x46505350
-----------------
A (a b -- n) Add two single precision fp numbers
B (n -- n) Sin of single precision fp number
C (n -- n) Cosin of single precision fp number
D (a b -- n) Divide two single precision fp numbers
E (n -- n) Arcsin of single precision fp number
F (n -- n) Convert integer to floating point
G (n -- n) Arctangent of single precision fp number
H (n -- n) Arccosin of single precision fp number
I (n -- n) Convert floating point to integer
K (n -- n) Natural logarithm of single precision fp number
L (n -- n) Base 10 logarithm of single precision fp number
M (a b -- n) Multiply two single precision fp numbers
N (n -- n) Negate single precision fp number
P (n -- ) Print a floating point number
Q (n -- n) Single precision square root
R (0gnirts -- n) Convert ascii number to floating point
S (a b -- n) Subtract two single precision fp numbers
T (n -- n) Tangent of single precision fp number
V (n -- n) Absolute value of single precision fp number
X (n -- n) Exponential of single precision fp number (e**n)
Y (x y -- n) Raise x to the power of y
Notes: Trig functions work in radians
==========================================================================
"FIXP" 0x4649585
----------------
A (a b -- a and b) And
B (n -- arccos(b)) Find arccosin of tos
C (n -- cos(b)) Find cosin of tos
D (n -- rnd(n)) RanDom number
I (n -- sin(b)) Find sin of tos
J (n -- arcsin(b)) Find arcsin of tos
N (a -- 0-a) Negate
O (a b -- a or b) Or
P (a -- a*pi) Multiply by pi
Q (a -- sqrt(a)) Square root
R (a b -- a**b) Raise a to the power of b
S (n -- n) Replace tos with sign of tos
T (n -- tan(b)) Find tangent of tos
U (n -- arctan(b) Find arctangent of tos
V (n -- n) Absolute value of tos
X (a b -- a xor b) Xor
The functions C,I,T,B,J,U expect their arguments times 10000,
for example: 45 should be passed as 450000. The results will also be
multiplied by 10000, thereby giving 4 digits of decimal precision.
Note: Trigonometric functions work in degrees. not radians.
==========================================================================
"FORK" 0x464F524B
T ( -- pid flg ) Fork new process
T - flg=0 for parent, 1 for child.
T - child gets parent's pid, parent gets child's pid
T - child has its IP delta reflected
T - flg=-1 error in fork, does not reflect
==========================================================================
"FRTH" 0x46525448
-----------------
D ( .. -- .. n) Push depth of stack to tos
L ( .. n -- .. n) Forth Roll command
O (a b -- a b a) Forth Over command
P (.. n -- .. n) Forth Pick command
R (a b c -- b c a) Forth Rot command
==========================================================================
"HRTI" 0x48525449
-----------------
E ( -- ) Erase timer mark, this makes T act like r
G ( -- n) Get smallest tick size (in microseconds)
M ( -- ) Mark current timer value
S ( -- n) Get number of microseconds since last full second
T ( -- n) Get time since last marked (in microseconds)
==========================================================================
"ICAL" 0x4943414c
A (a -- r) - And
F (n -- ) - Forget
I (a b -- r) - Interleave a $ b
N (Va -- ) - Next
O (a -- r) - Or
R (n -- ) - Resume
S (a b -- r) - Select a ~ b
X (a -- r) - XOr
A,O,X work in 16 bits unless a is greater than 16 bits
I a and b are 16-bits and will produce a 32 bit result
N reflects if there are already 79 entries on the Next stack
Neither N nor R affect the delta!
0R is not an error and will just continue without resuming
Negative argument to R is an error and will reflect
R on an empty nexting stack will continue without resuming
R if n is greater than the number of nexting stack entries, the nexting
stack will be cleared and no resume will take place
==========================================================================
"IIPC" 0x49495043
-----------------
A ( -- n) Get ancestors unique id
D ( -- ) Go Dormant until stack is manipulated by another ip
G (i -- n) Get the top value of another ip's stack (pop)
I ( -- n) Get ip's own unique id
L (i -- n) Look at top stack value of another ip
P (n i -- ) Put a value onto another ip's stack
==========================================================================
"IMAP" 0x494D4150
-----------------
C ( -- ) Clear all instruction remaps
M (new old -- ) Remap an instruction
O (n -- ) Return instruction n to its old function
This extension is intended for mapping instrucions in the 0-255 range
Attempting to map instructions outside of the 0-255 range reflect
Chained remaps are not supported by this extension. Only a single level
of mapping is supported.
==========================================================================
"IMTH" 0x494d5448
A (.. n -- r) - Average
B (n -- r) - Absolute value
C (n -- r) - Multiply by 100
D (n -- r) - Decrease towards zero
E (n -- r) - Multiply by 10,000
F (n -- r) - Factorial
G (n -- r) - sign
H (n -- r) - Multiply by 1,000
I (n -- r) - Increase away from zero
L (n c -- r) - shift n left c times
N (.. n -- r) - Minimum value
R (n c -- r) - shift n right c times
S (.. n -- r) - sum
T (n -- r) - Multiply by 10
U (n -- ) - Unsigned print
X (.. n -- r) - Maximum value
Z (n -- r) - Negate
A n=0 is not an error and will return 0
A n<0 is an error and will reflect
A n>stacksize is not an error
F will reflect on negative
L c can be negative and will shift right
R c can be negative and will shift left
L,R count of zero will return the argument unmodified
N,X will reflect if count <= 0
N,X count greater than stack size is not an error
S n=0 is not an error and will return 0
S n<0 is an error and will reflect
S n>stacksize is not an error
D input of zero is not an error and will produce zero
I input of zero is not an error and will produce zero
==========================================================================
"INDV" 0x494E4456
-----------------
G (Vp - n) Pointer get number
P (n Vp -- ) Pointer put number
V (Va -- V) Pointer get vector
W (V Va --) Pointer put vector
Pointer functions pop a vector off the stack which points to another
vector in memory which is the pointer to the target cell.
Vectors are stored in memory with a delta of 1,0,0 with Z being first
in trefunge, and Y first in befunge.
==========================================================================
"IPMD" 0x49504d44
B ( -- ) Run in BeFunge mode
D ( -- ) Run in Default mode for VM
Q ( -- d) Query for mode IP is running in
T ( -- ) Run in TreFunge mode
U ( -- ) Run in UniFunge mode
These commands only affect the IP executing them. Other IPs running
in the same VM are not affected.
These functions affect how the IP interprets instructions, they will
be limited or expanded based upon the mode the IP is running in.
These modes are NOT affected by the mode the VM is running in. It is
allowed to set an IP into TreFunge mode in a BeFunge funge-space.
The TreFunge instructions must however work.
Vectors will be affected by the mode the IP is running in. Example:
If a VM is running in BeFunge mode and an IP is running in TreFunge
mode and wants to pop a vector, it will pop a 3 coordinate vector,
likewise if the IP were running in UneFunge mode, then it will pop a
single value vector.
When running in a mode less than Funge-Space, coordinates above the
mode of the IP will be set for the coordinate of the ip. For example
if the IP is at 20,30 then exectues U and then a g command is exectued,
g will retrieve a value from row 30, not 0
When running in a mode less than Funge-Space, x will set unpopped
delta values to 0.
Funge-space supports up to TreFunge when using this extension
==========================================================================
"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.
==========================================================================
"LONG" 0x4c4f4e47
-----------------
A (ah al bh bl -- rh rl) - Long integer add
B (ah al -- rh rl) - Absolute value
D (ah al bh bl -- rh rl) - Long integer division
E (n -- rh rl) - Sign extend integer to long integer
L (ah al n -- rh rl) - Shift long integer left n times
M (ah al bh bl -- rh rl) - Long integer multiplicaton
N (ah al -- rh rl) - Negate long integer
O (ah al bh bl -- rh rl) - a mod b
P (ah al -- ) - Print long integer
R (ah al n -- rh rl) - Shift long integer right n times
S (ah al bh bl -- rh rl) - Long integer subtract
Z (0"gnirts" -- rh rl) - Convert ascii to long integer
long integers are 2 cell integers, if the interpreter's cell size is 32, then
long integers are 64-bits.
Division by zero results in zero, not error
==========================================================================
"MACR" 0x4d414352
-----------------
A-Y ( -- ) Execute specified macro
Z (V -- ) Specify where macro block is
Macros are simple mini-funge like befunge subroutines that execute in a
single tick.
The Macro block may be located anywhere in Funge-Space. Each macro runs
with a delta of 1,0,0 macro A is located at the macro block vector,
Macro B is one line below at the same starting X, C below that, etc.
Macros execute with the IP where it is! not in the macro space.
Instructions affect the IP that called the Macro
A macro teminates when either a @ is found or an invalid instruction is
found
Most standard Funge-98 instructions can be used within macro blocks, but
keep in mind they affect the IP where it is and not inside the macro
block
A-Z generally are not allowed within macros, however some A-Z commands
perform special functions when executed inside of a macro:
A - like _ but affects the macro pointer instead of the IP
B - Move IP backwards
E - Change macro delta to 1,0,0
F - Move IP forwards
G - Get next macro cell onto stack
I - like | but affects the macro pointer instead of the IP
J - like j but affects the macro pointer instead of the IP
L - like [ but affects the macro pointer instead of the IP
N - Change macro delta to 0,-1,0
R - like ] but affects the macro pointer instead of the IP
S - Change macro delta to 0,1,0
T - Acts like # but affects the macro pointer instead of the IP
W - Change macro delta to -1,0,0
==========================================================================
"MODE" 0x4D4F4445
-----------------
H Toggles hover mode (relative vs absolute delta changes)
I Toggles invert mode (push to bottom of stack)
Q Toggles queue mode (pop from bottom of stack)
S Toggles switch mode (alters [,].{.}.(.) commands)
==========================================================================
"MODU" 0x4D4F4455
-----------------
M (a b -- a mod b) x-floor(x/y)*y
U (a b -- a mod b) Unsigned result
R (a b -- a mod b) C-language remainder
Note: MODU was defined before C99, therefore command R is implementation
dependant
==========================================================================
"MSGQ" 0x4d534751
-----------------
G (key flags -- id ) Get message queue identifier
K (id -- ) Kill message queue
R (n mtyp id flags -- .. n t) Read message to stack
S (.. n mtyp id flags -- ) Send bytes on stack as message
T (id -- nMsgs maxsize) Get message system info
G Flags:
4096 - IPC_CREAT - Create if it does not exist
8192 - IPC_EXCL - Open in exclusive mode
16384 - IPC_PRIVATE - Create private
low 9 bits are access permissions
R Flags:
1 - IPC_NOWAIT - Do not block if no messages
2 - MSG_NOERROR - truncate message instead of error