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 http://webpages.charter.net/the.sentinel/ http://mondodizzy.members.easyspace.com/ http://dizzypetition.members.easyspace.com/ 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