OSDN Git Service

V 3.2
[fast-forth/master.git] / MSP430-FORTH / CHNGBAUD.f
1 \ -*- coding: utf-8 -*-
2
3 ; ------------
4 ; CHNGBAUD.f
5 ; ------------
6
7 \ to see kernel options, download FastForthSpecs.f
8 \ FastForth kernel options: nothing
9 \
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
13 \ LP_MSP430FR2476
14 \
15 \
16 PWR_STATE
17
18 [UNDEFINED] SWAP [IF]
19 \ https://forth-standard.org/standard/core/SWAP
20 \ SWAP     x1 x2 -- x2 x1    swap top two items
21 CODE SWAP
22 MOV @PSP,W      \ 2
23 MOV TOS,0(PSP)  \ 3
24 MOV W,TOS       \ 1
25 MOV @IP+,PC     \ 4
26 ENDCODE
27 [THEN]
28
29 [UNDEFINED] = [IF]
30 \ https://forth-standard.org/standard/core/Equal
31 \ =      x1 x2 -- flag         test x1=x2
32 CODE =
33 SUB @PSP+,TOS   \ 2
34 0<> IF          \ 2
35     AND #0,TOS  \ 1
36 ELSE            \ 2
37     XOR #-1,TOS \ 1 flag Z = 1
38 THEN
39 MOV @IP+,PC     \ 4
40 ENDCODE
41 [THEN]
42
43 [UNDEFINED] 0= [IF]
44 \ https://forth-standard.org/standard/core/ZeroEqual
45 \ 0=     n/u -- flag    return true if TOS=0
46 CODE 0=
47 SUB #1,TOS      \ borrow (clear cy) if TOS was 0
48 SUBC TOS,TOS    \ TOS=-1 if borrow was set
49 MOV @IP+,PC
50 ENDCODE
51 [THEN]
52
53 [UNDEFINED] IF [IF]
54 \ https://forth-standard.org/standard/core/IF
55 \ IF       -- IFadr    initialize conditional forward branch
56 CODE IF       \ immediate
57 SUB #2,PSP              \
58 MOV TOS,0(PSP)          \
59 MOV &DP,TOS             \ -- HERE
60 ADD #4,&DP            \           compile one word, reserve one word
61 MOV #QFBRAN,0(TOS)      \ -- HERE   compile QFBRAN
62 ADD #2,TOS              \ -- HERE+2=IFadr
63 MOV @IP+,PC
64 ENDCODE IMMEDIATE
65 [THEN]
66
67 [UNDEFINED] THEN [IF]
68 \ https://forth-standard.org/standard/core/THEN
69 \ THEN     IFadr --                resolve forward branch
70 CODE THEN               \ immediate
71 MOV &DP,0(TOS)          \ -- IFadr
72 MOV @PSP+,TOS           \ --
73 MOV @IP+,PC
74 ENDCODE IMMEDIATE
75 [THEN]
76
77 [UNDEFINED] ELSE [IF]
78 \ https://forth-standard.org/standard/core/ELSE
79 \ ELSE     IFadr -- ELSEadr        resolve forward IF branch, leave ELSEadr on stack
80 CODE ELSE     \ immediate
81 ADD #4,&DP              \ make room to compile two words
82 MOV &DP,W               \ W=HERE+4
83 MOV #BRAN,-4(W)
84 MOV W,0(TOS)            \ HERE+4 ==> [IFadr]
85 SUB #2,W                \ HERE+2
86 MOV W,TOS               \ -- ELSEadr
87 MOV @IP+,PC
88 ENDCODE IMMEDIATE
89 [THEN]
90
91 [UNDEFINED] BEGIN [IF]
92 \ https://forth-standard.org/standard/core/BEGIN
93 \ BEGIN    -- BEGINadr             initialize backward branch
94 CODE BEGIN              \ immediate
95 MOV #HERE,PC            \ BR HERE
96 ENDCODE IMMEDIATE
97 [THEN]
98
99 [UNDEFINED] AGAIN [IF]
100 \ https://forth-standard.org/standard/core/AGAIN
101 \ AGAIN    BEGINadr --             resolve uncondionnal backward branch
102 CODE AGAIN     \ immediate
103 MOV #BRAN,X
104 GOTO BW1
105 ENDCODE IMMEDIATE
106 [THEN]
107
108 [UNDEFINED] WHILE [IF]
109 \ https://forth-standard.org/standard/core/WHILE
110 \ WHILE    BEGINadr -- WHILEadr BEGINadr
111 : WHILE     \ immediate
112 POSTPONE IF SWAP
113 ; IMMEDIATE
114 [THEN]
115
116 [UNDEFINED] REPEAT [IF]
117 \ https://forth-standard.org/standard/core/REPEAT
118 \ REPEAT   WHILEadr BEGINadr --     resolve WHILE loop
119 : REPEAT
120 POSTPONE AGAIN POSTPONE THEN
121 ; IMMEDIATE
122 [THEN]
123
124 [UNDEFINED] DO [IF]
125 \ https://forth-standard.org/standard/core/DO
126 \ DO       -- DOadr   L: -- 0
127 CODE DO                 \ immediate
128 SUB #2,PSP              \
129 MOV TOS,0(PSP)          \
130 ADD #2,&DP              \   make room to compile xdo
131 MOV &DP,TOS             \ -- HERE+2
132 MOV #XDO,-2(TOS)        \   compile xdo
133 ADD #2,&LEAVEPTR        \ -- HERE+2     LEAVEPTR+2
134 MOV &LEAVEPTR,W         \
135 MOV #0,0(W)             \ -- HERE+2     L-- 0
136 MOV @IP+,PC
137 ENDCODE IMMEDIATE
138 [THEN]
139
140 [UNDEFINED] LOOP [IF]
141 \ https://forth-standard.org/standard/core/LOOP
142 \ LOOP    DOadr --         L-- an an-1 .. a1 0
143 CODE LOOP               \ immediate
144     MOV #XLOOP,X
145 BW1 ADD #4,&DP          \ make room to compile two words
146     MOV &DP,W
147     MOV X,-4(W)         \ xloop --> HERE
148     MOV TOS,-2(W)       \ DOadr --> HERE+2
149 BEGIN                   \ resolve all "leave" adr
150     MOV &LEAVEPTR,TOS   \ -- Adr of top LeaveStack cell
151     SUB #2,&LEAVEPTR    \ --
152     MOV @TOS,TOS        \ -- first LeaveStack value
153     CMP #0,TOS          \ -- = value left by DO ?
154 0<> WHILE
155     MOV W,0(TOS)        \ move adr after loop as UNLOOP adr
156 REPEAT
157     MOV @PSP+,TOS
158     MOV @IP+,PC
159 ENDCODE IMMEDIATE
160 [THEN]
161
162 [UNDEFINED] >R [IF]
163 \ https://forth-standard.org/standard/core/toR
164 \ >R    x --   R: -- x   push to return stack
165 CODE >R
166 PUSH TOS
167 MOV @PSP+,TOS
168 MOV @IP+,PC
169 ENDCODE
170 [THEN]
171
172 [UNDEFINED] R> [IF]
173 \ https://forth-standard.org/standard/core/Rfrom
174 \ R>    -- x    R: x --   pop from return stack ; CALL #RFROM performs DOVAR
175 CODE R>
176 MOV rDOVAR,PC     \ 4
177 ENDCODE
178 [THEN]
179
180 [UNDEFINED] R@ [IF]
181 \ https://forth-standard.org/standard/core/RFetch
182 \ R@    -- x     R: x -- x   fetch from return stack
183 CODE R@
184 SUB #2,PSP
185 MOV TOS,0(PSP)
186 MOV @RSP,TOS
187 MOV @IP+,PC
188 ENDCODE
189 [THEN]
190
191 [UNDEFINED] DROP [IF]
192 \ https://forth-standard.org/standard/core/DROP
193 \ DROP     x --          drop top of stack
194 CODE DROP
195 MOV @PSP+,TOS   \ 2
196 MOV @IP+,PC     \ 4
197 ENDCODE
198 [THEN]
199
200 [UNDEFINED] ?DUP [IF]
201 \ https://forth-standard.org/standard/core/qDUP
202 \ ?DUP     x -- 0 | x x    DUP if nonzero
203 CODE ?DUP
204 CMP #0,TOS      \ 2  test for TOS nonzero
205 0<> IF
206     SUB #2,PSP      \ 2  push old TOS..
207     MOV TOS,0(PSP)  \ 3  ..onto stack
208 THEN
209 MOV @IP+,PC     \ 4
210 ENDCODE
211 [THEN]
212
213 [UNDEFINED] @ [IF]
214 \ https://forth-standard.org/standard/core/Fetch
215 \ @     c-addr -- char   fetch char from memory
216 CODE @
217 MOV @TOS,TOS
218 MOV @IP+,PC
219 ENDCODE
220 [THEN]
221
222 [UNDEFINED] ! [IF]
223 \ https://forth-standard.org/standard/core/Store
224 \ !        x a-addr --   store cell in memory
225 CODE !
226 MOV @PSP+,0(TOS)    \ 4
227 MOV @PSP+,TOS       \ 2
228 MOV @IP+,PC         \ 4
229 ENDCODE
230 [THEN]
231
232 [UNDEFINED] < [IF]
233 \ https://forth-standard.org/standard/core/less
234 \ <      n1 n2 -- flag        test n1<n2, signed
235 CODE <
236     SUB @PSP+,TOS   \ 1 TOS=n2-n1
237     S< ?GOTO FW1    \ 2 signed
238     0<> IF          \
239 BW1     MOV #-1,TOS \ 1 flag Z = 0
240     THEN
241     MOV @IP+,PC
242 ENDCODE
243
244 \ https://forth-standard.org/standard/core/more
245 \ >     n1 n2 -- flag         test n1>n2, signed
246 CODE >
247     SUB @PSP+,TOS   \ 2 TOS=n2-n1
248     S< ?GOTO BW1    \ 2 --> +5
249 FW1 AND #0,TOS      \ 1 flag Z = 1
250     MOV @IP+,PC
251 ENDCODE
252 [THEN]
253
254 [UNDEFINED] - [IF]
255 \ https://forth-standard.org/standard/core/Minus
256 \ -      n1/u1 n2/u2 -- n3/u3      n3 = n1-n2
257 CODE -
258 SUB @PSP+,TOS   \ 2  -- n2-n1
259 XOR #-1,TOS     \ 1
260 ADD #1,TOS      \ 1  -- n3 = -(n2-n1) = n1-n2
261 MOV @IP+,PC
262 ENDCODE
263 [THEN]
264
265 [UNDEFINED] UM/MOD [IF]
266 \ https://forth-standard.org/standard/core/UMDivMOD
267 \ UM/MOD   udlo|udhi u1 -- r q   unsigned 32/16->r16 q16
268 CODE UM/MOD
269     PUSH #DROP      \
270     MOV #MUSMOD,PC  \ execute MUSMOD then return to DROP
271 ENDCODE
272 [THEN]
273
274 [UNDEFINED] ESC" [IF]
275 \ ESC" <escape sequence>" --    type an escape sequence
276 : ESC" $1B POSTPONE LITERAL POSTPONE EMIT POSTPONE S" POSTPONE TYPE ; IMMEDIATE \ "
277 [THEN]
278
279 : BAD_MHz
280 $20 EMIT 1 ABORT" only for 1,4,8,16,24 MHz MCLK!"
281 ;
282
283 : OVR_BAUDS
284 $20 EMIT ESC" [7m"   \ set reverse video
285 ." with MCLK = " FREQ_KHZ @ 0 1000 UM/MOD . DROP
286 1 ABORT" MHz? don't dream!"
287 ;
288
289 : <> = 0= ;
290
291 : CHNGBAUD                  \ only for 8, 16, 24 MHz
292 PWR_STATE                   \ to remove this created word (garbage collector)
293 ECHO
294 42              \ number of terminal lines   
295 0 DO CR LOOP    \ don't erase any line of source
296
297 ESC" [1J"     \ erase up (42 empty lines)
298 ESC" [H"      \ cursor home
299
300 FREQ_KHZ @ >R               \ r-- target MCLCK frequency in MHz
301 ." target MCLK = " R@ 0 1000 UM/MOD . ." MHz" DROP CR
302 ." choose your baudrate:" CR
303 ."  0 --> 6 MBds" CR
304 ."  1 --> 5 MBds" CR
305 ."  2 --> 4 MBds" CR      \ linux driver max speed
306 ."  3 --> 2457600 Bds" CR
307 ."  4 --> 921600 Bds" CR
308 ."  5 --> 460800 Bds" CR
309 ."  6 --> 230400 Bds" CR
310 ."  7 --> 115200 Bds" CR
311 ."  8 --> 38400 Bds" CR
312 ."  9 --> 19200 Bds" CR
313 ."  A --> 9600 Bds" CR
314 ." other --> abort" CR
315 ." your choice: "
316 KEY
317
318 #48 - ?DUP 0=               \ select 6MBds ?
319 IF  ." 6 MBds"              \ add this to the current line
320     R@ #24000 <             \ < 24MHz ?
321     IF  OVR_BAUDS THEN
322     R@ #24000 <>            \ > 24 MHz ?
323     IF  BAD_MHz  THEN       \ yes --> abort
324     $4                      \ TERM_BRW
325     $0                      \ TERM_MCTLW
326 ELSE 1 - ?DUP 0=            \ select 5MBds ?
327     IF  ." 5 MBds"
328         R@ #16000 <         \ < 16MHz ?
329         IF  OVR_BAUDS THEN
330         R@ #16000 =         \ 16 MHz ?
331         IF  $3              \ TERM_BRW
332             $2100           \ TERM_MCTLW
333         ELSE R@ #24000 <>
334             IF  BAD_MHz  THEN
335             $4              \ TERM_BRW
336             $EE00           \ TERM_MCTLW
337         THEN
338     ELSE 1 - ?DUP 0=        \ 4MBds ?
339         IF  ." 4 MBds"
340             R@ #16000 <
341             IF  OVR_BAUDS THEN
342             R@ #16000 =
343                 IF  $4 $0
344                 ELSE R@ #24000 <>
345                     IF  BAD_MHz  THEN
346                     $6 $0
347                 THEN
348         ELSE 1 - ?DUP 0=            \ 2457600 ?
349             IF  ." 2457600 Bds"
350                 R@ #8000 <           \ < 8MHz ?
351                 IF  OVR_BAUDS THEN
352                 R@ #8000 =
353                 IF  $3 $4400
354                 ELSE R@ #16000 =
355                     IF  $6 $AA00
356                     ELSE R@ #24000 <>
357                         IF  BAD_MHz  THEN
358                         $9 $DD00
359                     THEN
360                 THEN
361             ELSE 1 - ?DUP 0=                \ 921600 ?
362                 IF  ." 921600 Bds"
363                     R@ #4000 <              \ < 4MHz ?
364                     IF  OVR_BAUDS THEN
365                     R@ #4000 =
366                     IF  4 $4900
367                     ELSE R@ #8000 =
368                         IF  8 $D600
369                         ELSE R@ #16000 =
370                             IF  $11 $4A00
371                             ELSE R@ #24000 <>
372                                 IF  BAD_MHz  THEN
373                                 $1 $00A1
374                             THEN
375                         THEN
376                     THEN
377                 ELSE 1 - ?DUP 0=                \ 460800 ?
378                     IF  ." 460800 Bds"
379                         R@ #4000 <
380                         IF  OVR_BAUDS THEN
381                         R@ #4000  =
382                         IF  8 $D600
383                         ELSE R@ #8000  =
384                             IF $11 $4A00
385                             ELSE R@ #16000 =
386                                 IF $2 $BB21
387                                 ELSE R@ #24000 <>
388                                     IF  BAD_MHz  THEN
389                                     $6 $0001
390                                 THEN
391                             THEN
392                         THEN
393                     ELSE 1 - ?DUP 0=                \ 230400 ?
394                         IF  ." 230400 Bds"
395                             R@ #1000 <
396                             IF  OVR_BAUDS THEN
397                             R@ #1000 =
398                             IF  4 $4900
399                             ELSE R@ #4000  =
400                                 IF $11 $4A00
401                                 ELSE R@ #8000  =
402                                     IF  2 $BB21
403                                     ELSE R@ #16000 =
404                                         IF  4 $5551
405                                         ELSE R@ #24000 <>
406                                             IF  BAD_MHz  THEN
407                                             3 $0241
408                                         THEN
409                                     THEN
410                                 THEN
411                             THEN
412                         ELSE 1 - ?DUP 0=                \ 115200 ?
413                             IF  ." 115200 Bds"
414                                 R@ #1000  =
415                                 IF  8 $D600
416                                 ELSE R@ #4000  =
417                                     IF  2 $BB21
418                                     ELSE R@ #8000  =
419                                         IF  4 $5551
420                                         ELSE R@ #16000 =
421                                             IF  8 $F7A1
422                                             ELSE R@ #24000 <>
423                                                 IF  BAD_MHz  THEN
424                                                 $0D $4901
425                                             THEN
426                                         THEN
427                                     THEN
428                                 THEN
429                             ELSE 1 - ?DUP 0=                \ 38400 ?
430                                 IF  ." 38400 Bds"
431                                     R@ #1000  =
432                                     IF  $1  $00A1
433                                     ELSE R@ #4000  =
434                                         IF  $6  $2081
435                                         ELSE R@ #8000  =
436                                             IF  $0D $4901
437                                             ELSE R@ #16000 =
438                                                 IF  $1A $D601
439                                                 ELSE R@ #24000 <>
440                                                     IF  BAD_MHz  THEN
441                                                     $27 $0011
442                                                 THEN
443                                             THEN
444                                         THEN
445                                     THEN
446                                 ELSE 1 - ?DUP 0=                \ 19200 ?
447                                     IF  ." 19200 Bds"
448                                         R@ #1000  =
449                                         IF  $3  $0241
450                                         ELSE R@ #4000  =
451                                             IF  $0D $4901
452                                             ELSE R@ #8000  =
453                                                 IF  $1A $D601
454                                                 ELSE R@ #16000 =
455                                                     IF  $34 $4911
456                                                     ELSE R@ #24000 <>
457                                                         IF  BAD_MHz  THEN
458                                                         $4E $0021
459                                                     THEN
460                                                 THEN
461                                             THEN
462                                         THEN
463                                     ELSE 8 - ?DUP 0=                \ 9600 ?
464                                         IF  ." 9600 Bds"
465                                             R@ #1000  =
466                                             IF  $6  $2081
467                                             ELSE R@ #4000  =
468                                                 IF  $1A $D601
469                                                 ELSE R@ #8000  =
470                                                     IF  $34 $4911
471                                                     ELSE R@ #16000 =
472                                                         IF  $68 $D621
473                                                         ELSE R@ #24000 <>
474                                                             IF  BAD_MHz  THEN
475                                                             $9C $0041
476                                                         THEN
477                                                     THEN
478                                                 THEN
479                                             THEN
480                                         ELSE                    \ other selected 
481                                             ." abort" CR ABORT
482                                         THEN
483                                     THEN
484                                 THEN
485                             THEN
486                         THEN
487                     THEN
488                 THEN
489             THEN
490         THEN
491     THEN
492 THEN
493 TERMMCTLW_RST !             \ set UCAxMCTLW value in FRAM
494 TERMBRW_RST !               \ set UCAxBRW value in FRAM
495 R> DROP                     \ clear stacks
496 CR ESC" [7m"                \ escape sequence to set reverse video
497 ." Change baudrate in Teraterm, save its setup, then reset target."
498 ;
499
500 CHNGBAUD