OSDN Git Service

V308
[fast-forth/master.git] / MSP430-FORTH / CHNGBAUD.f
1 \ -*- coding: utf-8 -*-
2 \
3 \ TARGET SELECTION ( = the name of \INC\target.pat file without the extension)
4 \ MSP_EXP430FR5739  MSP_EXP430FR5969    MSP_EXP430FR5994    MSP_EXP430FR6989
5 \ MSP_EXP430FR4133  MSP_EXP430FR2433    CHIPSTICK_FR2433    MSP_EXP430FR2355
6 \ LP_MSP430FR2476
7 \
8 \ from scite editor : copy your target selection in (shift+F8) parameter 1:
9 \
10 \ OR
11 \
12 \ drag and drop this file onto SendSourceFileToTarget.bat
13 \ then select your TARGET when asked.
14 \
15 \ COLD            \ uncomment for this TEST which must not disrupt the downloading process
16
17 CODE I2CTERM_ABORT
18 SUB #4,PSP
19 MOV TOS,2(PSP)
20 MOV &KERNEL_ADDON,TOS
21 BIT #$7800,TOS
22 0<> IF MOV #0,TOS THEN  \ if TOS <> 0 (UART TERMINAL), set TOS = 0
23 MOV TOS,0(PSP)
24 MOV &VERSION,TOS
25 SUB #308,TOS            \ FastForth V3.8
26 COLON
27 $0D EMIT            \ return to column 1 without CR
28 ABORT" FastForth V3.8 please!"
29 ABORT" <-- Ouch! unexpected I2C_FastForth target!"
30 PWR_STATE           \ remove ABORT_UARTI2CS definition before resuming
31 ;
32
33 I2CTERM_ABORT
34
35 ; ------------
36 ; CHNGBAUD.f
37 ; ------------
38
39 [UNDEFINED] DUP [IF]    \ define DUP and DUP?
40 \ https://forth-standard.org/standard/core/DUP
41 \ DUP      x -- x x      duplicate top of stack
42 CODE DUP
43 BW1 SUB #2,PSP      \ 2  push old TOS..
44     MOV TOS,0(PSP)  \ 3  ..onto stack
45     MOV @IP+,PC     \ 4
46 ENDCODE
47
48 \ https://forth-standard.org/standard/core/qDUP
49 \ ?DUP     x -- 0 | x x    DUP if nonzero
50 CODE ?DUP
51 CMP #0,TOS      \ 2  test for TOS nonzero
52 0<> ?GOTO BW1   \ 2
53 MOV @IP+,PC     \ 4
54 ENDCODE
55 [THEN]
56
57 [UNDEFINED] DROP [IF]
58 \ https://forth-standard.org/standard/core/DROP
59 \ DROP     x --          drop top of stack
60 CODE DROP
61 MOV @PSP+,TOS   \ 2
62 MOV @IP+,PC     \ 4
63 ENDCODE
64 [THEN]
65
66 [UNDEFINED] OVER [IF]
67 \ https://forth-standard.org/standard/core/OVER
68 \ OVER    x1 x2 -- x1 x2 x1
69 CODE OVER
70 MOV TOS,-2(PSP)     \ 3 -- x1 (x2) x2
71 MOV @PSP,TOS        \ 2 -- x1 (x2) x1
72 SUB #2,PSP          \ 1 -- x1 x2 x1
73 MOV @IP+,PC
74 ENDCODE
75 [THEN]
76
77 [UNDEFINED] 1+ [IF]
78 \ https://forth-standard.org/standard/core/OnePlus
79 \ 1+      n1/u1 -- n2/u2       add 1 to TOS
80 CODE 1+
81 ADD #1,TOS
82 MOV @IP+,PC
83 ENDCODE
84 [THEN]
85
86 [UNDEFINED] U/ [IF]
87 \ U/   u1 u2 -- q   unsigned 16/16->q16
88 CODE U/
89 SUB #2,PSP
90 MOV #0,0(PSP)   \ -- u1lo u1hi u2
91 CALL #MUSMOD    \ -- r qlo qhi
92 MOV @PSP,TOS    \ -- r qlo qlo
93 ADD #4,PSP      \ -- qlo
94 MOV @IP+,PC
95 ENDCODE
96 [THEN]
97
98 [UNDEFINED] >R [IF]
99 \ https://forth-standard.org/standard/core/toR
100 \ >R    x --   R: -- x   push to return stack
101 CODE >R
102 PUSH TOS
103 MOV @PSP+,TOS
104 MOV @IP+,PC
105 ENDCODE
106 [THEN]
107
108 [UNDEFINED] R> [IF]
109 \ https://forth-standard.org/standard/core/Rfrom
110 \ R>    -- x    R: x --   pop from return stack ; CALL #RFROM performs DOVAR
111 CODE R>
112 SUB #2,PSP      \ 1
113 MOV TOS,0(PSP)  \ 3
114 MOV @RSP+,TOS   \ 2
115 MOV @IP+,PC     \ 4
116 ENDCODE
117 [THEN]
118
119 [UNDEFINED] = [IF]
120 \ https://forth-standard.org/standard/core/Equal
121 \ =      x1 x2 -- flag         test x1=x2
122 CODE =
123 SUB @PSP+,TOS   \ 2
124 0<> IF          \ 2
125     AND #0,TOS  \ 1 flag Z = 1
126 ELSE            \ 2
127     XOR #-1,TOS \ 1
128 THEN
129 MOV @IP+,PC     \ 4
130 ENDCODE
131 [THEN]
132
133 [UNDEFINED] < [IF]  \ define < and >
134 \ https://forth-standard.org/standard/core/less
135 \ <      n1 n2 -- flag        test n1<n2, signed
136 CODE <
137     SUB @PSP+,TOS   \ 1 TOS=n2-n1
138     S< ?GOTO FW1    \ 2 signed
139     0<> IF          \ 2
140 BW1     MOV #-1,TOS \ 1 flag Z = 0
141     THEN
142     MOV @IP+,PC
143 ENDCODE
144
145 \ https://forth-standard.org/standard/core/more
146 \ >     n1 n2 -- flag         test n1>n2, signed
147 CODE >
148     SUB @PSP+,TOS   \ 2 TOS=n2-n1
149     S< ?GOTO BW1    \ 2 --> +5
150 FW1 AND #0,TOS      \ 1 flag Z = 1
151     MOV @IP+,PC
152 ENDCODE
153 [THEN]
154
155 [UNDEFINED] IF [IF]
156 \ https://forth-standard.org/standard/core/IF
157 \ IF       -- IFadr    initialize conditional forward branch
158 CODE IF
159 SUB #2,PSP          \
160 MOV TOS,0(PSP)      \
161 MOV &DP,TOS         \ -- HERE
162 ADD #4,&DP          \           compile one word, reserve one word
163 MOV #QFBRAN,0(TOS)  \ -- HERE   compile QFBRAN
164 ADD #2,TOS          \ -- HERE+2=IFadr
165 MOV @IP+,PC
166 ENDCODE IMMEDIATE
167
168 \ https://forth-standard.org/standard/core/THEN
169 \ THEN     IFadr --                resolve forward branch
170 CODE THEN
171 MOV &DP,0(TOS)          \ -- IFadr
172 MOV @PSP+,TOS           \ --
173 MOV @IP+,PC
174 ENDCODE IMMEDIATE
175 [THEN]
176
177 [UNDEFINED] ELSE [IF]
178 \ https://forth-standard.org/standard/core/ELSE
179 \ ELSE     IFadr -- ELSEadr        resolve forward IF branch, leave ELSEadr on stack
180 CODE ELSE
181 ADD #4,&DP              \ make room to compile two words
182 MOV &DP,W               \ W=HERE+4
183 MOV #BRAN,-4(W)
184 MOV W,0(TOS)            \ HERE+4 ==> [IFadr]
185 SUB #2,W                \ HERE+2
186 MOV W,TOS               \ -- ELSEadr
187 MOV @IP+,PC
188 ENDCODE IMMEDIATE
189 [THEN]
190
191 [UNDEFINED] DO [IF]     \ define DO LOOP +LOOP
192 \ https://forth-standard.org/standard/core/DO
193 \ DO       -- DOadr   L: -- 0
194 CODE DO
195 SUB #2,PSP              \
196 MOV TOS,0(PSP)          \
197 ADD #2,&DP              \   make room to compile xdo
198 MOV &DP,TOS             \ -- HERE+2
199 MOV #XDO,-2(TOS)        \   compile xdo
200 ADD #2,&LEAVEPTR        \ -- HERE+2     LEAVEPTR+2
201 MOV &LEAVEPTR,W         \
202 MOV #0,0(W)             \ -- HERE+2     L-- 0
203 MOV @IP+,PC
204 ENDCODE IMMEDIATE
205
206 \ https://forth-standard.org/standard/core/LOOP
207 \ LOOP    DOadr --         L-- an an-1 .. a1 0
208 CODE LOOP
209     MOV #XLOOP,X
210 BW1 ADD #4,&DP          \ make room to compile two words
211     MOV &DP,W
212     MOV X,-4(W)         \ xloop --> HERE
213     MOV TOS,-2(W)       \ DOadr --> HERE+2
214 BEGIN                   \ resolve all "leave" adr
215     MOV &LEAVEPTR,TOS   \ -- Adr of top LeaveStack cell
216     SUB #2,&LEAVEPTR    \ --
217     MOV @TOS,TOS        \ -- first LeaveStack value
218     CMP #0,TOS          \ -- = value left by DO ?
219 0<> WHILE
220     MOV W,0(TOS)        \ move adr after loop as UNLOOP adr
221 REPEAT
222     MOV @PSP+,TOS
223     MOV @IP+,PC
224 ENDCODE IMMEDIATE
225
226 \ https://forth-standard.org/standard/core/PlusLOOP
227 \ +LOOP   adrs --   L-- an an-1 .. a1 0
228 CODE +LOOP
229 MOV #XPLOOP,X
230 GOTO BW1
231 ENDCODE IMMEDIATE
232 [THEN]
233
234 [UNDEFINED] CASE [IF]
235 \ https://forth-standard.org/standard/core/CASE
236 : CASE 0 ; IMMEDIATE \ -- #of-1 
237
238 \ https://forth-standard.org/standard/core/OF
239 : OF \ #of-1 -- orgOF #of 
240 1+                          \ count OFs 
241 >R                          \ move off the stack in case the control-flow stack is the data stack. 
242 POSTPONE OVER POSTPONE = \ copy and test case value
243 POSTPONE IF                 \ add orig to control flow stack 
244 POSTPONE DROP           \ discards case value if = 
245 R>                          \ we can bring count back now 
246 ; IMMEDIATE 
247
248 \ https://forth-standard.org/standard/core/ENDOF
249 : ENDOF \ orgOF #of -- orgENDOF #of 
250 >R                          \ move off the stack in case the control-flow stack is the data stack. 
251 POSTPONE ELSE 
252 R>                          \ we can bring count back now 
253 ; IMMEDIATE 
254
255 \ https://forth-standard.org/standard/core/ENDCASE
256 : ENDCASE \ orgENDOF1..orgENDOFn #of -- 
257 POSTPONE DROP
258 0 DO 
259     POSTPONE THEN 
260 LOOP 
261 ; IMMEDIATE 
262 [THEN]
263
264 [UNDEFINED] S_ [IF]
265 CODE S_             \           Squote alias with blank separator instead quote
266 MOV #0,&CAPS        \           turn CAPS OFF
267 COLON
268 XSQUOTE ,           \           compile run-time code
269 $20 WORD            \ -- c-addr (= HERE)
270 HI2LO
271 MOV.B @TOS,TOS      \ -- len    compile string
272 ADD #1,TOS          \ -- len+1
273 BIT #1,TOS          \           C = ~Z
274 ADDC TOS,&DP        \           store aligned DP
275 MOV @PSP+,TOS       \ --
276 MOV @RSP+,IP        \           pop paired with push COLON
277 MOV #$20,&CAPS      \           turn CAPS ON (default state)
278 MOV @IP+,PC         \ NEXT
279 ENDCODE IMMEDIATE
280 [THEN]
281
282 [UNDEFINED] ESC [IF]
283 CODE ESC
284 CMP #0,&STATEADR
285 0= IF MOV @IP+,PC   \ interpret time use is disallowed
286 THEN
287 COLON          
288 $1B                 \ -- char escape
289 POSTPONE LITERAL    \ compile-time code : lit $1B  
290 POSTPONE EMIT       \ compile-time code : EMIT
291 POSTPONE S_         \ compile-time code : S_ <escape_sequence>
292 POSTPONE TYPE       \ compile-time code : TYPE
293 ; IMMEDIATE
294 [THEN]
295
296 : BAD_MHz
297 $20 DUP EMIT 
298         ABORT" only for 1,4,8,16,24 MHz MCLK!"
299 ;
300
301 : OVR_BAUDS
302 $20 DUP EMIT ESC [7m    \ set reverse video
303         ." with MCLK = " FREQ_KHZ @ 1000 U/ .
304         ABORT" MHz? don't dream!"
305 ;
306
307 : CHNGBAUD                  \ only for 1, 4, 8, 16, 24 MHz
308 PWR_STATE                   \ removes this created word (garbage collector)
309 ECHO
310 ESC [8;42;128t      \ set 42L * 128C terminal display
311 41 0 DO CR LOOP     \ to avoid erasing any line of source, create 42-1 empty lines
312 ESC [H              \ cursor home
313
314 FREQ_KHZ @ DUP >R               \ r-- target MCLCK frequency in MHz
315 ." target MCLK = " 1000 U/ . ." MHz" CR
316 ." choose your baudrate:" CR
317 ."  0 --> 6 MBds" CR        \ >= 24 MHz
318 ."  1 --> 5 MBds" CR        \ >= 20 MHz
319 ."  2 --> 4 MBds" CR        \ >= 16 MHz
320 ."  3 --> 3 MBds" CR        \ >= 12 MHz
321 ."  4 --> 1843200 Bds" CR   \ >= 8 MHz
322 ."  5 --> 921600 Bds" CR    \ >= 4 MHz
323 ."  6 --> 460800 Bds" CR    \ >= 2 MHz
324 ."  7 --> 230400 Bds" CR    \ >= 1 MHz
325 ."  8 --> 115200 Bds" CR    \ >= 500 kHz
326 ."  9 --> 38400 Bds" CR
327 ."  A --> 19200 Bds" CR
328 ."  B --> 9600 Bds" CR
329 ." other --> abort" CR
330 ." your choice: "
331 KEY
332
333 CASE
334 #48 OF  ." 6 MBds"          \ add this to the current line
335         R> CASE
336             #24000 OF $4 $0 \ -- TERM_BRW  TERM_MCTLW
337                    ENDOF
338             24000 <   
339             IF OVR_BAUDS    \ < 24 MHz --> abort
340             THEN BAD_MHz    \ other MHz --> abort
341         ENDCASE
342     ENDOF
343 #49 OF  ." 5 MBds"
344         R> CASE
345             #24000 OF $4 $EE00  ENDOF
346             #20000 OF $4 $0     ENDOF
347             20000 <   
348             IF OVR_BAUDS    \ < 20 MHz --> abort
349             THEN BAD_MHz    \ other MHz --> abort
350         ENDCASE
351     ENDOF
352 #50 OF  ." 4 MBds"
353         R> CASE
354             #24000 OF $6 $0     ENDOF
355             #20000 OF $5 $0     ENDOF
356             #16000 OF $4 $0     ENDOF
357             16000 <   
358             IF OVR_BAUDS    \ < 16 MHz --> abort
359             THEN BAD_MHz    \ other MHz --> abort
360         ENDCASE
361     ENDOF
362 #51 OF  ." 3 MBds"
363         R> CASE
364             #24000 OF $8 $0     ENDOF
365             #20000 OF $6 $D600  ENDOF
366             #16000 OF $5 $4900  ENDOF
367             #12000 OF $4 $0     ENDOF
368             12000 <   
369             IF OVR_BAUDS    \ < 12 MHz --> abort
370             THEN BAD_MHz    \ other MHz --> abort
371         ENDCASE
372     ENDOF
373 #52 OF  ." 1843200 Bds"
374         R> CASE
375             #24000 OF $0D $0200 ENDOF
376             #20000 OF $0A $DF00 ENDOF
377             #16000 OF $8 $D600  ENDOF
378             #12000 OF $6 $AA00  ENDOF
379             #8000  OF $5 $9200  ENDOF
380             8000 <   
381             IF OVR_BAUDS    \ < 8 MHz --> abort
382             THEN BAD_MHz    \ other MHz --> abort
383         ENDCASE
384     ENDOF
385 #53 OF  ." 921600 Bds"
386         R> CASE
387             #24000 OF $1 $00A1  ENDOF
388             #20000 OF $1 $B751  ENDOF
389             #16000 OF $11 $4A00 ENDOF
390             #12000 OF $0D $0200  ENDOF
391             #8000  OF $8 $D600  ENDOF
392             #4000  OF $4 $4900  ENDOF
393             4000 <   
394             IF OVR_BAUDS    \ < 4 MHz --> abort
395             THEN BAD_MHz    \ other MHz --> abort
396         ENDCASE
397     ENDOF
398 #54 OF  ." 460800 Bds"
399         R> CASE
400             #24000 OF $3 $0241  ENDOF
401             #20000 OF $2 $92B1  ENDOF
402             #16000 OF $2 $BB21  ENDOF
403             #12000 OF $1 $00A1  ENDOF
404             #8000  OF $11 $4A00 ENDOF
405             #4000  OF $8 $D600  ENDOF
406             #2000  OF $4 $4900  ENDOF
407             2000 <   
408             IF OVR_BAUDS    \ < 2 MHz --> abort
409             THEN BAD_MHz    \ other MHz --> abort
410         ENDCASE
411     ENDOF
412 #55 OF  ." 230400 Bds"
413         R> CASE
414             #24000 OF $6 $2081  ENDOF
415             #20000 OF $5 $EE61  ENDOF
416             #16000 OF $4 $5551  ENDOF
417             #12000 OF $3 $0241  ENDOF
418             #8000  OF $2 $BB21  ENDOF
419             #4000  OF $11 $4A00 ENDOF
420             #2000  OF $8 $D600  ENDOF
421             #1000  OF $4 $4900  ENDOF
422             1000 <   
423             IF OVR_BAUDS    \ < 1 MHz --> abort
424             THEN BAD_MHz    \ other MHz --> abort
425         ENDCASE
426     ENDOF
427 #56 OF  ." 115200 Bds"
428         R> CASE
429             #24000 OF $0D $4901 ENDOF
430             #20000 OF $0A $AD01 ENDOF
431             #16000 OF $8 $F7A1  ENDOF
432             #12000 OF $6 $2081  ENDOF
433             #8000  OF $4 $5551  ENDOF
434             #4000  OF $2 $BB21  ENDOF
435             #2000  OF $11 $4A00 ENDOF
436             #1000  OF $8 $D600  ENDOF
437             #500   OF $4 $4900  ENDOF
438             500 <   
439             IF OVR_BAUDS    \ < 500 Khz --> abort
440             THEN BAD_MHz    \ other MHz --> abort
441         ENDCASE
442     ENDOF
443 #57 OF  ." 38400 Bds"
444         R> CASE
445             #24000  OF $27 $0011    ENDOF
446             #16000  OF $1A $D601    ENDOF
447             #8000   OF $0D $4901    ENDOF
448             #4000   OF $6 $2081     ENDOF
449             #1000   OF $1 $00A1     ENDOF
450             BAD_MHz    \ other MHz --> abort
451         ENDCASE
452     ENDOF
453 #65 OF  ." 19200 Bds"
454         R> CASE
455             #24000  OF $4E $0021    ENDOF
456             #16000  OF $34 $4911    ENDOF
457             #8000   OF $1A $D601    ENDOF
458             #4000   OF $0D $4901    ENDOF
459             #1000   OF $3 $0241     ENDOF
460             BAD_MHz    \ other MHz --> abort
461         ENDCASE
462     ENDOF
463 #66 OF  ." 9600 Bds"
464         R> CASE
465             #24000  OF $9C $0041    ENDOF
466             #16000  OF $68 $D621    ENDOF
467             #8000   OF $34 $4911    ENDOF
468             #4000   OF $1A $D601    ENDOF
469             #1000   OF $6 $2081     ENDOF
470             BAD_MHz    \ other MHz --> abort
471         ENDCASE
472     ENDOF
473     ." abort" ABORT" "      \ ABORT" displays nothing
474 ENDCASE
475 TERMMCTLW_RST !             \ set UCAxMCTLW value in FRAM
476 TERMBRW_RST !               \ set UCAxBRW value in FRAM
477 CR ESC [7m                  \ escape sequence to set reverse video
478 ." Change baudrate in Teraterm, save its setup, then reset target."
479 ;
480
481 CHNGBAUD