Значок ресурса

FORTH Stack Simulator

Нет прав на скачивание
Автор: S.J. Wainwright
Год: 1984
Издатели: Bernard Babani Publishing Ltd
Языки: 🇬🇧 Английский
Формат: 📼 TAP лента
Требования: 🖥️ ZX Spectrum 16K

Ссылки:
Страница на ZXArt
Страница на World Of Spectrum
Страница на Spectrum Computing

Скриншоты:
FORTHStackSimulator.gif


BASIC & FORTH in Parallel ( 1984 )

by. S.J.Wainwright







ABOUT:



The "FORTH-Stack Simulator" listing appears

on pages 90 to 95 of the book. The Appendix

on using the FORTH-Stack Simulator starts on

page 86 and ends on page 89. ( the Appendix

appears at the end of this document )







CAUTION:



It is not at all well error trapped. A mistake will

create an error message. Entering nothing at

the INPUT line will cause an error. Using /, mod,

/mod, */ and */mod on an EMPTY stack will

create an error. Also "pick" and "roll" must

be preceded by an integer or an error at line

2080 message will appear. If the second number

on the Stack is greater than 0 and the top number

is 0 and a / is entered you will get an error message.

SWAP the two before using /. If you enter a decimal

number ( ie. 3.5 ) you will only get the integer

onto the Stack ( 3 ) and not what is after the decimal

point ( .5 ).



Commands will be explained later.







RUNNING THE PROGRAM &

CONTINUING WHEN THERE IS AN ERROR:



You can start fresh by BREAKing into the

program ( or deleting the quotes at the INPUT line

and using the command STOP ) and RUNning

the program again from the start. Note: This will

delete variables and you should only do this

if you want to start over again.



The Appendix says to make a warm start with

GO TO 1000 but that doesn't always work. You can

use GO TO 1500 if you ever BREAK into the

program, if there is an error that won't allow you

to continue using GO TO 1000, or you use STOP

at the INPUT line ("L"). RETURN sometimes works

and GO TO 200 will also work, when there is an

error message.



I'd recommend GO TO 200 in most cases as it

takes you straight back to the INPUT line.







STACK OPERATIONS:



If the operations that can be performed

with the simulator seem limited it is because

it is meant to be used in conjunction with the

book and the examples in it. The simulator doesn't

use all the commands in the book and is only

used to illustrate Stack operations. Nevertheless,

despite its lack of error trapping, it works properly

by following the proper procedures and used

correctly. I believe it is a useful and educational

program, worthy for the benefit of a graphical

representation of the Stack and what goes on in

the Stack that you can't see while programming

in a real FORTH editor ( that I know of ).



The aim of the book is to gently get the reader's

feet wet by learning the first steps of FORTH and

it assumes the reader has some knowledge in

BASIC, using that to teach FORTH by comparison.



Without the book it may seem there is little one

can do with this program. This is why I will briefly

explain each command here following each

with an example or two so that you may see how

they work and you can try them out for yourself

and then go on and experiment on your own.

Now you can make the most of the simulator

as much as I can with the book. I will only cover

the operations used by the simulator.



Anything followed by ( FORTH-79 ) just means

that it is a FORTH-79 word. The others are Fig FORTH.

There isn't much difference between them. New words

can be defined to perform functions not available

in a particular flavor of FORTH. This really doesn't mean

much for the Simulator and I thought I'd bring it up

just to share where the words come from.







ZX////ZX////ZX////ZX////ZX////ZX////ZX////ZX////ZX////ZX////







TEACHING THE SIMULATOR

BY EXAMPLE - EXPLANATIONS

OF OPERATIONS AVAILABLE:



( Make sure CAPS LOCK is OFF )



First enter the following numbers:



5 ( ENTER)

7 ( ENTER )

12 ( ENTER )



Note: 'Last in, First out' ... so

we get the following:



12

7

5



SUGGESTION: Once you have read what each

operator word does, see if you can imagine what

the result will be before scrolling down to the answer

in each part!



-------||-------



ARITHMETIC OPERATIONS:



.



( an actual 'period' ) Like PRINT, and it POPs the

