home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource3
/
122_01
/
pbase2
< prev
next >
Wrap
Text File
|
1984-03-07
|
23KB
|
1,099 lines
% *********************************************************
% * *
% * PISTOL-Portably Implemented Stack Oriented Language *
% * Version 2.0 *
% * (C) 1983 by Ernest E. Bergmann *
% * Physics, Building #16 *
% * Lehigh Univerisity *
% * Bethlehem, Pa. 18015 *
% * *
% * Permission is hereby granted for all reproduction and *
% * distribution of this material provided this notice is *
% * included. *
% * *
% *********************************************************
% BASIC DEFINITIONS FOR PISTOL 2.0
%
% DECIMAL mode initially
%
+5 W * USER + W@ W@ % used for 'LAST-PRIMITIVE
'W* W 1 - IF : W * ;
ELSE $: ;$
THEN
'USER+ USER IF $: USER + ;$
ELSE $: ;$
THEN
'TRANS $: W* USER+ ;$ % TRANSLATES LOGICAL ADDRESSES TO ACTUAL RAM ADDR.
% TRANS MUST USE "$:" FOR THE 'DIS PACKAGE
'TRANS@ : TRANS W@ ;
'ARGPATCH : +5 TRANS@ W@ W + W! ; % for 'CONSTANT 'VARIABLE, 'ARRAY
'CONSTANT : : 0 ; ARGPATCH ;
'LAST-PRIMITIVE CONSTANT
-1 'TRUE CONSTANT
0 'FALSE CONSTANT
-21 TRANS@ 'MININT CONSTANT
-20 TRANS@ 'MAXLINNO CONSTANT
-19 TRANS@ 'CHKLMT CONSTANT
-18 TRANS@ 'RAMMIN CONSTANT
-17 TRANS@ 'STRINGSMIN CONSTANT
-16 TRANS@ 'STRINGSMAX CONSTANT
-15 TRANS@ 'VBASE CONSTANT
-14 TRANS@ 'VSIZE CONSTANT
VBASE VSIZE W* + 'VMAX CONSTANT
-13 TRANS@ 'CSIZE CONSTANT
-12 TRANS@ 'LSIZE CONSTANT
-11 TRANS@ 'RSIZE CONSTANT
-10 TRANS@ 'SSIZE CONSTANT
-9 TRANS@ 'LINEBUF CONSTANT
LINEBUF 200 + 'EDITBUF CONSTANT
-8 TRANS@ 'COMPBUF CONSTANT
-7 TRANS@ 'RAMMAX CONSTANT
-6 TRANS@ 'MAXORD CONSTANT
-5 TRANS@ 'MAXINT CONSTANT
-4 TRANS@ 'VERSION CONSTANT
-3 TRANS@ 'NEWLINE CONSTANT
-2 TRANS@ 'READ_PROTECT CONSTANT
-1 TRANS@ 'WRITE_PROTECT CONSTANT
'ON : TRUE SWAP W! ;
'OFF : FALSE SWAP W! ;
'INFILE : +7 TRANS@ ;
'BYE : +31 TRANS ON ;
+34 TRANS 'ABORT-PATCH CONSTANT
+33 TRANS 'CONVERT-PATCH CONSTANT
+32 TRANS 'PROMPT-PATCH CONSTANT
+29 TRANS '(PISTOL<) CONSTANT
+28 TRANS '.V CONSTANT
+24 TRANS '#GET-ADDR CONSTANT % FOR PATCHING #GETLINE
+23 TRANS 'TAB-SIZE CONSTANT
+22 TRANS 'TRACE-ADDR CONSTANT
+21 TRANS 'ENDCASE-PATCH CONSTANT
+20 TRANS 'COLUMN CONSTANT
+19 TRANS 'TERMINAL-WIDTH CONSTANT
+18 TRANS '#LINES CONSTANT
+17 TRANS 'TERMINAL-PAGE CONSTANT
+16 TRANS 'COMPILE-END-PATCH CONSTANT
+15 TRANS 'TRACE-LEVEL CONSTANT % USED AS BOOLEAN
% AND LEVEL INDICATOR
+13 TRANS 'RAISE CONSTANT
+11 TRANS 'NEXTCH^ CONSTANT
+10 TRANS 'CONSOLE CONSTANT
+9 TRANS 'ECHO CONSTANT
+8 TRANS 'LIST CONSTANT
+6 TRANS 'PREVIOUS CONSTANT % UPDATED BY (V)FIND
+5 TRANS 'CURRENT CONSTANT
+4 TRANS 'OLD-EOSTRINGS CONSTANT % END OF PERMANENT
% STRINGS VARIABLE
+3 TRANS 'CURRENT-EOSTRINGS CONSTANT
+2 TRANS '.D CONSTANT
+1 TRANS '.C CONSTANT
+0 TRANS 'RADIX CONSTANT
STRINGSMIN 'RADIX-INDICATOR CONSTANT
STRINGSMIN 1 + 'SYNTAXBASE CONSTANT
'NOP : ;
'DUP : 0 S@ ;
'1+ : 1 + ;
'1- : 1 - ;
'W+ : W + ;
'W- : W - ;
'W<- : SWAP W! ;
'1+W! : DUP W@ 1+ W<- ;
'W+W! : DUP W@ W+ W<- ;
'CR : NEWLINE TYO ;
'SPACE : 32 TYO ;
'SPACES : 0 DO SPACE LOOP ;
'DDUP : 1 S@ 1 S@ ;
'OVER : 1 S@ ;
'2OVER : 2 S@ ;
'3OVER : 3 S@ ; % USED BY DIS PACKAGE(DON'T CHANGE!)
'UNDER : SWAP DROP ;
'TYPE : 0 DO DUP C@ TYO 1+ LOOP DROP ;
'LT : MININT SWAP 1- .. ;
'GT : 1+ MAXINT .. ;
'LINE-SPACE? : COLUMN W@ + TERMINAL-WIDTH W@ LT
IF ELSE CR THEN ;
'MSG : DUP C@ LINE-SPACE?
DUP 1+ SWAP C@ TYPE ;
'IFCR : COLUMN W@ 0 GT IF CR THEN ;
'ERR : IFCR ABORT ;
'MERR : CONSOLE ON MSG ERR ;
'INDENT : DUP TERMINAL-WIDTH W@ LT IF
COLUMN W@ - SPACES
ELSE IFCR DROP
THEN ;
'TAB : 9 TYO ;
'TABS : 0 DO TAB LOOP ;
'ALLOT : W* .D W@ + .D W! ; % advances dictionary pointer
% by the amount given by top of stack
'W, : % PLACES TOS AT END OF DICTIONARY
.D W@ W! 1 ALLOT
;
'VARIABLE : : 3 ; % create definition
.D W@ ARGPATCH % point it at end of dictionary
W, % initialize variable
; % finish with allocating space
'ARRAY : : 3 ; % create definition
.D W@ ARGPATCH % point it at end of dictionary
ALLOT ; % allocate requested space and ;
% VOCABULARY RELATED DEFINITIONS:
'> : .V W@ DUP VBASE GT % "POPS" VOCABULARY STACK
IF W- .V W!
ELSE "*** VSTACK UNDERFLOW***" MERR
THEN
;
'<V : % TRANSFERS TOS TO TOP OF VSTACK
.V W@ DUP VMAX LT
IF W+ DUP .V W! W!
ELSE "*** VSTACK OVERFLOW***" MERR
THEN
;
'PISTOL< : (PISTOL<) <V ;
(PISTOL<) 'BRANCH-LIST VARIABLE
'BRANCH : % CREATES AN ARRAY OF TWO ELEMENTS
% AND A PROCEDURE THAT PUSHES A ^
% TO THE FIRST ELEMENT OF THE ARRAY
% THIS FIRST ELEMENT CONTAINS A ^
% TO THE CURRENT HEAD OF THE VOCABULARY
% BRANCH AND THE SECOND ELEMENT IS A
% BACKWARD LINK TO THE PREVIOUS HEAD.
% BRANCH-LIST CONTAINS THE ^ TO THE
% THREADED LIST OF BRANCHES THAT HAVE
% BEEN DEFINED; THE BACKWARD LINK FOR
% (PISTOL<) IS "NIL"
: 3 <V ; .D W@ ARGPATCH
0 .D W@ W!
BRANCH-LIST W@ .D W@ W+
W!
.D W@ BRANCH-LIST
W!
2 ALLOT
;
'UNLINKED< BRANCH % CAN BE USED FOR RARELY USED, OBSCURE,
% OR DANGEROUS WORDS
CURRENT W@ W@ W+ W@ '(UNLINKED<) CONSTANT % PROVIDES POINTER
% TO HEAD OF THIS VOCAB.
'3W- : W- W- W- ;
'BLIST : % LISTS THE NAMES OF ALL DEFINED BRANCHES
BRANCH-LIST W@
BEGIN
DUP W+ W@ DUP % GET LINK
IF
SWAP 3W- 3W-
W@ MSG CR
REPEAT
DROP DROP
IFCR
'PISTOL< MSG
;
% DO LOOP INDICES:
'I : 0 L@ ;
'J : 3 L@ ;
'K : 6 L@ ;
'I' : 2 L@ 1 L@ + 1- 0 L@ - ;
'J' : 5 L@ 4 L@ + 1- 3 L@ - ;
'K' : 8 L@ 7 L@ + 1- 6 L@ - ;
% SOME LOGICAL OPERATORS:
'LOR : IF DROP TRUE THEN ; % LOGICAL OR
'LAND : IF ELSE DROP FALSE THEN ; % LOGICAL AND
'LNOT : IF FALSE ELSE TRUE THEN ; % LOGICAL NEGATION
'MINUS : 0 SWAP - ;
'LTZ : MININT -1 .. ;
'GTZ : 1 MAXINT .. ;
'EQZ : LNOT ;
'ABS : DUP LTZ IF MINUS THEN ;
'EQ : - LNOT ;
'LE : MININT SWAP .. ;
'GE : MAXINT .. ;
'MIN : DDUP GE IF SWAP THEN DROP ;
'MAX : DDUP GE IF THEN SWAP DROP ;
% NUMBER OUTPUT ROUTINE:
% ASCII <-- DIGIT
'ASCII : DUP 9 GT IF 55
ELSE 48
THEN + ;
'<U#> : -1 SWAP
BEGIN RADIX W@ /MOD ABS SWAP DUP LNOT END
DROP ;
'#TYPE : BEGIN DUP -1 GT IF ASCII TYO REPEAT DROP ;
'= : DUP 0 LT IF 45 TYO MINUS THEN
<U#> #TYPE ;
'? : W@ = ;
% BELOW ARE WORDS THAT CONTROL DISPLAY OF CODE PRODUCED
% BY THE COMPILER; CAN BE USEFUL FOR DEBUGGING AND EDUCATION
'CODESHOW : IFCR "COMPILE BUFFER CONTAINS:" MSG CR
COMPBUF BEGIN DUP ? TAB W+
.C W@ OVER GT LNOT
END
DROP IFCR
;
'SHOWCODE : 0 COMPILE-END-PATCH W! ; 'CODESHOW FIND ARGPATCH
'NOSHOWCODE : COMPILE-END-PATCH OFF ;
'PROMPT : % DUPLICATES PRIMITIVE PROMPT
IFCR % FUNCTION
SP IF SP = THEN % EXCEPT STACK SIZE SHOWN
RADIX-INDICATOR C@ TYO
SYNTAXBASE MSG
"> " MSG
;
'PROMPT FIND PROMPT-PATCH W! % PATCHING IT
'ADDRESS : DUP FIND DUP
IF
UNDER
ELSE
IFCR 39 TYO DROP MSG
" NOT FOUND" MERR
THEN
;
'/ : /MOD DROP ;
'MOD : /MOD UNDER ;
% CHANGING NUMBER BASES:
'HEX : 72 RADIX-INDICATOR C! 16 RADIX W! ;
'DECIMAL : 88 RADIX-INDICATOR C! 10 RADIX W! ;
'OCTAL : 81 RADIX-INDICATOR C! 8 RADIX W! ;
'BINARY : 66 RADIX-INDICATOR C! 2 RADIX W! ;
%
'STACK : IFCR 40 TYO SP = 41 TYO % (STACKSIZE)
SP SP 12 MIN 1- 0 DO 2 SPACES DUP S@ = 1- LOOP
DROP ;
%
'RSTACK : IFCR 'R( MSG RP 1- = 41 TYO % RSTACK SIZE
RP 1- DUP 12 MIN 0 DO 2 SPACES DUP R@ = 1-
LOOP DROP ;
% RECURSE ALOWS ROUTINE OR COMPBUF TO CALL ITSELF
'RECURSE : 1 R@ W- % FIND IN WHICH WORD
0 R@ W- % FIND WHERE IS RECURSE USED
W! % PATCH
R> W- <R % BACKUP TO EXEC PATCH
;
%
'TELL : W- W- W@ MSG ;
'NEXT-LINK : 3W- W@ ;
%
% THIS BOMBS WHEN > NUMINSTRUCTIONS
'PNAME : DUP IF
LAST-PRIMITIVE
BEGIN DUP
IF DDUP W@ EQ
IF TELL TRUE
ELSE NEXT-LINK FALSE
THEN
ELSE '(NO_NAME) MSG LNOT
THEN
END
DROP
ELSE '; MSG DROP
THEN
;
%
'NAME : DUP PRIMITIVE? IF
PNAME
ELSE TELL
THEN ;
% VOCABULARY MAINTENANCE PACKAGE:
% LLIST ADDRESS AND NAME:
'LNAME : DUP = 3 SPACES NAME CR ;
% LIST LAST TEN WORDS:
'NEXT10 : IFCR 10 0 DO DUP LNOT IF ERR THEN
DUP LNAME