home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG023.ARK
/
DICT.DOC
< prev
next >
Wrap
Text File
|
1984-04-29
|
8KB
|
266 lines
***************************************************************************
** COPYRIGHT (C) MASSACHUSETTS INSTITUTE OF TECHNOLOGY AND HARVARD **
** UNIVERSITY, BIOMEDICAL ENGINEERING CENTER 1977. ALL RIGHTS RESERVED. **
***************************************************************************
DICTIONARY FORMAT
THE STOIC DICTIONARY CONSISTS OF MULTIPLE LINKED
LISTS OF ENTRIES, CALLED BRANCHES. EACH BRANCH IS LINKED
ONLY IN THE BACKWARD DIRECTION, NAMELY FROM MORE RECENT TO
LESS RECENT DEFINITIONS. EACH LIST IS TERMINATED BY AN
ENTRY WITH A ZERO LINK WORD. THE DICTIONARY MAY HAVE ANY
NUMBER 1OF BRANCHES.
EACH ENTRY CONTAINS A NAME FIELD WHICH CONSISTS
OF THE NUMBER OF CHARACTERS IN THE NAME FOLLOWED BY
THE FIRST FIVE CHARACTERS. THE NAME IS FILLED OUT IF
NECESSARY WITH NULLS (ASCII 0). IN ADDITION, THERE IS
A ONE BIT PRECEDENCE FIELD AND A CODE ADDRESS WORD WHOSE
FUNCTIONS WILL BE DISCUSSED LATER.
THE PARAMETER FIELD IS THE BODY OF THE ENTRY AND
MAY BE ONE OR MORE WORDS LONG. FOR A VARIABLE OR
CONSTANT, IT IS A SINGLE WORD CONTAINING THE VALUE OF
THE VARIABLE OR CONSTANT. FOR A COLON DEFINITION, IT IS A
LIST OF ADDRESSES OF THE PARAMETER FIELDS OF OTHER WORDS
TO BE EXECUTED. FOR A CODE DEFINITION, IT IS THE ACTUAL
MACHINE INSTRUCTIONS TO BE EXECUTED.
DICTIONARY ENTRY FORMAT
WORD BIT CONTENTS
0 0 PRECEDENCE (0 = LOW, 1 = HIGH)
1-7 NUMBER OF CHARACTERS IN NAME
8-15 FIRST ASCII CHARACTER OF NAME
1 SECOND AND THIRD CHARACTERS OF NAME
2 FOURTH AND FIFTH CHARACTERS OF NAME
3 ADDRESS OF PREVIOUS ENTRY
0 IF END OF DICTIONARY CHAIN
4 CODE ADDRESS
5 FIRST WORD OF PARAMETER FIELD
EXECUTION OF WORDS
THE HEART OF STOIC IS A COMPACT SECTION OF CODE
WHICH EXECUTES THE NEXT WORD. IT MAKES USE OF AN INSTRUCTION
POINTER CALLED ".I" WHICH IS HELD A MEMORY LOCATION. AT ALL
TIMES, IT POINTS TO THE LOCATION PRECEDING THE ONE ABOUT TO
BE EXECUTED NEXT.
ON THE 8080, THE INTERPRETER CONSISTS OF THE
FOLLOWING INSTRUCTIONS:
NEXT: LHLD .I ;GET ".I"
INX H ;INCREMENT BY 2
INX H
SHLD .I ;STORE UPDATED VALUE
MOV E,M ;GET WORD ADDRESSED BY ".I" IN (D,E)
INX H ;(ADDR OF PARAMETER FIELD OF NEXT WORD)
MOV D,M
MOV H,D ;COPY (D,E) TO (H,L)
MOV L,E
DCX H ;LOAD (H,L) WITH CODE ADDRESS FIELD
MOV A,M
DCX H
MOV L,M
MOV H,A
PCHL ;JUMP TO CODE ADDRESS
WHAT THIS DOES IS TO INCREMENT ".I", LOAD (D,E) WITH THE
ADDRESS OF THE PARAMETER FIELD OF THE NEXT WORD TO BE
EXECUTED, AND JUMP TO THE LOCATION ADDRESSED BY
THE CODE ADDRESS FIELD OF THAT WORD.
SP IS USED TO HOLD THE PARAMETER STACK POINTER
AND MUST NOT BE DESTROYED BY ANY WORD I.E., IF USED,
ITS VALUE MUST BE SAVED AND RESTORED.
THE CODE ADDRESS WORD
THE CODE ADDRESS FOR A CONSTANT POINTS TO CODE
WHICH PUSHES THE VALUE OF THE CONSTANT ON THE STACK:
XCHG ;MOVE ADDR OF PARAMETER FIELD TO (H,L)
MOV E,M ;LOAD (D,E) WITH CONTENTS OF PARAMETER FIELD
INX H
MOV D,M
PUSH D ;PUSH IT
JMP NEXT ;EXECUTE NEXT WORD
THE CODE ADDRESS FOR A VARIABLE POINTS TO CODE
WHICH PUSHES THE ADDRESS OF THE VARIABLE ON THE STACK:
PUSH D ;PUSH ADDR OF PARAMETER FIELD
JMP NEXT ;EXECUTE NEXT WORD
THE CODE ADDRESS FOR A COLON DEFINITION POINTS TO
CODE WHICH PUSHES ".I" ON THE RETURN STACK, AND SETS ".I"
TO POINT TO THE WORD PRECEDING THE FIRST WORD OF THE
PARAMETER FIELD OF THE CURRENT WORD:
(:): LHLD .I ;MOVE .I TO (D,E)
XCHG
DCX H ;SET .I TO W-2
DCX H
SHLD .I
LHLD .R ;INCREMENT RETURN STACK PTR BY 2
INX H
INX H
SHLD .R
MOV M,E ;STORE .I ON END OF RETURN STACK
INX H
MOV M,D
JMP NEXT ;EXECUTE NEXT WORD
THE RETURN STACK POINTER IS KEPT IN THE LOCATION
LABELLED ".R".
AT THE END OF EVERY COLON DEFINITION IS THE ADDRESS
OF A NAMELESS DICTIONARY ENTRY WHICH POPS ".I" FROM THE
RETURN STACK:
(;): LHLD .R ;RETURN STACK POINTER
MOV E,M ;LOAD (D,E) WITH TOP OF RETURN STACK
INX H
MOV D,M
DCX H
DCX H ;DECREMENT RETURN STACK POINTER BY 2
DCX H
SHLD .R ;STORE UPDATED VALUE
XCHG ;SET ".I" TO TOP OF RETURN STACK
SHLD .I
JMP NEXT ;EXECUTE NEXT WORD
THE CODE ADDRESS FOR A CODE DEFINITION POINTS
TO THE FOLLOWING WORD, I.E. THE FIRST WORD OF THE
DEFINITION.
THE PRECEDENCE BIT
THE PRECEDENCE BIT IS USED DURING COMPILATION TO CAUSE
CERTAIN WORDS TO BE EXECUTED IMMEDIATELY INSTEAD OF BEING
COMPILED. THIS FACILITY MAKES POSSIBLE COMPILATION OF THE
FORWARD AND BACKWARD REFERENCES WHICH ARE NECESSARY FOR
CONDITIONALS AND ITERATION.
WHEN STOIC IS COMPILING A WORD INTO THE COMPILE BUFFER,
IF ITS PRECEDENCE BIT IS ZERO, THE ADDRESS OF THE PARAMETER FIELD
OF THE WORD IS STORED IN THE COMPILE BUFFER. IF ITS PRECEDENCE
BIT IS NON-ZERO, THE WORD IS EXECUTED DIRECTLY.
EXAMPLE:
BEGIN X @ EQZ END ;
THIS GENERATES THE FOLLOWING CODE IN THE COMPILE BUFFER:
LOOP: ADDRESS OF X
ADDRESS OF @
ADDRESS OF EQZ
ADDRESS OF (IF)
LOOP-2-.
(IF) TESTS THE TOP OF THE STACK AND, IF ZERO,
ADDS TO ".I" THE CONTENTS OF THE NEXT WORD; IF
NON-ZERO, ".I" IS INCREMENTED BY 2.
"BEGIN" AND "END" HAVE THE PRECEDENCE BIT
SET IN THEIR DICTIONARY ENTRIES.
"BEGIN", IS EXECUTED SINCE ITS PRECEDENCE BIT IS
SET, AND CAUSES THE CURRENT COMPILE BUFFER OUTPUT
POINTER (WHOSE VALUE IS NOW "LOOP") - 2 TO BE SAVED
ON THE PARAMETER STACK.
THE ADDRESSES OF "X", "@", AND "EQZ" ARE COMPILED
DIRECTLY INTO THE COMPILE BUFFER SINCE THEIR PRECEDENCE
IS ZERO.
"END" IS EXECUTED, CAUSING THE ADDRESS OF "(IF)"
TO BE OUTPUT TO THE COMPILE BUFFER, FOLLOWED BY THE
SAVED DICTIONARY POINTER MINUS THE CURRENT VALUE OF
THE COMPILE BUFFER OUTPUT POINTER ("LOOP"-2-.).
WHEN THE ABOVE COMPILED CODE IS EXECUTED, THE WORDS
"X", "@", AND "EQZ" ARE EXECUTED. "(IF)" THEN
CAUSES A CONDITIONAL BRANCH BACK TO "LOOP" IF
THE TOP OF THE STACK IS ZERO, OTHERWISE CONTROL
PASSES ON TO THE NEXT WORD.
THE USER MAY SET THE PRECEDENCE BIT HIMSELF, USING
THE FOLLOWING WORD:
IMMEDIATE SET THE PRECEDENCE BIT OF THE
MOST RECENTLY DEFINED WORD.
EXAMPLE:
'ZERO : 0 = ; IMMEDIATE
THIS DEFINES A WORD CALLED "ZERO" WHICH TYPES
A "0" WHEN COMPILED. IT GENERATED NO CODE AT COMPILE
TIME. THUS,
'TEST : ZERO ;
CAUSES A "0" TO BE TYPED WHILE LEAVING THE
DEFINITION OF TEST EMPTY.
THE FOLLOWING WORD PERMITS MORE COMPLICATED
SEQUENCES OF WORDS TO BE EXECUTED WHILE
COMPILING A DEFINITION:
// COMPLEMENT STATE (HAS PRECEDENCE BIT SET)
THUS:
'TEST : // 0 = // ;
IS EQUIVALENT TO THE ABOVE EXAMPLE.
COLON DEFINITIONS
THE COMPILATION OF A COLON DEFINITION IS ONLY SLIGHTLY
DIFFERENT FROM NORMAL COMPILATION OUTSIDE A COLON DEFINITION.
THE WORD ":" HAS NON-ZERO PRECEDENCE AND CAUSES THE ADDRESS OF
"((:))" TO BE OUTPUT TO THE COMPILE BUFFER FOLLOWED BY A ZERO WORD.
":" ALSO CHECKS TO MAKE SURE THAT THE NESTING DEPTH IS ZERO
AND THEN INCREMENTS THE NESTING DEPTH BY ONE.
THE WORD ";" ALSO HAS NON-ZERO PRECEDENCE AND CAUSES
THE ADDRESS OF "(;)" TO BE OUTPUT TO THE COMPILE BUFFER.
IT THEN STORES IN THE ZERO WORD FOLLOWING "((:))" THE
NUMBER OF BYTES COMPILED SINCE THE START OF THE COLON
DEFINITION. ";" ALSO CHECKS FOR ZERO NESTING DEPTH.
WHEN EXECUTED, THE WORD "((:))" CREATES THE FIRST FIVE
WORDS FOR THE NEW DICTIONARY ENTRY USING THE STRING WHOSE
ADDRESS IS AT THE TOP OF THE STACK AND THEN COPIES THE FOLLOWING
N BYTES FROM THE COMPILE BUFFER INTO THE DICTIONARY WHERE N IS
THE CONTENTS OF THE FOLLOWING WORD IN THE COMPILE BUFFER. SINCE
ALL ADDRESS CONTAINED IN THE COMPILED CODE ARE EITHER ABSOLUTE
ADDRESSES OF WORDS IN THE DICTIONARY OR OFFSETS RELATIVE TO
".I", THE CODE IS POSITION INDEPENDENT AND WILL EXECUTE
PROPERLY EITHER IN THE COMPILE BUFFER OR WHEN RELOCATED TO
THE END OF THE DICTIONARY.
***EOF***