top number on the Stack off and PRINTS it.



The Stack:



12

7

5



Typing:



.



Will result in the Stack shifting upwards and the

number 12 getting popped off and being printed.



7

5

0



12 ( Printed )



-------||-------



+



This will add both numbers on the top of the

Stack and become the top number on the Stack:



7

5

0



Typing:



+



Results in:



12

0

0



-------||-------



-



This will subtract both numbers on the top of the

Stack and become the top number on the Stack:



12

0

0



Now type:



14



You should have



14

12

0



So, typing:



-



Results in:



-2

0

0



Why -2? Because we are subtracting 14 from 12 and not

12 from 14. If we want to get a positive answer we need

to swap the two numbers first.



( Note: I discovered doing - again

and ENTER also results in a + 2 in the

simulator. I think this is a quirk of the

simulator. )



We'll get to swap later but if you had typed:



swap



the 12 and 14 will "swap" position:



12

14

0



and then typing:



-



would have resulted in 2





-------||-------



*



This will multiply both numbers on the top of the

Stack and become the top number on the Stack:



-2

0

0



So, typing:



*



Will naturally result in:



0

0

0



-------||-------



Time to get more numbers on the stack.



Let's try 21, 34 and 3.



you should see:



3

34

21



-------||-------



/



This will divide both numbers on the top of the

Stack and become the top number on the Stack:



3

34

21



So type:



/



... and we should have:



11

21

0



