1 FastForth for MSP430FRxxxx TI's chips, from 16k FRAM
2 ==================================================
4 Tested on all MSP-EXP430FRxxxx TI launchpads (5739,5969,5994,6989,4133,2355,2433,2476), at 0.5, 1, 2, 4, 8, 12, 16 MHz plus 20MHz and 24MHz with FR23xx,FR57xx devices.
6 Fast Forth is a fast and well-made embedded interpreter/assembler/compiler, very interesting because of its size under 5.5 KB.
7 This includes the FORTH language, an amazing and powerful assembler with conditional compilation, a 16-input search engine which
8 speeds up the Forth interpreter by a factor of 4, and a connection to the serial terminal (TERATERM.exe), with 3 wires software flow control (XON/XOFF) and/or 4 wires hardware control flow, up to 6 Mbds.
9 If your goal is to program a MSP430FRxxxx in assembler or just to learn assembler, enjoy yourself, try it!
10 However, if the IDE works well with Windows 10, it works less well with Linux which suffers from the lack of a good alternative to TERATERM...
12 For only 3 kbytes in addition, you have the primitives to access the SD\_CARD FAT16 and FAT32: read, write, del, download source files and to copy them from PC to the SD_Card.
13 It works with all SD\_CARD memories from 64MB to 64GB. The cycle of read/write a byte is below 1 us @ 16 MHz.
14 This enables to make a fast data logger with a small footprint as a MSP430FR5738 QFN24.
16 With all kernel options, including extended_ASM and SD_Card driver, FastForth size is below 10.5 kB.
18 The files launchpad_xMHz.txt are the executables ready to use with a PL2303HXD cable and
19 a serial terminal (TERATERM.exe) at 115200Bds with XON/XOFF, or RTS hardware flow control
20 ------------------------------------------------------------------------------------------
21 WARNING! don't use it to supply your launchpad: red wire is 5V ==> MSP430FRxxxx destroyed!
22 ------------------------------------------------------------------------------------------
23 (you can modify this by opening the box and by welding red wire on 3.3V pad).
25 TI Launchpad PL2302HXD cable
29 RTS ---> CTS (not necessary if software XON/XOFF flow control
30 see in your launchpad.asm to find RTS pin).
32 The interest of XON/XOFF flow control is to allow 3.75kV galvanic isolation of terminal input
33 with SOIC8 Si8622EC|ISO7421E, or better yet, powered 5kV galvanic isolation with SOIC16 ISOW7821.
35 Once the Fast Forth kernel is loaded in the target FRAM memory, you add assembly code or
36 FORTH code, or both, by downloading your source files that the embedded FastForth interprets and
38 Beforehand, the preprocessor GEMA, by means of a \config\gema\target.pat file, will have translated
39 your generic source file.f in a targeted source file.4th. This allows the embedded assembler to use
40 symbolic addresses for all peripheral registers without having to declare them with FORTH words.
41 A set of .bat files in \MSP430-FORTH folder is furnished to do all this automatically.
43 If you want to change the terminal baudrate on the fly (230400 bds up to 6 Mbds),
44 download to your launchpad the file \MSP430-FORTH\CHNGBAUD.f.
46 To see all compilation options, download \MSP430-FORTH\FF_SPECS.f.
48 The download/interpret/compile/execute of a source_file is done
49 at a throughput of 40/80/120 kbytes/s with a 8/16/24 MHz clock and at maximum allowed baudrate.
50 Considering a ratio 5/1, that of the compiled code is 8/16/24 kbytes/s.
52 After downloading of complementary words in \MSP430-FORTH\ANS_COMP.f, FastForth executes CORETEST.4th
53 without errors which ensures its compatibility with the FORTH CORE ANS94 standard.
55 Notice that FAST FORTH interprets lines up to 84 chars, only SPACE as delimiter, only CR+LF as
56 End Of Line, and BACKSPACE.
57 And that the high limit of FORTH program memory is $FF80.
59 Finally, using the SCITE editor as IDE, all is ready to do everything from its "tools" menu.
60 Once the Forth kernel is programmed, say goodbye to owner's any DLL and FET dongle...
67 -584 bytes, Kernel+CondComp+Assembler is under 5.5 kb.
69 the FORTH kernel is drastically reduced to 82 words, just what the operating system needs.
70 All others are moved in the \ADDON\ANS_COMPLEMENT.asm file, the conditionnal compilation
71 allowing you to use them on request.
73 Taking into account the new TI launchpad LP_MSP430FR2476.
75 Fixed: :NONAME (now aligned), LOAD" (no more crash on error).
76 Modified: ACCEPT, WORD, HEADER, CODE, ENDCODE, ASM, GOTO, ?GOTO, RPT.
77 Removed JMP <word> and ?JMP <word> from assembler (replaced by GOTO BWx and ?GOTO BWx).
79 ACCEPT is modified to include the RXON call in the word SLEEP.
80 By rewriting the defered word SLEEP, we can easily disable the TERMINAL_INPUT interrupt.
81 See BACKGROUND, START and STOP in \MSP430-FORTH\RC5toLCD.f.
88 The prompt "ok" becomes a compilation option.
90 Taking into account the digit separator '_' in ?NUMBER, to better see when typing binary words.
91 example: %1010100011000111 can be typed as well: %1010_1000_1100_0111
95 Modified GetFreeHandle CloseHandle
97 Tested with BLE 5.0 terminal (a couple of BGX13P EVK) at 16MHz, 921600 bds + terminal 5 wires:
98 download throughput = 5 kbytes/s (and with errors when ECHO is ON), disappointing...
99 (Bluetooth 2.1 terminal with one RN42 works well).
101 RePeaTed instructions RRUX,RRCX,RLAX,ADDX,SUBX work fine! See TESTASMX.4TH
108 added experimental extended_assembler (MSP430FR5969,MSP430FR5994,MSP430FR6989)
113 Simplified directory structure of project.
114 Added switch DOUBLE_INPUT as kernel compilation ADDON, removed switch LOWERCASE.
115 Added \MSP430-FORTH\CORDIC.f for aficionados.
116 Added FF_SPECS.4th to show all specificities of FastForth compilation.
117 Corrected LITERAL (double LITERAL part).
118 Modified ACCEPT COLD WARM ?ABORT, S", QNUMBER.
123 Unlocking I/O's is transfered from RESET to WARM.
124 Thus, by redirecting WARM, you can add I/O's configuration of your application before unlock them.
126 two options to do this:
129 your START routine is inserted in WARM and continues with the default WARM.
130 Search "START" in the \MSP430_FORTH\IR_RC5.f file as application example.
133 START routine replaces WARM and continues with ABORT (without WARM message).
134 In this case, you can also change the Reset events handling but you will need to unlock I/O's
135 and configure TERMINAL I/O's in your START routine.
136 Search "activate I/O" in \MSP430_FORTH\RC5toLCD.f file to see how to do.
138 Bugs corrected in target.asm, target.pat and device.inc files.
142 The terminal baudrate can be changed on the fly. Download MSP430-FORTH\CHNGBAUD.f to test.
146 Bugs corrected: ALSO and :NONAME (option).
148 The structure of primary DEFERred words as KEY,EMIT,CR,WARM... is modified,
150 the address of their default execute part, without name, can be found with:
153 example, after this entry: ' DROP IS KEY
154 KEY (or ' KEY EXECUTE) runs DROP i.e. runs the redirection made by IS,
155 ' KEY >BODY EXECUTE runs KEY, the default action at the BODY address.
157 and: ' KEY >BODY IS KEY
158 restore the default action of this primary DEFERred word.
161 WARNING! you cannot do that with words created by DEFER !
162 DEFER creates only secondary DEFERred words, without BODY !
165 to build a primary DEFERred FORTH word,
167 you must create a DEFERred word followed by a
168 :NONAME definition, ended by ; IS <name>
172 :NONAME \ does nothing (for the example)
177 The advantage of creating primary DEFERred words is to set their
178 default state, enabling to reinitialize them easily.
180 forthMSP430FR_ASM.asm:
182 All assembly code is revamped.
184 POPM and PUSHM instructions now follow the TI syntax :-(
186 Added CODENNM as assembly counterpart of :NONAME (option)
188 to build the primary DEFERred assembly word "machin" :
194 NOP2 \ assembly instruction
195 NOP3 \ assembly instruction
196 MOV @IP+,PC \ mandatory before ENDCODE
199 you can obviously mix LOW/HIGH levels in CODENNM and :NONAME areas...
203 Added MSP-EXP430FR2355 launchpad
204 Added word :NONAME (option).
205 FastForth terminal via Bluetooth v2.1 + EDR (Microchip RN42) works fine in full duplex mode,
206 up to 460800bds, 4 WIRES (GND,RX,TX,RTS); but with, as wireless effect, a bad troughput of 6kb/s
207 instead of 30kb/s with a bridge UART2USB.
208 Added 4Mbds,5Mbds terminal @16MHZ, for use with UART2USB PL2303HXD.
209 Words AND, OR, XOR are moved as complement in ANS_COMP.f file.
210 Simplified preprocessor files in \config\gema\ folder: only two for one target:
211 one for the device, other for the target (launchpad or user application/module).
212 and similarly with the assembly files: Device.inc and Target.asm, for compiling FastForth.
213 Corrected startup time in target.asm files.
214 Modified Clock config in MSP_EXP430FR2433.asm and MSP_EXP430FR4133.ASM, allowing clock modulation.
218 added the line number in case of error occurring when download a source file (*f,*.4th)
219 in HALFDUPLEX mode (scite command CTRL+2) or in default NOECHO mode (scite cmd CTRL+0).
220 However, in case of download a file.f (with preprocessing), this line number refers
221 to the contents of the file named LAST.4th.
225 modified OPEN file primitive in forthMSP430FR_SD_LOAD.asm; modified forthMSP430FR_SD_INIT.asm
226 reordered files preprocessor in only one folder.
228 You can now compile FastForth from Linux, see FastForth.pdf
229 ...But desperately searching for the linux equivalent of TERATERM !
231 FastForth V2.0, major version.
233 Word TIB is deprecated and replaced by CIB (Current Input Buffer)
234 Word CR generates CR+LF instead of CR. TYPE is rewritten in assembly.
236 Added fixed point s15q16 numbers. Thus FAST FORTH recognises :
237 unsigned/signed numbers u/n (u <= 65535) / (-32768 <= n <= 32767),
238 unsigned/signed double numbers ud/d by adding a decimal point
239 (ud <= .4294967295) / (-.2147483648 <= d <= .2147483647),
240 and s15q16 signed numbers by adding a comma (-32768,00000 <= s15q16 <= 32767,00000).
242 Fixed issue about the word LOAD": when called from a word, returns well into this calling word.
243 Note that with MSP430FR57xx family, SDIB uses PAD, due to lack of RAM.
245 With the BOOTLOADER option, QUIT becomes a DEFERed word to easily enable/disable bootloader:
246 ' BOOT IS QUIT enables bootloader.
247 ' QUIT >BODY IS QUIT disables bootloader.
249 Added QUIETBOOT option to enable BOOT without displaying; use with care...
253 Added a set of words to enable conditional interpretation/compilation : MARKER [DEFINED] [UNDEFINED]
254 [IF] [ELSE] [THEN]. A MARKER word (defined as {word} to well see it) allows you to wipe some program
255 even if loaded in memory below RST_STATE boundary.
257 All interpretation/compilation errors now execute POWER_STATE, so any incorrect definition
258 and all its source file will be automatically erased.
260 Added a bootloader option which loads BOOT.4TH from SD_Card memory.
264 SD_Card driver works also with software multiplier (with MSP430FR4133)
265 added SLEEP word enabling user access to background task,
266 see ACCEPT in forthMSP430FR.asm and see use in RC5toLCD.f
268 You can type double numbers by inserting a decimal point.
269 Example : $-12 is processed as 16 bits negative number.
270 $-.12 or $-1.2 or $-12. are processed as 32 bits negative numbers.
272 FAST FORTH V160, major version.
274 Accept SD_Card from 64 MB (FAT16) up to 64 GB (FAT32).
275 Note that Windows 10 no longer offers the FAT32 format for the highest sizes of SD_CARD memory.
276 So you must use an alternative to do, for example: https://www.partitionwizard.com.
279 in SD_TOOLS the word SECTOR dumps a sector (use a 32 bits number).
280 the word CLUSTER dumps first sector of a cluster.
281 Usage (notice the point): number. CLUSTER or number. SECTOR
285 Added direct file transfer from PC to the target SD_CARD.
286 Measured throughput with "HCI" SD CARD: 90 kbytes/s at 3Mbauds and 16MHz target clock.
287 You can do it from scite editor (menu Tools) or by using specific bat file.
288 Double click on it to see how to do.
290 JTAG and BSL signatures (FF80h-FF88h) are protected against overwrite, typically during
291 source file download.
293 added signed number prefixes $ (hex), % (bin) and # (decimal) to supersede current BASE.
295 Added words ASM and ENDASM to create assembler words that are not interpretable by FORTH
296 i.e. that are called by {CALL|INTERRUPT} and ended by {RET|RETI}. These so created words
297 can be used only in ASSEMBLER context.
299 In the embedded assembler, added 3 backward BW1 BW2 BW3 and 3 forward FW1 FW2 FW3 jump labels
300 to use with GOTO, ?GOTO.
301 These labels are for single use (one jump for one label) but immediately reusable once resolved.
303 you can compile up to 32 threads vocabularies.
306 Fast Forth defines 4 levels of program memory with this words :
307 WIPE (and system failures) that resets program memory, vectors interrupts and any DEFERred words,
308 RST_HERE/RST_STATE that sets/resets the boundary of program protected against <reset> and COLD,
309 PWR_HERE/PWR_STATE that sets/resets the boundary of program protected against power ON/OFF,
310 and nothing, i.e. volatile program.
312 You can download source files with hardware and/or software control flow (i.e. without line
313 or char delays) up to:
320 6000000 bds @ 24MHz with MSP430FR57xx devices
321 See main file DTCforthMSP430FR5xxx.asm for the list of reliable baudrates.
323 FAST FORTH can be adjusted by selection of SWITCHES in the source file to reduce its size according
324 to your convenience. To do, comment/uncomment their line.
326 for your application, select the mode LPM{0,1,2,3,4} that enables wake on FAST FORTH input,
327 depending of family: FR2xxx: LPM0, FR57xx : LPM0 to LPM2, FR59xx : LPM0 to LPM4.
329 DEEP_RST (RESET + WIPE) can be hardware performed via the programmation interface
330 (Vcc,RX,TX,RST,TEST,GND).
333 Many thanks to Brad Rodriguez
334 -----------------------------
336 for his CamelForth which served me as a kind of canvas.
337 And also to Matthias Koch for its ideas about s15.16 implementation.
339 Unlike CamelForth this FORTH is a "Direct Threaded Code", with an embedded assembler following the standard syntax,
340 not the one used in the world Forth.
342 Its core is fully compliant with the standard ANS.
344 This is a FORTH optimized for the speed, especially in the interpreter mode, so that you can load an application program written in FORTH/Assembler faster than its binary via MSP430 Flasher.exe : everything can be done from your text editor, the preprocessor and a serial terminal.
349 I have first programmed atmel tiny devices.
350 Particularly I2C master driver to have both I2C slave and I2C master on a ATtiny461.
351 which means a lot of back and forth between the editor, assembler, the programmer and the test in situ.
353 Previously I had programmed a FORTH on a Motorola 6809 and had been seduced by the possibility of sending a source file directly to the target using a serial terminal. Target which compiled and executed the program. At the time FORTH program lay in a battery backed RAM.
355 The advent of chip MSP430 TEXAS INSTRUMENT with embedded FRAM gave me the idea to do it again : FAST FORTH was born.
357 Today I dropped the ATMEL chips and proprietary interfaces, I program my applications in a mix 80%/20% of assembler/FORTH I then sent on MSP430FR5738 chips with embedded FAST FORTH.
359 And that's the magic: After I finished editing (or modify) the source file, I press the "send" button in my text editor and I can test result on target in the second following. This is the whole point of an IDE reduced to its simplest form: a text editor, a cable, a target.
368 Organize your gitlab copy of FastForth
380 Build the program file
381 ----------------------
383 \forthMSP430FR.asm is the main file to compile FastForth:
385 Open forthMSP430FR.asm with scite editor
387 uncomment the target as you want, i.e. MSP_EXP430FR5969
389 choose frequency, baudrate, UART handshake.
391 uncomment options switches as your convenience.
395 assemble (CTRL+0). A window asks you for 4 parameters:
397 set target as first param, i.e. MSP_EXP430FR5969
399 then execute. the output will be \binaries\MSP_EXP430FR5969.txt
403 Load Txt file (TI format) to target
404 -----------------------------------
406 in \binaries folder, drag your target.txt file and drop it on prog.bat
408 or use scite internal command TOOLS: FET prog (CTRL+1).
410 nota : programming the device use SBW2 interface, so UARTn is free for serial terminal connexion.
412 If you want to program your own MSP430FRxxxx board, wire its pins TST, RST, 3V3 and GND
413 to same pins of the launchpad, on eZ-FET side of the programming connector.
417 Connect the FAST FORTH target to a serial terminal
418 -------------------------------------------------
420 you will need an USBtoUART cable with a PL2303TA or PL2303HXD device that allows both XON/XOFF
421 and hardware control flow :
423 http://www.google.com/search?q=PL2303TA
424 http://www.google.com/search?q=PL2303HXD
426 or USBtoUART bridge, with a CP2102 device and 3.3V/5V that allows XON/XOFF control flow :
428 search google: cp2102 module 3.3V
429 http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx
431 you must program CP2102 device to access 1382400 and 1843200 bds rates :
432 http://www.silabs.com/Support%20Documents/Software/install_USBXpress_SDK.exe
433 http://www.silabs.com/Support%20Documents/TechnicalDocs/an169.pdf
435 or a USBtoUART bridge, with a FT232RL device and 3.3V/5V for only hardware control flow:
437 WARNING! buy a FT232RL module with a switch 5V/3V3 and select 3V3.
439 http://www.google.com/search?q=FT232RL+module+3.3V
440 http://www.ftdichip.com
442 or compatible 921600bds wireless module: RN42 (bluesmirf), RN4878...
444 How to configure the connection ?
445 -------------------------------
447 1- XON/XOFF control flow: Launchpad UARTn <--> USBtoUART bridge <--> TERATERM
449 launchpad <--> UART2USB
453 WARNING! DON'T CONNECT 5V RED WIRE!
455 TeraTerm configuration : see forthMSP430fr.asm
457 If you plan to supply your target vith a PL2303 cable, open its box to weld red wire onto 3.3V pad.
459 2- hardware control flow: Launchpad UARTn <--> USBtoUART bridge <--> TERATERM
461 Launchpad <--> UART2USB
464 RTS ---> CTS 4th wire
466 WARNING! DON'T CONNECT 5V !
468 TeraTerm configuration : see forthMSP430fr.asm
471 3- Bluetooth module: Launchpad UARTn <--> RN42 <-wireless_BL2.1-> TERATERM
472 Launchpad UARTn <--> BGX13P EVK <-wireless_BLE5.0-> BGX13P EVK <--> USB <--> TERATERM
474 launchpad <--> wireless module
477 RTS ---> CTS 4th wire
479 (CTS <--- RTS) 5th wire if necessary
482 TeraTerm configuration : see forthMSP430fr.asm
485 Send a source file.f or file.4th to the FAST FORH target
488 Three bat files are done in \MSP430-FORTH that enable you to do all you want.
489 drag and drop your source file on to.
490 you can also open any source file with scite editor, and do all you want via its Tools menu.
492 If you have any downloading error, first verify in "LAST.4th" that all lines are
493 correctly ended with CR+LF.
496 SD_Card Load, Read, Write and Delete
497 =============================================
502 If you have MSP-EXP430FR5994, nothing to do.
504 For the choice of a SD card socket be carefull, pin CD (Card Detect) must be present!
505 google search: "micro SD card 9 pin"
506 Look for the good wiring in /Launchpad.asm file
508 Compile with SD_Card addon
511 in forthMSP430FR.asm, uncomment lines SD_CARD_LOADER, SD_CARD_READ_WRITE, SD_TOOLS
512 then compile for your target
520 With the LOAD" pathame" command you load your source files from a SD_CARD memory in both execute
521 and compile modes. Idem for READ", WRITE" and DEL" commands.
523 See "SD_TESTS.f", a FORTH program done for example
525 If you remove the SD memory card reader and then reset, all SD\_IO pins are available except SD_CD obviously.
527 HowTo LOAD a sourcefile
530 LOAD" path\filename.4th".
532 The file is interpreted by FORTH in same manner than from the serial terminal.
534 When EOF is reached, the file is automatically closed.
536 A source file can _LOAD"_ an other source file, and so on in the limit of available handles (up to 8).
541 READ" path\filename.ext".
543 The first sector of this file is loaded in BUFFER.
544 To read next sectors, use the command READ that loads the next sector in the buffer,
545 and leaves on the stack a flag that is true when the EOF is reached.
546 The file is automatically closed. See tstwords.4th for basic usage.
548 The variable BufferLen keep the count of bytes to be read (0 to 512).
550 If you want to anticipate the end, use the CLOSE command.
555 WRITE" path\filename.ext".
557 If the file does not exist, create it, else open it and set the write pointer at the end of the file,
558 ready to append chars.
560 See example of use in \MSP430-FORTH\SD_TEST.f.
562 To overwrite an existing file: DEL" file" then WRITE" file".
564 Use CLOSE to close the file.
569 DEL" path\filename.ext". If the file is not found, do nothing, no error.
571 HowTo change DIRectory
574 LOAD" \misc". \misc becomes the current folder.
575 LOAD" ..\" parent folder becomes the current folder.
576 LOAD" \" Root becomes the current folder.
578 Drive letters are always ignored.
580 Downloading source file to SD_Card
581 ------------------------------------------
583 to download a source file (.f or.4th) onto SD_CARD target, use CopySourceFileToTarget\_SD\_Card.bat.
584 Double click on one of this bat files to see how to do.
588 If you have any downloading error, first verify in "LAST.4th" that all lines are
589 correctly ended with CR+LF.
594 The I2C\_Soft\_Master driver with normal/fast mode allows you to add then use any couple of pins to drive a bus I2C :
596 - without use of eUSCI UCBx
597 - I2C\_Soft\_MultiMaster driver : same plus detection collision
598 - plus I2C\_Slave driver that uses the eUSCI UCBx hardware
601 Other interesting specificities :
604 Management of vocabularies (not ANSI):
605 VOCABULARY, DEFINITIONS, ONLY, ALSO, PREVIOUS, CONTEXT, CURRENT, FORTH, ASSEMBLER.
606 In fact, it's the the assembler that requires the vocabularies management.
608 Recognizing prefixed numbers %101011 (bin), $00FE (hex) and #220 (decimal).
612 The words DEFER and IS are implemented. CR, EMIT, KEY, ACCEPT, QUIT and WARM are deferred words.
614 Error messages are colored (reverse video on ANSI terminal).
616 Assembly jumps are as FORTH one's : IF, ELSE, THEN, BEGIN, AGAIN, UNTIL, WHILE.
617 Not canonical jumps are also available with JMP|?JMP to a predefined word, and GOTO|?GOTO to
618 backward labels BW1 BW2 BW3 or forward labels FW1 FW2 FW3.
619 These labels are for one use.
620 Switch within definitions between FORTH and Assembly contexts with words HI2LO and LO2HI.
621 See examples in the TstWords.f file. This is perhaps the most interesting feature for development...
624 The system is not responding ?
627 First, swich off then switch on. FORTH restarts as it was after the last PWR\_HERE command.
629 If the system is not restarted, press <reset> button on the MSP-EXP430FR5xxx ; FORTH restarts
630 as it was after the last RST_HERE command.
632 If the system does not restart again, wire the TERMINAL TX pin to GND via 4k7 resistor then <reset> ;
633 FORTH restarts as it is in the HEX file.
634 Equivalent word : COLD + WIPE.
636 Here is the FastForth init architecture :
638 case 0 : when you type WARM, FORTH interpreter is restarted, no program lost.
639 the WARM display is preceded by "#0".
641 case 1 : Power ON ==> performs reset and the program beyond PWR_HERE is lost.
642 the WARM display is preceded by the SYSRSTIV value "#2".
644 case 1.1 : when you type PWR_STATE ==> the program beyond PWR_HERE is lost.
646 case 1.2 : If an error message (reverse video) occurs, PWR_STATE is automatically executed
647 and the program beyond PWR_HERE is lost. In this way, any compilation error is
648 followed by the complete erasure of the uncompleted word, or by that of
649 the downloading source file causing this error. So, it is recommended to finish
650 a source file with at least PWR_HERE to protect it against any subsequent error.
652 case 2 : <reset> ==> performs reset and the program beyond RST_HERE is lost.
653 the WARM display is preceded by the SYSRSTIV value "#4".
655 case 2.1 : when you type COLD (software reset) ==> same effects.
656 the WARM display is preceded by the SYSRSTIV value "#6".
658 case 2.2 : when you type RST_STATE ==> the program beyond RST_HERE is lost.
661 case 3 : when you type WIPE ==> all programs donwloaded from the terminal or the SD_Card are lost.
664 case 4 : TERM_TX wired to GND via 4k7 during <reset> = DEEP_RST ===> performs reset, and all programs
665 donwloaded from the terminal or the SD_Card are lost. The WARM display is preceded by "-4".
667 case 4.1 : software reset on failure (SYSRSTIV = 0Ah | SYSRSTIV >= 16h) ===> same effects
668 The WARM display is preceded by the SYSRSTIV value.
670 case 4.2 : writing -1 in SAVE_SYSRSTIV before COLD = software DEEP_RST ===> same effects
671 The WARM display is preceded by "-1".
673 case 5 : after FAST FORTH core compilation, the WARM displays SAVE_SYSRSTIV = 5. User may use this
674 information before WARM occurs.
677 If SD\_CARD extention and SD\_CARD memory with \BOOT.4TH included, the cases 1 to 4 starts it
678 after displaying of WARM message.
684 These words are not ANS94 compliant, they are those of F83 standard.
686 For example, after loading SD_TOOLS add-on, you can type: ALSO ASSEMBLER WORDS PREVIOUS WORDS
688 With ALSO ASSEMBLER, the vocabulary ASSEMBLER is added to the search CONTEXT thus the ASSEMBLER words
691 WORDS display the words of ASSEMBLER then those of FORTH,
693 PREVIOUS remove the vocabulary ASSEMBLER form the CONTEXT, and the ASSEMBLER words become hidden,
695 so the last WORDS display only FORTH words.
697 In the forthMSP430FR_ASM.asm, see the FORTH word CODE that add ASSEMBLER to the search CONTEXT and the ASSEMBLER word ENDCODE
698 that remove ASSEMBLER from search CONTEXT. Thus, the assembler words can be used only between CODE and ENDCODE.
700 The CONTEXT can grow up to 6 vocabularies by using the word ALSO.
702 If you want add words to the assembler you must type: ALSO ASSEMBLER DEFINITIONS,
703 The vocabulary ASSEMBLER is added to the search CONTEXT as previously but also becomes the CURRENT vocabulary in which the new words will be stored.
705 Finally, FORTH ONLY DEFINITIONS limits the search CONTEXT to FORTH and the CURRENT vocabulary is FORTH.
711 With the preprocessor GEMA the embedded assembler allows access to all system variables.
712 See files \\inc\\Target.pat.
713 You can also access to VARIABLE, CONSTANT or DOES type words. See \\MSP430-FORTH\\TESTASM.4th.
717 HOW TO MIX assembly and FORTH ?
720 FAST FORTH knows two kinds of words :
722 low level assembly words starting with CODE <name> and ended with ENDCODE.
724 high level FORTH words beginning with : <name> and ended with ;
729 CODE ADD \ Assembly word "ADD", alias of word +
735 : NOOP \ FORTH word "NOOP", do nothing
742 To end a low level assembly word, the instruction MOV @IP+,PC jumps to the next FORTH word.
743 This faster (4 cycles) and shorter (one word) instruction replaces the famous pair of assembly
744 instructions : CALL #LABEL ... RET (4+4 cycles, 2+1 words). The register IP is the Interpretative Pointer.
746 High level FORTH word starts with a boot code DOCOL that save the IP pointer, load it with the first address
747 of a list of execution addresses, then performs a postincrement branch to this first address.
748 The list ends with the address of another piece of code EXIT (6 cycles) that restores IP before the instruction MOV @IP+,PC.
751 here, the compilation of low level word ADD :
753 header \ compiled by the word CODE
754 execution addr ADD @PSP+,TOS
755 MOV @IP+,PC \ instruction called NEXT
757 and the one of the high level word NOOP :
759 header \ compiled by the word :
760 execution addr CALL rDOCOL \ boot code compiled by the word :
761 addr of DUP \ execution addr of DUP
762 addr of DROP \ execution addr of DROP
763 addr of EXIT \ execution addr of EXIT compiled by the word ;
766 _A high level FORTH word is a list of execution addresses preceded by a boot code and ending with EXIT address._
772 any low level FORTH words must be ended with the instruction MOV @IP+,PC (NEXT).
774 CODE TEST \ CODE starts a low level word
775 asm1 \ assembly instruction 1
776 asm2 \ assembly instruction 2
778 ENDCODE \ end of low level word
781 If you want to use the IP register, save it before and restore it before NEXT
783 CODE TEST1 \ CODE starts a low level word
784 asm1 \ assembly instructions
786 PUSH IP \ save IP before use
787 MOV #1,IP \ assembly instruction that uses IP
788 ... \ assembly instructions
789 MOV @RSP+,IP \ restore IP
791 ENDCODE \ end of low level word
794 A little more complex, the case of mixing FORTH and assembly that is enabled by the words HI2LO, LO2HI and COLON
796 : MIX_FORTH_ASM \ definition of a FORTH word starts with :
799 HI2LO \ FORTH to assembler switch
800 asm1 \ assembly instruction
801 asm2 \ assembly instruction
802 ... \ you can freely use IP !
803 ... \ assembly instructions
804 MOV @RSP+,IP \ restore IP
806 ENDCODE \ end of low level word
808 If we see the code "MIX\_FORTH\_ASM" after compilation :
810 header \ compiled by :
811 exec@ CALL rDOCOL \ boot code compiled by the word :
812 addr \ execution addr of SWAP
813 addr \ execution addr of DUP
814 next addr \ addr of asm1, compiled by HI2LO
815 asm1 \ assembly instruction
816 asm2 \ assembly instruction
817 ... \ you can freely use IP !
818 ... \ assembly instructions
819 MOV @RSP+,IP \ restore IP saved by boot code
823 going a step further :
825 CODE MIX_ASM_FORTH \ CODE starts a low level word
826 asm1 \ assembly instruction 1
827 asm2 \ assembly instruction 2
828 COLON \ starts high level
831 ; \ end of high level word
834 If we see this code "MIX\_ASM\_FORTH" after compilation :
836 header \ compiled by CODE
837 exec@ asm1 \ assembly instruction 1
838 asm2 \ assembly instruction 2
839 CALL rDOCOL \ compiled by COLON
842 addr of EXIT \ the word ; compiles address of EXIT that restores IP then executes MOV @IP+,PC
847 : MIX_FORTH_ASM_FORTH \ definition of a FORTH word starts with :
851 HI2LO \ FORTH to assembler switch
852 MOV #0,IP \ IP is free for use
855 LO2HI \ assembler to FORTH switch
858 ; \ end of high level word
862 header \ compiled by :
863 exec@ CALL rDOCOL \ boot code compiled by the word :
867 next addr \ compiled by HI2LO
868 MOV #0,IP \ IP is free for use
869 asm1 \ assembly instruction
871 CALL #EXIT \ compiled by LO2HI (10 cycles switch)
878 the first time, by LO2HI :
880 EXIT MOV @RSP+,IP \ 2 pop into IP the PC pushed on return stack by CALL #EXIT
881 MOV @IP+,PC \ 4 execute the routine at addr3
883 then at the end of FORTH word (addr5):
885 EXIT MOV @RSP+,IP \ 2 pop old IP from return stack
886 MOV @IP+,PC \ 4 execute the routine pointed by the old IP
891 CODE MIX_ASM_FORTH_ASM \ CODE starts a low level word
892 asm1 \ assembly instruction
893 asm2 \ assembly instruction
894 COLON \ starts high level
897 HI2LO \ FORTH to assembler switch
898 asm3 \ assembly instruction
899 asm4 \ assembly instruction
900 MOV @RSP+,IP \ restore IP
902 ENDCODE \ end of low level word
904 In fact, an exclusive of FAST FORTH, the start of a word FORTH can be placed anywhere :
906 CODE MIX_ASM_FORTH_ASM_FORTH
910 COLON \ starts high level
914 HI2LO \ FORTH to assembler switch
918 LO2HI \ assembler to FORTH switch
922 ; \ end of high level word
924 with the compiled result :
926 header \ compiled by CODE
929 CALL rDOCOL \ compiled by COLON
932 next address \ compiled by HI2LO
935 CALL #EXIT \ compiled by LO2HI
938 EXIT addr \ that restores IP from return stack and then executes MOV @IP+,PC
940 As we see, IP is saved only once, it's logical.
943 ASSEMBLER WITHOUT LABELS ? YES !
946 To compare AS macro assembler and FastForth embedded assembler,
947 compare files \ADDON\FIXPOINT.asm and \MSP430-FORTH\FIXPOINT.f
949 The syntax of FastForth assembler borrows FORTH's one :
952 CMP #1,R8 \ set Z,N,V, flags
953 0= IF \ irritating, the "IF 0=" upside down, isn't it?
954 ADD R8,R9 \ true part of comparaison
958 MOV @IP+,PC \ don't forget...
959 ENDCODE \ don't forget...
961 and the complete version :
963 CODE TEST_IF_ELSE_THEN
964 CMP #1,R8 \ set Z,N,V, flags
966 ADD R8,R9 \ true part of comparaison
968 SUB R8,R9 \ false part of comparaison
970 ... \ following for the two branches
971 MOV @IP+,PC \ don't forget...
972 ENDCODE \ don't forget...
974 test for loop back version BEGIN ... UNTIL
977 CODE TEST_BEGIN_UNTIL
980 SUB #1,R10 \ set Z,N,V flags
981 0= UNTIL \ loop back to BEGIN if flag Z is not set
986 test for out of loop version BEGIN ... WHILE ... REPEAT
988 CODE TEST_BEGIN_WHILE_REPEAT
991 SUB #1,R10 \ set Z,N,V flags
992 0<> WHILE \ go to out of loop if X=0 (Z flag =1)
994 REPEAT \ unconditionnal loop back to BEGIN
995 ... \ out of loop here
1001 CODE TEST_BEGIN_AGAIN
1004 AGAIN \ unconditionnal loop back to BEGIN
1007 to quit this infinite loop, press reset.
1010 We can nest several conditional branches :
1012 CODE TEST_NESTED_IF_ELSE
1029 CODE TEST_NESTED_BEGIN_AGAIN_IF
1034 MOV @IP+,PC \ out of test_NESTED_BEGIN_AGAIN_IF
1041 you can also MIX conditional branches with a mix of FORTH/assembly :
1043 see TEST5 in the demo file \MSP430-FORTH\TESTASM.4TH
1049 unconditionnal backward jump :
1051 CODE UNCOND_BACKWARD
1054 JMP TEST_NESTED_BEGIN_AGAIN_IF \ jump backward to a predefined word
1057 conditionnal backward jump :
1062 S< ?JMP TEST_NESTED_BEGIN_AGAIN_IF \ jump backward if negative
1068 But FAST FORTH have one pass assembler, not able to make forward jump.
1070 I have added possibility of several "non canonical" jumps, up to 3 backward and up to 3 forward imbricated jumps to label :
1072 \ C UM/MOD udlo|udhi u1 -- ur uq
1074 MOV @PSP+,W \ 2 W = DIVIDENDhi
1075 MOV @PSP,S \ 2 S = DIVIDENDlo
1076 \ T.I. ROUTINE Section 5.1.5 of MSP430 Family Application Reports
1077 MOV #0,Y \ 1 CLEAR RESULT
1078 MOV #16,X \ 2 INITIALIZE LOOP COUNTER
1080 U< ?GOTO FW1 \ 2 if not carry
1081 SUB TOS,W \ 1 if carry DIVIDENDhi-divisor
1082 FW1 \ FW1 label is resolved therefore reusable
1083 BW2 ADDC Y,Y \ 1 RLC quotient
1084 U>= ?GOTO FW1 \ 2 if carry Error: result > 16 bits
1085 SUB #1,X \ 1 Decrement loop counter
1086 <0 ?GOTO FW2 \ 2 if 0< terminate w/o error
1087 ADD S,S \ 1 RLA DIVIDENDlo
1088 ADDC W,W \ 1 RLC DIVIDENDhi
1089 U< ?GOTO BW1 \ 2 if not carry 14~ loop
1090 SUB TOS,W \ 1 if carry DIVIDENDhi-divisor
1092 GOTO BW2 \ 2 14~ loop
1093 FW2 BIC #1,SR \ 1 CLRC No error, C = 0
1094 FW1 \ Error indication in C
1095 \ END of T.I. ROUTINE Section 5.1.5 of MSP430 Family Application Reports
1096 MOV W,0(PSP) \ 3 remainder on stack
1097 MOV Y,TOS \ 1 quotient in TOS
1101 Forward labels FWx are for single use, Backward labels BWx can solve several jumps.
1105 SYMBOLIC ASSEMBLER ? YES !
1108 I have discovered a little semantic preprocessor "GEMA", just like that FAST FORTH have its symbolic assembler !
1110 \inc\DEVICE.pat contains memory map and vectors for a specified DEVICE
1111 \inc\LAUNCHPAD.pat is the I/O config file for specific LAUNCHPAD (or application)
1113 gema translates also FORTH registers in ASM registers (R0 to R15)
1115 With the three bat files in \MSP430_FORTH folder all is done automatically.
1118 COMPILE FAST FORTH FOR YOUR MODULE
1121 1- in forthMSP430FR.asm "TARGET configuration" create a line for your target, example:
1123 ;MY_MSP430FR5738_1 ; compile for my own MSP430FR5738 miniboard V1
1125 2- create your \inc\MSP430FR5738_1.asm and \inc\MSP430FR5738.inc from another target.asm and device.inc as pattern,
1126 Notice that you must define here only the necessary for FAST-FORTH compilation.
1128 3- in \inc\ThingsInFirst.inc add one "device.inc" item:
1130 .IFDEF MY_MSP430FR5738_1
1131 UCA0_UART ; defines uart used by FORTH input terminal
1132 LF_XTAL ; defines if your module have a 32768 Hz xtal, to enable it.
1133 UCB0_SD ; defines UC used for SD Card driver if used
1134 .include "MSP430FR5738.inc" ; include device declarations
1137 4- in \inc\TargetInit.asm add one "target.asm" item:
1139 .IFDEF MY_MSP430FR5738_1
1140 .include MY_MSP430FR5738_1.asm
1144 Then, for the preprocessor which you will use when downloading source files:
1146 1- create your \inc\device.pat file if not exist, from your \inc\device.inc and another \inc\device.pat as pattern.
1148 2- create your \inc\target.pat file from your \inc\target.asm and another \inc\target.pat as pattern.
1150 Best practice, I suggest you that all digital pins you define (input or output) in your projects have their idle state high, with external pull up resistor
1151 that is the reset state of FastForth...
1156 How to start your project ?
1158 I show you, assuming you are working from the scite editor with its enhanced tools menu.
1160 First you create two files : project.f and test.f
1164 ; ----------------------------------------------------
1165 ; MSP430FR5969 MSP_EXP430FR5969 8MHZ 921600bds PROJECT.f
1166 ; ----------------------------------------------------
1168 [DEFINED] {PROJECT} [IF] {PROJECT} [THEN] \ remove {PROJECT} if exist (memory managment)
1173 here you append your already tested routines :
1175 CODE FIRST \ assembler CODE words are FORTH executable
1180 ASM TWO \ assembler ASM words are not FORTH executable and can only be used in assembler mode
1181 ... \ used to define interrupt routines, or subroutines called by CALL...
1182 RET \ and ended by RET or RETI.
1187 CALL #TWO \ CALL only ASM words
1192 ASM WDT_INT \ interrupt routine
1195 BIC #WDTIFG,&SFRIFG1 \ reset WDT_INT flag
1196 BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in saved SR
1202 then finish with this 2 "magic" words plus one optional : START, STOP and optional BACKGROUND
1204 ASM BACKGROUND \ (optional)
1206 ... \ insert here your background task
1217 CODE START \ to init your app
1218 ... \ init assembly part
1219 MOV #WDT_INT,&VEC_WDT \ init WDT vector interrupt
1221 BIC #RC5,&P1REN \ init I/O
1224 MOV #SLEEP,X \ redirect default background task
1225 MOV #BACKGROUND,2(X) \ to yours (optional)
1228 ... \ init FORTH part
1230 LIT RECURSE IS WARM \ replace WARM by START
1231 ['] WARM >BODY \ and end START with default WARM
1232 EXECUTE \ that unlock I/O, start FORTH process
1233 ; \ then fall down to sleep state, waiting any interrupt...
1236 CODE STOP \ to properly stop your app
1237 MOV #SLEEP,X \ restore the default background (optional)
1238 ADD #4,X \ (word SLEEP can only be seen in assembler mode, not in FORTH)
1242 IS WARM \ remove START from FORTH init process
1243 ECHO \ to always retrieve FORTH input terminal
1244 COLD \ reset CPU, interrupt vectors and restart FORTH.
1255 Each time you download this project file, the word {PROJECT} removes all subsequent definitions,
1256 and the word RST_HERE protects the PROJECT against RESET.
1258 The word START allows you to include your app init into FORTH's one.
1259 The word STOP unlink your app from FORTH init process.
1261 Look at the file RC5toLCD.f to retrieve this structure.
1267 \ ----------------------------------
1268 \ MSP-EXP430FR5969_8MHZ_TEST.f
1269 \ ----------------------------------
1271 RST_STATE \ memory managment
1273 here you write your routine to test
1282 PWR_HERE \ test.f content is protected against POWER OFF, but volatile with <reset>
1285 Each time you download this TEST file, the word RST\_STATE clears memory content beyond PROJECT.
1290 With the SCITE menu tools : send a file.f, you download first your project.f file, then your test.f file that include the routine to test.
1292 If the test don't work, modify it in the test.f file, then reload it.
1294 When the routine "test" works as you want, you cut it in test.f file and copy it in project.f, then when you reload it, test is done !
1302 The embedded assembler don't recognize the (useless) TI's symbolic addressing mode: ADD.B EDE,TONI.
1304 REGISTERS correspondence (the preprocessor gema.exe allow you to use FASTFORTH or TI registers's names).
1306 embedded ASM TI FASTFORTH comment
1308 R0 PC PC Program Counter
1309 R1 SP RSP Return Stack Pointer
1310 R2 SR/CG1 Status Register/Constant Generator 1
1311 R3 CG2 Constant Generator 2
1312 R4 R4 R (rDODOES) contents address of xdodoes
1313 R5 R5 Q (rDOCON) contents address of xdocon
1314 R6 R6 P (rDOVAR) contents address of RFROM
1315 R7 R7 M (rDOCOL) contents address of xDOCOL (DTC=1|2)
1316 R8 R8 Y scratch register
1317 R9 R9 X scratch register
1318 R10 R10 W scratch register
1319 R11 R11 T scratch register
1320 R12 R12 S scratch register
1321 R13 R13 IP Interpretation Pointer
1322 R14 R14 TOS Top Of parameters Stack
1323 R15 R15 PSP Parameters Stack Pointer
1327 The FASTFORTH registers rDOCOL, rDOVAR, rDOCON and rDODOES must be preserved.
1328 If you use them you can either PUSHM #4,M before and POPM #4,M after,
1329 or by restoring after use their FastForth default values:
1330 xdocol, xdovar, xdocon, xdodoes. See device.pat.
1332 But if you use this registers you must not at the same time use any FORTH words
1335 don't use R3 and use R2 only with BIC, BIT, BIS instructions in register mode.
1338 PARAMETERS STACK use
1340 The register TOS (Top Of Stack) is the first cell of the Parameters stack.
1341 The register PSP (Parameters Stack Pointer) points the second cell.
1343 to push one cell on the PSP stack :
1345 SUB #2,PSP \ insert a empty 2th cell
1346 MOV TOS,0(PSP) \ fill this 2th cell with first cell
1347 MOV <what you want>,TOS \ MOV or MOV.B <what you want>,TOS ; i.e. update first cell
1349 to pop one cell from the PSP stack :
1351 MOV @PSP+,TOS \ first cell TOS is lost and replaced by the 2th.
1353 don't never pop a byte with instruction MOV.B @PSP+, because generates a stack misalignement...
1357 register RSP is the Return Stack Pointer (SP).
1359 to push one cell on the RSP stack :
1361 PUSH <what you want> \
1363 to pop one cell from the RSP stack :
1365 MOV @RSP+,<where you want> \
1367 don't never pop a byte with instruction MOV.B @RSP+, ...
1370 to push multiple registers on the RSP stack :
1372 PUSHM #n,Rx \ with 0 <= x-(n-1) < 16
1374 to pop multiple registers from the RSP stack :
1376 POPM #n,Rx \ with 0 <= x-(n-1) < 16
1378 PUSHM order : PSP,TOS, IP, S, T, W, X, Y, rEXIT,rDOVAR,rDOCON, rDODOES, R3, SR,RSP, PC
1379 PUSHM order : R15,R14,R13,R12,R11,R10, R9, R8, R7 , R6 , R5 , R4 , R3, R2, R1, R0
1381 example : PUSHM #6,IP pushes IP,S,T,W,X,Y registers to return stack
1383 POPM order : PC,RSP, SR, R3, rDODOES,rDOCON,rDOVAR, rEXIT, Y, X, W, T, S, IP,TOS,PSP
1384 POPM order : R0, R1, R2, R3, R4 , R5 , R6 , R7 , R8, R9,R10,R11,R12,R13,R14,R15
1386 example : POPM #6,IP pulls Y,X,W,T,S,IP registers from return stack
1388 error occurs if n is out of bounds
1391 CPUx instructions RRCM,RRAM,RLAM,RRUM
1393 example : RRUM #3,Y \ Y (R8) register is Unsigned Right shifted by n=3
1395 error occurs if 1 > n > 4
1398 conditionnal jumps use with symbolic assembler
1400 0= with IF UNTIL WHILE ?JMP ?GOTO
1401 0<> with IF UNTIL WHILE ?JMP ?GOTO
1402 U>= with IF UNTIL WHILE ?JMP ?GOTO
1403 U< with IF UNTIL WHILE ?JMP ?GOTO
1404 S< with IF UNTIL WHILE ?JMP ?GOTO
1405 S>= with IF UNTIL WHILE ?JMP ?GOTO
1406 0>= with IF UNTIL WHILE