1 \ -*- coding: utf-8 -*-
7 \ FastForth kernel options: ASSEMBLER, COND_COMP
8 \ to see kernel options, download FF_SPECS.f
10 \ TARGET SELECTION : copy your target in (shift+F8) parameter 1:
11 \ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989
12 \ MSP_EXP430FR4133 MSP_EXP430FR2433 MSP_EXP430FR2355 CHIPSTICK_FR2433
18 \ https://forth-standard.org/standard/core/EXIT
19 \ EXIT -- exit a colon definition
21 MOV @RSP+,IP \ 2 pop previous IP (or next PC) from return stack
22 MOV @IP+,PC \ 4 = NEXT
26 [UNDEFINED] EXECUTE [IF] \ "
27 \ https://forth-standard.org/standard/core/EXECUTE
28 \ EXECUTE i*x xt -- j*x execute Forth word at 'xt'
30 MOV TOS,W \ 1 put word address into W
31 MOV @PSP+,TOS \ 2 fetch new TOS
32 MOV W,PC \ 3 fetch code address into PC
37 \ https://forth-standard.org/standard/core/SWAP
38 \ SWAP x1 x2 -- x2 x1 swap top two items
48 \ https://forth-standard.org/standard/core/DROP
49 \ DROP x -- drop top of stack
57 \ https://forth-standard.org/standard/core/Fetch
58 \ @ c-addr -- char fetch char from memory
66 \ https://forth-standard.org/standard/core/Store
67 \ ! x a-addr -- store cell in memory
76 \ https://forth-standard.org/standard/core/Plus
77 \ + n1/u1 n2/u2 -- n3/u3
85 \ https://forth-standard.org/standard/core/IF
86 \ IF -- IFadr initialize conditional forward branch
91 ADD #4,&DP \ compile one word, reserve one word
92 MOV #QFBRAN,0(TOS) \ -- HERE compile QFBRAN
93 ADD #2,TOS \ -- HERE+2=IFadr
99 \ https://forth-standard.org/standard/core/DO
100 \ DO -- DOadr L: -- 0
104 ADD #2,&DP \ make room to compile xdo
105 MOV &DP,TOS \ -- HERE+2
106 MOV #XDO,-2(TOS) \ compile xdo
107 ADD #2,&LEAVEPTR \ -- HERE+2 LEAVEPTR+2
109 MOV #0,0(W) \ -- HERE+2 L-- 0
114 [UNDEFINED] LOOP [IF]
115 \ https://forth-standard.org/standard/core/LOOP
116 \ LOOP DOadr -- L-- an an-1 .. a1 0
117 CODE LOOP \ immediate
118 ADD #4,&DP \ make room to compile two words
120 MOV #XLOOP,-4(W) \ xloop --> HERE
121 MOV TOS,-2(W) \ DOadr --> HERE+2
122 BEGIN \ resolve all "leave" adr
123 MOV &LEAVEPTR,TOS \ -- Adr of top LeaveStack cell
124 SUB #2,&LEAVEPTR \ --
125 MOV @TOS,TOS \ -- first LeaveStack value
126 CMP #0,TOS \ -- = value left by DO ?
128 MOV W,0(TOS) \ move adr after loop as UNLOOP adr
135 [UNDEFINED] ESC" [IF]
136 \ ESC" <escape sequence>" -- type an escape sequence
137 : ESC" $1B POSTPONE LITERAL POSTPONE EMIT POSTPONE S" POSTPONE TYPE ; IMMEDIATE \ "
140 \ : OVER= OVER = ; \ replace 'n1 DUP n2 =' by 'n1 n2 OVER='
141 CODE OVER= \ n1 n2 -- n1 flag
146 XOR #-1,TOS \ 1 flag Z = 1
151 \ : OVRSWP< \ n1 n2 -- n1 flag flag = -1 if n1 < n2
153 CODE OVRSWP< \ n1 n2 -- n1 flag flag = -1 if n1 < n2
154 SUB @PSP,TOS \ -- n1 n TOS=n2-n1
155 S>= IF \ if n2-n1 >= 0
156 0<> IF \ if n2-n1 <> 0
157 MOV #-1,TOS \ -- n1 -1 flag Z = 0
161 AND #0,TOS \ -- n1 0 flag Z = 1
165 \ ;THEN \ EXIT condition ended by THEN
166 \ POSTPONE EXIT POSTPONE THEN
168 CODE ;THEN \ IFadr --
171 MOV #EXIT,-2(X) \ compile EXIT
172 MOV X,0(TOS) \ -- IFadr compile current DP at IFadr
178 \ UM/ udlo|udhi u1 -- q unsigned 32/16->q16
180 CALL #MUSMOD \ -- r Qlo Qhi
181 MOV @PSP,TOS \ -- r Qlo Qlo
187 $20 EMIT 1 ABORT" only for 1,4,8,16,24 MHz MCLK!"
191 $20 EMIT ESC" [7m" \ set reverse video
192 FREQ_KHZ @ 0 1000 UM/ ." with MCLK = " .
193 1 ABORT" MHz? don't dream!"
196 \ conditionnal EXIT structure
197 : SELECT_BAUDS \ -- char frequency TERM_BRW TERM_MCTLW
200 48 OVER= \ -- char flag choice 0 = 6MBds ?
202 FREQ_KHZ @ \ -- char flag freq
203 #24000 OVRSWP< \ MCLK < 24MHz ?
204 IF OVR_BAUDS ;THEN \ ==> abort ( ;THEN does nothing but solve paired IF during compilation)
205 #24000 OVER= \ FREQ = 24 MHz ?
206 IF $4 $0 ;THEN \ -- char frequency TERM_BRW TERM_MCTLW
207 BAD_MHz \ ==> abort for other freq
208 ;THEN \ ;THEN does nothing but solve paired IF during compilation
210 49 OVER= \ -- char flag choice 1 = 5MBds ?
213 #16000 OVRSWP< \ MCLK < 16MHz ? ==> abort
219 BAD_MHz \ other freq ==> abort
221 50 OVER= \ -- char flag choice 2 = 4MBds ?
224 #16000 OVRSWP< \ MCLK < 16MHz ? ==> abort
230 BAD_MHz \ other freq ==> abort
232 51 OVER= \ -- char flag choice 3 = 2457600 ?
235 #8000 OVRSWP< \ MCLK < 8MHz ? ==> abort
245 52 OVER= \ -- char flag choice 4 = 921600 ?
248 #4000 OVRSWP< \ MCLK < 4MHz ? ==> abort
260 53 OVER= \ -- char flag choice 5 = 460800 ?
263 #4000 OVRSWP< \ MCLK < 4MHz ? ==> abort
275 54 OVER= \ -- char flag choice 6 = 230400 ?
278 #1000 OVRSWP< \ MCLK < 1MHz ? ==> abort
292 55 OVER= \ -- char flag choice 7 = 115200 ?
307 56 OVER= \ -- char flag choice 8 = 38400 Bds?
322 57 OVER= \ -- char flag choice 9 = 19200 Bds?
337 65 OVER= \ -- char flag choice A = 9600 Bds?
351 ;THEN \ -- char other key
355 \ CREATE ABUF 10 ALLOT
358 \ ESC" [18t" \ TERMINAL reports '[8;y;xt' with y lines, x columns
359 \ ABUF 10 \ -- adr len
362 \ ABUF 3 + 2 \ -- ABUF+3, len=2
368 : CHNGBAUD \ only for 1, 4, 8, 16, 24 MHz
369 PWR_STATE \ to remove this created word (garbage collector)
371 42 0 DO CR LOOP \ don't erase any line of source, create 42 empty lines
372 \ TERM_LINES 0 DO CR LOOP \ don't erase any line of source, create y empty lines
373 ESC" [H" \ then cursor home
375 FREQ_KHZ @ 0 1000 UM/
376 ." target MCLK = " . ." MHz" CR
377 ." choose your baudrate:" CR
380 ." 2 --> 4 MBds" CR \ linux driver max speed
381 ." 3 --> 2457600 Bds" CR
382 ." 4 --> 921600 Bds" CR
383 ." 5 --> 460800 Bds" CR
384 ." 6 --> 230400 Bds" CR
385 ." 7 --> 115200 Bds" CR
386 ." 8 --> 38400 Bds" CR
387 ." 9 --> 19200 Bds" CR
388 ." A --> 9600 Bds" CR
389 ." other --> abort" CR
392 SELECT_BAUDS \ -- char frequency TERM_BRW TERM_MCTLW
394 TERMMCTLW_RST ! \ set UCAxMCTLW value in FRAM
395 TERMBRW_RST ! \ set UCAxBRW value in FRAM
396 DROP DROP \ clear stack
398 CR ESC" [7m" \ escape sequence to set reverse video
399 ." Change baudrate in Teraterm, save its setup, then reset target."