( Remainder 1 is lost. There are other commands

to preserve them that we'll get to later )



-------||-------



Type:



17 and then 5



You should have:



5

17

11

21



-------||-------



mod



This pops the two top numbers off the Stack. It divides

the second on the Stack by the top off the Stack,

then pushes the remainder to the top of the Stack.



5

17

11

21



Type:



mod



You should have:



2 ( 17/5=3 and the remainder is 2. Easy! )

11

21



-------||-------



/mod



This pops the two top numbers off the Stack. It divides

the second on the Stack by the top off the Stack,

then pushes the remainder to the Stack and the

quotient to the Stack so that quotient is at the top

of the Stack and the remainder is second on the Stack.



2

11

21



Type:



/mod



You should see:



5

1

21



-------||-------



*/



This pops the top three numbers off the Stack. it

multiplies the second on the Stack by the third on

the Stack, which is then divided by the number at

the top of the Stack. The result goes to the top of

the Stack.



5

1

21



Typing:



*/



Should result in:



4 ( 21*1=21 ... 21/5=4 remainder 1)

0

0



-------||-------



*/mod



Does the same as */ but then the remainder is

pushed onto the Stack and then the quotient is

pushed also. So the remainder will be second

and the quotient first on the Stack.



Let's get those numbers back.



To 'drop' the 4 just do:



drop ( coming later )



The Stack should be all zeros:



0

0

0



Now type 21, 1 and 5 so again we have:



5

1

21



Now do:



*/mod



You should have:



4 ( 21*1=21 ... 21/5=4 ... remainder 1is second on Stack )

1

0



-------||-------



STACK OPERATIONS:



swap



Swaps the two numbers at the top of the stack.



4

1

0



Typing:



swap



Results in:



1

4

0



-------||-------



drop



Drops the top number off the Stack and

the rest of the numbers shift toward the

top of the Stack:



1

4

0



Typing:



drop



Will give:



4

0

0



-------||-------



dup ( FORTH-79 )



DUPlicates the top number on the Stack and

pushes it to the top of the Stack ( BUT NOT 0s ):



4

0

0



Type:



dup



... and you will have:



4

4

0



-------||-------



2dup



( First let's just type 1 then ENTER followed

by + and ENTER to get a better idea and not

have so many fours!!! :-)



5

4

0



2dup is like dup except it duplicates a "double

precision" number at the top of the Stack. Since

double precision numbers occupy two positions

on the Stack it will duplicate both numbers. If single

precision numbers occupy the Stack it will also

duplicate those.



Type:



2dup



... and we should have:



5

4

5

4



-------||-------



over



This will cause the second Stack entry to be duplicated

onto the top of the stack.



5

4

5

4



Type:



over



Result:



4

5

4

5

4



-------||-------



rot



ROTates the third Stack entry to the top

of the Stack:



4

5

4

5

4



Type:



rot



We should have:



4

4

4

5

4



( If you thought we would have:



4

4

5

5

4



we don't, since 4 was the third entry on

the Stack it remains that way using 'rot'

although placing the number 4 at the top.

The 5 is dropped because it would have

been taking this third position on the Stack

where 'rot' originally found a 4 and so the

third entry, 4, remains at the third position

thus dropping the 5, which would have shifted

to third postion, because it drops whatever

would be the third number, even after rotating

the original third Stack number. This is at

least how I understand 'rot', as far as "this

simulator" is concerned. )





-------||-------



pick ( FORTH-79 )



PICK is preceded by an integer. Example:



n pick



This causes the nth Stack entry to be duplicated onto

the top of the Stack. Normally, if pick is used without

a Stack position number preceding it, it will pop the top

number off the Stack and use it as the 'nth' integer.

( Note: I say "normally" because if pick doesn't have

a Stack number entry before it "in the simulator" you

will get an error message. )



4

4

4

5

4



Type:



4 pick



We have:



5

4

4

4

5

4



-------||-------



roll ( FORTH-79 )



ROLL is preceded by an integer representing a

position in the Stack, much like PICK.



n roll



The nth Stack entry will be rotated to the top of the

Stack. If no number precedes ROLL then the top Stack

entry will be popped off and used as the integer and

then operate on the remaining Stack, similarly to PICK.

( As with PICK, ROLL will result in an error "in this

simulator" if not preceded by an integer Stack position )



5

4

4

4

5

4



Type:



6 roll



We should have:



4

5

4

4

4

5





-------||-------



stop



Stops the simulator

( If you do this, to continue simply do:



GO TO 200 )



-------||-------







DEFINING YOUR OWN COMMANDS:



:



Use a colon when wanting to define a

new word to perform your own custom

operation. It then goes into the FORTH

dictionary.



-------||-------



;



The semicolon marks the end of a

colon definition.



-------||-------



defno



Will give you a list of all custom defined

words and their names.



-------||-------



noop



NOOPeration. No change is made to the Stack

AND handy to get out of certain parts of the program

and back to the main Stack display screen. ( For

example, handy with this simulator if you are at

the Defined Words screen and want to get out

without using any and want the Stack screen to

reappear)



-------||-------



We're about to get into defining your OWN words in FORTH.

You are allowed to do this in the simulator ( even if limited ) so

let's look at an example. I'll make one up now:





DEFINING YOUR OWN WORDS



( You can't use PICK, ROLL, any numbers or other new

defined words of your own, in newly defined words.

Also, only six characters MAX allowed in definitions. )





Let's say we want the second number on the Stack to its

3rd power ( x^3 ) and then popped off the Stack to be PRINTed

on the screen.



The Stack:



4

5

4

4

4

5



First we have to type:



:



To go into Definition mode.



Next we type the name of our new word.

What should we call it? Let's try...



2nd^3p



So we would type:



2nd^3p



... for - "2nd" Number on the Stack - To the "3rd Power" - "Print".

- On the SPECTRUM you get ^ holding SHIFT while pressing H

- Make a better name if you like. I'm just doing this as I type.





Now for the procedure:



We want the 2nd number on the Stack to the

3rd power. How do we make this happen?

Can we DROP the top number off? Yes, but what

if we need that number later? Let's Suppose we

do and we work it so we keep the top Stack number

and instead of DROP we do a SWAP.



So type:



swap



The Stack would look like this now if you could see it:



5

4

4

4

4

5



Ok. But we need to multiply this sucker three times.

We can use dup twice or 2dup. DUP twice is two

steps but 2DUP will create 5 4 5 4 etc... and we want

three consecutive fives. It would involve SWAPping the

first two Stack numbers then DROPping the first then

DUPlicating the first again. ( We can't use numbers

in our definitions - look at it this way. When you do use

FORTH it'll seem like a piece of cake without the

annoying restrictions of the simulator! :-)



So we're better off just DUPlicating twice.



Type:



dup



Type again:



dup



Now the Stack would look like this:



5

5

5

4

4

4

4

5



To the 3rd power. We only need to multiply the

first three numbers. From immediate mode

we would just do:



*



... and then that result times the last 5:



*



Right?



So do the same here:



Type:



*



... and again:



*



Now all we need to do is Print it like I said before.

We need the period.



Type:



.





There. We're almost done



To end our definition we need a semicolon.



Type:



;



... and we're taken back to immediate

mode but we dont see the Stack.



Do:



noop



The screen including the Before and After

Stack should be visible now.



Before we try our cool new word let's

see if it's in the dictionary by typing:



defno





You should see it. :)



2nd^3p





Then type:



noop



... to get out of there.



Try our new word:



2nd^3p





Is the Stack:



4

4

4

4

5



???



... and do we get a message saying:



2nd^3p OK

125 Printed out



???



We did???



Yes!



So do you get the idea???



Good for you!!!



Do 2nd^3p again!!!





... Okay. Here is just one more simple one.



Say you want to clear the whole Stack. In the simulator

there are 10 positions. We have the word:



drop



... to DROP the top number off the stack.



So to make this new word type:



:



... to go to definition mode.





Let's make a name. I suggest a name that's

easy to remember. So I'll call it:



dropal



... for DROP ALL numbers off the Stack.





As I've said the simulator shows 10 positions. Since DROP

is the only word we have in it, that will pop numbers off ( Besides

. which POPS AND PRINTS the top number off the Stack. You

can try this also if you like. You may want to Print all the numbers

on the Stack, but let's go with DROP for now )



So for each position on the Stack ( 10 ) we would type:



drop



10 times, each time followed by Enter.



drop



drop



drop



drop



drop



drop



drop



drop



drop



drop





Then type:



;



to end the word defintion.



Now if you fill up your Stack and perform:



dropal



You should see all the numbers being DROPped

one by one. Go ahead and try . instead of drop and

this time all the numbers will be POPped off the Stack

except this time they will be PRINTed too.



Make up your own operations/words!

Have fun ...



:-D





ZX////ZX////ZX////ZX////ZX////ZX////ZX////ZX////ZX////ZX////



... and that covers each word you can use in the simulator.

My mini-tutorial may have seemed long and it really isn't. Also I

hope you've seen how it's pretty easy. The simulator only deals

with the ( Parameter ) Stack so you will deal with arithmetic. There

is another Stack that deals with Loops, etc. although that's not

the one we have been practicing here. You can't print text or even

perform direct Reverse Polish Notation ( ie. 4 5 * 1 + 7 / 3 - ) etc.



Also the operators you can use in FORTH are FAR more than

are available in the simulator. The point is to see how the

Stack works, which is important whether you are programming

in FORTH or another language. Even if FORTH isn't your thing

you might find if you are a beginner in another language that

this simulator may be helpful to you.



If this was useful to you, educational, or just fun then

I'm glad you had a good time. It was fun for me to do

and I also learned some stuff along the way. What follows

is the Appendix for using the simulator, I typed straight from

the book.



Enjoy!!!



PS- I'm new to FORTH. Just because I wrote this doesn't

mean I'm some guru. If you know of any great FORTH tutorials

for fig FORTH, FORTH-79 and other older FORTHs including

ZX Spectrum FORTH and FORTH for other micros please get

in touch. Even if it's some great "current" implementation of

FORTH you want to let me know about, although I like doing

stuff on micros more I don't mind doing FORTH stuff in Windows

( oh and AMIGA! YES, AMIGA! ) ( I have Leo Brodie's great book

"Starting Forth, but I want more. I want to also manipulate sound,

graphics as well as do all the other stuff )



Since this will probably only be on related sites and not scattered

all over the internet here's my email for this sort of thing:



the.sentinel@charter.net



Thanks!!!



Sunday, 30 May 2004 6:04 am



- the.sentinel








ZX////ZX////ZX////ZX////ZX////ZX////ZX////ZX////ZX////ZX////



( FROM THE BOOK )



Appendix



The FORTH-Stack Simulator







The FORTH-Stack simulator program presented here is

written in Sinclair BASIC and will run on either a 16K or a

48K Sinclair Spectrum. With little modification the simu-

lator should run under most implementations of BASIC. It is

recommended that the FORTH-Stack simulator program is

typed in and SAVEd before the book is used so that the

reader can use the simulator to investigate the properties of

the Stack while he/she is reading about it. If the simulator is

SAVEd with LINE 1,then it will autorun on loading.

Two types of audio feedback are given to the user. First

the POKE command on line 1 causes a short bleep to be pro-

duced each time a computer key is pressed. Second, the

BEEP command on line 795 causes a slightly longer bleep to

be produced after a FORTH word has been executed, and

indicates that the machine is ready to receive another word.





The Simulator in Action



The FORTH-Stack simulator shows the contents of the Para-

meter Stack before and after a FORTH word is executed, as

shown for example in Figs. 1 and 2. After each FORTH word

is entered, the Stack is updated.



The simulated stack is 10 positions deep. Empty positions

in the Stack below the data values are shown as zeros by the

simulator, so the simulated Stack never in fact becomes

empty, but rather becomes full of zeros. Although this is an

important difference between the simulated Stack and a true

FORTH Stack it does not affect the ability of the simulator to

perform most of the important Stack operations. An example

of the difference in behaviour between the FORTH-Stack

simulator and a true FORTH-Stack would be in the instance

when nothing has yet been pushed onto the Stack and the

word . ( which means, pop the value off the top of the Stack



86





( This page Shows Figures 1 and 2 )



87





and print it out ) is typed in. In FORTH, the message STACK

EMPTY would be given. The FORTH-Stack simulator on the

other hand will display:



0 Printed out



The simulator will accept numbers but will only keep the

integer part of of the number. Thus, if 2.5 is typed in, 2 will be

pushed onto the top of the Stack.

The FORTH-Stack simulator will perform the following

arithmetic operations:



+, -, *, /, mod, /mod, */, and */mod.



It will also perform the following Stack operations:



dup, 2dup, ., drop, swap, over, pick, rot, and roll.





Colon Definitions on the Simulator



It is possible to compile up to ten colon definitions on the

simulator. Each definition can contain up to nineteen words.

When the simulator prompts the user to enter a Stack

command or a number; if a colon is entered, the simulator

switches into compile mode and prompts the user to enter a

colon definition. The definition is entered one word per line,

starting with the name of the word being defined, and is ter-

minated by a semicolon. When the semicolon is entered, the

simulator switches back into interpret mode and prompts the

user to enter a Stack command or a number. The name of the

defined word is now part of the FORTH-Stack dictionary,

and will execute whenever it is entered. Moreover, as the

new word executes, the Stack effects of each of its component

words are displayed in turn.





Restrictions on Colon Defintions

on the Simulator



1. All of the arithmetic operators and Stack commands

can be included in a colon definition with the exceptions of

pick and roll, which can only be used in immediate mode.



88





2. User defined words which have been defined in colon

definitions cannot be included in other colon definitions.

3. Numbers cannot be included in colon definitions.





Other Words Available

on the FORTH-Stack Simulator



stop This brings the simulator to a halt.

: The colon allows the definition of new words.

; The semicolon marks the end of a colon definition.

defno Displays the number of new words which have

been defined and gives their names.

noop Produces no change on the Stack. This is useful for

redisplaying the Stack after a new word has been defined or

after defno has been executed.



If something is entered which is not a number, an arith-

metic operator, a Stack operator, or one of the above words,

the program will terminate with a BASIC error message.





Making a Warm Start into the Simulator



A warm start can be made into the simulator by entering

GOTO 1000



89
Автор
Verter_bot
Загрузки
0
Просмотры
10
Расширение
zip
Размер
2.5 КБ
Хэш
754cf8ea3631a827d671a3dbf51a972b
Первый выпуск
Последнее обновление

Оценки

0.00 звезд(ы) 0 оценок
Назад
Вверх